PHP Mentors (Posts tagged event)

1.5M ratings
277k ratings

See, that’s what the app is perfect for.

Sounds perfect Wahhhh, I don’t wanna

PHPカンファレス2015 PHPメンターズセミナー「モデルを設計せよ!―ドメイン駆動設計を超えて」参加レポート

2015年10月03日にPHPカンファレンス2015内で、ミニカンファレンスとして開催されたPHPメンターズセミナー「モデルを設計せよ!―ドメイン駆動設計を超えて」に参加してきました。

モデルを設計せよ!―ドメイン駆動設計を超えて

視点

PHPメンターズ 後藤秀宣 @hidenorigoto

セッションのテーマは「視点」。いくつかの実例から、参加者が視点そのものについて実際に考えることができる体験的な講演でした。後藤さんのスライドに関しては公開は無しとのことです。このセミナーでは、この「視点」という言葉が全体を通じてのテーマになっていると思います。

特に印象深いのが「コップを空にする」話です。既にたくさんの知識を身につけた修行僧が、高名な僧侶のもとに学びに行きます。修行僧がひとしきり知識を披露した後、高名な僧侶は空の茶碗にお茶をそそぎ、そそぎ続けて、茶碗からお茶が溢れてしまってもそれをとめません。

高名な僧侶は修行僧に、身につけたあふれんばかりの知識を脇において、頭のなかをいったん空にして、新しい知識を吸収する大切さを教えたかったのです。後藤さんは、いったんこれまで積み上げた知識は飲み干して、そこにこのセミナーで得られる知識をたくさん注いで帰ってもらいたいと話されていました。

フォーム検討に対する概念フォーム理論からのアプローチ

名古屋経済大学 経営学部教授 中西昌武

フォームというのは帳票(Webシステム等では画面)のことです。リレーショナルデータベースモデルにはコッド博士による理論化・体系化がなされているのに、フォームの構造に関してはそれに相当する数学的基礎がない。ならばその理論を作ってしまおうということでフォーム構造の数学的な基礎を構築されています。

帳票の裏にある論理テーブルの構造をノードとパスとみなして、その繋がり方とアクセスするための経路(これがフォームの構造として表現される)を行列として定式化できます。これにより、グラフ理論を用いて生成可能なフォームパターンを網羅的に示すことができるというような理論でした。

確かにフォームをどのように構成するかなどは、実業務の中でも経験によって作っている部分もかなりあると思うのですが、それがちゃんと数学的に定式化できて、パターンを数え上げることもできるとしたら、例えばユーザはフォームの選択肢の中から特定のフォームパターンを選んで、あとは自動的に画面が生成されるということも可能になってきます。

また、フォームを選びとるということは、背後にある論理データモデルに対するどういう見方を選びとるかということであって、その選択したものが、ちゃんと論理的に妥当なことが数学的に保証されている、ということは非常に重要なことだと感じました。

中西先生は、以前にIT勉強宴会で講演されていて、その時のレポート記事の方も参考にして下さい。

興味を持たれた方は中西先生のこれまでの論文・論考も是非ご覧ください。現在、中西先生は情報システム学会で「超上流工程における要求分析への科学的アプローチ」研究会を開催されています。研究会への参加をご希望の方は第3回勉強会のご案内をご覧ください。

ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~

株式会社フュージョンズ 杉本啓 @sugimoto_kei

ドメイン駆動設計に対する見方をいくつかの視点の切り替えで明快に整理した名演だったと思います。

エリック・エヴァンスのDDD本は示唆深く、ドメインモデルの設計に関して深い洞察を得られる本だと思うのですが、読み解くのがとても難しい本だとも思っています。杉本さんの講演(資料)を横においてエバンスのDDDを読みなおしてみるとまた新たな発見があるかもしれません。

一つ目の視点の切り替えは、ドメインモデル自体が存在する領域をどこに置くかということです。ドメインのモデルですから、字義通りに捉えるとドメイン領域に関するモデルと考えてしまいそうです。

しかし杉本さんは、ソースコード管理システム(GitとSubversion)の例を用いて、例えばコミットという概念はドメインの領域にではなくむしろ具体的なツールの側のソリューションから現れてくる概念だと説明します。そこから、ドメインモデルはドメイン(問題領域)の側から自然に立ち現われてくる(見つけだすとでも言ったらいいのでしょうか)ものではなく、むしろソリューションの中から我々が意図的に設計しようとするところから現れる解決領域のためのモデルとして捉えます。

DDD本の中で船舶/コンテナが出てくる海運事業モデルの中で、船荷証券(B/L)というモデルを見出す場面がありますが、これはモデルの問題領域を深く考察することで得られるものではなく、貿易実務の中で伝統的に開発されて普及してきた情報処理に関する事務処理パターン(船荷証券は法制度化もされています)、つまり管理過程に着目することで当然のように出てくるモデルということになります。

似たような問題領域と情報処理モデルの関係には、会計分野における複式簿記、鉄道業務におけるダイヤグラムなどがあります。

ドメインモデルは、解決領域のモデルであるというのが杉本さんの指摘だと思います。

