駆け出しエンジニア学習ロードマップ1

# 目次
- ご挨拶
- テーマ
- 注意点
    - 前提条件
    - 本読むだけじゃダメ
    - 自学の意味
    - 直近で必要ないもの
- 知識体系
- 各領域
    - コンピュータサイエンスの基礎知識
    - システム開発全工程
- まとめ

# ご挨拶
この記事をご覧になってくださった皆様、ありがとうございます。

石川 聖(ヒジリ)と申します。

先日の「自己紹介&ポートフォリオ作成」に続き二本めの投稿になります。

宜しければご覧になってください。

https://qiita.com/ishikawahijiri/items/233f353b274a8a514350

# テーマ

この投稿では、

- インターンでエンジニアとして働きたい学生
- エンジニアとして就職・転職したい
- ポテンシャル採用でエンジニアになったがスキルアップの方法が分からない

といった方に向けての学習ロードマップを解説します。

僕自身は25/4からSIerに勤務する駆け出しエンジニアですが、一応、

- 大学で情報工学専攻
- インターン, ハッカソン, 企業実習などでのシステム開発
- 個人でweb系開発

などの経験があり、10段階で言えば3程度のスキルはあります。(主観)

そのため、上記の方々に向けた適切なアドバイス、道筋の提示はできると思います。

# 注意点

## 前提条件

このロードマップは既に基本的なプログラミングはできる人を対象としています。

完全にプログラミング未経験の人は、学びたい言語の入門本を一通りやるか、progateなどのオンラインサービスを利用して学んでください。(人気な言語をやれば良いと思います。ex. java, java script, python, PHP, etc)

そこから、

- インターンで働きたい
- エンジニアとして就職・転職をしたい
- 効率的にスキルアップしていきたい

といった方々が欲しい情報をまとめました。

また、既にエンジニアになった方向けにその先のスキル習得の道筋も解説します。

(また、僕がweb系フルスタックを目指しているので、それを加味したロードマップになっていますが、どの領域の方でも参考になると思います。)

## 本読むだけじゃダメ

エンジニアにとって、最も重要なのは実務経験です。

就職や転職の際には、実務経験こそがスキルや実績を証明する最も確実な手段となり、

駆け出しのエンジニアにとっては、実際の現場に入り、経験豊富なエンジニアから直接学ぶことが最も効率的に成長できる方法です。

そのため、できるだけ早く実務経験を積むことが重要です。

もちろん、右も左もわからない初心者にとっては、

- 技術書の内容をなぞって実装すること
- 資格を取得すること

等の明確なゴールがあるものは、効率よくスキルを身につけるための有効な手段となります。また、発展的な内容を学ぶ際も書籍を読むことが有効です。

しかし、いくら本を読んだり資格を取ったりしても、それが実務で通用することを他人に証明するのは難しいという現実があります。

その手段として、自らのスキルを示すアウトプット、つまりポートフォリオを作ることが必要になります。これは、特に学生や他業種からの未経験転職者にとっては必須のステップです。

まずは、知識やポートフォリオのクオリティを最低限のレベルまで引き上げその状態で面接を受けます。運よく通過できればラッキーですが、もし不合格だった場合は、知識とポートフォリオの質を少し向上させ、再び面接に挑む。この繰り返しが、エンジニアとしてのキャリアを始める最高効率の方法です。

そのため、学習はアウトプットを重視し、必要な部分だけを学ぶのがベストです(完璧主義にならない)。駆け出しの頃は、長期休暇などのタイミングで腰を据えて基礎固めをするくらいで十分でしょう。

(また、技術的なスキル（ハードスキル）と同じくらい、コミュニケーション能力やチームでの立ち回り（ソフトスキル）も重要です。現場では、先輩エンジニアに可愛がられることが成長への近道になります。)

## 自学の意味

実務経験が重要であることはご理解頂けたと思いますが、現場に入るためには最低限の知識やスキルが必要です。

多くの企業の入社試験では、コーディング試験としてデータ処理のアルゴリズムの問題が出題されたり、技術面接で「ブラウザにurlを打ち込んでからコンテンツが表示されるまでの流れを説明しろ」といった基礎知識を問われることがあります。これらの対策は、ある程度はしておく必要があります。

