nikkie-ftnextの日記

イベントレポートや読書メモを発信

読書ログ | 『Clean Craftsmanship』 第6章 シンプルな設計、ここに詳しく書いてあったのか!

はじめに

3連休もう一回やらせて! nikkieです。

Clean Agile』を読み返していて、XPのテクニカルプラクティス「シンプルな設計」はあっさりしているという感想を持ちました(文字サイズにもよると思いますが、Kindleで5-6ページです)。
ふと『Clean Craftsmanship』を手に取ったときに6章で「シンプルな設計」のプラクティスをがっつり扱っていることに気づき、「これ読みたかったやつでは」と読んだログを綴ります。

目次

第6章 シンプルな設計

https://www.tumblr.com/asciidwango/693992928727760896/clean-craftsmanship

公開されている目次より

第6章 シンプルな設計
 YAGNI
 テストでカバーする
 表現の最大化
 重複の最小化
 サイズの最小化

シンプルな設計には4つのルールがあると導入され、「テストでカバーする」から「サイズの最小化」がUncle Bobの言葉による4つのルールの説明です。

シンプルとは

この章の導入は「シンプルな設計」の「シンプル」についてです。

シンプルは「簡単」という意味ではない。シンプルとは「もつれていない、絡み合っていない」という意味である。(Kindle版 p.262)

注にてClojureの開発者Rich Hickeyによる「Simple Made Easy」が言及されます。

なおMade Easyですが、

実は XXX Made Easy という表現は,入門書や宣伝・広告などのタイトルに常用される一種の定型句である.日本語でいえば『○○入門』『誰でもわかる○○』『単純明快○○』といったところだ.

#4263. ''XXX Made Easy'' というタイトル (1)より

なので、Rich Hickeyは「誰でもわかるSimple」という発表をしているのです。

この解説については以下のエントリをたびたび参照していまして、

Rich Hickeyの言うSimpleとはLEGOブロックのイメージでとらえています1
LEGOブロックのように1つ1つは単純なものを組合せてどんな大きなものでも作れるのが、今の私が理解しているシンプルです。

この章の冒頭でUncle Bobが言う「シンプルな設計」はRich Hickeyの言うシンプルと同じと確認できました!2

Uncle Bobは次のように説明します。

シンプルな設計とは、高レベルの方針が低レベルの詳細を知らない設計である。(Kindle版 p.262)

ここを読んでなぜ『Clean Architecture』が書かれたかその一端が分かったというか、Cleanシリーズの結びつきに気付きました。
これはHighLevelInterfaceを用意し、高レベルの方針は(低レベルの詳細ではなく)インタフェースに依存し、低レベルの詳細がインタフェースを実装することで実現します。

シンプルな設計のルール

ケント・ベックの4つのルールが紹介されます。
これは『エクストリームプログラミング』の14章(14.1)にあるものだと思います。
『Clean Agile』でもケント・ベックのルールが引かれています(認知負荷の話がされます)。

この4つのルールについて言い換え例も紹介されています。

書籍ではUncle Bobによる言い換えが読めます3
詳細は手にとって確認いただくとして、この記事では公開されている目次の4つをUncle Bobが言い換えたルールとして進めます

  • テストでカバーする
  • 表現の最大化
  • 重複の最小化
  • サイズの最小化

上ほど優先順位の高いルールです

Uncle Bobによる4つのルールの指南の感想・気づき

  • テストでカバーする
  • 表現の最大化
    • 本番コードの表現力を高める
      • 命名だけの話ではなく、アプリケーションに内在する抽象概念を表現する4
    • テストは本番コードが使用される文脈を伝える
  • 重複の最小化
    • 重複には2つある
    • 本物の重複は排除する
    • 偶然の重複は残す
      • いまはたまたま重複しているという理解(片方だけ変更しうる)
  • サイズの最小化
    • シンプルな要素は小さい。(Kindle版 p.277)

    • 具体的には関数の抽出(5章で抽出しまくると言及5

4つのルール(ひいてはシンプルな設計)は、ソフトウェア開発におけるパラダイム・シフトのように思えます。
1980年代〜1990年代はフックを仕込む実装が一般的だったそうです。
その理由は技術的な制約により変更しづらかったから(マシンパワーの低さによる)。
マシンパワーの向上によって、ビルドやテストコード実行に時間がかからなくなり、YAGNIや4つのルールが一般的になっていったという説明でした。
Uncle Bobも言っていますが、マシンパワーが向上してなんでもできるようになっているのに、開発においては「なんでもは作らない」がプラクティスになっているのは逆説的で面白いですね。

終わりに

『Clean Craftsmanship』第6章を読んで、シンプルな設計について探し求めていたUncle Bobの解説をインプットできました。

  • シンプルとはもつれていないこと(Rich Hickeyのシンプルと同じ意)
  • 6章の見出しに表されている4つのルール

「シンプルな設計」は『Clean Code』・『Clean Craftsmanship』(4つのルール)、『Clean Architecture』(もつれていない設計)とCleanシリーズの中に通底しているのかもしれませんね。


  1. Clojureと「Simple Made Easy」 - 紙箱

    Clojureの作者Rich Hickeyの「Simple Made Easy」の紹介記事。「シンプルと簡単は違う」「プログラムをシンプルにするには抽象化」。シンプルなプログラム=LEGOブロックのイメージ(組合せられるし、組合せの変更も用意)

    2020/06/16 19:58
  2. シンプルは難しい単語で、人によっては簡単なものをシンプルと言うので、こうして確認できたのは私としては大きな一歩です。非常に安心しました。そういえば、Uncle BobはClojureにも造詣が深かったような
  3. シリーズ1冊目の『Clean Code』からUncle Bobは4つの設計のルールに言及しているとのことでした。Cleanシリーズのつながりですね。
  4. ちょうぜつ本 5章のジェネリックFizzBuzzの例が頭によぎりました。
  5. 5章の読書ログはこちら