こんにちは、やまだたいし(@OrotiYamatano)です。
今回は「設計に使える本」というテーマで、設計を考えるにあたり参考になる本を紹介します。
目次
はじめに
前回の記事では、なぜ設計が必要なのかについて説明しました。
今回は、その設計の基本となる考え方ではなく設計に使える本というテーマの記事になります。
というのも私は業務傍らで執筆しており不定期に記事を更新しているため手っ取り早く学びたいという方には
直接本を読んでいただいたほうが早いからです。
今後更新する内容もこれらの本に準拠した形の執筆になります。
前回の記事↓
おすすめの本
私が業務で触れるにあたって、後輩にどのような本を読めばいいですかと聞かれることもあるため、
学習パスとして理解しやすく、その中でも体系的で読みやすいと思う順番に並べて紹介しようと思います。
言語については特に定めてませんが、C++やJava、C#あたりになっています。
基本的にはオブジェクト指向のパラダイム前提です。
1. Tidy First? ―個人で実践する経験主義的ソフトウェア設計

Tidy First? ―個人で実践する経験主義的ソフトウェア設計 | Kent Beck, 吉羽 龍太郎, 永瀬 美穂, 細澤 あゆみ |本 | 通販 | Amazon
Kent Beck著の「Tidy First?」は、個人開発者向けの実践的な設計手法を解説した本です。
この本は初心者でも読みやすく三部は上級者にもおすすめできる内容になっています。
何を捨てて何を取り入れるかその考え方を取り入れるには一番の本だと思います。
2. リーダブルコード

Dustin Boswell、Trevor Foucher著の「リーダブルコード」は、コードの可読性を高めるための実践的なガイドブックです。
この本は初心者向けでどのようなコードが読みやすいかということに重点においた本です。
基本的にこの考えを主軸に様々なコーディングをしていけばハズレはないでしょう。
少し古い本ではあるのですがまだまだ使える教本です。
GOTOは使うな
3. 現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法

増田亨著の「現場で役立つシステム設計の原則」は、実践的なオブジェクト指向設計を解説した本です。
この本は読みやすさを主軸に設計の基礎を教えてくれます。
ゲームの話ではないですが実務に近い話を例により実践的な内容を解説しているので、
現場や今まさにコーディングをしている人には優しい本だと思います。
また設計の基礎であるSOLID原則を教えてくれます。
4. Clean Architecture 達人に学ぶソフトウェアの構造と設計 (アスキードワンゴ)

Robert C. Martin著の「クリーンアーキテクチャ」は、ソフトウェアアーキテクチャの設計原則を解説した本です。
この本は上の本でも解説されているSOLID原則から始まり、なぜ設計をこうするのかという根本的な考え方を学べる本です。
クリーンシリーズはボブおじさんが書いている本ですが、その中でも一番人気がある本だと思います。
とはいえ、この本の後半部分に関しては賛否両論あり、後半部分に関してはそういう考え方もあるのかぐらいにとどめて置くと良いでしょう。
5. オブジェクト指向における再利用のためのデザインパターン

エリック・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディース著の「オブジェクト指向における再利用のためのデザインパターン」は、
デザインパターンの原典とも言える本です。
この本はGoF(Gang of Four)の本として知られており、23のデザインパターンを解説しています。
設計といえばこの本と言われるぐらい原典です。
かなり古い本ではありますが、デザインパターンという設計の議論の中心となる部分を作り出した本なので学ぶべきところが多いです。
実際に実装すると同じクラス構造になるパターンもあったりします。
ここで生きてくるのが先程のクリーンアーキテクチャの知識で、なぜこのような構造にするのかというのを念頭に読んでみると良いかもしれません。
また現代においては設計として、ふさわしくないとされている部分もあり、どこがふさわしくないと言われているのか考えながら読んで
Webで他の人の意見を読んでみるとより考えが習熟されると思います。
現代ではそもそも言語の仕組み自体に取り込まれている部分もあり、意識する必要がない箇所もあったりします。
勉強するにはちょうどいい本です。
ただし、この本は実装例がC++で書かれているため、C++を理解していないと読みにくいかもしれません。
その場合は、「増補改訂版 Java言語で学ぶデザインパターン入門」を読んでから、
この本に挑戦することをお勧めします。
6. テスト駆動開発
ここまでくれば後の読む順番は自由な気がします。

