Rのつく財団入り口

ITエンジニア関連の様々な話題を書いているはずのブログです。

【感想】『ちょうぜつソフトウェア設計入門 ――PHPで理解するオブジェクト指向の活用』:圧倒的表紙詐欺からのちょうぜつ深い設計入門

#ちょうぜつ本 を読み進める前に言っておく! (AA略

 2022/12刊行、エンジニア界隈でも話題になった本。著者の田中ひさてるさんがSoftware Design誌に連載した記事+アドベントカレンダー掲載の話+カラーページに同雑誌のちょうぜつエンジニアめもりーちゃんの連載分も掲載した、ソフトウェアの設計を深く深く追求した本となっています。
 表紙のキャラはちょうぜつエンジニアめもりーちゃん(銀髪?ロング姫カットの右側の子)とゆにっとさん(緑髪ショートにマリンルックの左の子)をメインに、ちょうぜつ技術書らしからぬ表紙。
 最初は「オッコンピュータ書籍に時々ある萌え絵の表紙でオタク系エンジニャ〜を釣るタイプの本でゴザルな。拙者こういう本もイケるクチでござるよデュフ〜」的なちょうぜつ軽い感覚で読み始めたのですが...

#ちょうぜつ本!

ちょうぜつエンジニアメモリーちゃん

  • めもりーちゃんはちょうぜつ謎スキルを持ってるそうですが、かけだしエンジニアだそうで実力が謎すぎる。割とダウナーに喋ってツッコミが多いタイプです。アニメの群像劇で女の子の中に一人いるタイプ! そして将来の夢がちょうぜつつよつよエンジニアでもなく、ちょうぜつアジャイルプロジェクトのプロダクトオーナーでもなく、ねこカフェのオーナー。謎すぎる...
  • 後輩のくるみクンは高性能AIということで、あ〜こういう頭に謎のユニットつけたAIっ娘て約束ですよねー。一生懸命Pythonを勉強しているのが初々しくて良き...ChatGPTクラスに至るのは何年後でしょう...
  • オブジェクト指向好きのゆにっとさんは海軍の制服みたいでかっこいいからセーラー服を着てるそうですが、キャラ属性とはどういう繋がりなんだろう。分割=組織=軍隊みたいなノリ?
  • 上司のこみっとさんは全員分のコードレビューをしてくれるという立派な上司。しかも眼鏡のお姉さんです。あ〜こんなマネージャーが上司だったら駆け出しエンジニア男子の生産性爆上がりだね!
  • 紫っ子のそけっとさんがインフラ担当、ゴスロリツインテという造形がちょうぜつヨシ! 所作が礼儀正しくてさらにヨシ。でもサーバールームとかでこの髪とかフリルとか引っかかっちゃったりしないか心配です...

 などとちょうぜつ脳死した感想を持ちながらカラーページをパラパラと読んでいました。そして続く本編は1章からあのClean Architecture。オッ序盤からいきなりちょうぜつ濃ゆいネタをぶっこんでキターーー!と期待しつつ読み進めるわけですが...

第1章 クリーンアーキテクチャ

#ちょうぜつ本 を読み進める前に言っておくッ!
 おれは今この本の凄さをほんのちょっぴりだが体験した
い…いや…体験したというよりはまったく理解を超えていたのだが…… あ…ありのまま 今 起こった事を話すぜ!
 おれは可愛い女の子キャラがわちゃわちゃするゆるいIT漫画を読んでいたと思ったら いつのまにかクリーンアーキテクチャを完全に理解していた…
 な… 何を言ってるのか わからねーと思うがおれも何をされたのかわからなかった… 頭がどうにかなりそうだった…
 ボブおじさんが1冊かけて熱く主張していることを1章だけでわかりやすく解説してるんだ ハローワールド1万回だとかそんなチャチなもんじゃあ 断じてねえ…
 もっと恐ろしいものの片鱗を味わったぜ…

