The Messy Middle:バグだらけの「途中経過」と、僕らが抱える完璧主義という病
こんにちは、海外でC#とWPFを武器に戦っている現役エンジニアです。
今日はちょっと、普段の技術解説とは違う話をしようと思います。いつもはMVVMパターンがどうだとか、非同期処理のawaitの使い方がどうだとか、あるいは現地の美味しいコーヒーの話なんかをしていますが、今回はもっと根本的な、「僕らのOS(考え方)」の話です。
突然ですが、あなたは「作りかけ」の状態を他人に見せるのが怖いですか?
僕はめちゃくちゃ怖いです。いや、正確には「怖かった」と言うべきかもしれません。日本で働いていた頃、そしてこっちに来て最初の数年は、とにかく「完璧な状態」でアウトプットを出さなきゃいけないという強迫観念に駆られていました。
コードレビューに出す前のプルリクエスト。
上司に提出する設計ドキュメント。
あるいは、SNSに投稿する英語の文章。
「もし変なミスがあったらどうしよう」「素人だと思われるんじゃないか」「こいつ、こんなこともわかってないのかと笑われるんじゃないか」。そんな恐怖心から、ローカル環境で何度も何度も見直しをして、ユニットテストを過剰なまでに書いて、英語のスペルチェックを3回かけて……そうやって時間を浪費していました。
でも、海外の現場に出て、特に今のチームに入ってから痛感したんです。「完璧を目指して止まっている」ことこそが、エンジニアにとって最大のリスクであり、もっと言えば「罪」なのだと。
今回のテーマは**「The Power of Iteration and Failure(反復と失敗の力)」**。
特にこの【起】のパートでは、成功への道のりの大半を占める**「The Messy Middle(泥臭い中盤戦)」**にスポットライトを当てたいと思います。キラキラした海外就職の成功談や、スマートなコードの裏側にある、見たくないほどカオスで、バグだらけで、でも最高に人間臭いプロセスの話です。これから海外を目指すエンジニアの皆さんに、僕の失敗談という「生データ」を共有します。
1. 「コンパイルが通らない」時間は無駄じゃない
僕が日常的に扱っているWPF(Windows Presentation Foundation)という技術は、非常に強力ですが、同時にものすごく「お作法」に厳しいフレームワークでもあります。XAMLのデータバインディングなんて、ちょっとプロパティ名を間違えただけで、エラーも吐かずにただ「画面に何も表示されない」という虚無を返してきたりします(WPFやってる人なら、この虚無感わかりますよね?)。
日本にいた頃の僕は、この「動かない時間」をひたすら恥じていました。
「一発で動くコードを書けるのがシニアエンジニアだ」
「デバッグに時間を使っているのは、設計が甘い証拠だ」
そんなふうに自分を追い込んでいたんです。だから、周りの同僚がサクサク開発しているように見えると(実際は彼らだって裏で苦労しているのに)、自分だけが泥沼にハマっているような劣等感を感じていました。
でも、こっちのシニアエンジニアたち、特にテックリード級の人間を見ていると、全く逆なんですよ。彼らは平気で「壊れたコード」をコミットします(もちろんブランチ運用は守りますが)。そして、画面共有しながら平気で「Oops, it crashed. Why?(おっと落ちた。なんでだ?)」なんて言いながら、その場でスタックトレースを追いかけ始める。
彼らにとって、エラー画面や例外スローは「失敗」ではなく、「対話」なんです。
コンパイラとの対話、ランタイムとの対話。
「あ、こっちは行き止まりね、OK、じゃあこっちの道か」
という、単なる迷路探索のプロセスに過ぎない。
彼らは「Messy Middle(泥臭い中盤)」を愛しています。コードがぐちゃぐちゃになり、リファクタリングが必要で、仕様もあやふやな状態。そこを高速で試行錯誤(イテレーション)しながら、正解に近づいていくプロセス自体を楽しんでいる。
「最初から正解を書こうとするな。まずは動かせ。そして壊せ。そこから学べ。」
これが、僕が海外の現場で最初に叩き込まれた、そして最も重要な教訓です。WPFの複雑なVisual Tree(視覚効果の階層構造)を一発で構築しようとするのではなく、まずは背景を赤色にしてでも「そこに要素があるか」を確認する。その泥臭いステップを飛ばそうとする奴は、いつまでたっても完成品に辿り着けないんです。
2. 海外生活という巨大な「未定義動作」
この「泥臭い試行錯誤」が必要なのは、コーディングだけじゃありません。むしろ、海外で生きていくことそのものが、巨大な例外処理の連続です。
日本という国は、ある意味で非常に「型安全(Type-Safe)」な社会だと僕は思います。電車は時間通りに来る(仕様通り)、役所の書類は書けば通る(コンパイル成功)、お店の人は丁寧(期待通りのレスポンス)。予測可能な範囲内で社会が動いています。
でも、海外に出ると、いきなり動的型付け言語の、しかもドキュメントがないレガシーコードの中に放り込まれたような気分になります。
僕が今の国に来て最初に家を借りようとした時の話をしましょう。
内見の予約をしたのに、不動産屋が来ない。電話したら「忘れてた、来週でいい?」と言われる。
いざ契約しようとしたら、聞いていない手数料を請求される。
やっと入居したと思ったら、初日にシャワーからお湯が出ない。
日本にいた頃の「完璧主義」の僕なら、ここで発狂していたでしょう。「なんで約束を守らないんだ!」「契約書と違うじゃないか!」と、正義感を振りかざしてストレスを溜め込んでいたはずです。
でも、エンジニアとして「Messy Middle」を受け入れ始めていた僕は、ふと思ったんです。
「ああ、これはバグだな」と。
現地のシステムや文化という巨大なプログラムの中に、バグがある。あるいは、僕の「常識」というAPIが、現地のシステムと互換性がない(Interface Mismatch)だけなんだと。
そう思うと、不思議と楽になりました。
「お湯が出ない」というExceptionが発生した。じゃあ、原因はボイラーか? 元栓か? それとも管理会社への連絡不足か?
感情的になって「失敗した、来るんじゃなかった」と嘆くのではなく、淡々とトラブルシュートのチケットを切る感覚。
海外生活の最初の数年は、誰だってスマートには生きられません。
スーパーで欲しい野菜の名前がわからなくて変なものを買ったり(Input Error)、
同僚のジョークが聞き取れなくて愛想笑いでやり過ごして後で自己嫌悪に陥ったり(Silent Failure)、
バスの乗り方がわからなくて逆方向に行ったり(Routing Error)。
これらは全て、あなたがダメな人間だから起きるわけじゃない。
あなたが「新しい環境」に適応するための、必須の「Messy Middle」なんです。
この泥臭い、格好悪い、人には見せたくないような失敗の連続こそが、実はクリエイティブな成功(=現地に適応し、エンジニアとして活躍する未来)のために必要不可欠なプロセスなんです。
3. アルゴリズムも人間も、学習には「誤差」が必要
少し技術的な話をしましょう。
最近はAI開発の話題も多いですが、機械学習の基本原理を思い出してください。ニューラルネットワークが賢くなるためには何が必要でしょうか?
それは「誤差(Loss)」です。
正解データと、今の自分の出力とのズレ。この「誤差」を逆伝播(Backpropagation)させて、重みを更新していくことで、AIは学習します。つまり、誤差(失敗)がなければ、学習は発生しないんです。
もし、初期状態から完璧な答えを出し続けるAIがいたらどうでしょう? それは学習しているのではなく、単にデータを丸暗記しているだけ(過学習)かもしれません。未知のデータ(新しい環境や課題)に出会った瞬間、使い物にならなくなるでしょう。
僕たち人間も同じです。
海外に来て、英語でプレゼンをして、見事に爆死したとします。質問に答えられず、場が凍りついた。
これは強烈な「Loss(誤差)」です。悔しいし、恥ずかしい。
でも、この強烈なフィードバックがあるからこそ、「次はこう答えよう」「この単語は通じないんだ」という強固な学習(Weight Update)が起こります。
家で一人で英会話アプリを完璧にこなしていても得られない、強烈な学習体験。それが「現場での失敗」です。
「Messy Middle」を避けるということは、この学習の機会を自ら捨てているのと同じです。
完璧主義者は、失敗を恐れて打席に立ちません。だから「Loss」が発生せず、フィードバックが得られず、結果として成長曲線がフラットになってしまう。
一方で、泥臭くバグを出し続けるエンジニアは、毎日大量の「Loss」を浴びて、高速で修正を繰り返す。
1年後、どちらが優秀なエンジニアになっているか。
どちらが、海外というタフな環境でサバイブできているか。
答えは明白ですよね。
4. まとめ:起のパートの終わりに
ここまで読んで、「頭ではわかるけど、やっぱり失敗は怖いよ」と思った方もいるかもしれません。
わかります。僕もまだ怖いです。
新しい機能の実装を任された時、未知の技術スタックを触る時、やっぱり「できなかったらどうしよう」という不安は消えません。
でも、認識を変えることはできます。
「混沌(Messy)」は、避けるべき障害物ではなく、通るべきルートそのものなのです。
目的地に向かう道が舗装されているとは限りません。特に海外キャリアという道は、基本的には未舗装のオフロードです。泥が跳ねるし、タイヤもパンクする。
そこで「車が汚れるから」とガレージに引きこもっているのか。
それとも、「汚れたら洗えばいいじゃん、それよりこの道の先を見に行こうぜ」とアクセルを踏むのか。
これから続くパートでは、この「泥臭い試行錯誤」を具体的にどうやって日々の仕事や学習、生活に落とし込んでいくのか。
失敗をただの失敗で終わらせず、次の成功への「燃料」に変えるための具体的なテクニック(承・転)について、掘り下げていきたいと思います。
C#のコンパイラが吐き出す赤いエラーメッセージ。あれは、あなたを拒絶しているんじゃありません。
「ここを直せば、もっと良くなるよ」と教えてくれる、愛あるナビゲーションなんです。
さあ、恐れずに「ビルド」ボタンを押しましょう。
エラーが出たら?
ガッツポーズです。それはあなたが、前進しようとした証拠なんですから。
Learning from “Failed” Experiments:エラーログは失敗の証ではなく、ただの「データポイント」だ
前回は「完璧主義を捨てて、泥臭い中盤(Messy Middle)に飛び込もう」という話をしました。
でも、実際にその泥の中に飛び込んで、顔面から転んだ時、どうしても心は痛みますよね。「ああ、やっぱり自分はダメだ」「またやっちまった」と。
この【承】のパートでは、転んだ後にどう立ち上がるか、いや、**「転んだ瞬間に何を拾うか」**という話をします。
私たちエンジニアにとって、アプリケーションのクラッシュは日常茶飯事です。でも、自分の人生のクラッシュとなると、途端に冷静さを欠いてしまう。
今日は、あなたの人生で発生する「失敗」という名の例外(Exception)を、try-catchブロックで適切に捕捉し、貴重なログとして保存するための技術論です。
感情はいりません。必要なのは「スタックトレース」だけです。
1. 人格とコードを切り離す技術:NullReferenceExceptionで泣く人はいません
C#で開発をしていて、System.NullReferenceExceptionが発生したとします。あの悪名高き「オブジェクト参照がオブジェクト インスタンスに設定されていません」というエラーです。
この時、あなたは泣きますか?
「なんてことだ、変数がnullだったなんて…僕はなんて愚かな人間なんだ。生きていく資格がない」と、モニターの前で膝から崩れ落ちるでしょうか?
絶対にしませんよね。
舌打ちくらいはするかもしれませんが、すぐにこう考えるはずです。
「どこでnullになった? データの取得ミスか? 初期化忘れか? スタックトレースを見せてくれ」
ここに、エンジニアとしての最強のヒントがあります。
コードのエラーに対して、私たちは非常に論理的で、冷静で、分析的になれます。なぜなら、「コードのミス=人格の欠陥」ではないと知っているからです。それは単なる論理的な不整合であり、修正可能なバグに過ぎません。
ところが、これが「英語の会議での発言ミス」や「現地スタッフとのコミュニケーション齟齬」になった途端、私たちはエラーログを見るのをやめてしまいます。代わりに、「恥ずかしい」「怖い」「自分は英語ができない」という感情の海に溺れてしまう。
僕が海外に来て数年目、大きなプロジェクトでリーダーを任された時のことです。意気揚々と設計を進めていたんですが、現地のQA(品質保証)チームとの連携がうまくいかず、リリース直前に致命的なバグが見つかりました。
原因は、僕が仕様書に書いた英語のニュアンスが曖昧で、QAチームがテストケースを漏らしていたことでした。
日本の感覚なら、これは「始末書もの」です。僕は真っ青になって、マネージャーに謝罪に行きました。「I am so sorry. It’s my fault.(本当にごめんなさい、僕のミスです)」と、ひたすら頭を下げました。
すると、マネージャー(アメリカ人)は不思議そうな顔をして言いました。
「Why are you apologizing?(なんで謝ってるの?)」
彼は怒っているわけでも、慰めているわけでもありませんでした。ただ純粋に、データが欲しかったのです。
「君が悪いとかどうとかはどうでもいい。知りたいのは『Why happened?(なぜ起きたか)』と『How to fix?(どう直すか)』、そして『How to prevent?(どう防ぐか)』だ。プロセス上の欠陥(バグ)を教えてくれ」
その時、ハッとしました。
僕は「失敗」を「自分の評価を下げるイベント」として捉えていた。
でも、彼は「失敗」を「プロセスを改善するためのデータポイント」として捉えていたんです。
バグが出たということは、テストプロセスに穴があることが「発見」されたということ。それはシステムを強固にするための貴重な情報です。
人間も同じです。失敗したということは、自分のスキルや行動パターンに穴があることが発見されただけ。
「自分はダメだ」と人格を否定するのは、NullReferenceExceptionが出たからといってPCを窓から投げ捨てるようなものです。PCを捨てるな、コードを直せ。
2. ポストモーテム(事後検証)文化:感情抜きのログ解析
海外のテック企業、特にシリコンバレー流の文化が浸透している現場では、障害が起きると必ず「Post-Mortem(ポストモーテム/検死)」と呼ばれる振り返りが行われます。
言葉は怖いですが、要は「なぜ死んだのか(障害が起きたのか)」を解剖する会議です。
ここで徹底されるのが**「Blameless(非難なし)」**というルールです。「誰がやったか」を追求することを固く禁じ、ひたすら「何が起きたか」という事実にフォーカスします。
これを個人の生活に応用すると、劇的に生きやすくなります。これを僕は**「セルフ・ポストモーテム」**と呼んでいます。
例えば、「現地の同僚とランチに行ったけど、会話が盛り上がらずに気まずい沈黙が続いた」という失敗(Failure)があったとします。
普通の反省(感情ベース)だとこうなります。
- 「ああ、また喋れなかった」
- 「俺ってつまんない人間だな」
- 「もうランチ行くのやめようかな」→ 結論:行動停止(デッドロック)
これを、エンジニア流の「セルフ・ポストモーテム(データベース)」に変えるとこうなります。
- 事象(Exception): ランチタイムに15分間の沈黙が発生。CPU使用率(精神的負荷)が100%に張り付いた。
- 原因分析(RCA):
- 話題のストックが「仕事の話」しかなかった(データベース不足)。
- 相手がNFL(アメフト)の話をしたが、ルールを知らずレシーブできなかった(プロトコル不整合)。
- 「沈黙は悪いことだ」という日本の文化を引きずって焦った(タイムアウト設定のミス)。
- 対策(Fix):
- 週末にNFLのハイライト動画を1本見る(データのインポート)。
- 「君の週末の予定は?」という万能メソッド(汎用関数)をあらかじめ定義しておく。
- 沈黙しても笑顔でサンドイッチを食べる練習をする(待機処理の実装)。
どうですか? 「自分がダメな人間だ」なんて要素はどこにもありません。あるのは「話題不足」や「知識不足」という、単なるパラメータの設定ミスだけです。
これなら直せますよね。明日から実行可能です。
海外で働くエンジニアにとって、日々の恥ずかしい経験や失敗は、すべてこの「データポイント」です。
エラーログが溜まれば溜まるほど、あなたの「海外生存アルゴリズム」の精度は上がっていきます。
だから、失敗したら心の中でガッツポーズしてください。「よし、貴重なサンプルデータを採取したぞ」と。
3. アルゴリズムの視点:局所解(Local Optimum)から脱出せよ
ここでもう一つ、エンジニアらしい視点を加えましょう。最適化アルゴリズムの話です。
山登り法や焼きなまし法など、最適解を探索するアルゴリズムにおいて最大の敵は何でしょうか?
それは**「局所解(Local Optimum)」**へのスタック(ハマり込み)です。
本当の頂上(大成功)はもっと遠くにあるのに、目の前の小さな丘(そこそこの成功・安定)に登ってしまい、そこから動けなくなる状態です。そこから動こうとすると、一時的に「下る(=失敗する・状況が悪化する)」必要があるため、アルゴリズム(人間)は現状維持を選んでしまうのです。
日本でそこそこ仕事ができて、生活も安定している状態。これはある種の「局所解」です。心地よいし、悪くありません。
そこから「海外移住」や「新しい技術スタックへの挑戦」をするということは、わざわざその丘を降りて、谷底(失敗のリスクが高い場所)に降りることを意味します。
アルゴリズムの世界には「イプシロン・グリーディ法(Epsilon-Greedy Strategy)」という考え方があります。
基本的には「今まで一番うまくいった方法(活用:Exploitation)」を選びつつ、一定の確率(イプシロン)で、あえて「ランダムな、未知の行動(探索:Exploration)」を選ぶという戦略です。
この「あえて選ぶ未知の行動」は、高い確率で失敗します。無駄足に終わるかもしれません。
しかし、この「失敗を許容した探索」を行わない限り、アルゴリズムは永遠に局所解から抜け出せず、もっと高い山(グローバル最適解)を見つけることはできません。
僕がWPFの案件で、使い慣れたMVVMライブラリを使わず、あえて新しい(まだバギーな)ライブラリを試してみたり、
完璧に通じるカタカナ英語を使わず、あえて発音の難しい単語を使って聞き返されたりするのは、
この「探索(Exploration)」を行っているからです。
「失敗(Failed Experiment)」とは、探索のコストです。
それは無駄な出費ではなく、「ここには正解がなかった」という情報を買った投資です。
エジソンが「私は失敗していない。うまくいかない1万通りの方法を発見しただけだ」と言ったのは有名ですが、これを現代のデータサイエンスの言葉で言えば、
「探索空間(Search Space)を埋めるためのサンプリングを行っている」
となります。
マップの黒い霧(Fog of War)を晴らすためには、そこに行って何かにぶつかるしかありません。
何も失敗していない人は、地図のほんの一部しか見えていない人です。
たくさん失敗している人は、自分の人生のマップがどれだけ広いかを知っている人です。
4. まとめ:承のパートの終わりに
失敗を「恥」から「データ」へ変換するコンバーターを心に実装してください。
今日、上司に怒られましたか?
コードレビューでボコボコにされましたか?
スーパーで店員さんに無視されましたか?
素晴らしい! それはすべて生のデータです。
夜、枕を濡らす前に、エディタを開いて(あるいはノートを開いて)ログを書きましょう。
Plaintext
[EXCEPTION LOG]
Time: 202X-XX-XX 14:00
Location: Team Meeting
Error: Couldn't explain the logic of the new feature.
Root Cause: Vocabulary insufficient. Relied too much on slides.
Action Item: Memorize 3 key phrases for the next specific explanation.
Severity: Warning (Not Fatal)
こうやって記録に残した瞬間、その失敗はあなたを傷つける凶器から、あなたを成長させる資産に変わります。
感情を排し、事実を見つめ、対策を打つ。
この地道なデバッグ作業の繰り返しだけが、バグだらけの「海外生活」というアプリケーションを、いつか名作へと変えていく唯一の方法です。
さて、失敗をデータとして蓄積する方法はわかりました。
では、このデータをどうやって高速に回し、劇的な成長(イノベーション)につなげていくのか。
ただ耐えるだけではなく、攻めるための開発手法。
次回の【転】では、「Rapid Prototyping for Algorithmic Innovation:人生をアジャイル開発する技術」についてお話しします。
準備に時間をかけすぎず、未完成のまま市場(世の中)にリリースし、フィードバックループを回しまくる。
そんな、シリコンバレー顔負けの「人生のアジャイル開発」の極意に迫ります。
Rapid Prototyping for Algorithmic Innovation:人生をアジャイル開発する技術
さあ、エラーログの解析(承)は終わりましたか?
ここからは、いよいよ修正パッチを当てて、再ビルドし、プロダクション環境(現実世界)へデプロイするフェーズです。
今回のテーマは**「スピード」**です。
僕たちエンジニアの世界では、開発手法が「ウォーターフォール」から「アジャイル」へと劇的にシフトしました。数ヶ月かけて完璧な仕様書を書き、数ヶ月かけて実装し、最後にドカンとリリースする…なんてやり方は、変化の激しい現代ではリスクが高すぎるからです。
なのに、なぜ自分の人生となると、みんな「ウォーターフォール」でやろうとするんでしょうか?
「英語が完璧になったら、海外転職活動を始めよう」
「技術書を全部読み終わったら、アプリを作り始めよう」
「お金が1000万円貯まったら、移住しよう」
ハッキリ言います。これは典型的な「失敗するプロジェクト」のパターンです。
要件定義(準備)に時間をかけすぎている間に、市場(あなた自身の情熱や、現地のビザ要件など)は変わってしまいます。
今日は、あなたの人生を「アジャイル」に変換し、高速でプロトタイプを回すための技術論です。
C#のコードを書くように、人生を書いていきましょう。
1. 「Minimum Viable You (MVY)」:未完成のままリリースせよ
スタートアップ界隈にはMVP (Minimum Viable Product) という言葉があります。「顧客に価値を提供できる最小限のプロダクト」という意味です。機能てんこ盛りの完成品ではなく、コアとなる機能だけ動くハリボテでもいいから、さっさと市場に出して反応を見よう、という考え方です。
これを個人に適用したのが、僕が提唱する**「MVY (Minimum Viable You)」**です。
海外に出る前の僕は、まさに「機能てんこ盛り」を目指していました。
TOEIC 900点、C#のエキスパート認定、貯金、完璧な履歴書…。これらが揃わないと「リリース(渡航)」できないと思い込んでいました。
でも、実際は違いました。
こっちに来て成功しているエンジニアを見ると、来た当初のスペックなんてボロボロだったりします。英語は単語を並べるだけ、技術も特定の分野しか知らない。でも、彼らは「リリース」したんです。
WPFで例えるなら、バックエンドのデータベース接続も、入力チェックも、エラーハンドリングもまだ実装していないけれど、**「画面にボタンがあって、押すとメッセージが出る」**だけの状態でリリースするようなものです。
怖いですか? でも、これでいいんです。
なぜなら、リリースしないと「本当の要件(Real Requirements)」が見えてこないからです。
僕の場合、日本で必死に覚えた「ビジネス英会話」という機能は、現場ではほとんど使われませんでした(Deprecated)。代わりに必要だったのは、インド訛りの英語を聞き取るリスニング力や、ランチで盛り上がるための雑談力でした。これは、現場(市場)に出してみないと絶対に分からない仕様です。
「準備」という名の先延ばしをやめましょう。
今のあなたのスペックは、Version 0.1 Beta版かもしれません。バグだらけでしょう。
でも、コンパイルが通るなら(=死なない程度なら)、さっさとデプロイしてください。
LinkedInのプロフィールを英語にする。
オンライン英会話で、あえて厳しい先生を選んでみる。
海外のリモート案件に応募してみる(落ちても失うものはありません)。
これらは全て「プロトタイプ」のリリースです。
完璧になってから戦うのではなく、戦いながらパッチを当てていく。それが最強の生存戦略です。
2. 「スプリント」で人生を回す:2週間の短期決戦
アジャイル開発の中核にあるのが「スクラム」、そして「スプリント」という概念です。
通常1〜2週間という短い期間で区切り、その期間内で設計・実装・テスト・レビューまでを一気通貫で行います。
これを人生に応用すると、驚くほど成長スピードが上がります。
多くの人は「1年後の目標」を立てますが、1年なんて遠すぎてフィードバックループが回りません。エンジニアなら**「2週間スプリント」**で人生を回すべきです。
例えば、「英語力を上げる」というバックログ(タスク)があったとします。
ウォーターフォール型の人は「毎日単語帳をやる」という終わりなき旅に出ます。
アジャイル型の人は、こう設定します。
【Sprint 1: 12/10 – 12/24】
- ゴール: 海外の技術フォーラム(Stack Overflowなど)で、自分のC#の知識を使って1回回答する。
- タスク:
- WPF関連の質問を探す。
- 回答の英文を作成する(DeepL使ってOK)。
- 投稿する。
これだけです。たった2週間。
もし達成できなければ、レトロスペクティブ(振り返り)を行います。「なぜできなかった?」「英語が難しすぎた?」「じゃあ次は読むだけにしよう」と、次のスプリントの計画を修正します。
僕もブログを書いたり、新しいフレームワーク(最近だとBlazorとかMAUIとか)を学ぶ時は、必ずこのスプリント形式をとっています。
「とりあえず週末までにHello Worldを動かす」「次の週末までにAPIを叩く」
小さな「完了(Done)」を積み重ねることでしか、人間は前に進めません。
巨大なモノリスのような「人生の目標」を、マイクロサービスのように小さなタスクに分割してください。
そして、2週間ごとに「出荷」してください。
3. 技術的負債(Technical Debt)を許容する
アジャイル開発において、スピードを優先するために、あえて汚いコードや場当たり的な対応をすることがあります。これを**「技術的負債」と呼びます。
重要なのは、負債は「悪」ではないということです。後で返済(リファクタリング)することを前提に、「今、最速で価値を出すために借りるもの」**です。
海外生活や新しいキャリアへの挑戦において、この「技術的負債」を許容できない真面目なエンジニアが多すぎます。
- 「文法が間違った英語を話したくない」
- 「コピペのようなコードを書きたくない」
- 「安っぽいアパートに住みたくない」
これらは全て「負債を借りたくない」と言っているのと同じです。
でも、初期のスタートアップ(=挑戦中のあなた)に、綺麗なコードを書いている余裕なんてありません。
僕が海外就職活動をしていた時の履歴書なんて、今見返すとスパゲッティコード並みに酷い英語でした(技術的負債の塊)。でも、それを出したからこそ、面接のチャンスを掴めました。面接でその英語力の低さを指摘されましたが、そこは「入社してから勉強します(リファクタリングします)」と約束して、強引にマージしてもらいました。
まずは動くものを作る(Make it work)。
次に正しくする(Make it right)。
最後に速くする(Make it fast)。
ケント・ベック(著名なプログラマー)のこの言葉は、人生の真理です。
最初から「正しく」「速く」やろうとするから動けなくなるんです。
まずは、泥臭くても、カッコ悪くても、文法が間違っていても、「動くもの(現地での生活、仕事の獲得)」を作ってください。
綺麗にするのは、生活が安定してからで十分間に合います。
4. XAML Hot Reload のように人生を修正する
C# WPF(あるいは.NET MAUI)の開発で最強の機能といえば、**「Hot Reload(ホットリロード)」**ですよね。
アプリを実行したまま、XAMLのUIを書き換えると、即座に画面に反映される。いちいちビルドを停止して再起動する必要がない。あの快感。
人生のアジャイル開発も、この「Hot Reload」の感覚でやるべきです。
何か新しいことに挑戦して失敗した時(例えば、現地のミートアップに行って誰とも話せなかった時)、いちいち「自分探しの旅」に出たり、深く落ち込んで人生を再起動(Reboot)する必要はありません。
走りながら、コードを一行書き換えるだけでいいんです。
「今回は話しかけるタイミングが悪かったな(UIのレイアウトミス)」
「次は、開始10分前に行って、隣の人に挨拶してみよう(マージンの調整)」
実行状態を維持したまま、パラメータを微調整する。
この軽やかさこそが、イノベーションを生みます。
AIのアルゴリズム開発でも同じです。ハイパーパラメータのチューニングをする時、いちいち最初から学習し直していたら時間がいくらあっても足りません。途中から学習を再開したり、学習率(Learning Rate)を動的に変えたりします。
あなたも、自分の人生のパラメータ(住む場所、付き合う人、勉強する時間、使う言葉)を、走りながらいじり倒してください。
「あ、これじゃない」「お、これいい感じ」
その高速なフィードバックループ(試行回数)の多さが、最終的な「精度の高い人生」を作り上げます。
5. まとめ:転のパートの終わりに
計画書を捨てましょう。
代わりに、プロトタイプを作りましょう。
完璧な英語を話す自分(完成品)を夢見るのではなく、
今日、オンライン英会話で「I want to… uh… eat!」と叫ぶ自分(プロトタイプ)を愛してください。
そのプロトタイプは、バグだらけかもしれません。
でも、それは「世界で動いている」という一点において、頭の中にある完璧な計画よりも100万倍価値があります。
失敗をデータに変え(承)、
そのデータを使って高速で修正版をリリースする(転)。
これを繰り返すことで、あなたはいつの間にか、とんでもない高みに到達しているはずです。
さて、ここまで「泥臭い過程」「失敗のデータ化」「高速プロトタイプ」と話してきました。
ブログもいよいよ大詰めです。
最後の【結】では、この終わりのないイテレーションの先に何があるのか。
そして、これを読んでいるあなたが、**記事を読み終わった瞬間にやるべき「最初のアクション」**についてお話しします。
成功とはゴールテープを切ることではなく、走り続ける状態そのものである。
そんな「Iterative Success」の境地へ、皆さんをご案内します。
Iterative Success:永遠のベータ版として生きる
長い旅にお付き合いいただき、ありがとうございます。
ここまで、「完璧主義を捨てろ」「失敗をログとして愛せ」「プロトタイプを投げろ」と、散々煽ってきました。
もしかすると、あなたはこう思っているかもしれません。
「わかった、その泥臭いプロセスを耐え抜けば、いつか『ゴール』にたどり着けるんだな? バグのない完璧な生活、安定した海外キャリアという『v1.0』が完成するんだな?」と。
ごめんなさい。最後にちゃぶ台を返すようですが、答えは No です。
エンジニアなら知っているはずです。
バグのないソフトウェアなんて存在しません。
そして、アップデートの止まったソフトウェアに待っているのは「死(Deprecated)」だけです。
今回の【結】では、私たちが目指すべき**「Iterative Success(反復し続ける成功)」**についてお話しします。ゴールテープを切って終わるマラソンではなく、サーバが稼働し続ける限り続く「運用と保守」の話です。
1. 「いつか楽になれる」という幻想を捨てる
海外に出る前の僕は、どこかで「上がり」を求めていました。
「英語ペラペラになって、現地の企業に入社して、年収が上がれば、もう悩みなんてないハッピーエンドだ」と。
でも、実際に海外でエンジニアになってみて分かったのは、**「ステージが変われば、敵も強くなる」**という、まるでRPGのような現実でした。
言葉が通じるようになれば、今度は「文化的な機微」や「社内政治」という新しい壁(例外)が現れます。
技術力が上がれば、今度は「アーキテクチャ設計」や「ジュニアの育成」という、より抽象度の高い課題(難解なチケット)が割り振られます。
「コンパイルエラー」はなくなっても、「論理エラー」や「パフォーマンス問題」は一生ついて回るんです。
これを「絶望」と捉えるか、「やりがい」と捉えるか。ここでエンジニアとしての資質が問われます。
「なんでまだバグが出るんだ!」と怒る人は、エンジニアに向いていません。
「お、新しいバグか。また一つ賢くなれるな」とニヤリとできる人が、最強なんです。
成功とは、特定の状態(State)に到達して静止することではありません。
成功とは、終わりなき while(true) ループの中で、常に例外処理を回し続け、システムを落とさないこと(Keep Alive) です。
海外生活も同じ。トラブルは起き続けます。ビザの更新、家賃の値上げ、レイオフの噂。
でも、以前のパートで触れた通り、今のあなたには「失敗をデータに変える機能」と「高速で修正するアジャイルな脚」があります。だから、トラブルが起きても「またか」と笑って対処できる。
その**「動的な安定(Dynamic Stability)」**こそが、本当の強さです。
2. 人生はずっと「ベータ版」でいい
GoogleのGmailが、何年もの間「BETA」というラベルを外さなかった話を覚えていますか?
あれは「未完成だから許してね」という言い訳ではなく、「常に改良し続けるぞ」という宣言だったと僕は解釈しています。
私たちも、一生「ベータ版」でいいんです。
「私は完璧なエンジニアです」と胸を張った瞬間、その人はレガシーコード化します。変化の激しいIT業界で、固定化された知識は負債にしかなりません。
特にC#や.NETのエコシステムを見ても、FrameworkからCoreへ、そして5, 6, 7, 8…と、凄まじい速度で進化しています。WPFだって、今の書き方は昔とは違います。
その変化に追従できるのは、「自分はまだ未完成だ」と知っている人だけです。
海外で働いていると、60歳を超えた現役バリバリのエンジニアによく会います。彼らは若手以上に新しい技術に貪欲です。「Rustってのが面白いらしいな」「AIコーディング、試したか?」と目を輝かせています。
彼らは知っているんです。「リファクタリング(Refactoring)」をやめた瞬間、エンジニアとしての死が始まると。
自分のスキルセット、自分の価値観、自分の居場所。
これらを定期的に見直し、古いコード(思い込み)を捨て、新しい構文(知識)に書き換える。
この「自分自身のリファクタリング」を死ぬまで楽しめる人が、本当の意味での「海外で活躍するエンジニア」なのだと思います。
3. 明日から使える「小さなコミット」のすすめ
さて、壮大な話をしてきましたが、最後にブログらしく、超具体的なアクションプランで締めくくりましょう。
ここまで読んで、「よし、いつか俺も!」と思ったあなた。
その「いつか」は、await Task.Delay(-1) (無限待機)と同じで、永遠に来ません。
アジャイル開発の基本は「Small Release(小規模リリース)」でしたよね。
このブログを読み終わった直後の5分間で、人生というリポジトリに、何か一つでもいいから**「コミット」**してください。
大きな機能追加じゃなくていいです。READMEの修正レベルで構いません。
- Action 1: 環境構築
- スマホの言語設定を「英語」に変える。これだけで、毎日強制的に英語のUI(海外環境)に触れることになります。
- Action 2: Hello World
- UdemyやYouTubeで、海外のエンジニアが解説しているC#の動画を1本見る。字幕付きでいい。「技術」という共通言語があれば、意外と聞き取れることに気づくはずです(小さな成功体験)。
- Action 3: TODOコメント
- 行ってみたい国、働いてみたい会社の採用ページをブックマークする。「いつか見る」ではなく「要件定義書」として保存する。
これらは、誰にでもできる小さな「一行のコード」です。
でも、この一行を書ける人だけが、次の行を書けます。
ゼロに何を掛けてもゼロですが、0.1でも積み重ねれば、複利で膨れ上がります。
4. 最後に:バグだらけの君へ
僕は今、海外のカフェでこのブログを書いています。
窓の外には、日本とは違う景色が広がり、聞こえてくるのは英語の雑談です。
ここに来るまでに、数え切れないほどのコンパイルエラーを出しました。恥もかいたし、泣きそうな夜もありました。
でも、**「あの時のバグのおかげで、今のロジックがある」**と、今なら言えます。
もし今、あなたが仕事でミスをして落ち込んでいたり、技術力のなさに絶望していたり、海外への夢が遠すぎて挫けそうになっているなら、思い出してください。
それは「失敗」ではありません。
あなたの人生という壮大なアプリケーションが、より堅牢に、より高機能になるための**「テストケース」**です。
バグを恐れないでください。
未完成であることを恥じないでください。
泥臭いコードを書き殴り、エラーログを読み漁り、高速で修正を繰り返してください。
その「イテレーション」の先にしか見えない景色が、必ずあります。
画面の前の同業者(エンジニア)へ。
あなたのキーボードから生み出されるその一行が、コードだけでなく、あなた自身の未来もビルドしていくことを願っています。
Keep Coding. Keep Iterating.
そして、いつか世界のどこかの開発現場で会いましょう。

コメント