Link: johnousterhout/aposd-vs-clean-code

GitHub - johnousterhout/aposd-vs-clean-code: A discussion between John Ousterhout and Robert Martin about differences between John's book "A Philosophy of Software Design" and Bob's book "Clean Code".

"Philosophy of Software Design" aka POSD の著者 John Ousterhout と "Clean Code" の著者 Bob Martin が GitHub 上で文通をした結果が HN に流れてきたので興味深く読んだ。

しょうじき内容自体はそんなに興味深くはなかったが、著者同士が直に議論をするフォーマットは好感が持てた。みてこの commit history. ふたりで仲良くやってんじゃん、ほほえましー。

内容としては John Ousterhout が Clean Code のいくつかの主張を攻撃し、Bob Martin がそれを擁護するという展開。これだけ読むと John Ousterhout は随分ぶしつけだな・・・と思ってしまうが、Clean Code が年月を経て(一部で)権威化したという事実を踏まえると、まあいいんじゃないか。

内容への感想はどうかというと、厳密な TDD (テストを先に書く) は無益有害というのは、そうですねと頷く。

TDD は、単体テストが一般的でなかった頃に行われたアジャイル過激派による thought provoke 目的のアクティビズム/カルトなので、単体テストが一般化した昨今に真顔で主張を貫き続けるのは厳しい。一方、その時期のアクティビズムに傾倒して価値観を内面化しすぎたおっさんはなかなか抜け出せない。Bob Martin のコメントを読むと泥沼感が伝わってくる。

個人的には Bob Martin が変に言い訳せず「TDD は・・・ワシの青春なんじゃよ・・・ッ」って俯きがちに吐き捨てればみんな涙をウルっとさせて許してくれると思うんだけど、そういう non-verval communication ができないのは文通スタイルの限界かなと思う。どのみち John Ousterhout はそういう emphathy なさそうなのでダメかもしらんが。読者は許してくれるよ。たぶん。

Clean Code 再読 (しなくていい)

自分は POSD はそんな好きでもなく過去の2つくらい苦情を書いている。

上の悪口を書いたあと、フェアネスのためにいちおう Clean Code も再読したのを思い出した。今よむと、なんというか、かなりどうでもいい本だったね。いま売れ行きを気にせずタイトルをつけるとしたら「Uncle Bob の Java Style Guide Java 5 Edition」みたいなかんじだろうか。

昔の、Java の言語機能がショボく、かつ最先端がゴテゴテエンタープライズフレームワークに振り切れつつ、もう一端では static おじさん (死語) みたいな人々がゴミコードを量産していた時代には、こういう議論は新鮮で、意味があった。でも Java がプログラミングの主役の座をよりモダンな言語に譲り、また言語に限らずフレームワークとかも市場原理の力で OSS のシュッとしたデザインが標準となった昨今、こんなこまっちいルールとかどうでもよくね・・・と思ってしまう。

「Uncle Bob の Style Guide」と言ったのは、議論の粒度が Google Java Style Guide みたいなんだよね。こういうのには別にいいとか悪いとかはなくて(あるが)、それよりは誰かが決めて一貫させておき、無駄に消耗しがちな論争を予防する役割がある。Clean Code も、OSS 隆盛以前のエンタープライズ Java が主役だった時代には一定程度そうした役割を果たしただろうし、その当時どこかの CTO や TL が「うちの Java は Clean Code で行く!」とか言い出してドグマを押し付けてきても、会社や開発チームくらいの粒度なら一貫性の価値が抑圧の被害に勝ったかもしれない。

ただ「残念なエンタープライズ Java 暗黒時代に射した希望の光」という文脈を超えて人々が Clean Code を信奉しすぎた結果、そのドグマによる抑圧と思考停止の被害が広がりすぎた。John Ousterhout はそこに苦言を呈したと言える。

文脈

文脈といえば、そもそもこの二人の話が噛み合うはずも無いよなあ。BM は言うまでもなく Enterprise Java の人である。一方の John Ousterhout は OS のカーネルや分散システムインフラの人。価値観が違うし、その違いは分野の要件の違いを反映している。

たとえば Bob Martin が「複雑さ」と言ったとき、その複雑さは Enterprise の複雑さであり、ビジネスロジックの複雑さである。ビジネスロジックの複雑さというのは数学的な複雑さというより、慣習や法規や歴史的経緯などなどによって積み重なった幾千の、時に理不尽な、そしてコロコロ変わる、ルールやフローである。そういう問題を、なんとかしてモデルを作って理解・保守しようと試みるというのが、たとえば DDD / Ubiuqitous Language であった。

