効率的なバグの作り方

プログラマーの仕事は、とにかく効率を求められます。
それは、コーディング然り、テスト然りです。


それならば、バグだって効率的に作るべきです
今日は、そんな効率的にバグを作るやり方を、ざっと考えてみました。

複雑なif

バグを作るためにifをたくさんネストするという方法は、大規模な開発で実によく使われます。
でも、ひとつのif文を無意味に複雑にしておくとさらに効率よくバグを作れます。

if(str == null && (str == null || str.equals("hoge")){
    // 初期化処理
}

こういう風に書いておけば、きっと誰かが「str が hoge なら初期化が行われる」と勘違いしてくれるハズです*1
こんなな感じで、ブール論理の吸収法則やド・モルガンを逆に使ってどんどんif文を複雑にしておきましょう!
そうすれば、たくさん勘違いが生まれて、たくさんバグが出来上がると思います。

安易なnull

無駄に null で初期化をして NullPointerException を発生させるという手法には、とても根強い人気があります。
そこで、さらに効率よくバグにするために、create メソッドや newInstance メソッドで null を返すようにしましょう。
null を返す条件は、わかりにくければ分かりにくいほどいいです。
特定の引数だったり、きわめてまれなタイミングであればなおのこと効率よくバグにつながるでしょう。
もちろん、そのことを JavaDoc に明記してはいけません。


もし、この処理に文句を言ってくるやつがいたら言ってやりましょう。
「ヌルチェックをしない奴が悪い!」*2

唐突な例外

異常が発生したことを例外ではなく戻り値で表現するというやり方は、特にCから移ってきた古のプログラマーに好まれています。
そんなすべてを戻り値で表現するかのようなプログラムを書いていると見せかけて、いきなり throw new Exception(); と書きましょう。
もちろん、メソッドには throws Exception を宣言します。そうすればそのメソッドを呼び出す側は意味不明の宣言に困惑し、誤った例外処理でバグを生み出してくれること間違いなし!


もし、この処理に文句を言ってくるやつがいたら言ってやりましょう。
「例外をキャッチしない奴が悪い!」


逆に、自分が呼び出したメソッドが throws IOException なんて中途半端な宣言をしていたら、try...catch(Exception e)... で囲み、無駄に戻り値に変換しましょう。スタックトレースを出したりログに記録したりする必要はありません。

try{
    // ファイルからなにか読み込む
}catch(Exception e){
    return false;
}

そうすれば、バグの解析が困難になって、さらに別のバグを生むことができます。

とにかくロック

複数のスレッドから同時に呼ばれる可能性のあるメソッドでも、とにかく synchronized と書いておけば、なにも問題は起きない。そんなシングルコアな考えを持った人がいます。
そういう人のために、synchronized は二重三重に使いましょう。
そうすれば、パフォーマンスの低下やデッドロックという二つのバグを、同時に生み出すことができます。まさに一石二鳥です。
さらにうまくいけば、synchronized では防げないデータレースなんかも作りこむことができます。もちろん、volatile なんて宣言してはいけません。


もし、デッドロックを起こした人がいたら言ってやりましょう。
「その順番でメソッド呼んじゃダメなんだよ!そんなことも知らないのか!」

無駄にコメント

コードなんて意味が分からないんだから、コメントはあればあるほどいいという人がいます。
そういう人を満足させるために、ひたすらプログラムを日本語に翻訳していきましょう。そうすれば役に立たないコメントで簡単にソースが膨れ上がります。

// ハッシュマップを生成する
Map<String, Object> map = new HashMap<String, Object>

コメントが書いてあればいいのです。適当に書いておきましょう。さらに嘘が混じればバグを作るスピードが2倍、3倍に跳ね上がること間違いないでしょう。

// null か 空文字 なら特殊な処理をする
if((str == null || str.equals("")) == false){
    special(str);
}


もし、コメントに騙されて文句を言ってくる人がいたら言ってやりましょう。
「コメントが間違っていても、ちゃんとコードを読めばわかるだろ!」


効率的にバグを作る意味

「そんなにバグを作ることに意味があるの?」と思う人がいるかもしれません。でも以下のようにメリットはたくさんあります。

  • 残業代が稼げる*3
  • 周りから、さも頑張っているかのように評価してもらえる
  • 競合他社の参入を阻み、仕事を独占する


もしこれを読んだ方の中で、「こうすればもっと効率的にバグが作れる」なんてことをご存知の方がいらっしゃいましたら、ぜひコメントやトラックバックで教えてください!





(今日はエイプリルフールです。なので、「普段、自分がプログラムを書く際に気を付けていること」を真逆にして書いてみました。なお、記載内容はすべてフィクションです。実在の人物・団体とは一切関係がありません)

*1:正しくは「if(str == null)と等価で、str が null のときだけ初期化が行われる」です。

*2:人間関係を悪化させることも、効率よくバグを作るとてもいいやり方です。

*3:もし残業代が出なくても、人生の暇つぶしになります。