下手ほど儲かる?(お題:CodeIQの問題・パズルを考えよう!)
CodeIQの問題・パズルを考えよう!(by CodeIQ×はてな)
「下手な開発者の方が儲けているよね」
という声を耳にしました。
なるほどそうかも?
・簡潔。高い汎用性。他人が見てもメンテナンス容易。
そんなコードを書いてもそれきり。
・無駄に長くて下手。汎用性なし。書いた本人しかわからない。
そんなコードを書いて、特定のユーザーに食い込むと、そのあとずっとメンテの仕事にありつける。担当を外されることもない。
こんなことが続けば、エンジニアのスキル向上の意欲がそがれ、長期的には、この分野の衰退につながるかもしれません。
何か良い対策は、ないでしょうか?
あらかじめ正解がある問題じゃなく、アイデアコンテストです。
昔、「こういうの、どうにかならないものか」と思った実体験から。
見切り発車(お題:納涼!ほんとにあった怖いコード)
納涼!ほんとにあった怖いコード(by CodeIQ×はてな)
↓↓↓ ここに君が見たクソコードを書こう!! ↓↓↓
見かけは、ちょうど、次のリンク先(ナショナルインツルメンツ社、技術資料サイト)の「Figure.1」のような、「グラフィカル」な「スパゲッティコード」だった。
http://zone.ni.com/devzone/cda/pub/p/id/1735
が、肝心なのは、そこではない。本当に怖いのは、駆動制御なのに、動作完了を確認せずに次の命令を出していたこと。そして、例外処理が無かったことだ。
↑↑↑ここまで↑↑↑
「PHP」話が続いたので、別の言語の話をしてみる。
もう10年以上前になるが、実験装置の制御で「LabVIEW」という開発ツールに触れたことがあった。グラフィック型言語の一種だ。
VI(Virtual Instruments)というアイコンを並べ、間を線でつないでいくとプログラムが完成するという『画期的』な開発ツール。
各種装置制御や、表示のライブラリが充実している。必ずしもプログラミングに深い知識を持つわけではない実験研究者が、「ちょっと装置を動かしたい」というときには適しているのだろう。
当時の実験プロジェクトのリーダーは言った。
「開発業者に基本骨格のところを作らせておいて、あとはキミたちプログラムが得意な人が、イロイロ肉付けしていけばいいよね。」
・・・適当な「業者」が見つからないので、装置(ハードウェア)の開発元に来てもらうことに。
「『LabVIEW』は初めてでして・・・」
我らがリーダーは有無を言わさない。
「でも、これはグラフィカルで簡単だから、オタクの技術力を持ってすればどうにかなるでしょ?この機会にちょっとがんばって覚えてもらえば、今後の業務の幅も広がるというもの・・。」
納期は当初予定より半年近く遅れた。
納品されたのは、「グラフィカル」な「スパゲッティコード」だった。
当時のソースコードは手元には無いが、ちょうど、次のリンク先(LabVIEW開発元ナショナルインツルメンツ社、技術資料サイト)の「Figure.1」のような図が、何枚もあった、と言えば、雰囲気は伝わるだろうか。そういったコードだ。
http://zone.ni.com/devzone/cda/pub/p/id/1735
リーダー曰く、「あとはキミたちが肉付けを・・・」
できるかっ!
ーーーーーーーーーーーーーーーーー
で、「誰も触れないコード」になってしまった。
開発依頼した機能は「スキャン測定」つまり、「座標などの条件を少し変え」ては「測定する」という動作を繰り返すもの。何千~万の測定点をつなぎ合わせると「スペクトル」とか「分布図」とか言われる実験データができる。夜間もずっと装置を動かして、データを取り続ける。
さて、納品されたコード。「あるがまま」に使うしかないわけだが、「稀にエラーでとまる」という問題があった。その確率、数千点の測定で一回程度。(一晩で1~2回程度。たまに一晩に4回、5回と落ちると、関係者の間では「御祓いしなきゃ」という話になる。)
エラーで止まったことに気づかずにいると、貴重なマシンタイム(装置割り当て時間)をふいにしてしまう。なので、終夜、誰かが寝ずの番でディスプレイを「見張る」。
当時、「寝ずの番」担当の合間に、私はこの開発言語のマニュアル片手にスパゲティコードを追いかけ、止まる原因を探っていた。そして驚愕の事実を知った。
スキャン測定は、
1.(位置、角度などの)条件変更命令
2.条件変更の動作完了を待つ
3.測定開始命令
4.測定完了を待つ
この4つの繰り返しが基本だ。特に『待ち方』が大事だ。
しかし、そのコードは2.で動作完了の確認をしていなかった。代わりに「固定秒数待機」の処理が入っていた。
つまり、「まあこのくらいで十分か?」というところでの『見切り発車』だった。
「条件変更」にかかる時間にはバラつきがある。動作がまだ終わらないうちに、次の命令を出してしまうと、装置からエラーコードが返る。
しかし
「例外処理は実装されていない」
ので、しばしば、そのまま止まっていたわけだ!
絞込み(お題:納涼!ほんとにあった怖いコード)
納涼!ほんとにあった怖いコード(by CodeIQ×はてな)
↓↓↓ ここに君が見たクソコードを書こう!! ↓↓↓
$Data=@file($csv_filename);
(中略)
for($i=0;$i<=sizeof($Data);$i++){
$lines=explode(",",$Data[$i]);
$keyword_hit = "";//初期化
if($search_keyword){
for($n=0;$n<sizeof($KeyArray);$n++){
if(mb_eregi($KeyArray[$n],$lines[1])){ //SN
$keyword_hit = 1;
}else if(mb_eregi($KeyArray[$n], $lines[6])){ //タイトルA
$keyword_hit = 1;
}else if(mb_eregi($KeyArray[$n], $lines[8])){ //タイトルB
$keyword_hit = 1;
}else if(mb_eregi($KeyArray[$n], $lines[11])){ //キーワードA
$keyword_hit = 1;
}else if(mb_eregi($KeyArray[$n], $lines[13])){ //キーワードB
$keyword_hit = 1;
}else {
$keyword_hit = 0;//該当なし
break;
}
}
}else{
$keyword_hit = 1;
}
( ・・・・長い長~いコード、略・・・・ )
}
↑↑↑ここまで↑↑↑
PHPソースの一部。
『SQLのwhere句』みたいなことをやろうとしている雰囲気は伝わってくる。
(・・・・・ただ、なにより、ともかく、遅いんだ。)
(8/26追記)
「稼ぐ」ことだけを「成果の指標」とするならば、この開発者は最も「効率的」に「成果」を上げていたといえるのかもしれない。CSVのデータ項目を「増やす」、「入れかえる」、検索対象項目の「変更」・・って、そのたびに「プログラム改修費」だものな。
カンマ(お題:納涼!ほんとにあった怖いコード)
納涼!ほんとにあった怖いコード(by CodeIQ×はてな)
↓↓↓ ここに君が見たクソコードを書こう!! ↓↓↓
//整形・保存
$Str=str_replace(",",";;;;",$Str);
(中略)
//読み出し、表示
$Str=str_replace(";;;;",",",$Str);
↑↑↑ここまで↑↑↑
これは、とあるPHPコードの、と~っても長~い関数の中の、インデントの深い深~いところで見つけた不思議な処理のごく一部。
これは何か?
CSVファイルにデータを格納・読み出す際の、「カンマ」の我流エスケープ(?)だったようだ。(なるほど、セミコロン4つなら、実際のデータ中に出てくる可能性はまず、無い?:笑)
そもそも、要件は単に、高々百数十件程度のデータの保存および、(絞込み、ソートして)、表形式で表示するだけのこと。
しかし、膨大なコードをたどってみると、この開発者、どうやら「データ形式"CSV"」で、PHP使って「データベースそのもの」の、劣化再発明を意図しているようだった。
「そっちへ行ってはいけない。」そう呼びかけようとするも、声が出ない。そんな怖さを感じた。
_fake (お題:納涼!ほんとにあった怖いコード)
納涼!ほんとにあった怖いコード(by CodeIQ×はてな)
↓↓↓ ここに君が見たクソコードを書こう!! ↓↓↓
(日本語版のソース中)
htmlspecialchars_decode_fake();
(英語版のソース中)
htmlspecialchars_decode();
↑↑↑ここまで!!↑↑↑
むかし、ある同僚が私に言った。
外注したPHPコードのバグが取れない。
「日本語版」は動くのに「英語版」は動かない。
「業者の開発環境」ではどちらも動くのに、「本番環境」では、『英語版だけ』が動かない。
業者は「鋭意調査中ですが、原因不明です」の繰り返し。
埒が明かない。
数週間が過ぎてしまった。
・・とのことだった。(直接の担当ではなかったが、私はPHPを少しかじっていた。その場には、ほかにPHPコードが読める人は、いなかった。)
とりあえず見てみる・・・エラー発生箇所を探してみると、
htmlspecialchars_decode();
なる関数を発見!
この関数はマニュアル↓
http://php.net/manual/ja/function.htmlspecialchars-decode.php
にあるとおり、PHP 5 >= 5.1.0 で使える関数。
業者の開発環境はPHP5だが、当時「本番環境」はPHP4だったので、この関数呼び出しがエラーを起こしていたわけだ。
ではなぜ「日本語版」は動いていたのか。
※該当箇所を探してみると
htmlspecialchars_decode_fake();
なる自作関数が呼ばれていた。
"_fake"
いや、fakeでも何でもいいのだが・・。
これで「鋭意調査中」「原因不明」と繰り返すような業者に依頼していることが怖かった。
台風の中、はてなブログを使ってみる
台湾・台北に住んで、華語と台湾語の勉強中です。
今日は台風12号(華語表記 潭美:チャーミー)が近づいているため、大学の授業が休講になってしまいました。
で、前から気になっていたものの手付かずだった「はてなブログ」のサービスを試してみた次第。
新しいサービスを使ってみる、というのはワクワクするね。