第二話 最初のエラー
研修二日目の朝、翔太は始業十五分前に席に着いた。
早く来れば安心できるわけではなかったが、遅れるよりはましだった。誰もいないオフィスは、前日より少しだけ狭く感じられる。蛍光灯の白さにももう驚かなかった。
ノートPCを開く。
ログイン画面に自分の社員番号を打ち込む。パスワードを入力しながら、これで本当に“会社の人間”になったのだろうか、と考える。たった数文字の認証で、人は所属を与えられる。逆に言えば、その資格は数文字失うだけで消えるのかもしれない。
「早いね」
木村が後ろから声をかけてきた。
翔太は肩を揺らして振り向く。
「昨日、帰ってから少し復習しました」
「えらいじゃん」
そう言って木村は翔太の画面を覗き、机に小さなメモを置いた。
今日やることが箇条書きで書かれている。開発環境の再確認、社内ツールの操作、簡単な修正課題、Gitでのコミットとプルリクエストの練習。
「今日は少しだけ実務っぽいことやる。とはいえ研修用だから、気楽に」
気楽に、と言われるたび、翔太は逆に緊張した。
気楽にできるほど、自分はまだ何も知らない。
午前中の課題は、社内向けの簡単な管理ツールの微修正だった。
表示文言の変更、条件分岐の追加、入力チェックの強化。学校の課題よりも地味で、だからこそ難しかった。何かを新しく作るのではなく、すでに動いているものを壊さずに変える。それは“正解のない作業”のように思えた。
ソースコードを開く。
昨日よりずっと長い。メソッド名は一定の規則で付けられているが、意味の薄い略語も混ざっていて、読みやすいのか読みにくいのか判別しづらい。コメントはある箇所とない箇所が極端で、前任者の癖がむき出しになっていた。
翔太は息を止めるみたいにして最初のファイルを読んだ。
何をしているコードなのか、だいたいはわかる。だが、その「だいたい」が危ないことも昨日の説明で知っている。わかったつもりのまま手を入れるのが、一番壊す。
隣では久保田がもう修正に入っていた。
タイピング音が一定で、迷いの間が少ない。翔太は視線を自分の画面に戻した。自分の速度を他人に測らせたくないというより、他人の速度で自分を測りたくなかった。
最初の修正自体は単純だった。
画面上のラベル文言を変更し、条件が一致した場合のみ補足文を表示する。それだけだ。だが、実行してみると別の箇所でエラーが出た。
赤い文字列がコンソールに流れる。
例外クラス名、行番号、スタックトレース。翔太はその一行目を読んだあと、二行目で止まった。
そこに見慣れない文字列が混じっていた。
Boundary Layer mismatch
座標再解釈に失敗しました
翔太は眉を寄せた。
社内ツールのエラーに、日本語のこんな文言が混ざるだろうか。しかも、“座標再解釈”とは何だ。画面遷移や入力値の話ではない気がする。
もう一度実行する。
今度は普通のNullPointerExceptionだけが表示された。
見間違いだったのかもしれない。
それでも、さっきの文言は妙にくっきり目に焼きついていた。
「どうした?」
木村が通りがかる。
「いえ……一瞬、変なメッセージが出た気がして」
「変な?」
「いや、たぶん見間違いです」
そう答えると、木村は一度だけ翔太の顔を見た。
ほんの短い間だったが、その視線には確認するようなものがあった。すぐにいつもの調子に戻る。
「エラーは見間違いだと思わないほうがいいよ。再現するかどうかだけでも覚えといて」
「はい」
木村は立ち去ったが、翔太はその背中を少しだけ目で追った。
いまの言葉はただの一般論だったはずなのに、なぜかそれ以上の意味があるように聞こえた。
昼休み、翔太はコンビニで買ったおにぎりを休憩スペースで食べた。
他の新人たちは定食屋へ行ったが、今日はひとりになりたかった。自販機の隣の丸テーブル。湯の切れたポット。窓の向こうの曇り空。おにぎりの海苔は湿気を吸って少し柔らかくなっている。
専門学校時代のことを思い出す。
課題は多かったが、答えはまだどこかにあると思えていた。検索すれば似た事例があり、先生に聞けば方向だけは示してくれた。けれど会社のコードは、答えそのものよりも「いま動いているから変に触るな」という空気のほうが強い。正しさより継続。美しさより影響範囲。その考え方に翔太はまだ馴染めなかった。
昼休みの終わり際、休憩スペースの隅で木村が紙コップのコーヒーを飲んでいた。
声をかけるべきか迷ったが、向こうが先に気づいた。
「お、ひとり?」
「はい。ちょっと頭整理したくて」
「偉いね。初日は情報多いから」
翔太は少し躊躇ってから言った。
「木村さん、昨日言ってた“壁を分解する”って、どういう感じですか」
木村は一瞬だけ考え、それから紙コップの縁に視線を落とした。
「大きな問題を、大きなまま見ないってことかな。たとえばエラーが出たときに、“何もわからない”で止まると壁になる。そうじゃなくて、どこまでわかるかに切る。メッセージは読めるか。どの操作で出たか。昨日までは出なかったか。再現するか。そうやって壁を小さくしていく」
「……なるほど」
「プログラミングって、賢さより執念だから」
木村はそれだけ言って、残りのコーヒーを飲み干した。
午後、翔太はもう一度エラーの再現を試した。
同じ操作。別の入力値。手順を変えて何度か実行する。だが、例の文言は出ない。普通のエラーしか出ない。やはり見間違いだったのか、と自分を納得させかけたとき、ふとソースコードのコメント欄に視線が止まった。
本来なら TODO や修正履歴が書かれるような箇所に、一行だけ意味のわからない文がある。
// ここでは門を開かないこと
翔太はしばらくその一文を見つめた。
誰かの冗談だろうか。あるいは単なる誤記か。だが、このファイル全体の文体から明らかに浮いていた。ほかのコメントは事務的で、こんなふうに比喩めいた書き方をする人間はいない。
門。
その言葉に、理由のわからないざわつきが生まれた。
さっきの“座標再解釈”というエラーメッセージと、意味もなく結びついてしまう。
「佐藤君、そこまで終わったら一回コミットしてみて」
木村の声で我に返る。
翔太は慌てて画面を切り替えた。
「はい」
「コメントもちゃんと書いてね。何を変えたかわかるように」
Gitのコミットメッセージを入力する。
fix: add validation for input field
たったそれだけの英文なのに、自分が世界に何かを記録している気がした。あとで誰かが読む。未来の他人。木村の言葉がまた頭に浮かぶ。
夕方、プルリクエストの練習を終えたところで、木村がレビューをつけて返してきた。
指摘は三点。変数名。nullチェックの位置。例外処理の粒度。どれも理屈としては理解できる。理解できるからこそ、自分が見えていなかったことが恥ずかしかった。
「悪くないよ」
木村は言った。
「でも、“動いた”と“読める”は別。そこが分かれてるうちは伸びる」
褒められているのか、警告されているのか、翔太にはよくわからなかった。
ただ、その曖昧さが逆に本気の言葉に思えた。
帰る直前、社内チャットに障害対応の通知が流れた。
本番環境の一部で夜間バッチが失敗。担当者数名が対応に入る。木村もそのひとりだった。翔太は自分の荷物を持ちながら、少し迷った末に声をかけた。
「何か手伝えること、ありますか」
言った瞬間、出しゃばったかもしれないと思った。
けれど木村は首を振る。
「今日はいい。まだ早い」
それから少しだけ笑って、続けた。
「でも、その気持ちは忘れないで」
翔太は頭を下げ、会社を出た。
ビルの外は小雨だった。
駅までの道を歩きながら、彼はスマホのメモ帳を開き、今日見た変な文言を書き留めた。
Boundary Layer mismatch
座標再解釈に失敗しました
ここでは門を開かないこと
書き終えたあと、自分で少し笑いそうになった。
大げさだ。たかが見間違いと妙なコメントに引っかかっているだけだ。そんなことより、レビューで指摘された箇所を復習したほうがいい。
それでも消せなかった。
消してしまうと、何か大事なものまで一緒に捨ててしまう気がした。
夜、アパートの机でノートを開き、課題の復習を始める。
だが、画面の白いエディタを前にすると、昼に見た一文がまた浮かんだ。
ここでは門を開かないこと。
何の門だ。
誰が、どこに向けて書いた。
そして、なぜ自分はそんなことが気になるのだろう。
窓の外で、終電に向かう電車の音が遠くを走っていった。
翔太はカーソルの点滅を見つめながら、まだ名前のついていない違和感に、静かに足を取られ始めていた。




