氣象報告常常不準

台湾生活。華語・台湾語学習。システム関連の話題など。

見切り発車(お題:納涼!ほんとにあった怖いコード)

納涼!ほんとにあった怖いコード(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.で動作完了の確認をしていなかった。代わりに「固定秒数待機」の処理が入っていた。

 つまり、「まあこのくらいで十分か?」というところでの『見切り発車』だった。

 「条件変更」にかかる時間にはバラつきがある。動作がまだ終わらないうちに、次の命令を出してしまうと、装置からエラーコードが返る。
 しかし
「例外処理は実装されていない」
ので、しばしば、そのまま止まっていたわけだ!