こんにちは、フリーランスエンジニアのやまです。
突然ですが、未経験技術の習得でこのようなお悩みはありませんか?
・参考書を読んだり写経しているけど身についている感じがしない…
・言語、フレームワークのチュートリアルをやった後、何をすれば良いかわからない…
・どのようなことを意識して技術習得に臨めば良いかわからない…
私も駆け出しの頃や技術習得法を学ぶ前は
これらがわからず、イマイチ自信を持てずに技術習得にあたっていました…
ただ、エンジニアを続け月単価が100万円を超えるようになると、
未経験技術であっても1〜2ヶ月もあれば、現場で最低限の仕事ができるだけではなく
企業様の課題解決に貢献できる技術力が身につけられる術がわかりました。
今回は私が日頃行っている未経験技術の習得法についてお話をしていきます。
まず、前提としてインプットよりもアウトプットを重視することの重要性についてです。
何かを身につける上ではアウトプットが大事なことはよく言われることですが、
エンジニアの技術においても当てはまります。
なぜなら、以下のような理由があるからです。
・知っていることとできることの間には大きな差がある
・完璧にインプットするよりもアウトプットの中で必要な箇所を身につける方が効率が良い
例えば、資格試験を合格に向けて勉強することは素晴らしいですが、
技術習得という観点では資格試験の勉強に数ヶ月要するよりも
自分でアプリケーションを作る方が
真に必要な知識がわかり、実際に「開発できる」状態になります。
今回の方法もアウトプットベースのお話をしていきます。
技術習得は段階的にアウトプットしていきます。
第一段階: 入門書(入門講座)を読みながら写経
まずは入門書、言語やフレームワークのチュートリアルやUdemy等の入門講座を
通読しながら写経していきましょう。
この際、一つ一つ丁寧に理解しようとしたり暗記しようとしなくても大丈夫です。
「へぇ〜、〇〇言語のif文ってこう書くんだな」程度にとどめるくらいでOKです。
この段階では後で実践的なアウトプットをする際に見直せるよう
「そういえば入門書に書いてあったな」と思い返せるよう頭にインデックスを貼っておくイメージですね。
第二段階: 基本的なCRUDアプリケーションの構築
入門レベルの教材を一通り通読・写経し終えたら
もうこの段階でアプリケーションを作り始めましょう。
と言っても複雑なものではなく、簡単にCRUDを1〜2個含む程度の簡単なアプリケーションで大丈夫です。
私がよく作るものはTODOリストですね。
例) NestJS × GraphQLを用いた簡易TODOリストAPI
https://github.com/yamao-sys/nestjs-graphql-code-first
現場で開発するサービスも基本単位はデータベースのデータのCRUDであり、
これさえ実装できれば、最低限の仕事はできるからですね。
第三段階: 現場の課題解決を想定した技術検証
第二段階までで基本的なアプリケーションの構築はできるようになり、
最低限仕事で使えるレベルまで習得しました。
第三段階ではエンジニアとしてより価値提供していく、高単価案件に成約できるようになるためのアウトプットをしていきます。
それが現場での課題をリサーチし、解決するための技術検証となります。
ここがエンジニアとしての価値の発揮できるようになるための一番のポイントです。
現場に参画して遭遇したことのある課題や、
開発しながら「もっとこうなれば良くなりそうなのにな…」と違和感がある部分
また、求人票やテックブログで記事になっているようなトピックをもとに
その技術を使う上で生じそうな課題を洗い出していきます。
課題が洗い出せたら、解決するための知見を得るために技術検証を行っていきます。
例えば、私が個人開発で検証した一例として
NestJS × Prismaのテストの効率化(DBの並列化、テストケースごとのDBのリセット)があります
https://github.com/yamao-sys/nestjs-prisma-sample
上記検証の背景としては、
NestJSではORMライブラリを選定してDB関連のModel(Entity)やCRUD操作を行いますが、
RubyのRSpecやPHPのPHPUnitと異なり、DB操作関連のテストコードの基盤を自力で作る必要があり、
テスト導入の初期導入コストがかかるなという課題を感じました。
・CIでテストの並列化を行う想定で、DBの並列化や
・テストケースごとのDBリセット
このように実際のサービス開発で遭遇する課題ベースで個人開発で検証することにより
NestJSのテストで課題を感じている企業様にご提案する知見を得ることができます。
以上、私が未経験の技術習得で意識して取り組んでいるポイントでした。
あとはよくあるサービスを模したアプリケーションを作ったり、
自分で欲しいな思う自分専用のアプリケーションを作り、
技術選定やその中で開発しにくい部分が見つかれば、それを解決できるように検証していきます。
例えば、私は読書(ビジネス書)が趣味で読んだ本の学びを記録できるような読書記録アプリを作成しました。
https://github.com/yamao-sys/reading-record
https://github.com/yamao-sys/vite-react-spa
上記の開発では、実際の現場での開発を想定して技術選定を行ったり設計を考えてREADMEに書くようにしています。
技術選定や設計の意思決定を言葉でまとめると、思考が整理されるのでオススメです。
まとめると
・技術習得はインプットを早めに切り上げ、アウトプット重視で進めていくこと
・アウトプットはCRUDから始め、課題解決を見据えた検証を行っていくこと
アウトプット重視で段階的にレベルアップしていく方法で
企業様でより価値提供できるようになり、
メンバー皆が難しいと感じている課題でも解決に向けて動いていくことができ、
よりこう単価案件に成約する土台を作れるようになっていきます。
これから個人開発で技術習得を行っていく方は是非、完璧を求めすぎず、
「まずは簡単にCRUDでもやってみるか〜」
「開発している中でこれ大変だった覚えあるな、よし検証してみるか」
くらいの感覚で始めてみましょう!
私も引き続きエンジニアとして精進していくので、一緒に楽しみながら頑張りましょう(^^)