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

夜の翼 (9) 実戦デビュー

»

 それから2 日後、シュンは華々しい実戦デビューを飾った......と言いたいところだが、実際は真逆の結果となった。素人の男の子が、初めて操縦するロボットで敵を倒すシチュエーションが見られるのはアニメの中だけだ。シュンにプログラミングの才能があることを疑う理由はない。だが、シュンには、ある要素が他のPO と比べて大きく欠けていた。私の最初の役目は、そのピースを埋めることだった。
 横浜市の小中高が一斉に夏休みに突入した7 月20 日。午前9 時ちょうどにシュンは横浜ディレクトレートのセクションD オペレーションルームに姿を現した。
 「これでローテーションが組みやすくなりますね」サチが安堵したように言った。「繁忙期だとインターバルなしでしたから」
 私も心から同意して頷いた。セクションD のPO はこれまで4 人。4 mod 2 はゼロなので、オペレーションが連続する場合、ペアが変更になるだけで、休憩を取ることもできなかったのだ。5 人になれば、剰余の一人は、ゆっくり心身を休めることができる。
 PO 管理規定では、オペレーションの連続回数と連続勤務時間数に、それぞれ上限が設けられている。オペレーションの内容にもよるが、前者は6 回から9 回、後者は10 時間から13.5 時間。これはPO の心身の健康を考慮しているためだけではない。オペレーションに携わる時間が増え、精神的な負荷が増大すると、構築するロジックに脆弱性が発生する確率が急上昇するのだ。ところが、これら規定には「管理者が必要と認めた場合に限り、○○(回/時間)を基準に、上限を超えてオペレーションに携わることを可能とする」という例外項目が設けられている。そして、この例外は、あたりまえのように濫用されていた。他の支部では、21 時間勤務を、3 日連続でこなした挙げ句、カフェテリアの自動販売機に向かって「いーあ、いーあ、ふんぐるい、むぐるうなふ......」と話しかけていたPO が緊急搬送されたこともあるらしい。アーカム・テクノロジー・パートナーズが求人サイトに掲載されることがあれば、ブラック企業認定は免れないところだ。
 ペアプロをやったことがない人間は、コーディングするドライバはともかく、ナビゲータの方は横から見ているだけだから、楽なものだろう、などと考えるものだ。ところが、ATP 全体でも、横浜ディレクトレートだけでも、むしろナビゲータの負荷の方が高いことが明らかになっている。ドライバが目の前のコードだけに集中すればいいのに対して、ナビゲータはロジック全体に責任があるからだ。
 シュンは午前中、コーディングルールやライブラリの概要、ツールの操作方法について研修を受けた後、昼食を挟んで、午後からドライバとして実戦投入されることになった。ナビゲータはリンだ。ここ数日は、SPU からの侵入の頻度は平年並みに抑えられていて、スポット対応は他のセクションに任せることができていたので、シュンが対応するのは防壁の構築だ。
 「じゃ、始めよっか」リンはシュンの端末の斜め後ろに置いた椅子から言った。「えっと、今日はリマ・ワン・ナイナー・セブン、ノヴェンバー・ツー・ナイナー、ブラボー・ツー・スリーから。どこかわかる?」
 「うん」シュンはツールの階層を辿った。「レイヤー197、ノード29、ブロック23 だね」
 「あたり」リンは手にしたタブレットを見た。「インターセプターの仕様変更ね。んじゃ、始めていいよ。普通だったら、何かあったら、そのたびに指摘するんだけど、今日はとりあえず自由にコーディングするようにってことだから。わからないとこは訊いて」
 シュンは頷いて、ソフトウェアキーボードに指を走らせた。リンは、これでいいんだよね、と訊ねるような視線を私に向けた。
 この指示を出したのは私だ。まずはナビゲータのサポートなしでコーディングさせ、後でコードレビューを実施するためだ。ただし、このことはPO たちには伝えていない。
 隣の席ではハルとマイカのペアが防壁構築作業を行っている。インターバルのカズトは、ソファに寝転がってスマートフォンのゲームに興じていたが、シュンのコーディングが始まると、興味を惹かれたようにリンの隣に立って、モニタを眺め始めた。リンがちらりとカズトを見た。
 「なに?」
 「天才くんのコーディングはどんなもんかと思ってさ」
 「それ」リンはカズトのスマートフォンを顎で示した。「音漏れしてる。気が散るじゃんか」
 「こいつは気にしてないみたいだぜ」
 「あたしの気が散るの」
 カズトはフン、と鼻を鳴らしたが、おとなしくボリュームを下げた。
 そんな会話を無視したように、シュンの指はコードを生み出していた。独学で学んだプログラマは、ブラインドタッチを軽視しがちだが、シュンの瞳はほとんど手元に向けられることがない。午前中の研修で明らかになったのだが、シュンはブラインドタッチを身につけていたのだ。私がそのことを訊くと、シュンは「知らない間にできてた」とこともなげに言ったものだ。
 シュンにアサインされた詳細設計書の内容は、修正とは名ばかりで、ほとんど作り直しに近いものだった。最初、シュンは設計書に従って修正を加えていったが、5 分もしないうちに手を止め、しばらく考え込んでいた。先を促そうとリンが口を開きかけたとき、シュンは大部分のコードをごっそり削除し、新たにロジックを再構成し始めた。リンは思わず感嘆の声を漏らし、カズトも驚いた様子でシュンの横顔とモニタを交互に見ていた。
 しばらくの間、シュンは黙々とコードの生成を続けた。リンは何も言わずに見ていたが、カズトの方は、「へえ、なるほど」とか「お、そうくる」とか「さすが」などと感嘆符付きで呟いていた。自分への賛辞だと受け取ったのか、ウザいと思っていたのかは不明だが、シュンは反応を示さず、コーディングの速度が落ちることもなかった。
 およそ30 分後、シュンは手を止めてリンを振り向いた。
 「できた」
 リンはシュンの肩越しにモニタを覗き込み、二、三度スクロールした後で私に頷いた。
 「みんな手を止めろ」私はタブレットを操作しながら、PO たちに呼びかけた。「サブモニタに注目」
 シュンとリンを含めたPO たちは、サブモニタに目を向け、シュンが組み上げたロジックが表示されると、問いかけるように私を見た。
 「コードレビューだ。各自、シュンの書いたコードを見てやってくれ。10 分後ぐらいに感想を聞かせてもらう。じゃ、始め」
 PO たちは顔を見合わせた後、それぞれのサブモニタに表示されたコードをスクロールし始めた。さすがに緊張していたのか、シュンは苦役から解放されたような顔で、持参したマイボトルから何か飲みながら待っている。
 全員がコードをブラウズし終わるのに要した時間は12、3 分ぐらいだった。私は最後まで見ていたマイカが椅子に背を預けるのを待って、声を上げた。
 「みんな見たか?」
 「見たー」「見たよ」「はーい」「見ました」
 「おつかれ。どうだったか言ってくれ」私はPO たちを見回した。「誰からでもいいぞ」
 「じゃ、あたしから」リンが手を挙げた。「まず、インターセプターの機能は、全部実装できてるよ。たぶん、このままデプロイしても普通に動くんじゃないかな。最初の一本だから、もっとボロボロなんじゃないかと思ってたから、正直、それはすごいと思ったよ」
 PO たちは同意するように頷き、シュンの顔に安堵が浮かんだ。
 「コーディングも早かったよね」ハルが言った。「横からチラ見してたけど、最初からあんだけ打てるのはすごいよ」
 「あ、わたしもそれ、思いました」マイカが小さく手を挙げて言った。「キーボードほとんど見てなかったですね」
 「でもさ」リンは手元のキーボードに指を走らせ。シュンのコードをメインスクリーンに表示した。「ちょっと気になるとこはいくつかあるんだよね。このままだと、間違いなく、QM 課のチェックは通らない。指摘していい?」

