僕がいたところ
納涼!ほんとにあった怖いコード(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文を覚え任意の処理を書けるようになること。」
でした。