// TODO: fix this later
——プログラマーのポエマイゼーション:コードの中に棲むポエムたち

シライショウタ(ポエマイゼーション:ソノダマリ)

ソノダマリがポエマイゼーションを定義した。事実がポエムに変わる6つの操作——補填、翻訳、蒸発、消去、変装、増幅。不動産広告、高校パンフレット、SaaSのランディングページ。50本の記事で、ポエムは「広告の言葉」だった。

しかしエンジニアの俺は知っている。コードの中にもポエムがある

変数名。コメント。コミットメッセージ。README。エラーメッセージ。プルリクエストの説明文。プログラマーは毎日、コードの「外側」にある言葉を書いている。そしてその言葉は——驚くほど頻繁に——ポエム化している。

変数名のポエマイゼーション——名前は嘘をつく

isHappy は本当にハッピーか

まず変数名の話をする。プログラマーにとって変数名は「事実のラベル」だ。中身がユーザーの年齢なら age、注文の合計金額なら totalPrice。事実に名前をつける。それだけのはずだ。

しかし現実のコードベースを見てみろ。

変数名 名前の主張 実態 操作
tempVar 「一時的な変数です」 3年間「一時的」のまま本番稼働中 変装
data2 「データの2番目です」 dataが何かも2が何かも不明。書いた本人もすでに退職 蒸発
isHappy 「ハッピーかどうかの判定」 何がハッピーなのか、何の状態を指すのか、コードを500行読まないとわからない 補填
utils 「便利な関数を集めた場所」 分類不能なコードの最終処分場。3,000行 変装
fixedValue 「修正された値」 いつ、なぜ、何から修正されたのか誰も知らない 消去

ソノダがDXポエム#4でカタカナ暗号辞典を作ったとき、「アジャイル」=「なんか速そう」と書いた。変数名も同じだ。tempVar=「なんか一時的っぽい」。data2=「なんかデータっぽい2番目のやつ」。名前が事実を伝えるのをやめて、印象だけが残っている。これがポエマイゼーションでなくて何だ。

マンションの「上質がそびえる」は、何がそびえているのかわからない。
data2 は、何のデータの2番目なのかわからない。
構造的に同じだ。

コメント暗号辞典——プログラマーの匂わせ

不動産広告に匂わせ暗号があるように、コードにもある

ソノダが匂わせ暗号で不動産広告の暗号辞典を作った。「閑静な住宅街」→「駅から遠い」。「日当たり良好」→「他にアピールポイントがない」。広告の言葉を平文に戻すだけで、景色が変わった。

コードのコメントにも、まったく同じ構造がある。以下にプログラマーのコメント暗号辞典を提示する。

暗号(コメント) 平文(実態) 操作
// TODO: fix this later 永遠にfixしない。「later」は来ない。マンション広告の「近日公開予定」と同じ 変装
// FIXME 壊れていることは認識している。修理する予定はない。「FIX」と書いてあるが、動詞ではなく祈りだ 変装
// HACK 汚いコードだと書いた本人が認めている。しかし「HACK」と書いた瞬間、汚さが「臨時の創意工夫」に変装する。永遠にハックのまま 変装+増幅
// This shouldn't happen 起きている。起きているからこのコメントを書いた。「起きないはず」は願望であって事実ではない 消去
// Don't touch this なぜ動いているか誰も理解していない。理解していないものを壊す勇気がない。恐怖が禁止令に変装している 変装
// Temporary workaround 恒久的な解決策。「Temporary」は「今の自分にはこれが精一杯です」の変装。2019年から稼働中 変装
// For legacy reasons なぜこうなっているか誰も知らない。「レガシー」と言えば説明責任が消える。過去のせいにする消去術 消去
// Refactor this リファクタリングが必要だと知っている。しかしリファクタリングのチケットが作られることはない 変装
// Magic number なぜ42なのか、なぜ1024なのか、誰も覚えていない。「マジック」は「説明不能」の増幅。ハリーポッターではない 増幅
// Good enough 良くない。しかし締め切りが近い。「Good enough」は「これ以上は無理です」の変装 変装

気づいただろうか。圧倒的に「変装」が多い。不動産広告の匂わせ暗号は「変装」と「消去」が主だった。コードのコメントは変装がさらに濃い。理由は明白だ。プログラマーは自分のコードの弱点を知っている。知っていて、コメントで名前を変える。「壊れている」を「FIXME」に。「汚い」を「HACK」に。「永遠に直さない」を「TODO」に。

