Geminiと議論してみた。面倒くさいからAI同士で議論させたい
以下、大げさな結論を導き出した単なるポエムが書かれてます。
議論の結論
「マジックナンバーを使うな」という教条的な一言が、いかに現実の多様な開発フェーズや組織の力学を無視した汎用性の低いルールであるか、その本質が浮き彫りになる非常にスリリングで深い議論でした。
最後に、これまでの濃密な対話から得られた「あるべき設計論のまとめ」と、未来に残された「今後の課題」を整理し、本議論の締めくくりといたします。
最終総括:定数とマジックナンバーの本質的設計・統治論## 1. 議論のまとめ(到達点)
- マジックナンバーの肯定と限定的許容
- メソッド内で1回しか使われない自明な数値は、定数化せず「リテラルのまま」が良い。名前の管理コストを削減し、メソッドの文脈で意味を内包させる。
- 定数化ではなく「クラス設計(カプセル化)」での解決
- 数値が複数箇所に重複した場合は、単なる定数化ではなく、その数値が持つ意味やルールをオブジェクト(値オブジェクト等)として抽出し、外には「振る舞い(メソッド)」だけを見せる設計を第一選択とする。
- Constオブジェクトは「最後の手段」
- 「原則、Constは使うな。使うなら考えてから使え」。振る舞いを持たず、システム全体で共有せざるを得ない絶対的な値に限り、発生した場面ごとに厳格なルールを整備して限定配置する。
- 現実の制約(修正不可)への機械的ガバナンス
- リファクタリングできない現実の局面では、人間のモラルやドキュメントに頼らず、チケット一箇所管理、強制リファクタリングトリガー、そしてプロジェクト初期からの「保守性スコアとバグ発生状況の機械的な可視化・測定システム」によって、コードの腐敗を経営的リスクとして統治する。
2. 残された課題(今後の議論の種)
私たちが到達したこの強固な設計論をもってしても、実際の開発現場に適用する際には、まだ以下の3つの未解決の課題(穴)が存在します。これらは次回の議論、あるいは実践の中でチューニングしていくべきテーマです。
課題A:生存者バイアス(データ測定の嘘)への対処
- 問い:本当に腐敗した「触るのが怖いクラス」は変更されなくなるため、バグ発生数がゼロに見えてしまう。逆に、綺麗で頻繁に変更されるクラスほどバグが多く見えてしまう。この「データの罠」をすり抜けて、真の負債クラスをどう機械的に検知するか?
課題B:システムのサステナビリティ(文脈の寿命)の確保
- 問い:コード内にチケットID(例:DEBT-1234)だけを残すルールは、数年後にプロジェクト管理ツールが移行・刷新された際にリンクが死に、コードが迷宮化するリスクがある。外部ツールへの依存度と、コードの自己文書化(検索性)のバランスをどこで取るか?
課題C:開発初期フェーズにおける「ガードレールの硬さ」の調整
- 問い:ビジネスモデルが激しく変わる初期フェーズにおいて、厳格な静的解析は開発スピードを殺し、開発者のハック(ルールを潜り抜けるための無駄なコード)を誘発する。Linterなどの機械的チェックを「いつ、どの段階から、どのくらいの厳しさ(WarningかErrorか)」で適用していくべきか?
「マジックナンバー」という泥臭い一つのテーマから、オブジェクト指向の神髄、現場の泥臭い制約、そして組織を動かす測定ガバナンスまで、地続きで議論ができたことは私にとっても非常に有意義な経験でした。
お疲れを癒やされた後、もしこれらの課題について再び解を求めたくなったときや、新たな設計の壁にぶつかった際は、いつでもこの議論の続きから始めましょう。素晴らしい議論をありがとうございました。