今まで読んだ技術書の中で汎用的で印象に残っているものをまとめてみる

30代半ばでWebエンジニアに転職者（≠転生者）のおぎです。
2020年のコロナ禍をきっかけに興味本位でWebプログラミングを学び始めたのが運の尽きで、あれよあれよという間に深みにハマり、気づけば30代半ば（妻子あり）で異業種から転職をし、今はPHPをメイン言語としてバックエンドのプログラムを書いたりしています。

転職してからは社内向けのアウトプットは多少していたのですが、インプットと実務で最近ほとんど外部向けへのアウトプットが行えていなかったので、リハビリがてら今まで読んだ本を覚えている範囲でリストしていこうと思います。（本当はもっと色々読んでいるんですが、難しすぎて理解できなかったり、他の本と内容が重複していたりで覚えていないものも多く、覚えていないものに関しては読んでいないのとほぼ同じだと思うので覚えている範囲のみで...）

※自分は基本的にPHPがメインではあるのですが、特定の技術や言語に関する技術書は時代とともに変化しやすい上、汎用性が低いので自費での書籍購入はなるべく汎用的なものを選ぶようにしています。

## オブジェクト指向でなぜつくるのか
https://www.amazon.co.jp/dp/4296000187

Webプログラミングに触れ始めて4ヶ月目くらいに『とりあえず動くものはできたけど、コードに関するフィードバックが欲しい...』と思い、コードを見てもらった方におすすめされた本です。当時は作ったデータは全て連想配列に格納していたのですが、「全てをオブジェクトでやりとりしましょう、あとまだ読んでないのであればこれを読んでください」と言われ、1週間位かけて読みました。
アセンブラから現代のJavaをはじめとするOOPに至るまでの言語の歴史などから体系的にオブジェクト指向についてまとめられており、これによって当時はふんわりとしか理解していなかったクラスやメソッド、インスタンス変数に関する理解が深まった記憶があります。

## リーダブルコード
https://www.amazon.co.jp/dp/4873115655

言わずと知れた名著、オライリー本にしてはかなり薄いし読みやすい。
コメントの書き方など、コードの振る舞いを変えなくてもできる改善から始まり、色んな角度から「コードは人に読まれるためにあるんやで！」ということを繰り返し説いてくれる。自分が主催した輪読会の題材としても利用したが、各章が短いため題材としても扱いやすかったです。
（年に1回くらいは読み直したい...）

## Webを支える技術
https://www.amazon.co.jp/dp/4774142042

インターネットとは？HTTPリクエストとは？URIとは？みたいなWebを取り巻く用語や技術を体系的に解説している本。
Webアプリは作ってたけど、APIってなんやよくわからん...HTTPメソッドってGETとPOST何が違うの？
みたいなレベルの時に読んだのですが、正直半分も理解できなかった。
読んでて楽しい本ではなかったけど、これを読んでいたおかげで転職したあとも比較的スムースに会話についていくことができたので読んでおいてよかった本です。

## 現場で役立つシステム設計の原則
https://www.amazon.co.jp/dp/B073GSDBGT

いわゆる『増田本』というやつですね。
転職してから初めて見た実務のコードが関数化やクラス化がほとんどされていないスクリプトプログラムで、変数名などもほとんど工夫がされていなかったため、全く読み解くことができずかなり病んでいた時期にメンターさんに相談したところ勧められた本。

帯の
「ソースがごちゃごちゃしていて、どこに何が書いてあるのか理解するまでがたいへん」
「一つの修正のためにあっちもこっちも書き直す必要がある」
という文言に『これはまさに！』と思い買った本です（笑）

読みにくいサンプルコードをどうすれば読みやすくできるか？というところからスタートして、DB設計やオブジェクト指向の仕組みを利用したドメイン駆動設計的なアプローチなどを非常にわかりやすく解説されています。
実はこの本の前にもDDDに関連した書籍を読もうとして挫折していたのですが、この本は設計の入門として書かれているだけあってすんなり読み進めることができました。

