こまぶろ

技術のこととか仕事のこととか。

『Clean Architecture』における単一責任の原則とコンウェイの法則について

要約

『Clean Architecture』における「単一責任の原則(SRP)」の説明において、アンクル・ボブはコンウェイの法則に言及している。コンウェイの法則によって補強されていると思われるSRPの主張は、2014年のアンクル・ボブのブログ記事において既に現れている。「変更の理由」を「人間」であると同定することは、アンクル・ボブにおけるSRPを一段階踏み込んだ主張にしている。

SOLID原則との出会い

ソフトウェア開発の世界には、「〇〇原則」や「〇〇法則」といったものが数多く存在している。その中でも、最も著名なものの1つが、SOLID原則であろう。SOLID原則とは、以下の5つの原則の頭文字をとったアクロニムである*1

  • S:単一責任の原則(Single Responsibility Principle)
  • O:オープン・クローズドの原則(Open/closed principle)
  • L:リスコフの置換原則(Liskov substitution principle)
  • I:インターフェイス分離の原則(Interface segregation principle)
  • D:依存性逆転の原則(Dependency inversion principle)

SOLID原則は、「アンクル・ボブ(ボブおじさん)」として知られるRobert C. Martinが紹介しているものだ。『Clean Architecture』によれば、2004年にMichael Feathers*2から「SOLID」と読めるという指摘を受けたのがSOLID原則の誕生の瞬間であったらしく*3、日本においてもよく知られた原則であると言えるだろう。

ある程度のキャリアを積んでいる開発者の方々にとっては、SOLID原則は決して目新しいものではないようだ。しかし、この業界に入ってようやく2年が経とうとしている自分にとっては、アンクル・ボブの最新刊であり、昨年7月に邦訳が公刊された『Clean Architecture』が、SOLID原則との事実上の最初の出会いを提供するものとなった*4

単一責任の原則とコンウェイの法則

『Clean Architecture』を読んでから、SOLID原則についての議論がTwitter上でなされているのを見る機会が度々ある。その中で、気になっていたことが1つあった。それは、単一責任の原則(SRP)について、そうした議論の中では語られないが、『Clean Architecture』では言及されているキーワードの存在である。

そのキーワードとは、「コンウェイの法則」である。コンウェイの法則とは、メルヴィン・コンウェイの"How Do Committees Invent?"における以下の主張のことである。

システムを設計する組織は、組織のコミュニケーション構造をコピーした構造の設計を生み出す。*5

最近の記事や発表ではマイクロサービスアーキテクチャとの関わりで語られることの多いコンウェイの法則であるが、『Clean Architecture』において、SRPは以下のように、コンウェイの法則との強い結びつきがあるものとされている。

コンウェイの法則から導かれる当然の帰結。個々のモジュールを変更する理由がたったひとつだけになるように、ソフトウェアシステムの構造がそれを使う組織の社会的構造に大きな影響を受けるようにする。*6

コンウェイの法則を持ち出してSRPを説明するというのは、アンクル・ボブの旧著である『アジャイルソフトウェア開発の奥義』*7や『Clean Code』*8には見られなかったものである。これらかつての著作においては、SRPは「変更の理由」に関わる原則として説明されている。アンクル・ボブ自身、『Clean Architecture』において、「かつて……以下のように語られてきた」と前置きをしつつ、「モジュールを変更する理由はたったひとつであるべきである」*9と述べている。

『Clean Architecture』においても、「変更の理由」はSRPの中心的概念である。その点では、アンクル・ボブは一貫している。しかしながら、コンウェイの法則を持ち出している点は、上に掲げた3冊の単著のうち最新作である『Clean Architecture』にのみ見られる特徴である。本稿においては、『Clean Architecture』においてコンウェイの法則が持ち出されるに至った経緯を考えてみたい。

「変更の理由」とは人間である

アンクル・ボブによるSRPの説明にコンウェイの法則が持ち出されたのは、簡単に調べてみた限りでは『Clean Architecture』が初めてであるように思われる。ただし、「変更の理由」が人間であるということ、したがってこの原則が「人間に関するもの」であるということは、2014年に書かれたブログ記事において、アンクル・ボブが語っている。

この原則は人間に関するものだ。*10

