海外でC# / WPFエンジニアとして設計・開発に携わっている僕が、現場でのリアルな気づきを綴るこのブログ。今回は、日本人が無意識に持ち込んでしまう「空気を読む」という美徳が、海外のエンジニアリング現場でいかに危険な「凶器」になり得るか、という話をしようと思います。
特に、僕たちが育ってきた「ハイコンテクスト文化」が、データよりも調和を優先してしまった時に起きる悲劇について、僕の実体験をもとに深掘りします。
ヒビの入った「阿吽の呼吸」——ハイコンテクストな鏡の崩壊
ヨーロッパの某所でC#を叩き、WPF(Windows Presentation Foundation)でゴリゴリにGUIの設計をしているエンジニアです。こっちは冬が長く、どんよりしたグレーの空の下でコードを書いてると、時々日本の「阿吽の呼吸」が恋しくなる……なんてことは、実はあんまりありません。むしろ、あの「言わなくてもわかるよね」という文化が、どれだけエンジニアリングの現場でリスクを孕んでいるかを、こっちに来てから痛いほど思い知らされたからです。
まず、僕たちが当たり前だと思っている「ハイコンテクスト文化」の鏡が、海外の現場でどうやって木っ端微塵に砕け散るか、そのあたりから話を始めてみようと思います。
「言外のニュアンス」という名の霧
皆さんは**「ハイコンテクスト(High-Context)」**という言葉を、エンジニアリングの文脈で考えたことがあるでしょうか。エドワード・T・ホールという文化人類学者が提唱したこの概念は、簡単に言うと「伝えるべき情報の多くを、言葉ではなく、その場の状況や文脈、共有された価値観に依存する文化」を指します。日本は世界でもトップクラスのハイコンテクスト文化圏です。
一方で、僕がいま働いている欧州やアメリカの現場は、極めて**「ローコンテクスト(Low-Context)」**な世界です。言葉にしたこと、ドキュメントに刻んだことがすべて。それ以外の「察してよ」という甘えは、存在しないものとして扱われます。
僕が海外に移住して数ヶ月の頃、.NET 8とWPFを用いた大規模なシステム刷新プロジェクトに参加しました。そこで僕の中に染み付いていた「日本人らしい振る舞い」が、最初の大きな壁にぶち当たったのです。
「和」を尊ぶ心が招く、データへの背信
プロジェクトには、地元のシニアアーキテクト、ルーカス(仮名)がいました。彼はカリスマ性があり、チームを牽引していましたが、同時に「自分の設計の正当性」に強く固執する側面もありました。
ある進捗会議で、彼が提案したデータ同期ロジックに、僕はコードレベルで強烈な違和感を覚えました。C#のTaskの扱い方や、WPFのUIスレッドへのアクセス方法に、明らかにデッドロックを誘発する不自然な点があったのです。
しかし、その場の空気は「彼が言うんだから間違いない」「ここで水を差すのはチームの和を乱す」という、日本的な、あるいは日本人が勝手に作り出してしまう「調和へのバイアス」に支配されていました。
「まあ、彼ほどのベテランが言っているんだし、僕の見間違いかもしれない。ここで強く否定して彼のメンツを潰すのも悪いな」
僕は、ハイコンテクストな鏡に映る「調和」という幻影を選んでしまいました。これが、後に「Cracks in the High Context Mirror(ハイコンテクストな鏡のヒビ)」となって、プロジェクト全体を揺るがすことになるとは知らずに。
データの悲鳴と「顔」の保護——統合会議で葬られたレッドフラグ
数日後、プロジェクトは「地獄の統合会議」を迎えました。場所は古いレンガ造りのオフィス。外はあいにくの雨で、窓を叩く音が妙に耳につく日でした。
統合会議という名の「審判」
その日は、太陽光発電のパワーコンディショナからデータを取得し、リアルタイムでWPFダッシュボードに表示するシステムの重要なマイルストーン。出席者は15名ほど。ルーカスは誇らしげに、UDPパケットを独自の非同期キューイングシステムで処理するアーキテクチャをプレゼンしていました。
しかし、僕は自分のローカル環境ですでに「不穏な挙動」を確認していました。特定の高負荷条件下で、WPFのUIスレッドが数秒間フリーズする、いわゆる「プチフリ」現象です。
原因は明白でした。ルーカスが実装したデータ受信ロジックの中に、アンチパターンの代表格であるasync voidが多用されており、さらに共有リソースへのアクセスに古いスタイルのlock構文が混在していたのです。
葬られたレッドフラグ
僕は会議の前に、一度ルーカスに懸念を伝えていました。「このロックの取り方は、WPFのレンダリングサイクルと干渉するリスクがあるんじゃないか?」と。しかし、ルーカスからの返信は冷ややかでした。
「それはネットワークの遅延だろう。僕のロジックは完璧だ。今日の会議では、通信の安定性をアピールしてほしい」
そしてデモ中、案の定、画面が一瞬固まりました。PM(プロジェクトマネージャー)が尋ねます。 「今、画面が止まったように見えたけど、大丈夫か?」
僕はルーカスと目が合いました。彼の目は「余計なことは言うな」と無言で訴えていました。僕は……結局、彼の顔を立てる道を選んでしまいました。「ええ、ルーターの負荷かもしれませんね。アプリ自体は安定しています」と。
メンツ(Face)を守るための嘘
これが「エンジニアリングにおける共謀」です。欧州のエンジニアにとって、マニュアルやデータは「唯一の真実」であり、それに背くことはプロフェッショナルとしての自殺行為です。
僕がルーカスのメンツを守るために飲み込んだ言葉は、実はルーカスをさらに深い泥沼に突き落とし、自分自身の信頼をも失墜させる一歩でした。後になって、この「忖度」が自分自身の首を絞めることになるとは、当時の未熟な僕はまだ理解していなかったのです。
C#
// ルーカスが書いていた、UIスレッドを殺す「忖度」の火種
public async void OnDataReceived(byte[] data) // 👈 async void はイベントハンドラ以外では禁忌
{
lock (_syncLock) // 👈 非同期文脈でのlockはデッドロックの温床
{
var result = ProcessData(data);
// UIスレッドをブロックする重い処理
UpdateDashboard(result);
}
}
ラジカル・トランスペアレンシーの逆襲——マニュアルこそが唯一の真実
嘘で塗り固めた「調和」が音を立てて崩れ去るのは時間の問題でした。QAチームによるストレステストが開始されると、WPFのUIスレッドは見事にデッドロックを起こし、アプリケーションは応答なし(Not Responding)の真っ白な画面へ。
その時、僕の背後から氷のような声が響きました。
「お前はエンジニアか、それともスピーカーか?」
声の主は、ドイツ出身のシニアエンジニア、ハンスでした。彼は常に事実と仕様書だけを基準に話す、極度のローコンテクスト・マンです。ハンスは僕の画面に表示されたスタックトレースを指差して、こう言いました。
「数日前の会議で、君はこのモジュールは安定していると言った。だが、ダンプファイルを見れば、async voidがUIスレッドをブロックしているのは明白だ。なぜあの時、嘘をついたんだ?」
僕はしどろもどろになりながら「チームの和を乱したくなかった」と答えました。ハンスは僕を軽蔑するような目で見つめ、一言こう放ちました。
「君のその『思いやり』は、プロジェクトにとっては毒でしかない。お前はエンジニアとして事実を伝える存在なのか? それとも誰かの拡声器(スピーカー)なのか?」
マニュアルという「唯一の神」
ハンスに連れられて向かった共有ドキュメントには、太字でこう書かれていました。
Rule 4.2: Avoid async void except for event handlers. All shared resource access MUST use SemaphoreSlim for async synchronization.
ハンスは言いました。「このマニュアルは、僕たちがプロとして合意した『唯一の真実』だ。ルーカスが誰であろうと、この真実から外れたコードは欠陥品だ。君が空気を読んで沈黙したことで、僕たちは修正に費やすはずだった3日間を無駄にしたんだ」
これが、ヨーロッパ流の**「ラジカル・トランスペアレンシー(過激なまでの透明性)」**です。
「批判」は個人への攻撃ではない
衝撃的だったのは、その後のハンスの行動でした。彼はSlackの公開チャンネルで、ルーカスのコードの欠陥を淡々と、かつ詳細に指摘したのです。
日本人なら「みんなの前で恥をかかせるなんて!」と冷や汗をかく場面ですが、ルーカスの反応は意外なものでした。 「ああ、確かに規約を失念していた。ハンス、指摘ありがとう。僕のミスだ。すぐにリファクタリングする」
そこにはドロドロした感情も、メンツの潰し合いもありませんでした。あるのは「より良いプロダクトを作る」という目的への、徹底したプロフェッショナリズムだけ。彼らにとって、「コードへの批判」は「人格への攻撃」ではないのです。
エンジニアとして生き残るための「脱・忖度」術
ハンスに叩きのめされたあの日から、僕は自分の「OS」を書き換えることにしました。異文化の荒波の中で信頼を勝ち取るために僕が実践している、3つのメソッドを共有します。
1. 「意見の相違」を「人格の否定」から切り離す
日本では、反対意見を言うことが「人間関係を壊すこと」に直結しがちです。しかし、ローコンテクストな現場では違います。「コードへの指摘」は、ただの「デバッグ」です。
僕は意識的に主語を「I(私)」や「You(あなた)」から、**「The Code(コード)」や「The Data(データ)」**に変えました。
- × 「君の書き方はおかしい」
- ○ 「このコードは規約4.2に抵触している」
- × 「僕はこう思う」
- ○ 「プロファイラの結果はこのボトルネックを示している」
2. 「マニュアル」を最強の盾にする
海外の多国籍チームには、共通の「空気」なんて存在しません。あるのは、合意された「ドキュメント」だけです。僕は、PR(Pull Request)のレビューでも会議でも、必ず公式ドキュメントや規約を引用するようにしました。
「なんとなく良さそう」を捨て、Microsoft Learnのリンクを貼り付ける。これこそが、日本人エンジニアが得意とする「真面目さ」を、海外でのリスペクトに変える最強の武器になります。
3. 「阿吽の呼吸」を捨て、過剰に言語化する
ハイコンテクストな文化圏にいると、僕たちはつい文脈を省略してしまいます。しかし、背景も文化も異なる同僚にそれは通用しません。
「AをBに直しました。理由はCのリスクを避けるためで、これは先週の会議での決定事項に基づいています」
ここまで書くのは日本では「しつこい」と思われるかもしれませんが、海外ではこれが「透明性」であり「誠実さ」です。沈黙は「同意」ではなく、単なる「情報の欠如」として扱われるのです。
結びに:ハイブリッドな「グローバル・エンジニア」へ
あれから数年。今でも僕はルーカスやハンスと同じチームで働いています。ルーカスのコードに問題があれば、僕は今なら迷わずその場で指摘します。あの時の「嘘の調和」よりも、今の「健全な衝突」の方が、よっぽどチームの絆は強いと断言できます。
一方で、僕は日本人としての「ハイコンテクスト」な感性を完全に捨てたわけではありません。チームメンバーが落ち込んでいる時、その「空気」を察してそっとサポートに回る。それは、ローコンテクストな彼らには真似できない、僕だけの付加価値になっています。
技術的な議論では徹底的に「ロー(論理)」で攻め、人間関係の機微では「ハイ(共感)」に振る舞う。
このスイッチの切り替えができるようになった時、僕は初めて海外でエンジニアとして一本立ちできた気がしました。もし、あなたがこれから海外に出ようとしているなら、どうか一回だけ「空気を読む」のをオフにしてみてください。そのヒビが入った鏡の向こう側には、本当の信頼関係が待っています。
僕たちは、調和を守るためにエンジニアになったんじゃない。最高にクールで、安定したシステムを作るためにここにいる。その原点に立ち返った時、あなたのエンジニア人生はもっと自由で、もっと面白いものになるはずです。

コメント