読者です 読者をやめる 読者になる 読者になる

ソフトウェア開発者の世界観を考える

ソフトウェア開発者の勉強会などに参加すると、最初に持ち時間一人30秒くらいの全員自己紹介タイムがあったりする。「好きなプログラミング言語は?」だとか「使っているフレームワークは?」など、勉強会の参加者層に対して比較的通じやすいお題が都度用意されたりもする。

そんな自己紹介のお題として「あなたのソフトウェアシステムに対する世界観は?」なんて出される勉強会があったら面白い、と思うのは少数派だろうか。

私の尊敬するエンジニアの先輩方は、必ずと言ってよいほど溢れんばかりの世界観をお持ちだ。システム観、モデル観、設計観、設計者観。そう呼べる何かが話す言葉の端々から滲み出ていて、興味をそそられずにはいられない。

しかし果たして、私自身はどんな世界観でもってソフトウェアシステムを眺めているのだろうか。自己紹介でネタにできるほどの世界観を持ち合わせてはいないのかもしれない。自分の世界観を客観的に考えるためにも、今持っている感覚から一歩引いて、いくつかの軸から有り得そうな世界観を想像してみることにしよう。

あらかじめ断っておくと、以下でとりあげる軸は、私が自分の考えを見つめるためにでっち上げたものであって、決してソフトウェア工学で議論されてきた用語などではない。

ドメイン

ソフトウェア工学の中にドメイン工学という分野がある。また、ソフトウェアの設計パターンとしてのドメインモデルという用語がファウラーの書籍でよく知られるようになった。エヴァンスのドメイン駆動設計以降、ドメインというのはソフトウェア開発におけるメジャーな概念になった。しかし、ドメインという言葉に託しているイメージは人それぞれかなり異なっているようだ。その異なり方を分析してさまざまな軸を洗い出すのも有益だと思うが、ここでは2つだけとりあげてみる。

ドメインの個数(または粒度)

ソフトウェアシステムには、いくつのドメインがあるのか? またはその裏返しとして、どのような単位をドメインと呼ぶのか?

  • 単一ドメイン的世界
    1つのソフトウェアシステムは、1つのドメインに対応すると見ている。システムとして機能する1つの固まりが、ドメインである。
  • 複数ドメイン的世界
    1つのソフトウェアシステムは、複数のドメインに分解できると見ている。ドメインによって浮かび上がる対象の粒度や抽象度は様々。

ドメインという言葉の指す対象の粒度としては、複数ドメイン的世界よりも、単一ドメイン的世界の方が大きいものとなっている。複数ドメイン的世界観では、かなり小さな対象でもドメインと呼ぶ。

コアドメイン

ソフトウェアシステムの中で、重要な部分はどれか? エヴァンスのドメイン駆動設計で、「コアドメイン」という1つのパターンとして紹介された。

  • コアドメイン絶対主義
    ソフトウェアシステムには、最も重要なドメインがただ1つ存在すると考えている。
  • コアドメイン相対主義
    ソフトウェアシステムの開発時期などによって取り上げる部分、つまり開発者が対象として見ている部分がコアである。関わる人たちの意思によってコアが決まる。
  • 非コアドメイン主義
    ソフトウェアシステムを構成する個々のドメインにはそれぞれ意味・役割があり、どれか1つを絶対的に重要視することはない。

エヴァンスのドメイン駆動設計では、コアドメインに最も優秀なメンバーを投入せよ、コアドメインを見つけよ等、コアドメイン絶対主義的に読める表現がある。しかしその一方で、コアドメインは、別のアプリケーションにとっては補助的な汎用コンポーネントになるといった記述もあり、コアドメイン相対主義の雰囲気もある。しかし、どちらかといえばコアドメイン絶対主義なのだろう。

しかし、ヴァーン・バーノンの実践ドメイン駆動設計では、複数のチームが異なる対象を担当する。これはコンテキストが違うというだけでなく、それぞれのチームが作り上げるコアが異なると見ることもできるだろう。したがって、ややコアドメイン相対主義だといえる。

コプリンのマルチパラダイムデザインでは、コアドメインという用語は登場せず、問題ドメインや解決ドメインが大小さまざまなドメインによって構成され、そのどれも等しくドメインと呼ぶ。したがって、非コアドメイン主義だといえる。

他方、伝統的なソフトウェア工学およびドメイン工学ではコアドメインという用語は使われず単にドメインと呼ばれるが、それが指すものはいわゆる業務システムのための仕様群であることが多く、実質コアドメイン絶対主義に近いといえる。

