2009年10月2日金曜日

ユビキタス言語と日本語

数ヶ月前から社内でDDD勉強会を実施していて、最近「ユビキタス言語(Ubiquitous Language)」まで来たんだけど、ここでやっぱり「日本語を使ったら1つの言語、モデルになるのか?」という疑問が出てきた。JavaEE勉強会でも同様の意見が(確かhirataraさんから)出てきていたものの、残りの部分に答えが書いてある可能性もあったので、その時点では「まぁ、用語の一覧みたいなのを作ってなんとかすればいいんじゃないの?」と流したものの、あらためて同じ問題に直面してみると、なかなかやっかいな問題だ。先に進む前に、この時点での自分なりの結論を書いておく。

DDDの世界観
まずは、DDDにおけるユビキタス言語やモデルの扱いについて簡単にまとめておく。
# 断るまでもないと思うけど、もちろん個人的な理解。

ユビキタス言語はドメインモデルに基づく言語であり、ドメイン専門家と開発者の双方が作り、双方が使う。これら2つは一体となっており、片方が変更されればもう一方も変更される。

ユビキタス言語が構成する世界−−言い換えれば、言語によって制限された物の見方−−がモデルであり、モデルは第一義的には概念上の存在である。わかりやすく言い換えると、モデルのマスターは頭の中に存在している、ってこと。これを文章やダイヤグラム、コードで表現することもできるけど、そうして表現されたものはすべてモデルの死体のようなもので、作った瞬間から古くなっていく。

モデルが頭の中にしかないのであればユビキタス言語も同様で、会話の中にあらわれるものこそが第一義的な「ユビキタス言語」になる。

僕たちはソフトウェアを開発したいので、モデルが頭の中にしかないってのはあまりうれしくない。最低でも(モデル表現としての)コードは必要になってくるけど、DDDではモデルを複数作らないのが原則だ。となると、コードの構造は頭の中のモデルを投影したものになり、コードはユビキタス言語で表現されることになる。

DDDの世界観は、こんな感じ。

で、問題は何よ
日本で開発する場合、顧客と開発者の会話はふつう日本語で行われる。よって、ユビキタス言語は日本語として構築されることになる。
一方、プログラミング言語は通常英語(というよりは英数字)がベースだ。日本語プログラミング言語も存在しているが、少なくとも業務システムではほとんど使われていない。最近の言語はたいていUnicodeをサポートしているので、識別子として日本語を使えばいいじゃん、と思うかもしれないが、言語が持つ標準的なコーディングスタイルから著しく逸脱するので、信じられないほど可読性が低下する。
# 一度Javaでやってみたことがあるが、正直2度と読みたくない。

どうするべき?
ここで取るべき道は2つ。
  1. コードは英語、その他は日本語
  2. コードはローマ字による日本語表現、その他も日本語
ここで、僕のような西洋かぶれは1番目の方法を選びたがるわけだけど、これはおそらく大きな誤りだ。
英語と日本語は、単に文法や単語が違うだけではなく、世界の見方自体が異なっているので、どうやってもうまく対応させられない部分が出てくる。それがわかっていればまだ良い方で、うまく対応させたと思っているものの、実際は完全に間違えていることだって少なくない。そうした無理な変換によって、実質的にはモデルが2つできてしまいかねない。
そもそも母国語だけ使っていても、単一のモデルを(言語、文章、コードにわたって)維持するのは非常に困難なので、基本的な道具立てに撹乱要因が入るのはできればご遠慮願いたい。

2番目は、おそらく現場で一般的に取られている方法だろう。コードを見ると頭が痛くなるような識別子が並ぶことになるのだが、無理に英語を使って混乱するよりはまだマシだろう。

言語学との関連
実際のところ、一番興味深いと感じたのは、Evansのユビキタス言語に関する考え方が、最近読んだ言語学の本での言語に対する態度とかなり近いという点。言語として会話を重視する、といった態度のことね。考えてみれば当たり前なんだけど、言語の中には文字がないものだって存在するし、何より頻繁に変わっていく(設計のためのユビキタス言語のような)言語に追随するには、話されている生きた言語を捕える必要がある。
にもかかわらず、自分も含めて、言語を「紙に書かれた文字や文章」や「文法書」、「辞書」である、と考える人が異常に多いということに気づいて愕然としてしまった。

2009/10/8追記:
勉強会でさらに話し、名詞の厳格な扱いのおかげで概念をより厳密な言語(プログラム言語)に落とし込みやすい英語と比べ、日本語では概念を明確にしづらい…といった話が。結局、ユビキタス言語は混成言語(ピジン語)のようなものにせざるを得ないのかもしれない。ただし、文法の混成はかなり限定的になりそうだけど。

1 件のコメント:

u1hoshino さんのコメント...

おもしろいね。

いくつか気がついた。ユビキタス言語自体は双方のビューであること。互いの頭の中のモデルのね。で、顧客->ユビキタス言語->開発者->コード、場合によっては、日本語->英語になっていること。顧客からはなれていってしまうんですね。

で、良くある開発プロセスでは、要件定義(書)->人->基本設計(書)->人->詳細設計(書)->人->コードと進んでいくので、そりゃそんな伝言ゲームじゃだめだということ。