ふつーのプログラマです。主に企業内Webシステムの要件定義から保守まで何でもやってる、ふつーのプログラマです。

飛田ショウマの憂鬱 (6)

»

 カナの暗躍によって、長谷部は八十田建設プロジェクトに集中できるようになった。飛田は自分と長谷部の双方のために安堵したが、それは長くは続かなかった。飛田もカナも、首藤課長の出世に対する執着心を低く見積もりすぎていたのだ。

 首藤課長の一件があった翌週の月曜日、いつものように八十田建設との打ち合わせから帰社した長谷部は、サブリーダーたちに、明日から直行直帰になる、と告げた。

 「え、なんでですか?」野見山が訊いた。「打ち合わせが丸一日になったんですか」

 「八十田建設での打ち合わせは今日で終わった。何かあれば行くけど、毎日やってたのは、もう終わりだ。明日からは研修だ」

 「研修?」篠崎が首を傾げた。「何の研修ですか?」

 「Java 中級者コース」

 「Java の研修?」飛田は少し驚いた。「なんでまた、今さら」

 「首藤さんの命令だ」長谷部は暗い顔で答えた。

 「何のために研修なんか」

 「もう実装フェーズに入るだろ。その......」長谷部は首藤課長がいないことを確認して、なお小声で言った。「表向きのスケジュールでは」

 「ああ」実際には、大半の機能で実装が開始されている。

 「実装フェーズのマネジメントをするために、Java の基礎知識が必要だと考えたらしい」

 「それは間違ってないですが」篠崎が呆れたように言った。「そんな付け焼き刃でどうにかなるもんじゃないですよ」

 「何日の研修だ?」飛田は訊いた。

 「明日から木曜日までの3 日間だ」

 「時間の浪費だな」

 舌打ちした飛田に、長谷部は少しムッとした顔を向けた。

 「あのな。こうなったのは誰のせいだと思ってるんだ」

 「何のことだ」

 カナがやったことがバレたのか、と飛田は考えたが、長谷部は予想と異なる答えを返した。

 「実装フェーズじゃ、オレは名ばかりリーダーで、実質的にはお前が具体的な指示を出すことになるだろう。首藤さんは、それを嫌がったんだ」

 「飛田さんも嫌われたもんですね」野見山が乾いた笑い声を上げた。「そういうことですか。それで研修ですか」

 「とことんおめでたい人ですね」篠崎の声に怒りがにじんだ。「完全に優先順位を間違えてます」

 長谷部は軽く両手を挙げて降参のポーズを作った。

 「まあまあ。形式的なことだよ。オレだって研修を受けたぐらいで、それがそのまま実務に応用できるなんて思っちゃいないからさ」

 「首藤課長は違う考えだと思うがな」飛田は呟くように言った。

 

 1 月第3 週目に入った頃、飛田の予想が具現化した。

 表向きのスケジュール上でも実装フェーズに入り、開発チームは一丸となってコーディングとテストに集中していた。飛田はパッケージの決定、共通ロジックの作成、テーブル設計の見直し、ストアドの作成など、他のメンバーの倍の作業をこなしつつ、メンバーと個別に短いコードレビューを行い、コードの質を上げることにも注力していた。

 「コードレビューに少し時間を取られてないか?」あるとき、長谷部が訊く、というより注意喚起した。「メンバーのスキルアップが大事なのはわかるけど、今は少しでも実装を進めた方がいいと思うんだが」

 飛田は首を横に振った。

 「別にメンバーのスキルのためにやってるんじゃない。後の工程で、俺自身を含めた全員が楽をするためだ」

 「?」

 「今の段階で出る問題なんか、すぐにつぶせるものばかりだ。本当に厄介なのは、結合テストや受入テストの段階、下手したら本番稼働した後で発生するやつだ。再現が難しい場合もある。うちからは直接、八十田建設のデータベースへ接続できないからな。そんなときソースがゴチャゴチャだと、発生箇所を突き止めるにも時間がかかる。今のうちに、ソースをきれいにしておけば、解決までの時間を短縮できる」

 「なるほどね」

 長谷部は感心したように頷いたが、そこに首藤課長が口を挟んできた。

 「長谷部くん。君も研修受けてきたんだから、コードレビューぐらいやってみてはどうかね」

 Java の研修を終えた長谷部は、本人が明言したとおり、実装に関して口を挟もうとはしなかったが、勉強も兼ねてメンバーがコーティングしたソースを眺めたりはしていた。あくまでも眺めているだけだったので、飛田は気にも止めていなかったが、首藤課長は別の感想を持ったようだった。

 「ずっとソースを熟読していて、いろいろ不都合な点などが見えてきた頃じゃないのか」首藤課長は笑顔で言った。「サブリーダーに遠慮することはないんだぞ」

 長谷部は困惑したが、首藤課長は構わず続けた。

 「いい機会だ。今、やってみてはどうだ」首藤課長は周囲を見回して、メンバーの一人に目を留めた。「石黒くん、今、やっているのはなんだ」

 「は?」石黒は驚いて顔を上げた。「はい、資材マスタのインポートですが」

 「じゃあ、それで行こう。セーブしてこっちに来い。長谷部くん、レビューしてやってくれ」

 石黒は言われたとおりソースを保存すると席を立った。長谷部も仕方なく、共用のPC が置いてあるデスクに移動した。縦回転できるディスプレイスタンド付き27 インチモニタがあり、ソースを見ながら簡単な打ち合わせなどができるスペースだ。飛田がコードレビューを行うのも、この席だった。

 長谷部と石黒が並んで座り、首藤課長がその後ろに立った。飛田も腰を浮かせたが、首藤課長に機先を制された。

 「他の人は自分の作業を進めてください。石黒くん、始めて」

 石黒は戸惑いながらも資材マスタインポート機能の説明を開始した。資材マスタは基幹システムからCSV ファイル形式でインポートする仕組みになっている。飛田が一番経験の浅い石黒をアサインしたのは、画面がなく、単純にファイルを読み込み、データベースを更新するだけのスタンドアロンアプリケーションだからだ。飛田は自分のモニタに視線を向けながら、聴覚を長谷部と石黒の声に集中させた。

 お世辞にも要領がいいとは言えない石黒の説明に、最初のうち長谷部は頷くだけだった。首藤課長が質問を促すように小さく咳払いすると、おそるおそる、ロジックの意味などを訊き始めたが、得られる答えが「はい」か「いいえ」のどちらかで済むようなわかりきった質問ばかりだ。首藤課長の目がなければ、それさえ発しなかったに違いない。

 10 分ほどで一通りの説明が済むと、長谷部はホッとしたように笑顔で頷いた。

 「うん、わかった。ありがとう」

 「それだけかね」首藤課長は不満そうに言った。「もう少し時間をかけてやるものじゃないのかな。指摘事項も何か言ってやれよ」

 普段、飛田がコードレビューを行うときには、この4 倍は時間をかけて、30 以上の指摘事項が出る。首藤課長はそれと比較したのだろう。

 「はあ、そうですね」

 長谷部はモニタに向き直ると、何度かスクロールした。

 「このif 文だけどさ」しばらくソースを追った後、長谷部はようやく指摘事項を発見した。「逆にしたらどうかな」

 「逆......ですか」石黒はモニタを注視した。「どういう意味でしょうか?」

 「えーとさ、これだと、このmatCategory がnull のときエラーになるだろ。これをこっちにすれば、null でもエラーにならないじゃないか」

 「......」

 飛田はSVN リポジトリを開くと、資材マスタインポート機能の最新ソースを開いた。長谷部が口にした変数を使用している場所を探す。

 「こんな風ですか」石黒がキーを叩いている。

 「そうそう、そういうこと」

 該当部分を一瞥した飛田は、すぐに立ち上がった。首藤課長が険悪な表情を向けてくるのも構わず、長谷部と石黒の間に割り込んで、修正されたソースを確認する。

 if("SZ1".equals(matCategory)) {

 やっぱりそうきたか。飛田は唸った。リポジトリに登録されているのは、

 if(matCategory.equals("SZ1")) {

 となっていた。長谷部が「逆」という言葉を口にしたときから、そんなことだろうとは思っていたのだ。

 「ちょっと待て」飛田はソースの該当部分を指した。「それ、元に戻せ」

 「おいおい」長谷部が飛田の顔を見上げた。「どういうことだ」

 「この書き方、研修で習ったのか?」

 「ああ」長谷部は頷いた。「余った時間に。ちょっとしたテクニックだと言ってた。これだとまずいか?」

 「この書き方の意図は、要するにヌルポ対策だよな」

 「ぬるぽ?」

 「Null Pointer だ」飛田は言い直した。「matCategory がnull だったときに例外が発生するのを防ぐためじゃないのか」

 「ああ、講師の人もそう言ってた。こうすればいちいちnull かどうかのチェックを入れずに済むって......違うのか」

 「違わないが、ここでこの書き方はダメだ」

 「どうして?」

 飛田は石黒を見た。

 「石黒、わかるか?」

 「えーと......その」石黒は、飛田と長谷部の顔を交互に見た後うなだれた。「すみません。わかりません」

 「matCategory は引数だ。もし、matCategory がnull だった場合、このメソッドでは何も実行されずに通り抜けてしまう。その場合は、きちんと例外を発生させるべきだ」

 石黒は納得したように頷いたが、長谷部は意味がよくわかっていないようだった。

 「でもエラーが、あ、例外か、それが発生したら、処理が止まってしまうだろう。それはまずいんじゃないのか」

 「処理が止まるのは確かにまずいが、このチェックが実行されずに、間違ったカテゴリで資材マスタが登録されてしまう方がもっとまずい。表面的には処理が正常終了していても、マスタデータに不整合が生じている可能性があるわけだからな」

 「それに」いつの間にか近くに来ていた篠崎が補足した。「さっき飛田さんも言ってましたが、この手の問題は、月次締め処理とか、月間集計表の出力とか、ずっと後になって発覚することもあります。その時点でリカバリするのは大変な作業になります。それぐらいなら、例外で落ちた方がマシですよ」

 「このインポート処理は夜間バッチで実行されるからな。最悪、朝一で例外を確認して、修正、再実行すればいい。八十田建設の業務開始は9時からだからな。そもそも、matCategory がnull になる可能性があるなら、このメソッドに渡す前か、このメソッドの先頭でnull かどうかをチェックして、適切なエラーメッセージを返すようにするべきだ」

 そのとき、黙って聞いていた首藤課長が、苛立ったように介入した。

 「君たちは」首藤課長は飛田と篠崎に言った。「自分の立場がわかっているのか。君たちはサブリーダーだ。サブリーダーはリーダーの指示に従ってもらいたいね」

 篠崎が反抗的な目を向けた。

 「飛田さんの指摘は当然のものです。別に長谷部さんの指導力にケチをつけようとか、そんな意図があったわけではないと思いますよ」

 「最終的に判断をするのはリーダーだよ。するべきだ、などと指図するとは、サブリーダーの職務権限を超えた行為だと思わないのかね」

 篠崎が沈黙したのは、首藤課長の言葉に納得したわけではなく、議論がかみ合っていないことに気付いて無益さを感じたからだろう。飛田も口を出したことを、すでに後悔しかけていたが、篠崎の援護に報いるためにも反論した。

 「長谷部には、まだこの種の問題の判断を下すことはできません」

 「そんなことはないだろう」首藤課長は嫌そうに顔を背けた。「長谷部くんだって研修を受けてきたんだ」

 「研修を何日か受けた程度で、業務システム構築に必要なスキルが身につくわけがないでしょう。業務システムの構築には、ある程度の経験が必要です。長谷部にはその経験が不足しています」

 「君が長谷部くんを差し置いて、あれこれ口を出していたら、経験を積みたくても積めないじゃないか」

 あまりにもバカバカしい言い草に吹き出しそうになりながら、冷静な口調を保つだけの理性が飛田には残っていた。

 「経験を積ませたいのであれば、まず一プログラマとして実装に参加させてはいかがですか」

 「長谷部くんに必要な経験は、チームリーダーとしての経験だ。会社の方針も、上流工程に携わる人材を育成するとなっている。プログラマみたいな誰でもできる仕事じゃない」

 篠崎が唾を吐き捨てそうな顔を首藤課長に向け、フンと鼻を鳴らすと、自席に戻っていった。愛想を尽かしたのだろう。仮に会社が篠崎の契約延長を望んだとしても、もはや篠崎の方で拒否するに違いない、と飛田は思った。

 「みなさん」首藤課長は開発チームの全員に向かって言った。「この際だから言っておきます。会社の方針で、遠からず社内での実装は激減します。プログラムしかできない人材は不要となりますので、今のうちから上流工程に必要なスキルを習得しておくことを推奨します。今回のプロジェクトは、よんどころない事情で社内で実装を行っていますが、これはあくまでも例外だということを肝に銘じておいていただきたい」

 メンバーたちはざわめいたが、首藤課長は気にも留めずに、飛田に向き直った。

 「君だって例外じゃないぞ」首藤課長は可聴域ギリギリの低い声で言った。「単なるプログラミング職人など、この会社に必要ではなくなるんだからな」

 こいつに何を言ってもムダだ、と悟りつつも、飛田は離れていった篠崎のためにも反論した。

 「上流工程だけをやるにしたって、プログラミングの知識は必要です」

 「不要だとは言わないよ」首藤課長は薄笑いを浮かべた。「最低限の知識だけあればいいんだ。必要なのはプログラミングの知識ではない。プログラマを使いこなすノウハウだよ」

 それを長谷部で実証しようとしているのか、と飛田は嫌悪とともに悟った。

 「とにかく」議論にケリを付けるように首藤課長は言った。「石黒くんは、今の長谷部くんの指摘通りに修正しておくように。いいね?」

 石黒は許可を求めるように飛田の顔を見た。それが首藤課長の逆鱗に触れた。

 「君は今の話を聞いていなかったのか!」首藤課長はヒステリックな声で喚いた。「リーダーは長谷部くんだ。君は長谷部くんの指示にのみ従えばいい。サブリーダーはリーダーの補助にすぎないんだ。今後は、何か相談があるときは、まず長谷部くんに持って行くように。コードレビューも同じだ。わかったか」

 「は、はい」石黒は何度も頭を上下させた。「わかりました」

 「他のみなさんもいいですね」

 首藤課長の念押しに、開発メンバーたちは顔を見合わせながら頷いた。何人かは、首藤課長から顔を背けて口を動かしている。バカじゃないの、という心の叫びが聞こえてくるようだった。

 ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇

 当初、飛田は首藤課長の命令を軽く考えていた。メンバーが何かの質問や相談をする必要ができたとき、長谷部に質問するにしても、長谷部がすぐに飛田や他のサブリーダーに振ってくれればいいのだから。

 だが、翌日の朝、メンバーの一人が長谷部に相談に行ったとき、その考えを改めた。長谷部が「それは飛田に相談してみてくれ」と言った途端、その様子を見守っていた首藤課長が、即座に立ち上がったのだ。

 「おいおい長谷部くん」首藤課長は穏やかな口調で言った。「もう少し詳細に中身を確認して、君が判断できることであれば、君の方で完結させてやってくれ。リーダーなんだからさ」

 長谷部はやむなくメンバーから詳しく内容を聞き始めた。仕様レベルの話であれば長谷部で対応できるが、実装レベルとなると判断できるはずもない。メンバーの質問の意図を理解しようと、長谷部は額に汗を浮かべながら苦闘していた。結局、20 分ほど時間を潰した後、長谷部は改めて「この部分は飛田が類似の機能をやっていたので相談してみてくれ」と言い、自分自身とメンバーを解放した。首藤課長は満足そうに頷いていた。

 同様のシチュエーションは、午前中だけで10 回以上発生し、長谷部はその都度、ムダな時間の浪費を強いられることになった。結果的にサブリーダーの誰かに振ることになるのだが、首藤課長が観察している間、長谷部は「リーダー」としての役を完璧に演じることを求められたのだ。

 夕方、首藤課長と長谷部が休憩に出ていくと、サブリーダーの3名はリフレッシュルームに集合した。この会合は定例になりつつあり、野見山は飛田にはわからない理由から「エルロンド会議」と呼んでいた。

 「これなら」野見山がこぼした。「長谷部さんには悪いですが、首藤課長と外回りに行っていてくれた方がよかったですね」

 「顧客開拓」を禁じられた首藤課長は、自らの失点を取り戻すべく、傍から見れば「ゴマすり」としか思えない行動を取っていた。呼ばれてもいない会議や打ち合わせに、適当な理由で出席し、部長や本部長の意見に大げさに同意してみせる、というものだ。意図が見え透いていたとしても、その類いの言葉を聞いて良い気分になる人間は一定数以上いるようで、首藤課長に対するウケはいいらしい。飛田にはどうでもいいことだったが、問題はそれ以外の時間を、長谷部の帝王教育に費やすことに決めたらしいことだった。先ほどのコードレビューのように、開発チーム内で長谷部のリーダーシップに疑問符が付けられるような状況が発生すると、過保護すぎるモンスターペアレントのように介入してくるのだ。

 「本当は長谷部さんが嫌いで、プレッシャーかけて精神的に追い込むつもりなんですかね、あれは」

 「いえ」もはや首藤課長に対する侮蔑を隠そうともしない篠崎が言った。「あれは、本気で長谷部さんが開発チームリーダーとして成功することを望んでるんだと思いますよ。自分の言いなりになる部下として、ですが。ただ、やり方が間違ってますね」

 飛田は頷いた。飛田自身はマネージャー職に興味はないが、素人目から見ても、長谷部が挫折や失敗に遭遇しないように、先回りして障壁を排除してやるようなやり方は、百害あって一利なしだと思うのだ。とはいえ、当の長谷部が、それを受け入れている以上、飛田が意見するような話でもないのだが。

 「もう質問の類いは、全部メールかチャットで送らせたらどうでしょう?」

 野見山が提案したが、飛田は同意しなかった。口頭での質問や相談が皆無になれば、逆に首藤課長が不審に思うだろう。それぐらいなら、首藤課長の不在時を狙って、質問に来させた方がいいぐらいだ。たとえ見つかっても「うっかり」で済むが、陰でやっていたことが発覚すれば公然たる反抗になる。もちろん首藤課長は怒り狂うだろう。

 「怖いのは」篠崎が憂鬱そうに言った。「メンバーの人たちが、質問や相談を控えるようになることです。そうなると、どうしても細かい部分でミスが発生してきます」

 「コードレビューも禁じられたら、当然、そうなるでしょうね」

 「かといって、コミットされたソースを、全て我々がチェックすることは、時間的に無理がありますからね」

 「メンバーたちが、あまり変なコードを書いてこないことを祈るしかないですね」

 どうにもすっきりしない。飛田はみぞおちのあたりで、重い何かが蠢いているような不快感を感じた。解決方法がわかっているのに、それを採用できない苛立ちだ。

 本来なら、それほど工数を要するシステム構築ではないのに、技術的以外の要因によって、不要な工数が消費されている。飛田がチームリーダーになり、プロジェクトマネジメントをしていたら、メンバーたちはコーディングに集中し、サブリーダーたちは、こんな「エルロンド会議」とやらを開かずにすんでいただろうし、飛田もオークションサイトで予定外の散財をしなくてすんだはずだ。シグマファクトリーは、システム会社であり、技術力によるサービスを売っているにも関わらず、プロジェクトの多くの工数が技術以外のあれやこれやで消費されている。普段は考えないようにしているが、首藤課長のような人間が、自分の出世のために技術者を使い捨てようとしているのを見ると、飛田は何かを破壊したくなる衝動に駆られるのだ。

 これといった対策を思いつけないまま、3 人は仕事に戻った。せいぜい、サブリーダーで、危なそうなソースを頻繁にチェックするよう心がけるぐらいしか、手の打ちようがないのだ。さすがの首藤課長も、いずれは自分の行為が長谷部をスポイルしていることに気付くのではないか、という希望的観測もあったし、なるようになれ、という投げ遣りな思いもあったからだ。

 ただ、3 人のサブリーダーは「失敗する可能性が少しでもあれば必ず失敗する」というマーフィーの法則が、システム開発においては、ほぼ事実であることを、経験則から知っていた。引数がnull になるはずがないと決めつけてチェックを省略したメソッドでは、いつか必ずNull Pointer Exception が発生する。重要なのは発生するかしないか、ではなく、いつ発生するか、なのだ。3 人は何か重大な問題があるなら、せめて実装フェーズの間に発覚してほしいと祈っていたが、あいにく天には届かなかったようだ。八十田建設見積書管理システム構築プロジェクトにおいて致命的な問題が発生したのは、1 月30 日だった。結合テストが80% 以上完了し、受入テストのためにシステム一式を八十田建設に納品する2 日前である。

(続)

Comment(7)

コメント

Edosson

>処理が止まるのは確かにまずいが、

なんで? 正しくない処理はすべて停止するべきだ、と断言するところじゃないの。

あるいは、明示的にnullチェックを入れる方法もある。
これは、既存のコードの手直しを嫌ったのかな?

いや「対処可能なことだ」といいたくて突っ込んでるんじゃないんですけど。

長谷部も「勉強になった。ついては飛田の~」くらいいえばいいのに。
課長さんが怒り狂うだろうから、それはないか。

「何も選ばない男」なんて、
プロジェクトがこけて責任転嫁を受けても、自業自得だわさ。

--

>首藤課長は笑顔を言った

mpo

エルロンド会議w野見山さんと仕事したくなった。
この中つ国は闇の勢力が強すぎて負けそうだなー。

hoge

入ってはいけないデータが入るのは止めるべき。

経験積ませるって、データがめちゃくちゃになってお客さんに大損害負わせて損害賠償されてもいいんですか?
それても部長はそういう経験を積みたいんですか?って言えばいいのになー

リーベルG

--さん、ご指摘ありがとうございました。

astoria

>最悪、朝一で例外を確認して、修正、再実行すればいい。
この状況が発生するなら、処理が止まるのは「確かにまずい」
(9時より早くて修正間に合う朝一って、、)
その直後に"間違ったカテゴリで資材マスタが登録されてしまう方が「もっとまずい」"といっている。

というかそもそも、このif 文がなかったらnullがチェックされないというのがまずい。
まあそれは飛田自身も「このメソッドに渡す前か、このメソッドの先頭でnull かどうかをチェックして」といっているのか。

fanaby

篠崎さんいい人ダナー( ;∀;)
意見を言ってくれる協力会社の人間なんて宝だろうにもったいない
エルロンド会議の3人は全員したたかでなんか好き

コメントを投稿する