一方の OS や分散システム。OS のシステムコールとかそんなコロコロ変わらない。一方で下位互換性、しかもコードレベルじゃなくてバイナリ互換性、みたいのを求められる。そりゃ「細かくメソッドわけて」とか言われたらキレたくなるし、「深いインターフェイス」みたいなこと言い出すのもわかるわ。ioctl() とかモダン言語を生きる人から見たらゴミかもしれないけれど、色々仕方ない面はある。

John Ousterhout の複雑さ、分散システムの複雑さというのは、アルゴリズムの複雑さであり数学的な複雑さである。John Ousterhout は合意形成アルゴリズム Raft の論文を共著したガチ勢で、授業でも Raft を書かせているらしい。John Ousterhout にとってプログラムの複雑さといったらこういうやつなわわけ。分散アルゴリズムのような、ある意味「本質的な複雑さ」は、ちょっとコードをリファクタリングしたくらいでは解決しない。だから Clean Code を読んでもピンとこない。

でも Bob Martin のいってる複雑さはそれじゃないのだよ。もっと世俗的で、しょーもない複雑さなんだよ。そしてわけもなくしょっちゅう変わるんだよ。Raft とかアルゴリズムをいじろうと思ったらもう一本論文かける勢いだけど、「ビジネスロジック」とかもう毎週みたいな勢いで変わるわけじゃん。そういう「モデル」を破綻させないのも何らかのスキル。扱っている複雑さの種類が違う。

ただこうした複雑さの多様性を理解していないのは John Ousterhout だけでなく、Bob Martin も同じである。先の議論で、John Ousterhout は Clean Code に載っていた素数計算のコードを非難している。曰く、リファクタリング結果が解りやすくなっていない。

この批判は正しい。件のコードは Knuth の改良版 sieve で、ある種のアルゴリズム的複雑さを孕んでいる。Bob Martin はコードをいじりながらロジックを理解したが、それはコードをいじるという行為が理解を助けただけで、第三者にとってのわかり易さを助けていなかった。こうした、エンタープライズとは違う「複雑さ」への無理解と、無理解に伴う傲慢さを John Ousterhout は嗅ぎつけた。Bob Martin が文通の中で「わかりやすいバージョン」としてレイテンシを倍にする悪手をうち、John Ousterhout がブチ切れる一幕がある。Bob Martin の感度の低さが伝わってくる。アルゴリズムの教科書に載ってるコードが難しいのは、それなりにわけがあんのよ。

一方で、John Ousterhout がエンタープライズ Java... じゃなくてもよくて Android でも Web でもなんでもいいんだけど、アプリケーションレイヤで客や PM の突きつけてくる無理難題をそつなく取り込みつつ肥大化していくコードベースの秩序を保つとか、出来るとは思えないのだよね。そして John Ousterhout のまわりにはそういうのに興味ある人いなそうじゃん?同僚にも生徒にも。 CMU ならともかく Stanford の分散コンピューティングの研究室だからねなにしろ(スタートアップやってる卒業生の話とか出てくるけど)。Bob Martin と話が噛み合わないのもやむなし。

内省

John Ousterhout も Bob Martin も、わりかし限られた文脈で話をしていた。Clean Code が「Uncle Bob の Java Style Guide Java 5 Edition」で、Philosophy of Software Design が 「Prof Ousterhout のインフラレイヤプログラミングガイド」とかだったらなんの喧嘩も起きなかった。(後者の方が若干カッコいいが、それは時代なので仕方ない。)

どちらも主語がデカすぎた。

翻り:これは専門家、第一人者になることの対価だと見ることも出来る。Bob Martin は、今はさておき当時は Java, Agile 界の第一人者だった。John Ousterhout は...どうみてもガチ専門家なわけです。そうやって自分の世界に深く切り込んでいる人々が他の分野に多少疎いのは仕方ないし、自分の立場に強い信念があるのも分かる。自分とかなんの専門性もなく鼻ほじりながら外野で騒いでるだけなので好き勝手言ってるけど。

ついでにいうと二人とも割といい年である。 John Ousterhout は年齢を超越した謎の現役感があるのに対し、Bob Martin は年相応にセミリタイア、メンテナンスモードの風情がある(ウェブサイトとか)。二人とも 70 過ぎてこんなガシガシ GitHub 文通やってるのすごいよね。

とはいえまだ先の長い我々はあまり年寄りの話を真に受けすぎず、もっと現役な人々の声に耳を傾けるほうが良いのではないか。Ageism と言われたら言い返せないけど、もしかしたらこの文通も「おまえら若者が Clean Code vs POSD とか言って時間を無駄にしないように年寄り同士で話をつけて SEO も済ませたから前を向いて生きなさい。」というメッセージ、かも、しれないですよ?