エンジニア育成チュートリアル
目的
プログラミング入門から現場での開発までの距離があまりにも遠いので、適切に「それなりのフルスタックエンジニア」までステップアップできるようにチュートリアルを作成する。
ギャップの原因
- 開発に必要な知識領域が広大であり、全体のマップがわからない。何がどれと関連しているのかわからない。
- カテゴリごとに「これがわからないと次がわからない」という勉強の順番があるが、誰もそんなことを教えてくれない。
- 開発の現場では、いわゆるコーディング以外にも考えることがたくさんある。
- バージョン管理、開発環境構築、チケット管理、テスト、パイプライン、ログ管理、認証認可 etc.
- 開発の現場では、言語の文法を使って作られたフレームワークがよく使われているので、文法だけでなく、「フレームワークでこれをやりたいときはどう書くのか」も知る必要がある(例:Pythonの文法を使ってFastAPIの各種機能が実装されており、それはPythonの文法を勉強したからといってわかるわけではない)。
- トラブルシューティングするときには、「書き方」だけでなくOSやミドルウェアの挙動、言語の挙動を知っておく必要がある。
書いた人
エンジニア歴一年くらいです。もともとはビジネスの人間で会計・ファイナンスの仕事をしていました。データ分析でSQLを割とゴリゴリ、趣味でPythonとC言語を少し勉強していたくらいのところからエンジニアに転職しました。転職前に基本情報は取ってます。今はWebアプリとWindowsアプリをよく作っています。
このチュートリアルに含まれるもの、含まれないもの
- 基本的にいわゆる「Web系」がベースで、Pythonを軸に開発することを想定。少しWindowsアプリも含まれます。
- オーソドックスに開発ができることを目指しており、「●●開発こそは至高」のような特定の思想信条が強いものは入っていません。
- 大量のトランザクションを捌く技術(ソシャゲとか金融エンプラとか広告配信システムとか)の知見はないのでそういうのは入っていません。カリカリのパフォーマンスチューニングとかもありません。
- データ分析基盤構築、データサイエンス、機械学習も入っていません。特に後二者は国立大学の理系の院を出たような人がガチで殴り合う世界なので、まずは「当たり前のことが普通にできる」開発者になってから手を出すべきと考えます。
- セキュリティと暗号あたりは弱いですが、最近ぎんたさんがおすすめセキュリティ勉強本27選【ホワイトハッカーを目指せ!】を書いていらっしゃったので、そちらで良いのでは。
- スマホアプリは未経験なので入れていませんが、要するにフロントエンドみたいなもんだろうと思っています。ちなみにWindowsのGUIアプリもフロントエンドにちょっと似てる。
- フロントエンドのテストは入っていないです。これから勉強。
- フロントエンドはSPA前提なので、SEOが大事なサイトの作り方は入っていないです。
- OSを作るとかOSSにコミットするとかいう低水準の話も入っていないです。あくまでも道具として使えるレベル。
チュートリアルスタート前の準備
バックエンドでまず入門し、Webの仕組みくらい学ぶ
「プログラミングまったくやったことない」という人はさすがに辛い。各項目を学ぶにあたってもイメージすらつかめないと思うので、とりあえずバックエンドの言語で入門書一冊くらい終わらせてほしいです。C#やJavaから入ると後々強くなれるかもですが、まあPythonからスタートでいいんじゃないでしょうか。Pythonゼロからはじめるプログラミングで良いと思います。
それから、Webの仕組みがわかっていないと正直辛いので、HTTPとは何ぞやとか、セッションとかWebアプリの三層構造とかをWeb技術の基本でインプットしましょう。
学び方を学ぶこと
人間の脳みそがどうやって物事を学習しているのかをきちんと知ってから進めること。本を読んでも翌日には忘れていますが、世の中の学習プランは一度読んだら覚えていることを前提に作られています。そういった事態を防ぐには以下の知見(分散学習、分散学習アプリの使い方)が必要。
これらの知見はプログラミングだけでなく、英語や数学、司法試験や公認会計士試験など勉強系のスキルなら何にでも使えるので、人生を変えられるから知っておきましょう。
コーディングの学び方
認知科学の観点からプログラミングの学び方を研究した本があります。
プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ
これも上記の分散学習の本と同じく、学び方を効率化してくれます。
よくベテランエンジニアが「たくさん書けばできるようになる」「とにかく経験」と言いますが、あれは半分本当で半分間違いです。初心者は早く追いつかなければならないのですから、狙って習得しないと効率が悪い。認知科学的に「初心者がわからない理由」「決まり文句の覚え方」はあります。
チュートリアル本編
学ぶ内容
カテゴリ | 基礎編 | 実践編 |
---|---|---|
フロントエンド | HTML&CSS JavaScript |
TypeScript フレームワーク(Vue.js, React) |
バックエンド | Python Web技術の基本 C# Java |
フレームワーク(FastAPI, Flask) API設計 Windowアプリ |
データベース | SQL データベース基礎 |
ORマッパー(SQL Alchemy) マイグレーション(Alembic) |
インフラ | Linux基礎 ネットワーク基礎 仮想環境+パッケージ管理 |
コンテナ(Docker) クラウド(AWS) |
認証認可 | 認証認可の基礎 | ソーシャルログイン SSO |
テスト・デバッグ | テスト全般の知識 | テストフレームワーク(Pytest) 単体テストの書き方 デバッグ |
コーディング技法 | 読みやすく保守しやすいコードの書き方 | ドメイン駆動設計 テスト駆動開発 クラスの設計や作り方 デザインパターン |
チーム開発 | チーム開発の全体像 | Git デプロイパイプライン アジャイルスクラム |
要件定義・設計 | - | 要件定義・設計 |
運用設計 | - | 運用設計 |
社会人力 | マインド コミュニケーション 会議運営 資料作成 プロジェクトマネジメント |
上記の表を見ると、なぜプログラミング入門やプログラミングスクール卒業から現場での開発が遠いのかがわかると思います。
プログラミング入門やプログラミングスクールでやるのはせいぜい上の表の左上3マス(フロントエンド~ミドルウェアの基礎)くらいだからです。私も実はプログラミングスクールに行ったことがありますが、HTML&CSS、Rubyの基礎をやって、後はRailsのチュートリアルで終わりでした。
同様の理由で、「●●社の新卒研修資料」もあまり役に立ちません。「インターネットの仕組み」「コンピューターの仕組み」などは大事なことだし、いずれ基礎体力になるけれど、今日から書くための内容ではないからです。
実施するコンテンツ
社会人力
社会人の基本動作や心構えみたいなもの。技術力以前の問題。コンサル界隈はIT職と似たところがあるので、若手コンサル向けの本は参考になります。
『人を動かす』はまあ、みんな読もうよ。
会議ファシリ、資料作り、思考法、プロジェクトマネジメントは抑えましょう。
バックエンド
言語はまあPythonでいいんじゃないかと思います。賛否ありますが、読みやすいし書きやすいし(コードコンプリートによるとJavaの5~6倍開発効率が良いらしい)。
でも、C#とJavaはやっとく。技術書のサンプルコードはC#とJavaが多いし、静的型付け言語や「newする」「クラスを作る」みたいな感覚に慣れておくのは良いと思います。仕事も多いらしいですし。
Pythonもクラスはあるけれど、FastAPIのような賢い人が作ってくれたフレームワークを使うと、モデルとスキーマを定義してエンドポイントの関数を書くだけでだいたいできてしまうから。
Javaの入門書である「スッキリわかる」の2冊は、オブジェクト指向の入門書も兼ねているので読みましょう。実践編まで行くと、テストの書き方やデザインパターン、自前オブジェクトの作り方も書いてあります。
Pythonの入門書とWeb技術の入門書をやったら次はFastAPIをやってみれば良いのでは。紹介した本はzennのチュートリアルが書籍化されたもので、データベース連携もやるのでORマッパーとマイグレーションも勉強できます。データベースの基礎知識すらないのは困るのでスッキリわかるSQL入門は先にやったほうが良いかもしれません。
と思いましたが、FastAPIよりもPython FlaskによるWebアプリ開発入門のほうが良いかもしれません。迷うところですね。画面表示も一緒にやるならFlaskですが、バックエンドはAPIだけ作って画面表示はVueやReactでやるというパターンも多いので、どちらでも良いような。
フロントエンド
HTML&CSSの本はデザイナーさんとエンジニアで少しテイストが違います。最新のトレンドはデザイナーさんが追ってたりするので、manaさんのHTML&CSS本から齊藤新三さんの本に行けば良いと思います。齊藤さんはフロントエンドの本を一通り書いています。
古典的なHTML&CSSとJavaScriptの世界から最近のSPAに移るには少し考え方の転換が要るので、紹介したWeb記事から読みましょう。
データベース
データベースわからないとシステムは作れません。SQLを生で書くことはあまりないかもしれませんが、とりあえず知っておく。紹介した本はテーブル設計やDBMSにも触れているので導入に良いと思います。データベースはこれまたパフォーマンスチューニングなどがマニアックな世界ですが、いったんそれは置いておきます。
インフラ
LinuxがわからないとクラウドもDockerもわからないし、コマンドラインのOSに慣れておかないと開発時に困ります。このあたりは、書籍だと「Linuxの本」とか「Dockerの本」とか単品になりますが、実際に手元で開発やあれこれ勉強したいときは仮想環境(またはDockerコンテナ)とパッケージ管理(poetryなど)、リンターやフォーマッターでどうやって開発環境を作るのかという話になってきます。ここが初心者を悩ませるところなのに、書籍にはほぼないのでWeb記事で補いましょう。最終的には、pyenvやpoetryの公式ドキュメントを読み込んだほうが良いと思います。
あと、絵で見てわかるITインフラの仕組みは名著です。コンピューター(サーバー)の仕組みから、各サーバー間の通信、仮想化技術、DBの挙動などすべて解説しています。読みましょう。
チーム開発・運用設計
雑にまとめてしまったけれど、このあたりは「プログラミング入門」や「趣味のプログラミング」には出てきません。バージョン管理、チケット管理、CI/CD、デプロイパイプライン設計、ログ管理、イシュー・インシデント管理、アカウント管理 etc. どれも商用サービスを開発・運用するときは必要ですし、社内手続で突っ込まれます。
チーム開発実践入門は、それ自体でCI/CDができるようになったりする本ではないものの、チーム開発をするときに何を準備する必要があるのか一通り書いてあって、頭の中に地図ができるのが良いです。2014年の本なので紹介されているツール自体は少し古い。
要件定義・設計
要件定義、基本設計、詳細設計はそのうち避けて通れなくなります。プログラミングを始めた頃はドキュメント面倒くさいなあと思うけれど、書いてみると頭の整理になって良いなと思います。エビデンスにもなりますし、後の人のためにもなりますし。
紛らわしいのは、「コードの書き方」のことを「設計」と呼んでいる人がかなりいることで、「ナントカ設計入門」の類の本を読んでみるとクラスの作り方や命名規則やデザインパターンのことが書いてあったりします。それはロジックをどう書くかの話でシステムの設計とは違うので、上流工程の本を読んで、あちこちのテンプレートや成果物を見てみましょう。
ここに入れるかフロントエンドに入れるか迷った『オブジェクト指向UIデザイン』は、画面デザインをするときの指針として目から鱗が落ちる本です。
コーディング技法
コードコンプリートは要らないのかとか、達人プログラマーはどうだとか意見はありそうですが、とりあえず日本人がいろいろなコーディング本をまとめてくれたプリンシプルオブプログラミングで良いのではないでしょうか。こちらは心構えが多いので、実例はリーダブルコードとClean Codeで。
認証認可
正直ここはまだ弱いです。ざっくり「BtoCで世界中の人がログインする」パターンと「企業内システムで企業内の人がログインする」パターンがあると思うので、OpenID ConnectとSAMLを実装できるようになるのがゴールかと。
どこからやるか
上記を踏まえ、どこから手を付けるか。まったくの初心者ならPython入門とWeb技術の基本、その後、Linuxとデータベースの基礎をやってからFastAPIのチュートリアル(が本になったもの)でしょうか。FastAPIチュートリアルにいきなり行っても良いような気がするものの、DockerとORマッパーとマイグレーションの話が出てくるのでどうでしょうね。
FastAPIのチュートリアルをやると、データベースとバックエンドをつないでごにょごにょしてJSONを返すものが作れるので、いわゆるWeb系の雰囲気はつかめると思います。そこから、フロントエンドや綺麗なコードの書き方に進んでいくと良いのでは。
競技プログラミング、資格は?
競技プログラミングやアルゴリズムは、関数やメソッドを上手く書く技術ではないかと思うので、最初にそこに突っ込んでもシステム開発ができるようにはならないかなと。資格は、ごにょごにょできるようになってから証明書のつもりで取ると良いのでは。
最後に
それほど熟練のエンジニアでもない人間が僭越ながら書きました。なんかプログラミング入門から実際の開発まで遠いよなーとか、何を勉強すれば良いかわからないままに挫折していく人を見て、見取り図やロードマップがないからだよなーとか思って書きました。
足りないところはあると思います。特に大規模システムの知見はないので、そのあたり良くご存じの方はおすすめのコンテンツを教えてください。
これでみんなが楽しく開発できるようになりますように。
Discussion
良記事ありがとうございます!
他のロードマップ系の記事に比べて、開発スキルだけでなく、前提知識、ソフトスキルまで幅広く纏められていて、ロードマップとしても、各参考サイト、書籍へのリンクとしても素晴らしいと思います。
ありがとうございます!コーディング以外に知っておくべきことが多いやろと感じて書きました。自分もこのマップを丁寧につぶしていきます。