「銀の弾丸はない」 ←わかる ←カッコイイ
「銀の弾丸はない」は「人月の神話」に出てくる(たしか)有名な言葉です。
いいですよね。直感的でわかりやすく、何よりカッコイイ。
「たった一つであらゆる問題が解決される簡単な方法」という、現実を知らない奴の妄想を「銀の弾丸」というカッコイイものに例えることで、反省するにもなんだかカッコイイし、指摘する側もされた側もなんだかカッコイイですし、波風が立ちません。だってカッコイイから。
「銀の弾丸はありませんから少しずつやっていくしかありません」「すみません、自分も銀の弾丸を探しそうになってました」などなど。応用してもしなくても、とにかくカッコイイ。
There is no silver bullet. 英語で書いてもカッコイイ。
状況を的確に示す、使い勝手が良いフレーズ。そんなものを自分もクリエイトしてみたいものだと思うなか、これはなかなか状況を的確に言い当てているのでは、と思ったものを書いてみることにしました。
お気に召されましたら是非ご活用ください。
「仕様がインパール作戦」
どういった状況を示すか
実装担当者の意思によらず、過酷な状況下で仕様を現地調達せざるを得ないことになっている開発体制
状況例
A(設計担当。PdM・PM・企画部門あるいは上級wエンジニアなど):「仕様は、ユーザーがログインしたらおすすめ出すってだけ。何か質問ある?」
B(実装担当):「……おすすめって何のおすすめですか?」
A:「いい質問ありがと! そもそもこの施策の目的なんだけど……(以下、その施策についてどれだけ売り上げ貢献に期待がかかっているのかという長い話)……というわけで、ユーザごとに購入確度の高そうな商品をいい感じに出してほしいんだよね。説明は以上だけど、何かわからないことある?」
B:「……“いい感じ”って、具体的にはどういう感じですか?」
A:「あー、実はおすすめ機能はすでにあるんだよね。それイメージしてる。まずは画面見て確認してもらえる? あんな感じのが、ログインしたら出てくる」
B:「既存の商品レコメンド画面はリスト表示ですね。ログイン直後にホームではなく商品レコメンド画面が表示されるということですか?」
A:「いやいや、おすすめ商品は1つだって。一番オススメのやつ。そうだな、リストの一番上の商品のおすすめ表示が、ログインしたら出てくる」
B:「ログイン後はホーム画面に遷移して、そこにおすすめ商品が1つ表示されるということでしょうか」
A:「そう!」
B:「UIはどうしますか」
A:「悩んでるんだよねー。簡単にできるやつでいいんだけど。どういう実装なら簡単にできそう?」
B:「技術的にはホーム画面のどこかにおすすめ商品の表示エリアを作るのが簡単ですが、ホーム画面はすでに情報でギチギチなので、入れるならデザインチームに相談したいですね。ホーム画面のデザインを維持するならポップアップなどで出す方法もありますが……」
A:「それ、ポップアップ! いいね、それにしよう。デザインは既存で流用すればいけると思うから見てもらって。どうしてもデザインチームに相談が必要なら、自分に言ってくれればすぐ調整するんで!」
B:「あと、今のレコメンド機能は商品選択後に出てくるものなので、ホーム画面では何を基準にレコメンドすればいいか判断つかないのですが」
A:「エンジニア目線での質問、すごい助かる! そうだな、一番売れてるやつとか、ユーザが最後に閲覧したものとか、なんならランダムとか。どうせあとから調整すると思うので、とりあえず実装が簡単なやつでいいんだけど」
B:「一番楽なのはランダムですね。ただレコメンド商品として適切ではない内容になりますが」
A:「そっかー、まあレコメンドじゃなくておすすめだしな。まずは実装しやすい方法でやってくれればいいよ。任せる!」
B:「わかりました。とりあえず作り始めます」
A:「わからないことがあったらこういうふうに都度質問してもらえばいいから!」
⸻
数週間後——
A:「教えてほしいんだけど、このおすすめ機能でおすすめされてる商品って、どういう基準で選んでる?」
B:「完全ランダムです」
A:「えっ?! それ、おすすめじゃなくない?」
B:「実装しやすい方法でいいと言われたので。一番楽な方法にしました」
A:「既存のおすすめ機能を参考にしてって言ったよね。既存のおすすめ機能もランダム表示なの?」
B:「違いますが、実装しやすい方法でいいと言われましたので……」
A:「あのさあ、そういうの、勝手に判断しないでちゃんと確認してもらっていい? 仕様を決めるのは自分なんで。やりやすい方法でいいとは言ったけどなんでもいいとは言ってないし、イメージしてるのは既存のおすすめ機能って言ったよね? そもそもこの施策の目的なんだけど……」
B:「施策の目的はもう5回くらい聞きましたので大丈夫です。気が回らなくてすみませんでした」
A:「あと、いきなりポップアップ出てくるとホームの重要なお知らせが見えないって会議で指摘されたんだけど」
B:「ポップアップで出す仕様を指定されましたので」
A:「いやこっちがどう言ったってさ、動かしてる時におかしいって気づかなかった? 気づくよね、普通」
B:「お知らせ見えづらいな、とは思いましたけど。ポップアップで出すということだったので。お知らせよりもおすすめを優先して見せたいのかなと」
A:「だからあ! そういうの思い込みで進めないで、都度確認してよ!」
元ネタ
インパール作戦。第二次大戦中の日本軍が行った史上最悪の作戦。
インドのインパールを攻略するために、特殊な訓練を受けた精鋭というわけでもない寄せ集めの兵士たちが密林や山岳地帯を含む400キロの道程を徒歩で移動してインパールへ攻め込む……という、それだけでも相当無謀な作戦。しかしそれ以上に無謀なことに、その際の武器や食料は兵士の判断で現地調達するとした。
なお当然というか、誰一人としてインパールへは到達できなかったとのこと。
補足
提示された仕様に不足や矛盾があって実装担当者がそこをフォローするというのは昔からありました。
が、アジャイルが流行るようになってからすごく増えた……というか、アジャイルという名目で堂々と横行するようになった印象があります。
まあ無限の時間と費用があるならプロジェクト体制がどんなメチャクチャでもいいんですけども、さてここで問題です。 インパール作戦が失敗したのは、現場の兵士の能力が不足していたからでしょうか、それとも……? 笑
「ワトソンの推理」
どういった状況を示すか
複雑な理屈や非現実的な仮定を持ち出すことで、事実と自分の意見との間に生じた乖離を埋めようとしている状態
状況例
☕️ holmes@障害調査中
@watson サーバーの落ちた時間帯、キャッシュモジュールのメモリ使用量が異常に上がってるね。
UserSessionCacheにオブジェクトが解放されてない。close()が呼ばれていないようだ。
👨⚕️ ワトソン
ホームズ、それGCのタイミングのせいじゃないかな?
Javaのヒープって一時的に膨らむことあるじゃないか。
☕️ holmes@障害調査中
ヒープダンプを見たけど、24時間経ってもオブジェクトが残っている。
WeakReference使ってるって言ってただろう? どこかで強参照が残ってる。
👨⚕️ ワトソン
あ〜…でも確認したのはテスト環境だよね。
本番環境はGCの挙動も違うだろう? テスト環境の結果だけで判断するのは早計だよ。
☕️ holmes@障害調査中
本番とテスト、同じ
gc.config参照してる。
あとプロファイラの結果も一致してた。
👨⚕️ ワトソン
論理的には、GCが“意図的に”オブジェクトを保持するケースもありうるからその影響も考慮する必要があるね
JVMの内部最適化の都合とかで
☕️ holmes@障害調査中
その“理論的にありうるケース”が、なぜ君のコードのforループだけで100%再現しているんだい?
元ネタ
AIに頼んだらめっちゃわかりやすい状況例書いてくれましたので解説不要ですね。
補足
名探偵であるホームズ氏の推理は 「関連の事実を正確に把握した上で行われ」「意外ではあるけれが事実との矛盾や飛躍はない」 のに対し、ワトソンくんの推理は 「一部の事実だけを元に行われ」「その推理を説明するためには非現実的な仮定が必要」 というのをどこかで読んだことがあり、イメージ的にも実際の状況的にもそんな感じです。
自分が迷推理やらかしていないか、気をつけていきたいですね。
なお、迷推理を堂々と展開しておきながらも自分の間違いを認め、恥をかかされたと怒ることもなくホームズに惜しみない賞賛を送るあたり、推理はトンチキでも間違いなく人格者ではありますよねワトソンくんは。
お気に召されましたら是非ご利用ください。あるいは良いオリジナルフレーズがあったら教えてください。
なおこの記事の状況例はフィクションであり、実在の人物・団体とは一切関係ありません。書いている途中であれこれ思い出して胃が痛くなってきたとかそんなことはありません。
いいやつ思いついたらまた書きます🤖