読書マップとDDD 〜DDDは3冊目の本?〜

技術書の読み方を考えつつ、『ドメイン駆動設計』を位置づける。

はじめに 〜1冊目の本〜

あなたは技術書をどのくらい読んでいるでしょうか?多い人は月何冊も読んでいるでしょうし、もう何年も読んでいないという人もいるでしょう*1。あるいは、「買っているけど読んでいない」ということもあるかもしれませんね。私にも積んでしまっている本があります。


技術書はすでにかなりの数が出版されており、その数は増え続けています。経験を積んだ方であれば、「自分にとって必要な本を見抜く眼」を持っているものですが、これから学ぼうとする方にとっては、読んだ方がよさそうな本の数も値段も絶望的かもしれません。このエントリの目的の1つに、『ドメイン駆動設計』の紹介があることは否定しませんが、それ以上に、「技術書の読み方」について考えてみたいと思います。


仕事としてプログラミングに携わる人であれば、「退職するまでに1冊も読まない人」はおそらくいないでしょう。手がけることになるプログラミング言語について、少なくとも1冊はその言語の入門書を読むことになるからです。あなたがまだ新人のJavaプログラマで、最初に読むべき1冊を探しているのであれば、結城さんの次の本がオススメです。

改訂第2版 Java言語プログラミングレッスン (上)

改訂第2版 Java言語プログラミングレッスン (上)

改訂第2版 Java言語プログラミングレッスン (下)

改訂第2版 Java言語プログラミングレッスン (下)

この類の本は「読む」だけではなく、絶対にサンプルコードを自分で打って、動かしながら読み進めるべきです。あとは、JavaScriptSQL、さらにはXMLなど、特定の要素技術についてのもう少し詳しい本が読みたくなることもあるでしょう。書店でパラパラとめくって、自分に合いそうなものを選ぶのがよいと思います。こうした必要に応じて買っていく本を、ここでは1冊目の本と呼びます。

2冊目の本 〜より美しく〜

自分のやりたい処理がとりあえず実装できるようになっても、プログラマとしてはまだ足りません。コードは書くものであると同時に、読まれるものでもあるからです。美しいコード、あるいは読みやすいコードを書く、という観点から考えると、やはり古典はこの1冊でしょう。

リファクタリング―プログラムの体質改善テクニック (Object Technology Series)

リファクタリング―プログラムの体質改善テクニック (Object Technology Series)

  • 作者: マーチンファウラー,Martin Fowler,児玉公信,平澤章,友野晶夫,梅沢真史
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/05
  • メディア: 単行本
  • 購入: 94人 クリック: 3,091回
  • この商品を含むブログ (312件) を見る
リファクタリング」とは、ご存知の通り、「ソフトウェアの外部のふるまいを保ったまま、内部の構造を改善していく」というもので、プログラミングにおいてはもはや必須のプラクティスです。その具体的なやり方をまとめたこの本は、あらゆるプログラマにとっての必読書であり、コードレビューに無駄な時間を費やすくらいなら、1日かけてチームメンバで『リファクタリング』の読書会でもやった方がよっぽど生産的ではないかと思わせる1冊です。「とりあえず業務ができればいい、それほどたくさん技術書を買うつもりはない」と思っている方も、入門書の後でもう1冊、どうかこれだけは読んで下さい。


このくらいの本になると、入門書と違って、「ちょっとよくわからない」場所が出て来るかもしれません。そういう場所を適度に飛ばしつつ、全体をとらえる読み方が求められるようになってきます。「難しい」という感想は思考の停止です。何が理解を妨げているのかを正しく分析することが大切ですね。入門から中級への橋渡しをしてくれる本も何冊も出ていますので、そういう本を読んで補うという戦略もあると思います。

3冊目の本 〜ユーザのために〜

「必要な処理がきれいに書けるようになりました」という状態になったところで、ぜひ読んでいただきたいのが、『ドメイン駆動設計』、通称DDD(Domain-Driven Design)です*2

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

プログラムコードが、実はユーザの業務のとらえ方を反映したものでなければならないこと、そのためにはどうすればよいのか、ということにはじまり、プロジェクトの中でソフトウェアが成長していく過程や、企業内の業務全体を統合するようなソフトウェアの設計手法など、ユーザの役に立つソフトウェアを作るとはどういうことなのかが、丁寧に語られています*3


扱っている内容に抽象的なものが多く、英語として見ると比較的難しめで、かつ500ページ超の防弾仕様であることから、原書を読むにはなかなか敷居が高い本でした。それにもかかわらず、長いこと翻訳が出版されずにいたためか、位置づけについて変にこじらせてしまったところがあるように思います。現実には、実に真っ当なことが体系立てて書かれている良書です。オブジェクト指向とかを好きな人が読む本」と敬遠しないで下さい。本当に大切なのは、例えば「リポジトリクラスを作るかどうか」ではなく、ユーザの業務のとらえ方にどこまで添うことができるか、どこまで言葉を丁寧に扱うかといった、もっと抽象的で普遍的な部分です。


読書、という観点で考えると、「ドメインモデルを反映したソフトウェアを作る」という観点から、いくつかのエントリポイントが提供されます。

その先に

この辺りから、読みたい本、読むべき本は少しずつ拡散していきます。いくつか例を挙げましょう。


読むべき本の量に圧倒されないように、最初は「まず5冊だけ読む」あるいは「まず10冊だけ読む」と決めて、各カテゴリから1冊ずつ選んで読んでみるというのがいいと思います。その時に大切なのは、入門書を何冊も買ってしまわないこと。本屋に行けば、同一ジャンルの入門書が何冊も並んでいますが、全てを読む必要はありません。同系の入門書を3冊買うなら、後の2冊のお金は、もう一歩上の本に振り分けた方が有益でしょう。


何かについてある程度深く知りたいと思うと、1冊読めば十分ということはなく、関係する本を何冊か読まなければいけなくなっていくと思います。良書と呼ばれる本には1冊1冊に価値がありますが、特定分野の本を何冊か読むことで見えて来るものもあります。重要なのは目的意識を持って本に取り組むこと、読んだ本を自分の中に位置づけていくことですね。さらに、巻末に必ず付いている参考文献一覧も、著者がどういう本の中にその本を位置づけているかを理解する上での参考になります。流行を追いかけることもある程度は必要ですが、自分なりの読書マップを作りながら、「自分が興味を持っている分野」を組み立てていくような読み方が大切なのだと思います。中級以上の本を5冊〜10冊読み終わる頃には、少し世界の見え方が変わってくるはずです。

*1:私自身が買っているのは、平均すれば月2冊程度だと思います。パラパラと見てはいますが、完読しているものはほとんどないですね。

*2:この辺りに位置づけたい、という訳者の欲目もあるかもしれませんが、Kent Beckも言っている通り、必読書と考えて間違いないと思います。

*3:DDDの内容については、別エントリの「ドメイン駆動設計入門 - Digital Romanticism」を参照してください。

*4:第2版では、サンプルコードが Java になっているようです。私は時期的に初版の方(C#)を読みました。