また、新卒のポテンシャル採用で入社できたとしても、「パソコンの電源の付け方は？」といったレベルの知識しかないとさすがに周囲に呆れられてしまいます。そのため、最低限の基礎知識は自分で身につけたうえで、実務に即したより発展的な内容や経験則を先輩から学ぶという形が最も効率的な成長方法となります。

これは、進学校の生徒が予習をしているからこそ、より高度な授業が展開でき、結果として学力が伸びるのと同じ原理です。

事前に自分で基礎を固めておくことで、現場に入った際に吸収できる知識の質と量が大きく向上します。

## 直近で必要ないもの

開発エンジニアを目指す場合、インフラ関連の知識は直近ではあまり必要になりません。

具体的には、物理インフラやクラウドなどの実行環境については基本的に専門のエンジニアが担当するため、新人が触れる機会はほとんどないです。

そのため、無理にインフラの深い知識を学ぶよりも、まずは開発に必要なツールや環境に慣れることを優先すべきです。具体的には、CLI（コマンドラインインターフェース）の基本操作、IDEの使い方、コンテナ技術（Dockerなど）、そしてGitのバージョン管理に慣れることが重要です。

これらのスキルは実際の開発現場で即戦力となるため、まずはここに注力すると良いでしょう。

# 知識体系

プログラマーに必要となる基礎的なコンピュータサイエンスの知識体型を以下に示します。

- データ構造・アルゴリズム
- OS
- コンテナ
- セキュリティ
- ネットワーク
- web
- データベース

これらをさらっと学んでおくと良いでしょう。

後で、各領域の入門書を載せておくのでご覧ください。

システム開発のざっくりとした工程を以下に示します。

- 要件定義
- 基本設計
- 詳細設計
- 実装
- テスト
- デプロイ
- 保守運用

次の章で、優先度順に、具体的に求められる知識を解説していきます。

# 各領域

(Amazonのアソシエイトとして適格販売により収入を得ています。)

まずはコンピュータサイエンスの基礎知識について解説していきます。

### データ構造とデータ処理のアルゴリズム

コーディング試験の突破に必須です。

初心者向けの書籍でさらっと勉強し、paizaなどで色々と問題を解くことを勧めます。

僕が使った入門本はこちらになります。主要なデータ処理のアルゴリズムとそれに関連する数学の知識がわかりやすくまとめられています。フルカラーで図も多く初心者向きです。

https://amzn.to/4hwRKT3

また、こちらも購入して勉強しています。400ページ超の大ボリュームです。

https://amzn.to/4iwhCQc

### データベース

データベースといえばSQLの学習を勧める人が多いですが、ORMを使うことが多いので後回しにしてもいいと思います。(でもいつかやるハメになるので時間があるなら無料のオンラインサービスなどでざっくりと勉強しても良いです。しかし、データ系職種の場合は必須となります。)

後述の、実務でよく使う機能3選(web系)の1つにバックエンドのデータベース連携があります。そのため、ポートフォリオのためにテーブル設計を先に学ぶことを勧めます。

テーブル設計の入門本はこちらが人気です。全体をざっと見て、RDBとは何か、テーブル正規化(第3,４正規化まで)を理解できれば一旦大丈夫です。後に時間が作ってじっくりと読みましょう。

https://amzn.to/4kXfbI7

SQLの学習本はこれ一択になります。本書を新品で購入するとdokoQLというオンラインのSQLの実行環境を使うことができます。自分で実行環境のセッティングを行わなくて済むので楽です。

https://amzn.to/4hxn4Ry

(後述のER図も将来的に必要になります。)

### コンテナ

web系の開発を行うならコンテナの知識は必須になります。しかし、開発に使うことさえできれば特に問題ないです。dockerの使い方をネットで調べるだけでもokです。

(深く理解するには後述のOSの知識が必要になるので後回しにすべきです。)

書籍を買うまでもないですが、僕はこれを買って参考にしました。dockerを使った開発が一通りできるようになります。基本的なdokcerコマンドやdocker composeでの複数コンテナの管理、クラウドへのデプロイまで網羅的に扱っています。

https://amzn.to/4iuXZIl

また、より発展的な内容のものとしてこちらがおすすめです。資源管理やネットワーキング、セキュリティ管理ツール、GUI管理ツール、オーケストレーションツール(kubernetes)なども扱っています。

https://amzn.to/4iwR2GF

