はじめに
エンジニアとしてのキャリアをスタートしたばかりの方が、ジュニアレベルやミドルレベルのエンジニアとして活躍するために必要なスキルや知識について考えてみます。
この記事はWEB領域のエンジニアを対象としています。
前提
前提として、私の知っている範囲のことしか書けませんが、弊社スマレジのエンジニアとして活躍できるレベルを目標としています。
スマレジでは、バックエンド、フロントエンドの領域で担当が分かれておらず、どちらも担当します。
インフラについては専属のチームがありますが、プロダクトを担当しているエンジニアと相談しながらインフラ設計が行われることが多く、インフラについての知識がなくてもいいわけではありません。
ロードマップ
まずはロードマップとしてよく知られる図を確認してみます。 私自身が何を勉強すればいいのかわからなくなった時に参考にしていました。最近はあまり迷うことはないんですが、どうしてもエンジニアになりたてのときはわからないことが多すぎて、どれから勉強をすればいいのかわからず、わからないことがわかっていない状態に陥ることがありました。
- Backend Developer Roadmap: What is Backend Development?
- Frontend Developer Roadmap: What is Frontend Development?
Leval 1: 全エンジニア必須スキル
ここからはレベルを分けて、ロードマップ上のエンジニアのスキルを見ていきます。
個人的にはLevel 2までが実務に入るための最低限のスキルで、Level 3以降は必要になったタイミングで素早いキャッチアップが求められると感じています。
ロードマップの両方に存在する要素
- Internet
- Git
Level 2: エンジニア基礎スキル
このレベルまでのスキルは、個人の趣味でも十分に習得可能なものが多いと思います。
それぞれの領域で本当に最低限の共通的な部分をLevel 2としてみました。
ロードマップの両方に存在はするが、温度感が違うもの
- JavaScript
- フロントエンドでは必須
- バックエンドでは任意
バックエンドの必須スキル
バックエンド言語の習得
フロントエンドの必須スキル
- HTML
- CSS
- Package Manager
- npm
- yarn
- pnpm
- Pick a Framework
- React
- Vue
- Angular 選択肢としてはあるが、採用される機会がやや少ないイメージ
Level 3: エンジニア実務スキル
ここからは実務で必要になるスキルを挙げてみます。
これらの技術を実務に入る前に全て習得している必要はないと思いますが、必要に応じて都度キャッチアップが必要です。
領域に関わらず学ぶべきスキル
- Web Security Basics
- HTTPS
- CORS
- Content Security Policy
- OWASP Security Risks
バックエンド
- Learn about APIs
- REST
- JSON APIs
- Caching
- CDN
- Redis
- Testing
- Unit Testing
- Integration Testing
- Functional Testing
- CI/CD
- Scaling Database
- Database Indexes
~ 個人的に感じるジュニアとミドルの壁 ~
- More about Databases
- ORMs
- ACID
- Transactions
- N+1 Problem
- Normalization
- Failure Modes
- Profiling Performance
- Software Design & Architecture
- GOF Design Patterns
- Domain Driven Design
- Design and Development Principles
- Test Driven Development
- CQRS
- Event Sourcing
フロントエンド
- TypeScript
- Writing CSS
- Build Tools
- Module Bundlers
- Webpack
- Vite
- esbuild
- Rollup
- Parcel
- Module Bundlers
- Linters and Formatters ロードマップ上の優先度は低いが個人的には重要
- ESLint
- Prettier
- Testing your Apps
- Vitest
- Jest
- Server Side Rendering
- Next.js
- Nuxt.js
- Static Site Generators
- Astro
- Next.js
- Nuxt.js
スマレジのエンジニアに要求されるスキル
ここからは弊社スマレジの採用要件を見ながら、どのようなスキルが求められているのかを確認してみます。
WEBエンジニア
必要要件
- Webアプリケーション開発の実務経験(2年以上)
- バージョン管理、とくにGitを使った開発の経験
現在はPHPを利用していますが、PHPの経験は必須ではなく他言語においてWebアプリケーション開発の経験をお持ちの方であれば問題ありません。
歓迎要件
- リーダー経験
- Laravel、CakePHP経験
- Webアプリやスマホアプリでのパフォーマンスチューニング経験
- UnixライクOS環境下でのWebアプリケーションの開発経験
- AWSサービスの利用経験
- スクラムでのチーム開発の経験
- フロントエンド(Vue.js、またはReactを利用したUI開発経験、SPA開発経験)
- WebAPIを使用した開発経験、またはWebAPIの設計・実装経験
- Webアプリケーション開発に関係するインフラ知識・理解
- DDDやアーキテクチャ設計の知識・設計・実装経験
リードエンジニア/テックリード
必要要件
歓迎要件
- 業務システムの開発・運用経験
- 最新技術の習得および活用
- テックリード/リードエンジニアとしてチームの技術判断をした経験
- マイクロサービスのシステム運用経験
上記を比較すると、ジュニアレベルでは2年間の開発経験があれば要件を満たせそうです。2年間Webアプリケーションの開発の経験があれば、大抵の場合バージョン管理の要件はクリアできそうですね。
ほかに歓迎されるのは具体的な技術要素やスクラムの経験など、スマレジ社内の文化に近い経験が歓迎される傾向にあります。
一方、リードエンジニア/テックリードになってくると、言語の知識や具体的な技術要素の要件は減り、抽象度の高い要素を求められます。これは、弊社スマレジの「技術は道具」という価値観に基づいていると思われます。
どのような技術であれ、ユーザーに価値を届けるために必要であればキャッチアップするのが前提なので、具体的な技術要素よりも、技術を使ってどのような価値を提供できるかが重要になってくると思われます。
経験としても、技術判断ができるかや、アーキテクチャ面でも、DDDやアーキテクチャ設計から一つ視座が高いような要素が求められるようになります。
実際に必要だと感じるスキルとマインド
これまで見てきたように、エンジニアとして習得するべき技術は幅広く、具体的な技術要素の習得だけで十分なレベルになることはないと感じます。
必要に応じて素早いキャッチアップをしたり、より視座の高い戦略を立てるための知識としての技術の習得が求められます。
駆け出しから脱出するためには、これまであげたWEB技術のうち、あまり流行に左右されない基礎的な部分や、昔から存在し続けるアーキテクチャや設計手法とその批判意見などに目を向け、自分自身で戦略を立てる経験と、素早いキャッチアップのための訓練を積むことが重要だと感じます。
個人的につまづいたポイントとその解決方法
ここからは、個人的につまづいた箇所とその解決方法について書いていきます。
参考にした書籍や個人的な意見を書きます。
ただし、プログラミングの基礎(if,forなど)やユニットテスト、オブジェクト志向については前職の経験もあり、入門レベルで大きくつまづいたことはないので、割愛します。
1. 何を学べばいいのかわからない
エンジニアになりたての場合、そもそもどれが流行りで、どれが基礎的な技術なのかわからないことがあります。
解決方法
WEB技術の基礎的な部分は、あまり流行に左右されない部分が多いです。
私の場合はまず下記の書籍を読みました。
この本でWEBの歴史、HTTP周辺、RESTful APIなどの基礎的な部分を学びました。
2. DB設計、SQL
組み込み業界にいた前職では、あまりDBを使用する業務がなく、RDB自体にほとんど初めて触れました。
そのため、SQL自体も学習が必要でしたし、DBの設計についてもキャッチアップする必要がありました。
コードと違って、DB設計は既存のDB設計がなぜその構造になっているかという理由の部分が読み取れずに苦労したことがあります。
解決方法
この問題を解決するのに役立ったのは、以下の書籍でした。
また、具体的なDB周りの要素についてはMySQLの公式ドキュメントを読むことが多かったです。
内容としてはDBの基礎的な部分を知らないと少し難しい部分もありますが、何がわからないのかわからない状態だったので、公式ドキュメントから目を通し、出てきた単語を個別で調べ、QiitaやZennの記事にお世話になりました。
フレームワークの学習
業務で使用しているLaravel,Vueともに経験がなく、これらのキャッチアップは研修等もなかったため、苦労した覚えがあります。
この辺りはスマレジの採用要件が2年程度のWEBアプリ開発経験であることに対して、私は別業界からの転職だったので、かなり焦っていた部分です。
解決方法
業務以外で個人で取り組んだことの中で効果的だったのは、個人でToDoリストをフレームワークを使用して作成することでした。
フレームワークの知識だけでなく、アーキテクチャについても1から考えるいい機会になりました。
ちなみに、PHPやLaravel、Vueといった要素については技術書をほとんど読んでいません。
PHPについてはいくつか購入したものもありますが、いいと思える書籍は見つかっていないのでここでは紹介を控えます。
ソフトウェア設計
スマレジに入社してから担当しているプロダクトでは、ドメイン駆動設計の思想に基づいたクラス設計を行っており、設計思想についてもキャッチアップが必要でした。
この辺りは先輩エンジニアからの指導もありつつ、自身でも書籍やブログを読んで学習しました。
以下が参考になった書籍です。
ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本
エリック・エヴァンスのドメイン駆動設計
ソフトウェア設計のトレードオフと誤り ―プログラミングの際により良い選択をするには
また、クリーンアーキテクチャについては下記ブログ、およびブログ内で紹介されているyoutube動画を繰り返し見て参考にしました。
その他良かった書籍
以下に良かった書籍を紹介します。 書籍全般に言えることですが、書いてある内容全てが正しく、参考になるということはないので、6~7割程度自分にとって有意義な内容があれば「良かった」としています。
個人的には、書籍を読むことで知識を得ることよりも、自分が知らないことを知ることができるという点が大きいと感じています。知識の習得のみではなく、自分を顧みる機会が得られればそれは良い読書体験だと思っています。
まずはエンジニア全員読んでいると言っても過言ではないであろう書籍です。
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック
エンジニアとしての心構え的な部分は下記の本が良かったです。
プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則
SOFT SKILLS ソフトウェア開発者の人生マニュアル 第2版
より実践的な開発手法への理解を深めるために
Googleのソフトウェアエンジニアリング ― 持続可能なプログラミングを支える技術、文化、プロセス
社内で勉強会を行ってみました
「エンジニアになってつまづいたポイント」をテーマに社内勉強会を行いました。
参加してくれたエンジニアの方々は比較的バックエンドに強みを持っているエンジニアが多く、つまづいたポイントとしては下記のようなものが挙がりました。
ただ、この辺りは業務で直面する課題ではあっても、なかなか個人の学習で習得するのは難しい印象がありました。理論として理解できても、実際の問題に遭遇する機会は業務のようなアクセスの多い環境でないとなかなか得られないと感じました。
これからもエンジニアとして成長していくために
上記のキャッチアップをしていくことと並行して、自分自身が好き、得意な分野を早めに見つけることができれば、それを専門性の軸として成長していくことができると思います。
なにより、わからないことだらけの技術の世界で、自分が自信を持てる分野を確立することは、メンタル面でも効果が大きいと感じています。
また、業務だと環境構築や技術選定がすでに終わっているプロジェクトに参加することのほうが多かったりするので、個人で開発を行なってみることも大切だと感じています。
まとめ
今回は自分がエンジニアになってからつまづいたポイントとその解決方法について書いてみました。
特に初めのうちはわからないことが多すぎて大変ですが、何がわからないのかを言語化しておき、ひとつずつ解消していくことが大切だと感じています。
- 何を知らないのかを知ることが大切
- 解消のためにキーワードを知る。ロードマップや記事を読む
- 体系的に学びたいトピックは書籍を読む
- ただし、書籍の内容全てを信じるのではなく、数冊同じトピックに関連した書籍を読んで自分の意見を持つ
- 個人で開発を行なってみる
- 環境構築やちょっとした技術検証等は業務でなかなかできないことが多いのですぐに手を動かしてみることが大切
参考
以下のQiitaの記事もロードマップの一つとして参考になります。