読んだ : Clean Architecture 達人に学ぶソフトウェアの構造と設計 (Robert C. Martin 著)
Robert Cecil Martin 氏、いわゆるアンクル・ボブ (ボブおじさん; Uncle Bob) による Clean Architecture についての書籍。
Clean Architecture 達人に学ぶソフトウェアの構造と設計
- 作者: Robert C.Martin,角征典,高木正弘
- 出版社/メーカー: KADOKAWA
- 発売日: 2018/07/27
- メディア: 単行本
- この商品を含むブログを見る
アンクル・ボブの Clean Architecture といえば、下記記事を読んだことがある人も多いだろう。
ここ数年の Android アプリ開発界隈でも Clean Architecture はよく話題に上がっているように思う。 私自身も web 上で Clean Architecture について調べて学んだりしてきた。
しかし、web 上の情報を追いかけるだけだと、レイヤ分けや依存関係のルールはわかっても、より本質的な思想の部分まではなかなか理解できなかった。 例えば、「クリーンアーキテクチャにおいてサーバーとクライアントの構成にする場合にどういう扱いにするのが妥当なのか?」 というのは長年考えてきてなかなか自分の中で納得した答えは出せなかったもののひとつである。
本書を読むことで、Clean Architecture の本質的な思想についても深く理解できた。 また、そもそもの 「アーキテクチャとは何か?」 といった部分まで考えることができた。 ソフトウェアアーキテクチャについてより深い洞察を得たい人におすすめの一冊である。
本書の流れ
本書は、「設計とアーキテクチャは地続きのものであり、本質的な違いはない」 というところから始まる。 そして、構造化プログラミングや関数型プログラミングといったコーディングのパラダイムが説明される。 その後に設計の原則 (SOLID 原則)、コンポーネントの原則 (REP、CCP、CRP) についての説明がある。 ここまでが本書の前半である。
本書の後半では、前半の話を踏まえて、アーキテクチャの説明に入っていく。 アーキテクチャの話だけ読みたい人もいるだろうが、個人的には SOLID 原則や REP、CCP、CRP といった部分についても改めて学ぶことができて非常に良かった。
学びや感想
設計とアーキテクチャ、その目的について
1 章で、「設計とアーキテクチャについて、本質的には違いはない」 ということが言われる。 通常、アーキテクチャは下位レベルの詳細とは切り離された文脈で使用され、設計は下位レベルの構造や意思決定を意味しているが、実際のところ下位レベルの詳細と上位レベルの構造が全体の設計の一部になる。 そうした連続した構造がシステムの形状を定義するので、設計とアーキテクチャを明確に区別することはできない。 上位レベルから下位レベルまで決定の連続であり、その目的は下記の通りである。
ソフトウェアアーキテクチャの目的は、求められるシステムを構築・保守するために必要な人材を最小限に抑えることである。
ソフトウェアの振る舞いが正しいものであることを重視し、アーキテクチャを軽視すると、開発を続けていくうちに生産性がどんどん低くなっていく。 「振る舞いが正しいこと」 と 「変更しやすいこと (良いアーキテクチャ・設計であること)」 のどちらが重要であるかという質問に対して、ビジネスマネージャは、「振る舞いが正しいこと」 であると答えることが多く、開発者もそれに賛同することが多い。 しかし、下記のように考えると、より重要なものは 「アーキテクチャ」 である。
- 振る舞いが正しく、変更しづらい (アーキテクチャ・設計が良くない) プログラムは、今は正しくとも将来的な要件の変更に追従できなくなり、やがて役に立たなくなる。
- 振る舞いが誤っており、変更しやすい (アーキテクチャ・設計が良い) プログラムは、今の正しくない振る舞いを正しく修正することも容易であり、将来的な要件の変更にも追従しやすく、長く価値を保つ。
開発者以外に対してアーキテクチャ・設計の重要性を説明することは非常に難しいと思っていたが、上記の観点で説明すると結構説明しやすい気がした。
優れたソフトウェア開発チームは、真正面から闘争に立ち向かう。 ステークホルダーたちと対等に、ひるむことなく口論する。 ソフトウェア開発者もステークホルダーであることは忘れてはいけない。 保護すべきソフトウェアに対する責任がある。 それが、あなたの役割であり、義務である。 それが、あなたが雇われている大きな理由だ。
『開発者はスクラッチからシステム全体を再設計することが答えだと考えているかもしれないが、それもまたウサギのやり方だ。 崩壊をもたらした自信過剰が、今度は競走をやり直せばもっとうまく構築できるという話に変わっている。 現実はそれほどうまくはいかない。』 せやぞ#書籍 #CleanArchitecture
— Nobuoka Yu (@nobuoka) 2018年10月15日
ソフトウェアの 1 つ目の価値は 『ふるまい』 で、2 つ目の価値は 『アーキテクチャ』。 ふるまいは緊急ではあるが重要ではない。 アーキテクチャは緊急ではないが重要。 後者の方が優先度は高いが、前者の方が優先度が高いと勘違いしてしまうことが多い。 なるほど。#書籍 #CleanArchitecture
— Nobuoka Yu (@nobuoka) 2018年10月15日
テストと反証可能性について
Dijkstra は 「テストはバグが存在しないことではなく、バグが存在することを示すものである」 と述べた。 つまり、テストによってプログラムが正しくないことは証明できるが、プログラムが正しいことは証明できないのである。 テストに十分な労力をかけていれば、そのプログラムは目的のために十分に真であるとみなせる。
この事実は、驚くべきことを示している。ソフトウェア開発は、数学的な構成要素を操作しているかのように思えるかもしれないが、実際には数学的な試みではない。 むしろソフトウェア開発は科学のようなものである。 どれだけ最善を尽くしても正しくないことを証明できないことによって、その正しさを明らかにしているのである。
数学的なアプローチか科学的なアプローチか、という観点は持っていなかったので、「なるほどー」 と思った。
最小の機能から最大のコンポーネントまで、あらゆるレベルにおいて、ソフトウェアは科学のように、反証可能性によって動かされている。ソフトウェアアーキテクトは、簡単に反証できる(テスト可能な)モジュール、コンポーネント、サービスを定義しようとする。そのために、さらに上位のレベルにおいて、構造化プログラミングのような制限を課している。
だからこそ、小さな粒度から大きな粒度まで、あらゆるレベルで反証可能な形で部品化することが重要。 TDD の利点って、この 「反証可能な形で部品化する」 ということをサポートしてくれるからなんだろうな。 『TDD で綺麗な設計に近づける』 と漠然と思っていたけど、すごく納得した
— Nobuoka Yu (@nobuoka) 2018年10月15日
単一責任の原則
SOLID 原則の一つである単一責任の原則 (SRP) について、「たった一つのことだけ行うべき」 だと思っていたけど、正しくは 「モジュールが責務を負うべきアクター (ソフトウェアの変更を望む人たちのグループ) がひとつだけになるようにすべき」 ということだった。 アクターをどう定義するかが難しい気もするけど、アクターの定義をどうするかを含めてしっかり考えていく必要があるんだろうなぁと思う。
複数のアクターが使用するコードが存在すると、あるアクターのための変更が他のアクターに想定外の影響を及ぼしてしまう、ということ。 SRP を完全に理解した。
— Nobuoka Yu (@nobuoka) 2018年10月15日
コンポーネントの原則
再利用・リリース等価の原則 (REP)、閉鎖性共通の原則 (CCP)、全再利用の原則 (CRP)、初めて聞いたな。 コンポーネントの凝集性に関する原則。 再利用性、保守性、それからコンポーネントの変更による他コンポーネントへの影響を小さく保つことの 3 つのバランスをどうとるか#書籍 #CleanArchitecture
— Nobuoka Yu (@nobuoka) 2018年10月16日
『安定度・抽象度等価の原則 (SAP) : コンポーネントの抽象度は、その安定度と同程度でなければいけない。』
— Nobuoka Yu (@nobuoka) 2018年10月16日
抽象的で安定しているか、具体的で不安定かのどちらかがよい。 コンポーネント版の DIP のためにこれが必要。#書籍 #CleanArchitecture
アーキテクチャについて
アーキテクチャについては、下記の内容が非常に刺さったり共感するものだった。
- アーキテクチャはユースケースを叫ぶものでなければならない。 どういう技術を採用するかということに意識がいきがちだけど、重要なのはユースケースであって、どういう技術を採用するかではない。
- アーキテクトとしては詳細の決定はできるだけ遅らせるようにすること。 DB に何を採用するのかとか、通信プロトコルに何を採用するのかなど、そういったものは技術的な実装詳細であり、優れたアーキテクチャはそれらの決定を遅らせられるものである。
- 入出力はテストしづらい部分なので、依存関係の一番外側に持ってくること。
- フレームワークへの依存は避けるべき。 フレームワークは実装詳細であり、アーキテクチャとして重要なものではない。
つまり、冒頭で述べた私のこれまでの疑問の話で言うと、(クライアントとサーバーの両方で一つのソフトウェアなのであれば) クライアント・サーバー間の通信なども詳細であり、アーキテクチャとしてはクライアントもサーバーも含めてユースケースを考える、というのが優れたアーキテクトとしての姿勢なのだと感じた。
ツイートメモ
『アーキテクチャの主な目的は (中略) システムのライフタイムコストを最小限に抑え、プログラマの生産性を最大にすることである。』
— Nobuoka Yu (@nobuoka) 2018年10月16日
アーキテクチャと技術的負債は対応関係にありそう。 『エンジニアリング組織論への招待』 でもそう書かれてた気がする#書籍 #CleanArchitecture
『レイヤーやユースケースを切り離す方法はいくつもある。 ソースコード (ソース) レベル、バイナリコード (デプロイ) レベル、実行単位 (サービス) レベルで切り離すことができる。』 『システムの切り離し方式は時間とともに変化する可能性』 選択肢を残すことが大事#書籍 #CleanArchitecture
— Nobuoka Yu (@nobuoka) 2018年10月16日
ここで言われる保守性を高めることこそがアーキテクチャでありアーキテクトの仕事であろうなー。 その仕事には基本設計も含まれるんだけど、詳細設計やコーディングをできない人がアーキテクチャを考えることは難しい。
— Nobuoka Yu (@nobuoka) 2018年10月18日
https://t.co/of3FgtGEV8
もっと戦略的に事業の展開を予測しながらアーキテクチャを考えていくということをしていく必要性を感じているけどその水準に全然達していない
— Nobuoka Yu (@nobuoka) 2018年10月18日
『優れたソフトウェアアーキテクチャがあれば、フレームワーク、データベース、ウェブサーバー、その他の環境の問題やツールの意思決定を延期・留保できる。 フレームワークの選択肢は残されたままだ。』
— Nobuoka Yu (@nobuoka) 2018年10月22日
いいこと言ってる。 アーキテクチャはユースケースをサポートする。 #書籍 #CleanArchitecture
生まれてから一度もフレームワークに依存したいと思ったことはないんだけど、わりとフレームワークに依存してアプリケーションを書きたがる人が多いように思う。
— Nobuoka Yu (@nobuoka) 2018年10月22日
『システムアーキテクチャがユースケースをサポートするものであり、フレームワークから少し距離を置いたものになっていれば (中略) テストを実行するためにウェブサーバーを起動する必要はない。 テストを実行するためにデータベースに接続する必要はない』
— Nobuoka Yu (@nobuoka) 2018年10月22日
早くここにたどり着きたい
Humble Object パターンって初めて聞いた。 (みんなやってることではあるけれど。)
— Nobuoka Yu (@nobuoka) 2018年10月23日
描画処理などのテストしづらい処理をテストしやすい処理を担うクラスとテストしづらい処理を担うクラスに分けて、後者を控えめ (humble) にしておく、というもの。 Presenter と View とか #書籍 #CleanArchitecture
『ORM システムはどこに属するのだろうか? もちろんデータベースのレイヤーだ。実際、ORM はゲートウェイインターフェイスとデータベースの間に Humble Object の境界を作るものである』
— Nobuoka Yu (@nobuoka) 2018年10月23日
JPA とかはこの思想にそぐわなくてあんま好きになれないんだよなー。 #書籍 #CleanArchitecture
『作者にとって、フレームワークとの結合には何のリスクもない。』 『さらに作者は、あなたに対してもフレームワークとの結合を望んでいる。 (中略) 作者にとって、自分の作った基底クラスを大勢のユーザーが継承することほど、自尊心が満たされることはない』
— Nobuoka Yu (@nobuoka) 2018年10月26日
激しい#書籍 #CleanArchitecture
フレームワークなんかと結婚するな!
— Nobuoka Yu (@nobuoka) 2018年10月26日
#書籍 #CleanArchitecture
クラス・インターフェイスごとには同じような依存関係を持たせるにしてもどこでコンポーネントを切るかでいろんなパターンになるという話。 わかりやすい図だ。 #書籍 #CleanArchitecture pic.twitter.com/M9veKX5eZM
— Nobuoka Yu (@nobuoka) 2018年11月3日