あ……ありのまま今起こったことを(ry

 とあまりの衝撃に学習記録アプリStudyplusの読書記録に思わずJoJo第3部のネタを書いてしまっていたのですが、著者の方からTwitterで反応までいただきました(アホな読書記録でスンマセン...土下座)
 本当にそのとおりで、アーキテクチャの存在意義とは、動作には影響しないが変化への対応に重要であること、凝縮度や結合度や依存性の話などを経てあの有名な玉ねぎアーキテクチャの解説へ。その本質はオブジェクト指向をうまく活用したアドバイス的なもの、コンセプト的なものである...という話を読みやすい平易な日本語でしっかり解説しています。
 有名なUncle Bob御大の『Clean Archtitecture』も技術書としては翻訳は良い方ですが内容は難しいところもあります。あの本に挫折してしまった方、これからチャレンジという方もこの章はめっさ学びになるかと思います。

第2章 パッケージ原則

 複数のコードをどううまくまとめて再利用していくかの話。オライリー本の『ソフトウェアアーキテクチャの基礎』などだと「モジュール性」と呼ばれている言葉を本書では「パッケージ」と呼んで論じています。まあJavaだと言語仕様ではパッケージだし実質同じですね。

  • 再利用・リリース等価の原則:リリースされたものだけを再利用させる
  • 全再利用の原則:あるパッケージのかたまり内に加わった変更は、一部でなく全部使う。
  • 閉鎖性共通の原則:変更が必要なときはできるだけ1つのパッケージだけで閉じた変更で、それを交換すれば済むようにする。
  • 非循環依存関係の原則:パッケージ依存は循環してはいけない。
  • 安定依存の法則:依存方向はより安定したパッケージに常に向ける。
  • 安定度・抽象度等価の原則:安定度が高いパッケージは常に抽象度が高い。

 と、プログラミングをしているとなんとなく分かりそうなんだけどその裏にしっかり存在している原則を、ここでも分かりやすく言語化して述べています。あちこちにめもりーちゃんたちのイラストが添えてあってとても和みます。
 Clean Architectureの玉ねぎ図の一番外側のインフラストラクチャ層が不安定というわけじゃないんだよ、という話も載っていてありがたいです。

第3章 オブジェクト指向

 そしてゆにっとさんがアップを始めるオブジェクト指向の章。

  • 実はオブジェクト指向の正確な定義はない。名前でなく意味を掴むのが大事。
  • 相互に関連した知識をまとめるカプセル化
  • 過去の本に習って犬や猫のクラスを例にポリモーフィズムの話。
  • 最近は好まれなくなってきた継承も重要な要素である話、さらに汎化。
  • 歴史を踏まえた構造化プログラミングの話。

 今まで様々な本やインターネッツで色々語られてきて論争になったり誤解されてきたオブジェクト指向について、本書ではそもそも定義できないのだとズバッと斬り込んでしっかり解説しています。
 アラン・ケイ御大(コンピュータの父のえらい人)の似顔絵がなんか似てる...!  なおそけっとさんはコスプレも好きなようです。

第4章 UML(統一モデリング言語)

 僕はちょうど90年代終わり〜2000年代のオブジェクト指向が流行った頃にこのへんとJavaをガッツリやったクチなので、UML...何もかもが懐かしい...もうクラス図とシーケンス図しか見なくなったよね...と思いながら読みました。
 かつては緻密なUMLがそのままプログラミングになるという考えが流行った時代もあった、なんて書いてあって懐かしいです。当時もこういう新しい考え方を盲信する人はいて、そういう人に限って実際の実装はできなかったりしたもんでした。
 全部の章がそうなのですが、この章もイラストがついていて読みやすいです。このネタはインターネッツで頻出なんですが、本書は内容を書いている方とイラストを書いている方が完全に同一人物なんですよね。しゅごい...

第5章 オブジェクト指向原則 SOLID

Bobおじさん御大がアツく吠えている『Clean Code』や類書で語られているSOLID原則を語る章。

  • 単一責任原則:クラスとその責務は1対1である。ニュース記事のクラスを例に解説。
  • 開放閉鎖性原則:拡張に対してオープン、変更に対してはそのクラス内にクローズドであるべし。FizzBuzzを見事に抽象・具象クラスで分けて解説。
  • リスコフの置換原則:派生クラスは基底クラスの振る舞いを完全にカバーしなければならない。タスク表示のクラスを例に解説。
  • インターフェース分離原則:単一責任原則のインターフェース版。インターフェースは小さく。DBによって接続を変える例やデバイスの例で解説。
  • 依存性逆転原則:抽象の実装を活かすと依存の向きと制御の向きを逆にできる。これまで例に上げてきたクラス群で解説。

 文章も実装例もかなり工夫されていて読みやすいです。CleanシリーズだとBobおじさまのドヤ顔や熱く語っているさまを想像しながらSOLID原則を学ぶしかないところ、本書は可愛い女の子のイラストと一緒にちょうぜつマイルドに学ぶことができます。なんという福利厚生...人類の大いなる進歩だ!
 ちなみにめもりーちゃんはキーボードクラッシャーもイケるクチのようです。ますます謎すぎる...。そしてカメラを向けられると即座にピースをしちゃうそけっとさん、レイヤー歴はそれなりに長いのではないかという洞察を得ました。

第6章 テスト駆動開発

 変化に強いアーキテクチャオブジェクト指向、SOLID原則に基づいたコードを書いていけば、実際に動くかのテストも最小にしていける。ということでテスト駆動開発を解説していく章。多くの本ではテスト用ツールとしてxUnitが紹介され、実質Java用のJUnitがよく出てきますが、本書のコード例はすべてPHPPHPUnitが登場します。
 インターネッツでは他の意識高い言語と比べられてdisられることの多かった気のする(最近はそうでもないかな)オレたちのPHPで。PHPテスト駆動開発が学べる本が出る時代になったわけですよ!

  • 関数レベルのボトムアップで積み上げていく単体テストの考え方。
  • PHPUnit実践。演算をするMathクラスを例に様々なアサーションをしていく。
  • 振る舞いへの依存を分離ということで、MathUtilクラスはインスタンスの中に持ったMathクラスが演算の本体にするよう改良、疑似オブジェクトのスタブ、更に進んだモックの使い方。
  • 本来のTDDの考え方に従い、NumberConverterクラスをテストファーストで実装していく実例。
  • 前章で出てきたFizzBuzzを分離した見事なクラス群を題材に、仕様変更が入った際にテストファーストで直していく実例。結果としてシンプルなルール実装ができている。
  • TDDによってよりよいアーキテクチャが導き出される。

 僕もPHPUnitは基本的な機能しか使ったことがなかったので、スタブやモックの効果的な使い方は参考になりました。本章も実例で読者と一緒にTDDのコーディングを進める様子がCleanシリーズ的なのですが、非常に読者に寄り添った感じになっていて配慮されています。
 なおマネージャーのこみっとさんはランチはお手軽コンビニ弁当派、なんとなく家でも料理しないで冷蔵庫の中も食材ナシお酒が並んでたりして...的な休日の様子が推察できます。これは、年下の自炊男子が週末に行って世話するというシチュありの可能性が微レ存...。
 一方そけっとさんは、付き合ったら手作り弁当とか持ってきてくれそうで非常にヨシ!(現場猫のポーズで)

第7章 依存性注入

  • 依存性注入:オブジェクトが使う機能の実体をメンバ変数的に取得する際、外部から与えられるようにする仕組み。FizzBuzzを標準出力するFizzBuzzSequencePrinterクラスで解説。可読性・拡張性も上がり、使用と生成の分離で、単体テストもしやすくなる。
  • これを実現する仕組みがDIコンテナ。Spring FrameworkSpring IoCGoogle Guiceなどが有名。本書ではPHPSymphonyフレームワークにあるServiceContainerという機能を題材に解説。.yamlの設定ファイルに、このクラスのメンバには引数でこのクラスのインスタンスを注入するよ、というのを書いていく。
  • このオブジェクト生成の設定が自明なら設定ファイルも省略できる「オートワイヤリング」の例。

 DIか...Java全盛期に一時期話題になったけど結局あまり使わず来ちゃってスンマセン...と思いながら読みました。
 本書ではこれまで述べてきたオブジェクト指向アーキテクチャの話と結びつけ、うまく使うと非常に強力であることを解説しています。有効にDIを使えばゆにっとさんのように説明書ナッシングでもプラモが作れる!

第8章 デザインパターン

  • 各種原則の先の表現方法としてデザインパターンがある。有名なGoF本は1999年、古くなっているところもあるが時代を超えた普遍性も持っている。
  • 名前を持つ概念:
    • 要素を列挙する概念だけを抜き出したIteratorパターン。
  • 多態性を設計する:
    • 派生クラスは処理の穴埋めをするだけで多態性を表現できるTemplate Methodパターン。
    • 単一継承以上のものを可能にするBridgeパターン。
  • インスタンスを生成する:
    • 唯一のインスタンスしか使わないSingletonパターンは現代では使用機会が減ってきている。
    • 抽象化された動的なオブジェクトを工場クラスで作るAbstract Factoryパターン。
  • オブジェクトで構造を作る:
    • 複数のオブジェクト群への入り口をまとめるFacadeパターン。
    • オブジェクト同士の内部関係に着目したMediatorパターン。
  • 構造のオブジェクト間になるもの:
    • 他のクラスをメンバ変数で持って、透過的に振る舞いを拡張するProxyパターン。
    • 既存メソッドの振る舞いは同じで新しいメソッドを拡張するDecoratorパターン。
    • 同じ機能性を保ってインターフェースを変換するAdapterパターン。
  • データモデルの構造:
    • ツリー構造で使われる、自己再帰的なデータ構造のCompositeパターン。
  • クラスか高階関数か:最近の言語では使えるようになってきた高階関数でも、デザインパターンの意味と語彙は共通している。
  • どこで生成されどこで振る舞うか:
    • 継承を使わずにオブジェクトのバリエーションを得るStrategyパターン。
    • オブジェクトの状態変化で振る舞いを切り開けるStateパターン。
    • 異なる関心を持つ関係者がいる場合に使うCommandパターン。
    • 機能が完成済みのオブジェクトに追加拡張を可能にするObserverパターン。
    • 振る舞いをもった訪問者のオブジェクトを受け入れるVisitorパターン。
  • 再利用可能なオブジェクト指向ソフトウェア:邦訳時時はライブラリの再利用のように誤解されてしまうこともあったが、パターン名で意図を共有し設計の再利用性を高め、自分たちが作るソフトウェアの中身自体を再利用可能にしていくのが本来のタイトルの意図。

 ボリュームもあって内容も濃い章です。デザパタ本の原典か...Javaを学んだころに一生懸命読んだけどけっこう忘れてるな...ぐぬぬ...と思いながら読みました。本章もサンプルコードはすべてPHP2020年代の現在のプログラミングと設計技法の進化に併せ、現代の解釈で主要なパターンをGoF本とは違う順番でしっかり解説し、かつ今はもうあまり役に立たなくなっているよ、というパターンはバッサリ切ってコラムで紹介するに留めています。

 デザインパターンがもう古くなっている云々はよくネット上でも話題になりますが、本書では今も通用する普遍の本質もあり、かつ時代の流れで不要になってきたものも両方ある、というスタンスでしっかり論じてあります。これからの時代に設計力を高めたい方、特にPHP畑の方は古い本を一生懸命読むより、もうこの本を教科書にしていいんじゃないかというぐらいしっかり書いてあってしゅごい。
 小ネタとしては、ワイもよく読む異世界転生もの話がTemplate Methodパターンで解説してあってこれだ!と思いました。4人のキャラの働き方をデザパタに当てはめたネタも面白いです。

第9章 アジャイル開発

最後はこれまでの内容を実際の仕事に繋げていく話。

  • オブジェクトの分類:ドメイン駆動設計だけでなく、古い『エンタープライズアプリケーションアーキテクチャパターン』にも書いてある用語。Entity, Value Object, Service, Factory, Repositoryがある。
  • ドメイン駆動設計:現状を聞いて、モデル化し、コード化していく。
  • アジャイル開発:有名なマニフェストの真意を読み解いていく。これに参加したメンバーの定めた技術がアジャイルのコンセプトと繋がり、真摯に倫理的に正しい仕事をしていくふつうのことにつながっていく。
  • ウォーターフォールの幻影:あの方法論は存在しなかった。(なんだって〜!) そして誤解や改竄があった過去の歴史的経緯について。
  • 偽物のアジャイルにならないために:本物を見分ける。アーキテクチャの設計は動作のためのものでなく人のため、自分や仲間が開発を続けるためのものであり、そこからソフトウェアの価値が生まれる。そしてコラムでソフトウェア業界の歴史の話。

よく書評が上がる技術系ブログとして著名だと思う 【Magnolia Tech】 さんの記事に、9章があまりに名言のオンパレードだとあったのですが、実際に読んでみて全くその通りで名言の嵐でした。このちょうぜつな最終章は必読...! みなさんのご経験によって様々な読み方感じ方ができると思います。

blog.magnolia.tech

 僕はJavaオブジェクト指向がブームになった後、社内ではRailsショックとポストRails時代が起こらなかった世界線で外部から観察していた感じなのですが、最後の歴史のコラムがまた面白い。
著者の田中ひさてるさんご自身の談で、本書原稿執筆時点ではCleanシリーズ最後の集大成的な『Clean Craftsmanship』はまだ出ていなかったという話が出ているのですが、本書でのボブおじさん御大の動きの洞察がしっかり繋がっているのがまた凄いです。

まとめ:圧倒的表紙詐欺からのちょうぜつ深い設計の世界へ

 いやはや表紙と中身がぜんぜん違うという話は前から聞いていたのですが、実際に読んでみてちょうぜつ凄い本でした。
キーワードだけを並べればソフトウェア設計でおなじみの言葉が頻出してきますが、一冊の中で繋がったストーリーとして、しかも読みやすく分かりやすい日本語でスッと書いてあって洞察が深いのが本当にちょうぜつ凄い。小難しい専門書でなく、本書登場人物のめもりーちゃんやこみっとさんが脇で教えてくれながら進んでくれるイメージがあります。
 主な対象読者としては、冒頭にあるように任意のプログラミング言語で動くコードは書けるようになったけどより大きい粒度での設計力を高めたい中級者以上、どんな層の方にも役立つでしょう。ボブおぢさんのCleanシリーズ本に挑戦する前の予習にもなりますし、Cleanシリーズを読んだ後で理解できた方も理解できなかった方も復習になるかと思います。

 この系統の本というとサンプルコードの言語は...

  • Cleanシリーズや1版の『リファクタリング』『レガシーコード改善ガイド』『レガシーコードからの脱却』、最近だと2022年の『良いコード/悪いコードで学ぶ設計入門』などなど主流が歴史的経緯からだいたいJava
  • 2012年の懐かしの『リーダブルコード』がC++含め複数
  • 2011年の『アジャイルサムライ』、2020年の『ドメイン駆動設計入門』がC#
  • リファクタリング』は2019年の第2版になるとJavaScript
  • 2022年の『読みやすいコードのガイドライン』が変わり種でKotlin

と様々。こうした本の言語に取り上げられにくい不遇のPHP、オレたちのPHPがPHP8でフィーチャーされているのもグッドです。といってもオブジェクト指向アーキテクチャの話はそもそも言語に依存しませんし、PHP畑でない方にもそんなに躓かずに読めると思います。

 ITエンジニア本大賞2023の技術書部門大賞に『良いコード/悪いコードで学ぶ設計入門』が決定、2022/12の雑誌『WEB+DB PRESS Vol.132』で『オブジェクト指向神話からの脱出』が特集と、最近こうした設計分野が話題になる事が多いですが、またひとつ、ちょうぜつとんでもない良著が生まれてしまった感があります。
この手の本はいくら読んでも読んだだけ血肉になって力になります。イラスト目当てで挑戦するもヨシ、何度も読み返すのもヨシ、必ずや助けになるでしょう。

#ちょうぜつ本!

本書と関連する本たち: