ソフトウェア設計は、トップダウン、ボトムアップ、どちらのアプローチで進めるべきだろうか?MicroXchg Berlinで行ったプレゼンテーションの中で、Vaughn Vernon氏はこのような質問をして、ソフトウェア設計におけるさまざまなアプローチ、アクタモデル、リアクティブなドメイン駆動設計、創発的アーキテクチャ(emergent architecture)などの重要性を論じた。
vlingoの創設者で、"Implementing Domain-Driven Design"の著書を持つVernon氏が、ドメイン駆動設計(DDD)の中で最も重要なコンセプトであると考えるのは、コンテキスト境界とユビキタス言語の2つである。戦略的モデリングツールや戦術的モデリングツールなど、他にもツールはあるが、氏がDDDについて論じる場合、頭に描くのはこの2つのコンセプトなのだ。エンティティや値オブジェクト、集約といったものがDDDであると考えているのならば、それはDDDの本質を理解していないことになる、と氏は指摘する。
DDDは学びの方法でもある。もしも、学習を必要とするアプローチなしでソフトウェアプロジェクトを始めるならば、それは単にオブジェクトや関数を作る技術的アプローチのセットとしてDDDを使っているのであって、最終的には混乱に陥ることになるだろう。経験豊富なアーキテクトと開発者が、自らの熟知している観点から新たなプロジェクトを立ち上げて、すべての問題を自分たちで解決しようとしている状況を、Vernon氏はこれまでに何度も経験している。
学習は知識を生み出し、知識はすべてを変えるのです。
Vernon氏の経験から、システムをトップダウンあるいはボトムアップのどちらで設計するべきかという意見には、強行なものが多い。時にはそれが、間違った選択は危険だという主張にまで発展して、結果的にシステムを混乱させることになる。しかし氏は、リスクはすべてを事前に把握しようという試みにあるのであって、それはウォーターフォール的発想に関わりがある、と考えている。
Vernon氏の考えるトップダウンとボトムアップとは、学習と知識の順序付けに関する戦略なのだ。どちらも非常に有効であって、ただ考え方のスタイルが違っているに過ぎない。トップダウン思考は主として、既知の問題を扱うためのものだ。問題を段階的に、内容の分からない、ブラックボックスのように見える個々の問題へと分解する。しかし、あるレベルに達すると行き詰まるので、そこからはボトムアップの観点に切り替えて、自分の知らないことを見つけ出す努力が必要になる。このようにすることで、ソフトウェアの小さなピースが出来上がる。それぞれアクタとなることが可能で、最終的には大きなシステムのサブシステムになる。Vernon氏はこれを、緊急的なアプローチのひとつであると考えている。
次に氏は、トップレベルの観点と戦略的設計の使用を対比する。最初に行うのは、サブシステム間の情報交換の検討である。これによって得られたコンテキスト境界の公開言語が、コンテキスト境界で作業するチームの話すメンタルモデルへとつながる。このメンタルモデルは、コンテキスト内のユビキタス言語として表現される。作業順序としては、次のようなものだ。
- 情報交換
- 公開言語
- 会話のためのメンタルモデル
- ユビキタス言語
ボトムアップアプローチを採用する場合は、モデルから考える、すなわち戦術的アプローチを行うことになる。チームはまず、自分たちの知らないことについて議論し、メンタルモデルとユビキタス言語を作らなければならない。ここで得られたユビキタス言語は、公開言語に影響を与えることになる。最終的には、この公開言語を使うことで、サブシステム間の情報交換が可能になるのだ。この場合の作業順序は、先程とはほぼ逆のものになる。
- 会話のためのメンタルモデル
- ユビキタス言語
- 公開言語
- 情報交換
いずれの視点も重要だが、ユビキタス言語を用いてコンテキスト境界について考える場合には、ボトムアップアプローチを採用しているということになる、とVernon氏は強調する。その上で、ソリューション全体の中でコアドメインが何であるかを学ぶことが重要なのだ。さもなくば、誤った場所で努力を重ねることにもなりかねない。ある時点においてトップダウンの視点が必要になった場合は、対話方法の分かっていない部分のプレースホルダとして、インターフェースを定義するという方法がある。後でこのプレースホルダを、コンテキスト境界内の実装に置き換えればよい。その場合には、同時にボトムアップへの移行も行うことになる。そのコンテキスト内のドメインモデルについて、今度は深く理解する必要があるからだ。
Vernon氏はまた、ボトムアップ・アプローチは、創発的なアーキテクチャを生み出す創発的なアプローチであると考えている。リーンアーキテクチャや、アジャイルアーキテクチャおよび設計と同じである、という考えだ。アーキテクチャを固定化しようとする試みが実を結ぶことはない。アーキテクチャには調整が必要であり、さもなくば失敗する、と氏は考えている。自分が何をしているのか分かっていれば、アーキテクチャは自ずと明らかになる。成功するためのアーキテクチャスタイルやパターンはいくつもあるのだ。創発的アプローチに適したアーキテクチャスタイルのひとつが、Alistair Cockburn氏の考案したヘキサゴナルアーキテクチャ(ポート・アンド・アダプタあるいはクリーンアーキテクチャとも呼ばれる)である。このスタイルの中核となるのは、アプリケーション層に囲まれたドメインモデルであり、その最外周にあるのが、ポートとアダプタを介してインプットとアウトプットを提供するインフラストラクチャ層だ。このアーキテクチャのアドバンテージのひとつは、すべてのアダプタを個別に開発し、テストできることにある、と氏は記している。自分が本当に必要なアダプタのみを理解すればよく、極めてアジャイルで、創発的なアーキテクチャとなっている。使用するデータストレージのタイプの決定はその一例で、詳細が分かるまで遅延することが可能である。
最後に氏は、プレゼンテーションの中で説明したアイデアに適したものとして、自身が開発に関与した、アクタモデルに基づくDDDフレンドリなオープンソースのリアクティブプラットフォームであるvlingoを紹介した。
また、カンファレンスのプレゼンテーションの大部分は録画されており、今後数ヶ月中に公開される予定である。