きれいなコードは互いに似通っているが、クソコードはどこもその趣が異なっている

先日のJJUG CCC 2023 Fallの懇親会でクソコードを研究しているという学生がいたのだけど、クソコードの研究は難しいという話をした。
人工的にクソコードを再現しても、あの野生のクソコードのクソさには全く足りないわけで。

トルストイが言うように「すべてきれいなコードは互いに似通っているが、クソコードはそれぞれにクソの趣を異にしているものである」なので、なかなか「これがクソコード」のように類型化するのも難しい。
典型的なクソコードを書いてみても、なんだかきれいなクソコードができてしまう。

クソコードはネットに出回らないので、資料の収集もまた難しい。ネットにないということは、ネットの情報に基づいている「AI」もホンモノのクソコードには触れていないことになる。
クソコード収集サイトをつくっても、実際のクソコードは業務固有処理も含まれるので、掲載できる形に整理していくと本来のクソさが薄れて、ただの拙いコードになったりする。

ウンコード・マニアというサイトを教えてもらったけど、普通に拙いだけか、単に文化が違うとか見慣れない記述とかいうのも多い。 これなんかは、完全に本来のクソさが薄れてしまってますね。
[Java] 不動の精神-ウンコード・マニア

クソコードは、足りない技術力、足りない納期、足りなかったら怒られる仕様に歴史が積み重なって醸成されるものだと思う。

知識はないが仕様は満たさないといけない、納期はせまるというところに、窮鼠猫を噛むかのように生み出される創造力というのがある。
例えば文字列をソートするためにその名前でファイルを作ってファイル一覧をとってくる、というような、「なぜそれが書けてqsortが呼び出せないんだ!」みたいなことが稀によくある。これは「Windowsプログラミング入門」みたいな本にファイル操作APIは載っているんだけど文字列操作のC標準関数は載ってないみたいなところから発生しがち。これだけなら制約下の廃スキルエンジニアもネタで書きがちだけど、クソコードにはナチュラルに難読化がかかっている。
ともかく、クソコードでは想像を超えた発想力というのが発揮されていることが多く、なかなか人工的には作れないのであった。

また歴史の積み重ねにより難しいことをやってるように見えてx=xをやってるだけということもある。
値を加工する、仕様変更でさらに加工する、仕様変更でもう少し加工する、最後の仕様変更がなかなか難しいががんばって加工する、よくみたら元の値に戻ってるように見えるが怖くて触れない。
安易に削除してみると、目立たないように施された例外値の補正が外れてバグる。
こういう年月をかけて醸し出されたクソコードというのも、やはり再現は難しい。

こういったクソコードでの難読化、昔まとめていたな、と思ったら、これはもう18年前・・・
追っ手から逃れるシステム - きしだのHatena

JJUG CCCではこのイベントを発端としてクソコード談義が始まったのでした。 11/28-12/4でオンラインです。興味あるかたは是非。
Javaソースコードを読み、技術的負債の数値化に向けて和田卓人氏(@t_wada)と語ろうー複数日程 - connpass

まあ、未来人から見ればいま書かれてるコードはだいたいクソコードかクソコードの種なわけですが・・・

ちなみに、文中の「すべてきれいなコードは~」は、米川正夫版をベースにしました。

追記: ブコメにある「画期的な国産検索エンジン」はこちらの記事
HOWS「ISSEI(イッセイ)」 | 日経クロステック(xTECH)