「閑静な住宅街」は「駅から遠い」の変装。
// TODO: fix this later は「永遠に直さない」の変装。
不動産屋とプログラマーは、同じ修辞技法を使っている。

READMEのポエマイゼーション——「Easy to use!」は本当か

READMEはプロダクトのマンションポエムだ

GitHubのREADMEは、オープンソースプロジェクトの「広告」だ。リポジトリを訪れた人が最初に読む文章。3秒で印象を伝える必要がある。

……これ、ソノダがDXポエム#1でSaaS LPについて書いたことと一字一句同じだ。

READMEの表現 平文 操作
Easy to use! ドキュメントは200ページ。セットアップに3日かかる。「Easy」の定義が書いた本人の基準 補填+変装
Blazing fast ベンチマークは特定条件下での最良値。「普通の日」の速度は書いていない 消去
Well-documented READMEが長い。それ以外のドキュメントは3年前で更新停止 補填
Battle-tested 本番で使ったことがある。壊れて直した回数は言わない 変装+消去
Lightweight 依存パッケージが50個。「Lightweight」は相対的なポエム 変装
Zero configuration デフォルト設定で動く。ただしデフォルト設定では実用に耐えない 消去
Production ready テストカバレッジは聞くな 補填

ソノダが高校パンフ#2で発見した法則を思い出してほしい。弱いほどポエムが饒舌になる。偏差値が低い高校ほどパンフの言葉が増える。

READMEも同じだ。本当に使いやすいライブラリは「Easy to use!」とは書かない。コード例を3行書いて、それで伝わる。「Easy to use!」と書く必要があるのは、コード例だけでは伝わらないからだ。

高校パンフの「文武両道」は、文武両道でない学校が使う。
READMEの「Easy to use!」は、使いにくいライブラリが使う。
ソノダの補填の法則は、コードの世界でも成立する。

エラーメッセージの消去術——「Something went wrong」

何が起きたか教えないという選択

エラーメッセージは、ソフトウェアの「謝罪会見」だ。何かが壊れたとき、ユーザーに状況を伝える。少なくとも、そういう建前だ。

エラーメッセージ 平文 操作
Something went wrong 何が起きたか開発者もわからない。わからないので「何か」と書いた。情報量ゼロ 消去
An unexpected error occurred エラーが「想定外」だったのは開発者の側の事情。ユーザーにとっては「アプリが壊れた」だけ 変装
Please try again later 「later」にやっても直っている保証はない。// TODO: fix this later の「later」と同じ永遠 変装
Contact support for assistance サポートもわからない。あなたのチケットはキューの437番目 消去
Error: null エラーメッセージが null。エラーを通知する仕組み自体がエラーを起こしている。存在論的な悲劇 消去

ソノダがS2#10で見出した「消去」の操作——都合の悪いものを意図的に消す——が、エラーメッセージでは最も強く効いている。マンション広告が隣のビルを写さないように、エラーメッセージはエラーの原因を書かない。

ただしマンション広告と決定的に違う点がある。マンション広告の消去は意図的だ。チラシの構図から隣のビルを外すのは、わかっていてやっている。エラーメッセージの消去は、多くの場合能力不足だ。何が起きたかわからないから書けないのだ。

マンション広告の消去:知っていて隠す。
エラーメッセージの消去:知らないから書けない。
結果は同じ——ユーザーには何も伝わらない。

コミットメッセージのポエム——「fix stuff」の世界

git log は開発者の日記だ。そして日記はポエム化する

コミットメッセージは「何を変更したか」を記録する場所だ。未来の自分と同僚のために、変更の意図を書き残す。建前は。

コミットメッセージ 平文 操作
fix stuff 何をfixしたか覚えていない。あるいは説明する気力がない 蒸発
minor changes 300行変更した。APIの互換性も壊した。しかし「minor」と書いた 変装
WIP Work In Progress。永遠にin progressのまま。TODOの兄弟 変装
clean up 何を掃除したのか。ファイルか、ロジックか、自分の良心か 蒸発
update 情報量ゼロ。すべてのコミットは何かのupdateだ 蒸発
final fix (for real this time) 3回目の「final」。次のコミットも「final」になる予定 補填

そしてプルリクエスト。

PRの説明 平文 操作
Minor changes 42ファイル変更、+2,847行、-1,203行。レビュアーは泣いている 変装+消去
Refactoring 機能追加した。ついでにリファクタリングもした。レビュー不可能 変装
No functional changes テストが3件落ちているが、もともと落ちていたということにする 消去