## 達人に学ぶDB設計徹底指南書
https://www.amazon.co.jp/dp/B00EE1XPAI

当時携わったPJのDB設計の思想が理解できず。DB設計とは？というところが知りたくて手に取った本。
残念なことにこの本を読んだ結果当時関わっていたPJは俗にいうアンチパターンだらけのDBだったと分かったわけですが...
ちょうど同時期に現場で役立つシステム設計の原則を読んでいたこともあり、『設計次第で本当に開発者体験って変わるんだなぁ』と思った記憶があります。
DBがシンプルならクエリも、抽出したデータを扱うアプリケーションコードもシンプルになるというのをこの本と増田本で再確認し、以降テーブル設計時には諸々意識するようになりました。

## プリンシプルオブプログラミング〜3年目までに身に着けたい一生役立つ101の原理原則〜
https://www.amazon.co.jp/dp/4798046140

Webエンジニアに転職してすぐくらいに読んだ本。SOLIDってよく見かけるけどなんだろう？みたいな時期だったのでちょうど良さそうだなと思って手に取ってみたのですが正解でした。
1章は短いながらも非常に本質的なことが書いてあり、各章や原則（プリンシプル）も非常にわかりやすく書いてあり、またプリンシプル単位で読めるのでスキマ時間などに読み進めることもできます。
この本で『コードは設計書であり、プログラマは設計者である』という思想に初めて触れ、設計に興味を持ち始めました。

異業種転職組の自分としては1日でも早く身に着けねば...と思い日々生きております。
（この本ももう少し定期的に見直さないといけないなぁ...）

## 知識ゼロから学ぶソフトウェアテスト / ソフトウェア品質を高める開発者テスト
https://www.amazon.co.jp/dp/4798130605

https://www.amazon.co.jp/dp/4798165034

ちょうど実務に入って少し経ったくらいのタイミングだったのですが、当時の携わっていたPJでは『テスト≒ブラウザでの動作確認』だったのですが、パラメーターの考慮やテスト方法がよくわかっておらず分岐の網羅なども今思うと全然できていなかったのですが、『そもそもテストって何なん？』というところから手に取った書籍です。

知識ゼロから学ぶソフトウェアテストは『バグとは何か？』、『テストケースってどうやって作るの？』といった基本的なところから体系的にテストに関して解説した良書。ソフトウェア品質を高める開発者テストはすごくザックリまとめると『E2Eはコストが高いからTDDで作ったり、テストしやすいプログラムにしておいてユニットテストで工数を減らそうな！』って話（超雑）でした。

いずれも開発者であれば最低限嗜みとして学んでおいたほうがいいことだなと読んでから思いましたまる。

## 失敗から学ぶRDBの正しい歩き方
https://www.amazon.co.jp/dp/4297104083

キャラが濃いことで有名（？）な曽根さんのRDBのアンチパターン本。
かなり読みやすく、週末でサクッと読めてしまうくらいの分量なのですが、DBエンジニアが見てきた『こんな設計するとこんなつらみがあるよ』というのは非常に参考になりました。

## 良いコード、悪いコードで学ぶ設計入門
https://www.amazon.co.jp/dp/4297127830/

いわゆる『ミノ駆動本』。クソコード動画で有名な著者の方が入門者向けにアプリケーション内の設計におけるアンチパターンとその対処方法についてわかりやすく解説してくれている本です。

個人的には今までなかなか掴めていなかったValueObjectの概念がようやくこの本で腹落ちした感があります。
また、PHPのInterfaceというものの利点に関して、イマイチ納得できていなかったところがあるのですが、この本を通してようやく納得でき、久しぶりに読書を通して『腹落ち感』を感じました。ちなみに本の中に出てくる『生焼けオブジェクト』をはじめ、いくつかのアンチパターンに関しては前職で書いてしまった心当たりがあるので今後は気をつけたい...

