海外エンジニアが直面する「それ、一体何?」の瞬間。コードではデバッグできない文化のバグを乗り越える術。

「え、マジで?」――ロジックが通用しない世界へようこそ

どうも!海外のとある国で、日々C#とWPFと格闘しているITエンジニアです。

普段はMVVMパターンだの、XAMLのデータバインディングだの、UIスレッドのパフォーマンスチューニングだの、そういう「ロジック」と「ルール」が支配する、非常にクリアな世界に生きています。コードは、書いた通りに動く(動かない時もあるけど、それは大抵自分のせい)。バグがあれば原因があり、デバッグすれば必ず突き止められる。白か黒か、TrueかFalseか。それが心地よかったりするわけです。

そんなロジック信者の僕が、一念発起して「海外で働く」という道を選んだわけですが、まあ、毎日が驚きの連続。

技術力?もちろん大事です。C#の最新の機能を知ってるとか、WPFで複雑なカスタムコントロールを実装できるとか、それは強力な武器になります。でもね、こっちに来て痛感したのは、最強の技術力を持ってしても突破できない「壁」があるってこと。

それは、コードレビューでもなければ、複雑な要件定義でもない。

そう、**「文化」**です。

もっとハッキリ言えば、「え、マジで?」「それ、一体何?」「どういうロジック?」と、こっちのCPU(頭脳)がフリーズするような、謎の習慣や暗黙のルールの数々。

今日は、そんな僕が海外のオフィスで出くわした、「ロジック(技術)が通用しない世界」の洗礼、つまり「What Even Is That?」な瞬間の話をしたいと思います。これから海外を目指すエンジニアの皆さんには、技術書を読むのと同じくらい(いや、それ以上に)大事な「サバイバルガイド」になるかもしれません。


「ケーキ」がすべてを中断させる日

僕が最初に出くわした「文化のバグ」は、非常に甘くて、高カロリーな顔をしてやってきました。

それは、入社してまだ数週間、時差ボケも抜けきらないまま、必死で既存のWPFアプリケーションの巨大なコードベースを解読していた日のことです。時刻は、午後の3時。一番集中力が高まり、キーボードを叩く音もリズミカルになってきた、まさに「ゾーン」に入った瞬間。

突然、フロアのマネージャーが手をパンパンと叩き、大声でこう言いました。

「Okay guys! Cake time!(よしみんな!ケーキの時間だ!)」

……は? ケーキ?

何言ってるんだ、このおっさんは。こっちは今、デッドラインが迫ってるタスクの、一番クリティカルな部分を実装してるんだぞ。

周囲を見渡すと、あれだけ集中していた同僚たちが、まるでWindowsのシャットダウン処理が走ったかのように、一斉に作業を止め、エディタを最小化し、スルスルと椅子から立ち上がって、オフィスの隅にあるキッチンスペースに向かい始めました。

「いやいや、マジか」と。

日本人的な感覚(あるいは僕個人の感覚)では、「仕事中にケーキ」っていうのは、せいぜい自分のデスクで、キーボードの脇に置いて、こっそり糖分補給する、みたいなイメージでした。でも、彼らは違う。

キッチンスペースには、巨大なチョコレートケーキが鎮座しており、それを全員で囲み、マネージャーが切り分け始めます。

僕も「行かないとマズいか…?」と恐る恐る近づくと、同僚のシニアエンジニア(コードレビューでいつも的確な指摘をくれる、僕が尊敬する人)が、満面の笑みで紙皿を渡してきました。

「(僕の名前)!チョコレート好きか?これ、サラ(別部署の人)が昨日、娘さんの誕生日か何かで作ってきたんだってさ。最高だぜ!」

……いや、そういうことじゃなくて。

ケーキが置かれたテーブルの周りでは、もはや「仕事」の「し」の字もありません。

「週末、息子のサッカーの試合がさー」

「新しいNetflixのドラマ見た?」

「このケーキ、レシピ聞いた?」

完全な雑談。それも、10分、15分と続く。

僕の頭の中は、もうパニックです。

(おいおい、さっきまでレビューしてたあのPull Request、どうなったんだよ)

(WPFのUIスレッドをブロックするような、こんな無駄な時間…)

(この文化、合理的な説明(仕様書)はどこにあるんだ?)

焦りとイライラが募り、ケーキの味なんて全くしません。僕は早々に「ごちそうさま」と席に戻ろうとしました。

その時です。

僕の直属の上司が、ケーキを頬張りながら僕の肩をポンと叩きました。

「(僕の名前)、焦るなって。ケーキは『仕事』だぞ」

ケーキは、仕事。

この禅問答のような言葉。これが、僕が海外で学んだ最初の「人生術」であり、「お得情報」の入り口でした。