### ネットワーク

前述の技術面接でよくある質問「ブラウザにurlを打ち込んでからコンテンツが表示されるまでの流れを説明しろ」といったものの対策に学んでおくのはアリです。

ネットワークの代表的な書籍がこちらになります。上記の質問をそのまま解説したような内容であり、TCP/IP, LAN, 光ファイバなど広く学べます。読むとしても、さらっと読むくらいで大丈夫です。

https://amzn.to/4bTplW2

より初心者向けの書籍はこちらです。フルカラーでイラストはふんだんに使われており、全体像を掴むのにもってこいです。見開き1ページに1コンテンツという構成で大変見やすいレイアウトになっています。

https://amzn.to/42e5kFl

### web

web系を目指す場合は学んでおくべきです。HTTPメソッドやステータスコード等は面接でよく聞かれます。

しかし、それもポートフォリオの作成が済んでからで良いです。あくまで、アウトプット重視でいきましょう。

webについての初心者向けの書籍は、先ほどと同じシリーズから出ておりおすすめです。

https://amzn.to/4iVIwRn

より発展的な内容を知りたいならこちらが人気です。HTTPやURI, HTMLなどの仕様を歴的経緯や設計思想を織り交ぜ解説しています。予備知識なしで読むのはやめた方がいいです。

https://amzn.to/4bVqtIE

### セキュリティ

ポートフォリオをデプロイまでするなら学んだほうが良いです。

しかし、内容の難しさから優先度は低めです。ユーザー認証に関わる部分だけ説明できればとりあえずokです。

セキュリティについての初心者向けの書籍も、先ほどと同じシリーズから出ています。

https://amzn.to/4bRd18F

また、webアプリに特化したものならこちらがおすすめです。webのセキュリティ脅威が網羅的に解説されており、それに加え、VirtualBoxの仮想マシン上で脆弱性のサンプルを試すハンズオンが付属し、実践的な学びが得られます。

しかし、ボリュームが多いので無理に読む必要はありません。

https://amzn.to/4itVhTt

上記のコンテナのセキュリティに特化したものはこちらがおすすめです。これの理解には後述のOSの知識が必要なため、後回しで大丈夫です。

https://amzn.to/4c1N9XJ

デプロイに際して役立つものがこちらです。具体的にどのように脆弱性を診断を行うべきかと、診断ツールの使い方が解説されています。本格的にサービスをデプロイする場合に読むべき書籍となっています。

https://amzn.to/4iRGS37

### OS

パフォーマンスチューニング, セキュリティ対策等に必須となる知識ですが、優先度は最低です。時間があるときにやると良いです。

しかし、CLIを全くできないのは致命的ですので、wslでLinuxコマンドを試すくらいはしても良いと思います。

開発・サーバー向けOSのLinuxについての書籍はこちらがおすすめです。カーネル、プロセス管理やスケジューラ、メモリ管理、記憶階層、ファイルシステム、仮想化機能、コンテナ、さらにハードウェアに関する仕組みについて網羅的に、かつフルカラーの図解でかなり分かりやすく解説された最良の初心者向け書籍です。コマンドもpythonやGoといったモダンな言語で書かれています。

https://amzn.to/41OOsol

(また、おまけですが、OSを理解した次は並行処理について学ぼうと思っており、こちらを購入予定です。)

https://amzn.to/4hDnTbF

繰り返しになりますが、そこまでしっかりと理解しようとしなくて大丈夫です。代表的なワードとその意味を知っているくらいで大丈夫です。

(ここまでの内容が理解できれば大抵のインターン選考なら突破できると思います。メガベンチャーだとシステムデザイン面接を行うこともあると聞きました。答えられる学生いるんですかね?)

次はシステム開発に必要な知識を解説していきます。

優先度順で並べると次のようになります。

### バックエンド/フロントエンド開発

これまで話したとおり、アウトプット重視で学んでいくことが重要です。そのため、実際にアプリケーションの実装を最優先に行うべきです。

使いたい言語, フレームワークの解説動画や初心者向け書籍の内容をなぞって実装し、それに機能を付け足すような形でポートフォリオを作っていきましょう。

先に出てきた実務でよく使う機能3選(web系)は、

1. データベース連携
2. ユーザー認証
3. 定期/非同期処理（バッチ処理 + キュー処理）