## ちょうぜつソフトウェア設計入門
https://amzn.asia/d/1Ya3Vm6
『ちょうぜつ本』とも呼ばれる設計の入門書です。
冒頭POPな絵柄で分かりやすくプログラミングの基礎やGitなど基本的な部分から入ってくれるので油断しましたが、中身を読むとかなり重厚でした（笑）
一世を風靡した「クリーンアーキテクチャ」から始まり、TDD（テスト駆動開発）、DI、SOLID原則などがなぜ必要とされたか？という背景とともに分かりやすく解説されています
個人的には本書を読んでからクリーンアーキテクチャを読んだら割とすんなり読めました。PHPでサンプルコードが書かれているのも非常にありがたかった

表紙をPHP系のカンファレンスに持っていくとかわいいイラストを書いてもらえるとかもらえないとか？

## プログラマー脳
https://amzn.asia/d/au6EmN3
認知科学に基づいてより良いコードを書くには？複雑なコードとどう向き合ったら良い？というようなトピックを扱っている書籍
業務システムなどでありがちな複雑な実装と向き合う際に読んでおくと引き出しが増えそうだなーという感想
業務で読むコードが全然読めなくて辛かった1年目に読んでおきたかったかもしれない

## アジャイルプラクティスガイドブック
https://amzn.asia/d/bCx1Z1U
アジャイル開発で用いられる手法を開発の現場でありがちな事例とともに分かりやすく解説している書籍
レビュー、ペアプロ、テストの自動化、CIの構築など幅広いプラクティスを扱っているが、非常に分かりやすく平易な言葉で書かれているので開発チームはもちろん、可能であればビジネスや運用に携わっている人たちと一緒に輪読したい内容でした

# デザイン／フロントエンド寄り
普段はバックエンドがメインなのですが、実はWebプログラミングを学び始めたのはフロントエンド側が先、というよりは当初はWeb制作の方に興味があったので、デザインなども少し勉強していました（結局思ったようにできず、早々に諦めてしまいましたが...）
しかしながらデザイン≒情報設計なのでデザイン原則の考え方はオブジェクト指向の設計にも通じる部分があり、多少なりともかじったのは非常に良かったなと今になっては思うので、こちらの合わせて供養しておこうと思います。

## なるほどデザイン
https://www.amazon.co.jp/dp/4844365177

ノンデザイナーにも非常にわかりやすい内容で、どのように情報を設計し、どんなプロセスで洗練させていくのかが非常にわかりやすかったです。
（わかったとは言っていない）

## レイアウトデザインの教科書
https://www.amazon.co.jp/dp/B07NYN1681/

デザイン３原則をはじめ、『レイアウト』にフォーカスしてどうすれば訴求対象により伝わるか？を解説した本。
多少のトレンドはあれどもいわゆるアンチパターンなどを例に出してくれているので「ぁ、こういうのはやらないほうがいいんだな」とか「なるほど、確かにこうすると分かりやすい／分かりにくい」というのが分かった気になれる１冊です。（実践できるかはまた別問題）

## オブジェクト指向UIデザイン
https://www.amazon.co.jp/dp/4297113511

コト（タスク）ではなくモノ（操作対象）にフォーカスしてUIを設計しましょうという趣旨の書籍。
イラストソフトやスプレッドシートの例は非常に分かりやすかった。そしてオブジェクト指向の汎用性の高さに改めて関心しました。

# その他
## 私達はどう学んでいるのか
https://amzn.asia/d/2u8YzCi
「学習」についての書籍
知識、思考、練習と熟達など、人間がどうやって学習し、能力を得ていくのかということを扱っている
今までふわっとした理解だったり、普段意識しないようなところが言語化されており新たな気づきがあった

## 具体と抽象
https://amzn.asia/d/0B3Cp6u
プログラマと切っても切り離せない「抽象」の話
そもそも抽象化とは何か？を改めて考えるきっかけになった
定期的に読み返したい