zenet_logo

-株式会社ゼネット技術ブログ-

Ruby4.0へ上げて壊れたとき、生成AIはなぜ最初に変更履歴を見なかったのか

はじめに

ゼネットの土屋です。

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.tcp
  • TCPSocket.new

の接続 timeout 時の例外整理が行われています。

従来は状況によって、

  • Errno::ETIMEDOUT
  • IO::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への指示は、チームメンバーへの依頼に少し似ているのかもしれません。

今回に関しては、こちらの投げ方が少しミスリードだったとも言えそうです。

こちらがどう伝えると力を発揮しやすいのか、まだまだ理解していく余地がありそうです。