です。

1, 2はわかると思います。3は聞き慣れないですが、これは、

- 週に1回、データベースのバックアップをする
- 毎日、深夜にユーザーの利用履歴のレポートを出す

などの処理のことです。3を扱った初心者向けの教材、書籍はあまりないです。自力で調べて実装することで差別化とスキルアップが望めます。

おすすめの書籍として、Django(python)+React(java script)のものを挙げます。youtubeの動画教材でも良いと思います。

(注意点として、ライブラリ・フレームワーク・プログラミング言語・ランタイムのバーションを教材と揃えて下さい。)

https://amzn.to/4iVKiC1

これらの開発を前述のdocker等のコンテナで行いましょう。

また、余裕があれば、前述のセキュリティについて簡単に実装しておくと良いです。(さらに、ユーザー認証の仕組みなどを説明できるとなお良いです。)

フロントエンドに関してはあまり知識がないので、学びたい方は別のソースから情報を得て下さい。個人的には、ネットで調べれば大抵のことはわかるので初心者は書籍を買うまでもないと思います。

### プログラミング(パラダイム, コード設計, コーディングルール, etc)

(ここから先は、基礎的なプログラミング、簡単なポートフォリオ作成が完了した人、既にエンジニア職に就いた人が対象です。)

「三日後の自分は他人」という言葉があります。数日空くだけで過去の自分のコードが一体、どんな処理をしているのかがわからなくなるということの比喩です。他人が書いたものなら尚更です。その解読に時間が取られてしまうのは大変もったいないです。

そのため、自分にとっても、それを将来的に保守することになる他人のためにも、万人にとって読みやすく理解しやすいコーディングを心がける必要があります。

初心者向けに分かりやすいものだと、こちらになります。

https://amzn.to/4hCGpko

有名どころではこちらですね。前述のものよりやや難しいですが、既にある程度プログラミングができるならこちらがおすすめです。

https://amzn.to/4kTBUok

プログラミング言語には様々なパラダイム(考え方, 価値観, 規範)があります。それらを理解することで、より高い可読性, 保守性, パフォーマンスを持ったコードを実装できます。

現在、メジャーなパラダイムはオブジェクト指向ですので、それだけを簡単に学んでおくと良いです。

ここで圧倒的におすすめの書籍があります。実務に入る前に全員読んだほうが良いと断言できるレベルのものです。命名規則やネストを浅くするといった基本的な手法に加え、オブジェクト指向向けの優れた設計原則や、テスト・リファクタリング手法、後述するドメイン駆動設計の知識までを網羅的に扱っています。

それを、悪いコードの例から段々と良いコードへと改善していく(リファクタリング)過程を平易な文章で説明することで、大変理解しやすい形にまとめた良書の中の良書と呼べる本です。是非とも読んでいただきたいです。

https://amzn.to/4iwld0E

(この本の18章 「さらにステップアップするための設計技術書紹介」がありますが、そこで紹介されているものは

- リーダブルコード(Dustion Boswell)
- リファクタリング(Martin Fowler)
- Clean Code(Robert C.Martin)
- エリック・エヴァンスのドメイン駆動設計(Eric Evans)
- テスト駆動開発(Kent Beck)
- etc

など名だたる名著が並んでいます。これらの様々な優れた開発手法の知識を凝縮した本書を、是非、手に取ってみて下さい。

**もし私が他の人よりも遠くを見渡せたのだとすれば、それは巨人の肩の上に立っていたからだ - アイザック・ニュートン -** 

巨人の肩とは、知識が少しずつ積み重ねられていく様子を表す比喩です。彼は、人々が過去の知識を活かしてさらに新しい知識を得ることを「巨人の肩の上に立つ」ことで、より遠くを見ることができると表現しました。書籍で言えば、その質は引用で決まるといっても過言ではなありません。)

…

続きは来週に。

お疲れ様です。コンピュータサイエンスの基礎知識と、ポートフォリオ作成用にフロント/バックエンド開発、プログラミング(チラ見せ)を解説しました。参考になれば幸いです。

# まとめ

ここまでご覧になってくださった皆様、誠にありがとうございます。

このアカウントは週1回の投稿を目指しております。

来週は続き(プログラミング, 上流工程, アーキテクチャ等)の解説をしていきます。

それでは皆様、また来週。