とある恐怖のPoC物語
PoCは成功していた。
少なくとも、そう扱われていた。
外部APIからデータを取得し、
内部DBに同期するだけの、小さな機能。
要件は単純だった。
「外部のデータを自動で取り込みたい」
エンジニアは実装した。
PMはレビューした。
ビジネス側はデモを見た。
誰も困っていなかった。
PoCの成果
同期処理の実行結果は、こう返ってくる。
数字は揃っている。
処理時間も悪くない。
例外は出ていない。
テストはすべて通っていた。
エンジニアの視点
コードを見る限り、問題はない。
- 型は定義されている
- try-catch もある
- 重複データは弾いている
- 不正な値も保存しない
- ログも出ている
「skipped があるのは仕様通りですよね?」
仕様書には
「取得したデータを保存する」
としか書かれていない。
何件保存できなかったかは返している。
理由まで返すとは書いていない。
止める理由がない。
PMの視点
ダッシュボードには数字が増えている。
1186 / 1247
約95%。
悪くない。
むしろ良い。
ユーザーからのクレームもない。
スプリントは予定通り終わる。
「完璧じゃなくても動くなら、次に進みたい」
skipped の 61 件が
重要かどうかは、正直わからない。
でも、
「データ同期機能」は動いている。
止める理由が見当たらない。
ビジネス側の視点
営業資料に書ける。
- データ連携
- 自動同期
- 管理画面で確認可能
デモもできる。
競合も似たようなものだ。
顧客から
「同期されていない」とは
まだ言われていない。
skipped という単語の意味は
よく分からない。
でも、
エンジニアもPMも問題ないと言っている。
止める理由がない。
何も起きない時間
PoCは成功扱いされた。
チケットは Done。
次の機能に進んだ。
ログは残っている。
コードも残っている。
判断も、その場では正しかった。
何も壊れていない。
2週間後
ビジネス側から、静かに問い合わせが来る。
「一部の商品データが表示されないって
顧客から言われてるんですが」
エンジニアがログを見る。
61件のうち、
58件がバリデーションエラーだった。
その中に、
顧客が最も見たかった
高額商品が含まれていた。
会議
PM
「仕様通りに実装されていますよね?」
エンジニア
「はい。skipped 件数も返してます」
ビジネス
「でも、どれが skip されたか
分からないですよね?」
PM
「ログには出てます」
ビジネス
「毎回ログを見るんですか?」
エンジニア
「内訳を返すようにしますか?」
PM
「工数は?」
エンジニア
「半日くらいです」
PM
「……来週で」
誰も怒っていない。
誰も間違っていない。
1ヶ月後
skipped の内訳は表示されるようになった。
その頃、
別の事実が静かに判明する。
fetched: 1247
これは
「APIから取得した件数」。
API側には、
実は 1893 件のデータがあった。
重要度の低い 646 件は
最初から取得されていなかった。
誰もそれに気づいていなかった。
fetched という名前が、
「全部取った」ように見せていた。
残ったもの
ログは正しい。
コードも正しい。
テストも正しい。
Slackのやりとりも残っている。
チケットもクローズされている。
でも、
- なぜGOを出したのか
- 何を成功と呼んだのか
- どこで判断すべきだったのか
それだけが、
どこにも書かれていない。
PoCは失敗していない。
炎上もしていない。
ただ、
「そのまま本番になってしまった」。
この話が怖いのは、
誰かの失敗談じゃないからだ。
今この瞬間も、
どこかで
同じ数字が
同じ安心感を生んでいる。
あなたの現場でも。
そしてたぶん、
それは
まだ成功している。