9-1.png

9-2.png

9-3.png


 問われたシュンは、一瞬、顔を強張らせたが、すぐに頷いた。
 「いいよ」
 「まず気になったのはさ、引数のリクエストの値取ってるとこで、そのままキー指定してるじゃん。なんでヌルチェックしないの?」
 「なんでって......」シュンはスクリーンを見た。「だって、全部必須の値だから」
 「誰がそんなこと決めた?」
 「誰って......"endpoint" とか"contextValue" とか、そもそも入ってなきゃリクエストが発生しないんじゃない?」
 「あのさ」リンは小さく笑ったが、目元は緩んでいない。「全体を見ればそうかもしれないけど、このモジュールだけで考えるなら、そんな保証はないじゃん。デフォルト値指定してget で取れば安心だって思わない?」
 「......まあ、そうかも」
 「それから、このキーなんだけどさ」リンはスクリーン上で該当部分を反転させた。「なんで文字列で指定してるの?」
 「え、だって設計書に書いてあるから......」
 「確かに書いてあるけどさ。"endPoint" や"contextValue" なんて、ほぼほぼ全部で使うキーでしょ。どっかに定数定義してるって、想像しなかった?」
 「定数?」
 「あれ」カズトがクスクス笑った。「定数、知らないんだ」
 シュンの顔が朱に染まった。Python には、Java のstatic final のような定数定義が存在していない。私はC とJava で教育された人間なので、定数という概念を知っているが、シュンの経験はPython だけだ。
 リンは使用頻度の高いキーなどは、全部大文字の変数として定義されていることや、慣習的に変更しない定数として扱うことなどを説明してから続けた。
 「クラスコメントに、定数テーブルって書いてあるじゃん。なんだこれ、とか思わなかった?」
 「思ったけど」
 「わからなかった?」
 「うん」
 「なんで質問しないの」リンはややキツめの口調をぶつけた。「わからなかったら訊けって言ったよね」
 「そのコメントだけどよ」カズトが指摘した。「コード中にコメント全然入れてないよな。入れた方がいいんじゃないか?」
 「コメントなんて」シュンは反抗的に言い返した。「コード読めばわかるだろ。読むスキルがないって言ってんの?」
 「そういうことじゃなくてさ」ハルが穏やかな声で言った。「たとえば急いでメソッドの全体を把握したいときなんかさ、いちいちコードを何十行も読んでいくより、コメント一行読めばすむなら、その方がいいと思わない?」
 「......」
 「全行に何してる何してる、とか書くのはムダだし、逆に邪魔だけどさ。必要なコメントはきちんと書こうよ」
 「だいたいさあ」カズトも言った。「このcontext サイズの判別あたりなんか、ややこしいんだよ。このif のネスト、わざとやってんの?」
 「こういう場所の先頭にコメントが入ってれば、とりあえずスルーできるだろ」
 シュンは、もはや反論もできずに悔しそうにスクリーンを見つめるだけだった。リンはそんなシュンの様子には構わず、事務的な口調で指摘を続けた。
 「あとさ、ClosableWallClient の宣言、なんでこんなところでやってるの?」
 「なんでって......」
 「これ、実際に使うのは30 行ぐらい下じゃん。なんで、メソッドの先頭で宣言してんの」
 「どうせ使うんだから......」
 「使うのはわかってるけど、宣言は使う直前でいいじゃん。こんなところにあったらさ、後から読む人は、multiPost する前に何かで使うのかと思うよね。変数のスコープって知ってる? できるだけ狭くしてくんないかな」
 シュンはうなだれた。少し気の毒に思ったが、同じことは他の四人も通った道だ。シュンの真の意味で戦力にするためには、甘やかすわけにはいかない。
 「マイカ、どうだ」
 私はまだ発言していないPO に声をかけた。マイカは最年少という事実に加えて、やや内気な性格なので、ときどき背中を押してやらないと、年長者に流されてしまいやすい。マイカは少し躊躇った後、遠慮がちに声を発した。
 「あの、if 文なんですけど、その、どうして否定ばかり使ってるんでしょうか」
 「え?」シュンは意外な話を聞いたようにスクリーンを見直した。「えっと、どこが悪いかな」
 「is not None より、is None の方がわかりやすいと思うんです。is not None だと否定の否定になりますよね」
 「......」
 自分の知識バンクに全く存在しなかった考え方だったらしく、シュンは茫然とマイカの顔を見つめた。マイカは少し顔を赤らめたが、話す言葉はしっかりしていた。
 「is not None はまだいいんですけど、eb_flag != True は、正直、パッと見、迷ってしまいます。eb_flag はブール型なんで、if eb_flag: の方がわかりやすいです。あの、わたしには、ですけど」
 「みんなそうだよ」カズトが、マイカに同意する、というより、シュンを否定したいような顔で言った。「このcontext のチェック部分なんかさ、先にis None を書けば、ネストが深くならずにすむだろ」
 「if 文で言うならさ」リンがスクリーンを指した。「そこの、context サイズのチェックの部分、数字は右側に書いた方がいいと思うな。どうしてかわかる?」
 「いや......」シュンは元気なく答えた。「教えてください」
 「文章にして読んでみればわかるよ。84001432 がcontext のサイズより小さい、より、context のサイズが84001432 より大きい、の方が文章として自然じゃん」
 「ああ......確かに」
 「次のafter メソッドだけどさ」ハルがスクロールしながら言った。「こっちも気になるんだよね。まず先頭のタプルの宣言だけどさ......」
 コードレビューは容赦なく続いた。私は批判がコーディング上の不備の指摘を超えて個人攻撃にならないことだけを注意し、ほとんどPO たちの好きにやらせた。サチがときおり、こっそり微笑んでいたのは、以前のコードレビューのことを思い出していたからだろう。カズトなど、リンの容赦ないダメだしに、顔を真っ赤にして涙をボロボロこぼしていたものだ。うまくスキルアップにつながるよう、サチがフォローしてくれなかったら、そのまま潰れていたかもしれない。
 一時間あまりが経過し、そろそろ指摘事項が出尽くしたところで、私は手を叩いて切り上げた。
 「ここまでにしようか」私はそう言い、すっかり落ち込んだ様子のシュンに言った。「シュン、君はこれまで一人でプログラミングを勉強してきた。独学でU-18 グランプリにまでなったのは、正直言って感心だと思う。でも足りないものがある。他者の視点、がそれだ」
 「他者の視点?」
 「簡単に言えば、他人がコードを読んだとき、理解できるかどうか、ってことだよ。入門書を読んだだけだと、もしくは、自分で書いたコードを自分で読んでるだけだと、そこにはなかなか気付けない。他人のコードを読んで、他人にコードを読んでもらって、初めてわかることも多い。ここで作るロジックは、曖昧さを極力なくさなければならないのは、前に話した通りだ。さっき、みんなが言ったようなことは、ロジックのRR を確保するためには必要なことばかりだ。他のPO が修正するときに読みやすい、というのは、ロジックが明確である、ということになるんだな」
 シュンは力なく頷いた。自分のプログラミングスキルには、それなりの自信があったらしいが、年下のマイカにまで不備を指摘されたことで、かなり落ち込んでしまったらしい。
 「まあ、心配するな」私は笑いながら言った。「他のみんなも、同じ目に遭ったんだからな。ここだけの話、リンなんか、最初はモニタを叩き壊して、あっちの隅で膝抱えて泣いてたんだぞ」
 「チーフ!」リンは悲鳴に近い声で叫んだ。「なんでバラすの! 最低!」
 PO たちは一斉に笑い声をあげた。横目で見ると、シュンも一緒になって笑っていたので少し安心した。
 「よし」笑い声が収まると、私はシュンの肩を叩いて椅子から立たせた。「次はナビゲータの実戦練習だ。ドライバはリンだ。先輩だからって遠慮するな。思い切り指摘してやれよ」
 「あたしはミスなんかしないから」リンは私に中指を立ててから、モニタの前にどかっと座った。「やるわよ」

 ◇ ◇ ◇ ◇ ◇

 その日の夜、私がカフェテリアで遅い夕食を取っていると、佐藤管理官がふらっと現れ、向かいの席に座った。
 「おつかれさまです。シュンくんのデビューは、うまくいったようですね」
 「おかげさまで何とか」
 「どうですか、PO としては」
 「今日のところは、練習みたいなものですから。でも、飲み込みは早いですね。防壁のライブラリを触るのは初めてのはずなのに、すぐにコツをつかんでました。同じミスはしないし。最後にやらせたオペレーションでは、もう何年も使ってるみたいに的確なメソッドを使ってて。若者の吸収力というか適応力には、ほとほと感心するしかないですね」
 「他のPO たちとはどうですか」
 「チームプレーは初めてなんで、少し戸惑ってはいたようですが、ラストの方では慣れてきたようですね。ただ、まだ少し壁があるのは確かです」
 そうは言ったが、私はそれほど心配していなかった。シュンが、横浜ディレクトレートを自分の居場所だと認識できれば、多少の壁など自分から取り払ってしまうだろう。
 「滑り出しは順調、ということですね」私の言葉に、佐藤管理官は微笑んだ。「セクションD を任せる人材として、台場さんと駒木根さんを選んだ甲斐があったというものです」
 「スカウトされたときにも訊きましたが」私は食事の手を止めて、佐藤管理官の目を見た。「どうして私に接触してきたんですか? システム開発会社にいたといっても、私は業務系システムの開発や機能追加を細々とやってきただけで、何かのコミュニティに参加していたわけでもないし、ネットで発信していたわけでもない。しかも部門統廃合で早期退職を迫られたんですよ。つまり会社からは、それほど重要な人材ではない、と言われたようなものだ。プロマネの経験だって、大規模プロジェクトの指揮を執ったわけでもないのに」
 「迷惑でしたか?」
 「雇ってもらえて感謝していますがね」私は苦笑しながら言った。「でも、どうして私を、という疑問は残ったままです。まさか、ミスカトニックが私を推薦したわけじゃないでしょう?」
 「それは違います」佐藤管理官は小さく首を横に振った。「チーフ、サブチーフの採用は各支部に一任されていますから」
 「じゃあ、どうして? しかもセクションD でしょう。まさか、子供たちを部下に持つことになるとは思いませんでした」
 「セクションD が、横浜ディレクトレートでは、いえ、ATP 全体でも特殊なセクションであることはご存じですか」
 「もちろんです。他のセクションは、システム系の企業からリクルートした人間や、システム開発の経験者をPO としている。未経験の、しかも未成年をPO にしているのは、セクションD だけだ」
 「奇をてらって、子供たちをPO に採用しているわけではありません。これは横浜ディレクトレート独自のプロジェクトの一環なんですよ。私たちの戦いは、まだ何十年も続くことが予想されますからね。優秀なプログラミングスキルを持つ人間を、いかにして一定数、継続して確保していくかは、永遠の課題なんですよ。経験者はパフォーマンスはいいのですが、現役でオペレーションに携われるのは、せいぜい20 年から30 年といったところですから」
 「子供たちであれば、現役時代が長い、というわけですか」
 「それだけじゃないですがね」佐藤管理官は謎めいた微笑を浮かべた。「いずれ効果がわかるときが来ると思います」
 「彼らが大人になる頃には、私はとっくに引退してると思いますけどね」
 「そうとは限りませんよ。チーフとして直接オペレーションを指揮できなくても、ATP のために貢献してもらえる方法はいくつもありますから。もちろん、台場さんの希望を優先しますが、ATP なら先細りになる一方の年金額に怯える毎日を過ごす必要はなくなります」
 「年取ったら、一日中、日当たりのいい図書館あたりで、ぼーっとしてるのが希望なんですがね」
 「素敵な老後ですね」佐藤管理官はクスクス笑った。「ところで話は変わりますが、近々、外部の人間と重要な会議が行われます。台場さんにも参加していただきますので、あらかじめお伝えしておきます」
 「会議ですか。議題は何です?」
 「シャイニングT のことです」
 私の脳裏に、みなとみらいで遭遇したインスマウス人が、魚の臭気とともに蘇った。
 「というと」私は必要もないのに声を潜めた。「シュンのことですか」
 「そうです。ただし」佐藤管理官も、私と同程度に声を落とした。「彼には内緒です。今のところ。もちろん他のPO にも」
 「シャイニングT とは何なんですか」
 「輝くトラペゾヘドロンのことです」佐藤管理官は言い、私の目を覗き込んだ。「耳にしたことは?」
 「輝くトラ......ああ、そういえば、何度か」私は記憶を辿った。「誰かの立ち話で。珍しい宝石か何かでしたっけ」
 「それ以上のものです」そう言って、佐藤管理官は立ち上がった。「会議の日程が決定したら、詳しい資料をお送りします。目を通しておいてください。では、お食事の邪魔をして申し訳ありません」
 佐藤管理官は去っていった。残された私は、冷めていくカレーライスのことも忘れて、佐藤管理官が口にした聞き慣れない単語について、記憶のページをめくったが、具体的な情報を見つけ出すことはできなかった。

