【C#】ドメイン駆動設計を学習するロードマップ

いまエンジニアリング界隈で話題となっている「ドメイン駆動設計」に興味を持ったので、個人的に業務外の時間を使って色々と学んでみました。「エリック・エヴァンスのドメイン駆動設計」を発端とする設計技法ですが難しい。

ドメイン駆動設計をいきなり学ぶのはハードルが高いと感じたので、遠回りをしながら学ぶことにしました。この記事では筆者自身がドメイン駆動設計を学ぶためにした遠回りについて書いていきます。ドメイン駆動設計に興味を持っている人は、この手順で学ぶことをオススメします。

  • オブジェクト指向
  • テスト駆動開発
  • ドメイン駆動設計

ここから先は、よりテスト駆動設計を学ぶための手順について紹介していきたいと思います。エンジニアとしてステップアップするためにも、ドメイン駆動設計は学んでおいて損のないことだと感じました。ドメイン駆動設計を学ぶためのロードマップを公開します。

ドメイン駆動設計を学ぶには

基本的な作戦はUdemyと技術書を使用して学習するプランを立てました。Udemyは良質な講座が多く提供され、しかもピンポイントで知りたい部分の講座が展開されていたりするので、メイン学習教材としてよく利用しています。また、Udemyと併用して使っているのが技術書でした。学びたい部分を補完してくれるピンポイントな本が多いので、必要に応じて読んでいる感じですね。

Udemyで全体的なイメージを摑んでいき、その補完として技術書で学んでいくスタイルがいいかなと思っています。プログラミングは頭でわかっていても、手を動かさないと実感できないので、このスタイルは非常に有効なんじゃないかなと思っています。

オブジェクト指向を学ぶ方法

ドメイン駆動設計にたどり着くまでに、少なくともオブジェクト指向プログラミングの技術を学んでおく必要があるので、ここは必ず通っておいたほうがいいです。私は「【Udemy】「C#でオブジェクト指向をする方法」レビュー」でも紹介しているUdemyの講座を使ってオブジェクト指向を学びました。

私の場合はC#がメイン言語だったのでC#を選びましたが、あなたが普段から使用する言語で講座を選ぶのが良いですね。継いで手を付けたのが、より根本的にオブジェクト指向を学ぶということでした。講座で学んでいく中では手を動かしながら、クラス・インターフェース・カプセル化などのサンプルを作りながらでしたが、「より学問的な部分」からのアプローチを知る必要があると思ったからです。

  • オブジェクト指向という考え方が出てくるまでの過程
  • ポリモーフィズムの根本的な考え方
  • インターフェースの有用性

などなど。サンプルを作りながらだけではわからない部分を学ぶ必要があると感じたからです。そこで使用したのが「オブジェクト指向でなぜつくるのか」という本ですね。これはボリュームも内容も良かったので、オブジェクト指向の根っこの部分を知るのには最適だと思います。

定期的に読み返すことで、いろんな発見があると思う良質な技術書ですね。オブジェクト指向を学ぶ方法をまとめると、私は以下を実践してきたことになります。簡単にまとめました。

  1.  Udemyで実践的なアプローチから学ぶ
  2. 本を読んで学術的な側面から学ぶ

上記の2つができていれば、とりあえずは問題ないかなと思っています。あとは実践の中でオブジェクト指向を駆使して、コードが書けるようになればベストだと思いますが、知識的には上記で十分なのかもしれません。

テスト駆動開発を学ぶ方法

テスト駆動開発を学ぶこともドメイン駆動設計を学ぶ上で重要になる要素になります。以下の記事にもありましたが、ドメイン駆動設計とテスト駆動開発は一心一体といっても過言でもないほどです。

ログラスの松岡さんのブログでは「ドメイン駆動設計はモデリングをし、コードに落としながら新しい発見があれば随時モデルをアップデートし、コードにも反映していく開発手法で、小さく開発を回していくためにも小刻みにテストをする必要がある」と書いています(かなり意訳して記述してます)。

ということでドメイン駆動設計に行く前には、テストをしながら開発する方法論を学んでおくほうが有用です。これはドメイン駆動設計を学ぶ・学ばないにかかわらず有用な開発技法なので、エンジニアとしては知っておく方がよいですね。

私はオブジェクト指向開発を学んだ時と同様に「Udemy」を使ってテスト駆動開発を学びました。結局、映像を使った学習と実際にプログラムを書きながら覚えるのが効率がいいですし実践的かなと思います。

Udemyでは「C#でテスト駆動開発【TDD】をする方法」という講座で学びました。この講座もよかったですね。C#でテスト駆動設計を学ぶことができましたし、MoqやChainingAssertionといったツールを使った開発技法が学べたのが良かったですね。

ドメイン駆動設計を学ぶ方法

ドメイン駆動設計を学ぶ最後のフェーズとして、ようやくたどり着いたのが「ドメイン駆動設計」ですね。ドメイン駆動設計にたどり着くまでには、やはり多くの土台が必要だという意見は今でも変わりません。私がドメイン駆動設計を勉強した方法以下の通り。

  • 本を読む
  • Udemy

これはオブジェクト指向開発を学んだ時と同じような感じですが、実際そのとおりです。Udemyで使用した講座は「C#でドメイン駆動開発パート1【C#でドメイン駆動開発とテスト駆動開発を使って保守性の高いプログラミングをする方法】」という講座です。Part1とPart2がありますが、Part1でも十分なボリュームがあるのでオススメです。ValueObjectやRepositoryなど実践的なコードを書きながら学べるのがよかったですね。

このコースの受講と並行させたのが「ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本」と「現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法」の2冊です。「エリック・エヴァンスのドメイン駆動設計」を読むことも考えましたが、挫折しそうだったのでまだ読まないことにしています。

いろいろと学んできましたが、オススメな順番は「現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法」を読んでから、Udemyと「ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本」を並行して取り組むのがオススメです。

「現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法」はドメイン駆動設計が役立つ理由・基礎などが詳細に説明されているうえ、技術的な話に固執していないので、ドメイン駆動設計の土台を学ぶのに丁度よい内容です。そこから技術的な内容を学ぶほうが効率的ですね。

まとめ

ドメイン駆動設計を学ぶための順序を色々と書き連ねてきました。個人的に取り組んできた内容だったので、個人差はあると思いますが、それなりに参考になるのではないかと思います。「ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本」の「はじめに」に以下のようなことが書かれていました。

「開発者にとってドメイン駆動開発を学ぶことはその後のエンジニアリングに対するスタンスを変えうるほどの大きな学びです。」

確かにドメイン駆動設計を学ぶ過程で多くのことを学びます。オブジェクト指向・テスト駆動開発といった土台はエンジニアリングの手法に幅をもたらせてくれました。また、ドメイン駆動設計という技法自体もエンジニアとしての表現力を深めえくれる感じです。

ただし、ドメイン駆動設計の考え方はプログラム学習だけの過程だけで身につくものではないと思います。「ドメイン」は「業務ロジック」でもありますから、実際の案件における経験などを通して、より実践的に身についていくことだと思います。なので、本当に理解できる日は、もっともっと先になるのかもしれません。

とはいえ、それでも上記の手順で学んでいくことができれば、ドメイン駆動設計の入口・その基礎を学ぶことはできますので安心してください。私自身、ドメイン駆動設計を学ぶことができて、本当によかったと思っています。