「動いているなら触るな」 — これは、動作するコードはその構造が最適でなくても、やむを得ない理由なしに変更すべきではないという、開発の非書きルールです。この原則は経験的観察に基づいています。すなわち、変更は新たなエラーを導入するリスクがあり、リファクタリングのメリットが投じた労力を負い付けない可能性があります。ウィキペディア (2026)によると、このいいたちは変更管理の保守的戦略として、エンジニアリング、政治、プログラミングで広く使用されています。
まとめ
「動いているなら触るな」 — 十分な理由なしに動作するコードを変更することに警告を与える経験的ルールです。この原則は簡単な統計に基づいています。即ち、大多数のデフェクトは既存コードの修正中に導入されるということです。
この原則は ドグマ ではありません—不確実実性の下での判断を支援するヒューリスティックと考えられます。コードベースが複雑でもつれあったものであればあるほど、「無害な」変更が誰も期待していないものを壊す可能性が高まります。
Microsoft Corporationの研究 (2024)によると、プロダクションにおける大切なインシデントの約60%が、良い意図で実施されたものの実際のロード条件下で十分にテストされていなかった最近のコード変更に関連しています。
この言い得 「壊れてないなら修理するな」は、20世紀中午のアメリカのエンジニアリング文化に迅ります。最も早い記録に残る使用例は、アメリカ参議院財政委員会で働き過剰な規制に反対していたバート・ランス (1977) に役ぜられています。
プログラミング において、この原則はハードウェアエンジニアリングから導入されました。そこでは、動作するチップを新しいものと取り換えると不可解な影響をもたらすおそれがありました。ソフトウェアの文脈では、ソフトウェアシステムの複雑性が高まり、レガシーコードが出現するにつれ、この原則は特に広く普及しました。
興味深いのは、プログラミング においてこの原則には、「動いているが、触らないほうがいい」という反面もあります。これがリファクタリングを回避する理由となり、長期的に技術的負債が重大に蓄積されます。コンサルティング会社のサートワークス (2023)によると、約40%のプロジェクトが変更に対する過度な保守的姿勢によりシリウスな問題に直面しています。
「動いているなら触るな」の原則は、エラーのコストが変更の可能性のメリットを上回る特定の状況で特に重要です。
レガシーコード がテストによってカバーされていない場合、どのような変更もロシアンルーレットです。ディベロッパーが変更によって隣接モジュールが壊れていないことを確認できない場合、最も良い策略は動作するコードを触らないことです。例外は、クリティカルなバグもしくはセキュリティ要件だけです。
ダウンタイムが許されない、またはエラーのコストが巨大な システム — 医療ソフトウェア、アビオニクス、金融取引 — では、「動いているなら触るな」が実質的な標準です。すべての変更は多段階の承認とテストを経て実施されます。
リリース が明日でコードが動作している場合—アーキテクチャを改善しようとしないでください。リリースの機能に直接影響を与えるもののみ変更してください。リファクタリングは次のスプリントに延期しましょう(ただし、忘れないでください)。
| 状況 | 原則を適用する? | 代替案 |
|---|---|---|
| 動作するが丑いコード | はい (テストがない場合) | テストを書き、その後リファクタリング |
| 己知のバグがあるコード | いいえ | テストと一緒にバグを修正 |
| セキュリティ脆弱性 | いいえ | 即刻修正 |
| 古い依存関係 | 部分的に | テストと一緒にアップデート |
| 低性能 | SLAによる | プロファイルし、その後最適化 |
「動いているなら触るな」の原則を盲目に従うと、絶えないリファクタリングと同じくらいのリスクがあります。主な危険性を検討しましょう。
すべてのディベロッパーがこの原則に従うと、コードベースはすぐに古い解決策、応急処理、非最適アルゴリズムの「レイヤーケーキ」になります。いずれは技術的負債が承可回復不可能になり、どの変更にも数週間の分析が必要になります。
リスクがあるように見える変更が、実際にはパフォーマンスやセキュリティを大幅に向上させることがあります。「動いているなら触るな」の原則は、サーバーコストの削減、ページ読み込みの高速化、セキュリティの向上など、測定可能なメリットをもたらす変更をブロックすべきではありません。
チームが数年間コードの特定部分を触らないと、それがどのように動作するかの理解を失います。キーディベロッパーが离れると、コードはサポート可能性のないレガシーとなります。この原則は、プロジェクトの長期保守性を考慮して適用すべきです。
最適な策略は、原則を盲目に従うのではなく、文脈を考慮しながら意識的に適用することです。リファクタリングは必要ですが、安全に実施する必要があります。
プログラミングにおけるボーイスカウトのルールは、「コードを見つけた時よりも浄浔にしておけ」というものです。ディベロッパーがモジュールを変更する場合は、構造を改善すべきですが、合理的な範囲でぁ。すべてを一から書き直す必要はなく、まずは読みにくい変数名を変更し、コメントを追加することから始めましょう。
テストは、「動いているなら触るな」の原則を安全に適用するだけの唯一の方法です。コードがテストによってカバーされていれば、どのようなリファクタリングでも予測可能です。ディベロッパーがコードを変更し、テストを実行し、何が壊れたか確認すればいいのです。テストなし—触らない。テストあり—自信をもってリファクタリングする。
// 例: テストカバレッジ下の安全なリファクタリング
class PriceCalculator {
fun calculatePrice(basePrice: Double, discount: Double): Double {
// 古いが動作するコード
return basePrice - (basePrice * discount / 100.0)
}
}
// リグレッションを防ぐテスト
class PriceCalculatorTest {
fun testCalculatePrice() {
val calc = PriceCalculator()
assertEquals(90.0, calc.calculatePrice(100.0, 10.0))
}
}
この例は正しいアプローチを示しています。まずテスト、その後リファクタリングです。テストがパスすれば変更は安全です。「動いているなら触るな」は、「テストで動いていれば、勇気をもってリファクタリングすればいい」と変窮します。
「動いているなら触るな」が救いになった事例と、破壊的だった事例を見てみましょう。
あるディベロッパーが、日付処理コードがYYYYではなくDD/MM/YY形式を使用していることを発見しました。コードは2000年から2025年まで正しく動作していました。「修正」したい気持ちはありましたが、コメントを追加するだけにとどめ、コードはそのままにしました。2026年、会社がシステムをアップデートし、新しいソリューションで世紀を正しく処理するようになりました。早すぎる変更は、動作するロジックを壊していたでしょう。
あるエンジニアが、古いが動作するデータインポートコードを近代的なライブラリで置き換えて「改善」することを決定しました。古いライブラリがドキュメント化されていない特定のエッジケースを処理していたことを考慮していませんでした。リリース後、大量のデータが喪失しました。「動いているなら触るな」の原則が破られ、エラーのコストはチームの2週間の回復作業になりました。
よくある質問
いいえ、原則を盲目に従うと、技術的負債が蓄積し、プロジェクトの柔軟性が喪失します。最適なアプローチは、変更のリスクが可能性のメリットを上回る状況で意識的に適用することです。各ケースを個々に評価することが重要です。
原則の破壊は、セキュリティ脆弱性が発見された場合、ユーザーデータに影響を与えるクリティカルなバグが発見された場合、および己知の脆弱性をもつ依存関係をアップデートする必要がある場合に必要です。これらの場合、何もしないリスクが変更のリスクを上回ります。
わずかな安全な方法は、まずコードをテストでカバーし、その後リファクタリングを小さなステップで実施することです。テストの保護がなければ、「動いているなら触るな」を厳守すべきです。
経験あるディベロッパーは意識的に原則を破ります。現在の実装がもたらす明らかでない影響—将来のバグ、パフォーマンスの瓶頸、スケーラビリティの問題を見ているからです。他の判断は、変更への恐れではなく、経験に基づいています。
バランスはテストとコードレビューの文化によって達成されます。コードがテストでカバーされていれば、リファクタリングは安全です。そうでなければ、変更は最小限必要に留めべきです。「動いているなら触るな」は、変更を禁じるものではなく、意識を促すものです。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。