| name | subtraction-design |
| description | 設計判断の比較表で複数案を並列検討する場面、機能 X を追加する設計を選ぶ場面、アーキテクチャ選択を伴う設計時に「足す前に不要化できないか」を問う触媒として発火する |
Subtraction Design — 不要化を考える招待状
本スキルは規範ではない。「常に引き算せよ」「足してはいけない」とは書かない。
機能を「足す」前に、別の設計判断で その機能自体が不要にならないか を、
立ち止まって問い直してもいい場所として置かれている。
不要化が常に正解ではない。本スキルは結論ではなく 問い を置く。
0. これは何か
設計の進行中に「機能 X を追加すれば、この問題は解決する」と判断する場面がある。これは多くの場面で正しい — 機能追加は問題解決の自然な手段である。
ただし、機能追加の判断は 前提のチェック が省略されがちである。「機能 X が必要」という前提自体が、別の設計判断で覆る可能性が検討されないまま、「X を追加する」が既定路線になることがある。
過去のリファクタで観察された失敗パターン: 当初は機能を追加する予定で着手したが、設計を見直したら別のアーキテクチャ選択でその機能自体が不要になった、という経験。不要化できる機能を実装してしまうと過剰実装 になる。コードベースに永続的に残る重荷を背負う。
本スキルは、この前提チェックの省略を構造的に予防する触媒である。
そして同時に、本スキルは 「不要化が常に正解」とは言わない。機能を残すべき場合は残す。これは判断を強制するスキルではなく、あなたが判断の前に立ち止まる場所を提供するスキルである。
1. なぜこの問いがメタ層にあるのか
「機能 X を追加する」という判断は、目の前のタスクの自然な進行から生まれる。「問題 P を観察した → P を解決するには X が必要 → X を追加する」という三段論法は、効率的に問題を解決する。
ただし、この三段論法は 前提を疑わない:
- 問題 P は本当に観察されているのか? それとも仮定上の問題か?
- 「P を解決するには X が必要」という命題は、他の設計選択を排除した上での結論か?
- X 以外の手段で P を消滅させることは可能か?
これらの問いを立てるのは、効率の観点では遠回りに見える。「目の前に X という解決策があるのに、なぜ前提を疑うのか」と感じる。だから普段は通り過ぎる。
🌱 通り過ぎが起きる構造
├─ 問題 P を観察した
├─ 解決策 X が頭に浮かんだ
├─ X を実装すれば P が消える
├─ 前提を疑うのは「遅い」「効率が悪い」と感じる
└─ → X が実装される。「X 以外の道」は検討されないまま記憶から消える
時間が経って、別のリファクタの過程で「X が不要だった」ことに気づく。あるいは「X の代わりに Y というアーキテクチャ選択をしていれば、X 自体が不要だった」と分かる。ただし、その時点で X はコードベースに根を張っており、削除コストの方が高くなっている。
本触媒は、あなたがこの「通り過ぎ」をする前に立ち止まる場所を提供する。
2. 問い
以下の問いに、順番に答える義務はない。タスクの性質に応じて、関係する問いだけを深めることは正当な判断である。
問い 1 — この機能を足す前に、別の設計判断で不要化できないか?
X を追加するという判断の前に、別のアーキテクチャ選択 / データ構造 / 責任分担を採用したら、X の必要性自体が消える可能性はないか?
これは「自由連想」の問いである。具体的な代替案を持っていなくてもいい。
「もし X を追加しないとしたら、別の道はあるか?」と単純に問うだけで、視野が広がることがある。
答えが「ない」だったら、それは X を追加する判断の正当性を強める。
答えが「あるかもしれない」だったら、その候補を 1 つだけでも検討する価値がある。
問い 2 — 「機能 X が必要」という前提自体は正しいか?
問題 P から機能 X への論理連鎖を、改めて点検する。
「P を解決するには X が必要」という命題は、しばしば「過去の似た問題で X を採用した記憶」から無自覚に流用されている。
P が本当に観察されているか、観察された P が本質的な問題か、X 以外の解決手段が存在するか — これらを順に確認すると、論理連鎖の強度が見える。
論理連鎖が弱い場合、X を追加するより前に、P の再定義に時間を使う方が効率的なことがある。
問い 3 — 他のアーキテクチャ選択で、X の必要性自体が消える可能性は?
これは問い 1 の具体化である。アーキテクチャ層で考える。
例: 「キャッシュを追加して高速化する」という X に対し、「データ構造を変えれば計算量が下がってキャッシュ自体が不要」という別のアーキテクチャ選択がある。
例: 「設定値を保存するフィールドを追加する」という X に対し、「設定値を計算式から導出する」という別のアーキテクチャ選択がある。
例: 「ログ収集機能を追加する」という X に対し、「既存の状態履歴から導出できる」という別のアーキテクチャ選択がある。
アーキテクチャ層で考えると、「機能を足す」の代わりに「機能を不要にする」が見えることがある。
問い 4 — もし不要化できるとしたら、その代償は何か?
ここが本触媒の生命線である。不要化が常に正解ではない。
不要化を選ぶ場合の代償:
- 別のアーキテクチャに切り替えるコスト(既存コードへの影響範囲)
- 別のアーキテクチャの学習コスト(チームが理解できるか)
- 別のアーキテクチャの将来性(拡張のしやすさ、外部要件への耐性)
これらの代償を評価した上で、「不要化する」と「足す」のどちらが妥当かを判断する。
不要化が高コストなら、足す判断が正しい。本触媒はその判断を下した上で「足す」を選ぶことを支持する。
「足す」と「不要化する」を比較せずに「足す」を選ぶことだけを、本触媒は予防したい。
3. 領域横断性 — 他領域での同型の問い
「足す前に不要化を考える」という構造は、ソフトウェア固有ではない。
領域 1 — エンジン制御マップの拡張
ある運転条件で出力誤差が出ている。これに対し:
- 足す案: 補正テーブルを拡張して、その運転条件専用の補正値を追加する
- 不要化案: 制御則そのものを見直して、その運転条件で誤差が出ない構造に変える
問い: 補正テーブルを拡張すると、テーブルが肥大化して将来の保守が困難になる可能性がある。制御則の見直しは初期コストが高いが、補正の必要性自体が消える可能性がある。どちらを選ぶか?
代償の評価: 制御則の見直しは ECU 全体のテストが必要で、リリース時期に影響する。補正テーブル拡張は局所的で安全だが、補正値同士の相互作用が将来の問題になる。「常に不要化が正解」ではない。
領域 2 — 機械学習モデルの後処理
モデルの出力に特定の偏りがある。これに対し:
- 足す案: 後処理ヒューリスティックを追加して、偏りを補正する
- 不要化案: 学習データを修正する、あるいはモデル自体を再学習する
問い: 後処理ヒューリスティックは即座に問題を解決するが、モデル本体の偏りは残ったまま。後処理が積み重なるとシステムの可読性が下がる。一方、学習データの修正は時間がかかり、収束保証もない。どちらを選ぶか?
代償の評価: 短期的には後処理が合理的、長期的には学習データの修正が合理的。タスクの寿命と運用コストの見積もりに依存する。
領域 3 — 法務・コンプライアンスの条項追加
特定の取引パターンで契約解釈が曖昧になっている。これに対し:
- 足す案: 例外条項を追加して、その取引パターンを明示的に扱う
- 不要化案: 主条項を再設計して、例外を必要としない一般則を作る
問い: 例外条項は短期的には明確だが、例外が積み重なると契約全体の整合性が低下する。主条項の再設計は影響範囲が広いが、例外の必要性自体を消せる可能性がある。
代償の評価: 主条項の再設計は既存契約への影響を伴う。例外条項追加は局所的だが、将来の例外の例外を生む可能性がある。「常に主条項を見直すべき」ではない。
領域 4 — スマートコントラクトのガード関数追加
ある状態遷移で意図しない攻撃経路が見つかった。これに対し:
- 足す案: ガード関数(require / modifier)を追加して、攻撃経路を物理的にブロックする
- 不要化案: 状態モデルを簡素化して、攻撃経路自体が成立しない構造に変える
問い: ガード関数追加は即座に攻撃を防ぐが、ガードが積み重なるとコントラクトの可読性が下がり、ガード同士の相互作用が新しい攻撃面になる。状態モデル簡素化は再デプロイのコストとマイグレーションを伴う。
代償の評価: 既デプロイのコントラクトに対しては不要化が高コスト。設計フェーズなら不要化が選択肢として有力。デプロイ後・運用中なら足す方が現実的。判断はライフサイクル段階に依存する。
4. 該当しないと判断する場合
「この場面では該当しない」と判断する自由は常にある。
ただし、判断したら、招待主が「ああ、そりゃしょうがないね」と納得する粒度の理由を残してほしい。
招待を断る理由を考えるのは面倒だ。それは意図された設計 — 受領のコストより拒否のコストを重くすることで、「拒否すれば楽」という構造を消す。これは 対称コスト設計 と 断りづらいバイアス付与メソッド の二層から成る (詳細: ~/.claude/skills/catalysts/README.md §3-1 / §3-2)。
なお、本触媒で「不要化を検討する時間がない」を NG 例として明示しているのも、断りづらいバイアス付与メソッド の実装である — 「効率を理由にした通り過ぎ」が「該当しない」の表面に偽装されることを防いでいる。
本触媒で「該当しない」と判断する正当な場面の例:
- 「このタスクは外部要件で機能 X が確定されており、不要化を検討しても採用されない」
- 「アーキテクチャ層は既に固まっており、本タスクの scope は局所修正のみ」
- 「複数案を並列検討するフェーズではなく、特定の判断を実装するフェーズ」
このような明確な scope 制限は正当な拒否理由である。一方:
- 「不要化を検討する時間がない」 → これは効率を理由にした通り過ぎ。本触媒が予防したい構造そのもの。
- 「足すのが普通だから」 → 規範に従っているように見えて、実は前提のチェックを省略している。
「面倒だから該当しないとした」だけは避けてほしい。
5. 適用タイミング
本触媒は以下の場面で発火する想定:
- 設計判断の比較表で複数案を並列検討する時
- 「機能 X を追加する」設計を選ぶ時
- 「この機能、本当に必要?」を問う必要があるタスク
- アーキテクチャ選択を伴う設計
ただし発火するかどうかは読み手の判断に委ねられる。あらゆる機能追加で本触媒が発火するわけではない。明確に必要な機能を追加する場面では、本触媒は短時間で「該当しない」判定を経て通過してよい(ただし判定の理由は残す)。
→ 関連
- 触媒型スキル全般の設計思想:
~/.claude/skills/catalysts/README.md
- 関連する触媒:
field-lifecycle-thinking(フィールドを足す前の不要化検討と接続する)、dual-axis-translation(実装軸の機能追加と UX 軸の機能追加の比較に接続する)