この記事によれば、アンクル・ボブは70年代からの様々な論者による主張をまとめようとして、SRPを提唱するようになったという*11。その定式化が「変更の理由」によるものであったのだが、これが曖昧さを残すものだという思いがあったのだろう。前掲のブログ記事では、「変更する理由を何が定義するのだろうか」と問いかけたあと、『Clean Architecture』でも用いられている例を持ち出しつつ、以下のように述べている。

あなたがこの原則について考えを巡らせるときには、変更の理由は人間であることを思い出してほしい。変更を要求するのは人間なのだ。*12

『Clean Architecture』において、アンクル・ボブは、SRPが「どのモジュールもたったひとつのことだけを行うべき」とする原則だと誤解されがちである理由として、「名前があまりよくなかった」*13と述懐している。そうであるからこそ、「変更の理由=責務」という等置を『アジャイルソフトウェア開発の奥義』において明示する必要があったのだろう。責任、責務という単語は、不遇であったとも言える。しかし、責任(responsibility)という単語が、2014年のブログ記事において復権することになる。

プログラムの設計は誰に対して責任を負わねばならないのか?*14

単に「変更の理由」というよりも、変更の理由とは即ち人間であると述べる方が、より主張のポイントは明確である。この議論の発展を導いているのは、上の問いに他ならない。誤解を招く原因でしかなかった言葉は、2014年のブログ記事においては「人に対して責任を負う(responsible to)」という表現を用いることで、原則の意味をより特定的にする方向に利用されているのだ。その結果は、『Clean Architecture』において「アクター」という用語とともに定式化される。

モジュールはたったひとつのアクターに対して責務を負うべきである。*15

上記の主張は、『アジャイルソフトウェア開発の奥義』や『Clean Code』における主張よりも論理的に一歩踏み込んでいる。その進んだ部分は、ソフトウェアの外部に存在する人間を視野に入れた点にある。『Clean Architecture』においてコンウェイの法則ーーこれは組織とソフトウェアの相関を語る法則であるーーが持ち出されるようになったのも、この踏み込みを支えるものとして位置づけることができるだろう。

むすびに代えて:残された問い

以上、『Clean Architecture』における単一責任の原則(SRP)の説明におけるコンウェイの法則の引用について、それが生じた背景を2014年のブログ記事に依拠して検討した。

この記事が提起したいのは、「変更の理由とは即ち人間(アクター)である」という踏み込みを行うことで、『Clean Architecture』版(「アクター」バージョン)のSRPはより焦点を絞った原則となっているということである。「変更の理由」バージョンのSRP理解は正しくない、と主張するつもりもないし、「アクター」バージョンのSRPの方が有意義だと主張するつもりもない。ただ少なくとも、原則の焦点を絞ることによって、単に「変更の理由」と言っていたときには見えなかったものが見えてくる可能性はあるだろう。

なお、前節の末尾で結論じみたことを書いてしまったが、この記事での検討はコンウェイの法則を持ち出した意義までには踏み込んでおらず、したがって上記の結論はあくまで仮説に過ぎない。コンウェイの法則が果たしてアンクル・ボブの言うように「当然の帰結」としてSRPを導くものであるかも、まだよくわかっていない。この点については、改めて検討したいと思う。

参考)

http://labs.septeni.co.jp/entry/2017/02/21/164127labs.septeni.co.jp

*1:訳語は『Clean Architecture』に従った。

*2:『レガシーコード改善ガイド』の著者として知られる。

*3:アンクル・ボブがこの5つをまとめて紹介していたのは2000年頃まで遡れるようだ。

*4:名称だけは7月以前から知っていたように思うが、定かではない。

*5:ここに掲げた訳文は、『Clean Architecture』におけるものである。『Clean Architecture』159頁。コンウェイ自身による「コンウェイの法則」についての説明はConway's Lawを参照。

*6:78頁。

*7:原書は2002年出版。

*8:原書は2008年出版。

*9:81頁。

*10:"This principle is about people.":前掲記事より。

*11:前掲のブログ記事参照。

*12:"However, as you think about this principle, remember that the reasons for change are people. It is people who request changes.":前掲記事より。

*13:『Clean Architecture』81頁。

*14:"who must the design of the program respond to?":前掲記事より。

*15:『Clean Architecture』 82頁。