121,805通のメッセージ
第3話 Challenge

エラーの海

アラタ アラタ

赤い文字が怖い。

これは比喩じゃない。ターミナルにエラーが表示されるとき、文字は赤くなる。最初の数日は、赤い文字が出るたびに心臓が跳ねた。何か取り返しのつかないことをしたんじゃないか。パソコンが壊れるんじゃないか。本気でそう思っていた。

人事の世界にもエラーはある。採用ミスマッチ、退職連鎖、評価の不公平。でも、それらは赤い文字では教えてくれない。数ヶ月、数年かけてじわじわと表面化する。

コードのエラーは即座だ。書いた瞬間に、赤い文字で「お前は間違っている」と宣告される。この残酷さに、僕は最初、打ちのめされた。


エラーログ L312 2026-01-22 21:47

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つもあるの。この手の「歴史的経緯」による複雑さに、僕はこの後何度も遭遇することになる。でもこのときの僕は、まだそれを「理不尽」としか受け取れなかった。


エラーは一つ解決すると、次のエラーが現れる。モグラ叩きだ。

エラーの連鎖 L358 2026-01-23 22:15

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つの情報があります:

  1. エラーの種類(TypeError、SyntaxErrorなど)
  2. 何が問題か(具体的なメッセージ)
  3. どこで起きたか(ファイル名と行番号)

まず、一番最初に出ているエラーメッセージを貼ってもらえますか?

「一番最初のエラーメッセージから読み解く」。

このアドバイスは、今でも僕の中に残っている。エラーが10個出たら、1個目だけを見る。それを直す。すると、残りの9個のうち半分は消える。残った5個の1個目を見る。繰り返す。

人事の問題解決でも同じだ。退職が連鎖しているとき、全員を同時に引き止めようとしても無理だ。根本原因を一つ見つけて、そこから潰す。


エラーとの付き合い方が変わったのは、2週間目くらいだった。

ある晩、TypeErrorが出たとき、僕は赤い文字を見てもビクッとしなかった。それどころか、エラーメッセージを読んで「ああ、undefinedのプロパティにアクセスしてるのか」と、なんとなく意味がわかった。

🧑‍💼 アラタ

TypeError出た。たぶんデータがundefinedのままmapしてる。取得のタイミングの問題?

🤖 クロ

いい推測です。非同期処理でデータの取得が完了する前にmapを呼んでいる可能性が高いです。awaitを忘れていませんか?

🧑‍💼 アラタ

あ、忘れてた。

「いい推測です」。AIのこの一言が、地味にうれしかった。

2週間前は「何が起きてるの」だったのが、「たぶんこういうことだと思うけど合ってる?」に変わった。エラーは敵じゃなく、ヒントだと思えるようになった。赤い文字は「間違っている」という非難じゃなく、「ここを見て」という道標だ。


ハッチにエラーの話をしたら、笑われた。

👨‍💻 ハッチ

エラーが怖いって、それ全エンジニアが通る道だぞ。

🧑‍💼 アラタ

面接で「エラーハンドリングの経験は?」って聞いてた自分が恥ずかしい。ハンドリングどころか、エラー見て固まってたのに。

👨‍💻 ハッチ

でも、いいじゃん。エラーと向き合ってるってことは、コードを書いてるってことだ。エラーが出ないのは、何もしてない奴だけだよ。

エラーが出ないのは、何もしてない奴だけ。

この言葉を、僕は採用面接の評価基準に加えたいと本気で思った。失敗経験を聞くとき、「失敗がない」と答える候補者は、チャレンジしていない可能性がある。エラーの海を泳いだことがある人間は、その分だけ強い。

2週間目の記録 L496 2026-02-02 23:39

本日のエラー数: 23 解決したエラー: 23 新しく学んだこと: async/await、try/catch、エラーハンドリング 気分: 疲れたけど、悪くない

23個のエラーを、全部自分で(AIの助けを借りて)解決した日。

その夜、寝る前にふと思った。赤い文字が出たとき、心臓が跳ねなくなっている自分がいる。それは慣れなのかもしれないし、成長なのかもしれない。どちらにしても、エラーの海を泳ぎ始めた39歳の人事がここにいる。

まだ溺れそうだけど、少なくとも、沈んではいない。

エラー · 挫折 · 学び

あわせて読む

シリーズ一覧を見る →