はじめに
ゼネットの土屋です。
Ruby 4.0 へのバージョンアップ作業中、RSpec の一部テストが想定外のエラーで失敗する事象に遭遇しました。
エラーは次の通りです。
IO::TimeoutError: user specified timeout for example.com:389
一見すると、
- 接続先の疎通問題
- テストのモック不足
- timeout 設定漏れ
あたりを疑いたくなるログです。
実際、生成AI(Claude Sonnet 4.5)にこの内容を渡したところ、最初はその方向で分析が始まりました。
ただ、今回面白かったのは、
その初動が、経験の浅い新人エンジニアにかなり近かった
という点でした。
まず見えているエラーから読む
今回のエラーで最も目立つのはここです。
IO::TimeoutError user specified timeout
これを見ると自然に、
- timeout の設定不足ではないか
- 接続先に到達できていないのではないか
- モックが抜けて実接続しているのではないか
という方向に考えます。
これは技術的に間違っていません。
実際、Claude Sonnet 4.5 も最初はこの方向で回答しました。
ただ、経験者は少し違う順番で見る
今回の入力には最初からこう書いてありました。
Ruby4.0へバージョンアップして RSpec が失敗するようになりました
この一文を見ると、実務経験があるエンジニアはまずこう考えます。
Ruby4.0へ上げた ↓ Ruby4.0 の変更履歴を見る
つまり、
まず何が変わったかを見る
です。
障害そのものを深掘りする前に、
- Ruby本体の変更
- 標準ライブラリの挙動差
- 例外の変化
- gem互換性
の候補が頭に並びます。
実際に Ruby 4.0 には timeout 周りの変更が入っていた
Ruby 4.0 では socket timeout 周りに変更が入っています。
今回該当したのはこの PR です。 github.com
この変更では、
Socket.tcpTCPSocket.new
の接続 timeout 時の例外整理が行われています。
従来は状況によって、
Errno::ETIMEDOUTIO::TimeoutError
が混在していました。
Ruby 4.0 では、
ユーザー指定 timeout による接続 timeout で
IO::TimeoutErrorが返るケースが整理された
という変更が入りました。
今回のログに含まれる
user specified timeout
という文言は、この変更とかなり一致します。
ここで一次仮説が変わる
この時点で最初に疑うべきは、
Ruby 4.0 の変更によって、従来は別の形で見えていた timeout が
IO::TimeoutErrorとして表面化した
です。
そのあとに、
- なぜ
example.com:389に実接続したか - stub が抜けていないか
- spec の評価順に差が出ていないか
を見ます。
ここは順番が大事です。
Claude Sonnet 4.5 が間違えたわけではない
ここで改めて思ったのは、
Claude Sonnet 4.5 が間違えたというより、初動が新人に近かった
ということです。
新人もまず、
IO::TimeoutError
を見て timeout から調べます。
それは自然です。
ただ、
Ruby4.0へ上げた
から、
まず変更履歴を見る
という順番は、経験を積む中で身につくことが多いです。
生成AIは知識はあるけれど経験の浅い大型新人に少し似ている
今回かなりしっくりきたのはこの感覚です。
生成AIは知識はあるけれど、経験の浅い大型新人に少し似ている
知識量は非常に多いです。
- timeout も知っている
- socket も知っている
- RSpec も知っている
ただ、
どの引き出しを先に開けるか
は、人間が少し補助した方が安定します。
一言添えるだけでかなり変わる
例えば最初にこう書くと変わります。
これは Ruby4.0 へのバージョンアップ影響調査です。 まず変更履歴を優先して確認してください。
これだけで、
- Ruby本体変更
- timeout例外変更
- 標準ライブラリ差分
へ先に到達しやすくなります。
まとめ
生成AIはかなり優秀ですが、
何を主語に読むか
で入口が大きく変わります。
今回でいうと、
timeout
ではなく、
Ruby4.0へ上げた
を主語にすると、調査の順番が変わります。
最後に
SNSでは「バイブコーディングすごい」「AIでこんなことができる」といった話題をよく見かけます。
一方で、実際の現場では、
「なんでこのコードになったのか」
「欲しかった答えと少し違う」
と感じる場面もまだ少なくありません。
今回の件を通じて私が感じたことは、
AIへの指示は、チームメンバーへの依頼に少し似ているのかもしれません。
今回に関しては、こちらの投げ方が少しミスリードだったとも言えそうです。
こちらがどう伝えると力を発揮しやすいのか、まだまだ理解していく余地がありそうです。
