空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

Clean Architecture

色々な場所で話題に上がっていた Clean Architecture(原著)を読んだ。

自分自身、実は「自称・アーキテクト」として10年以上、とあるソフトのアーキテクチャを請け負っているので、自分の中に言語化されていないノウハウがそれなりにあった。私にとってうれしかったのは、それらの言語化できていたかったノウハウが多少言語化されて整理されていたことと、この本自体が割と広く有難がられていることである。個人的に役立ったのは Chapter 13 の Component Cohesion についてだった。

プログラムの設計を議論する場合、正論と正論が矛盾するという厄介なことがしばしば起こる。経験の浅い頃は、なぜそういうことが起こるのか分からず、結局最後までネチネチ煙に巻く人の意見が通ってしまい、後で苦労することになることがあった。あるいは、正論を盾に責任を果たそうとしない口達者にも手を焼いた。経験を積んでからは「ごもっともだけど、それは今重要じゃない」と言えるようになった。この本を読めば、REP-CCP-CRP 原則のテンション・ダイアグラムを持ち出して、何をすべきかをより明確に説明できることだろう。何よりも、3つの原則がそもそも緊張関係にあることが前提なところから話が始められるようになったこと、また、アーキテクトの仕事が一つの完全な正解を導くのではなくて、与えられた境界条件から、開発効率を最大化するためにパラメータを調整することであることを、共通の言葉で説明できるようになったことが大きい。

振り返ると、基盤中の基盤ライブラリは、社内向けであっても REP の原則を最初から厳守していたし、派生プロダクトのコードをフレームワークに追加するときには CCP の原則で外に括りだすことをお願いしたこともあった。そのような数々の技術的決断を、後から答え合わせする形で再定義できた。

新たな製品をデザインするときに、コアのロジックの議論に集中したいときに「バックエンドデータベースはどうしますか?」みたいな話が出たら、「The Database Is Detail. この本読んで」。みたいな使い方ができて捗るかもしれない(しないけど)。

あ、そうそう、この本できっちりと「a software architect is a programmer; and continues to be a programmer. (p.136)」と言い切ってくれたのも、この本が使える信用できると思った理由の一つだ。

告白すると、一応、タイトルに冠されてる Clean Architecture の章まではちゃんと読んだが、以降は斜体で強調されているステートメントと結論以外は斜め読みした。その他、コンポーネントの依存関係で、なぜ circular dependency が良くないかは、それらのコンポーネント群が、結局一つの塊としてコンポーネントになってしまって管理コストが上がることは、子供のおもちゃを使ってもっと簡単に説明できると思った。コールバックメカニズムを用いて依存性問題を解消する実装上のテクニックを dependency inversion と言って仰々しくするとってつけたようなコンサルタント用語の類も、頭の片隅に入れておけば十分である。それらは言語化されているという点で便利な概念だけど、まだ本質を掠めている程度であるからだ。蛇足を承知で言うと、導入の章でソースコードの行数をもって生産性の指標にしているのは単純化しすぎと感じた。なぜならば、コーディング技術が向上したりプログラミング言語そのものがバージョンアップして改良されたりすることで行数が圧縮されるのは、生きているソフトウェアでは起こりうることだからだ。そしてそれはアーキテクチャとは関係がない。

個人的には仕事柄この本はとても有益だった。一方で、この本を読んでポカンとして何も響かなくても、別にそれがダメとも思わないし、むしろ本書に出てくるキーワードでマウントをとるアーキテクトにならないようにしようと心に刻んだのだった。

Clean Architecture 達人に学ぶソフトウェアの構造と設計 (アスキードワンゴ)

Clean Architecture 達人に学ぶソフトウェアの構造と設計 (アスキードワンゴ)

Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series)

Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series)