猫野詩梨帳

かわいいはかしこい

プログラムの設計がうまくいかんときに読む本

ここ2年くらいでプログラムの設計がちょっとうまくなったのでどういう本を読んだとかを書いておきます。

とはいえまだまだだとは思うので、後で見返してなんかおかしなこと言ってるな~となるかもしれませんが。

読んだ順ではないですがこの順で読むといいだろうという順になっています。

オブジェクト指向のこころ

以前からオブジェクト指向プログラミング言語はそれなりに扱えたのでオブジェクト指向わかった気になっていました。クラスとか使っていい感じにまとめられるのがええんやろみたいな。

この本は、抽象(インターフェース)を用いたプログラミングの強力さを教えてくれます。これが変更に強くテストしやすい設計に於ける基礎となります。

オブジェクト指向デザインパターンの入門書としても、これ1冊読んでおけば問題ないと思います。高凝集・低結合、実装のカプセル化、継承よりコンポジション(委譲)、などがわかるようになります。

物足りない人はバートランド・メイヤーとか読めばいいと思います。

ドメイン駆動設計入門

ドメイン駆動設計 (DDD) は複雑化していくソフトウェアをなんとかするために有効な設計手法として近年注目されています(たぶん)。

DDD はこの後に紹介するエリック・エヴァンスなどが詳しいのですが、如何せん分厚いのと難しいのでとっつきにくさがかなりあります。

最近出たこの本はそんな DDD に入門するための入門書というような感じで、ドメイン駆動設計においてよく使われるリポジトリや集約といったデザインパターンをメインに解説しています。

この1冊だけで DDD 完全に理解したというのは難しいかもしれませんが、次に進むための足がかりにはなるでしょう。

ドメイン駆動設計 モデリング/実装ガイド

little-hands.booth.pm

こちらもドメイン駆動設計 (DDD) への入門として読みやすい本です。DDD とは何なのかという概要から、アーキテクチャや実装までカバーしています。

こちらの本は次に挙げるエリック・エヴァンスや IDDD を読むための準備として読むのもいいですが、100 ページ程でコンパクトに纏まっているのである程度 DDD を学んだ後に再読してみると知識が整理されてよいかもしれません。

エリック・エヴァンスのドメイン駆動設計

ドメイン駆動設計 (DDD) の提唱者、エリック・エヴァンスによる本です。

ドメイン(ソフトウェアが扱う領域)から概念を抽出し、それを抽象化した「ドメインモデル」を中心としてソフトウェアを設計していく手法について語られています。

何言ってんだって感じかもしれません。実際私もいまだに何言ってんだという感じなのですが、今のところは次のような理解をしています。

例えばシンプルな CRUD(作成、読み取り、更新、削除)を行うようなシステムでは、データベースを中心にして設計し、それに対する CRUD 機能を実装していくことが多いとおもいます。

しかし、DDD では、(一旦データベースのことを考えるのをやめて、)いまシステム化したい業務について詳しい人(ドメインエキスパート)と話すときに出てくる概念(「アカウント」とか、「注文」とか、「経路」とか……)やそれに対するロジック(操作、制約、仕様など)をコードで(例えばオブジェクト指向ならクラスなどを用いて)表現することを試みます。

これにより、システムが複雑になっても、コードが明快で読みやすくなります。コード自体がロジックなどの仕様(ドメイン知識)を反映しているため、仕様書とコードの乖離を防ぎやすくなり(場合によってはドキュメントが不要になるかもしれません)、修正や変更が行いやすくなります。

また、システム化したい業務について詳しい人(ドメインエキスパート)とコミュニケーションをとりながらモデリングしていくことは、「顧客が本当に必要なもの」を探しながら設計していくことにつながります。つまり、ソフトウェアの価値の向上が期待できます。

なかなか分厚く、抽象的でわかりにくい話も多いのですが、必ず何か得られるものがある本だと思います。あきらめずに繰り返し挑戦していきましょう。

余談ですが、帯に書かれていた「徹頭徹尾有用な」という推薦文句が好きです。

実践ドメイン駆動設計

実践ドメイン駆動設計

実践ドメイン駆動設計

通称 IDDD。具体的なコード例などが多く実践的な本です。またドメインイベントなどの新しい概念も紹介されています。とはいえめちゃ分厚い上にやっぱりわかりにくいところも多々あります。カウボーイのジョークもわからんし。

エリック・エヴァンスではあまり直接的には触れられていないのですが、この本では依存性逆転の原則 (DIP) やそれを利用したヘキサゴナルアーキテクチャなどの話が登場します。これはまさに抽象(インターフェース)を用いたプログラミングです。これにより、ドメインモデルが特定のデータベースなどに依存することを避けることができます。ドメインモデルが特定のインフラに依存していると、例えばデータベースを先に設計する必要が出てきて、ドメイン駆動ではなくデータ駆動っぽくなってしまったりします。

この本を全て理解できなくても、ここまでくれば DDD を実践するための基礎はできているはずです。あとは実践して、試行錯誤して、また読み直してみたり……といった感じでしょうか。頑張りましょう。

ちなみにエリック・エヴァンスより先にこちらを読む人もいるらしいですが、個人的にはエリック・エヴァンスを先に読んだ方がわかりやすいかなと思います。途中で挫折したら変えてみてもいいかも。

まとめ

ぜったい美しいソフトウェアを書いて美少女ハッカーになろうな。

あとほかにもこんな本があるよ! とかこういう設計手法があるよ! とかあったらおしえてね。

追記 2020/10/26

最近みたスライドなのですが、ドメイン駆動設計の目的の一つとして「コアドメインに集中することでビジネス価値を最大化する」ということが挙げられていてなるほどなあと思ったので紹介します。Rails の知識がなくても読めます。

speakerdeck.com