予期せぬバグは「発見」の母? イノベーション・サンドボックスという“聖なる遊び場”
やあ、みんな。海外のデスクからこんにちは。
今日も今日とて、Visual Studioのダークモードとにらめっこしながら、XAMLのバインディングエラーと格闘しているC# WPFエンジニアです。こっちのコーヒーは日本のコンビニコーヒーみたいに気軽じゃなくて、カフェで頼むとサイズがバケツみたいなんだけど、そのカフェインの海を泳ぎながらこれを書いているよ。
さて、今日はちょっと「コードの書き方」じゃなくて、「エンジニアとしての生き方・働き方」みたいな話をしたいと思う。特にこれから海外に出たいとか、今の現場で閉塞感を感じている人には、ぜひ読んでほしい。
突然だけど、「セレンディピティ(Serendipity)」って言葉、聞いたことある?
辞書的に言えば「素敵な偶然に出会う能力」とか「ふとした偶然をきっかけに、幸運をつかみ取る力」なんだけど、これ、エンジニアリングの世界ではめちゃくちゃ重要なスキルなんだよね。
僕らは普段、仕様書通りに、設計通りに、寸分の狂いもなく動くシステムを作ることが仕事だと思っている。もちろん、それは正解。銀行の勘定系システムで「偶然いい感じにお金が増えました!」なんてなったら大問題だからね。論理的で、予測可能で、堅牢であること。それがエンジニアの誇りだ。
でも、海外で働いていて痛感するのは、それだけじゃ「新しい価値」は生まれないってことなんだ。
予測可能な範囲で作られたものは、予測可能な結果しか生まない。当たり前だよね。でも、世界を変えるようなサービスや、現場を劇的に改善するツール、あるいは君自身のキャリアを跳ねさせるようなチャンスは、大抵「予測の外」からやってくる。
つまり、「バグ」だと思っていたものが、実は「機能(Feature)」への入り口だったりする瞬間。
今日は、そんな**「Engineering Serendipity(偶然を設計する)」という、一見矛盾した、でも最高にエキサイティングなテーマについて語らせてほしい。
その第一歩として、まずは「イノベーション・サンドボックス(革新のための砂場)」**を作る重要性について深掘りしていこう。
効率化の罠と「遊び」の欠如
日本で働いていた頃の自分を振り返ると、とにかく「効率」の鬼だった。
チケット消化率、ベロシティ、工数削減。WPFのMVVMパターンをいかに綺麗に実装するか、PrismやReactivePropertyを使ってどれだけ疎結合にするか。そればかり考えてた。
もちろん、技術力は上がったよ。でも、ある時気づいたんだ。「あれ? 俺、去年と同じような画面を、少し早く作れるようになっただけじゃね?」って。
海外に来て、こっちのエンジニアたちと働いて衝撃を受けたことがある。彼ら、一見すると「無駄」なことを平気でやるんだよ。
スプリントの合間に、プロダクトとは全く関係ないライブラリをいじくり回したり、頼まれてもいないのに「AIに俺の書いたクソコードをレビューさせてみた」みたいなツールを勝手に作って発表したり。
最初は「いやいや、チケット残ってるだろ、仕事しろよ」って思った。日本人の勤勉さが発動してイライラすらした。
でもね、数ヶ月後にその「遊び」から、とんでもないものが生まれたりするんだ。
例えば、ある同僚が「WPFのレンダリングパイプラインをハックして、3Dモデルを無理やり埋め込む」みたいな実験を勝手にやってた。プロジェクトの要件には1ミリも入ってないよ。
でもその後、クライアントから「実は建設現場のシミュレーション機能をつけたいんだけど、Webビューじゃ重すぎて…」って相談が来たとき、彼が「ああ、それなら先週遊んでたアレが使えるよ」って、プロトタイプを秒で出してきたんだ。
その瞬間、彼はヒーローになった。そして、そのプロジェクトは会社に莫大な利益をもたらした。
これが「セレンディピティ」だ。
彼は、未来を予知していたわけじゃない。ただ、「イノベーション・サンドボックス」を持っていただけなんだ。
イノベーション・サンドボックスとは何か?
「サンドボックス」ってのは、セキュリティ用語でよく使われる「外部に影響を与えない隔離された環境」のことだけど、ここで言うのはもっと広い意味での「安全な遊び場」のことだ。
「コントロールされていない実験のための、専用の時間と空間」。
エンジニアリングにおいて、最もクリエイティブな瞬間は、締め切りに追われている時じゃない。
「これ、動くかな? いや動かないか。でもやってみたらどうなる?」っていう、純粋な好奇心でキーボードを叩いている時だ。
でも、悲しいかな、現代の開発現場はギチギチに管理されすぎている。アジャイル開発と言いつつ、バックログはパンパンで、余白なんてない。失敗は許されない。リファクタリングすら許可が必要。
そんな環境じゃ、セレンディピティなんて舞い降りようがないんだよ。
だからこそ、僕らは意識的に、意図的に、この「サンドボックス」を作らなきゃいけない。
これは「余裕ができたらやる」じゃダメなんだ。「設計」の一部として組み込む必要がある。
海外エンジニア流:サンドボックスの作り方
じゃあ、具体的にどうすればいいの?って話だよね。
こっちのエンジニアが実践している、そして僕も取り入れているいくつかの「サンドボックス戦略」を紹介しよう。
1. 時間のサンドボックス化(20%ルールの個人版)
Googleの「20%ルール」は有名だけど、会社が制度として導入していなくても、自分で勝手にやるんだ。
僕は週に40時間働くとして、そのうちの数時間は「今のタスクに直結しない技術」を触る時間としてブロックしている。カレンダーに「Deep Work」とか適当な名前をつけて、誰も話しかけられないようにしてね。
その時間は、WPFの最新機能を追うのもいいけど、全く関係ないRustを書いてみるとか、生成AIのAPIを叩いて遊ぶとか、とにかく「役立つかわからないこと」をやる。
ポイントは「成果を求めないこと」。成果を出さなきゃと思うと、それはもう「仕事」になって、脳が「効率モード」に切り替わっちゃうから。脳を「探索モード」にしておくことが大事なんだ。
2. 環境のサンドボックス化(Dirty Branchのすすめ)
Gitで「sandbox/xxx」とか「experiment/xxx」っていうブランチを切る癖をつける。
メインストリームの開発ブランチは綺麗じゃなきゃいけない。CIも通さなきゃいけないし、命名規則も守らなきゃいけない。それは正しい。
でも、その「正しさ」が試行錯誤のスピードを殺すことがある。
だから、自分だけの汚いブランチを作る。ここではコミットメッセージなんて「wip」でいいし、コードフォーマットなんて無視していい。
思いついたアイデアを、汚いコードでいいから最速で動く形にする。動かなかったらブランチごと捨てればいい。
この「捨てられる環境」があるだけで、心理的安全性は爆上がりする。「壊しても怒られない」という安心感が、突飛なアイデアを試す勇気をくれるんだ。
3. マインドのサンドボックス化(失敗の再定義)
これが一番大事かもしれない。
日本にいた頃は「コンパイルエラー=恥」みたいな感覚がどこかにあった。バグを出すのはプロ失格だと。
でも、サンドボックスの中では**「失敗=データ取得」**と定義し直すんだ。
「このライブラリは、こういう使い方をするとメモリリークするんだな」ということがわかったら、それは大成功。「このアーキテクチャだと、将来的にメンテが死ぬな」と気づけたら、それは素晴らしい発見。
海外のエンジニアと話すと、彼らは自分の失敗談をめちゃくちゃ楽しそうに話す。「いやー、昨日データベース吹き飛ばしかけてさ!」みたいな。
それは彼らが、サンドボックスの中で「安全に失敗」しているからなんだ。本番環境でやらかす前に、遊び場で地雷を踏んでおく。これが最強のリスクヘッジであり、学びの源泉になる。
予測不能な未来のために
僕らが作っているC# WPFの世界だって、いつまで安泰かわからない。
MicrosoftはMAUIだのWinUI 3だの次々と新しいものを出してくるし、Web技術(Electronとか)がデスクトップアプリの領域を侵食してきている。
そんな中で、「WPFの仕様書通りに書くことだけ」に特化していたら、技術の断層が起きた時にひとたまりもない。
でも、もし君がサンドボックスの中で、WebAssemblyを触っていたら? Rustでバックエンドをいじっていたら?
技術のパラダイムシフトが起きた時、それは「脅威」じゃなくて「チャンス」に見えるはずだ。
「あ、これ、あの時サンドボックスで遊んだアレと同じ概念じゃん」って。
点と点が繋がる瞬間。スティーブ・ジョブズが言ってた「Connecting the dots」ってやつだね。
あれは、後から振り返った時にしか繋がらない。だからこそ、今、一見無駄に見える「点」をたくさん打っておくしかないんだ。
海外で働くっていうのも、ある意味、人生レベルでの「サンドボックス」みたいなもんだ。
言葉も通じない、文化も違う、昨日の常識が通用しない。
そんな環境に身を置くと、強制的に脳が「探索モード」になる。
スーパーで変な野菜を買って料理してみるのも、道に迷って知らない路地に入ってみるのも、全部実験。
その中で、「あ、意外とこれいけるじゃん」とか「うわ、これは無理だ」っていう発見を繰り返す。
このプロセス自体が、エンジニアとしての「適応力」や「問題解決能力」を鍛えてくれる。
だから、まずは作ろう。君だけの「イノベーション・サンドボックス」を。
上司に隠れてこっそりやるのもまた、スリリングで楽しいもんだよ。
完璧なコードを書くのは、平日の午後3時だけでいい。
それ以外の時間は、泥んこになって遊ぼう。
予期せぬバグ、予期せぬエラー、予期せぬ挙動。それらを愛そう。
そこには、まだ誰も見つけていない「宝の地図」が眠っているかもしれないから。
さて、「遊び場」を確保したところで、次はもう少し戦略的な話をしようか。
ただ遊んでいるだけじゃ、単なる趣味で終わっちゃうこともある。
次に必要なのは、未来の失敗をあえて妄想することで、現在の成功確率を上げるという、ちょっと変わった思考実験だ。
その名も「プレモーテム(Pre-mortem)」。
検死(Post-mortem)ならぬ、事前検死。
これがまた、海外のプロジェクトマネジメントでは結構使われる強烈なテクニックなんだ。
「あえて失敗」を想像する。未来の崩壊を防ぐ「プレモーテム」という逆転思考
前回の記事では、「イノベーション・サンドボックス」を作って、泥んこになって遊ぶことの重要性を書いた。
でも、勘違いしないでほしい。僕らはいつまでも砂場で城を作ってキャッキャしているわけにはいかない。
エンジニアには「デリバリー(納品)」という絶対的なゴールがある。
遊び心で生まれた素晴らしいプロトタイプも、プロダクトとして世に出し、ユーザーに使ってもらい、お金を稼がなければ、それはただの「自己満足なコード片」で終わってしまう。
そして、ここからが現実の厳しいところだ。
サンドボックスの中では、失敗は「データ」だった。でも、本番環境での失敗は「事故」だ。
深夜3時に叩き起こされるPagerDutyの通知音、血の気が引くような本番DBのデッドロック、顧客からの怒号のようなメール。
僕ら海外エンジニアは、こうした「地獄」を回避するために、あらゆる設計パターンやテスト手法を駆使する。
だが、それでもバグは生まれる。想定外のトラブルは起きる。
なぜか? それは僕らが「成功」ばかりをイメージして計画を立てるからだ。
「うまくいけば、このアーキテクチャで捌けるはず」「スケジュール通りにいけば、テスト期間は十分なはず」。
この「はず(Hope)」こそが、エンジニアリングにおける最大の敵だ。
そこで登場するのが、今回のテーマである**「プレモーテム(Pre-mortem)」だ。
直訳すると「検死の前」つまり「事前検死」。
これは、プロジェクトが始まる前、あるいは機能実装を始める前に、「このプロジェクトは完全に失敗しました。死にました。さて、死因は何?」**と、未来の視点から現在を振り返る思考実験のことだ。
これが、実は予期せぬブレイクスルー(突破口)を生む最強のツールになる。
ポストモーテム(事後検証)の限界
エンジニアなら「ポストモーテム(Post-mortem)」は馴染みがあると思う。
障害が起きた後に、「なぜ起きたのか?」「再発防止策は?」を話し合う振り返り会のことだ。
僕も日本にいた頃は、これを一生懸命やっていた。再発防止策のエクセルが山のように積み上がるあれだ。
でも、海外に来て、あるシニアエンジニアに言われたんだ。
「Hey、死んだ患者の解剖をして、死因がわかったとして、患者は生き返るのか?」
ぐうの音も出なかった。
もちろん、次の患者(プロジェクト)のために知見を残すのは大事だ。でも、今のプロジェクトを救うことはできない。
ポストモーテムは「反省」であり、プレモーテムは「予知」だ。
イノベーションやセレンディピティは、反省からは生まれにくい。未来への洞察から生まれるものだ。
悲観主義者がヒーローになる瞬間
プレモーテムの具体的なやり方はシンプルかつ強烈だ。
キックオフミーティングで、リーダーがこう宣言する。
「今から1年後、我々の新しいWPFアプリケーションはリリースされた。しかし、大惨事になった。ユーザーは誰も使っていないし、AppStoreのレビューは星1つだ。会社はこのプロジェクトの打ち切りを決定した」
シーンとなる会議室。そしてリーダーは続ける。
「さて、みんな。**『なぜ』**こうなったのか、その理由を紙に書き出してくれ」
ここでのポイントは、「失敗するかもしれない」というリスク出しではなく、「すでに失敗した」という前提に立つことだ。
心理学的に「Hindsight Bias(後知恵バイアス)」というのがある。「ああ、そうなると思ってたんだよ」ってやつだ。人間は未来を予測するより、過去を説明するほうが遥かに得意なんだ。
このバイアスを逆手に取る。未来を「過去のこと」として脳に錯覚させることで、具体的で生々しい失敗原因をあぶり出すことができる。
僕が体験したあるセッションでは、こんな意見が出た。
- 「XAMLの画面遷移アニメーションに凝りすぎて、低スペックPCだとカクカクで使い物にならなかった」
- 「MVVMにこだわりすぎて、単純な機能追加なのにコード量が爆発し、バグ修正が追いつかなくなった」
- 「非同期処理(async/await)の使いすぎで、デッドロックが頻発した」
これらは、通常の会議で「懸念点ある?」と聞かれても出てこない。「まあ、なんとかなるでしょ」という楽観ムードにかき消されてしまうからだ。
でも「失敗した」という前提なら、みんな遠慮なく言える。「だって失敗したんだもん、俺のせいじゃない、設計のせいだ」と、責任から解放された状態で、システムの急所を突くことができる。
海外のチームでは、ここで一番「エグい死因」を挙げた奴が賞賛される。
「お前、性格悪いな! 最高だよ!」ってね。
日本では「言霊」なんて言って、悪いことを口にするのを避ける空気があるかもしれない。「縁起でもない」とか。
でも、コードに縁起は関係ない。あるのはロジックだけだ。
最悪の事態を直視できる人間だけが、最良の設計図を描ける。
WPFエンジニア的「死の想像」が生んだ意外な発見
さて、ここからが「セレンディピティ(偶然の幸運)」の話だ。
プレモーテムは単なるリスク管理じゃない。時に、思いがけないイノベーションのきっかけになる。
僕が関わっていたある業務アプリの開発でのこと。
プレモーテムで、僕はこんな「死因」を書いた。
「データ量が多すぎてDataGridのスクロールが重くなり、ユーザーがブチ切れて解約した」
WPFをやっている人なら分かると思うけど、WPFのDataGridは高機能な反面、描画コストが高い。VirtualizingStackPanelを使っても、数万行のデータで複雑なテンプレートを使うと、UIスレッドが悲鳴をあげる。
この「未来の死」を回避するために、僕らは対策を考え始めた。
最初は「ページング処理を入れよう」とか「表示項目を減らそう」という平凡な案が出た。
でも、あるメンバーが言ったんだ。
「そもそも、ユーザーは数万行のデータを『見る』必要があるのか? 彼らが見たいのは、異常値や特定のパターンだけじゃないか?」
そこから議論が転換した。
「じゃあ、Gridで一覧を見せるのをやめて、データを可視化したチャートをメインにしよう」
「いや、AIにデータを食わせて、見るべき項目だけをレコメンドするUIにしたらどうだ?」
結果、そのアプリは「高速な一覧表示アプリ」ではなく、「データ分析アシスタント」として生まれ変わった。
そしてこれが、競合他社にはないキラー機能になった。
もしプレモーテムをやっていなければ、僕らはただひたすらDataGridの描画パフォーマンスをチューニングすることに時間を費やし、そこそこのアプリを作って終わっていただろう。
「失敗の想像」が、既存の要件(Gridで表示する)を疑うきっかけを与え、全く新しい価値(分析アシスタント)への扉を開いたわけだ。
これこそが、Engineering Serendipityだ。
ネガティブな未来を直視することで、今の視点が強制的にズラされる。そのズレた場所に、イノベーションの種が落ちている。
「技術的負債」という時限爆弾の解体
もう一つ、プレモーテムが効果を発揮するのは「技術的負債」の扱いだ。
エンジニアなら誰しも、「今は汚いコードだけど、後で直そう」と// TODO: Fix laterというコメントを残したことがあるだろう。
そして、その「later」が永遠に来ないことも知っているはずだ。
プレモーテムでは、この// TODOが将来引き起こす破滅的なシナリオを描くことができる。
「この密結合なクラス設計のせいで、半年後の機能追加時にテストが書けなくなり、デグレ(リグレッション)が多発して品質崩壊」
そうやってシナリオ化されると、それはもはや「些細な技術的負債」ではなく、「除去しなければならない時限爆弾」として認識される。
海外の現場では、リファクタリングの予算を獲得するためにプレモーテムの結果を使うことが多い。
マネージャーに「コードをきれいにしたいです」と言っても「機能追加が先だ」と言われるのがオチだ。
でも、「このままだと半年後に開発速度が1/3になり、競合に負けてプロジェクトが死にます。その根拠はこれです」とプレモーテムの結果を見せれば、話は別だ。彼らは合理的なリスクヘッジには投資する。
こうして確保されたリファクタリングの時間(余裕)が、また新たな「遊び(サンドボックス)」の時間へと繋がり、良いサイクルが回り始める。
明日からできる「ひとりプレモーテム」
チームでやるのが難しければ、一人でもできる。
僕は、大きなクラスを設計する前や、複雑な非同期処理を書く前に、コーヒーを飲みながら5分だけ目を閉じて妄想する。
「このクラスは、3ヶ月後の俺を苦しめることになる。なぜだ?」
- ViewModelにロジックを書きすぎて、単体テストが書けなくなっているからか?
CancellationTokenを渡さずにタスクを投げっぱなしにして、画面を閉じても裏で通信が走り続けているからか?- 例外処理を
try-catch (Exception ex)で握りつぶして、原因不明のエラーログに悩まされるからか?
そうやって自問自答すると、書くべきコードが見えてくる。
「ああ、じゃあ先にService層を切り出してInterface噛ませておこう」とか、「ログ出力の戦略を最初に決めておこう」とか。
これは、悲観的になっているわけじゃない。むしろ、未来の自分に対する最大の優しさだ。
エンジニアリングにおける「楽観」は、何も考えないことと同義だ。
本当の「楽観」とは、最悪の事態を想定し尽くし、それに対する備えを完了した上で、「さあ、どう転んでも大丈夫だ。思いっきりやろうぜ」と笑うことだ。
これこそが、プロフェッショナルの態度だと僕は思う。
失敗の想像が、偶然のつながりを呼ぶ
プレモーテムを通じて「未来の失敗」を共有すると、チーム内に不思議な連帯感が生まれる。
「あ、君もそこが不安だったの? 実は僕も…」という共感だ。
普段はフロントエンドとバックエンド、あるいはデザイナーとエンジニアで対立しがちな関係も、「共通の敵(プロジェクトの失敗)」を前にすると協力しやすくなる。
「UIのデザイン、カッコいいけど実装難易度高すぎてバグりそう」という本音も、プレモーテムの場なら「死因の一つ」として建設的に議論できる。
そこから「じゃあ、デザインを少し簡略化する代わりに、マイクロインタラクションでリッチに見せよう」といった、妥協ではない「第3の案」が生まれたりする。
こうして、異なる専門分野の人たちが、失敗回避という名目のもとで知恵を出し合う。
そのカオスな議論の中から、一人では決して思いつかなかったアイデアが飛び出してくる。
そう、次回お話しする**「クロスディシプリン(異分野コラボレーション)」**への入り口は、実はこのプレモーテムの議論の中にすでに開かれているんだ。
「失敗」は怖い。でも、想像の中の「失敗」は、僕らを強く賢くしてくれる。
そして時として、想像もしなかった「正解」への近道を照らしてくれる灯台になる。
さあ、今日もVisual Studioを開く前に、一度目を閉じてみよう。
君の書こうとしているそのコード、半年後にどうなってる?
盛大に壊して、そこから最高の一手を見つけ出そう。
混ざり合うカオスに飛び込め。異分野コラボが引き起こす化学反応の正体
ここまで読んでくれた君は、自分だけの「遊び場(サンドボックス)」を持ち、未来の「失敗(プレモーテム)」をシミュレーションする術を手に入れた。
これだけでも、君は十分優秀なエンジニアだ。おそらく、仕様書通りのものを、誰よりも高品質に作ることはできるだろう。
だが、あえて厳しいことを言わせてもらう。
それだけじゃ、「想定内」の正解しか出せない。
C#のエキスパートが集まって議論しても、出てくる答えは「C#としての最適解」でしかない。
WPFの職人が集まれば、最高のXAMLが書けるかもしれないが、それは「デスクトップアプリの常識」を超えられない。
同じ釜の飯を食い、同じ言語(プログラミング言語も含めて)を話す人間同士の会話は、心地いいけれど、そこには致命的な欠陥がある。
「ノイズ」がないんだ。
セレンディピティ(偶然の幸運)の本質は、ノイズにある。
まったく異なる周波数の波がぶつかり合った時に生じる「干渉縞」。そこにこそ、イノベーションの種が隠れている。
だから、今回の「転」では、君に最も不快で、最も面倒くさくて、そして最高にエキサイティングな提案をする。
「エンジニア村」を出ろ。そして、話の通じない「エイリアン」たちと踊れ。
これが、クロス・ディシプリン(Cross-disciplinary:異分野横断)の真髄だ。
「メディチ・エフェクト」をデスクの上で起こせ
ルネサンス期、メディチ家がフィレンツェに彫刻家、科学者、詩人、哲学者、画家など、あらゆるジャンルの異才を集めたことで、爆発的な創造性が生まれた現象を「メディチ・エフェクト」と呼ぶ。
要は「混ぜるな危険」じゃなくて「混ぜれば革命」ってことだ。
海外のテック企業で働いていると、この「混ぜ方」が半端じゃない。
僕の隣の席には、元プロミュージシャンのUIデザイナーがいる。向かいには、哲学専攻のプロダクトマネージャーがいる。その奥には、なぜか植物学の博士号を持つデータサイエンティストがいる。
共通言語はブロークンな英語だけ。バックグラウンドはバラバラ。
そんな連中と、一つのWPFアプリを作るんだ。どうなると思う?
毎日が「戦争」だよ。
僕が「MVVMパターン的に、このデータの持ち方は美しくない」と主張しても、元ミュージシャンのデザイナーは「グルーヴ感がない」とか言い出す。
「グルーヴってなんだよ! ObservableCollectionの話をしてるんだよ!」と言い返したくなる。
でも、この**「噛み合わなさ」**こそが、セレンディピティの入口なんだ。
vs デザイナー:論理の壁を突破する「感性」の暴力
あるプロジェクトでの実話だ。
工場のラインを監視するダッシュボードアプリを作っていた時のこと。
僕らエンジニアチームは、いかにリアルタイムに、遅延なく数値データをグリッドに表示するか(High Performance Computing)に命をかけていた。
C#のSpan<T>やMemory<T>を駆使して、ミリ秒単位の高速化に成功してドヤ顔をしていたんだ。
そこに、フランス人の女性デザイナーがやってきて、画面を見るなりこう言った。
「これ、何も感じないわ。工場の息遣いが聞こえない」
僕は耳を疑った。「息遣い? いやいや、データは正確ですよ。遅延もゼロです」
彼女は首を振って、スケッチブックを取り出した。そこに描かれたのは、数値の羅列じゃなく、まるで生き物が呼吸するように明滅する抽象的なグラフィックだった。
「工場が健全に動いているときは、穏やかな青い波にして。トラブルが起きそうなときは、波を尖らせて。作業員は数字なんて見てないわ。空気を感じてるのよ」
最初は「WPFでそんなシェーダー書くの面倒くさいな…」と思ったよ。エンジニアあるあるだよね。
でも、渋々HLSL(シェーディング言語)を書いて、その「波」を実装してみた。
結果、どうなったか。
現場の作業員から大絶賛されたんだ。
「いちいちモニターに近づいて数値を読まなくても、遠くから色と動きを見るだけで状況がわかる」
「異常の前兆を直感的に察知できるようになった」
僕らが追求していた「数値の正確さと速さ(Logic)」に、彼女の「直感的な体験(Art)」が衝突したことで、**「アンビエント(環境的)なモニタリングシステム」**という、全く新しい概念が生まれた。
もしエンジニアだけで作っていたら、ただの「高性能なエクセル」で終わっていたはずだ。
異質な視点(この場合はアートとUX)が、技術の使い道を再定義した瞬間だった。
vs 異分野の専門家:バイオミミクリー(生物模倣)という究極の異端
もう一つ、海外ならではのクロス・ディシプリンの例として、「バイオミミクリー」の話をしよう。
自然界の仕組みを技術に応用するという考え方だ。
最近、僕の周りではエンジニアと生物学者がコラボするケースが増えている。
例えば、「分散システムの通信最適化」というガチガチのインフラ課題に対して、アリ(蟻)の行動パターンを研究している生物学者が口を出してくる。
「アリは中央サーバーなんて持ってないよ。個体がフェロモンを残して、確率的に最短ルートを見つけてるだけだよ」
エンジニアなら「中央集権的なLoad Balancer」を置きたくなるところを、生物学者は「自律分散的な群知能」で解こうとする。
これをC#のActor Model(Akka.NETとか)で実装してみると、驚くほど堅牢で、一部が死んでも止まらないシステムができあがったりする。
自分の専門分野(IT)の外にある知識は、僕らにとって「非常識」だ。
でも、自然界や他の業界にとっては「数億年の常識」だったりする。
この**「他所の常識」を「自分の課題」に輸入すること**。これこそが、最強のショートカットであり、イノベーションの源泉だ。
「車輪の再発明をするな」とはよく言うけれど、実は「隣の業界には、すげぇ性能のいい車輪が転がってる」ことがよくある。
それを見つけるには、自分のデスクを離れて、隣の業界の人間と話すしかない。
「T型人材」を超えて「H型人材」へ
よくキャリア論で「T型人材(深い専門性と広い知識)」になれと言われるけど、僕はそれじゃ足りないと思ってる。
目指すべきは**「H型人材」**だ。
縦の棒(I)が自分。もう一本の縦の棒(I)が、異分野の他人。
そして、その二つをガッチリ繋ぐ横棒(-)。
この**「繋ぐ力(Connect)」**を持てるかどうかが、海外エンジニアとして生き残れるかの分水嶺になる。
異分野の人と繋がるためには、2つのスキルが必要だ。
1. 専門用語(ジャーゴン)を捨てる勇気
「依存性注入(DI)が…」「非同期のAwaiterが…」なんて言葉を使った瞬間、相手は心を閉ざす。
自分の専門知識を、5歳の子供でもわかる言葉、あるいは相手の業界の言葉に翻訳できるか?
「DI」じゃなくて「レゴブロックみたいにパーツを差し替えられる仕組み」と言えるか。
この「翻訳能力」こそが、コラボレーションの接着剤になる。
2. 「バカだと思われる」ことを恐れない
異分野に飛び込むということは、その分野では自分が「素人」になるということだ。
プライドの高いエンジニアにはこれがキツイ。「何も知らないやつだと思われたくない」と黙ってしまう。
でも、逆だ。
「え、なんで植物って光合成するんですか?」「なんでこのデザインにしたんですか?」と、素人のふりしてバカな質問を投げまくる。
その「素朴な疑問」が、相手にとっても「当たり前すぎて忘れていた本質」を突くことがある。
無知は武器だ。恥をかける人間だけが、新しい知見を持ち帰れる。
偶発的な出会いを「設計」する
「でも、そんな異分野の人と出会う機会なんてないよ」
そう思うかもしれない。特にリモートワークが普及した今は、自分のチーム以外と話す機会は激減した。
だからこそ、ここでも「意図的な設計」が必要になる。
僕がやっているのは、**「Random Lunch Hack」**だ。
社内のSlackやTeamsで、全く仕事で関わりのない人に「あなたの仕事に興味があるから、15分だけコーヒー飲みながら話さない?」とDMを送る。
あるいは、コワーキングスペースで、あえてエンジニアっぽくない人の隣に座る。
オンラインなら、技術系以外のMeetup(例えば「ガーデニング愛好会」とか「哲学読書会」)に参加してみる。
最初は怖いよ。会話が弾まないかもしれない。
でも、10人に1人くらい、「あ、それ今の僕の仕事に使えるかも!」という化学反応が起きる相手がいる。
その1回のセレンディピティが、君のエンジニア人生を変えるかもしれない。
快適な「エコーチェンバー」を焼き払え
SNSのタイムラインを見てみてほしい。
フォローしているのは、同じような技術スタックのエンジニア、同じような意見のインフルエンサーばかりじゃないか?
そこは快適な「エコーチェンバー(共鳴室)」だ。自分の意見が肯定され、強化されるだけの閉じた世界。
そこからは、何も新しいものは生まれない。
海外に出るということは、物理的にこのエコーチェンバーから放り出されるということだ。
文化も、言語も、宗教も、労働観も違う人たち。
彼らは君のコードの美しさなんて理解してくれない。
でも、彼らは君が一生思いつかないような「問い」を投げかけてくれる。
エンジニアリングは、コードを書くことだけじゃない。
「世界をどう切り取るか」という視点の勝負だ。
一人で切り取れる世界なんてたかが知れている。
だから、他人の視点を借りるんだ。他人のメガネをかけて、世界を見てみるんだ。
そうすれば、今まで「バグ」だと思っていた事象が、突然「美しいパターン」に見えてくる瞬間がある。
XAMLの記述と、建築家の図面と、音楽の楽譜が、頭の中でリンクする瞬間がある。
その瞬間こそが、Engineering Serendipityの極致だ。
さあ、ヘッドホンを外そう。
そして、一番話が通じなさそうな、一番自分と遠い場所にいる「誰か」に話しかけに行こう。
イノベーションは、その気まずい沈黙の後に、きっと訪れる。
偶然は待つものじゃない、仕掛けるものだ。明日から始める「計画された偶発性」
ここまで、長々と付き合ってくれてありがとう。
カフェのコーヒーもすっかり冷めてしまったけれど、僕の熱量はむしろ上がっている。
「起」で、効率化の呪縛を解いてサンドボックスで遊ぶことを提案した。
「承」で、最悪の未来を想像するプレモーテムで、失敗をイノベーションの燃料に変える話をした。
「転」で、快適なエンジニア村を出て、異質な他者と混ざり合う重要性を説いた。
これらは全て、一つの目的に集約される。
それは、**「運(Luck)を、技術(Skill)として実装すること」**だ。
エンジニアである僕らは、「運」という言葉を嫌う傾向がある。「たまたま動いた」コードなんて信用できないし、「運任せ」のデプロイなんて怖くてできない。全てをコントロールしたい生き物だ。
でも、キャリアや人生、そして真のイノベーションにおいては、コントロールできない要素——つまり「偶然」——が決定的な役割を果たす。
スタンフォード大学のジョン・クランボルツ教授が提唱した**「計画された偶発性理論(Planned Happenstance Theory)」**というのを知っているだろうか?
成功したキャリアの8割は「偶然」によって形成されているという衝撃的な研究結果だ。
だが、重要なのは「だから運を天に任せて寝て待て」ということじゃない。
**「偶然は計画できるし、誘発できる」**ということだ。
最終回となる今回は、この理論を僕らエンジニアの言語に翻訳し、明日から実行できるアクションプランとして君に渡したい。
「わらしべ長者」的リファクタリング
僕が日本を出て海外で働いているのも、元を正せば「偶然」の産物だ。
別に子供の頃から「海外でC#を書くぞ!」と決めていたわけじゃない。
ただ、日本で働いていた時に、ある日ふと「英語のドキュメントをDeepLに頼らず読んでみるか」という小さな気まぐれ(サンドボックス)を起こした。
そこで得た知識をブログに書いていたら、海外のエンジニアからコメントがついた(クロスディシプリン)。
そのコメントのやり取りが楽しくて、オンラインハッカソンに参加したら、今の会社のボスと出会った。
これ、後から見れば綺麗なストーリーに見えるけど、当時は「ただの点」だ。
スティーブ・ジョブズの言う「Connecting the dots」は、振り返った時にしか見えない。
でも、**点を打つこと(Action)**は、今この瞬間にしかできない。
多くのエンジニアは、キャリアを「ウォーターフォール」で考えがちだ。
3年後にリーダーになって、5年後にアーキテクトになって…という完璧な設計図を描こうとする。
でも、世界はアジャイルに変わっていく。AIが登場し、フレームワークが変わり、働き方が変わる。
ガチガチの仕様書(人生設計)は、完成した瞬間にレガシーになる。
だから、僕らがやるべきなのは、人生の「継続的インテグレーション/継続的デリバリー(CI/CD)」だ。
小さな好奇心を毎日デプロイし、フィードバックを得て、自分自身をリファクタリングし続ける。
「わらしべ長者」のように、手元にある小さな藁(スキルや興味)を、交換し続けることでしか、予期せぬ場所には辿り着けない。
セレンディピティを呼び込む3つの変数
「Engineering Serendipity(偶然を設計する)」ためのアルゴリズムは、実はシンプルだ。
以下の3つの変数を最大化すればいい。
1. 行動力(Action)
エラーを恐れずにコンパイルを通す回数だ。
勉強会に行ってみる、ZennやQiitaに記事を投稿してみる、OSSにプルリクを送ってみる。
「ROM専(Read Only Member)」でいる限り、セレンディピティの確率はゼロだ。
システムは、イベントが発火(Fire)しないと動かない。君がイベント・ソースになれ。
2. 多様性(Diversity)
「転」で話した通りだ。
いつもと同じメンバー、同じ技術スタック、同じ居酒屋。そこは安全だけど、変数は固定されている。
パラメーターを変えよう。読む本を変える、会う人を変える、住む場所を変える。
ノイズを受け入れることで、システムは進化する。
3. 気づき(Awareness)
これが一番難しい。目の前に落ちてきたチャンスを「チャンスだ」と認識する力だ。
プレモーテムで鍛えた「未来を想像する力」がここで活きる。
「この面倒くさいバグ、もしかして新しいツールの種になるんじゃないか?」
「この人と話が合わないのは、全く新しい視点を持っているからじゃないか?」
単なるノイズをシグナルとして受信できる感度(Sensitivity)を高めておくこと。
明日から始める「ライフ・エンジニアリング」
精神論だけじゃ終わらせない。
明日から君の日常に実装できる、具体的なTo-Doリストを用意した。
- Step 1:週に1回、「聖なる実験時間」をブロックするカレンダーに「R&D」と入れて、2時間だけ確保する。その時間は、業務とは無関係な新しい技術、あるいは技術以外の趣味(料理でも筋トレでもいい)に没頭する。このサンドボックスが、君の引き出しを増やす。
- Step 2:月に1回、「自分プレモーテム」を行う「1年後、僕は今の現場で完全に腐っている。なぜか?」と自問する。「毎日同じCRUD処理しか書いてないから」「英語から逃げているから」。死因がわかったら、それを回避するための小さなアクション(英語のPodcastを聴く、など)を1つだけ始める。
- Step 3:半年に1回、「アウェー」に出るエンジニア以外の集まりに参加する。マーケターのミートアップ、地域のボランティア、アートの展示会。そこで「自分は何をしている人間か」を、専門用語を使わずに説明する練習をする。異文化との接触は、君のコミュニケーション能力(インターフェース)を劇的に向上させる。
- Step 4:発信する(Output is King)サンドボックスで作った失敗作、プレモーテムで気づいたリスク、アウェーで感じた違和感。それらを言葉にして外に出す。完璧な記事じゃなくていい。「こんなことやって失敗したw」というツイート一つでいい。発信は、セレンディピティを受信するためのアンテナを立てる行為だ。世界中のどこかの誰かが、君のその発信にフックするかもしれない。
最後に:コードを書くように、人生を書け
WPFの世界では、Main()メソッドから全てが始まり、イベントループが回り続ける。
僕らの人生も同じだ。終わりのないループの中で、様々なイベントが発生し、例外が飛び、ハンドリングしていく。
海外で働いていると、本当に予想外のことばかり起きる。
ビザが下りない、家が借りられない、プロジェクトが突然消滅する。
でも、そんな「Unchecked Exception(非検査例外)」が飛んできた時こそ、エンジニアの腕の見せ所だ。
パニックにならず、スタックトレースを読み、原因を特定し、修正パッチを当てる。
あるいは、その例外処理の中で、新しいフローに分岐してみる。
「Engineering Serendipity」とは、完璧な未来を予測することじゃない。
どんな未来が来ても、それを面白がれる自分を作っておくことだ。
バグを愛そう。
予期せぬエラーを歓迎しよう。
計画通りにいかないことを楽しもう。
なぜなら、最高の機能(Feature)は、仕様書の「外」にあるのだから。
君の手元には、最強の武器がある。
論理的思考力、学習能力、そしてモノを作る力。
それさえあれば、どこの国に行っても、どんな時代になっても、君は生きていける。
さあ、エディタを閉じよう(あ、保存は忘れずに)。
そして、街へ出よう。
次のセレンディピティは、ディスプレイの中じゃなく、そのドアの向こうで君を待っている。
Good luck, and Happy Coding your Life!

コメント