(続)

 この物語はフィクションです。実在する団体名、個人とは一切関係ありません。また、特定の技術や製品の優位性などを主張するものではありません。本文中に登場する技術や製品は実在しないことがあります。

Comment(12)

コメント

Edwin M. Lillibridge

おほー!やはりTはニャル様!!

じぇいく

僭越ながら
>シュンは頷いて、ソフトウェアキーボードに指を走らせた。ナナミは、これでいいんだよね、
ナナミではなくリン?

匿名

コーディングに他者の視点が重要って解くのと同じくらいに、レビュー指摘する時に指摘受ける側の視点も大事にするよう教えてあげてほしい…

リーベルG

じぇいくさん、ありがとうございます。
リンでした。

勝手に校正

>ドライバが目の間のコードだけに集中すればいいのに対して、
目の*前*のコード
でしょうか
>まずはナビゲータのサポートなしでコーディングさせ、後でコードレビュー実施するためだ。
コードレビュー*を*実施
でしょうか
>時々、背を押してやらないと年長者に流されてしまいやすい。
時々背を押してやらないと*、*年長者に流されてしまいやすい。
の方が.「時々」は背中を押してやる頻度ですよね?
>他人にコードを読んでもらって、始めてわかることも多い。
*初*めてわかる

急展開

シュンはエンダーのゲームで言う所の
「戦いを終わらせるもの」なのかなー。

リーベルG

勝手に校正さん、ありがとうございます。

as

楽しく読ませて頂いてます。

リンのセリフで
…84001432 がcontext のサイズより大きい、より、context のサイズが84001432 より大きい、の方が…
のところ、

context のサイズが84001432 より*小さい*

ですかね?

リーベルG

asさん、ありがとうございます。
小さいですね。そして、そもそも、ソースの方も違っていました。

nobody

> 鼻歌を歌いながらアーカム・テクノロジー・パートナーズが求人サイトに掲載されることがあれば、
なんかおかしいですね。
もしかして、以下?
> 鼻歌を歌いながらカフェテリアの自動販売機に向かって

リーベルG

nobodyさん、ありがとうございます。
余分な文が残ってました。

SF好き

アニメ化希望

コメントを投稿する