魔女の刻 (14) 東海林さんがキレた日
サードアイの技術部のトップは東海林さんだ。東海林さんは、田嶋社長が以前勤めていたIT 企業をスピンアウトしてサードアイを設立したときの創立メンバーでもある。当初は役員だったが、会社経営の雑事に嫌気がさし、自分から申し出て技術部の課長に収まった。職制上、技術部のトップは斉藤部長だが、これはスキルを反映したものではない。斉藤部長はうちの株式の25% を保有しているK自動車関連会社からの出向で、エンジニアではないからだ。本人もそれをわきまえていて、東海林さんの行動に掣肘を加えようとはしない。おかげで東海林さんは、サードアイの開発業務に関しては、フリーハンドに近い権限を持っている。
東海林さんのプログラミングスキルは社内の誰よりもずば抜けていて、設計のセンスも別格だ。40 代半ばという年齢は、たいていのIT 企業では管理職で部下を指揮していて、自らは実装の最前線からは一歩後退しているのが通例だが、東海林さんは自分で手を動かすのが好きなようで、サードアイの開発部の文字通りトップに立っている。主にK自動車とその関連会社の企業内システムに多く携わり、数々の困難を乗り越えて高品質なシステムを納品することで、元請けや顧客の信頼を勝ち取ってきた。このように優秀で経験の長いエンジニアは、えてして開発手法が固定化されてしまうものだが、東海林さんは同じ事ばかりやっていると飽きてしまうらしく、成功体験に頼らず、常に新しい開発手法や言語、ミドルウェアを研究し続けている。
元請けやエンドユーザに対しても、間違っていることや筋が通らないことについて、口を閉ざしていたり、婉曲な表現を使うことをせず、正面からズバズバと正論をぶつけるので、田嶋社長や営業の黒野などは、いつもヒヤヒヤしている。だが、東海林さんには有能な人間にありがちな傲慢さは存在しない。あるのは、クオリティの高いシステムを作り上げて納品したい、というエンジニアとして、ごく真っ当な欲求だけだ。
生活が仕事一色に染まっているわけではなく、4 才年下の奥さんと、5 才になる娘さんとの時間も大事にしていて、土日祝日はキューブで近場の観光スポットにでかけているらしい。娘さんの誕生日には、私たちに仕事を押しつけてでも早めに退社し、ケーキとプレゼントを買って帰る。自分から娘さんの写真を見せびらかすようなことはしないが、こちらから求めれば、スマートフォンに保存された数100 枚の画像を、それぞれの撮影年月とエピソード付きで見せてくれる。
仕事に関しては厳格で、同じミスを繰り返す部下には冷たい態度で指摘するが、相手が努力している限り、決して見捨てることなく、辛抱強く指導している。私が、過去、仕事で関わった管理職には、部下の失敗をネチネチと責めるのが生きがいのような人もいたし、怒鳴り声と共に机をバンバン叩いて威圧する人もいたが、東海林さんは声を荒げたことがほとんどない。
以前、細川くんがK自動車関連企業の開発業務で、仕様洩れに気付かずサブシステムを納品し、顧客の経理業務を半日止めてしまったことがあった。田嶋社長と東海林さんが、先方の担当者に謝罪に行く騒ぎになり、細川くんは見るも無惨に憔悴して戻ってきた。その日の夕方、急遽開催された全員参加のミーティングの席で、東海林さんは細川くんに一連の経緯と、対応内容、再発防止策を自分の口から報告させた。蒼白な顔で、悔し涙を浮かべた細川くんが、何とか報告を終えて着席した後、東海林さんは頷いて口を開いた。
「ミスを犯さない人間はいない」常と変わらない平静な口調だった。「だから、なぜそんなミスをしたとか、どうしてもっと考えなかったとか、そんなことを言っても誰の役にも立たないし、事態の打開にもつながらない。重要なのは、正しくリカバリすることと、そのミスから1 つでもいいから経験値を得ること、そしてそれを共有することだ。特に3 つ目の共有だな。自分がいつか足を踏み入れるかもしれない泥沼を、誰かが一足先に踏んで教えてくれるなら、こんなにいいことはないからな。ビスマルクとかいうおっさんも同じことを言ってる」
東海林さんは続けて、社内にインシデント共有データベースを構築すること、責任者を細川くんにすることを告げ、ミーティングを解散した。その後、細川くんはRedmine で事例共有システムを立ち上げ、私たちは進んで遭遇したバグや、有効だった手法などを登録するようになった。今では、様々なカテゴリで検索、分析が可能なツールに発達していて、サードアイの貴重な財産の1 つとなっている。
元請けの自称システムエンジニアや、他社の知ったかぶりをするプログラマと仕事をしなければならないことも多々あり、技術的な問題で衝突するときも、東海林さんは冷静に正論を指摘するだけだ。相手が、あくまでも自説に固執して譲らない場合、東海林さんは一応の義務は果たした、とばかりに、肩をすくめて引き下がる。声が大きい方が勝つ、と信じている愚か者に付き合って、声のボリュームを上げて対抗する、というメソッドは、東海林さんにしてみれば時間のムダ以外の何ものでもないのだ。
だから、4 月 24日、月曜日の夕方、私が目撃したのは極めてレアな光景だった。
その日、東海林さんはフリースペースのテーブルの1 つで打ち合わせをしていた。同席しているのは、エースシステムの新美さんと、マギ情報システム開発から来ている杉浦さんだ。どうやら杉浦さんが実装を担当したコンテナを、東海林さんが単体テストを行った結果についてのようだ。先日、私が経験したCSV インポートのコンテナと同様のシチュエーションかと思ったが、新美さんはサブリーダーの中では比較的プログラマに理解があり、実装についても理解しようと努力しているようだったので、杉浦さんの一方的な訴えを鵜呑みにするとも思えない。事実、東海林さんと杉浦さんに対して、公平に事情を確認しているようだ。
打ち合わせが始まって20 分ほど経過した頃、東海林さんのやや大きな声が聞こえた気がして、私はモニタから顔を上げた。同じ音を草場さんも聞きつけたようで、私たちは顔を見合わせた。
「何か聞こえましたね」草場さんは囁いた。
「ですね」私はフリースペースの方を見た。「きっと、うちの東海林が仕様の矛盾点でも見つけて問い質してるんでしょう。それとも、ニコチンが切れて苛々しているとか」
「禁煙中ですよね」
「一応、続いてるみたいです。でも、たまにタバコの自販機の前で立ち止まって、財布出し入れしてますからね。もうすぐ無意識のうちに買って、無意識のうちに吸っちゃいそうな気がしますよ」
「禁煙あるあるですね」
「で、また、娘さんに嫌われた、ってしょげるんですよ」
私の心ない言葉に、草場さんは小さく笑ってくれた。私はモニタに視線を戻したが、またしても東海林さんの声が聞こえた。
「ふざけてるんですか。もう少し真面目に仕事してくれませんか」
今度の声は、開発センターにいるほとんどの人間に顔を上げさせる程度に大きかった。私が再びフリースペースに目を向けると、新美さんがなだめるように東海林さんに話しかけているところだった。杉浦さんは背を向けていて表情はわからないが、両手を膝の上に乗せて肩を強張らせている。
見ていると、東海林さんは少し気持ちを落ち着かせたらしく、3 人はまた小声で打ち合わせを再開した。だが、わずか数秒後に、東海林さんは三度、大声を出した。
「てめえ、いい加減にしろよ!」
新美さんが何か言ったが、東海林さんはそれを無視し、テーブルに身を乗り出して杉浦さんに詰め寄った。危険を感じたのか、杉浦さんの椅子がガタンと音を立てて後方にずれる。
私は慌てて立ち上がると、小走りにフリースペースに近付いた。東海林さんが手を出すのではないか、と心配したのだ。東海林さんが暴力をふるう姿など想像もできなかったが、どんなことにも最初はある。
実際、東海林さんは右手を頭の位置まで振り上げていたが、私の姿を視界に捉えると、やや冷静さを取り戻したようで、表情を和らげた。私の存在が少しはブレーキの役目を果たしてくれたらしい。
「川嶋」東海林さんは隣の空いている椅子を指した。「ちょっと座ってくれ」
「え?」
私は戸惑って、新美さんと杉浦さんの表情を窺った。新美さんは安堵したような顔で、対面する杉浦さんは、どこかふてくされたような顔だ。
「何があったんですか?」
私の質問は東海林さんに向けてのものだったが、答えたのは新美さんだった。
「ちょっとした意見の相違があったようです」
とても「ちょっとした」とは思えなかったが、とにかく私は東海林さんの隣に座った。テーブルの上には数枚のプリントアウトと、新美さんのタブレットが置かれている。タブレットに表示されているコンテナID と機能名は、図書館システムのものだが、これまで打ち合わせでも実装でも単体テストでも、私が担当したことがないコンテナだ。
「今、単体テスト結果について打ち合わせをしていたんだが」東海林さんが言った。「どうも冷静に話ができん。第三者的視点で見て欲しいんだ」
「でも私、このコンテナの仕様はわかりませんよ」
「構いませんから」新美さんがすがりつくように言った。「いいですから座っていてください」
つまり、東海林さんが暴走しようとしたら制止しろ、ということだろう。私が渋々頷いて了承すると、新美さんは東海林さんと杉浦さんに続けるように促した。
「では、もう一度、最初から訊きます」東海林さんは冷静な声で言った。「まず、この部分ですが、select タグの中身がHTML に直書きしてあるのはなぜですか」
「パフォーマンスを考慮してのことです」杉浦さんはボソッと答えた。
私は東海林さんがペンで指している部分を見た。select タグの内側に、option タグが5 つ記述されている。
<select id="reason">
<option value="01">返却忘れ</option>
<option value="02">破損</option>
<option value="03">紛失</option>
<option value="04">返却本間違い</option>
<option value="99">その他(理由を入力)</option>
</select>
どうやら返却期限が過ぎた場合の理由を選択する項目らしいが、この選択肢をHTML に記述するのが間違っていることは一目でわかる。この手の選択肢は、例外なくマスタから選択肢を取得することになっているからだ。
「じゃあこの5 つの選択肢はどこから持ってきたんですか」
「仕様に書いてありましたから」
「仕様には、あくまでもサンプルとして、現行の状態が載っているだけでしょう」東海林さんは仕様書のプリントアウトを叩いた。「それぐらいわからんのですか」
確かに仕様書に載っているのは、現行システムのスクリーンショットだった。
「この選択肢は、そうそう変更されることはないということだったのでね」杉浦さんは無表情に答えた。「それならHTML に書いてしまった方が早いでしょう」
東海林さんは、脳の一部が腐ってるのか、と言いたげに杉浦さんを睨んだが、相手は目を合わせようともしない。
「じゃあ、もしこの選択肢が増えることになって、マスタを更新したらどうするつもりだったんですか」
「さあ」杉浦さんは関心なさそうに答えた。「それはこのコンテナの範囲じゃないですから」
「あんたねえ、そういうことで......」東海林さんは声を荒げかけたが、すぐに思い直したように、口調を戻した。「まあいい。じゃ、次、このエラーチェック部分です」
東海林さんが指したJava のソースは、何かの入力値をチェックするロジックのようだった。4 重にネストしたif else が記述されている。
「先ほどのお話だと」杉浦さんはちらりとソースを見た。「エラーチェックが甘いということでしたか」
「そうは思わないということですか」
「思いませんが」
「こっちのメソッドからの結果が、ブランクかどうかしかチェックしていないじゃないですか」
「何か問題ですかね。更新処理が正常終了ならブランクで、エラーならエラーメッセージなんだから、これで十分でしょう」
東海林さんはそれには答えず、私の方を見た。
「川嶋。ざっとこのメソッド見てみてくれ」
「ああ、はい」
私はソースを確認した。東海林さんの言いたいことはすぐにわかった。
「えーとですね」私は更新メソッドの最後を指した。「ここで返しているのは、更新処理が正常終了したかどうかだけですね。マッチング結果にエラーがあった場合、例外キャッチしていますが、やっぱりブランクで返しています」
「だから何です?」
「これでは、ほとんど全ての場合でブランクが返るから、マッチングでエラーが発生してもわからないということです」
私の指摘に、杉浦さんは小馬鹿にしたような笑いを返した。
「マッチングなんて失敗するはずないですよ」
「いや」私は少し呆れて杉浦さんを見た。「そういう問題ではないと思いますが」
「失敗する原因はいくつも考えられますよ」東海林さんが言った。「この部分の正規表現の記述ミスとか、配列のインデックス間違いとか。でも、ここの問題はそれじゃない。更新処理が正常にいかない場合でも、後続の処理が継続してしまう、ということです。その重要性がわかりませんかね」
「さっきも言ったようにね、私が考えることではないと思いますね、それは」
東海林さんが声を荒げた理由がわかった気がする。新美さんも、杉浦さんの責任感が完全に欠如した言葉に顔をしかめていた。
「では、これ」また怒りが再燃してきたらしい東海林さんは、険悪な表情でソースの別の部分を指した。「このwhile の中でCassandra にinsertしてますが、もし途中で失敗したらどうするんですか」
「どうするも何も」杉浦さんは笑った。「例外出すしかないでしょう」
「そうじゃないでしょう」東海林さんは凝縮した怒りがこめられた低い声で言った。「どうしてトランザクション制御しないんですか」
「トランザクション制御するかしないかは、各コンテナの実装にお任せのはずですよね。このコンテナではしないことにしたってだけです」
「だったら、ループの中では配列かList にinsert するデータを入れておいて、ループ抜けた後に一括でinsert するべきじゃないんですか」
「そういう方法もあるかもしれませんけどね」
「川嶋、どう思う」
「同意見です」私は答えた。「ループの途中で失敗したら、不完全なデータセットが残ることになりますね」
杉浦さんは鼻を鳴らした。
「いや、そりゃ、川嶋さんは東海林さんと同じ会社の人ですからね。同じ意見に決まってるじゃないですか」
「ちょっと!」
私は東海林さんの暴発を抑える、という自分の役目も忘れて、つい大きな声を出したが、東海林さんは腕を組んで杉浦さんを見た。
「確かにそれはもっともです。じゃあ、他の会社の人ならいいんですね」
「まあね」
東海林さんは立ち上がると、こちらを見ているプログラマの中から一人を選んで声をかけた。
「草場さん、ちょっとよろしいでしょうか」
呼ばれた草場さんは訝しげな顔でフリースペースに歩いて来た。
「何でしょう」
「少し意見を聞かせてください」
「はあ」草場さんは隣のテーブルから椅子を引っ張ってくると、私の隣に座った。「どうぞ」
東海林さんは最後のループ内insert の問題について簡単に説明して、意見を求めた。草場さんはソースを指で追いながら確認した後、顔を上げた。
「そうですね。私も川嶋さんに同意します。これはちょっと危険なコードですよ」
東海林さんは、どうだ、と言うように杉浦さんの顔を見たが、杉浦さんの反撃は思いがけない方向から成された。
「いやいや、そりゃ草場さんはそう言うでしょうよ」
「どういう意味ですか」
「だって」杉浦さんはニヤニヤしながら草場さんと私の顔を見た。「お二人、何と言うか、ラブラブな関係なわけですよね」
カッと顔が熱くなった。草場さんも絶句している。
「結局、東海林さん、自分の味方をしてくれそうな人を援軍に呼んでるだけじゃないですか。そうやって、自分が優位に立とうって作戦ですか。ちょっとずるいんじゃないですかね、それは」
私が反論する言葉を思いつけず、バカみたいに口をポカンと開けて杉浦さんを見ていると、不意にテーブルの上ですさまじい音が爆発した。東海林さんが拳をテーブルに叩きつけたのだ。心臓が瞬間停止するかと思ったが、おかげで現状認識を再開することができた。
「ふざけるなよ、てめえ」地獄の門から響いてくるような重低音だった。「やる気あるのか」
「ちょっとちょっと」杉浦さんはさすがに笑いを消した。「新美さん、何とか言ってくださいよ」
それまで茫然と成り行きを眺めていた新美さんは、ハッと我に返ると、私たちの顔を見回した。
「わかりました。この件は、いったんこちらで預かります。検討した上で、改めて指示を出します。とりあえず解散しましょう。仕事に戻ってください。草場さん、川嶋さん、ありがとうございました」
真っ先に席を立ったのは杉浦さんだった。私たちの誰とも視線を合わせず、自席に戻っていく。新美さんがタブレットを掴んで立ち上がり、草場さんもそれに続いた。私は草場さんの表情を確認したかったが、顔を見ることができなかった。
東海林さんはしばらく座っていたが、私がおそるおそる声をかけようとしたとき、大きくため息をついた。
「すまん、大声出して」
私は安堵して座り直した。
「びっくりしましたよ」
「気付いたか」東海林さんは残っていたプリントアウトに顎をしゃくった。「俺が指摘した部分」
「どういうことですか」
「単体テストが甘かったら、見過ごされてたかもしれないことばかりだ」
私は改めてソースを見た。最初の指摘点はHTML ソースを見なければ気付かなかったかもしれない。2 番目は意図的に例外を発生させなければ発覚しないケースだ。最後のループ内insert 問題も、エラーが発生しなければ処理は正常終了するから、実運用が開始されてから発覚したかもしれない。
「たぶん間違いない」東海林さんは歯の間から言葉を押し出した。「これは意図的なミスだ」
確かにそうかもしれない。単純なスキル不足なら、東海林さんがここまで激怒することはなかっただろう。東海林さんはそういうミスには寛容だ。
「でも何のために」
「わからん」東海林さんはそう言いながらプリントアウトをかき集めた。「一応、白川さんの耳には入れておいた方がいいな。それより、もっと怖いことがある。わかるだろう?」
私は小さく頷いた。ケアレスミスやスキル不足によるバグなら、単体テストや結合テストの段階で発覚し、大事にはならないかもしれないが、表面的には正常動作するように見せかけられた不具合は、開発工程の後半か、運用開始まで発覚しないかもしれない。今回はたまたま東海林さんが厳格なテストを行ったために発見できたが、他のテスターであれば通り一遍のテストを行っただけで、問題なし、と判断してしまったかもしれない。いや、そもそも、杉浦さんが単体テストを担当したコンテナはどうなのだろう。
「まあ、さしあたっては単体テストのとき、注意するしかないか」
「そうですね。白川さんが手を打つでしょうし」
「それに期待するか」東海林さんは立ち上がりかけたが、ふと思い出したように訊いた。「それはそうと、お前、草場さんと付き合ってるのか?」
再び顔面が熱を帯びた。
「え、いや、そんなことは......」しどろもどろになりながら、私は小さな声で弁解した。「ないです、ないですよ。ホントに」
草場さんとは、何度かお茶を飲み、3 回ほどランチを共にしただけだ。好意を持っていないと言えばウソになるし、草場さんも私に同じ感情を持ってくれている、と確信を持てるぐらいには距離が近付いてはいる。だが、まだ手すらつないだこともないし、プライベートな話をしたこともない。互いの家族構成すら知らないぐらいだ。
「まあお前は独身だし、別にいいんだがな」東海林さんは少し面白がっているような顔で言った。「ただ、人によっては誤解するだろうし、さっきみたいに悪く利用されることもあるからな」
「......」
私は頷いて自席に戻ろうとしたが、東海林さんはロッカールームの方へ歩き出した。
「あ、どっか行くんですか?」
「ああ」東海林さんは足を止めて言った。「タバコ買って吸ってくる」
「え? 禁煙は?」
「一時中断だ。コーヒー程度じゃ、胸のむかつきが収まりそうもない。もっと強い毒がいるんだよ」
そう言うと東海林さんはロッカールームに入っていった。コートを取って、外に吸いにいくのだろう。
私は自席に戻った。幸い、草場さんは席を外していてくれた。おかげで、気まずい思いをせずにすんだ。
(続)
この物語はフィクションです。実在する団体名、個人とは一切関係ありません。また、特定の技術や製品の優位性などを主張するものではありません。本文中に登場する技術や製品は実在しないことがあります。
コメント
ろ
事件の匂いが強まってきた…!
aoi
なるほど。
前のCSVの一件もそういうことなんですかね。
ん
気になる故意の行方は!
匿名
せっかくセカンドオピニオンを求めるなら出来るだけニュートラル(と思われる)な立場の人を選んだ方がいいって理屈自体は別に間違ってないよね
まあ誰を呼んでも難癖つけられそうだけど
うう
故意でなく素でこういうことばかり書いてくるBPさんと一緒に仕事してます…トランザクション無しとか…涙
匿名
妨害は、おそらくはQ-LICの息がかかってるんでしょうけど。
現在、4月頃でしたか。物語の冒頭は3月。
気が遠くなりそうです。
名無し
東海林さんがキレる必要あるのかな?
普通に、この人こういってますが、どうしますか?って新美さんになげればいいだけなのに。面と向かってこんなはっきり侮蔑すると、後が怖いな~と思う。
西山林
>自分を優位に立とうって作戦
自分が優位に立とうって作戦
自分を優位に立たせようって作戦
user-key.
こうなることを見越して、東海林さんにテストさせているのなら、白川さんすごい。
もっこす
読者の立場でも「それでも白川さんなら…白川さんなら何とかしてくれる」という気持ちを抱いてしまうのが面白いですね。
読者でこれなら、現場の人間からの期待感はもっと凄いでしょうし、その重圧が失踪に繋がってしまうのでしょうか。
匿名
>>名無しさん
東海林さんの性格的に,悪意でバグ混入ってのは感情がコントロールできなくなるくらいムカつく数少ない出来事だ,というのは分かる気がしました。
しかし,東海林さんのような無敵系キャラクターですら性格に凸凹があって,それが魅力的,というのは,さすがリーベルGさんの筆力ですよね。毎週楽しみにしてます。
匿名
とうとうこのシリーズでも、(「怠業」ではなく原義の方の「破壊工作」という意味での)サボタージュをやる奴が出てきたのか……。
破壊工作に手を染めた奴というと、冷たい方程式の亀山という前例がいるけど、
本作のこれは誰の差し金なんだろう。
kazuma
いつも、わくわくしながら読ませていただいております。
ここまでのいろいろな要素がどのように冒頭のシーンにつながっていくのかとても楽しみです。
リーベルG
西山林さん、ご指摘ありがとうございます。
匿名
この連載で初めて章タイトルで笑った
匿名
あら探しで申し訳ないです。
> そう言うと東海林さんはロッカーに入っていった。
ここは「東海林さんはロッカールームに入っていった。」でしょうか?