オブジェクト指向プログラミングとドメイン駆動設計を学ぶのに適切な書籍とおすすめの読む順番

## オブジェクト指向プログラミングが学べる書籍たち
もし私が今から最初から学ぶならこの順番でこの本読むだろうという紹介です。

新人プログラマの方々は右も左も分からないというところからスタートとなるため、オブジェクト指向プログラミングを学ぶときに何から学べば良いか全くわからないという状況かと思います。
オブジェクト指向プログラミングを学んでいると自然と出会うドメイン駆動設計についても同様です。

そうした方々が書籍から学ぼうとした場合に、少しでも効率良く進められる順番を示してあげられれば良いなと思って紹介します。ただし、各書籍についての詳細な説明は書いていません（というか結構忘れててかけない）…。

なお、前提言語はJavaで言語構文にも十分詳しいことが大前提です。

以降、オブジェクト指向プログラミングはOOPと略します。

1.  [現場で役立つシステム設計の原則](https://www.amazon.co.jp/dp/477419087X)
    - OOPらしさの雰囲気がわかります
    - 入り口に最適です。OOPがどう良くて嬉しいのか、平易でわかりやすく書かれています。
2. [テスト駆動開発](https://www.amazon.co.jp/dp/4274217884)
    - OOPらしいコードにたどり着く道筋がなんとなく見えます
    - そういう用途にも使えるというだけで、主題はタイトルの通りテスト駆動開発です。また付録も秀逸なので、最後まで読むことをおすすめします。
        - 『TDDのテストとは、いわばプログラミングや設計の補助線、治具です』というのが私には響きました。
3. [リファクタリング](https://www.amazon.co.jp/dp/427405019X)
    - 手続き型からOOPらしいコードへ導く道筋のカタログです（リファクタリングが主題の本ですもんね）
    - 最新版の言語はJavaScriptです（残念ながら私はまだ読んでいません）。しかし、言語が変わったからと言って趣旨は一緒なので、読む価値はあると思います。
    - 目を通したあともリファレンスとして手元に残しておいておくとよいでしょう。
4. [パターン指向リファクタリング](https://www.amazon.co.jp/dp/4822282384)
    - すでに絶版ですが頑張ればまだ手に入りそうなので、紹介しています。
    - さらにもう一歩踏み込んで、落とし所となるデザインパターンへ導く手法を主題にしています。
    - (3)と同じくカタログ化されています。こちらもリファレンスとして手元に残しておいておくとよいでしょう。
5. [アジャイルソフトウェア開発の奥義](https://www.amazon.co.jp/dp/4797347783)
    - SOLID原則の説明が良かった記憶があります。その他にも示唆に富んでいたような記憶がありますが、読んだのがだいぶ前なのでどんな内容だったか忘れてしまいました（また読んでみます）
6. [レガシーコード改善ガイド](https://www.amazon.co.jp/dp/4798116831)
    - テストのためにどんなリファクタリングのためのアプローチがあるのかカタログ的に紹介されています。
    - レガシーに関わっていなくても、テストをしやすくするための考え方自体が大変勉強になるので読んでおいたほうが良いと思います。
7. [Java言語で学ぶデザインパターン入門](https://www.amazon.co.jp/dp/4797327030)
    - こちらはオプショナルです。
    - デザインパターンといえばGoFなので、私はこの本にも一応目を通しました。
    - WEBアプリケーションだと自分で実装する機会があまりないデザインパターンもありますが、一方でそういったパターンもフレームワーク内ではよく使われていたりするので、知っておくとフレームワークのコードを読み解くのが楽になります。
    - ただ、例がしっくりこなったりして少々とっつきにくいです。
    - ここまでの書籍である程度OOPとデザインパターンに対する理解が深まってれば、なんとか読み進められるのではないでしょうか。


ここまでの本を一通り読むだけではスキルとしては身につきません。
実践を通じて身につけていく必要があります。
目の前の課題を解決するのにどのデザインパターンが適切か、他の選択肢と比較して本当に妥当そうか、やってみたけどしっくりしなければその原因は何か、そういったことを繰り返し、習慣のレベルにまで昇華していきましょう。


## ドメイン駆動設計が学べる書籍たち

OOPを学んでいるとドメイン駆動設計にも出会うと思います。

これも様々な書籍を読んだので紹介してみます。

ドメイン駆動設計は素晴らしいコンセプトのソフトウェア開発手法なのですが、学ぶことや理解すべきことが多く、理解と実践が大変難しいです（少なくとも私にとっては今でもそうです）

理解が難しい原因の一つは抽象的すぎるためだと私は分析しています。

そのため、具体例から徐々に抽象的な内容になっていく書籍の順番になっています。

以下、ドメイン駆動設計をDDDと略します。

1.  [現場で役立つシステム設計の原則](https://www.amazon.co.jp/dp/477419087X)
    - 二度目の登場です。
    - この本の著者の増田さんは日本におけるDDDの第一人者ということもあり、DDDのことを念頭において書かれています。
    - そのため、DDDのコンセプトを多少なりとも知っていたり、これからDDDについて学ぶつもりでこの本を読むと、この書籍が伝えたいことの理解が更に深まります。
2. [ドメイン駆動設計入門 ボトムアップでわかる！ドメイン駆動設計の基本](https://www.amazon.co.jp/dp/B082WXZVPC)
    - ドメイン駆動設計でよく用いられる実装パターンに着目し、それぞれのパターンが解決しようとしていることをコードを交えて詳細に説明してくれています。
    - DDDの学び始めでも十分に理解可能です。
    - 具体的が故に賛否両論な例[^1]も中にはあったりしますが、それを差し引いても読む価値があると思います。
3. [ドメイン駆動設計 モデリング/実装ガイド](https://booth.pm/ja/items/1835632)
    - モデリングについて具体的な例が示されている点がとても良い本です。
    - Q&Aもとても参考になります。
    - この書籍もコード例とその説明が親切で、DDDの学び始めでも十分に理解可能です。
4. [ドメイン駆動設計](https://www.amazon.co.jp/dp/4798121967)
    - 最終的にこの本を理解できる様になることが目標です。
    - いわゆる鈍器です。そして高いです。しかも抽象的で難解です。覚悟をもって読んで下さい。
    - 抽象度を徐々にあげていくという順に従うのであれば実践ドメイン駆動設計のほうが先ですが、実践ドメイン駆動設計はこの本を読んだ前提になっているようなところがあるので、先に読みます。
5. [実践ドメイン駆動設計](https://www.amazon.co.jp/dp/479813161X)
    - (4)の10年後に出た書籍です。DDDを具体的にコードに落とし込むとどうなるかにフォーカスしています。
    - こちらも鈍器です。やっぱり高いです。
    - CQRSやイベントソーシングなど技術的な観点が強めに入ってきます。
    - 実装例が出てきますが唯一無二の正解例ではないです。それどころか私は結構違和感を覚えました。
    - 実装例として参考にするのはいいですが利用する場合は状況やプロジェクトに合わせてアレンジしましょう。
    - これ読んだらもう一度、(4)を読み直したほうが良いです。

この順番で読み進めたとしても一度読んだだけでは理解しきれないと思います。
特に[ドメイン駆動設計](https://www.amazon.co.jp/dp/4798121967)は実践をしながら繰り返し読み返すことになると思います。

読むたびに新しい発見や解釈の間違いに気づくことになるはずです。


## 最後に
この記事が、新人プログラマたちの輝かしい未来の一助になれば幸いです。


[^1]: ドメインサービスからリポジトリを触る例があるが、これはレビューアと著者の間でも意見が割れていた模様。