彼らが言う「ケーキ」とは、単なるおやつじゃなかったんです。

これは、**「インフォーマル・コミュニケーション(非公式な意思疎通)」を最大化するための、超重要な「儀式」**だったんです。

普段、別のプロジェクトや別の部署で働いていて、業務上は全く接点がない人たち。その人たちと、強制的に(でも和やかに)顔を合わせ、雑談をする時間。

「週末何した?」という、一見どうでもいい会話から、「あ、そういえば君、WPFやってるんだっけ?うちのチームで今、描画パフォーマンスで困っててさ…」なんていう、ガチの技術相談に発展することがある。

実際、僕もこの「ケーキタイム」で、最初は「時間の無駄だ」と思っていた雑談に無理やり付き合わされているうちに、とんでもない「お得情報」をゲットしました。

ある日、例のシニアエンジニアとケーキを食べながら雑談していたら、「そういえば、うちの奥さんがさ、最近『ピクルス・オーナメント』探しにハマってて…」という謎の話が始まりました。(この話もまたヤバいんですが、それは後で)

その時は「へえ、大変ですね」と相槌を打つだけでしたが、数日後、僕が担当していたWPFアプリで、特定の条件下でしか発生しない、原因不明のメモリリークに悩まされていた時のこと。

もうお手上げだと頭を抱えていたら、ふと、そのシニアエンジニアが「そういえば昔、似たようなリークで3日溶かしたことあるな」と、コーヒーを淹れながらボソッと言ったんです。

「え、それ、詳しく教えてください!」

聞けば、それはWPFの特定のサードパーティ製ライブラリのバグで、特定のイベントハンドラの解除がうまくいかないケースがある、という超ニッチな情報でした。

なぜ彼は、僕が困っていることを知っていたのか?

そう、あの「ケーキタイム」で、僕がポロッと「いやー、今週はメモリリークとの戦いっすよ」と愚痴ったのを、彼は覚えていたんです。

もし、あの「非効率」なケーキタイムがなかったら?

もし、僕が「仕事中だ!」と自分のデスクに閉じこもっていたら?

僕は、さらに数日間、あるいは永遠に、あのメモリリークと戦い続けることになっていたかもしれません。

「ケーキは仕事」

あの上司の言葉は、正しかった。

彼らにとって、キッチンスペースでの雑談は、会議室で行うフォーマルなミーティングと同じくらい、いや、それ以上に重要な「情報交換」と「チームビルディング」の場だったんです。

ロジックや効率だけを追い求めていた僕にとって、この「一見、無駄に見える時間」が、実は巡り巡って、最終的な開発効率を爆上げする「投資」であると気付かされる、強烈な一撃でした。


C#のコードなら、async/awaitを使えば非同期処理でUIのブロッキングを避けられます。でも、現実世界の「文化」は、そうはいかない。

それは時に、僕らの「当たり前」という名のUIスレッドを、容赦無くフリーズさせてきます。

この「ケーキカルチャー」は、まだ序の口。

海外のオフィスには、僕たちロジック重視のエンジニアを悩ませる、「それ、一体何?」な瞬間が、まだまだ山のように転がっています。

例えば、会議が始まる前の、あの「謎の雑談タイム」の本当の意味、知ってますか?

あるいは、絶対に断ってはいけない「金曜日のアレ」。

僕たちが「バグ」だと思っていたこれらの習慣が、実は「仕様」であり、むしろ「最高の機能(フィーチャー)」だったとしたら?

次回は、僕がさらに頭を抱えた、別の奇妙な習慣について深掘りしていきたいと思います。

「ピクルス」と「金曜日の儀式」――デプロイよりも優先される謎のタスク

「ケーキは仕事」――。

あの、ロジックの脳天をガツンと殴られたような衝撃から数ヶ月。僕は、WPFのコードレビューで鍛えられた「なぜそう書いたのか?」という問いを、コードではなく、同僚たちの「行動」に向けるようになっていました。

「一見、非合理的(パフォーマンスが悪い)に見えるあの行動(コード)には、何か深い理由(設計思想)があるんじゃないか?」

そう考えるようになった僕は、オフィスの「文化」という名の巨大なソースコードを、少しずつ理解し始めた気になっていました。

そう、完全に「気になっていただけ」でした。

「ケーキ」で学んだ教訓なんて、広大なアプリケーション(異文化)の、ほんの入り口(Mainメソッド)に過ぎなかったのです。

僕のロジックを再びフリーズさせる、次の「What Even Is That?」モーメントは、冬、クリスマスが近づいてきた頃にやってきました。


クリスマスツリーに隠された「ピクルス」を探せ?

