他の人はバグを見つけたときに修正しますか、それともクラッシュ/データ損失/人が死ぬまで修正を待つのですか?
例1
Customer customer = null;
...
customer.Save();
コードは明らかに間違っており、回避方法はありません。null参照でメソッドを呼び出しています。Save
インスタンスデータにアクセスしないため、クラッシュしません。静的関数を呼び出すようなものです。しかし、どこでも小さな変更があれば、クラッシュしないコードが突然クラッシュする可能性があります:クラッシュを開始します。
しかし、コードを修正することも考えられません:
Customer customer = null;
...
customer = new Customer();
try
...
customer.Save();
...
finally
customer.Free();
end;
かもしれない紹介クラッシュ。完全に網羅された単体テストと手動ユーザーテストでは発見されなかったもの。
例2
float speed = 0.5 * ((G * mass1 * mass2) / R) * Pow(time, 2);
物理学を知っている人は、それが分母のR 2であることを認識するでしょう。
コードが間違っている、それは絶対に間違っている。また、速度を過大評価すると、レトロロケットの発射が早すぎて、宇宙船のすべての乗員が死亡します。
しかし、速度を過大評価して別の問題を隠している可能性もあります。シャトルの動きが速すぎるとエアバッグが展開できません。突然コードを修正した場合:
float speed = 0.5 * ((G * mass1 * mass2) / Pow(R, 2)) * Pow(time, 2);
これで速度が正確になり、エアバッグが必要なときに突然展開します。
例3
文字列に無効な文字が含まれているかどうかを確認する最近の例は次のとおりです。
if (StrPos(Address, "PO BOX") >= 0)
{
//Do something
}
Do something
ブランチにバグがあることが判明したらどうなりますか?明らかに間違ったコードの修正:
if (StrPos("PO BOX", Address) >= 0)
{
//Do something
}
コードを修正しますが、バグが発生します。
私がそれを見る方法には2つの可能性があります:
- コードを修正し、それを破ったとして非難される
- コードがクラッシュするのを待ち、バグがあると非難される
政治的に何をしますか?
例4-今日の現実世界のバグ
私はオブジェクトを構築していますが、間違ったコンストラクタを呼び出しています:
Customer customer = new Customer();
「パラメータのない」コンストラクタは、実際には継承チェーンのさらに後のパラメータ化されたコンストラクタであることがわかります。
public Customer(SomeObjectThatNobodyShouldBeUsingDirectly thingy = null)
public Customer(InjectedDependancy depends)
それを呼び出すことは間違いです。それは後続のすべてのコンストラクタをバイパスするからです。
このような危険なコンストラクターを公開しないようにオブジェクトの系統を変更することもできますが、コードを次のように変更する必要があります。
Customer customer = new Customer(depends);
しかし、この変更が何も壊さないことを保証することはできません。上記の私の例1のように、おそらく誰かが、どこかで、どういうわけか、ある難解な条件下で、Customer
無効でジャンクだらけの構築物に依存しています。
おそらく、適切に構築されたCustomer
オブジェクトは、以前は実行されなかったコードを実行できるようになり、クラッシュするようになりました。
あなたの妻の人生に賭けることはできません。
そして、私はここから火曜日までそれをテストすることができます、私は回帰を導入しなかったあなたの娘の人生を誓うことができません。
私は:
- コードを修正し、それを破ったと非難される?または
- バグを残して、顧客がそれを見つけたときに非難される?