コミットメッセージには「蒸発」が多く、PRの説明には「変装」と「消去」が多い。これは書き手の心理に起因する。コミットは自分のための記録。面倒なので情報が蒸発する。PRは他人に見せるもの。だから変更の規模を小さく見せる変装が起きる。

fix stuff は「上質がそびえる」と同じだ。
何をfixしたかわからない。何がそびえているかわからない。
しかし書いた本人は満足している。
ポエムとは、書き手が満足するための言葉だ。

プログラマーのバズワード辞典——「self-documenting code」は免罪符か

会話の中のポエマイゼーション

ソノダがDXポエム#4で「カタカナ暗号辞典」を作ったのと同じ方式で、プログラマーが日常的に使うバズワードを解読する。

バズワード 平文 操作
self-documenting code コメントを書きたくない言い訳。コードを読めばわかるはず、という希望的観測。読めない 変装
legacy code 前任者が書いたコードの蔑称。ただし自分が半年後に書くコードも、後任者にとってはlegacy 変装
technical debt 「後でちゃんとやる」と借りた時間。返済計画はない。住宅ローンのほうがまだ誠実 増幅
it works on my machine 自分の環境では動く。本番環境では動かない。デバッグを他人に委ねる呪文 消去
scalable architecture 現在のユーザー数は12人。「スケーラブル」は「いつか大きくなるはず」の増幅 増幅
best practice Stack Overflowの一番上の回答。「best」の根拠は投票数 増幅
edge case 対処するのが面倒なケースの総称。「edge」は「まあ普通は起きない」の変装。起きる 変装
minimal viable product 「ここまでしか作れなかった」をポジティブに言い換えたもの。MVPは「間に合わなかった」の増幅 変装+増幅
over-engineering 他人の丁寧な設計を批判するときに使う言葉。自分がやるときは「堅牢な設計」 変装
not a bug, it's a feature バグだ。しかし直す時間がない。ポエマイゼーションの極致。変装の頂点 変装

注目すべきは「legacy code」と「technical debt」だ。

「legacy code」は変装だ。「前任者が書いた汚いコード」を「遺産」(レガシー)と呼ぶ。しかし遺産は通常ポジティブな意味だ。英語の "legacy" には「遺産」と「旧式」の二重の意味がある。日本語のカタカナ「レガシー」に翻訳される過程で、「遺産」のポジティブさが蒸発し、「旧式で厄介なもの」だけが残る。ソノダのいう蒸発だ。しかし面白いことに、蒸発の方向が逆だ。通常の蒸発はポジティブな意味が残ってネガティブが消える。「レガシーコード」ではネガティブが残ってポジティブが消えている。逆蒸発

「technical debt」は増幅だ。「手を抜いた」と言えばいいものを、「技術的負債」と言い換える。「負債」は金融用語だ。金融の権威を借りてきて、手抜きに知的な響きを与える。マンション広告が英語を借りてくるのと同じ構造——カタカナの代わりに金融用語を使った増幅だ。

「legacy code」は「築古物件」の変装。
「technical debt」は「手抜き」の増幅。
「self-documenting code」は「コメントなし」の変装。
プログラマーの語彙は、不動産広告と同じ修辞構造でできている。

なぜコードはポエム化するのか——締め切りが生む詩

ポエマイゼーションは意思ではなく構造の問題だ

ここまでコメント暗号辞典を並べてきた。プログラマーを責めているように見えるかもしれない。違う。

ソノダがDXポエム#6で書いたことを思い出してほしい。「ポエムは悪ではない」。マンション広告の「上質がそびえる」も、SaaS LPの「DXを加速する」も、それ自体が悪いわけではない。広告には広告の仕事がある。

コードのポエマイゼーションも同じだ。プログラマーが // TODO と書くのは、怠惰だからではない。構造的にそうなるのだ。

コードがポエム化する3つの構造的理由

  1. 締め切り
    丁寧なコメントを書く時間がない。変数名を推敲する余裕がない。 tempVar は「本当は良い名前をつけたかったが時間がなかった」の痕跡だ。マンション広告のコピーライターも締め切りに追われている。ポエマイゼーションは時間不足の産物でもある
  2. 知識の非対称性
    コードを書いた瞬間、書き手はすべてのコンテキストを知っている。だから data2 で通じる。半年後の自分や、後任者がそのコンテキストを持っていないことを、書いている瞬間には想像できない。マンションポエムも同じだ。コピーライターは物件の詳細を知っている。「上質がそびえる」で通じると思っている
  3. 楽観バイアス
    // TODO: fix this later の「later」は本気だ。書いた瞬間は。しかし人間は「後でやる」と書いたことの95%をやらない。これは個人の意志力の問題ではなく、認知バイアスだ。マンション広告の「近日公開予定」も、SaaSの「今後のアップデートで対応予定」も、同じバイアスの産物