12月に入ると、オフィスは急速に浮足立ちます。あちこちにデコレーションが施され、エンジニアたちもサンタ帽をかぶってコーディングし始めます(いや、集中できるのか、それ)。

そして、オフィスのど真ん中には、巨大なクリスマスツリーが設置されました。まあ、ここまではいい。季節感、大事です。

問題は、ある日の昼下がり。

あの「ケーキタイム」で知り合った、僕が尊敬するシニアエンジニア(WPFの設計パターンなら彼に聞け、というレベルの神)が、昼休みでもないのに、その巨大なツリーの前で腕組みをして、何やら真剣な顔でツリーを「デバッグ」していたんです。

(え、あの人、何してるんだろ…)

(ツリーの電飾(LED)の点滅パターンに、非同期処理のバグでも見つけたか?)

気になって声をかけると、彼は人差し指を口に当て、「シーっ」とジェスチャーし、こう言いました。

「今、ピクルスを探してるんだ」

……ピクルス?

ハンバーガーに挟む、あのキュウリの漬物のことか?

僕の頭は「?」で埋め尽くされます。

(クリスマスツリー)と(ピクルス)?

この2つのオブジェクトが、僕の知識(データベース)の中で、どうやってもJOINできない。

僕の混乱を察したのか、彼が笑いながら教えてくれました。

「『ピクルス・オーナメント』だよ。このツリーのどこかに、キュウリの形をした小さな飾り(オーナメント)が1個だけ隠されてるんだ。ドイツの古い伝統(※)で、クリスマスに、これ(ピクルス)を最初に見つけた子供は、次の年、幸運が訪れるって言われてるんだ」

(※後でこっそり調べたら、実はドイツの伝統じゃなくて、19世紀のアメリカの業者が、ドイツ風のガラス細工を売るために作ったマーケティング戦略だった、という説が濃厚らしいです。こういう「歴史的経緯」を知るのも、エンジニアの探究心としては面白いですよね)

「でさ」と彼は続けます。

「うちのオフィスでは、『最初に見つけたヤツは、ボーナス査定が上がる』っていう、しょうもない都市伝説があってな。いや、実際はスタバの50ドルカードが貰えるだけなんだけど、みんなガチなんだよ」

見ると、ツリーの周りには、彼以外にも数人のエンジニアや、普段は別室にこもっているデータベース管理者(DBA)のおじさんまでが、さりげなーくツリーの周りを周回し、目を光らせています。

これ、どう見ても仕事してないだろ。

僕の「ロジック脳」が、またアラートを鳴らします。

(この人たちに払われてる時給、いくらだと思ってるんだ)

(ピクルス探してる暇があったら、あのペンディングになってるPull Requestをレビューしてくれ)

しかし、その「バカバカしい」と切り捨てそうになった光景に、僕はふと違和感を覚えました。

ピクルスを探しているDBAのおじさんと、シニアエンジニア。

この二人、先週、データベースの新しいスキーマ(設計)のことで、会議室でかなり激しくやり合ってたんです。片や「アプリ側(WPF)のパフォーマンスのために、このViewが欲しい」、片や「DBの整合性(正規化)が崩れるから、そんなクエリは許可できない」と。

それが、今、二人はツリーの前で顔を合わせ、ニヤッと笑いながら、

「おい、まだ見つからないのか?」

「あんたこそ、老眼で見えないんじゃないのか?」

なんて軽口を叩き合っている。

そして、ついにマーケティング部の若い女性が「あったー!」と歓声を上げ、小さなピクルスの飾りを掲げた時。

シニアエンジニアも、DBAのおじさんも、悔しそうに頭を抱えながらも、彼女に拍手を送っていました。

その光景を見た時、僕はハッとしました。

これも「仕事」だ、と。

あの「ケーキタイム」が、異なる部署間の「横」の繋がりを作る「儀式」だったとすれば、この「ピクルスハント」は、**利害が対立する(かもしれない)部署や役職の垣根を一時的に取り払い、同じ「バカバカしい」目標に向かわせることで、関係性の「潤滑油」を生み出す「儀式」**なんです。

考えてみてください。

WPFエンジニア(僕)とDBA。僕らは、システム全体を見れば「協力」すべき仲間ですが、短期的には「対立」しやすい関係です。僕は速いレスポンスが欲しい、彼はデータの整合性を守りたい。

でも、「ピクルス探し」という、利害関係ゼロの「遊び」を一緒に経験した仲になれば。

次に僕が「あのデータ、どうしても欲しいんですけど…」と相談に行った時、DBAのおじさんの反応は、ピクルスを知らない僕(=ただのワーカービー)に対する反応とは、きっと違うはず。

「おう、ピクルス探しの(僕の名前)か。しょうがないな、ちょっと構成(クエリ)を考えてやるよ」