(船荷証券に関する議論は本ブログの記事PHPメンターズ -> Practical DDD #3: モデルの深さで詳しく議論されています。)

二つ目の視点の切り替えは、このようにドメインモデルを眺める視点を移すことが、分析と設計の線引きを変えることにつながるという点です。これにより ドメイン駆動設計を、1.エンジニアリング の対象を広げながら、2.その広がったエンジニアリング活動内部での分裂を防ぐ、つまりソリューションのために作り出されたモデルと実装モデルの乖離を防ぐものだと捉えることができるようになります。

このように整理すると、各種の分析手法―分析モデルから設計モデルに落としこむ一般的なオブジェクト指向分析や、管理過程に着目して情報の流れや帳簿組織を表すデータモデルを構築する現代的なデータ指向分析と構造を比較できて面白かったです。

image

そして三つ目の視点の切り替えは、エバンスのDDD本の構成に関するものです。確かにエバンスのDDD本を頭から読んでいると、第2部においていきなり実装寄りの個別の実装パターンに入るようでおやっと思ってしまいます。

あるいは、実装者の立場からすると馴染みのある用語や実践しやすいプログラムの構成要素が出てきて、思わず飛びつきそうになります。プログラムの中にエンティティやリポジトリを登場させることがドメイン駆動設計だと間違った解釈をしてしまう場合もあるかもしれません。

この点に関して、杉本さんは、DDD本を構成するパターンランゲージを「原則のレイヤ」と「実践のレイヤ」にわけ、前者をオブジェクト指向に依存しない普遍的な部分、後者をオブジェクト指向でドメイン駆動設計を実践するためのパターン群とみることを提案しました。

そして、前者は原則的なものなので、オブジェクト指向だけではなく、データ指向分析などの様々なパラダイムの実践手法に適用することが可能になると説明します。

このような3つの視点の切り替えを通して、エバンスのDDD本を読み直すと他にも色々な発見がありそうなので、近いうちに一通り読み直してみたいと思います。

Frameworks We Live By: Design by day-to-day framework development: Multi-paradigm design in practice

PHPメンターズ 久保敦啓 @iteman

James O. Coplienのマルチパラダイムデザインは1998年に最初の版が上梓された本なので、実はエリック・エヴァンスのドメイン駆動設計よりも先発の書籍になります。

にも関わらず、問題ドメインの概念に根ざした分析/設計/実装における単一のモデルの構築を目指すという目標は同じでありながら、そこに至るための方法論に関してはCopeのマルチパラダイムデザインの方がエヴァンスのドメイン駆動設計にはなかった設計手法を明示している、というのが久保さんの主張です。

マルチパラダイムデザインでは、人間が物事を認識するときの認知モデルに基づいて問題ドメインを分析していきます。久保さんの発表で出てくる、古典的カテゴリー理論と新しいカテゴリー理論の違いは、物事を生得的で客観的な事象として捉えようとするのか、経験に基づいた具体的・身体的な認知からの拡張によって得られるものなのかという違いだと思います。

Copeはここでいう認知に関しては後者の見方を基礎にしていて、問題ドメイン分析においてそういった認知機構を元に問題をサブドメインに分割して、そうして得た対象に対して、共通性分析、可変性分析を進めていきます。ここで重視されるのはやはり「審美眼、洞察、経験」によるものであって、例えば「よく知られたサブドメインは設計の優れたスタートポイント」などを考えるとよくわかります。

そのうえで、解決ドメイン分析、ドメインモデル設計(変換分析)に移るわけですが、ここでは問題ドメインの構造と解決ドメインの構造のマッピングをしながら分析していきます。そして解決ドメインの構造で問題ドメインの構造を再定義していきます。これは、何度か繰り返されるプロセスになります。つまり、解決ドメインが提供する抽象(構造)-型、クラス、継承、リレーション、エンティティ、値、パターンといった一群の文法要素やイディオム-が問題ドメインを洗練していくのです。すなわち、解決ドメインに対して利用することのできるパラダイムを用いて問題ドメインを再構築していくのです。

これは、先ほどの杉本さんの解決領域のためのドメインモデルにも繋がっていて、マルチパラダイムデザインのドメインモデル設計(変換分析)で再定義、洗練されたドメインモデルは、エリック・エヴァンスのDDDが目指している単一のモデルと等価なものになります。

これらのマルチパラダイムデザインの議論から久保さんは一歩進んで、問題分析で目の前にあるニーズを解決する特定の分析から得られる知見よりももっと広い視野で対象とするドメインのフレームワークを作るという視点を持ち込むことで、幅広い領域に適用できる共通性を発見することが出来るといいます。

ここで言うフレームワークは一般的に知られる、SymfonyやRuby on RailsのようなWebアプリケーションフレームワークだけではなく(もちろん、それらもある特定のドメインを対象としたフレームワークです)、様々な問題領域のドメインに対して適用されるフレームワークのことを指しているのだと思います。

例えば、発表の中であったワークフローエンジンもそうですし、ルールエンジン的なものや、もっとアプリ特有のドメイン用途のフレームワークも考えていいと思います。

それらのフレームワーク開発を通してドメインについて日常的に考え指向することで、プログラマー自身が設計者となって、実装の中でドメインモデルを洗練させていくモデラーとなるというのが久保さんから一番大きく受け取ったメッセージです。最後の「Code the Domain! You are a Domain Coder!」、ドメインをコードにせよ、あなたがドメインコーダーなのだという言葉は、ドメイン駆動設計を超えて、さらにマルチパラダイムデザインを超えて、その先にあるものとしてとても希望の持てるものだと思いました。

Coding We Live By ~モデルと実装の今と未来~

PHPメンターズ 後藤秀宣 @hidenorigoto

この講演で後藤さんは、久保さんまでの講演で辿り着いたドメインモデルを設計しながら実装する、実装しながら設計するということを、もう一度興味深い実例を示して強調します。

これは、後藤さんが実際に取り組んだアプリケーションなのですが、幾つかのリストを組合せてデータを生成する機能が既存機能としてありました。それは、元ネタのリストからいったん全パターンを組み上げて「分割」するという構造になっていたそうです。業務側の人もその機能のことを「分割」と呼んでいました。それ自体はとても自然な設計で作りも悪くはなかったのですが、多数の機能追加や変更の結果、プログラムの変更がとても大変な状況になっていたようです。そこで、後藤さんが入った時に、それまでの他のアプリケーションでの経験から「部分集合を作る」「集合の直積を作る」ということとその集合演算で処理を表現できることに気付いて、実際にその演算をするためのライブラリを実装しました。そして、その集合演算をサブドメインとして切り出すことで、処理を簡素化するとともに変更に対して柔軟に対応することができるようになったということです。

このような実践を行うためには2つの条件、すなわち、既に後藤さんの頭のなかのツール箱にそういう解法に対するアイデアがあったことと、後藤さん自身がそのアイデアを実装してそれが有効であることを証明することができたということが重要であったと思います。

セミナー全体を通して「視点」の切り替えが新しい気づきや理解を促してくれて、ドメイン駆動設計を横糸に、ドメインとコードというものが強く結びついて、実装者がドメインモデラーなのだという主張をはっきりと感じ取れるようになりました。

後藤さんは「視点」の重要性を示し、中西先生は、フォーム構造という要求分析の要素にある視点(フォームを選びとるということ)から導き出される構造の数学的理論的な土台を与えてくれました。杉本さんは、ドメイン駆動設計を題材にとり、今までとは違った視点でそれを解釈し直すことで、ドメイン駆動設計をより納得行くかたちで再定義してくれました。久保さんは、そのドメイン駆動設計の先にあるマルチパラダイムデザインによる設計からさらにフレームワークによる設計への道筋を、自らの経験と成果から、これも視点を変えて設計活動を捉え直すことで、示してくれました。また、フレームワークと捉え直したドメインの設計活動の中で、実装の中でドメインモデルを設計する、実装という活動そのものが設計なのだというメッセージを提示してくれます。

そして、最後に「ドメインモデルを設計しながら実装する、ドメインモデルを実装しながら設計する」という後藤さんの言葉でセミナーは結ばれました。

セミナー全体の感想

久保さんのセッションや質疑応答の中で、ドメインエキスパートと並立する存在としてのドメインモデラーという言葉がでたのですが、ドメインモデラーは、杉本さんの言葉で言えば解決領域(情報管理過程)の専門家としてドメインエキスパートと協同してドメインモデルを作っていきます。

そのためには、特定の領域の情報管理過程、情報モデルについて精通している必要があります。みなさんも、実装者であれば何らかの分野(業務モデルとも限りません、それはソーシャルゲームの場合もあるでしょうし、組み込み領域のプログラムの場合もあると思います)についての情報モデルの専門家であることが多いと思います。その解決領域に関する知見を深めて、道具箱に使えるツールを増やしておけば、それを実装の現場で応用することが出来る場面も増えるのではないかと思いました。

当日、その後の関連ツイートについて

当日のツイートやその後の関連ツイートがPHPカンファレス2015 PHPメンターズセミナー「モデルを設計せよ!―ドメイン駆動設計を超えて」 - Togetterまとめにまとめられています。こちらも是非ご覧ください。特に最後の杉本さん(@sugimoto_kei)によるドメイン駆動設計の根底にある意図の考察は必見です!

design ddd multiparadigm.design event eric.evans james.coplien generative.programming dsl framework nakanishi.masatake sugimoto.kei practical.ddd

「ドメイン駆動設計読書会@大阪」第8回感想

プログラミング道場生 kawakawaです。   

ドメイン駆動設計読書会の第8回に参加してまいりましたので、感想を報告させていただきます。   

    

読書会の内容は、レポート担当者さんにより、wikiにまとめて頂いております。   
第8回「ドメイン駆動設計読書会@大阪」公式レポートWiki  

 

第8回では、第5章の「エンティティ」「値オブジェクト」が範囲でした。 
(「サービス」は次回(第9回)予定) 

 

 

「エンティティ」と「値オブジェクト」

「エンティティ」「値オブジェクト」は、それぞれDDD本の用語解説から抜粋すると、  

エンティティ 

  • 本質的に、属性によってではなく、連続性と同一性の連なりによって定義されるオブジェクト。 

 

値オブジェクト 

  • ある特徴や属性を記述するが、同一性の概念を持たないオブジェクト 

以上のように記載されております。 

読書会では、この「連続性」と「「同一性」について話題が上がりました。 

同一性とは、 

  • 概念的な同一と認識するもの 

  • 同一性は追跡できるようにしておくこと 

  • 同一性を間違えると、データ破損に繋がる 

DDD本には、同一性について以下の記載がされていました。 

   第5章 「エンティティをモデル化する」より抜粋 

  • 同一性の定義はモデルから現れる。 

  • 同一性を定義するには、ドメインを理解しなければならない 

 これは、同一性というのは絶対的なものでなく、ドメインによって変化するものという事を、暗示しているのだと思います。 

 

 また、連続性については、 

  • ライフサイクル内において、同一性が続くこと 

  • 例えると、犬は年々成長し、体格は変わっていくが、その犬という概念は変化していない 

 つまり、一定期間(ライフサイクル)内で、同一性が保証される事が、連続性であると言えると思います。 

 

読書会で面白いと思った意見は、東京のミッキーマウスを叩いたら、アメリカのミッキーは痛がるのかどうかという話でした。 

単純に考えると、痛がれば「エンティティ」、痛がらないのなら「値オブジェクト」と言えそうですが、ミッキーは世界で一人(一匹?)という建前があるので、痛がらないといけないわけですね。 

 

エンティティと値オブジェクトの見分け方

エンティティと値オブジェクトの違いは、DDD本から抜粋すると、 

   第5章「 ソフトウェアで表現されたモデル」 

  • あるオブジェクトは、状態が異なったり、さらに別々の実装をまたいだりしたとしても追跡されるような、連続性と一意性を持ったものを表現しているのか? それとも、他の何かの状態を記述する属性なのか? これがエンティティと値オブジェクトとの基本的な区別である。 

とあります。  

そのまま抜き出すと、 

 エンティティ・・・実装をまたいでも、それと判る連続性と一意性を備えているもの 

 値オブジェクト・・・何等かの状態を記述する属性 

このように見る事ができます。 

 

また、第5章「関連」では下記のように記載されています  

  • 多対多の関連を辿る方向を制限することで、実装は一対多へと効果的に減らされる。これははるかに容易な設計である。 

  • ドメインにおける重要度を反映させるように、関連を一貫して限定することによって、その限定された関連は、伝達力がより豊かになり、実装もシンプルになる。 

  • ある区別をすることによって、モデルが明確になり、より現実に即して実装できるようになる 

 

オブジェクト同士の関係を単純化していくことで、モデルが明確になっていき、 エンティティや値オブジェクトを見つけやすくなりそうです。 

しかし、モデルによっては同じオブジェクトでも、エンティティ・値オブジェクトが変わる可能性がある事を、意識しておく必要がありそうです。

何故「エンティティ」と「値オブジェクト」を分ける必要があるのか?

 

オブジェクトをすべて、エンティティとみなす事への注意点として、下記のように記載されております。 

第5章 「値オブジェクト(VALUE OBJECTS)」より抜粋 

  • エンティティの同一性を追跡するのは本質的なことだが、それ以外のオブジェクトに同一性を与えてしまうと、システムの性能を損なうことになり、分析作業が増え、さらに、すべてのオブジェクトの見た目が同じになってしまうことでモデルが台無しになりかねない 

 

ドメインにとって、必要以上にエンティティを設けると、間違いを犯したり、分析に時間がかかってしまうなど、モデルが台無しになってしまうようです。 

無駄なオブジェクトの省き、モデルを単純化するという作業の中には、このようにエンティティを見極めるという作業も含まれている事を知ることが出来ました。

 

 

エンティティとデータベースの関係性

 エンティティのDB登録で、Ruby on RailsのようなActiveRecordパターンを使った実装話で盛り上がりました。 

 話の趣旨としては、 

  • SQLを書くと、間違いやミスが発生しやすい 

   (IDEによる補助を受けらない場合が多いから) 

  • SQLでは、DB実装を意識させられてしまう 

  • DBの構造と、エンティティや値オブジェクトの構造に差異がある場合が多い 

 などの理由により、如何にSQLを書かずに、実装できるかという内容でした。 

個人的には、モデルの変更スピード、コードの変更スピード、DBの変更スピードそれぞれの差異による、モデルとDB設計の剥離が、目下の課題と考えておりましたので、大変勉強になりました。 

コード・ファーストがその解に近いと思っておりますが、まだ考えがまとまっていないので、この点は改めて考えてみたいと思います。 

 

dojo ddd event design dddosaka modeling

「ドメイン駆動設計読書会@大阪」第6回感想

プログラミング道場生 kawakawaです。
ドメイン駆動設計読書会の第6回に参加してまいりましたので、感想を報告させていただきます。

読書会の内容は、レポート担当者さんにより、wikiにまとめて頂いております。
第6回「ドメイン駆動設計読書会@大阪」公式レポートWiki


今回でDDD本の第1部の範囲が終読致しました。
そこで、第1部全体での振り返りを行いたいと思います。

(2014/06/10 追記)
本から抜粋と記しているところを、抜粋元が不明瞭とのご指摘を頂きましたので、引用元箇所を明記しました。

ドメイン、モデル、ユビキタス言語の関係性

DDD本(第1部範囲)から記載されていた言葉を抜粋すると、

ドメイン

「第1部 ドメインモデルを機能させる」(中国世界地図の後)
すべてのソフトウェアプログラムは、それを使用するユーザの何らかの活動や関心と関係がある。ユーザがプログラムを適用するこの対象領域が、ソフトウェアのドメインである。ドメインの中には、物理的な世界をふくんでいるものもある。

モデル

「第1部 ドメインモデルを機能させる」(中国世界地図の話)
モデルとは簡素化である。つまり、当面の問題を解決する上で関連する側面を抽象化し、それ以外の詳細を無視することによって行われた、現実に対する1つの解釈なのだ。

「第2章 コミュニケーションと言語の使い方」(章の冒頭)
モデルとは、プロジェクトに携わる人々の頭の中で構築された概念の集まりであり、ドメインについての洞察を反映した、用語と概念間の関係性からきている。

ユビキタス言語

日本語推薦文:榊原 彰氏
書籍の冒頭からドメイン知識を得ることの有用性と、抽象的な議論に陥らずにドメインエキスパートとIT 技術者が有益な協力を行うことの重要性に言及している。
この書籍の中で新しく提唱された言葉である「ユビキタス言語」という考え方はまさにそうした根本概念を端的に表すものだと言ってもいいだろう。

日本語推薦文:平鍋健児氏
私自身がDDDの中で特に気に入っているのは「ユビキタス言語」。
ケント・ベックがエクストリームプログラミングにおいて「メタファ」(Metaphor)というプラクティスで表現しようとしたのは、顧客から開発者までが会話できる共通ボキャブラリの提供です。
これこそが、DDDにおいてユビキタス言語と呼ばれているプラクティスであり、ソフトウェアデザイン活動のコアであろう、と私は考えています。

(※2014/05/25 追記)
kumamidoriさんから、DDD本巻末に記載されている用語解説から、説明文を引用されてはと、ご提案頂きました。
確かに、その方が適切かと思いますので、下記に用語解説から、それぞれの解説文を記載致します。
(上記の単語解説文は、DDD本第1部範囲から、私が抜粋したものとなります)

DDD本用語解説

  • ドメイン・・・知識、影響、または活動の領域。
  • モデル・・・ドメインにおける選択された側面を記述し、そのドメインに関連した問題を解決するのに使用できる抽象の体系。
  • ユビキタス言語・・・ドメインモデルを取り巻いて構築され、チームのあらゆる活動をソフトウェアと結びつけるために、チームメンバ全員によって使用される言語。

DDD本の第1部から、私が感じ取ったイメージを図にすると下記のようになりました。

image

図1:ドメイン_モデル_ユビキタス言語の関係図

ドメインは、見方や観測者によって姿・形が変わる雲のようであり、そこから、抽象化(≒誰が見ても同じ形に見えるように)取り出したのがモデルで、モデルはユビキタス言語にて構成されているイメージです。

モデルは、モデルA・B・Cのように、抽象化した内容が異なれば、その分ドメイン内に複数存在することになります。
抽象化によっては、ユビキタス言語(語彙2)を通じて、モデルAとBが重複しているように、モデル同士の領域が重なる事もあります。

ユビキタス言語は、ドメインに対してユニークであり、ユビキタス言語(語彙1~5)は、それぞれ個別の語彙である事を示しています。

(※2014/05/22 追記)
久保さんから、「モデルの名前も、ドメイン内でユニークであるのなら、ユビキタス言語の語彙といえると思います」とのご指摘を頂きました。
なるほど、確かにモデル名もユビキタス言語と言えると思います。ご指摘有難うございました。

DDDにおける「モデル」とは?

DDD本では、モデルは関係者間のコミュニケーションツールであると、書かれていますが、 別の見方をすると、モデルこそが、開発者とドメインエキスパートが、ドメインを認識しあえる 唯一のツールでは無いかと思っています。

モデルという語彙が示すものという話になりますと、言葉の綾的な処がございますので、 実際にモデルはどのようなものなのかを考えてみたいと思います。

まず、思い浮かぶのが図・UMLや、業務分析シートや要求仕様書などのドキュメント関係を思い浮かべますが、DDD本に記載されていたモデルとは、

「第2 章コミュニケーションと言語の使い方」「ドキュメントと図」(中盤)
言語に対するこうした変更は、ドメインモデルに対する変更として認識され、用語の意味が変わった場合には、チームがクラス図を更新して、コード中のクラスやメソッドの名前を変えたり、ふるまいを変更したりすることにまでつながる。

「第2 章コミュニケーションと言語の使い方」「ドキュメントはコードや会話での表現を補わなければならない」(最初)
動作しているコードが嘘をつくことはないが、他のドキュメントだとその可能性がある。
動作しているコードのふるまいには、あいまいなところがないのだ。

「第2 章コミュニケーションと言語の使い方」「ドキュメントと図」(後半)
常に覚えておいて欲しいのは、モデルは図ではないということである。
図の目的は、モデルについてコミュニケーションし、説明するのを助けることにある。

「第3 章モデルと実装を結びつける」「モデル駆動設計」(後半)設計で使用する用語法と責務の基礎的な割り当てをモデルから引き出すこと。コードはモデルの表現となるから、コードに対する変更はモデルに対する変更になるかもしれない。
その影響は、プロジェクトの他の活動全体へと適宜伝わっていかなければならない。

「第3 章モデルと実装を結びつける」「骨格を見せる:なぜモデルがユーザにとって重要なのか?」(終盤)

モデルが明らかになれば、ユーザはソフトウェアの潜在能力にもっと触れられるようになり、ふるまいは一貫した予測可能なものになる。

と記載されています。 

一般的にイメージしがちな、図・UMLなどドキュメントを、モデルと見なすことに、警告を示されています。

確かに、図・UMLだけでは、簡易表記により、誤解を招いたり、逆に詳細に記述し過ぎて、視認性を悪くしたりして、モデルの意図・目的が上手く伝わらない危険性があるかとは思います。

しかし、コミュニケーションツールとしてのモデルを考えた場合、プログラムコードだけでは、ドメインエキスパートとコミュニケーションとるのは難しそうです。 

やはり図やUMLなどドキュメント類が欲しい処です。

DDD本で紹介されていた手法としては、先にプログラムコードを書き、その補足として、図・UMLを書きなさいと記載されておりました。 

従来の図・UMLからプログラムコードへの手法と逆になりますが、先にプログラムを書くことで、図・UMLで設計する必要がなくなり、図・UMLが無駄のない、目的を明確化したドキュメントになるという事で、成程と思いました。

ウォーターフォールでDDDはできるのか?

ウォーターフォールの開発環境でも、DDDはできるのでしょうか。
DDD本で、ウォーターフォールに関して記載された箇所を抜粋すると、

「第1 章知識をかみ砕く」「知識のかみ砕き」(中盤)
旧来のウォーターフォール手法では、ビジネスエキスパートがアナリストに話をして、アナリストがかみ砕き、抽象化して、その結果をソフトウェア作成者であるプログラマに伝える。
このアプローチがうまくいかないのは、フィードバックが完全に欠けているからだ。
アナリストはモデルを作成する全責任を負っているが、基になるのはビジネスエキスパートから得た情報だけだ。
プログラマから学んだり、ソフトウェアの初期バージョンを体験したりする機会は全くない。
知識は一方向に少しずつ流れるだけで、蓄積されないのである。

「第1 章知識をかみ砕く」「知識のかみ砕き」(後半)
チームメンバ間のやりとりは、メンバ全員がモデルを一緒にかみ砕くことで変化する。
ドメインモデルを絶えず改良すると、開発者は、自分が力を貸しているビジネスにおける重要な原理を習得するように強いられ、機械的に機能を作り出すことがなくなる。
一方、ドメインエキスパートは、自分の知っていることを蒸留して本質を抽出するように強いられることによって、しばしば自分の理解を精緻にし、ソフトウェアプロジェクトが必要とする概念の正確さを理解するようになる。

「第1 章知識をかみ砕く」「知識のかみ砕き」(後半)
改善されるにつれて、モデルは、プロジェクトの中を流れ続ける情報を体系化するためのツールとなっていく。
モデルは、要件を分析することに焦点を合わせているが、プログラミングや設計とも深く相互作用する。好循環が起きれば、こうしたモデルの性質によってチームメンバのドメインに対する洞察が深まり、状況がより明確に理解できるようになって、モデルがさらに精緻化される。
このようなモデルは、決して完成することがない。
代わりに、進化していくのだ。

「第1 章知識をかみ砕く」「継続的学習」(後半)
アプリケーションのコアは別にあることがわかったので、その側面を舞台の中央へ持ってくるようにモデルが変更されたのである。
ドメインエキスパートがより多くを学んだことで、アプリケーションの目標が明確になったのだ。

ウォーターフォールでDDDが、出来る/出来ないとは書いていませんが、アジャイル開発と比べて次の点でDDD実践は難しそうです。

  • モデルを修正・補正する機会が無い 
  • ドメインエキスパートが情報蓄積・学ぶ機会が無い 


フィードバッグループが大きくなってしまうという、ウォーターフォールのデメリットがネックになりそうです。

余談ですが、読書会で出た話として、

  • アメリカは内製開発が多く、日本は外部開発が多い 
  • 日本の場合、SIerのほうが、顧客よりもドメインエキスパートになっているときがある 

という話題がありました。

これらから推測すると、

  • 日本はSIerなど外部がウォーターフォールで開発を行う。 
  • 開発で得られた知識は、顧客ではなく、SIerに蓄積されていく。 

このような流れになっていると思われます。

ウォーターフォール開発については、開発側視点で納期や予算などで問題が多いという議論は多いですが、発注側の「知の蓄積欠如」・「学びの機会損失」という視点は想定していなかったので、面白い発見ができたかなと思います。

第1部のまとめ

ソフトウェア開発を「設計」と「実装」にわけると、それは「戦略」と「戦術」のような関係だと捉えています。
今まで、「戦術」部分を磨くべく、学んできましたが、「戦術」だけでは太刀打ちできない、「戦略」の壁を感じる事が多くなってきたので、「戦略」を学ぼうと思ったのが、DDD本を読み始めたキッカケでした。

DDD本第1部を読み終えて思うことは、この本は「戦略」方法が直接書いているわけではなく、「戦略」のための「戦略」が書いているのだと。
その為、多少判りにくい処のはありますが、まずは最後まで読み終えてみたいと思います。

また、第1部で生じた疑問点は、第2部以降、続きを読み続けていく中で、解消していきたいと思います。


  • 疑問1 :深いモデルを作りだすコツはあるのか? 
  • 疑問2 :DDDの実践方法(プラクティスやツールなど)。どうやって現場に広げるのか。 
  • 疑問3 :複雑なドメインとはどのような事を示すのか? 

振り返り

Keep

  • 第1部まで読み終える事ができた

Problem

  • 第1部内でも理解が足りない処がある(特に第3章)
  • 感想文の提出が1週間超えてしまった。

Try

  • 第1部読み直し。
  • 感想文提出1週間を目指す。
dojo ddd event kpt design dddosaka modeling

「ドメイン駆動設計読書会@大阪」第5回感想

プログラミング道場生 kawakawaです。
だいぶ、日にちが開いてしまいましたが、ドメイン駆動設計読書会の第5回に参加してまいりましたので、感想を報告させていただきます。
読書会の内容は、レポート担当者さんにより、wikiにまとめて頂いております。

 2014/05/20 追記 

さかばさんから、下記のご指摘を頂きました。


一連のツイート流れはコチラ
http://togetter.com/li/669502 

ご指摘を受け、論理展開を修正致しました。

  

今回の読書会で気になった点

  

モデルとは何?

今回の読書会で一番気になったのは、第2章の「ドキュメント図」に記載されている
「モデルは図ではない」
という考え方でした。

注意しないといけないのは、ここで言われているモデルが何を示しているかです。 

概念的なモデルではなく、ドメインを抽象化して取り出した『ドメインモデル』であると想定して、話を進めたいと思います。 

モデルは図ではないと主張されている箇所を要約すると、
  • 図は詳細に記すると全体がぼやけてしまい、逆に省きすぎると詳細が分からなくなる。
  • 図だけでは概念の意図が伝わらない。別の説明が必要となる。
  • 図はメンテナンスコストがかかり、モデルの変化に追随できない可能性がある。

DDD本では、「モデルは図ではない」と強い文章で記載されていますが、 具体的に読むと「モデルを図だけで表現するのは難しく、正確に表現したとしても、メンテナンスコストが掛かり、モデルと乖離してしまう可能性が高い」と注意を促していると、読むことができます。 

逆に、モデルを表現しているものと示されていたのは、コードが挙げられています。コードを変更することは、モデル変更と同じとも記されています。

  
  

図の使い処は?

図は、考え方の骨格を示しており、コミュニケーションツールとして使えると書かれています。
図を使うことで、コードが読めないドメインエキスパートなどと、モデル概念を共有できるとあります。
ただし、その際の注意点として、
  • 口頭やホワイトボードなど、モデルと不一致しない程度に、長くは残らないものを使う
とあります。
あくまでも、一時的なツールとして使用し、図とモデルが不一致にならないよう注意する必要があります。
(不一致になっていたとしても、コードが読めないと図と不一致しているか判らない為の処置だと思います)
  

コードがモデルに沿っている確証は?

コードの振る舞いがモデルを表しているとなると、その振る舞い自体がモデルを正しく表現出来ていることをどのように認識すればよいのでしょうか。
1つはATDDやBDDのように、振る舞いを規定しておき、その挙動を満たすかどうが判定することで、確かめる方法があります。
しかし、この方法にも問題があります。
  • 振る舞いの組み合わせが多数あると場合、1つ1つドメインエキスパートに確認が必要
  • 振る舞いによっては、組み合わせ爆発が発生し、管理しきれない場合がある
  • 実装に依存して、純粋なモデルの確認にならない場合がある
  •  ⇒モックを使用したとしても、実装の単純なモック置き換えでは意味がなく、適切な抽象化が必要となる。
  •  ⇒抽象化しない場合は、モックの為の振る舞いテストに陥りやすく、モデルのテストではなくなる。
そして何よりも、
  • ドメインエキスパートと認識共有した図をそのままコードが出来ない
  • (開発者が、図から単純にコードを書き起こすと、上記の図の問題点により、コードがモデルと乖離してしまう可能性が高い)
そこで、読書会で話題に上がったのが、ドメイン固有言語(DSL)を使ったコード自動生成でした。
  

DSLを使ったモデル駆動開発(MDD)

DDD本では、エリック・エヴァンス氏は、UMLからのソース生成機能を、UMLの表現に制限されるとして、非生産的と評価していましたが、久保さんによると、最近の エリック・エヴァンス氏は否定的ではなく、受け入れられているとの事 (参考)。
しかし、DSLの対象スコープを限定する必要があるなど、まだ発展途上のようです。
DSLを使った開発といえば、モデル駆動開発(MDD)が思いつきます。
MDDもまだまだ発展途上のようですが、UMLがそのままコードの源流になるのなら、UMLとコードが不一致を起こすこともなく、モデルのテストは不必要となり、実装のテスト(システムテスト)に注力できるようになるとになります。
しかし、DSL・MDDが世に出てから幾分立ちますが、まだ実用でお目にかからないところを見ると、思った以上に使用箇所が難しいといったところでしょうか。
今後はDSLを適応出来そうなところには、積極的に使用してみて、発生する問題などを身をもって学んでみたいと思います。
  

まとめ

  • コードはモデルを体現できるが、その確認方法が大変
  • 図・UMLだけでは、モデルと言えない
  • しかし、DDD本が出版された2003年はUML2.0(もしくは1.5)。現在はUML2.4。UMLは日々進化している。
  • いつかはUMLからDSL、MDDのような開発ができるかも。
  • 今後の勉学のためにも、DSLを使った開発を試してみる。
コードに記したモデルの整合性をとる方法を悶々と考えてみましたが、結論としては後藤さんが記載されました「設定の仕様とは」の意図されるものと近いものになったのかなと思います。(設定をモデルに置き換えるとそのままかなと)
  

振り返り

前回のTry結果

今回は、レポートのテーマを「図とモデルについて」と決めていたのですが、まとめるのに苦労しました。

今回の振り返り

    Keep:図・UMLとコードの関連性が理解できた。
    Problem:この読書会感想を掲載するまで、2週間以上かかった!
    Try:前回のTry結果を踏まえ、実質レポートを記していた期間が5日なので、次は予備日も入れて1週間以内に掲載できるようにする。
dojo ddd event kpt

「ドメイン駆動設計読書会@大阪」第4回感想

プログラミング道場生 kawakawaです。
ドメイン駆動設計読書会の第4回に参加して来ました。
読書会の内容は、レポート担当者さんにより、wikiにまとめて頂いております。

今回の読書会で気になった点

隠された概念を引き出す勘所

ドメインエキスパートでもある顧客と会話する際、特定のキーワードが出てきた時は、要注意という話で盛り上がりました。
そのキーワードとは、『大切』 『常識』 『標準』。
これらの単語は出てきた時は、その要求や仕様は、ドメインの核に近いのではないだろうかという話です。
言われてみれば、思い当たる節があります。
詳しくないので判りませんが、もしかしたら、ソフトウェア要求仕様に、何らかのプラクティスとして、既にあるのかもしれません。

深いモデルとは?

1章のラストに書かれている『深いモデル』は、DDDにおける目標だと思います。
モデルが洗練されることによって、顧客が求めていたモデルが生成されるという理想の流れです。
しかし、DDD本に記載されている例が適切だったのか、という点では疑問が残ります。
DDD本では、船荷の物理移動モデルが洗練されて、船荷証券モデルに変化しましたが、
  • 当システムを誰が使うのか?というのが曖昧だった?
  • ドメインエキスパートと、話をしていなかった?
  • 船荷証券という管理帳簿で運用されているのなら、逆に船荷証券モデルは最初に思いつくのでは?

こう考えると、DDD本に書かれていた船荷証券の例には、違和感を感じました。(本が伝えたかったと思う事に比べると些細な事ですが・・・)

深いモデルについては、PHPメンターズ後藤さんによる記事
にて記載されております。

モデルのゴールとは?

理論的調和が取れた、最大公約数的なモデルは存在すると思います。
しかし、理想的なモデルにたどり着くまで、時間と苦労が多数かかかると思います。
そういう意味では、原田騎郎さんDDDワークショップで教えて頂いた『使えるモデルから徐々に洗練させていく』というのが、現実的な気が致します。

コミュニケーションツールとしてのモデル

モデルリングという行為は、物事を抽象化して、他人に伝えようとしていると見なすことができます。
そうすると、、モデルは立派なコミュニケーションツールと見なすことができると話題になりました。
話題の中で、興味深かったのは、@Hatajoeさんが言われていた「ユビキタス言語はAPIに似ている」という話です。
@Hatajoeさんのブログ『第四回ドメイン駆動設計読書会@大阪に参加した』から引用させていただきますと

唐突だけれども、僕はユビキタス言語はAPIだと思った。APIリファレンスみたいな。 モデルはパッケージみたいな感覚で、ユビキタス言語はそのパッケージを表すAPI。 誰もが共通認識を持てる。同じ言葉で話が出来る。 ユビキタス言語の変更はモデルの変更を意味するみたいなところも妙に納得の行く感じで。 こう考えると、ユビキタス言語の導き方も割りとエンジニアリングに近い感覚で行えるような。

で「これや!これなんや!」くらい僕は興奮していて。

けどそれを巧妙に隠した上でクールに「なんかユビキタス言語ってAPIみたいだなぁって」って決めた俺ナイスユビキタスイケメン。 ただあんま刺さらんかった。

めっちゃ刺さりました(笑
なるほど、そのような視点で見たことはなかったので大変面白かったです。
理解し得ているか不安ですが、私が思いついた挙動としては、『1つのユビキタス言語が、次のユビキタス言語の説明に使われ、それが広がってモデルの説明に繋がる』このようなものをイメージしました。
他になかなかお聞きしない表現ですが、もしかしたら、プログラマの方には、この表現で刺さる方多いのではないでしょうか。

振り返り

今回の振り返り

  • Keep:深いモデルに感じていた違和感の意味が、読書会に参加したことで、やっと原因が分かった。
  • Problem:読書会感想のまとめを作るのが遅くなってしまった
  • Try:参加した三日以内には感想文を出すようにする

前回のTry結果

前回Try:『発散してきた場合その内容をメモするなどして、ディスカッションはもとに戻して、後日時間を作って改めて発散した内容をディスカッションするようにしてみたい』

  • 今回は脱線と言える、話題を超えた発散は無かったと思います。
  • もし、発散した話題を改めて後日ディスカッションするとしても、テーマが定まっていないと、コンテキストが定まらず、後日再開というのは、そもそも難しいのではと思い直すようになりました。
  • 読書会の目的が、本を読み終えるではなく、知識の探求にあると考えるのならば、話題の発散は、無理の補正する必要はなく、流れに任せておくのが良いように思います。
  • このTryは一旦取り下げ、進行役の流れに任せる形で次回は参加しようとおもいます。

前回からの宿題・課題

前回に「DDDにおけるFATモデルとは?」という話題のなかで

DDD本の序章には『複雑なドメインの設計は、モデルに基づかなければならない』と記されていますが、具体的にはどのようにすれば良いのか、私はまだ判っておりません。

今後は、DDDにおけるFATモデル(≒カオスモデル?)についてもディスカッションしていければと思います。

という課題をあげ、ディスカッション用のサンプルモデルを考えていたのですが、複雑なドメインが何であるかという処で止まっている状況です。

考えていたのは、電車切符販売(他社間の乗継あり)という複雑そうなシステムですが、これがドメイン的に複雑になりえるのかというのが悩んでいるところです。個人的にはコンテキストマップでスコープを限定していけば、ドメイン自体は複雑にならないのではという感想です。(まだ思案中です)

課題がディスカッションをしたいということなので、考えがまとまる前にディスカッション行う事は可能でしょうが、もう少し時間をかけて、議論点を絞り込んだ段階で、再度課題に挙げさせて頂きたいと思います。

dojo ddd event kpt