ただのブログです

技術的な物とかを主に。主にWeb系がメイン。いつか、職業エンジニアになりたい。

僕がいたところ

納涼!ほんとにあった怖いコード(by CodeIQ×はてな)

前にいたプロジェクトの話。
本当のヤバさはコード以外にも沢山ありエンジニアにとっては阿鼻叫喚。
でも営業マンと販売戦略が良かったので、「文言を追加したい?10万ですね(´σ `) 」という世界だった。

作っていたのはWebアプリケーションもどきでした。

画面固有のjsファイル1万4千行。

メソッドは全てグローバル。
1000個くらい定義されてた。

まず、goto文をやりたがってるswitch文がいた。

switch(foo) {
    case "a":
        // ~
        break;
    case "b":
    case "c":
    case "d":
        // ここに100行くらい
    case "e":
    case "f":
        // ここに200行くらい
        break;
    case "g":
    // ... まだまだ続くよ…
}

という感じで2000行近くのswitch分がbreakあったりなかったりで書かれていた。
それが3,4種類あった。しかも微妙にガード式が違う

そして、バグをしょっちゅう引き起こす。訳の分からないコード達

function calc1_blur(){
    var a = document.getElementById("hoge").value + document.getElementById("piyo").value
    document.getElementById("foo").value = a;
    calc2_blur();
}
function calc2_blur(){
    var a = document.getElementById("hoge").value + document.getElementById("piyo").value
    document.getElementById("bar").value = a;
    calc3_blur();
}

function calc3_blur(){
    if(document.getElementById("bar").value != ""){
        var a = document.getElementById("fuga").value;
        document.getElementById("foo").value = document.getElementById("bar").value + a;
        calc4_blur();
    }
}

function calc4_blur() {
    // なんか色々
    calc2();
}

みたいな阿弥陀くじ。しかもblurでDOMにくっついてる

サーバーサイドのコードは

"select * from foo where id = " + id

のような古典的なSQLインジェクションウェルカムコード。
むしろリクエストでANDとかOR貰ってSQLインジェクション利用した実装がされてたりした。

<?=hoge?>

のようなXSSウェルカムコード。
むしろ開発者が反射型のXSSを利用した機能を実装したりしていた。

そして、グローバル変数が1万個以上定義されていて

if(flg_a && flg_b) {
    if(flg_c && flg_d) {
        if(flg_e && flg_f) {
            // これが16段くらいまでネストしてる
        }
        if(flg_g && flg_e && flg_i) {
            
        }
    }
}

もちろんこんなレベルのコーディングなので別の箇所にも同じ条件式がコピペされてて

if(flg_a && flg_b) {
    if(flg_c && flg_d) {
        if(flg_e && flg_f) {
            // これが16段くらいまでネストしてる
        }
        if(flg_g && flg_h && flg_i && flg_j) {
            
        }
    }
}

よくよく見ると、微妙に違う。

あと

hoge(); // おまじない。これがあると動くらしい

こんなのは普通過ぎました。

で、リリース時には複数のサーバーにアップロードするのだけど、 「バージョン管理からリリースしたいコードだけを手動でマージして、動かなければその場で修正しそれはバージョン管理にはコミットしない」
という謎な作業を行い、それをひたすら繰り返した挙句
「開発してた環境と本番のコードが違う!でもリリースしなきゃいけないからする」と言って沢山の障害を生み出していました。

一時テーブルじゃなくて実テーブルをcreateしてdropするコードがあるなんて事件もありました。

思い出してて辛くなったのでこの辺にします…

ちなみに、そのプロジェクトの一人前の条件は

「if文とfor文を覚え任意の処理を書けるようになること。」

でした。