エンジニアの参考書ルート

## はじめに

以前、大学でコンピュータを勉強している人たちがどういった内容をどういった順番で学習しているかについて書きました。

https://qiita.com/yngwie6120/items/2d1a730320cee6502b68

前回の記事はエンジニアの参考書ルートの基礎編だと思っています。今回はこの内容に加え、**「では実際にエンジニアを仕事として始めたら実務では何が足りなくなってくるか？」** について書いてみたいと思います。


***情報学科卒の目線*** から自論を加え、プログラミングスクールや市販の書籍を使って学習して就職したエンジニアと比較を交えつつ ***ここに力を入れると周りから一歩抜きに出るのではないか？*** という点やお勧め本を書いてみたいと思います。私の周りでも別学科卒で社会人からソフトウェア開発を始める人たちがいますが、彼ら彼女らをみて気づいた点も盛り込んでみたいと思います。


本記事の特徴として **いわゆる思想本みたいな概念だけ書いてある本はなるべくお勧めしないようにします。** 具体的にPCで手を動かして実践できそうな本を中心に紹介します！

本記事の対象

- 大学でソフトウェア開発を学んでこなかった新卒エンジニア
- 大学でコンピュータを学んだエンジニア
- エンジニア採用を検討している非エンジニアの人事担当者
- とにかく暇な人

## 苦手としそうなことベースに考える

### チーム開発

チーム開発は苦手な方が多い分野だと感じております。複数人で一つのソフトウェアを作成することと一人でプログラミングすることは全く異なると思っております。なぜ難しいのかはシンプルで「自分のためにコードを書くか他の人のためにコードを書くかの違いがあるから」だと思っております。例えばグローバル変数（プログラム全体から参照できる値）の多用や難読な変数名などが挙げられます。

もし学生の頃に戻ってエンジニアリングを学ぶのであれば、学校外で「Githubを用いて複数人でサービス開発する」という経験をしておくと非常に心強いと感じます。もしプログラミングスクールなどでこれを学べるところがあればとてもラッキーだと思っております。そういうところを選ぶべきでしょう。

新人研修やOJTでこれをカバーしてくれるのであれば非常にありがたいことです。大事なのは抽象的に学習しないで具体的に学習することだと思います。いくつか参考にしやすい本やリンクを載せておきます。どれもとてもいい本です。

