華やかな海外就職の裏にある「メモリリーク」──なぜ僕たちは定時で帰れないのか
どうも、皆さんこんにちは。
今、僕はオフィスの窓から見える異国のスカイラインを眺めながら、このブログを書いています。手元には少しぬるくなったコーヒー。画面にはVisual Studio 2022が立ち上がっていて、愛すべき、そして時々憎らしいXAMLのコードが広がっています。
僕は現在、北米のとあるテック企業で、シニアソフトウェアエンジニアとして働いています。専門はC#とWPF(Windows Presentation Foundation)。
「えっ、今どきWPF?」と思いましたか? そう、Web全盛の時代にあっても、産業用アプリケーションや金融系の堅牢なデスクトップアプリの世界では、WPFは依然として現役のモンスターです。MVVMパターンを厳格に守り、Bindingの挙動に一喜一憂し、ResourceDictionaryの肥大化と戦う……そんな毎日を送っています。
さて、今日皆さんにシェアしたいのは、技術の話ではありません。
いや、ある意味では技術以上に重要な、「エンジニアとしての生存(サバイバル)」の話です。
これから海外で働きたいと思っている人、あるいは既に海外に出ているけれど「何かがおかしい」と感じている人へ。
あなたがもし、「海外に行けば、残業地獄から解放されて、ジョブディスクリプション(職務記述書)に書かれたことだけをやれば評価されるクリアな世界が待っている」と思っているなら。
残念ながら、それは半分正解で、半分は致命的なバグを含んだ認識です。
僕自身、日本で働いていた頃はそう夢見ていました。
満員電車に揺られながら、「海外に行けば、ワークライフバランスが整っていて、自分のスキルセット(C#と.NET)だけを尖らせていれば、それで正当に評価されるんだ」と。
確かに、ここには日本のような「付き合い残業」はありません。上司が帰るまで席を立てない空気もありません。給与水準も、円安の影響もあって日本時代より遥かに良いです。
でも、働き始めて半年が経った頃、僕は奇妙な疲労感に襲われるようになりました。
定時は17時。表向きはそうです。でも、なぜか仕事が終わらない。
自分の担当である機能実装──たとえば、複雑なDataGridのカスタマイズや、非同期処理の制御──は順調に進んでいるはずなのに、なぜか一日が終わると、本来のタスクが進んでいないような感覚に陥るのです。
まるで、アプリケーションのメモリリークのようです。
タスクマネージャー上では正常に動いているように見えるのに、裏側で何かがリソースを食いつぶし、徐々にパフォーマンスを低下させていく。そして、気づいた時には OutOfMemoryException でクラッシュする。
その原因は何だったのか?
英語力? いえ、技術的な会話には困らないレベルにはありました。
技術力不足? いえ、C#に関してはチーム内でも頼られる存在になっていました。
原因は、もっと目に見えにくい場所にありました。
それが今回、僕が皆さんに警鐘を鳴らしたいテーマ、**「Decoding the Hidden Demands(隠された要求の解読)」**です。
海外の現場、特にスピード感が求められるアジャイルな開発現場には、ジョブディスクリプションには決して書かれない、けれど確実に存在し、処理しないと評価が下がる(あるいはチームから孤立する)「見えないタスク」が無数に浮遊しています。
これらは、JIRAのチケットにはなりません。スプリントのベロシティ計算にも含まれません。
しかし、これらに無自覚なままでいると、あなたは「仕事はできるけど、使い勝手の悪いエンジニア」あるいは「いつの間にか雑用係にされているエンジニア」になってしまうのです。
具体的に、僕が遭遇した「見えないタスク」の入り口をお話ししましょう。
ある火曜日の朝のことです。
いつものようにチームのスタンドアップミーティング(朝会)が始まりました。
「昨日はModule AのViewModelの実装を完了しました。今日はUnit Testを書きます。ブロッカーはありません」
僕は簡潔に報告しました。完璧です。アジャイルの教科書通りです。
しかし、その直後、同僚のMike(仮名)が言いました。
「Hey, 昨日クライアントから、設定画面のUIレイアウトについてちょっと意見があったんだ。まだチケットにはしてないんだけど、君、WPF詳しいよね? 今日の午後、ちょっと”Quick Question”(簡単な質問)いいかな?」
出ました。「Quick Question」。
日本人の感覚、いや、真面目なエンジニアの感覚として、僕たちはこう考えます。
「チームへの貢献だ。それに”Quick”と言っているし、10分くらいで終わるだろう」と。
僕は笑顔で「Sure!(もちろん)」と答えました。
そして午後。Mikeのデスクに行くと、彼はレガシーなXAMLコードを見せてきました。
「ここさ、動的にコントロールを追加したいんだけど、Bindingがうまくいかないんだよね」
見ると、それは単なるBindingのミスではなく、そもそもMVVMパターンを無視してCode Behindにロジックを書きなぐった、スパゲッティコードの修正相談でした。
これを直すには、アーキテクチャの再設計が必要です。「Quick」な質問に答えるレベルではありません。
ここで、日本人の「察する文化」と「責任感」が誤作動を起こします。
「これは……僕が手伝わないと、彼は一生これを解決できないし、プロジェクトが遅れるな」
そう感じた僕は、自分の席に戻り、リファクタリングの案を書き、サンプルコードを作成し、彼に説明しました。
気づけば3時間が経過していました。
その日、僕が本来やるべきだったUnit Testは終わりませんでした。
翌日のスタンドアップ。
僕は言いました。「昨日はMikeのサポートをしていたので、Unit Testは終わっていません」
スクラムマスターは軽く頷きましたが、その目は笑っていませんでした。
そしてMikeは言いました。「昨日はありがとう! おかげで助かったよ。あ、そういえば、別の箇所でも似たような問題があってさ……」
分かりますか? この瞬間に何が起きたか。
僕は、公式には「Unit Testを終わらせられなかったエンジニア」として記録され、非公式には「Mikeの専属デバッグ係」という**Shadow Project(影のプロジェクト)**にアサインされたのです。
誰も僕にそれを命じてはいません。僕が自分で、その「見えない要求」を引き受けてしまったのです。
海外のエンジニアリング文化は、確かに「個」を尊重します。
しかし、それは「自分の身は自分で守れ」ということの裏返しでもあります。
「Helpful(協力的)」であることは高く評価されますが、それは「自分のコアタスクを完璧にこなした上でのプラスアルファ」としてのみ機能します。
自分のタスクを犠牲にして他者を助ける行為は、日本なら「自己犠牲の美徳」として評価されるかもしれませんが、ここでは「タイムマネジメントができない人」、最悪の場合「優先順位がつけられない無能」と見なされかねません。
これが「Hidden Demands」の恐ろしさです。
それは、善意やプロ意識の隙間に忍び込んできます。
「チームのために」
「技術的負債を放置したくないから」
「英語がネイティブじゃない分、コードで貢献したいから」
そんな僕たちの健気な思いが、いつの間にか「都合の良いリソース」として消費されていく。
特にWPFのような、少しニッチで専門性が高い技術を持っていると、この傾向は顕著になります。
「UIのことは全部彼に聞けばいい」という暗黙の了解(Default Task)が出来上がり、本来ならUI/UXデザイナーが考えるべき仕様の決定や、バックエンドエンジニアが解決すべきデータの整形まで、「画面に出ないんだけど、どうなってるの?」の一言で、すべてこちらの責任として降ってくる。
僕は最初の数ヶ月、この「見えないタスク」と真正面から戦い、そして敗北しました。
毎晩遅くまで残り、Mikeのコードを直し、デザイナーの気まぐれな変更要望をXAMLに落とし込み、それでも自分のチケットが進んでいないことに焦燥感を募らせる日々。
「なんでこんなに働いているのに、スプリントレビューでの僕の成果発表はこんなに薄っぺらいんだろう?」
そう悩んでいたある日、シニアアーキテクトのDaveとランチに行った時に言われた一言が、僕の目を開かせました。
「お前は優秀なコーダーだけど、”No”の使い方が下手なデザイナーみたいだな。自分の庭を守れない奴に、城(アーキテクチャ)は守れないぞ」
ハッとしました。
僕は、C#のコードを書くことにはプロフェッショナルでしたが、自分の「仕事のスコープ」を定義(Define)し、インターフェースを設計することに関しては、全くのアマチュアだったのです。
海外で働くということは、単に英語でコードを書くことではありません。
自分のリソースというクラスライブラリに対して、適切なアクセス修飾子(public, private, protected)を設定し、外部からの不当な呼び出しには例外を投げ、正規の手続き(チケット化)を要求する──そんな「自分自身の設計」が求められるのです。
このブログシリーズでは、僕が血と汗と、数え切れないほどのStackOverflowException(比喩です)を経て学んだ、海外エンジニアとしての「Hidden Demands」への対処法を共有したいと思います。
これからお話しするのは、以下の3つの「隠された要求」の正体とその攻略法です。
- Identifying the “default” tasks(デフォルトタスクの特定):スタンドアップがいつの間にかミニプロジェクト化する現象や、「ちょっと質問」が「一日仕事」に化けるメカニズム。
- The collaboration conundrum(コラボレーションの謎):「手伝うこと」がいつの間にか「フルタイムの無報酬労働」にすり替わる恐怖。
- Shadow projects(影のプロジェクト):誰も明示的に割り当てていないのに、なぜかあなたの責任になっている「技術的負債」や「雑務」のメンテナンス。
これらを知っているかどうかで、あなたの海外エンジニアライフは「天国」にも「地獄」にもなります。
これを知ることは、単にサボるためではありません。
あなたが本当にやりたい設計や開発に集中し、正当な評価を勝ち取り、そして何より、週末を心から楽しむための「人生術」です。
C#で非同期処理を書くとき、awaitを使ってタスクの完了を待ち合わせ、メインスレッドをブロックしないようにしますよね?
仕事も同じです。見えないタスクにメインスレッド(あなたの人生とキャリア)をブロックさせてはいけません。
さあ、エディタの準備はいいですか?
まずは、この「見えない要求」たちがどのように日常に潜んでいるのか、その具体的なコード……ではなく、具体的なエピソードを、次の章で詳しくデバッグしていくことにしましょう。
これを読み終わる頃には、あなたはオフィスの空気を読むのではなく、オフィスの「隠しパラメータ」を読めるようになっているはずです。
善良なエンジニアを食いつぶす「協力の罠」と「スタンドアップの魔物」
前回の記事で、僕は海外就職の理想と現実、そしてそこに潜む「Hidden Demands(隠された要求)」という概念についてお話ししました。
今回は、その正体をもっと高解像度で見ていきましょう。
これは、ある種のホラー映画です。ゾンビはいませんが、あなたの可処分時間を食らい尽くす「善意の顔をしたモンスター」たちが登場します。
皆さんのSlackやTeamsの通知音は、どんな音ですか?
僕の場合、あの「ポコン」という音が鳴るたびに、背筋が少し凍る時期がありました。
それは単なるメッセージではありません。あなたの計画していた完璧なコーディングタイムを破壊しにくる、トロイの木馬の到着合図かもしれないからです。
1. 「デフォルトタスク」の呪縛:スタンドアップがミニプロジェクトに化ける時
アジャイル開発を採用している多くの海外企業では、毎朝のデイリースクラム(スタンドアップ)が日課です。
教科書通りなら、「昨日やったこと」「今日やること」「ブロッカー(障害)」を1人1分で話して終わり。15分で解散。
最高ですよね。効率的で。
しかし、現実は違いました。
特に、英語が非ネイティブで、かつ特定の技術(僕の場合はWPF/XAML)に詳しいエンジニアにとって、この場は「公開タスク押し付け会場」になり得ます。
ある日のことです。
同僚のジュニアエンジニア、Alexが報告します。
「UIのボタン配置を変更しようとしたんですが、Gridの定義が複雑すぎて、思ったところに配置できないんです。これが今日のブロッカーです」
ここで、スクラムマスター(あるいはPM)が僕の方を見ます。
「Hey、君はXAMLのウィザード(魔術師)だろ? このミーティングの後、ちょっとAlexを見てあげてくれないか? “Take it offline”(ミーティング外でやってくれ)ってことで」
出ました、魔法の言葉 “Take it offline”。
直訳すれば「この場の議論を終わらせて、あとで当事者同士で話す」という意味ですが、この文脈では「君が責任を持って彼の問題を解決しろ」という業務命令に変換されます。
僕は「OK」と言います。断る理由もありませんし、チームワークですから。
しかし、いざAlexの席に行ってみると、問題は「Gridの定義」ではありませんでした。
スタイルテンプレートが幾重にも継承され、トリガーが競合し、動的に生成されるコントロールがVisual Treeを汚染している、まさに「XAMLの闇」そのものでした。
これを解決するには、構造を理解し、リファクタリングを含めた修正が必要です。
所要時間、最低3時間。
これが “Identifying the ‘default’ tasks”(デフォルトタスクの特定) という罠です。
「XAMLの問題=僕の担当」という暗黙のデフォルト設定がチーム内に出来上がってしまっている。
チケットにはなっていません。「Alexのタスクのサポート」という曖昧な名目で、僕の午前中は消滅します。
そして恐ろしいことに、Alexは翌日のスタンドアップでこう言います。
「昨日はGridの問題が解決しました! 今日は次の機能を実装します」
僕の名前が出ることは稀です。だって、それは「彼のタスク」だったのですから。
スタンドアップが「報告の場」から、「その場で解決策が出ない問題を、特定の『できる人』に丸投げする場」に変質した瞬間、それはミニプロジェクトの強制発注会へと変わるのです。
2. “Quick Question” は決してクイックではない
次に紹介するのは、Slackで飛んでくる “Quick Question”(ちょっと質問いい?) です。
これこそが、現代のオフィスにおける最大の「時間泥棒」です。
エンジニア同士の会話において、本当に「Quick(迅速)」な質問なんて存在しません。
「APIのエンドポイントどこだっけ?」くらいならQuickです。
しかし、彼らが聞いてくるのは大抵こうです。
「非同期でデータをロードしてるんだけど、UIがフリーズするんだ。なんで?」
「ObservableCollectionを更新したのに、画面に反映されないんだけど?」
C#エンジニアの皆さんならお分かりでしょう。
これらは、Yes/Noで答えられる質問ではありません。
UIスレッドのブロッキング? Dispatcherの使い方が間違ってる? それともINotifyPropertyChangedの実装漏れ?
原因を特定するには、コンテキスト(文脈)の共有、コードの精査、そして再現確認が必要です。
しかし、質問者は「Quick」だと思っています。
「君ならすぐ分かるでしょ?」という期待値で投げてきます。
ここで「調べてみるよ」と安請け合いすると、どうなるか。
あなたは自分のIDE(統合開発環境)から意識を切り離し、他人のコードという迷宮に潜ることになります。
プログラミングにおいて、この「コンテキストスイッチ」のコストは甚大です。一度途切れた集中力を元のレベルに戻すには、平均して20分以上かかると言われています。
1日に3回、”Quick Question” に対応したとしましょう。
それぞれの対応時間が30分だとしても、前後のコンテキストスイッチを含めれば、あなたは実質3時間近くを失っていることになります。
そして残酷なことに、誰もその3時間をあなたの「労働」としてカウントしてくれません。
なぜなら、それは「ちょっとした質問」だったはずだからです。
3. コラボレーションの謎:手伝うほどに評価が下がるパラドックス
これが、”The collaboration conundrum”(コラボレーションの謎) の核心です。
「Helping out(手助け)」が、いつの間にかクレジット(功績)のないフルタイムジョブになってしまう現象です。
以前、同僚のバックエンドエンジニアがWPF側のデータバインディングで苦戦していた時、僕は彼につきっきりでアーキテクチャの改善を手伝いました。
僕は思いました。
「これでチームのベロシティ(開発速度)が上がった。僕の貢献は大きいはずだ」と。
しかし、半期ごとのPerformance Review(評価面談)で、マネージャーから言われた言葉は衝撃的でした。
「君の技術力は素晴らしいし、チームメイトからの評判もいい。とてもHelpfulだそうだ。でも、君自身の担当していたフィーチャー(機能)の実装スピードは、期待値より少し遅かったね。 次の期は、もっと自分のタスクにフォーカスしてほしい」
耳を疑いました。
チーム全体の進捗のために動いていたのに?
あのバックエンドエンジニアの機能がリリースできたのは、僕がデータバインディング層を整備したからなのに?
ここで気づいたのです。
海外の評価主義、特にジョブ型雇用に近い環境では、「あなたの成果」として定量化できるもの以外は、基本的にノイズであるという側面に。
「手伝った」という事実は、360度評価などで「いい人ですね」という定性的なコメントにはなりますが、昇進や昇給を決める「Deliverables(成果物)」の欄には書かれないのです。
一方で、手伝ってもらった同僚は、「困難な課題を解決し、機能をリリースした」という実績を手にします。
僕が書いたコードのおかげで。
これが、コラボレーションのパラドックスです。
善意で動けば動くほど、あなたは「自分のタスクを進められない人」になり、相手は「成果を出す人」になる。
まるで、自分のHPを削って相手を回復させるヒーラーのようですが、このゲームではヒーラーの貢献度はDPS(アタッカー)ほど評価されないのです。
4. 誰にも知られない「影のプロジェクト」と技術的負債
最後に、”Shadow projects”(影のプロジェクト) について触れておきましょう。
これは、誰も明示的に割り当てていないけれど、誰かがやらないとシステムが崩壊するタスクのことです。
例えば、WPFプロジェクトにおける ResourceDictionary の肥大化。
何年も使い回されたプロジェクトでは、誰も使っていないスタイル定義や、重複したカラーパレットが山のように積み重なっています。
ビルド時間は徐々に長くなり、XAMLデザイナーのプレビューは重くなる一方です。
気になりますよね? エンジニアなら。
「いつか誰かが整理しないと」
そう思って、僕は自分のタスクの合間を縫って、これらを整理する作業を始めました。
MergedDictionaries を整理し、共通コンポーネントを切り出し、見通しを良くする。
地味ですが、確実な品質向上です。
しかし、これは「公式のプロジェクト」ではありません。JIRAのチケットもありません。
僕が勝手にやっていることです。
上司から見れば、僕は「画面に向かって何か難しそうなことをしているが、新しい機能は増えていない時間」を過ごしていることになります。
ある日、機能追加の納期が迫っている中で、僕はこの「影のプロジェクト」であるリファクタリング作業にハマってしまい、本来のタスクの進捗を遅らせてしまいました。
上司は言いました。
「なぜ遅れているんだ? 難易度は高くないはずだろう?」
僕は説明しました。「いや、共通スタイルの競合を解消していて……」
上司の反応は冷ややかでした。
「誰がそれを頼んだ? 今必要なのは、動く機能だ。綺麗なコードじゃない」
心臓がえぐられるような思いでした。
技術的負債の返済。それはエンジニアにとっての正義です。
しかし、ビジネスサイドから見れば、それは「許可なき寄り道」でしかない場合があるのです。
公式な責任としてアサインされていない仕事を、勝手な責任感で背負い込むこと。
これが「Shadow Project」の罠です。
成功しても「当たり前(あるいは気づかれない)」、失敗すれば「自己管理能力の欠如」とみなされる、ハイリスク・ノーリターンの賭けなのです。
次章への引き:では、どうすればいいのか?
ここまで読んで、「じゃあ海外で働くなんて最悪じゃないか」「冷徹なマシーンになれと言うのか」と思ったかもしれません。
違います。
僕が言いたいのは、「善意を捨てるな」ということではありません。
「善意の使い所を戦略的に設計せよ」 ということです。
ここまでは、僕たちが陥りがちな「バグだらけの働き方」のログ解析でした。
問題の原因(Root Cause)は、文化の違いや言語の壁ではなく、もっと根本的な「契約」と「期待値コントロール」のバグにあります。
次回の「転」では、いよいよこの状況をひっくり返すための具体的なソリューションに入ります。
文化の壁だと思っていたものが、実は「責任の所在」のあやふやさであったこと。
そして、Job Descriptionという仕様書を逆手に取り、自分の身を守りながら、正当な評価を勝ち取るための「エンジニアリング的処世術」についてお話しします。
準備はいいですか?
次は、デバッガをアタッチして、実行時に変数を書き換えるような、ちょっとしたハックの時間です。
文化の壁ではない、「責任の所在」のバグを見つけろ
前回まで、僕は海外のオフィスに潜む「Hidden Demands(隠された要求)」という名のモンスターたち──終わらないスタンドアップ、偽りのQuick Question、評価されない影の仕事──について、恨み節(笑)も交えてお話ししました。
「やっぱり海外はドライだなんて嘘じゃないか」
「日本より政治的で面倒くさいな」
そう感じたかもしれません。
かつての僕もそうでした。「自分の英語力が足りないから断れないんだ」「これは文化の違いだから、郷に入っては郷に従えで我慢するしかない」と、自分を納得させようとしていました。
しかし、ある日、システムアーキテクチャを見直している時にふと気づいたのです。
僕たちが苦しんでいるこの現象は、「文化の壁」でもなければ、「英語力の問題」でもない。
これは、もっと根本的な**「責任の所在(Ownership)」に関するバグ**であり、僕たち日本人が無意識にインストールしている「OSの設定ミス」が引き起こしているエラーなのだと。
今回は、視点をガラリと変えてみましょう。
なぜ、あの同僚たちは平気で仕事を押し付けてくるのか?
そして、なぜ僕たちはそれを受け入れてしまうのか?
そのメカニズムを解明します。
1. 「Job Description」の空白地帯(Vacuum)を埋める力学
まず、海外就職において誰もが目にする「Job Description(職務記述書)」。
僕たちはこれを、「自分のやるべき仕事の範囲が書かれた契約書」だと思っています。
「ここに書かれていること以外はやらなくていい」と。
これが最初の勘違いです。
欧米のビジネス環境において、JDは「最低限の動作要件」に過ぎません。そしてもっと重要なのは、「JDに書かれていない領域(グレーゾーン)」の扱い方です。
物理学に「自然は真空を嫌う(Nature abhors a vacuum)」という言葉がありますよね。
海外のオフィス環境も同じです。
「誰の仕事でもないタスク」という真空地帯が発生した時、そこには強烈な吸引力が生まれます。
そして、その真空を誰が埋めるのか?
日本では「気が利く人」「空気を読める人」が埋めます。それが美徳だからです。
しかし、こちらでは違います。
**「境界線(Boundary)の定義が甘い人」**が吸い込まれるのです。
同僚のMikeが僕に雑な仕事を振ってくるのは、彼が意地悪だからではありません。
彼にとって、自分のタスクを処理するために使えるリソースはすべて使うのが「最適解」だからです。
彼がボール(タスク)を投げた時、僕が打ち返さずにキャッチしてしまった。
その瞬間、彼の脳内で僕というオブジェクトの定義が書き換わります。
IsAvailable = true;
RejectionPolicy = null;
つまり、僕が苦しんでいたのは、彼らの強引さのせいではなく、僕自身が**「自分のインターフェースを public 全開にしていたから」**なのです。
認証もなしに、誰でもアクセスできるAPIを公開していれば、DDoS攻撃のようにリクエストが殺到するのは当たり前です。
これは攻撃側の問題ではなく、設計側のセキュリティホールです。
2. 「Nice」は褒め言葉ではない、生存本能の欠如だ
ここで、私たち日本人が陥りやすい致命的な「翻訳ミス」についてお話しします。
同僚から言われる “You are so nice!” という言葉。
これを「あなたは親切で素晴らしい人だ」と受け取っていませんか?
職場において、特にエンジニアリングの現場において、単なる “Nice” は時に「危険信号」です。
ここでの “Nice” は、「都合がいい(Agreeable)」「対立を避ける(Non-confrontational)」というニュアンスを含んでいることが多々あります。
僕があるプロジェクトで、仕様の矛盾を指摘せずに、言われた通りの(しかし破綻している)UIを実装した時、PMは「Thanks, you are so nice to work with.」と言いました。
しかし、後でそのUIが問題になった時、責任を問われたのはPMではなく、実装した僕でした。
「なぜ、専門家として『それは動かない』と警告しなかったんだ?」と。
海外のプロフェッショナルな現場で求められるのは、”Nice”(いい人)ではなく、”Competent”(有能) であり “Trustworthy”(信頼できる) 存在です。
「信頼できる」とは、何でもイエスと言うことではありません。
「できないことはできないと言う」「リスクがあるなら、嫌われても警告する」ことです。
僕たちは「断ると嫌われる」「和を乱す」と恐れます。
しかし、こちらのエンジニアたちは、激しく議論し、断固として「No」を突きつけた直後に、一緒にランチに行って笑い合います。
彼らにとって、仕事上の拒絶は人格攻撃ではありません。
「ビジネスというトランザクション(取引)」の条件交渉に過ぎないのです。
3. “Me Inc.”(自分株式会社)というマインドセット
では、どうすればこの状況を変えられるのか?
答えは、マインドセットを「従業員(Employee)」から**「個人事業主(Contractor)」**へと転換することにあります。
たとえ正社員であっても、です。
アメリカのエンジニアたちの多くは、無意識に「Me Inc.(自分株式会社)」という感覚を持っています。
会社はクライアントであり、上司は発注元。そして同僚は、時にはパートナーであり、時には競合他社です。
もしあなたがフリーランスのコンサルタントだとして、契約に含まれていない作業を依頼されたらどうしますか?
「それは追加料金が発生します」と言うか、「現在の契約範囲外です」と断りますよね。
あるいは、「それをやると、メインの納品物が遅れますが、それでも優先しますか?」と交渉しますよね。
これが「起」と「承」で僕に欠けていた視点です。
僕は「給料をもらっているんだから、会社のために何でもやらなきゃ」という、滅私奉公の精神で働いていました。
だから、”Quick Question” という名の無償サービス要求に、タダで応えてしまっていたのです。
「転」のポイントはここです。
自分を「リソース」として管理する権限(Ownership)を取り戻すこと。
C#で言えば、外部からのアクセスに対して安易にフィールドを公開するのではなく、プロパティ(Property)を通してアクセスさせ、set アクセサの中でバリデーションロジックを走らせるようなものです。
- Before:C#public bool IsBusy; // 外部から勝手に書き換え可能誰かが勝手に
falseだと判断してタスクをねじ込んでくる。 - After:C#private bool _isBusy;
public bool RequestTime(Task task)
{
if (CalculatePriority(task) < CurrentPriority)
{
throw new CapacityExceededException(“Currently focused on critical path.”);
}
return true;
}リクエストは受け付けるが、内部ロジック(自分の優先順位)に基づいて、却下する権限を実装する。
4. 英語力のせいにするのをやめよう
最後に、多くの日本人エンジニアが逃げ道にしてしまう「英語力」について。
「英語が流暢じゃないから、うまく交渉できない」
これは半分嘘です。
流暢である必要はありません。論理的であればいいのです。
むしろ、流暢な英語で愛想笑いを浮かべながら “I’ll try my best…”(善処します)と言うほうが、よっぽど危険です。それは相手に「Yes」と誤認させるからです。
必要なのは、Fancyな言い回しではなく、明確な “Variable Definition”(変数の定義) です。
- 「今、僕の手持ちのリソースは100%埋まっている」
- 「君のタスクを受けるなら、僕のタスクAかBをドロップする必要がある」
- 「決定権は君にはない。PMに優先順位を変更させろ」
これらを伝えるのに、高度な文法はいりません。
中学校レベルの英語で十分です。
問題なのは、英語が出てこないことではなく、「断るロジック」が自分の中で構築できていないことなのです。
かつての僕は、オフィスの片隅で「察してくれ」と願うだけの、バグったNPC(ノンプレイヤーキャラクター)でした。
しかし、この「構造」に気づいてからは、僕はプレイヤーとしての意思を持ち始めました。
文化の違いなんて、所詮はスキンの違いです。
ゲームのルール(ビジネスの論理)は、日本も海外も、実は驚くほどシンプルで共通しています。
それは、「価値(Value)を提供した者が勝つ」、そして**「自分の価値を安売りした者は、安く扱われる」**というルールです。
さて、原因(バグの原因)は特定できました。
「自分自身のAPI設計ミス」と「契約概念の欠如」です。
あとは、パッチを当てるだけです。
次回の最終章「結」では、明日から使える具体的なパッチ──つまり、角を立てずに「No」と言い、自分のタスクを可視化し、かつ「あいつは頼りになる」という評価を勝ち取るための、実践的な “Negotiation & Documentation Protocols” をお渡しします。
コードを書くように、人間関係とタスクを設計する技術。
これを身につければ、あなたはもう「便利なアジア人エンジニア」ではなく、「尊敬されるプロフェッショナル」として、このコンクリートジャングルを歩けるようになります。
コードを書くように「期待値」を設計せよ──明日から使える交渉と防衛のライフハック
長いデバッグの旅も、これで終わりです。
僕たちは、海外就職の光と影を見つめ、「見えないタスク」に翻弄される原因が自分自身の「インターフェース設計の甘さ」にあることを突き止めました。
最終回となる今回は、抽象的な精神論は一切なしです。
明日、オフィスに行って(あるいはZoomを繋いで)、具体的に何をすればいいのか。
同僚のMikeが「Quick Question」と近づいてきた時、どう返せばいいのか。
その具体的な「実装コード(行動指針)」を皆さんにシェアします。
これは、僕が数々の失敗を経て構築した、海外エンジニアとして生き残るための “Survival Framework 1.0” です。
1. 「No」ではなく「Conditional Yes」を実装する
日本人は「No」と言うのが苦手です。「断ると関係が悪くなる」と思うからです。
しかし、欧米のプロフェッショナルにとって、リソース不足による拒絶は正当なロジックです。
ここで使うべきデザインパターンは、”Conditional Yes”(条件付きのイエス) です。
同僚から無茶なタスク(例:今日中にアレやって)が飛んできた時。
いきなり return false; (無理です)と返してはいけません。これだと「協調性のない奴」という例外(Exception)が投げられます。
代わりに、トレードオフを相手に選ばせるロジックを実装します。
【実践フレーズ集】
- 状況: 自分のタスクで手一杯の時に、追加タスクを頼まれた。
- Bad: “Sorry, I’m busy right now.” (ごめん、今忙しいんだ。)
- これでは「いつなら空くの?」と食い下がられます。
- Good: “I’d love to help, but my current sprint capacity is 100% full with [Current Task]. If this is urgent, which task should I de-prioritize to fit this in?”
- (手伝いたいのは山々だけど、今のスプリント容量は[今のタスク]で100%埋まってるんだ。もしこれが緊急なら、これを入れるために、どのタスクの優先度を下げればいい?)
- Bad: “Sorry, I’m busy right now.” (ごめん、今忙しいんだ。)
解説:
これは「断って」いません。「やる意志はある」と見せつつ、「物理的に何かを捨てないと入らない」という事実(制約条件)を突きつけています。
決定権(責任)を相手(あるいは上司)に委譲するのです。
これを言われた相手は、あなたのタスクをドロップさせる責任を負うか、諦めるかの二択を迫られます。大抵の場合、「あー、じゃあ他の人に頼むよ」となります。
2. 「見えないタスク」を「見えるチケット」に変換する (Visibility Logger)
「影のプロジェクト」や「長引くサポート」が評価されない最大の理由は、それが “Unmanaged Resource”(管理外リソース) だからです。
ログに残らない処理は、システム上は「何もしていない」のと同じです。
明日から、作業を始める前に必ずチケットを作る(あるいは更新する)習慣をつけてください。
【具体的なアクション】
- 15分以上かかりそうな “Quick Question” が来たら:
- 「OK、見るよ。でもその前に、トラッキングのためにチケットを作ってくれない? 君のストーリーの下にサブタスクでいいから」と言う。
- もし相手が渋るなら、自分で自分のためのチケットを作ります。
- Title:
Technical Investigation: Support Mike regarding DataGrid binding issue - Description:
Analyzing the legacy code to fix the layout bug.
- Title:
- そして、毎日のスタンドアップで堂々と報告します。
- 「昨日は、Mikeのバインディング問題の調査(チケット番号123)に4時間使いました。その結果、原因を特定しました」
解説:
これをやることで、あなたの時間は「ボランティア」から「公式な業務」に昇格します。
スクラムマスターやマネージャーは、ベロシティが下がった原因が「あなたの能力不足」ではなく「突発的なサポート業務」にあることを可視化できます。
これは、Jiraなどのチケット管理システムを、単なるタスク管理ツールではなく、「自分の仕事の証拠保全ツール(Logging System)」 として使うという発想の転換です。
3. “Paper Trail”(証拠の道)を残す非同期通信プロトコル
海外の職場、特に多国籍な環境では、口頭での約束(Verbal agreement)は危険です。
「言った、言わない」の問題は、英語のニュアンスの違いも相まって、深刻なバグになります。
重要な仕様変更や、責任の所在に関わる会話をした後は、必ず “As per our conversation”(先ほどの会話の通り)メール を送る習慣をつけてください。
【テンプレート】
- Subject: Recap: Discussion regarding UI changes
- Body:Hi [Name],Just to summarize our quick chat earlier:
- We agreed to remove the animation to improve performance.
- You mentioned that this change does not require PM’s approval. (←ここが重要!責任の所在を明記)
解説:
これは、C#で言うところの Debug.Assert のようなものです。
前提条件が間違っていないか確認し、もし後で問題が起きた時に「君が承認不要だと言ったよね?」という証拠(Stack Trace)になります。
この「Paper Trail(文書の足跡)」を残すエンジニアは、プロとして強く信頼されます。自分を守る防御力が高いからです。
4. 戦略的無能 (Strategic Incompetence) とカプセル化
WPFや特定技術に詳しいと、チーム中のすべてのバグが集まってくる「便利屋(God Object)」になりがちです。
これを防ぐには、「カプセル化(Encapsulation)」 が必要です。
あなたの知識やスキルをすべて public にする必要はありません。
時には、あえて「知らない」「できない」ふりをする(戦略的無能) ことも、自分のコアタスクを守るためには必要です。
- 「そのエリアのレガシーコードは詳しくないんだ。ドキュメントもないし、迂闊に触ると壊すリスクがあるから、オリジナルの作者に聞いたほうがいい」
- 「UIのデザイン調整は僕の専門外だ。デザイナーの正式なモックアップがないと実装できない」
これは冷たいのではありません。
「中途半端に関わって責任を持てない仕事は引き受けない」 という、シニアエンジニアとしての品質保証(Quality Assurance)の態度です。
何でも引き受けるジュニアとは違う、という線を引くのです。
エピローグ:バグのないキャリアはない、でも制御はできる
さて、長々と書いてきましたが、最後に一つだけ。
海外で働くということは、毎日が「仕様変更」の連続です。
理不尽なこともあれば、孤独を感じることもあります。
でも、そのカオスな環境の中で、自分の足で立ち、自分の言葉で交渉し、自分のコードで価値を生み出す経験は、日本では絶対に得られない強烈な成長をあなたにもたらします。
今回紹介した「Hidden Demands」への対処法は、あくまで防御のための武器です。
でも、本当に大切なのは、あなたが 「なぜ海外に来たのか」 というコアロジックです。
素晴らしい技術(C#)で、世界中のユーザーを喜ばせたい。
多様な文化の中で、自分の視野を広げたい。
その純粋な情熱(Main Loop)を守るためにこそ、今日お話しした「例外処理(Exception Handling)」を実装してください。
同僚のMikeは、実は悪いやつじゃありません。
僕が「No」と言い始めてから、彼は僕を「何でも屋」ではなく「対等なプロフェッショナル」として扱うようになりました。
今では週末に一緒にビールを飲む仲です。もちろん、割り勘(Separate check)でね。
さあ、Visual Studioを開いてください。
でもその前に、自分の心の「Settings.cs」を開いて、EnableSelfSacrifice(自己犠牲モード)を false に書き換えるのを忘れずに。
Build Succeeded.
あなたの海外エンジニアライフが、バグフリーで、最高にエキサイティングなものになりますように。
それでは、またどこかの国のオフィスで会いましょう!

コメント