孤独な狼の幻想:なぜ「技術力」だけでは海外で詰むのか?
やあ、みんな。今日もVisual Studioと睨めっこしてるかな?
今、僕はオフィスの窓から見える曇り空を眺めながら、少し苦いコーヒーを飲んでいるところだ。こっち(海外)のコーヒーは、なぜか日本のコンビニコーヒーよりも酸味が強くて、最初は苦手だったんだけど、今ではこの刺激がないと朝のスタンドアップミーティング(朝会)に臨めない体になってしまったよ。
さて、今日は少し真面目な、でもエンジニアとしてのキャリアを考える上で避けては通れない話をしようと思う。
テーマは**「Collaboration & Empathy(協力と共感)」**だ。
「おいおい、俺たちはエンジニアだぞ? 道徳の授業かよ」って思った?
わかる。すごくわかるよ。僕も数年前まではそうだった。「いいコードを書くこと」こそが正義であり、バグのない美しいアーキテクチャを構築することこそが、エンジニアの価値だと思っていたからね。
特に僕らが扱っている C# や WPF (Windows Presentation Foundation) なんていう技術スタックは、非常に堅牢で、MVVMパターンに則ってきっちり設計すれば、パズルのピースがハマるように美しいアプリケーションが作れる。データバインディングがバシッと決まり、XAMLとViewModelが疎結合に保たれているあの快感。あれを知ってしまうと、エンジニアリングの世界に没頭したくなるのも無理はない。
でもね、あえて言わせてもらう。
もし君が「海外で働きたい」とか「もっと大きなプロジェクトで活躍したい」と思っているなら、その「職人気質」だけだと、間違いなく詰む。
これは脅しでもなんでもなく、僕自身が海外に来て最初に食らった、強烈な「洗礼」の実話に基づいているんだ。
「凄腕の一匹狼」が英雄になれない場所
日本にいた頃の僕は、いわゆる「手なれたシニアエンジニア」だった。
仕様書が降りてくれば、誰とも口をきかずに黙々と実装し、想定以上のスピードで納品する。周りからは「あいつに任せておけば大丈夫」と言われ、自分でもそれを誇りに思っていた。「コミュニケーションコストを最小限に抑え、コードで語る」のがカッコいいエンジニアの姿だと信じて疑わなかったんだ。
その自信を胸に、意気揚々と海外のテック企業に転職した。
最初のプロジェクトは、大規模な在庫管理システムのクライアントアプリのリプレース案件。WPFのパフォーマンスチューニングが必要な、まさに僕の得意分野だった。
「よし、見てろよ。ジャパニーズ・エンジニアの技術力を見せつけてやる」
僕は初日からフルスロットルで飛ばした。
既存のスパゲッティコードを解析し、ボトルネックになっている描画処理を特定。誰にも相談せず、週末を使って複雑なカスタムコントロールを書き直し、非同期処理を導入してUIのフリーズを解消した。
月曜日の朝、僕はドヤ顔でプルリクエスト(PR)を出したんだ。
変更行数は数千行。機能的には完璧。パフォーマンスは30%向上。
「これでチームのヒーロー間違いなしだ」
そう思った数時間後、僕のデスクにやってきたのは、称賛の嵐ではなく、険しい顔をしたチームリードのデイビッド(仮名)と、困惑した表情のプロダクトマネージャーだった。
デイビッドは僕のPRを指さしてこう言った。
「このコードは素晴らしい。でも、このPRはリジェクト(却下)だ」
僕は耳を疑った。「え? なぜ? パフォーマンスは上がってるし、バグもないですよ?」
彼はため息をつきながら言った。
「君はこの週末、誰かとこの変更について話したか? デザイナーはこのUIの挙動変更に合意しているのか? テストチームはこの大規模な変更に対するリグレッションテストの工数を確保できているのか? そして何より、君以外の誰がこの複雑なコードをメンテナンスできるんだ?」
頭をハンマーで殴られたような衝撃だった。
「正解」は一つじゃない:コンテキストという名の怪物
日本での開発、特にSIer的な環境や、決まった仕様通りに作る現場では、「動くこと」「高品質であること」が絶対的な正解だったかもしれない。でも、海外の、特にアジャイルで回しているチーム開発においては、「正しさ」の定義が全く違うんだ。
海外のチームは驚くほど多様だ。
僕のチームには、理論派のインド人エンジニア、UIの美しさに命をかけるフランス人デザイナー、ビジネス価値(ROI)しか見ていないアメリカ人のPM、そしてドキュメント嫌いのブラジル人テスターがいる。
彼らはそれぞれ異なる「正義」を持っている。
- エンジニアの正義: 技術的な負債がなく、効率的であること。
- デザイナーの正義: ユーザー体験が最高で、ブランドイメージに合致していること。
- ビジネスの正義: いかに早く市場に出し、顧客を満足させるか。
僕がやった「独断でのリファクタリング」は、エンジニアの正義としては100点だったかもしれない。でも、チーム全体としてはマイナスだったんだ。
なぜなら、その変更によってデザイナーが意図していたアニメーションの一部が削除されていたし、急激なコード変更はQAチームのスケジュールを崩壊させるリスクがあったからだ。
デイビッドは言った。
「We are not coding machines. We are problem solvers. And solving problems requires collaboration, not isolation.(我々はコーディングマシーンじゃない。問題解決者だ。そして問題解決には、孤立ではなく協力が必要なんだ)」
この言葉は、今でも僕の心に深く刻まれている。
海外の現場では、「Individual Contributor(個人の貢献者)」から「Team Player(チームプレイヤー)」へとマインドセットを切り替えない限り、どれだけ高度なC#の知識があっても、評価されないどころか「扱いにくい存在」として排除されてしまう。
技術的なサイロ化(Silo)の恐怖
もう少し技術的な話をしよう。
WPFやXAMLを使っていると、ViewとViewModelの分離にこだわるあまり、自分自身の思考まで「分離」してしまいがちだ。「俺はロジック担当、画面はデザイナーが勝手にやってくれ」みたいなね。
でも、本当に優れたアプリケーションというのは、デザインとロジック、そしてビジネス要件が密接に絡み合って生まれるものだ。
例えば、非同期でデータをロードしている最中の「Loading…」の表示ひとつとってもそうだ。
エンジニア的には「IsBusyプロパティをバインドして、Visibilityコンバーターで切り替えればいい」で終わり。
でも、ユーザー視点(デザイナー視点)では、「いきなりスピナーが出るのは不快だ。0.5秒以上かかるときだけフェードインさせたい」かもしれないし、ビジネス視点では「待機中にヒントテキストを表示して、離脱率を下げたい」かもしれない。
これらを実装するには、単に技術を知っているだけではダメなんだ。
デザイナーやPMの意図を汲み取り、「なぜそうしたいのか?」を**共感(Empathy)**を持って理解し、それを技術に落とし込む力が必要になる。
僕が冒したミスは、この「文脈(コンテキスト)の共有」をサボったことにある。
「技術的に正しいからいいだろう」という傲慢さが、チームの調和(ダイナミクス)を乱してしまったんだ。
共感エンジニアリング(Empathy Engineering)のすすめ
これから全4回を通して僕が伝えたいのは、技術を軽視しろということでは決してない。
むしろ、高い技術力があるからこそ、その力を最大限に発揮するために「人間力」が必要だということだ。
僕はこれを勝手に**「共感エンジニアリング(Empathy Engineering)」**と呼んでいる。
- 同僚への共感: 相手が何に困っているのか、なぜそのコードを書いたのかを理解する。
- 他職種への共感: デザイナーやPMが背負っているプレッシャーやゴールを理解する。
- ユーザーへの共感: 画面の向こうにいる人が、どんな気持ちでアプリを使うのかを想像する。
これらが揃ったとき、君の書くコードは単なる「命令文の羅列」から、「価値を生み出す資産」へと進化する。
海外に出て、英語でのコミュニケーションに苦労すると、どうしても「言葉が通じない分、コードで示さなきゃ」と殻に閉じこもりがちだ。僕もそうだった。
でも、逆なんだ。
言葉が不自由だからこそ、相手の表情を読み、意図を確認し、拙い英語でも「僕はこう思うけど、君はどう考える?」と問いかける姿勢が、強烈な信頼を生む。
「こいつは技術だけじゃなく、俺たちのことを理解しようとしている」
そう思われた瞬間、君は「外国人エンジニア」から「かけがえのないチームメイト」に変わる。
次回からは、具体的にどうやってそのポジションを築いていくのか、実践的なテクニックに入っていこうと思う。
衝突(コンフリクト)を恐れずに意見を戦わせる方法、多様な視点をプロダクトに取り入れる具体的なミーティング術、そして耳の痛いフィードバックを成長の糧にするマインドセットについて深掘りしていく。
C#の INotifyPropertyChanged は、プロパティの変更をUIに通知するためのインターフェースだよね。
僕らエンジニアも同じだ。自分の考えや状況を、周りに適切に Notify(通知)し、周りからの変更通知を正しく受け取る(Subscribe)必要がある。人間関係のバインディングエラーを起こさないためにね。
さあ、コーヒーも飲み干したことだし、そろそろ仕事に戻ろうか。
次回「承」パートでは、カオスなチーム開発の中でどうやって自分の立ち位置を確立するか、**「Navigating Team Dynamics(チーム力学の操縦法)」**について話そう。
楽しみにしていてくれ。それじゃ、また。
チームの力学をハックせよ:対立を恐れず「個」から「影響力あるプレイヤー」へ
海外で働き始めて半年が経った頃、僕は「ある壁」にぶつかっていた。
英語にも慣れ、デイビッド(前回登場したリードエンジニア)からの信頼も少しずつ回復し、タスクも順調にこなしていた。
でも、評価面談で言われた言葉が衝撃だった。
「君は優秀なコーダーだけど、チームへの『Impact(影響)』が足りないね」
またこれだ。
日本人の感覚からすると、「納期通りにバグのないコードを書いている」以上の貢献って何だよ? って思うよね。飲み会で幹事でもやれってことか?
違うんだ。彼らが求めているのは、**「チーム全体の出力を上げるための触媒」になることだった。
そしてそのために避けて通れないのが、「Conflict(衝突)」**だ。
1. 「沈黙は金」ではなく「沈黙は死」
日本の現場では、「空気を読む」ことが美徳とされることが多い。会議で異論があっても、後でこっそりリーダーに伝えたり、なんとなく場の雰囲気に合わせたりする。
「和」を尊ぶ精神、僕は好きだよ。
でも、こっちの多国籍チームでそれをやると、**「意見がない人(=貢献していない人)」とみなされるか、「合意したとみなされる(=共犯者)」**かのどちらかになる。
ある時、新しい機能の実装方針を決めるミーティングがあった。
バックエンド担当のエンジニアが、「今回は時間がないから、DBから直接データを引っこ抜くAPIを急造しよう」と提案した。
僕は心の中で叫んだ。(おいおい、それはアーキテクチャ違反だろ。後で保守地獄になるぞ……)
でも、僕は黙っていた。「まあ、彼がバックエンドの専門家だし、英語で反論して議論が長引くのも嫌だしな」と。
結果、その案が採用され、数ヶ月後に案の定、深刻なデータの不整合バグが発生した。
その時、PMが僕に言ったんだ。
「君はフロントエンドの実装時に、データの構造がおかしいことに気づいていたはずだ。なぜあの時、止めなかった?」
「いや、僕は心の中では反対で……」
なんて言い訳は、通用しない。
**「発言しなかった意見は、存在しないのと同じ」**なんだ。
そこから僕は自分にルールを課した。
「Disagree and Commit(反対して、コミットせよ)」。
これはAmazonのリーダーシップ原則としても有名だけど、エンジニアチームにおいてこそ重要だ。
「納得いかないけど黙って従う」じゃなく、「徹底的に議論し、懸念を伝え、決定したら全力で協力する」。
この「議論」のフェーズをサボってはいけない。
2. VSCodeの外で起きる「聖戦」:技術的対立の乗り越え方
とはいえ、議論や対立は怖い。英語なら尚更だ。
特にエンジニア同士の戦いは、しばしば宗教戦争(Religious War)に発展する。
「タブかスペースか」ならまだ可愛げがあるけど、「このWPFプロジェクトにPrism(フレームワーク)を入れるべきか否か」みたいな話になると、血を見ることもある。
僕の実体験を話そう。
ある画面のUIロジックを実装していた時、同僚のイタリア人エンジニア、マルコと意見が真っ二つに割れた。
- 僕の主張: 完全にMVVMパターン準拠でやるべき。コードビハインド(Viewの裏側のコード)には一行たりともロジックを書くべきではない。それが美学であり、テスト容易性のためだ。
- マルコの主張: いや、この機能は単純なアニメーション連動だ。わざわざViewModelを経由してMessengerを飛ばすのはオーバーエンジニアリングだ。コードビハインドに書けば5行で終わる。
二人のPR上のコメントバトルは、もはや戦争だった。
「君はメンテナンス性を無視している!」と僕が打てば、
「君は現実を見ていない! 納期は来週だぞ!」とマルコが返す。
雰囲気が最悪になった時、デイビッドが割って入って言った。
「Hey, guys. Stop typing. Go to the whiteboard.(おいお前ら、タイプするのをやめろ。ホワイトボードに行け)」
僕たちは会議室に連行された。
そこでデイビッドは、「どっちが正しいか」ではなく、**「それぞれのメリットとリスク」**を書き出させた。
- 僕の案のリスク: 実装コストが高い。新人が理解するのに時間がかかる。
- マルコの案のリスク: Viewとロジックが密結合になり、将来的にユニットテストが書けなくなる。
可視化して初めて、僕たちは冷静になれた。
そしてデイビッドはこう言った。
「今回はマルコの案で行こう。ただし、コードに TODO: Refactor to MVVM pattern when logical complexity increases とコメントを残すこと。これでどうだ?」
この経験で学んだのは、**「対立(コンフリクト)は、解決策を洗練させるためのプロセス」だということだ。
相手を打ち負かすためではなく、より良い着地点(この場合は「今のスピード」と「将来の負債の管理」のバランス)を見つけるために戦う。
これを「Constructive Conflict(建設的な対立)」**と呼ぶ。
これができるようになってから、僕は「面倒な奴」ではなく「クオリティの番人(ただし話せばわかる奴)」として信頼されるようになった。
3. 「Individual Contributor」から「Force Multiplier」へ
さて、タイトルにもある「個」から「影響力」への進化について。
英語では、優れたチームプレイヤーのことを**「Force Multiplier(戦力倍増装置)」**と呼んだりする。
自分一人が「10」の仕事をするんじゃなく、周りに働きかけてチーム全体を「100」にする人のことだ。
僕が意識的に変えた行動がいくつかある。
- 「俺のタスク」から「俺たちの機能」へ主語を変える自分の担当箇所以外のPRレビューを、誰よりも丁寧にやるようにした。「typoの指摘」みたいな細かいことじゃない。「この実装だと、将来Bの機能を追加するときに競合するかも?」といった、全体を見渡した視点でのコメントだ。C#のインターフェース設計なんかは特にそうだね。誰かが変なインターフェースを作ると、全員が不幸になるから。
- ドキュメントという名の「遺産」を残す海外のエンジニアは、人の入れ替わりが激しいこともあってか、口頭伝承を嫌う(あるいは直ぐ忘れる)。僕は、複雑な非同期処理や、WPFのBindingの落とし穴について、簡単な図解付きのWikiを残すようにした。すると、「この仕様どうなってるの?」という質問が出た時、誰かが「あ、それならKentaのWikiを見ればわかるよ」と言ってくれるようになった。僕が寝ている間(時差があるメンバーもいるからね)に、僕のドキュメントが誰かを助けている。これが「影響力」だ。
- 「弱さ」を見せる勇気これが一番難しかったかもしれない。「わからない」と言うこと。「助けてくれ」と言うこと。以前の僕は、プロとしてそれを言うのは恥だと思っていた。でも、ある日、どうしても解決できないメモリリークにハマって、降参してチャットに投げたんだ。「ごめん、もう3日悩んでるけど原因がわからない。誰か知恵を貸してくれないか?」すると、普段あまり話さない静かな同僚が、「ああ、それ、WPFのBitmapImageのキャッシュ仕様だよ。僕も前に踏んだ」と、3分で解決策をくれた。そして、「Kentaでもハマるんだな」と笑われたことで、チームとの距離がグッと縮まった気がした。**心理的安全性(Psychological Safety)**とは、ヌルい環境のことじゃない。「失敗や無知をさらけ出しても、攻撃されない」という安心感のことだ。それを作るのは、リーダーだけじゃなく、僕ら一人ひとりの「弱さを見せる勇気」なんだ。
4. 次のステージ:視点のダイバーシティ
こうして僕は、チームの中での立ち位置を確立していった。
「技術的に頼れる」だけでなく、「議論ができる」、そして「チーム全体の成功を考えて動く」エンジニアとして。
対立を恐れずに意見を言うこと。
自分のコードへの執着(エゴ)を捨て、チームにとっての最適解を探すこと。
そして、周りを助け、周りに助けを求めること。
これらはC#の教科書には載っていないけれど、async/await の使い方を覚えるより100倍、海外での生存率を上げてくれるスキルだ。
チーム内のエンジニア同士の関係はこれでうまく回り始めた。
だが、開発現場にはもっと手強い「異文化」が存在する。
そう、**「デザイナー」や「ビジネスサイド(PM/営業)」**といった、全く異なる言語を話す人たちだ。
彼らとの連携こそが、良いプロダクトを作るための最終関門であり、最もエキサイティングな部分でもある。
次回「転」では、**「The Power of Perspective(視点の多重奏)」**と題して、職種の壁を越えて「共通言語」を作り出す方法について話そうと思う。
デザイナーが言う「ふわっとした要望」をどうやってXAMLに落とし込むか、ビジネスサイドの無茶振りをどう技術的負債なしで叶えるか。
その辺りの実践的なテクニックを紹介するよ。
視点の多重奏:デザイナー・ビジネス・開発の「共通言語」を見つける技術
エンジニア同士の喧嘩なんて、今思えば可愛いものだった。
なぜなら、僕らは少なくとも「C#」や「Git」や「データベース」という共通の基盤の上で殴り合っていたからだ。
しかし、プロジェクトが進むにつれ、僕は本当の「バベルの塔」に直面することになる。
それは、**「エンジニア vs デザイナー」の仁義なき戦いであり、「エンジニア vs ビジネスサイド」**の終わらない攻防戦だ。
彼らは、僕らとは全く違うレンズで世界を見ている。
- デザイナーのレンズ: 美しさ、感情、体験、ブランド。
- ビジネスのレンズ: 売上、期限、市場シェア、競合優位性。
- 僕ら(エンジニア)のレンズ: 実装可能性、パフォーマンス、保守性、堅牢性。
この3つのレンズが重なり合わない時、プロジェクトは地獄と化す。
そして残念なことに、多くの現場でエンジニアは「No」と言うだけの「ドリーム・キラー(夢を壊す人)」になってしまいがちだ。
1. デザイナーとの死闘:Figmaの「1ピクセル」は、XAMLの「100行」
ある日、デザイナーのソフィアが満面の笑みでFigmaのデザインカンプを持ってきた。
「ねえケンタ! 新しいダッシュボードのデザインができたわ。ユーザーの感情に寄り添う、オーガニックな動きを入れたいの!」
画面を見て、僕は凍りついた。
そこには、半透明のすりガラス(アクリル)効果が幾重にも重なり、リストをスクロールすると要素が3D回転しながらフェードインし、背景のグラフがリアルタイムでモーフィング変形する……そんなSF映画のようなUIが描かれていた。
僕の脳内で、WPFのレンダリングパイプラインが悲鳴を上げた。
(おいおい、WPFでこの半透明の重ね掛けは描画負荷が高すぎる。それにこの変形アニメーション、RenderTransformだけじゃ無理だ。下手したらDirectXを直接叩くことになるぞ……)
かつての「一匹狼」時代の僕なら、即答でこう言っていただろう。
「That’s impossible.(無理です)」
あるいは、
「WPFの仕様上、パフォーマンスが出ないので実装できません」
これはエンジニアとしては事実だ。正論だ。
でも、これを言った瞬間、ソフィアとの間に「壁」ができる。「ああ、エンジニアはまた技術的な言い訳をして、私のデザインを台無しにする」と。
僕は深呼吸をして、コーヒーを一口飲み、前回学んだ「共感」スイッチを入れた。
否定から入るのではなく、まず「視点」を合わせることにしたんだ。
「ソフィア、すごくクールなデザインだね。特にこの動きは目を引く。……ところで、なぜここで要素を3D回転させたいと思ったの? ユーザーに何を伝えたいの?」
彼女は答えた。
「これは、過去のデータから未来の予測データに切り替わる瞬間なの。だから、次元が変わるような演出で、ユーザーに『ここからは予測値ですよ』って直感的に伝えたくて」
なるほど。**「3D回転させたい(How)」のではなく、「モードの切り替えを直感的に伝えたい(Why)」**のが本質だったんだ。
僕は提案した。
「3D回転はWPFだと描画がカクつくリスクが高くて、かえってユーザー体験を損なうかもしれない。代わりに、背景色を滑らかに変化させつつ、要素がスライドして入れ替わるようなアニメーションはどうかな? それなら60fpsでヌルヌル動くし、実装コストも半分で済むから、その分ほかの調整に時間を使えるよ」
彼女は少し考えて、「……ヌルヌル動くなら、そっちの方がいいかも!」と言ってくれた。
これが**「視点の翻訳」**だ。
デザイナーの「やりたいこと(How)」をそのまま受け取るのではなく、「意図(Why)」を汲み取り、それを技術的に最適な「別のHow」に変換して提案する。
これこそが、UIエンジニアの腕の見せ所なんだ。
2. ビジネスサイドとの攻防:その機能は誰のため?
次に立ちはだかるのが、プロダクトマネージャー(PM)や営業だ。
彼らはしばしば、「競合の〇〇社がこの機能を出したから、うちも来月までに入れてくれ!」といった無茶振りをしてくる。
ある時、PMのマイケルが飛んできた。
「ケンタ、顧客から『Excelみたいに自由に列を入れ替えたり、計算式を入れたりできるグリッドが欲しい』って要望が来てる。2週間でできるか?」
WPFで高機能なデータグリッドを自作する? しかもExcelライクな計算式エンジン付き?
地獄だ。バグの温床になる未来しか見えない。
「2週間? 2ヶ月かかってもバグだらけになりますよ」と言い返したかった。
でも、ここでビジネスの視点(レンズ)を借りてみる。
なぜ彼らはそんな機能を欲しがっているのか?
「マイケル、その顧客は具体的にどんな業務でそれを使いたいの?」
「えっと、確か……毎月の集計データをちょっと修正して、上司に報告するレポートを作りたいらしい」
「それなら、アプリ内で完結させなくても、ワンクリックで『Excel出力』して、Excelで加工してもらうんじゃダメなの? うちのアプリの強みはデータの整合性だから、自由編集はむしろリスクじゃない?」
マイケルはハッとした顔をした。
「確かに……。彼らが欲しいのは『レポートを作ること』であって、『アプリ内で計算すること』じゃないな。Excel連携の方がむしろ喜ばれるかもしれない」
結果、僕らは「高機能グリッド開発」というデスマーチを回避し、「CSVエクスポート機能の強化」という3日で終わるタスクで、顧客の課題を解決した。
「技術で解決しない」という選択肢を提示できるのも、エンジニアがビジネス視点を持った時の強みだ。
コードを書くのが仕事じゃない。**「最小のコードで、最大の価値(ソリューション)を提供すること」**が僕らの仕事なんだ。
3. 共通言語(Ubiquitous Language)を作る
こうして、デザイナー、PM、そしてエンジニアがそれぞれの視点を持ち寄ることで、僕らのチームは少しずつ強くなっていった。
そこで重要になったのが、ドメイン駆動設計(DDD)で言うところの**「ユビキタス言語(共通言語)」**だ。
以前はこんな会話をしていた。
- エンジニア: 「ViewModelの
UserStatusプロパティを3に更新します」 - デザイナー: 「ユーザーのアイコンをグレーアウトさせて」
- PM: 「退会済みユーザーの処理を走らせて」
みんな同じことを言っているのに、言葉が違うから食い違う。
僕らはミーティングで、徹底的に言葉を定義した。
「これからは、この状態を全員で**『Deactivated(無効化)』**と呼ぼう。コードのクラス名も、デザインのステータス名も、仕様書の文言も全部統一するぞ」
たかが言葉、されど言葉。
この「共通言語」ができてから、手戻りが劇的に減った。
エンジニアがコードを書くとき、PMの顔とデザイナーの顔が浮かぶようになった。
「あ、このロジックは『Deactivated』の定義から外れるな。PMに確認しよう」と、実装前に気づけるようになったんだ。
4. “Code” is not the Product.
日本にいた頃、僕は「仕様書通りに完璧なコードを書くこと」がゴールだと思っていた。
でも、海外に来て、多様なバックグラウンドを持つプロフェッショナルたちと揉まれる中で、気づいたことがある。
コードは、プロダクトの一部でしかない。
素晴らしいデザインがあっても、実装が重ければ使われない。
素晴らしい技術があっても、誰の課題も解決しなければ売れない。
素晴らしいビジネスモデルがあっても、UXが悪ければ解約される。
僕たちエンジニアは、技術という「武器」を持っている。
でも、その武器をどこに向けるか、どう使うかを決めるには、デザイナーの「感性」とビジネスの「戦略」が必要不可欠なんだ。
「視点の多重奏」を楽しむ余裕が出てきた頃、僕は単なる「C#エンジニア」ではなく、「プロダクト開発者」としての自覚を持つようになった。
自分の書くコードが、デザインの一部になり、ビジネスの数字を動かしているという実感。
これが感じられるようになると、開発はもっと面白くなる。
「ねえケンタ、また無茶なアイデア思いついたくんだけど……」
ソフィアがまたFigmaを持ってやってきた。
以前なら逃げ出していたけれど、今の僕はニヤリと笑ってこう返す。
「OK、見せてみて。そのまま実装するのは無理かもしれないけど、**もっといい方法(Better Way)**を一緒に考えようか」
さて、異文化コミュニケーションの荒波も乗り越え、チームの中心として頼られるようになった君。
でも、キャリアはここで終わりじゃない。
最後に待ち受けているのは、自分自身と、そして他者を成長させ続けるための**「フィードバック」**という試練だ。
次回、最終回「結」。
褒めるだけが優しさじゃない。批判するだけが厳しさじゃない。
信頼関係を壊さずに、言いにくいことを伝え、共に成長するための**「Feedback That Builds, Not Breaks(建設的なフィードバック)」**について語ろう。
これをマスターすれば、君はもうどこへ行ってもリーダーとしてやっていけるはずだ。
それじゃ、また次のコーヒーブレイクで。
Feedback That Builds, Not Breaks:成長のための建設的な批判
エンジニアとして働いていると、毎日が「審判」の連続だ。
書いたコードはプルリクエスト(PR)で晒され、作った機能はQAチームにテストされ、リリースすればユーザーからの評価が数字として突きつけられる。
日本にいた頃の僕は、この「評価されること」に過剰な恐怖心を持っていた気がする。
コードの指摘=人格否定。
バグの報告=能力不足の烙印。
だから、なるべく完璧な状態になるまで見せたくないし、指摘を受けたら「すみません、すぐに直します!」と平謝りして、心の中で(ちくしょう、細かいこと言いやがって)と毒づく。
でも、海外に来て、ある日のコードレビューでその価値観が粉々に砕かれた。
1. “You are not your code.”(君=君のコード、ではない)
チームに新しく入ったオランダ人のシニアエンジニア、バスティアン。彼はとにかく「率直」な男だった。
ある日、僕が自信満々で出したPRに対して、彼が放ったコメントはこうだ。
「This logic is garbage. It’s unreadable and violates the Single Responsibility Principle. Rewrite it.(このロジックはゴミだ。読めないし、単一責任の原則に違反してる。書き直して)」
僕は画面の前で震えた。
顔が熱くなり、怒りと恥ずかしさで指が動かなくなった。「ゴミ」ってなんだよ。「ゴミ」って。一生懸命書いたのに。俺のことが嫌いなのか?
翌日のランチタイム、僕はバスティアンを避けていたんだけど、彼が満面の笑みで隣に座ってきた。
「Hey Kenta! 昨日のサッカー見たか?」
僕は混乱した。「え? お前、昨日俺のこと『ゴミ』って言ったじゃん。なんで普通に話しかけてくるの?」
たまらず僕は聞いた。「昨日のレビュー、かなりキツかったんだけど……」
彼はきょとんとして答えた。
「ああ、あのコードか。コードは確かに酷かった。でも、君が優秀なエンジニアであることは知ってるよ。 だからこそ、あんな低いクオリティのものをマージさせたくなかったんだ。君=君のコードじゃない。僕らは『コード』の問題を話しているんであって、君の『人格』の話なんてしてないぞ?」
目から鱗が落ちた。
海外(特に欧米圏)では、**「人と課題を切り離す」**という考え方が徹底している。
彼らにとって、厳しいフィードバックは「攻撃」ではなく、「投資」なのだ。どうでもいい相手なら、わざわざ時間を使って指摘なんてしない。
「君=君のコードではない(You are not your code)」
このマインドセットを持てるようになってから、僕はPRのコメント欄が怖くなくなった。
むしろ、「おっ、今日はどんな『改善のヒント』がもらえるかな?」とワクワクさえするようになった(たまにイラッとするけどね)。
2. 日本流「サンドイッチ話法」は通用しない
逆に、僕が誰かにフィードバックをする時の話だ。
日本人はよく「サンドイッチ話法」を使う。
「君のコードは素晴らしいね(褒める)。でもここはバグりそうだから直して(批判)。全体的にはすごくいいよ(褒める)」
これを海外でやるとどうなるか。
相手は**「最初と最後」しか聞かない**。
「OK、Kentaは僕のコードを『素晴らしい』と言ってくれた!」と解釈し、肝心の修正ポイントが伝わらないことが多々ある。
また、変に気を使って遠回しな言い方をすると、かえって不誠実だと思われる。
**「Radical Candor(徹底的な率直さ)」**という有名な概念がある。元Googleのキム・スコットが提唱したものだ。
最も良いフィードバックとは、**「Care Personally(個人的に関心を持ち)」つつ、「Challenge Directly(直接的に挑戦する)」**ことだ。
- Ruinous Empathy(破滅的な共感): 嫌われたくないから言わない。「いいんじゃない?(本当はダメだと思ってるけど)」→ 相手は成長せず、失敗する。
- Obnoxious Aggression(不快な攻撃): 愛のない批判。「バカじゃないの?」→ 信頼関係が崩壊する。
- Radical Candor(徹底的な率直さ): 「君の成功を願っているからこそ言うけど、この設計は拡張性がないよ」→ 信頼と成長を生む。
僕はこれを意識して、メンバーにフィードバックするようになった。
「リサ、君のXAMLの書き方は冗長だと思う。ResourceDictionaryを使えばもっとシンプルになるし、君も楽になるはずだ。手伝おうか?」
これなら、「あなたのやり方はダメだ」ではなく「あなたがもっと良くなる方法がある」というメッセージになる。
これこそが、ビルド(構築)するフィードバックだ。壊す(ブレイク)フィードバックとの違いは、そこに**「相手の成功への願い」**があるかどうかだ。
3. 感情ではなく「事実」で語る:SBIモデル
とはいえ、言い方には技術がいる。
ただ「直せ」と言うだけでは角が立つ。そこで役立つのがSBIモデルだ。
- Situation(状況): いつ、どこで
- Behavior(行動): 何をしたか
- Impact(影響): どういう結果になったか
例えば、ミーティングによく遅刻する同僚に注意する場合。
- ダメな例: 「君っていつも遅刻するよね。やる気ある?(人格攻撃)」
- SBIモデルの例:
- Situation: 今朝のスタンドアップミーティングで
- Behavior: 君が5分遅れて参加した時、
- Impact: チーム全員の進捗報告が止まってしまい、全体の時間が押してしまった。
こう言われると、相手は言い逃れできない。事実は事実だからだ。でも、人格は否定していない。「遅刻という行動」が「悪い影響」を与えた、という事実確認だけだ。
これなら、相手も「Sorry, 次は気をつけるよ」と素直になりやすい。
コードレビューでも同じだ。
「この書き方は嫌いだ」ではなく、
「このLINQクエリは(S)、ネストが深すぎて(B)、デバッグ時に可読性が下がりバグの温床になる(I)。だから分解すべきだ」
と伝えれば、それは建設的な議論になる。
4. フィードバックを「ギフト」として受け取る
最後に、フィードバックを受け取る側の姿勢について。
どんなに正しい指摘でも、言われるとカチンとくることはある。人間だもの。
でも、海外で生き残るエンジニアは、フィードバックを**「ギフト(贈り物)」**として扱う。
誰かが君のために、わざわざ時間とエネルギーを使って、君が気づいていない「盲点」を教えてくれたのだ。
だから、何を言われても、第一声はこうだ。
「Thank you.」
「でも……」と反論するのは、その後でいい。まずは受け取る。
「指摘ありがとう。確かにその視点はなかった。ただ、今回はパフォーマンスより納期を優先した意図があったんだ。どう思う?」
こう返せれば、相手も「お、こいつは話がわかるな」とリスペクトしてくれる。
フィードバックを恐れず、むしろ「もっとくれ!」と言えるようになった時、君の成長速度は加速する。
エピローグ:世界は君のコードを待っている
全4回にわたってお届けしてきた「海外エンジニア生存戦略」、いかがだっただろうか。
- Collaboration: 孤独な狼を卒業し、
- Team Dynamics: 対立を恐れずにチームを動かし、
- Perspective: 異職種と共通言語を作り、
- Feedback: 率直な対話で信頼を築く。
これらは全て、C#の文法書には載っていない。
Stack Overflowで検索しても出てこない。
でも、これこそが、言語も文化も違うカオスな世界で、僕らエンジニアが生き抜き、そして輝くための「ソースコード」なのだ。
技術力は、入場チケットに過ぎない。
そのチケットを持って会場に入った後、どう踊るか、誰と踊るかが、君のキャリアを決める。
最初は怖いかもしれない。
英語が通じなくて悔しい思いをするかもしれない。
文化の違いに腹が立つこともあるだろう。
でも、大丈夫。
君が書いたコードが、世界の裏側で誰かの役に立っているように、
君という人間が心を開いて飛び込めば、必ず受け入れてくれるチームがある。
PCを閉じれば、外はまた違った景色が広がっている。
僕もそろそろ、同僚たちとの金曜日のビール(こっちは夕方から飲み始めるんだ)に参加してこようと思う。
そこでは、バグの話も、デッドラインの話もナシだ。ただ、仲間として笑い合うだけ。
さあ、次は君の番だ。
日本から世界へ。その一歩を踏み出す準備はできたかい?
Good luck, and Happy Coding!

コメント