「え、マジで?」――ロジックが通用しない世界へようこそ
どうも!海外のとある国で、日々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点において、明確に間違っていました。
- PRの原則違反: 1つのPRに2つ以上の関心事(新機能とリファクタリング)を含め、レビューコストを不当に増大させたこと。
- オーナーシップの侵害: 『モジュールB』のオーナーであるマークの許可なく、コアロジックを独断で変更したこと。
- 議論の放棄: 技術的な疑問点(僕が『イケてない』と思ったコード)について、まず『なぜ(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())の入り口ですから。

コメント