ドメイン駆動設計からオブジェクト指向、そしてアジャイル開発まで。関連書籍練り歩きのススメ
本記事はドメイン駆動設計(DDD) Advent Calendar 2021 25日目の記事です。
「もっとビジネス変化に耐えられる設計を目指したい」「ただデータをやりとりするだけなのに複雑化してしまうのを防ぎたい」
様々な動機からドメイン駆動設計に入門しようとする方がいると思います。
自分もエンジニアとして働きはじめて、「どうしてすぐに変更しにくくなってしまうのか」「より柔軟な設計にするにはどうすればよいか」と悩むことが多くなり、良い設計手法を探って出会ったのがドメイン駆動設計でした。
最初はドメイン駆動設計関連の本ばかりを読んでいたのですが、途中から「これってドメイン駆動設計というよりはオブジェクト指向の話では?」とオブジェクト指向に興味を移し、さらに「より変化に強いプロダクト開発するにはチームから変化させないとまずいのでは?」とアジャイル開発に興味が移りました。
本記事では、ドメイン駆動設計、オブジェクト指向、アジャイルなどのテーマの本を練り歩いてみた振り返り、気づきをまとめたいと思います。
また、最初の一歩にオススメの本の紹介もしたいと思います。
よい設計を探るべく入門した「ドメイン駆動設計」「アーキテクチャ」
私が最初に読んだのは、「Evans本[1]より具体的でわかりやすい」と耳にして購入した『実践ドメイン駆動設計』でした。
冒頭にあった「新入り若手開発者」の悩みが当時の自分のと全く同じで、気になって無我夢中で読んだ記憶があります。
新入りの若手開発者「…ほとんど同じようなオブジェクトを大量に使って右から左へデータを渡すだけになるとは思わなかったよ。そんなことをするだけのコードなのに、なぜこんなに複雑なアーキテクチャになっているんだろう?あそこを書き換えたら、いったいどうなるんだろう。コードに手を加えようとするたびに、どこかがおかしくなってしまう。実際、このコードが何をしようとしているのかを正確に把握している人が一人でもいるのだろうか?…」
(『実践ドメイン駆動設計』pp.4)
正直、実践的とはいえ内容は中・上級者向きで、自分もあまり飲み込めてなかったと思います。(今では入門書としておすすめはしません…)
その後に『わかる!ドメイン駆動設計 ~もちこちゃんの大冒険~』『ドメイン駆動設計入門』『エリック・エヴァンスのドメイン駆動設計』と読み込んで、徐々に全体が見えてきた気がします。
最近だと松岡さんの『ドメイン駆動設計 モデリング/実装ガイド』『ドメイン駆動設計 サンプルコード&FAQ』が例が具体的で読みやすいと思います。
また、よく一緒に語られるアーキテクチャ本『Clean Architecture』を読み、成瀬さんのJavaでの例を読むなどしてアーキテクチャの戦略も掴むなどしました。ドメインとそれ以外を疎結合にすることによる旨味を徐々に理解してきました。
さらに設計を磨くために踏み入れた「オブジェクト指向」「デザインパターン」
自分は"ドメイン駆動設計"と書名にある本から入りましたが、『現場で役立つシステム設計の原則』を読んでからドメイン駆動設計に入るとよい、という話を後から聞いて読みました。
これを読んでみて、「ドメイン駆動設計のパターンと思っていたのは結局オブジェクト指向をうまく活用したものなんだ」 と理解しました。
当時Javaで業務コード書いてるにも関わらず、オブジェクト指向をあまり理解できていないことが勿体ないと感じ、もっと真面目にオブジェクト指向とそのパターンを学ぼうと意気込みました。
特に読んでよかったのは『オブジェクト指向でなぜつくるのか』『Software Design 2021年3月号』(オブジェクト指向特集号)です。2021年でも通じる実践的なオブジェクト指向の入門本と言えると思います。
「オブジェクト指向と現実世界は似て非なるもの」「getter/setterがカプセル化という訳ではない」「継承の使用には注意」など、誤解を招きやすいところの解説も必見です。
また、オブジェクト指向由来のデザインパターンの解説『Java言語で学ぶ デザインパターン入門』も、以前読んでいましたが改めて読み直しました。
この本で解説されているのは90年代に生まれた"GoFパターン"で、ドメイン駆動設計のパターンもこれを由来するものがあります。時代は変われど受け継がれるべき内容だと思います。
きれいな設計を実践するために有用な「テスト駆動開発」「リファクタリング」
オブジェクト指向関連の本を読んでいくと、その設計プラクティスとしてテスト駆動開発、リファクタリングがよく出てきます。
『リファクタリング』はコードの不吉な臭いを察知し、それを一歩一歩少しずつ改善していく手引きを解説されていて、複雑化したコードの改善に役立ちました。また、『レガシーコード改善ガイド』はテストのないコードをレガシーコードと定義づけて、それの退治方法について解説されています。
『テスト駆動開発』では、テストを設計のためのツールとして捉え、着実に動作するきれいなコードを書く手引きとなっています。これを知る前と知った後で、テスト駆動開発を実践する・しないに関わらずコードの書き方が全く変わったと実感しております。t-wadaさんによるライブコーディング(TDD Boot Camp 2020 Online #1 基調講演/ライブコーディング)を見て書籍を読み始めるのがスムーズでした。
また『実践テスト駆動開発』では、モックを積極的に活用していく手法など、異なる視点の考え方を知ることができました。
これらのプラクティスから、設計の考え方だけでなく、その設計を実現に近づけるためのスキルの重要だと考え始めるようになりました。
そしてチーム開発のための「アジャイル開発」へ
設計のためのプラクティスについて他にはないか?と探し、そこで出会って俯瞰して見ることができたのが『レガシーコードからの脱却』でした。
この本では最初にレガシーコードがビジネス及ぼす影響の大きさについて述べられ、レガシーコードを防ぐための多くのプラクティスの「なぜ必要なのか?」を解説しつつ幅広く紹介した内容となっています。
デザインパターン、テスト駆動開発、リファクタリングといったコーディングのパターンの紹介に加えて、チームで実践すべきアジャイル開発に関することにも多く触れられていました。
そこから、個人ではなくチームでやるべきプラクティスに興味を持つようになりました。
『エクストリーム・プログラミング』ではXPのシンプルな価値・プラクティスの解説、『カイゼン・ジャーニー』は物語ベースで様々な問題と解決の例示、『アジャイルサムライ』ではよりフランクにアジャイルの価値・プラクティスについて解説されています。
『エンジニアリング組織論への招待』では、問題解決にはコードだけではなく、人々の思考・組織・ビジネスの構造をリファクタリングしなければということが理論的に述べられていて大変おもしろかったです。
それまでなんとなく見積もり立ててカンバンで進捗管理して、という感覚でしたが、より価値ある成果を短いサイクルで出す考え方・プラクティスを学びはじめるようになりました。
練り歩いてみて
これらの本を練り歩き読んでみた感想は、
- 書名の通りテーマが決まっているとはいえ、明確な分類があるわけでなくどこかで繋がったものがある
- 同じようなことをどの本でも言っているが、「この本のこの表現すごくいい」ってのが見つかるのが楽しいし、しつこく聞いたことは忘れずにいれる
- ある本で読んでわからなかったプラクティスが、別の本の例で理解できるようになる
- 複数の本で引用された本は名著のはず、読んでみよう!という気になる
など、思いもしなかった発見があり、かつ技術書を読むモチベーションも以前より上がったように感じます。
もちろん同様のテーマには他にもたくさんの名著があり、そこから派生したテーマもあるでしょう。この流れでさらに練り歩いていけば、より広い知識を身に着けられると思います。
どの本から読むのがよいか?
では、「最初に読むならどの本がよいか?」自分なりのおすすめを紹介したいとおもいます。
各テーマ「まずはこれ!」みたいなのもありますが、敢えていろんなテーマのハブになる本を推しておこうと思います。
ハブになる本を読んでみる→気になるテーマを見つける→そのテーマの本を読んで深堀る、という読み方ができるんじゃないかな~という観点での選書です。
現場で役立つシステム設計の原則
サブタイトルにあるようにオブジェクト指向のパターンから得られる設計の本ですが、ドメイン駆動設計の入門書としても名高い本です。
ドメイン駆動設計の用語こそ出てこないのですが、それが故に初心者には理解しやすく、かつ多く通じるようなプラクティスを学べて参考になります。
また、リファクタリングも本文中や参考文献にも出てきており、そこへのリンクにもなると思います。
レガシーコードからの脱却
前半では「なぜレガシーコードが生まれるのか」「技術的負債によりどれだけ多くの経済的損失が出ているか」「アジャイル的な開発には技術プラクティスも必要不可欠」についてなど、後半では具体的な9つのプラクティスが語られています。
プラクティスについては「なぜ必要なのか?」に重きを置いて書かれており、しっかり刺さるものがあります。
オブジェクト指向、テスト駆動開発、リファクタリング、デザインパターン、そしてアジャイル開発と、多くのテーマに触れるきっかけになる内容になっていると思います。
カイゼン・ジャーニー
アジャイルをチームに浸透させていく物語ベースで、途中様々なプラクティスが紹介されます。主にアジャイル開発関連のチームでやるためのプラクティスで、他の本から引用されたものが多いです。
ケーススタディで雰囲気を味わって、刺さったところを深掘って調べてみる、という動きができるのではないかと思います。
おわりに
自分の体験をもとに、設計・開発手法関連の本の読み方、内容の紹介をしてみました。どうテーマに繋がりがあるのか、どう本を選べばよいか、迷ってる人の助けになれば幸いです。
最後に伝えておきたいのは、「一度読んでみてよくわからないってなっても落ち込まない、またきっと戻ってくるときがあるはず」 ということです。
私も入社前に設計に関する本に手を出したこともありますが、当時は業務経験がなくよく理解できずに終わりました。同じ本でも、経験を重ねて読んでみると印象が全然違うってことも多いので、気を落とさずいつの日か再チャレンジするといいと思っています。
ここまで読んでいただきありがとうございました。いい技術書ライフを!
-
エリック・エヴァンスのドメイン駆動設計のこと。原点であるが、抽象的で読みにくいとの声が多い。 ↩︎
Discussion
デザインパターンの本なのですが、以下の本も実践的でおすすめです。
ありがとうございます!チェックしてみます👀