そうなる可能性が、格段に上がる。

この「ピクルス・オーナメント」は、技術的な合理性(ロジック)の外側にある、人間関係の「デバッグ」ツールだったんです。一見、無駄(アブサード)に見えるこの習慣が、組織全体の開発効率(パフォーマンス)を、水面下で最適化している。


絶対に断れない「金曜日のアレ」

「ピクルス」で組織の「潤滑油」の重要性を学んだ僕に、とどめを刺してきたのが、「金曜日のアレ」です。

金曜日の午後4時。

日本では「よし、今週もあと少しだ。最後のバグフィックス、やっちまうか!」と、ラストスパートをかける時間帯。

僕も、ローカルでWPFアプリの最終ビルドが通ったのを確認し、「よし、あとはこれをCI/CDパイプラインに乗せて…」と考えていた、まさにその時。

パンパン!と、またしてもマネージャーの手拍子が響き渡りました。

「Okay everyone! Week is done! Grab a beer!(はい、みんな!今週も終わり!ビールを取りに行け!)」

……え? まだ4時ですけど?

オフィスの隅にある、いつもは水とコーヒーしか入っていないはずの業務用冷蔵庫が、ガラガラと開け放たれる。中には、びっしりと冷えたビールの瓶と缶。そして大量のポテトチップス。

「起」で話した「ケーキタイム」と違うのは、その「アルコール」という点と、そして「熱量」です。

ケーキの時は、まだ「休憩」という雰囲気があった。

でも、これは違う。

「よっしゃー!」と歓声を上げてビールを取りに行くエンジニアたち。

僕は「いや、まだ仕事が…」と戸惑っていると、隣の席の同僚が、僕の分のビールを1本、ドンッとデスクに置いてきました。

「(僕の名前)、今週もお疲れ。まずは乾杯だろ?」

「あ、でも、僕、まだビルドの確認が…」

そう言いかけた僕に、彼は、信じられないものを見るような目で、こう言いました。

「What?(は?) ビルド? 月曜日にやれよ。今は『金曜日』だぞ」

彼らにとって、「金曜日の午後4時」は、聖域(サンクチュアリ)なんです。

この時間になったら、**「仕事(コード)を止めて、仲間と今週の健闘を称え合う」**ことこそが、「最優先タスク(P0タスク)」に切り替わる。

日本でいう「飲み会」とも、ちょっと違います。

あれは「業務外」で、しかも「夜」ですよね。

こっちは、**「業務時間内」に、「上司の号令」で、「アルコール」**が出てくる。

そして、日本のように「部署ごと」とかじゃなく、フロアにいる全員(エンジニア、デザイナー、マーケ、QA)が、ごちゃ混ぜになって立ち話(とビール)を始める。

もちろん、飲めない人はソフトドリンクでOK。大事なのは、アルコールじゃありません。

大事なのは、**「参加する」**という行為そのもの。

もし、ここで僕が「いや、僕はいいんで、デプロイ作業続けます」とパソコンに向かい続けたら、どう見られるか?

それは「真面目なヤツ」ではありません。

それは「協調性のないヤツ」「俺たちの『今週の頑張り』をリスペクトしないヤツ」という、強烈なメッセージになってしまう。

そう。これは「飲み会」ではなく、週の終わりを告げる**「感謝と労い(ねぎらい)の儀式」**なんです。

マネージャーが「ビールをおごる」という行為は、「今週、みんなが頑張ったこと(たとえバグだらけでも)、俺はちゃんと見てるぞ。ありがとう。お疲れさん」という、サイン。

それに対して、僕らが「乾杯!」と応えるのは、「こちらこそ、マネジメントあざっす!」という、レスポンス。

この「インフォーマル」な双方向の確認(ハンドシェイク)こそが、チームの信頼関係(トラスト)を築いている。

そして、案の定、この「ビールタイム」でも、とんでもない「お得情報」が飛び交います。

ビール片手に、普段は雲の上の存在のアーキテクトと雑談していたら、

「ああ、(僕の名前)か。君が今、いじってるWPFのモジュール、あれ、来四半期でBlazorにリプレースする計画が(非公式に)進んでるから、あんまり深掘り(リファクタリング)しなくていいぞ。今のうちにC#のサーバーサイド、勉強しとけよ」

なんていう、超弩級の「内部情報(リーク)」をポロッと教えてくれたり。

こんな情報、オフィシャルな会議(仕様書)に出てくるわけがない!


ケーキ、ピクルス、そして金曜日のビール。

僕たちエンジニアが「合理的」「効率的」と信じているロジック。

If (work_time) { Do_Coding(); } Else { Go_Home(); }

