Enter■ふつーのプログラマです。企業内Webシステムの要件定義から保守まで何でもやってる、ふつーのプログラマです。2015/05/11他人が書いたソースは読めない、と思い込んでいるエンジニアが大勢いる。他人が書いたソースが読めないとしたら、書く方が正しく書く努力を怠っているか、読む方が読もうとする努力を怠っているかのどちらか、またはその両方だ。インシデントZ前、ぼくが働いていた業界では、リーダブルなコードを書こうという気運が少しずつではあるが広まりつつあり、いくつかの良書の出版がそれを後押ししていた。ぼく自身、たとえ納期に追われる激務の最中であっても、読みやすいコードを書くことが、結局は顧客も含めた関係者全員の利益となるということを学び、それを実践してきたつもりだった。実際にやるかどうかはともかく、ユニットテストにかけやすいメソッドを書く、といった類いのことだ。ソリスト・システムのコーディングをしたプログラマたちは、それらの良識とは対極の考えを持っていたらしかった。いや、むしろ、何の考えも持っていなかったというべきか。待ち望んだソースを入手したぼくは、その膨大な数に驚きながらも、喜び勇んで適当なクラスを開いてみた。目に飛び込んできたのは、日本語ではない数行のクラスコメントだった。行だけ英語のコメントがあったが、残りはほとんど中国語のようだった。ぼくは思わず天を仰いだ。他のソースをいくつか開いてみたが、大半が英語と中国語で、日本語は数えるほどしかなかった。コメントから中身を把握できるのではないか、という希望が霧消していった。「うーん」ぼくは思わず唸った。「どうかした?」聞き咎めた島崎さんが訊いてきた。日本語のコメントがほとんどないということは、国内で実装が行われていないことの証左だ。すると、ソースが事前に提供されなかったのは、これが原因なのかもしれない。この場でそんな事実に言及したところで、Z判定ロジックのバグフィックスに役立つわけでもない。中国語のコメントが並んでいる。コーディングの傾向だけでも掴めないか、とメソッドの中に進んでいくと、何の処理だかわからないが、いきなりこんなコードに出くわした。{break;}}意味不明なコーディングだ。入れていることもそうだが、これだと最初のメソッドしか実行されない気がする。何か隠された意図があるのかと、何度か読み直してみたが、頭が混乱しただけだった。そのクラスを閉じて、別のクラスを開いた。コーディングしたのは別のプログラマのようだが、やはり同じような意味なしコードが頻出している。業界は今のところ斜陽産業だ。ベテランプログラマの多くが転職を余儀なくされただろうから、人材不足なのは理解できる。それを差し引いても、新人研修レベルのコードが多くて、怒りすらおぼえるソースだ。数値を定数宣言しておいて、どこでも使用されていなかったり、数百行のデッドコードが放置されていたりと、意図的に難読化してあるのではないかと思ったほどだ。ベースだというのに、インシデントZ前に普通に使われるようになっていたラムダ式も全く使用されていない。何よりもソースに統一感というものが感じられない。変数名の付け方や、インデント方式など、最低限のコーディングルールすら設けられていないのだ。国際的大企業からの納品物とは思えない。典型的な「動けばいい」プログラムだ。以前に一緒に仕事をした別会社のプログラマが、打ち上げの席で言っていた言葉を思い出した。同じ横浜市内の小さなシステム会社だったが、技術力では定評のある会社のトッププログラマだった人だ。「昔ならともかく、動くだけのソースを書くのは簡単なんだよね、今どきは。サンプルなんかネットにいくらでも転がってるから、それをコピペすれば、とりあえず動くものはできちゃう。俺たちはこれで金もらってるプロなわけだから、それだけじゃいかん、と思うんだよね。エンドユーザが求めてるのが、動くシステムであることはもちろんなんだけど、ただ動くだけじゃなくて、ちゃんと正しく動くってことが重要なんだよ。仕様変更や追加に強い作りにするとか、ソースの可読性を上げるとか、エラーに対して予防線張っとくとか、そういうことも含めてね」その人が、このソースを見たら、血管が何本かブチ切れるに違いない。個のインターフェースとクラスが含まれていた。数日間の作業時間と、必要なドキュメント、できれば高解像度のデュアルモニタがあれば、ソースを読んでいくことで原因の糸口ぐらいは掴めたかもしれないが、現実的にぼくの目の前にあるのは、短い時間と貧弱なデバッグ環境だけだ。極端なまでにソリスト用カスタマイズが施されているらしく、コンパイラのエラー/警告が全て「無視」に設定されていたし、プロファイラなどのツールも無効になっていた。ポインタアクセスや、同値比較などがあっても、エディタ上でアラート表示することさえできない。何かの罰ゲームか、これは。キロ弱で南下していた。事前にシミュレーションが提供されたといっても、隊員たちのソリスト端末にインストールされている機能とは相違が多数あったらしく、島崎さんの元には数分おきぐらいに隊員の誰かから、機能や使用方法について問合せが入っていた。島崎さんはマニュアルを参照することもなく、迅速に対応していたので、大きな不満に発展することはないようだ。分ほど飛行させた後、臼井大尉の命令で指揮車両に戻されている。メートル以内のZ分布マップをリアルタイム更新できるはずなのに、ほとんど正常に機能しなかったからだ。機能しないだけならともかく、明らかに何もない路上にZマークを自信満々で点滅させたり、バンド隊員の真横を数体のZが同じ速度で進んでいるとアラートを上げたりしていて、それらの偽情報に気を取られるぐらいなら、ない方がいい、と臼井大尉が判断したからだ。間違ったコメントなら書かない方がいいのと同じだ。本ほどのソースを読んだ後で、というより、読むのを断念した後で、ぼくは方針を変えることにした。「胡桃沢さん」ぼくは仏頂面の胡桃沢さんに話しかけた。胡桃沢さんはうるさそうに顔をしかめたが、ぼくの質問を露骨に無視することもできかねたようで、「知らん」とは言わなかった。「まず仮想環境を生成する。いうメニューがあるだろう。ダイアログが開くから、リソースを割り当てて実行する。言われた通りに仮想環境を作成すると、Z探知サブシステムのテスト環境が立ち上がった。幸いなことにメニューは日本語化されている。様々なエレメントを追加してテスト環境を構築した後、Zをランダム、または任意の位置に配置する。後はソリストシステムコアと、ソリスト端末、そして広域情報収集オブジェクトを追加すればいい。指揮車両、バンド隊員、ドローンだ。エレメントは手動で配置することもできるが、現状を忠実に再現することが目的ではないので、用意されているテンプレートを使用することにする。階建ての一般住居が多いパターンの仮想空間が生まれた。体のZをランダムにばらまき、指揮車両、バンド隊員、ドローンを中央に配置する。「このテストツールはよくできてますね」ぼくは、様子を見に来た島崎さんに言った。似てますね」テストツールは、メニュー体系や、グラフィック、応答速度、環境エディタと、どこを取っても使いやすく作られている。ソリスト本体が、これぐらいの完成度だったらよかったのに、と思いながら、テストを実行した。ランダム配置したZが見事に全て探知され、別ウィンドウの結果画面に表示されている。この程度で探知不能になるのであれば、さすがに出発前に修正されているだろうから。ぼくは結果をクリアすると、今度はトレースを有効にして再実行した。結果は同じなので結果画面はすぐに閉じた。ぼくが見たかったのはトレースログだ。メニューから「ログ表示」を選択すると、今の一連の探知シミュレーションで動作したクラス名とメソッド名がずらりと並んだログが表示された。範囲を絞っておきたい。どこかにステップ実行のような機能があるはずだ。ぼくは実行メニューの中から「デバッグ実行...」を見つけてクリックした。「ステップイン/アウト」があったので実行しかけたが、その下に「タイムライン」というのがあったので試してみた。実行するとタイムラインを表すバーが表示され、その上をグリーンのアイコンがのろのろと進んでいく。ボタンがあり、コントロールができるようだ。ミリ秒単位で停止等が可能なようだ。ミリ秒毎に一時停止点を設定すると、再実行した。最初の一時停止点で止まったとき、結果画面を表示し、まだZが探知できていないことを確認する。実行を再開し、次の一時停止点で同じことを繰り返す。ミリ秒付近で実行されているクラスをピックアップした。最初の1つは、PatternAnalysysZopticalBuilder158Impl。ここから始めるべきだろう。ぼくはソースを開いた。中国語のクラスコメントだ。「どう?」島崎さんが訊いてきた。「とりあえず、とっかかりは。「どれぐらいかかりそうかな。あっちの人が......」島崎さんはちらりとボリスの方を見た。「気にしてるみたいなんだよね。目安だけでもわかるといいんだけど」わかるもんか、と思ったが、島崎さんの立場も理解できる。ぼくは少し考えて答えた。島崎さんは戻っていった。ぼくはペットボトルの水を飲むと、読みづらいソースを追い始めた。分後、隊列は菊名駅付近に近づいていた。予定より遅れているのは、ソリストのZ探知ができないため、進行速度を落とさざるを得なくなったためだ。加えて、Zの群れをやり過ごすために、何度も停止している。分過ぎたけど」島崎さんが申しわけなさそうに言った。「少しわかってきたんですが......」ぼくが追っていたのは、Z判定のアルゴリズム部分だった。完全に追い切れてはいないが、ソースから推測できた限りではポイント方式で判定を行っているようだ。以上ならレッドフラグとなる。マテリアルは、ドローンからの各種情報の他、バンド隊員たちのヘッドセットに搭載されているセンサーやカメラからの情報も含まれる。ファイルにはソースを含めることができるが、これを作ったエンジニアはそうしなかったようだ。