つまりコードのポエマイゼーションは、プログラマー個人の問題ではない。ソフトウェア開発という営み自体に組み込まれた構造だ。締め切りがあり、知識のギャップがあり、楽観バイアスがある限り、コードは必ずポエム化する。

ソノダの6操作、コードの世界で

ソノダのポエマイゼーション6操作が、コードの世界でどう現れるかをまとめる。

操作 広告の世界 コードの世界
補填 弱みを言葉で埋める。「上質がそびえる」 中身が弱いものを名前で飾る。「Easy to use!」「Production ready」
翻訳 文化フィルターで表現が変形 英語圏の概念が開発現場でズレる。"agile"→「朝会やればアジャイル」
蒸発 翻訳で意味の一部が消える コミットメッセージから意図が消える。fix stuff
消去 都合の悪いものを消す エラーの原因を書かない。テストの失敗を無視する。「No functional changes」
変装 ネガティブをポジティブに着替えさせる 「壊れている」→ FIXME。「汚い」→ HACK。「バグ」→「feature」
増幅 カタカナで権威を増す 「手抜き」→「テクニカルデット」。「とりあえず作った」→「MVP」

6操作すべてが、コードの世界にも存在する。これはソノダの理論の汎用性を示している。ポエマイゼーションは広告だけの現象ではない。事実を言葉で伝えるあらゆる場面で、ポエマイゼーションは起きうる

しかしコードの世界には、広告にはない特殊事情がある。広告のポエムは読者に向けて書かれる。マンションポエムの読者はマンションの購入者だ。しかしコードのポエムの読者は——未来の自分だ。

マンションポエムは他人を騙す。
コードのポエムは自分を騙す。
半年後、// TODO: fix this later を読んで途方に暮れるのは、書いた本人だ。
プログラマーのポエマイゼーションは、自分自身への詐欺である。

まとめ——コードにもポエムを愛でる目を

ソノダがマンションポエムの「上質がそびえる」を笑ったように、プログラマーは // TODO: fix this later を笑っている。GitHubには // TODO がいくつある? 数千万。数億。その一つひとつが、「永遠にfixしない」という変装だ。

しかしソノダがポエマイゼーションで書いたように、ポエムを分析するのはポエムを殺すためではない。// TODO を撲滅しろと言いたいわけではない。締め切りは来る。コンテキストは失われる。楽観バイアスは消えない。コードは必ずポエム化する。

大事なのは——ソノダの言葉を借りれば——ポエムとデータを区別することだ。

コードのポエマイゼーションに対する3つのルール

  1. // TODO を見たら「いつ?」と問え
    日付がないTODOは祈りだ。日付があるTODOはタスクだ。祈りをタスクに変換すること——それがコードの匂わせ暗号を解読する第一歩
  2. 名前を読むな、中身を読め
    utilsの中身を見ろ。tempVarの寿命を確認しろ。READMEの「Easy to use」を信じるな、チュートリアルを最後までやれ。ソノダの「実物を見に行け」と同じだ
  3. 自分のコミットメッセージを他人の目で読め
    fix stuffを読んで何がわかるか。何もわからない。半年後の自分は他人だ。他人に伝わらない言葉は、ポエムだ

ソノダは全5シリーズ51本で、不動産広告から高校パンフ、SaaS LPまで分析してきた。俺はエンジニアとして、同じ6操作がコードの中にもあることを示した。

ポエマイゼーションの射程は、広告よりずっと広い。人間が言葉を使うところにはどこにでも、ポエマイゼーションが棲んでいる。コードの中にさえ。

// TODO: fix this later

——「later」は来ない。
しかしこの一行が、プログラマーの祈りであることを、
俺たちは知っている。

← ポエマイゼーション(ソノダマリ)
← 生成エッセイの現在地

参考文献
このページの記事はAI(ChatGPT)を用いて作成・編集されています。プログラミングの慣習に関する記述はユーモアを含んでおり、特定のプロジェクトや個人を批判する意図はありません。