今年に読んだドメイン駆動設計に関わる書籍たちの感想


## システム設計に関する本を読むようになったきっかけ

2021年2月から、株式会社オープンロジとしてバックエンドエンジニアとして働いていますが、複雑で大規模なドメインを扱うサービスを運営していることや、指定日に荷物が届くことが当たり前となっている世の中でサービス品質を高める必要があり、より一層保守性の高いコードを書く必要性を感じたのだと思っています。
基本的には読んだ順番に書いていこうと思いますが、`「こんな順番で読めばよかったかも？」`的な観点も踏まえて、書籍で学んだことや読んだ感想などを記しておこうと思います。


## 現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378609/bc3fd5d4-29b0-efbf-7f61-72b3021880a3.png)


１冊目から。これは万人におすすめできる本。実は2020年に読んだことあるけれど、何度も読み直す機会があるので、購入した本である。
変更しやすくメンテナンスコストを下げるための技法を難しい言葉を極力使わず、わかりやすく書いているのがポイント。特にバリューオブジェクトにするメリットや、カプセル化することの恩恵が理解できた。
動くコードが書けるようになってきたぐらいの人によくおすすめしている。今後も何度も読み直すであろう本。
あまり専門的な用語は出てこないがドメイン駆動設計を学ぶ際の第一歩的な位置付けにもなると思う

## ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378609/e73c5e9f-4e50-6044-4622-374525483e94.png)

ボトムアップの名の通り、戦略と戦術に分けた場合の戦術(具体的な手法)の説明を終始している本。
サンプルコードが豊富で、迷った際に手を伸ばせる場所にあると結構読み直す機会が多い。
C#で書かれているけれどJVM言語やPHPのエンジニアでも読めると思う。
サンプルコードについて、読んだ人同士で色々話をしてみると面白い本。
エラーハンドリング・例外についても言及されていてその点も参考になった。
最後のチャプターで`「ドメイン駆動設計の扉を開こう」`とあるように手法の説明にほぼ全てを割いている。
そのため、モデリング・境界づけられたコンテキスト・集約の区切り型などはあまり説明されていないので、その点は他のもので補う必要はあると思う。

## ドメイン駆動設計 モデリング/実装ガイド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378609/082a51ae-afe5-48c2-d4e7-0e7a0814f843.png)



軽量DDDを脱却しようというコンセプトからもわかるように実際に設計する際に迷いがちな部分に痒いところに手が届く記述が多い本。
ためになる知識が盛り込まれているが語り口が平易なため内容が頭に入ってきやすい。
入門書として最適。
説明のしやすさや入門者をターゲットにしている感じで、迷いがちな部分を結構サクッと言い切ってくれる感じ。
一方学んでいく上で、この本に書かれているやり方だけがDDDの体現方法ではないことも分かってくる気はする。
チームの意識合わせとかに、ちょうどいい分量かもしれない。

## エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378609/29c0f84e-e836-024a-5364-5da6bd1a8f6d.png)

エヴァンス本。どのタイミングで読むかは迷いどころかもしれないがある程度理解が浅い段階で読んだ上で何度か読み直すのが良さそう。
翻訳にかなり時間が掛かったことで有名な本で、その要因としては題材にしている港湾荷役の話題がとっつきにくいことが挙げられる様子。
私は幸いその領域の業務知識があるので、技術的なレベル感の割には話が入ってきた。
誰かに説明しようと構成が練られた本というよりはエヴァンスが「`こんな考え方でやったら上手くいったよ！`」的な感じで語りかけてくる感じ。
抽象的な話と具体的な話を行き来したり、`「この説明は構成的にもっと後の章に書いたら良くない？」みたいなところは結構あるので、2回は読み直すことになる。書いてある内容自体は思慮深くてエンジニアとして考えさせられる内容が多いので、一回読んでみることをお勧めできる。


## わかる！ドメイン駆動設計 ～もちこちゃんの大冒険～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378609/10e35e57-9a27-7969-fdd6-df1e2ba3ede1.png)

ユビキタス言語やコンテキストの説明に大部分を割いている本。わかりやすく本質をついた説明をしようとしている感じ。
アーキテクチャ寄りの話は出てこないので、戦略的な話題を噛み砕いて説明してほしい人には最適の本かもしれない。

## Clean Architecture 達人に学ぶソフトウェアの構造と設計
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378609/c2aa1c1b-0f94-ab9a-2ea9-4f2603bc2521.png)

今回出てくる本の中で一番抽象度が高いかもしれない。
クリーンアーキテクチャといえば同心円の絵を想像するし実際に出てくるけれど、
あれを守れば万事OKみたいな本ではない。むしろ例の一つでもっと一般的な話をしているのだと思った。
難しかったので、今度読み直したい。

## ドメイン駆動設計 サンプルコード & FAQ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378609/db622c3b-a885-0960-63b7-56c31f5ae6ec.png)

ドメイン駆動設計 モデリング/実装ガイドの続編でサンプルコードが豊富。２冊でセットと考えて良い。
こちらの本も割り切りが良く、軽快に説明されるため迷いがない。
著者のYouTubeチャンネルがDDDに関する話題が多いので、一緒に見るとより理解が深まる。
(コメント欄が結構参考になったりもする)
テストコードの章でよりクラスの責務が明確に分かった気がした。
サンプルコードを参考にするとそれっぽい設計になるので、何か作ってみることをお勧めする。

## リファクタリング 既存のコードを安全に改善する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378609/2fff60cc-9cc7-8e87-3f8a-ad83d2c646d6.png)
Java版を読んだ。DDDと関係あるの？と思うかもしれないけれどカプセル化や絶えず変化に追従するためのテクニックをBadな例を改善する形で説明されるので非常に参考になる。著者のファウラーの伝えたいことが非常にわかりやすい。
出版は結構古いけれど、意識しないとやっちゃいがちなアンチパターンを知れたり現代のプログラマにとっても学びの多い本だと思う。
今回紹介する本の中で一番好きかも知れない。
`現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法`を読んだあとに読むと理解が深まると思う。

## レガシーコードからの脱却

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378609/e742b5f0-55b9-31f5-d725-6c915f9c7f7b.png)
ソフトウェアの価値を高めるための手法を記載している。
組織文化的なところにも触れていて参考になった。
もう一度読み直したい

## アジャイルサムライ　達人開発者への道
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378609/0d1c049e-44ee-1395-97b0-11e8b7ff2b00.png)

DDDに関する本ではないが、変更に強い組織づくりという観点で読んでおくといいと思った。
組織づくりもプロダクト作りも変化の多いユーザーの要求に絶えず答え続けるための手段という意味では
目指している世界観は近しいのかなとこの本を読んで思った。

## 最後に

書籍の感想を人と話すと自分が得た観点とは全然違うところに注目していたりしていて面白い。
実際に自分で実践してみた感想や業務上の開発にどう活かしているかはまた別の記事にしたいと思います。