| おすすめ | 解説 |
|:----| :----|
| [GitHub実践入門 Pull Requestによる開発の変革](https://www.amazon.co.jp/GitHub%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-Pull-Request%E3%81%AB%E3%82%88%E3%82%8B%E9%96%8B%E7%99%BA%E3%81%AE%E5%A4%89%E9%9D%A9-PRESS-plus/dp/477416366X) | Github の基本操作に加え、ブランチ戦略が載っている。とにかくわかりやすく、これを元にGithubを操作するだけでバージョン管理の基本が理解できる |
| [リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック](https://amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655) | 他者が読みやすいコード、メンテナンスしやすいコードというものが体系的に解説されている。 | 

### エラー処理

エラー処理は深いです。プログラムスクールでも必ずと言っていいほどエラー処理(try~catch)を学ぶと思います。ではこのジャンルについてそれだけで良いかというとそういうわけでもないと思います。学生時代に授業などで開発するソフトウェアは運用を行わないので、エラー処理についてどういったエラーの場合には処理を継続するか、どういったエラーはなんの情報をロギングするかなどを深く考える機会はなかなかないのではないでしょうか。また、そもそもエラーの起こりづらいコードをしっかりと書くのも大事になります。

| おすすめ | 解説 |
|:----| :----|
| [良いコード／悪いコードで学ぶ設計入門―保守しやすい　成長し続けるコードの書き方](https://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89-%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E2%80%95%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84-%E6%88%90%E9%95%B7%E3%81%97%E7%B6%9A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-%E4%BB%99%E5%A1%B2/dp/4297127830) | オブジェクト志向を中心に、いかに正常状態に戻れるコードを書くかという観点からさまざまなノウハウが解説されている。 |
|[自走プログラマー](https://www.amazon.co.jp/%E8%87%AA%E8%B5%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-Python%E3%81%AE%E5%85%88%E8%BC%A9%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%96%8B%E7%99%BA%E3%81%AE%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9120-%E6%B8%85%E6%B0%B4%E5%B7%9D-%E8%B2%B4%E4%B9%8B/dp/4297111977)| 個人的おすすめ本です。エラー処理方法にとどまらず、どういったエラーを処理すべきか実例ベースで書いてあります。 またロギングについても言及があります。一度書店で手に取ってみると良いです。|

### パフォーマンスチューニング

　プログラミングスクールに通っただけの状態で、システムのパフォーマンスチューニングができる人はあまりいないでしょう。どこにボトルネックがあるのかをチェックできるスキルはコンピュータの深い知見からくるものだと思っておりまして、ここに注力することで一歩抜きに出ると考えています。
 
 大学でコンピュータを専攻する場合、避けては通れない学問としてOSとハードウェアを学習します。OSの文脈ではさらにスレッドやプロセス、排他制御やファイルスワップ、スケジューリングなどを勉強するでしょう。これらの知識を元に **コンピュータに対してやさしい実装** を心がける必要があります。

なぜこれらの知識がパフォーマンスと関係してくるかというと、端末の条件が一緒だったとして、その際のシステムのパフォーマンスというのはプログラミング言語選定やそのプログラムがどれだけオペレーティングシステムに無茶をさせるかによって決まってくるからです。初見の人はイメージしづらいと思うのでどういった例かというと

- 無駄にメモリを確保してしまう
- マルチスレッド化していないため特定の処理がロックされる
- メモリがないところにメモリ確保しようとしても無理
- ファイルアクセスが多すぎる

 などなどです。これらについて理解するのって、コンピュータそのものの基本的な学習が非常に大事になってきます。

 またデータベースのチューニングについては、正規化だけではなく、データベースそのものの動作も含めた知識が必要です。データベースのチューニングについては大学の学問としては行わないため、ここはエンジニアとして日々勉強していくべき領域になります。といっても、データベースはミドルウェアであり、OSの深い知識やソフトウェアの知識がDBの理解にも非常に役立つと考えます。

| おすすめ | 解説 |
|:----| :----|
| [達人に学ぶDB設計 徹底指南書](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6DB%E8%A8%AD%E8%A8%88-%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798124702) |　正規化が網羅されており、パフォーマンスとのトレードオフについても言及がありました。SQLアンチパターンという本も良いですが、業務の有無に関わらず、DB設計の本は一冊手元に置いておくと心強いと思います。 |
| しっかりめのOS系の本 | OS系のしっかりとした技術書を最低一冊は読んでおくと良いと思います。[以前の記事](https://qiita.com/yngwie6120/items/2d1a730320cee6502b68)に載っけた恐竜本はおすすめなのですが値段が高いのと分厚いので挫折しそうな人は本屋で別の本を探してみてください！ |

あとSQLアンチパターンについての勉強会の様子がYoutubeで見れるのでみてみると良いかもしれません。

https://www.youtube.com/watch?v=3ARJpYZA9uI

 ### アーキテクト

 シンプルなアプリケーションのエンジニアとして業務する場合にはそこまで関係ないかもしれませんが、システム設計までセットで業務範囲に含まれる場合にはどれだけ幅広くITの知識を醸成しているかが一つポイントになります。日本的な働き方ではこちらの仕事をする機会が多いのではないでしょうか。人材を雇用する方は自分の雇用する人材が単にソフトウェア開発を行うのか、会社のITシステムを抜本から考える必要があるのかを整理しておくとミスマッチが起こりづらいかと思います。

システムが大規模化していくと、バックエンドとフロントエンドを役割分担することも必要になります。インフラ面ではキャッシュなどの話も出てきます。多くの皆様が経験するであろうWebアプリサービスの開発では、バックエンドシステムとしてWebAPIの設計に携わる方も多いと思います。TCP/IPを学ぶことと、WebAPIを学ぶことは少し異なるので、よく理解本としてお勧めされている「TCP/IP」などはちょっとレイヤーが異なる学習になりますね。自分がどこまで必要なのか考えつつ学習すると良いかと思います。

| おすすめ | 解説 |
|:----| :----|
|[Web API: The Good Parts](https://www.amazon.co.jp/Web-API-Parts-%E6%B0%B4%E9%87%8E-%E8%B2%B4%E6%98%8E/dp/4873116864) | キャッシュの話やURL設計などがしっかりと解説されているため、初学者がとっつきやすいと思います。Webのバックエンド開発に携わることになったらぜひ読んだほうがいいと思います！ |
| [AWS認定ソリューションアーキテクト－アソシエイト問題集](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%EF%BC%8D%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E5%95%8F%E9%A1%8C%E9%9B%86-%E7%AC%AC2%E7%89%88-%E6%BE%A4%E7%94%B0%E6%8B%93%E4%B9%9F-ebook/dp/B0CJXNHFB8?ref_=ast_author_mpb) | アーキテクトは勉強しづらいジャンルだと思うのですが、最近はAWSやGCPの資格があるのでわかりやすいですね。クラウドでシステム設計を行えるようになることがアーキテクトのスタートラインと思います。 |

## おわりに

今回はエンジニアが苦手としそうなこと（特にプログラミングスクールなどで学んだ方）を考え、これまでの経験で読んでみて良かった本を学習ルートとして提示してみました。この記事を書いている時に思ったのですが、キャッシュとかプログラミングパフォーマンス面についての鉄板本ってどこかにあったりするんですかね。（ググってみたら何冊かヒットしたものの、自分はこれまで都度ネットで調べてしまっていたので、本はおすすめできませんでした）

もし既存のおすすめの本がなさそうならばQiitaで執筆してみようかなと思っています。もし、「この本がおすすめ」あったら教えていただけるとありがたいです。