こんな単純なアルゴリズムでは、到底太刀打ちできない、複雑で、人間臭い「仕様」が、海外のオフィスには満載です。

一見、仕事の生産性を著しく下げる「バグ」のように見えるこれらの習慣。

でも、その実態は、人間という「感情」を持つリソースのパフォーマンスを最大化し、組織の「バグ(=人間関係の衝突)」を未然に防ぐための、高度な「設計パターン」だったんです。

でも、勘違いしないでください。

これらの「楽しい」習慣に馴染めば、すべてが上手くいくわけじゃありません。

文化の違いは、「楽しいバグ」だけじゃなく、笑えない「深刻なエラー(クリティカル・エラー)」も引き起こします。

次回は、僕が良かれと思ってやった「日本的な配慮」が、あわやチーム崩壊(炎上)を招きかけた、あの「静かなる衝突」について、お話ししたいと思います。

「良かれ」が招いた炎上。――沈黙は「金」ではなく「バグ」だった

「ケーキは仕事」「ピクルスは潤滑油」「金曜のビールは儀式」

どうだ、俺はもう分かってるぞ、と。

海外オフィスの「一見、非合理な文化(バグ?)」の裏にある、高度な「人間関係の設計思想(フィーチャー)」を、俺は理解した。

そう、すっかり「分かった気」になっていたんです。

C#のジェネリクスを理解したての頃に、何でもかんでもList<T>で書きたがる、あの感じ。あるいはWPFでMVVMパターンを覚えて、とにかく全プロパティをINotifyPropertyChangedで実装しちゃう、あの視野の狭さ。

もう「ロジック馬鹿」な日本人エンジニアじゃない。インフォーマルなコミュニケーションもバッチリだ。

そんな万能感にも似た自信が、僕のキャリアにおける最大級の「AccessViolationException(アクセス違反例外)」、つまり「踏み込んではいけない領域」に土足で踏み込む大失態を引き起こすとは、夢にも思っていませんでした。


「サイレント・リファクタリング」という名の爆弾

事件は、僕が担当していたWPFの新しい画面(View)の実装中に起こりました。

その画面は、既存の、とあるコアなロジック(仮に「モジュールB」と呼びましょう)を参照する必要がありました。「モジュールB」は、僕が入社するずっと前から存在し、今は「マーク」という別のチームのシニアエンジニアが管理していることになっていました。

僕は自分のタスク(仮に「タスクA」)を進めるため、その「モジュールB」のソースコードを読み始めました。

……読んで、数分後。

僕は、自分の目を疑いました。

「なんだ、このコードは…」

WPFエンジニア(特にMVVMにこだわりがある人)なら分かってくれると思うんですが、その「モジュールB」は、設計思想(アーキテクチャ)という観点から見て、ハッキリ言って「イケてない」状態でした。

いや、もっと正確に言いましょう。僕の基準では「最悪」でした。

モデル(Model)クラスが、なぜかUI(View)の状態を直接知っているかのような依存関係があったり、特定の処理がasync/awaitを使わずに、古(いにしえ)のDispatcher.BeginInvokeで無理やりUIスレッドに処理を投げ込んでいたり…。

「うわぁ…これ、パフォーマンスのボトルネックになってるし、何よりメンテナンス性が低すぎる。マークもシニアなのに、なんでこんな書き方してるんだ…?」

その時、僕の頭に「日本人的な配慮」という、悪魔のささやき(ロジック)が流れ込みます。

(そうか、マークも忙しいんだな)

(しかも彼は別チームのシニアだ。僕なんかがPull Request(PR)のレビューコメントで、『あなたの設計、イケてないですよ』なんて公(おおやけ)に指摘したら、彼のメンツ(プライド)をズタズタにしてしまう)

(そういえば「ケーキ」の時も、彼は「娘が大学に…」とか言って疲れてたな…)

(よし、分かった)

