プログラミングスクールに通うくらいならこの本を読め10選
概要
職業ソフトウェアエンジニアを目指す方々にオススメしたい書籍トップ10です
以下の観点から選定しました
10年後でも変わらない、流行にとらわれず長く役に立つ、ソフトウェアエンジニアリングにおいて普遍的な知識
特定のプログラミング言語やプラットフォームやツールに精通するのではなく、現代のソフトウェア開発の哲学・文化の全体像が把握できることを優先
200~300ページくらいで初心者でも読破できる
400~500ページくらいの本もあるが、それらは辞書的に使うのがいい
あえて10冊に絞り込んだので、ここに含められなかった書籍も当然あります
本を読むとは?
本の内容をすべて暗記しろとかいうつもりはまったくない
どの本のどこにどんなことが書かれているのかをぼんやりと把握しておければ充分
自分専用のScrapboxにメモっておいて検索して一瞬で取り出せるようにするのでもいい
最低限、目次は思い出せるように覚えておいたほうがよい
目次に登場するキーワードは最重要事項なのでさすがに暗記しておいてほしい
キーワードを暗記しないと検索することすらできない
疑問に思ったり必要になったらその都度思い出してその本を取り出して読めばいい
第一位
https://gyazo.com/50c31fba55bf9b142a59f305c951f3d9
選定理由
不動の一位
現役ソフトウェアエンジニアが「せめてこれは読んでいる前提で話をしたい…」と切実に語る一冊
職業ソフトウェアエンジニアは、自分一人でプログラミングするのではなく他人と協調してコードを書き、仕様変更や機能追加やバグ修正など長期的なメンテナンスを意識したソフトウェアを開発していくことが求められる
そのための心構えがコンパクトにまとまった一冊
第二位
https://gyazo.com/563e04b0fad1a7864b623ddbf5fc1835
選定理由
世の中には様々なプログラミング言語があるが、それぞれがどのような思想・理念で設計されているのか、なぜそのような思想・理念を実現しようと思ったのか、という歴史的経緯を丁寧かつコンパクトに紐解いている本 第三位
https://gyazo.com/b40ea63bdc706158ce1e408f01d3eb12
選定理由
現代のインターネット上で提供されているAPIは、いまでも多くがWeb技術をベースとしているため、スマホアプリ開発やゲーム開発をするとしてもWebに関する体系的な知識は必須と言えるだろう この本はWebが誕生した思想的背景まで遡り、WebにおけるHTTP・URI・HTML・REST・JSONといった基本的な概念を解説し、自分がWeb APIを設計開発することになった際に注意すべきポイントについてまで学べる一冊となっている 第四位
https://gyazo.com/7bc5fc74cbd53afb8a42c01d5a337a45
選定理由
Linuxを触っていると、「なんでこんな仕組みになってるんだ?」と疑問に思う場面が少なからずある
/dev/ 以下にあるいろんなファイルは一体なんなんだ?とか
Linuxの祖先であるUNIX、さらにUNIXの祖先であるMulticsまで遡って、OSとしての発展の経緯・歴史が詳述されたこの本を読むことで、そうした疑問は解消されていくだろう 第五位
https://gyazo.com/2265de01cb82ffadf8614bcb3a8adde8
選定理由
ソフトウェアが意図したとおりに動かない想定外の状態=バグはどうしても発生してしまう
しかし、あるコードが意図通りに動くことを確認するコードが書けたらどうだろうか?
さらに、その確認コードを自動的に実行して動作確認することができればどうだろうか?
自分が書いたコードが、自分がテストに書いた想定の範囲内では正しく動くことを再現性を持って証明できる
コードを変更するたびにテストを自動的に実行すれば、コードの変更後でも意図したとおりに動くことを確認できる
とはいえ、どのようなテストをすれば意図したとおりに動くことが保証できるのだろうか?
場当たり的にテストを追加していると、抜けや重複などといった問題が生じてしまう
あらゆる場合を想定したテストを書いていると膨大なパターンになってしまう
「ソフトウェアテスト」という概念はこうしたテストを体系的に整理し、効率的にソフトウェアの品質を向上するための分野である
第六位
https://gyazo.com/8288417da470b6e8d3c919a84a075ae6
選定理由
いくらテストを書いたとしても完璧なテストを書くことはできないので、想定外のバグは発生してしまう
この本は、特定のプログラミング言語のデバッグ手法が書かれているわけではなく、ソフトウェアのデバッグに関して体系的な知識が網羅されている
どうすればソフトウェアのバグを効率的に発見し、再現し、修正できるのかという体系的な理論を学ぶことはソフトウェア開発の現場で活かせるはずだ
第七位
https://gyazo.com/c96a9ac749eddc6f0fb766b7b4cd926e
選定理由
新卒や新人がいきなりシステム開発の現場でデータベース全体の設計を任せられることはまずないだろう
そんな現場あったらやばい
しかし、自分が開発に参加するシステムのデータベースがどのような考え方に基づいて設計されているのかを知っておくことは重要だ
新機能追加を任せられた際にはデータベースのスキーマ変更も必要になるかもしれない この本はデータベースのテーブル設計・正規化・ER図などの基本から、SQLの書き方やチューニング、パフォーマンスを高めるインデックスなど、リレーショナルデータベースの使い方に関する知識が網羅されている 第八位
https://gyazo.com/18a71b0b85ed240afade7ad89e40a637
選定理由
現代のソフトウェア開発の現場においてDockerは急速に普及し、無くてはならない必須ツールの座を獲得しつつある Docker以前は開発中のソフトウェアシステムを動作確認しながら修正するために、まずプログラミング言語のバージョンを合わせ、依存ライブラリをインストールし、データベースをインストールしてセットアップし……、といった複雑な手順をドキュメントに書き出してそれを読みながら手動で行っていたが、Dockerおよびdocker-composeのおかげでそうした開発環境の構築が簡単に再現できるようになった この本は、Dockerに触れる以前の「そもそもクラウドコンピューティングとは何か・サーバーとは何か・OSI参照モデルとは何か・Linuxとはなんなのか」といったシステムインフラに関する超基本的な所までカバーしており、さらにDockerの内部的な仕組みも解説しつつ、具体的な活用法までがまとまっている一冊である 第九位
https://gyazo.com/719ec1f40ce83ff33606c23aca0f478c
選定理由
第十位
https://gyazo.com/05d61564b0817d73e5b250b1a7f37db4
選定理由
インターネット上に公開するシステムは、常に攻撃の危険性に晒されていると考えたほうが良い
こうした問題を可能な限り減らすためには、「自分が開発しているシステムはひょっとしたら攻撃して破壊したり情報を盗めるのではないか?」という攻撃者の視点を知ることが重要だ
先述したように現代のインターネット上で提供されているAPIは、いまでも多くがWeb技術をベースとしているため、スマホアプリ開発やゲーム開発をするとしてもWebアプリケーションのセキュリティについて学ぶことは必要である 最も攻撃されやすいログイン認証に関しては一章を割いて詳細に解説されている
選外
惜しくも10位には入らなかったけど紹介しておきたい本
その1
https://gyazo.com/f751ef71da28581d559b57397e5354fb
選定理由
gitやgithubについてまとめてあるコンパクトな書籍を探していたらこれが出てきた
図が非常に豊富でわかりやすい
しかし、基本すぎるのでこの記事の対象読者はすでに知っていそうなので選外となった
その2
https://gyazo.com/6ce3daea0141716dda58948a9e8fe5b2
選定理由
あなたはたとえばWebブラウザにURLを入力してからWebページが表示されるまで、なにが起きているかを大雑把にでも把握できているだろうか
この本は、現代のインターネットを構成している通信プロトコル・通信デバイス・通信インフラの仕組み、それらがどのようにつながって動いているのかという全貌を把握するのに最適な一冊となっている
ネットワークエンジニアやインフラエンジニアでなくともこれくらいは把握しておいたほうがいいという内容がまとまっている
その3
https://gyazo.com/fae40d623168db2d267f681ce66a14b4
選定理由
正規表現はほとんどあらゆるプログラミング言語に実装されている文字列の判定・抽出パターンである
たとえばURLから特定の部位を取得したい時などに頻繁に使う必要に迫られる
しかし、詳説正規表現は528ページもあり分厚すぎるので選外とした
高いし…
その4
https://gyazo.com/5809f98d3e943f44b80c84ed12e780fc
選定理由
プログラミング実務において求められるパターンが101個網羅されている本