0. この投稿の概要
"A Philosophy of Software Design"というソフトウェア設計の本を読んだのでその感想をまとめます。以下のような特徴を持った本で、多くの方におすすめできる一冊です。
- 「ソフトウェアの複雑さを減らす」という明確な目的の元で設計の原則が説明されるので頭に入ってきやすい。
- コンパクトにまとまっている。ペーパーバック版で190ページです。(値段もkindle版は安い!)
- 多分翻訳書は出ていないと思いますが、英語が平易で難なく読み通せます。馴染みのない単語も1ページに1個あるかないかというレベルでした。
1. 学んだこと
設計の方針
- 概要に書いた通り、本書は複雑さ(complexity)を減らす設計を目的として設計の原則を説明しています。本書での複雑さは「ソフトウェアシステムの理解や修正を難しくするもの」と定義されています。
- 複雑さへの対応策として2つの方針が説明されます。1つはコードをシンプルかつ明解(obvious)に書くこと。もう1つはカプセル化、モジュール化によって個々の独立性を高めること。
- Strategic programming: 動くだけでなく、より良い設計をすることを目的とすること。そのためにも多少の時間的な投資を厭わない。対義語はまずは動くものを作ることを目的とするTactical programming。
- 以下の原則は特に心に刻んでおきたいところ。
software should be designed for ease of reading, not ease of writing.
deep module
- 本書で紹介される原則の中で最も目を引かれたのがdeep moduleというもの。これは複雑さを減らすためのモジュール化の基本的な考え方です。ここでいうモジュールはclassや関数、あるいはより大きなサービスを指します。
- モジュールはインターフェースと実装(implementation)に分けて考えることができ、シンプルなインターフェースでより機能的な実装を持つモジュールがdeep moduleとのこと。
- インターフェースは他の技術者(あるいは将来の自分)がモジュールを使う際に読まなければいけないコストで、実装はモジュールを使うことで得られる利益と考えられる。そのためdeepであるほどコスパがいいというわけです。
- 統一のインターフェースでより多くの機能をカバーするために、モジュールを設計する場合は今必要な機能に特化せず、少し一般化させると良い。
- 情報の秘匿(information hiding)とdeep moduleは表裏一体。より多くの情報を隠せばモジュールの機能性は向上するが、そうでなければインターフェースが複雑になる。
- 例外もインターフェースの一種であるとし、必要最低限の例外に絞ることが推奨されます。
- コメント、特にインターフェースに対するコメントは重視されています。コメントは抽象化の一種で、コメントが不十分でコードを読む必要があるなら抽象化が機能していない。
- deepにするためにインターフェースをシンプルに保てるならモジュールを大きくすることも推奨されます。本書でも触れられてますが、既存の設計本ではモジュールを細かく分けることが推奨されることが多く、反対意見も多くあることが予想されます。
2. 感想
- ソフトウェア設計本といえば様々なテクニックが雑多に紹介されて500ページ以上あるという印象を自分は持っており、正直言ってまともに通読できたことがありませんでした。本書はコンパクトで一貫した内容になっており、ようやく自分が読める設計本に出会えたという気持ちです。
- 190ページとは思えないほど多くのことがカバーされていますが、自分はやはりdeep moduleという原則を今後は特に意識していきたいと思います。またアジャイル開発をしていると成果を出すためにTacticalな考え方になりがちな点も反省したいです。
- 著者はスタンフォード大学の教授でソフトウェア設計のクラスも受け持っているとのこと。google groupで本書の内容について継続的な議論をしているようなので、今後のアップデートにも期待できそうです。
- 参考: 著者のgoogleでの講演