Kent Beck著の「テスト駆動開発」は、TDDの実践方法を解説した本です。
Kent BeckさんはTidy First?でもあげられましたが、Tidy First?より古い本です。
これは設計に関する本ではありませんが、テストという概念を学ぶことで、
疎結合なコードとはなにかをより具体的に学ぶことが出来ます。
AIの時代が来ましたがテストの概念はより一層重要視されるようになってきているのを感じるのでぜひご一読を。
また翻訳者である和田さんことt_wadaさんは有名でテストについて登壇されていたりするので、
ネットで探して読んでみるとより理解が深まると思います。
テスト書いてないとかお前それ @t_wada の前でも同じ事言えんの?
7. レガシーコード改善ガイド

Michael Feathers著の「レガシーコード改善ガイド」は、既存コードの改善手法を解説した本です。
この本は実践的に古臭くなったコードを治すための技術書です。
内容は快活などではなく、血みどろにまみれた泥臭い内容ではあります。
でも、どんなひどい現場でも参考になるようなノウハウや妥協点が詰め込まれています。
レガシーコードと戦う貴方のお供にどうぞ。
8. エリック・エヴァンスのドメイン駆動設計

Eric Evans著の「エリック・エヴァンスのドメイン駆動設計」はエリック・エヴァンスのドメイン駆動設計を解説した本です。
正直この本は翻訳も微妙で非常に読みづらいので、次で紹介するドメイン駆動設計入門を読んでからでもいいかもしれません。
しかしながらこの本を先に上げる理由はあり、小手先の技術ではなく考え方や筆者があまり自信がない様子も含めて
この本の内容を本当の意味で理解してほしいからです。
これに続くドメインアーキテクチャの本では実践的に取り組む内容を解説された本が多いのですが、
どうしても小手先だけの内容になってしまっていたり、そもそもやりきってしまう必要のない箇所まで実践内容に含めてしまっているように感じます。
そのためあえてこの本をバイアスが掛かる前に読んでほしいのです。
9. ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本

成瀬允著の「ドメイン駆動設計入門 ボトムアップでわかる!」は、実践的なドメイン駆動設計を解説した本です。
ドメイン駆動開発をより実践的に学べる本でエリック・エヴァンスのドメイン駆動設計に挫折した人がよく読みます。
冗談です。ドメイン駆動設計のわかりにくい箇所をより分かりやすく学べるのでオススメです。
10. ゲームエンジン・アーキテクチャ 第2版

Jason Gregory著の「ゲームエンジン・アーキテクチャ 第2版」は、ゲームエンジンの設計を解説した本です。
これはどちらかというとゲームの実装なのですが、ゲームでは実際にこのような構造で実装されることが多く設計としても十分に参考になると思ったので紹介。
本の選び方
さまざまな本を紹介してきましたが、いい本の探し方はいくつかあります。
・ロングセラーかどうか
10 年生き残っている技術書は “現場でリピート買い” される価値がある証拠です。
買っていて損はないでしょう。
また、出版社がそういった技術系に強い良書を刊行しているか知っておくのも良いかもしれません。
オライリーはハズレが少ない。
・コミュニティの温度感を確認
尊敬するプログラマーやエンジニアをツイッターやQiita,Zennさまざまなところで探し、コミュニティの温度感を知っておくといい本を逃さずにすみます。
・著者の実績をチェック
無名のエンジニアや名ばかりの人が本を書かれることも少なくないです。
変にあおりが入っていたりするなら注意しましょう。
まとめ
とりあえず、いくつかの本をあげてみましたが、他にも良書はたくさんあります。
例えば、.NETのクラスライブラリ設計やそもそもの言語の基礎を知るEffective C# 6.0/7.0、なぜ依存を注入するのか DIの原理・原則とパターン、
などなど上げ始めるとキリがありません。
とはいえレベルに合わせた本というのは難しいと思います。
私の思う良い学習パスは上記になるのでぜひ参考にしてみてください。
以上、やまだたいしでした。