オブジェクト

ソフトウェアシステム開発には様々なパラダイムが使われうる。その中のオブジェクト指向のみに焦点をあてても、とても多くの立場がある。「オブジェクトはどこからくるのか」という考えをよく表す軸を1つ取り上げる。 

オブジェクトの由来

  • 自然オブジェクト主義
    ソフトウェアシステムの概念を構成するオブジェクトは、本来現実世界に存在するモノを写し取ったものであるべきと考えている。
  • 自律オブジェクト主義
    ソフトウェアシステムの概念を構成するオブジェクトは、それぞれ自律的な存在であるべきと考えている。
  • 人工オブジェクト主義
    ソフトウェアシステムの概念を構成するオブジェクトは、現実世界の存在や人間の行動様式、概念を参考にしながらも、ソフトウェアの中でうまく機能するように作られた人工物だと考えている。

オブジェクト指向の発明者であるアラン・ケイの文脈では、メッセージによって自律的に制御されるのがオブジェクトだ。

これとは別に、オブジェクトはあくまで現実世界を写し取ったものであるべきとする立場がある。可能な限り現実世界の有様を忠実に表現したオブジェクト群こそが変化に強くソフトウェアとして有益であるという立場だ。

その反対で、オブジェクトはあくまでソフトウェアシステムおよびプログラムコードの設計パーツとして捉え、さまざまな要請やその時使える技術インフラ、プログラミング言語の機能などから、開発者が作り出すものという立場もある。

 

私の世界観

上に挙げた軸から、私が現在どのような世界観を持っているのかを選んでみると、以下のようになる。

  • 複数ドメイン的世界
  • 非コアドメイン主義
  • 人工オブジェクト主義

今の私の考えでは、ドメインが指す対象の粒度はかなり細かい。エヴァンスの書にあるような「輸送」「販売」などをドメインと呼ぶのは間違いではないにしても、ほとんどの場合、その大きさの単位をそのまま扱うようなことがないので、それを1つの範囲として実感しづらいのだ。もっと細かな業務単位だったり、業務に必要な機構だったりをドメインと呼んでいる。ソフトウェアシステムであれば、コンポーネントくらいの単位だ。リクエスト、レスポンス、コネクション、ステートマシン、ストリーム・・・。それぞれが何か1つの概念で表される固まりをドメインと呼んでいる。

これらの細かなパーツが組み合わさり、折り重なりながらソフトウェアシステムを作る。システムには「仕様」というものがあるが、それは商取引のルールと同じようなレイヤーのものだけではない。たとえば、ユーザー向けの分かりやすいユーザーインターフェイス上で作られる情報群を、システム内部に持っている計算ロジックモデルへの入力を表わす情報ツリーに変換して処理するような機能があるとする。この機能において、システム的に重要なのは、ユーザーが操作する部分の情報の構造だろうか? それとも、内部に持っている計算ロジックやそのための入力情報の構造の仕様だろうか? 後者はユーザーが操作するソフトウェアの表面の仕様と何らかの関係はあるにせよ、ソフトウェア内でそれが表される位置やレイヤーは、どちらかというとソフトウェアの内側にあるだろう。さらに付け足すと、この計算ロジックの処理のための数学的な演算機構は、コンポーネントとして独立して作られている、なんてこともある。

何が言いたいのかというと、どれかをコアと定めることはさほど有益ではないと考えているということだ。

そして、上に挙げた「パーツ」というのは、とても人工的だ。何も無いところからスタートしなければいけない場合を除いて、通常は、目の前に人が作ってきた何かがある。自分たちで作ってきたシステムもそこに含まれる。そこにある問題を解決するための方法を大なり小なり考案しなければいけない。既存のソフトウェアや要望と、開発者が持っているプログラミング言語などの道具、新しい技術などから、解決策が生み出される。解決のための仕組み・モデルは、常に開発者が設計し、作り出すものだと考えている。

 

おわりに

自分が持っている世界観を考えてみるというのは、とても面白いし、そんな世界観を議論しあうような場があれば、是非参加したいと思う。だが、語ったり議論したりするには、いくつもの軸を明確にしておく必要もある。そういった理解の積み重ねが必要だから、難しい。

「語りえぬものについては、沈黙せねばならない。」

と、どこかからお叱りを受けぬよう、ソフトウェア開発者として語りうる地平を地道に広げていきたい。