(ここは俺が、「こっそり」直してあげよう

そう。僕は「良かれと思って」やらかしたんです。

自分の「タスクA」を実装する過程で、「ついでに」、あのイケてない「モジュールB」の気になった部分を、僕の考える「美しい」MVVMパターンに沿って、サイレント・リファクタリング(勝手な修正)を敢行しました。

修正したコードは、我ながら完璧でした。

依存関係は逆転(DI)され、非同期処理は美しくasync/awaitで書き直され、パフォーマンスも(ローカルで計測した限り)30%は改善していました。

「ふう。これでマークも恥をかかずに済むし、コードベースも綺麗になる。俺のタスクAも、このクリーンなモジュールBのおかげでスムーズに進む。まさに一石三鳥。これぞ『和』の心。俺、デキる」

僕は、自信満々で、その巨大な変更(タスクAの実装 + モジュールBの勝手なリファクタリング)を一つのPull Requestにまとめてプッシュしました。

これが、地獄の始まりでした。


「君は、俺を侮辱しているのか?」

数時間後。

PRのレビュー担当者(僕が「承」で尊敬していると書いた、あの「神」シニアエンジニア)から、チャットでメンションが飛んできました。

「(僕の名前)、ちょっといいか。君のPR、意味が分からない。会議室に来てくれ」

(あれ? 感謝の言葉じゃないのか?)

会議室に入ると、そこには「神」シニアエンジニアと、そして「モジュールB」のオーナーである「マーク」が、腕組みをして座っていました。

あれ、二人とも、なんか「ピクルス」探してた時と顔が違う。怖い。

プロジェクターに映し出されたのは、僕が送ったPRの差分(Diff)画面。

「神」シニアエンジニアが、静かに、しかし、とんでもない圧で口を開きました。

「(僕の名前)。君のタスクは『タスクA(新画面の実装)』だったはずだ。なぜ、このPRに『モジュールB』のコアロジックの変更が大量に含まれている?」

来た。僕はここで「配慮」をアピールするチャンスだと思いました。

「あ、はい! それは、モジュールBのコードが、その…ちょっとイケてない(設計が古い)状態だったので、僕の方で『直してあげた』んです。パフォーマンスも改善しましたし、こっちの方が絶対にベターです!」

その瞬間、会議室の空気が「凍結」しました。WPFアプリがUIスレッドで重い処理をやってフリーズする、あの感じです。

先に口を開いたのは、それまで黙っていたマークでした。

彼の顔は、怒りを通り越して、なんだか悲しそうでした。

「…『直してあげた』?」

「(僕の名前)。君は、俺を侮辱(insult)しているのか?」

「え?」

侮辱? 僕は「配慮」したのに?

「神」シニアエンジニアが、僕の混乱を打ち砕くように、ロジックを叩きつけてきました。

「まず第一に。君は**PRの『単一責任の原則(Single Responsibility Principle)』**を、完全に無視している。一つのPRには、一つの関心事(タスクA)だけを含めるべきだ。これじゃ、レビュー担当者は『タスクAの正しさ』と『モジュールBの正しさ』を、同時に検証しなければならない。レビューコストが爆発してる」

「第二に。君が『イケてない』と判断した、あのDispatcher.BeginInvokeを使っていた非同期処理。あれは、意図的にそう書かれているんだ」

「えっ」

「あのモジュールは、5年前に開発が終了した、とあるサードパーティ製の古いUIコンポーネント(※WPFあるある)と通信する必要がある。そして、そのクソみたいなライブラリは、async/awaitで(正確にはSynchronizationContextの扱いで)致命的なメモリリークを起こすバグが確認されてるんだ。だから『あえて』古いDispatcherを使った、あのダーティな(汚い)書き方で回避していた。君は、それを知らないで『綺麗』にした」

「……」

「第三に。そして、これが最も重要だ。

君は、なぜ、このコード(モジュールB)を変更する前に、オーナーであるマークに『相談(Discuss)』しなかった?」

僕は、絞り出すように答えました。

「それは…マークがシニアだし、公の場で指摘したら、あなたのメンツ(恥)になると思って…」

その瞬間、マークが、今度はハッキリと「怒り」の声を上げました。

「メンツだと? 君がやったことこそが、最大の『侮辱』だ!」

「君は、俺が『議論(ディスカッション)するに値しないエンジニアだ』と判断して、黙って俺のコード(仕事)を上書きしたんだぞ!」


「ロジック」の世界の、本当のルール

僕は、頭をハンマーで殴られたような衝撃を受けていました。

「起」「承」で学んだ「非ロジック(インフォーマル)」な文化。ケーキ、ピクルス、ビール。あれは、あくまで**「人間関係」**の潤滑油。

しかし、ひとたび**「技術(コード)」**の世界に戻れば、彼らは、僕が想像する以上に、**徹底的な「ロジック」と「透明性(Transparency)」**の信者だったんです。

僕の「日本的な配慮(メンツを潰さないように、こっそり直す)」という行為は、彼らのロジック(文化)では、こう翻訳されます。

「議論の放棄」

「責任の所在の曖昧化」

「独断による仕様変更」

「他者(オーナー)へのリスペクトの欠如」

つまり、僕が「和」だと思っていたものは、彼らにとっては「最悪のバグ」だったんです。

彼らにとっての「リスペクト」とは、「(相手がシニアだろうと)イケてないコードだと思ったら、公の場(PRコメント)で、ロジック(事実)をもって、ハッキリと指摘し、議論(Discuss)すること」でした。

「なぜ、この設計にしたんですか?」と、まず「質問」することでした。

黙って直すのは、「配慮」ではなく、「お前と話す時間すら無駄だ」という、エンジニアとして最大の「侮辱」行為。

「ケーキ」や「ピクルス」で築いたインフォーマルな信頼関係は、あくまで「ロジカルな議論(戦い)」を、感情的にならずにスムーズに行うための「土台(インフラ)」でしかなかった。

僕は、そのインフラの上で、何をすべきだったのか。

それは「仲良しごっこ」ではなく、C#のコードについて、WPFの設計について、徹底的に「議論」することだったんです。

僕は、「分かった気になっていた」だけでした。

この「良かれ」が生んだ大炎上。

僕は、PRを即刻Revert(取り消し)し、マークと「神」シニアエンジニアに平謝りしました。

そして、この失敗から、僕は「知ってよかった」どころではない、海外でエンジニアとして生き残るための、最も重要な「人生術」――本当の「議論の作法」――を、ゼロから学ぶことになります。

「議論(Discuss)」こそが、最強のデバッグツールだった

「君は、俺を侮辱しているのか?」

あの会議室で、マークに叩きつけられた言葉。それは、僕がWPFのコード上で数えきれないほど見てきたException(例外)のどれよりも、重く、そして痛烈な「エラー」でした。

僕の「良かれと思って」が、僕の「日本的な配慮」が、ここでは「バグ」どころか、システム(チーム)の根幹を揺るがす「セキュリティ侵害(=オーナーシップの侵害)」レベルの失態だった。

あの「転」の炎上から、僕はどうしたか。

「ロジック」の世界の住人である彼らに対し、日本的な「すみませんでした、以後気をつけます」という感情論だけの謝罪は、何の解決にもならない。それはすぐに分かりました。try...catchで例外を握りつぶす(catch {})のと同じで、根本原因(Root Cause)が解決しないからです。

僕は、まず「ロジカル」に謝罪することにしました。

あの会議の後、僕は関係者全員(マーク、神シニアエンジニア、そしてマネージャー)に、チャットでこう送りました。

「先ほどの件、本当に申し訳ありませんでした。

僕の行動は、以下の3点において、明確に間違っていました。

  1. PRの原則違反: 1つのPRに2つ以上の関心事(新機能とリファクタリング)を含め、レビューコストを不当に増大させたこと。
  2. オーナーシップの侵害: 『モジュールB』のオーナーであるマークの許可なく、コアロジックを独断で変更したこと。
  3. 議論の放棄: 技術的な疑問点(僕が『イケてない』と思ったコード)について、まず『なぜ(Why)』を質問し、議論することを怠ったこと。

特に3点目について、僕は『恥をかかせる』ことを恐れるあまり、議論そのものを避けるという、エンジニアとして最悪の選択をしました。これは『配慮』ではなく『侮辱』であったと、深く反省しています。

ついては、PRは即刻Revert(取り消し)します。

その上で、マーク。もし許してもらえるなら、あの『モジュールB』の歴史的経緯と、僕が理解できなかった『Dispatcherを使った設計』の意図を、時間がある時に教えていただけませんか?」


インフラ(信頼残高)が、僕を救った

この「ロジカルな謝罪」を送った時、僕の心臓は、WPFアプリでObservableCollectionを別スレッドから更新しようとした時くらい、バクバクしていました。「もうお前はクビだ」と言われてもおかしくない、と。

数分後、最初に返信をくれたのは、意外にも、あんなに怒っていたマークでした。

「(僕の名前)、OKだ。理解した。

謝罪(Ack)を受け取ったよ。君の分析は正しい。

あの『クソみたいなライブラリ』の話は、明日の『ケーキタイム』にでもしようじゃないか。コーヒー奢るぜ」

……え?

ケーキタイム?

僕は、拍子抜けすると同時に、全身の力が抜けるのを感じました。

そして、その直後、僕は「起」と「承」で学んだ「あの習慣」の、本当の意味を理解したんです。

もし、僕があのオフィスで、ひたすらデスクにかじりつき、技術書だけを読み、コードだけを書いていたら?

もし、僕が「ケーキ」の時間を「無駄だ」と拒否し、「ピクルス」探しを「バカバカしい」と無視し、「金曜のビール」に参加せず、彼らとの「インフォーマルな関係」がゼロだったら?

おそらく、僕の「ロジカルな謝罪」は、ただの「ロジカルな言い訳」として処理され、僕は「独断でコアモジュールを破壊しようとした、コミュニケーション能力ゼロのエンジニア」というレッテルを貼られ、再起不能(デッドロック)になっていたでしょう。

でも、違った。

彼らは、あの「一見、無駄な時間」を通して、「(僕の名前)は、変なヤツ(日本人)だけど、悪いヤツじゃない」「技術(C#)は好きみたいだ」「ピクルス探しのセンスはないが、ケーキは美味そうに食う」ということを知ってくれていた

あの「インフォーマルな時間」で築いた「信頼残高(クレジット)」が、僕の致命的な「エラー(炎上)」に対する「保険(セーフティネット)」として機能したんです。

「ケーキ」や「ビール」は、「ロジカルな議論(戦い)」を安全に行うための「インフラ」だった。

僕は、そのインフラの上で「技術的な議論」をすることをサボり、「日本的な配慮」という名の「技術的負債」を持ち込もうとして、炎上した。

そして、炎上した僕を救ってくれたのも、また、その「インフラ」だったんです。


【人生術】海外エンジニアが「知ってよかった」と叫ぶための3つのヒント

さて、僕の恥ずかしい失敗談(Exceptionログ)を長々と晒してきました。

この経験は、僕のC# WPFエンジニアとしてのキャリアにおいて、どんな技術書よりも、どんな設計パターンの本よりも、強烈な「学び(教訓)」となりました。

これから海外を目指す、あるいは今、海外で壁にぶつかっているエンジニアの皆さんに、僕が「これを知って、よかった」と心から言える「人生術」を3つ、共有します。

1. 「良かれ」と思うな、まず「Discuss(議論)」しろ

これが一番重要です。

「このコード、イケてないな」「こっちの方が効率的だな」

そう思った時、あなたの「良かれ」は、現地のエンジニアにとっては「侮辱」かもしれません。

沈黙(サイレント)は、絶対にダメです。

あなたが「配慮」だと思っている沈黙は、彼らにとっては「議論からの逃亡」「責任の放棄」と見なされます。

「なぜ、この設計なんですか?(Why?)」

「こういう代替案(Alternative)を考えたんですが、どう思いますか?」

公の場(PR、Issue、チャット)で、ロジック(技術)をもって、堂々と質問し、議論を仕掛けること。

それが、彼らにとっての最大の「リスペクト」です。

彼らは、メンツで仕事してるんじゃなく、ロジックで(WPFと)戦いたいんです。

2. 「文化のバグ」は、最高の「仕様書」だ

「ケーキ」「ピクルス」「金曜のビール」。

あなたが最初に出会う「それ、一体何?(What Even Is That?)」の瞬間。

それを「非効率だ」「無駄だ」と切り捨てるのは、一番簡単で、一番「損」な行動です。

それは「バグ」ではなく、その組織(文化)が、長い時間をかけて最適化してきた「仕様」である可能性が高い。

(WPFのDataGridがデフォルトでクソ重いのには、それなりの理由がある…かもしれない、みたいなもんです)

「なぜ、この習慣があるんですか?」

「どういう意味があるんですか?」

そうやって、笑いながら(インフォーマルな場で)聞いてみてください。

その「仕様書」を読み解くことが、その職場であなたがパフォーマンスを出すための、最強の「近道(ショートカット)」になります。

3. 「インフォーマルな時間」にこそ、全力で「投資」しろ

僕たちエンジニアは、技術(C#)の勉強(ハードスキル)には時間を惜しみません。

でも、海外で働くなら、それと「同じくらい」、あるいは「それ以上」に、**「インフォーマルな信頼残高を積む」**というスキル(ソフトスキル)に時間を「投資」してください。

ケーキタイムで雑談すること。

金曜日にビール片手に「今週最悪だったわー」と愚痴ること。

それは「サボり」ではありません。

それは、あなたが「転」で僕のような大炎上をやらかした時に、「まあ、アイツも悪気はなかったんだろ」と、マークのように笑って許してもらうための、最も重要な「保険」であり「インフラ」整備です。

技術力(ロジック)だけでは、人は動きません。

ロジックをスムーズに動かすための「感情(インフォーマル)」という名のUIスレッド。

この両方を「非同期(うまく両立)」で処理できてこそ、一流の海外エンジニアです。


海外で働くということは、C#やWPFという「技術言語」に加え、「文化」という名の、まったく新しい「プログラミング言語」を学ぶことに他なりません。

その「言語」には、バグ(非合理)に見える「仕様」が山ほどあります。

でも、その「仕様」を理解し、使いこなし、そして何より**「議論(Discuss)」**という最強のデバッグツールを使い倒した時。

あなたのエンジニアとしての「仕様」は、日本にいた頃とは比べ物にならないほど、たくましく、そして豊かに「アップデート」されているはずです。

「それ、一体何?」は、いつだって、新しい学び(new Learning())の入り口ですから。

コメント

タイトルとURLをコピーしました