こんにちは。
@sori883です(定型文)
Qiitaさんが面白そうなイベントをしていたので、ギリギリ参加です。
はじめに
GWも終わり、現場に配属された新人エンジニアも増えてくる頃かと思います。
本や資格学習と実務で求められることのギャップで思うように進められず焦っている方も多いのではないでしょうか。
本記事では、それらのスキルを鍛える手段として個人開発がいいよということを書きます。
学習と実務にギャップがある理由
学習をしても、いざ実務に入ると中々学習内容が発揮しきれない場面も多いと思います。
私自身も学習研修が終わって配属されてから全くついていけませんでした。
- プログラム言語は分かるが、ライブラリ利用や環境設定ができない
- 資格を取得していたが、実務では設定項目が多く設計実装できない
- システム全体の連携を把握して設計実装できない
- 非機能要件や運用を考慮した設計実装ができない
上記はいずれも手を動かしてシステムを作り上げる過程で少しずつ身につくスキルで、本や資格学習だけでは中々身につき辛いスキルです。
知識として知っているものの、理解度や周辺知識の不足によって知識同士が紐づいていないため、ギャップが生じてしまいます。
なぜ個人開発がいいのか
本や資格のようなインプット学習だけで実践的なスキルを身につける限界があります。
学習と実務のギャップを埋めるには、実際に手を動かすアウトプット学習も組み合わせて、個々の理解度や、知識の紐づきを底上げしていく必要があります。
このアウトプット学習として最もおすすめなのが「個人開発」です。
アウトプット学習として良い点
最も実務に近く、システムに関わる全工程を学習できる最強のアウトプット学習です。
- システムの全工程を自分で意思決定する学習ができる
- 要求、要件、設計から構築、テスト、デプロイ、運用保守
- システム全体(アプリ、インフラ)を関連性を意識した学習できる
- 実際にシステムを構築・運用することで、机上では身につかないノウハウがたまる
- 作ったものは学習の証明にも使える。
特に、自分で意思決定する=複数の候補からメリデメを考えつつ全体の整合性も考慮するスキルを底上げできます。
このスキルが身についている人は、もう来年からテックリードです。
学習サイクルとしての良い点
インプットとアウトプット、足りない知識の特定を繰り返すことで、理解度を底上げしつつ周辺知識を高速で身につけることができます。
- アウトプットするうえで分からないことをインプット
- システムを設計実装することでアウトプット
- 疑問点や不明点を特定
個人開発のはじめかた
私が個人開発している中で実践していることを紹介します。
もちろん、個人開発なので自分自身で進めやすいようにカスタマイズしたり、好きなように意思決定していただければと思います。
学習目的を決める
あくまでも目的は学習ですので、何を学ぶか決めましょう。
私が新卒の頃はほぼ(1)で、徐々に(2)〜(4)にシフトしていきました。
- 実務と同じ構成で理解を深める
- 何を学べばいいか分からないので、取り敢えず作って世界を広げる
- 好きな技術の理解を深める
- 興味ある技術や最新の技術を学ぶ
いつまでに何を作るか決める
ここ、一番重要です。
個人開発の辛みはモチベ維持なので、最初から機能てんこ盛りで全工程やると完成しません。
最初はとにかく最小限で完成を意識することをおすすめします。
- 1か月で作れる規模にする
- 機能を絞る(登録、参照、更新、削除程度)
- 工程を絞る(設計、開発、デプロイ程度)
- 徐々に機能や工程を増やしていく
決めたことはスケジュール、タスク化して管理すると良いです。
学習サイクルに沿って個人開発をする
目的とやることを決めたら学習サイクルに沿って個人開発をしていきましょう。
例としてWebサービスの設計をするのであれば、以下の学習サイクルを回せます。
- 定石的な設計項目をインプット
- フロントエンド、バックエンド、DBなどのアーキテクチャ
- トップページ、登録ページなどのページ設計
- 認証・認可方法
- 使用するフレームワーク、ライブラリ
- 調べたことをもとに詳細な設計を書いてみる
- ホスティングサービスは何を使うか、DBはどのサービスを使うか
- 認証が必要なページはどれか、認証していない場合どうするか
- フレームワークは文献が多いものを使うか、最新鋭のものを使うか
- 実際に書いてみて疑問点、不明点をリストアップ
- ホスティングサービスとは何か、DBの選定基準は何か
- 認証とは何か、簡単に実現できるライブラリはあるか
- (1)に戻る
これを繰り返して設計が固まってきたら開発フェーズに進めて、再度同じ学習サイクルを回すことになります。
因みに、設計段階で開発をするのは悪ではないです。実際に触って調べないと分からないことも多々ありますので、柔軟に対応できればそれでいいと思います。(PoCと呼ばれる営みです。)
個人開発が終わったら振り返りをする
完成した後でも、完成せず諦めた場合でも良かったこと・悪かったこと、目的・目標と作業のギャップを把握するために振り返りをするとより効果的です。
全体を通して振り返りすることで、個別の知識に加えて学習プロセスそのものも改善が図れます。
振り返りにはKPTフレームワークがおすすめです。
- Keep
- 良かったこと
- 今後も続けること
- Problem
- 悪かったこと
- 改善が必要なこと
- Try
- 新たに挑戦すること
- Problemを解決するためのアクション
また、振り返りは他人に提出するものでもないので「ダルくて続けられなかった」や「仕事疲れすぎてできない」といった様になるべく感じた通りに書くべきだと思っています。
そのうえでどう改善するかを考え、自分にフィットさせることが継続化のコツです。
もし個人開発を始められない場合は
そうは言ってもいきなり一人でアプリ、インフラを全て作りきるのは難しいと思います。
最初は小さく初めて、少しずつできることを積み重ねていくことをおすすめします。
これは私の遍歴なのですが、最初は何も出来なかったので少しずつできることを広げていきました。
- 当時仕事で使っていたBootstrapの中身を読み解いて、CSSフレームワーク(笑)を個人開発する
- そもそもプログラム書くこと自体出来なかったので、プログラムが書けることを目的に実施
- 懐かしい
- 教材を買ってハンズオン形式で個人開発する
- システム開発全体像が分からないので、教材でやることを把握する目的で実施
- Laravel(+Vue.js)でSNS風Webサービスを作ろう!
- ひたすらタスク管理アプリ、ブログシステムを個人開発する
- 最新技術のキャッチアップ、Qiitaのネタ目的で個人開発
小さな個人開発でも、学習サイクルを回し続ければ実務を超えたスキル獲得が望めると思います。
AIとの付き合い方
最後に、学習におけるAI利用は「目の前にある課題を解決する」程度に止めておくことを推奨します。
自分の理解から2段階以上も離れた知識に頼って個人開発を成し遂げても、点と点が繋がる体系的な知識の獲得は難しいです。
「認証機能の実装についておすすめを教えて」と聞いて「SaaS / BaaSがおすすめです....」といった回答をそのまま受け入れるのはナンセンスです。
「認証ライブラリとSaaS / BaaSの違いやメリデメはなんですか?」などAIの回答と自分の知識のギャップを必ず埋めるようにしましょう。
終わりに
最初は分からないことだらけで辛さもあると思いますが、手を動かして1つでも個人開発を完成させれば、後はそれの応用です。
実務でも、言語が違っても、基礎ができていればゼロから学び直しなんてことはないので、最初の1年が頑張りどころだと思います。
おまけで、Webサービスの個人開発でおすすめの技術スタック紹介です。
- フロントエンド: Next.js on Vercel
- 圧倒的文献量
- デプロイが簡単
- Node.jsが使える
- バックエンド: Hono on Next.js API Routes
- 簡単、使いやすい
- 汎用性が高いので覚えて損がない
- DB: Truso
- 無料
- 比較的操作が簡単
- 認証: BetterAuth
- 外部プラットフォームに依存しないので比較的簡単
CloudflareやAWSは少し複雑で、コストもかかるため慣れてからが良いかなと思います。