赤い文字が怖い。
これは比喩じゃない。ターミナルにエラーが表示されるとき、文字は赤くなる。最初の数日は、赤い文字が出るたびに心臓が跳ねた。何か取り返しのつかないことをしたんじゃないか。パソコンが壊れるんじゃないか。本気でそう思っていた。
人事の世界にもエラーはある。採用ミスマッチ、退職連鎖、評価の不公平。でも、それらは赤い文字では教えてくれない。数ヶ月、数年かけてじわじわと表面化する。
コードのエラーは即座だ。書いた瞬間に、赤い文字で「お前は間違っている」と宣告される。この残酷さに、僕は最初、打ちのめされた。
ReferenceError: require is not defined at file:///Users/arata/projects/first-app/index.mjs:1:1
ReferenceError: require is not defined。
初めて見たとき、一つの単語も理解できなかった。Referenceって何のリファレンス? requireって何を要求してるの? definedじゃないって、誰が定義すべきだったの?
これ、何が起きてるの? require is not definedって出た
これは、Node.jsのCommonJS形式の require を、ESモジュール形式のファイル(.mjs)で使おうとしたためです。
.mjs ファイルでは require の代わりに import を使います:
// NG: require(CommonJS)
const fs = require('fs');
// OK: import(ESモジュール)
import fs from 'fs'; CommonJSとESモジュールって何?
JavaScriptのモジュールシステムには歴史的に2つの方式があります。CommonJSは古い方式で、ESモジュールは新しい方式です。今から始めるなら、ESモジュール(import/export)を使うのが良いです。
なんで2つもあるの
なんで2つもあるの。この手の「歴史的経緯」による複雑さに、僕はこの後何度も遭遇することになる。でもこのときの僕は、まだそれを「理不尽」としか受け取れなかった。
エラーは一つ解決すると、次のエラーが現れる。モグラ叩きだ。
TypeError: Cannot read properties of undefined (reading ‘map’) SyntaxError: Unexpected token Error: ENOENT: no such file or directory RangeError: Maximum call stack size exceeded
1日に見るエラーの数が、10を超え、20を超え、ある日は50を超えた。
TypeError。お前のタイプが違う、と言われている気がした。SyntaxError。文法が違う。人事のメールは文法が違っても届くのに。ENOENT。ファイルが見つからない。いや、さっき作ったはずなのに。Maximum call stack size exceeded。スタックが最大? スタックって何?
もう何がなんだかわからない。エラーを直したらエラーが出る。永遠に終わらない
エラーが連鎖するのは、根本原因を直さずに表面的な対応をしているからかもしれません。落ち着いて、一番最初のエラーメッセージから読み解きましょう。
エラーメッセージには必ず3つの情報があります:
- エラーの種類(TypeError、SyntaxErrorなど)
- 何が問題か(具体的なメッセージ)
- どこで起きたか(ファイル名と行番号)
まず、一番最初に出ているエラーメッセージを貼ってもらえますか?
「一番最初のエラーメッセージから読み解く」。
このアドバイスは、今でも僕の中に残っている。エラーが10個出たら、1個目だけを見る。それを直す。すると、残りの9個のうち半分は消える。残った5個の1個目を見る。繰り返す。
人事の問題解決でも同じだ。退職が連鎖しているとき、全員を同時に引き止めようとしても無理だ。根本原因を一つ見つけて、そこから潰す。
エラーとの付き合い方が変わったのは、2週間目くらいだった。
ある晩、TypeErrorが出たとき、僕は赤い文字を見てもビクッとしなかった。それどころか、エラーメッセージを読んで「ああ、undefinedのプロパティにアクセスしてるのか」と、なんとなく意味がわかった。
TypeError出た。たぶんデータがundefinedのままmapしてる。取得のタイミングの問題?
いい推測です。非同期処理でデータの取得が完了する前にmapを呼んでいる可能性が高いです。awaitを忘れていませんか?
あ、忘れてた。
「いい推測です」。AIのこの一言が、地味にうれしかった。
2週間前は「何が起きてるの」だったのが、「たぶんこういうことだと思うけど合ってる?」に変わった。エラーは敵じゃなく、ヒントだと思えるようになった。赤い文字は「間違っている」という非難じゃなく、「ここを見て」という道標だ。
ハッチにエラーの話をしたら、笑われた。
エラーが怖いって、それ全エンジニアが通る道だぞ。
面接で「エラーハンドリングの経験は?」って聞いてた自分が恥ずかしい。ハンドリングどころか、エラー見て固まってたのに。
でも、いいじゃん。エラーと向き合ってるってことは、コードを書いてるってことだ。エラーが出ないのは、何もしてない奴だけだよ。
エラーが出ないのは、何もしてない奴だけ。
この言葉を、僕は採用面接の評価基準に加えたいと本気で思った。失敗経験を聞くとき、「失敗がない」と答える候補者は、チャレンジしていない可能性がある。エラーの海を泳いだことがある人間は、その分だけ強い。
本日のエラー数: 23 解決したエラー: 23 新しく学んだこと: async/await、try/catch、エラーハンドリング 気分: 疲れたけど、悪くない
23個のエラーを、全部自分で(AIの助けを借りて)解決した日。
その夜、寝る前にふと思った。赤い文字が出たとき、心臓が跳ねなくなっている自分がいる。それは慣れなのかもしれないし、成長なのかもしれない。どちらにしても、エラーの海を泳ぎ始めた39歳の人事がここにいる。
まだ溺れそうだけど、少なくとも、沈んではいない。