孤独なコーダーからの脱却:なぜ僕たちは「誰のために」書くのかを見失うのか
やあ、みんな。今日も異国の地で、Visual Studioのダークモードとにらめっこしてるかな?
僕はここ数年、海外の企業でC#とWPF(Windows Presentation Foundation)を使って、デスクトップアプリケーションの設計開発をメインにやっている。WPFって、XAMLでUIを書いて、C#でロジックを組んで、MVVMパターンで綺麗に分離して…ってやってると、すごく「職人」的な喜びに浸れるんだよね。特に海外に来て最初の頃は、英語でのコミュニケーションに自信がない分、**「コードこそが世界共通言語だ」**なんて自分に言い聞かせて、ひたすら技術の世界に引きこもっていた時期があった。
でも、今日はちょっとその「技術の殻」を破る話をしたいと思う。テーマは**「The Invisible Threads(見えない糸)」**。
僕たちが日々紡いでいるコードは、単なるテキストの羅列じゃない。それは、組織の中の様々な人たちと僕たちを繋ぐ「見えない糸」なんだ。この糸が見えていないと、どれだけ綺麗なコードを書いても、どれだけ最新の.NETの機能を使っても、海外でのエンジニアライフはハードモードのまま。逆に、この糸が見えるようになれば、君の評価は爆上がりするし、何より仕事が劇的に楽しくなる。
これから話すのは、僕が失敗から学んだ「コネクテッド(繋がっていること)」の重要性についてだ。まずは、僕たちのすぐ近くにいる「糸の先」にいる人たち、つまり**「直近のステークホルダー」**について、解像度を上げて見ていこう。
1. 言語の壁の向こうにいる「ユーザー」という存在
まず最初に繋がる糸の先、それは当然「ユーザー」だ。「そんなの当たり前だろ」って思うかもしれない。でも、海外で働いていると、この当たり前がすごく難しくなるんだ。
日本で働いていた時は、ユーザーの要望や文句は、なんとなく肌感覚で理解できた。でも海外だと、文化も違えば、商習慣も違う。WPFで作った業務アプリの画面一つとっても、彼らが「直感的だ」と感じる動線は、僕たちの感覚とズレていることがよくある。
例えば、ある入力フォームのバリデーションロジックを実装していた時のこと。僕は「エラーがあれば即座に赤枠で表示して、ツールチップで理由を出すのが親切」だと思って実装した。技術的にもそれが正解だと思ったし、IDataErrorInfoインターフェースを使ってスマートに書いたつもりだった。
でも、現地のユーザーからは大ブーイング。「うるさい」って言われたんだ。彼らの業務フローでは、スピード重視でガンガン入力して、最後にまとめてチェックしたいというニーズがあった。僕の「親切」は、彼らにとっては「邪魔な糸」でしかなかったわけだ。
ここで重要なのは、「要件定義書(チケット)に書かれていること」と「ユーザーが本当にしたいこと」の間には、必ず乖離があるということ。特に英語のチケットを翻訳して理解したつもりになっていると、このニュアンスを完全に見落とす。
ユーザーという糸を手繰り寄せるには、コードを書く前に「なぜこの機能が必要なのか?」「彼らはどんな環境で、どんな気分でこれを使うのか?」を、想像力をフル動員して考える必要がある。もし可能なら、実際に彼らが働いている現場を見せてもらうのが一番だ。画面の向こうにいるのは「User」という抽象的な概念じゃなくて、コーヒーを飲みながら必死にノルマを達成しようとしている「ボブ」や「アリス」なんだってことを、常に意識しておかないといけない。
2. 戦友であり、最初の壁である「チームメンバー」
次に繋がる糸は、同じ開発チームのメンバーだ。GitHubでのプルリクエスト(PR)、毎朝のスタンドアップミーティング、ペアプログラミング。彼らとは一番太い糸で繋がっている。
海外のチームに入って驚いたのは、「Why(なぜ)」への執着心だ。
日本では「ここはこういう仕様だから」で通じることも、こっちでは「なぜこのアーキテクチャを選んだ?」「なぜここでこのライブラリを入れる?」「メンテナンスコストはどうなる?」と、徹底的に突っ込まれる。
最初は「俺のコードを信用してないのか?」なんて卑屈になったりもしたけど、違うんだよね。彼らは、僕が書いたコードが将来的に自分たちの足枷にならないか、つまり**「技術的負債という名の腐った糸」**をチームに持ち込もうとしていないかを真剣にチェックしているんだ。
C#やWPFは自由度が高い。データバインディング一つとっても、やり方は無数にある。そこで「動けばいいや」で書いたスパゲッティコードは、チーム全体の生産性を落とす。言葉の壁がある僕たち外国人エンジニアにとって、コードの可読性(Readability)こそが最大のコミュニケーションツールになる。
「美しいコードを書く」というのは、自己満足のためじゃない。**「未来のチームメンバー(それは半年後の自分かもしれない)へのラブレター」**なんだ。この意識があるかないかで、チーム内での信頼残高(Trust Battery)の貯まり方が全然違ってくる。信頼があれば、英語が多少拙くても、みんな耳を傾けてくれるようになるからね。
3. 翻訳者であり、門番である「プロダクトマネージャー(PM)」
そして、エンジニアにとって最も厄介で、かつ最も頼りになる糸の先、それがプロダクトマネージャー(PM)だ。
彼らはビジネスサイドの要求(カオス)を、開発可能なタスク(秩序)に変換してくれるフィルターのような存在。でも、海外のPMは日本のPM以上に「ビジネスバリュー」にシビアだ。「技術的に面白いからやりたい」なんて理由は、1ミリも通用しない。
ある時、僕はWPFのパフォーマンス改善のために、レンダリング周りのロジックを大幅にリファクタリングしようと提案したことがある。技術的には絶対に必要なことだった。でも、PMの反応は冷ややかだった。「それで、ユーザーの売上は上がるの?」「その工数で、新しい機能を追加したほうが顧客満足度は上がるんじゃない?」
僕は言葉に詰まった。技術的な正しさを説明する英語力不足もあったけど、根本的に**「ビジネスへの糸」**が切れていたんだ。
PMが見ているのはコードじゃない。市場であり、競合であり、ROI(投資対効果)だ。僕たちが技術的な提案をする時は、必ず彼らの言葉(ビジネスインパクト)に翻訳して伝える必要がある。「コードが綺麗になります」じゃなくて、「画面の描画速度が20%向上することで、ユーザーの待ち時間が減り、1日の処理件数が増えます」と言わなきゃいけない。
この「PMとの糸」を太くすることは、自分の身を守ることにも繋がる。無理なスケジュールや理不尽な仕様変更が降ってきた時、日頃からビジネス視点で会話ができているエンジニアなら、PMも「彼が言うなら本当に無理なんだろう」と耳を傾けてくれる。逆に、ただ技術の話しかしないエンジニアは、「また面倒くさがって言い訳してる」と捉えられかねない。
「見えない糸」の地図を描け
ここまで、ユーザー、チーム、PMという、僕たちのすぐ近くにいるステークホルダーとの関係性を見てきた。
どうだろう? 今君が書いているそのpublic void Execute()メソッドの先に、ボブの顔や、チームメンバーの苦笑いや、PMの渋い顔が見えてきたかな?
海外で働くエンジニアにとって、技術力は「あって当たり前」の前提条件だ。そこから一歩抜きん出て、現地で尊敬され、必要とされる存在になるためには、この**「Stakeholder Mapping(関係者の地図化)」**が欠かせない。
自分が書くコードが、誰のどんな喜びに繋がり、誰のどんな痛みを解決するのか。その糸を一本一本丁寧にたぐり寄せ、結び直していく作業。それこそが、ただの「コーダー」から「プロフェッショナルなエンジニア」へと進化するための第一歩なんだ。
そして、この地図にはまだ続きがある。
僕たちの仕事の影響範囲は、実はこの3者だけにとどまらない。君が何気なく変更したデータベースのスキーマ一つが、あるいはAPIのレスポンス形式の小さな変更が、遥か遠くの部署に激震を走らせることもある。
そう、次の章では、この糸がどのように広がり、組織全体に波及していくのか。「バタフライ・エフェクト」ならぬ、**「The Ripple Effect(波及効果)」**について話していこう。営業担当が青ざめ、サポートデスクの電話が鳴り止まなくなる…そんな悪夢のような(でも現実に起こりうる)シナリオと共にね。
準備はいいかい?
ここからが、本当の意味での「Connectedness(接続性)」の話だ。
バタフライ・エフェクト:君の書いた1行が、営業とサポート部門を震え上がらせる理由
前回は、僕たちエンジニアの半径5メートル以内にいる「チームメンバー」や「PM」との見えない糸について話したね。彼らはまだいい。言葉も(ある程度)通じるし、技術的な文脈も共有しやすい。
でも、組織というのはもっと広くて複雑だ。君がVisual Studioで何気なくコミットしたその1行のコードが、コンパイルを通ってデプロイされた瞬間、君の知らないところでバタフライ・エフェクト(蝶の羽ばたきが地球の裏側で竜巻を起こす現象)を引き起こすことがある。
今回は、エンジニアの聖域である開発ルーム(あるいは自宅のデスク)を一歩出て、**「他部署」という荒野に伸びる糸について話そう。具体的には、「Sales(営業)」「Marketing(マーケティング)」そして「Support(カスタマーサポート)」**だ。
海外で働いていると、彼らとの衝突は日本以上に激しい。なぜなら、欧米の企業文化では、各部署がそれぞれのプロフェッショナリズムと権利を強烈に主張するからだ。「なあなあ」では済まない。
1. Sales(営業):デモ画面で冷や汗をかく「約束の守り人」たち
まず、最も緊張感のある糸の先、それが「Sales」だ。
ある時、こんなことがあった。WPFアプリのUI更新で、あるボタンの配置を「UX的にこちらのほうが自然だから」という理由で右から左へ移動させた。MVVMパターン的にはViewの些細な変更だ。ロジックには影響しない。僕は「使いやすくなった」と満足してリリースした。
その翌日、営業担当のマイケルが僕のデスクに鬼の形相でやってきた。「おい! デモ中に何をしてくれたんだ!」
話を聞くと、彼はクライアントへの重要なプレゼン中だったらしい。彼が長年練習し、体に染み込ませた「勝利のデモフロー」があった。彼は画面を見ずに話しながら、無意識にマウスを右に動かしてクリックした――が、そこにあるはずのボタンがない。
デモは中断し、彼はパニックになり、クライアントの信頼は揺らいだ。
僕にとっての「たかがUIの改善」は、彼にとって「商談成立を阻む地雷」だったんだ。
海外のSalesは、基本給が低くコミッション(歩合)が高いことが多い。つまり、彼らにとってプロダクトの動作は生活(Life)そのものだ。彼らは技術的な正しさなんてどうでもいい。「約束した通りに動くか」「顧客に見せて恥ずかしくないか」だけを見ている。
ここで学ぶべきは、**「機能変更のリップルエフェクト(波及効果)」**だ。
技術的な変更を行う際、それが「営業トーク」や「デモシナリオ」にどう影響するかを想像できているか?
もしUIを変えるなら、事前にSalesチームにSlackでスクリーンショットを投げて、「Hey, 次のバージョンでここ変わるけど、来週重要なデモある?」と聞くだけで、悲劇は防げる。この一手間を惜しむと、とんでもないしっぺ返しを食らうことになる。
2. Marketing(マーケティング):ストーリーを売る「語り部」たち
次に繋がるのは「Marketing」だ。彼らはプロダクトの機能を「物語」に変えて市場に届ける役割を担っている。
エンジニアは往々にして、「バックエンドのパフォーマンス改善」や「リファクタリングによる堅牢性の向上」に情熱を注ぐ。C#の最新機能を使ってコードをスリム化できたときは快感だよね。
でも、マーケティング担当からすれば、「で? それで何がすごいの?」という話になる。
僕が経験した失敗は、リリースノートの記述だ。
新バージョンのリリース時、僕は技術的な変更点を詳細に書いた。「WPFのレンダリングエンジンを最適化し、メモリリークを解消」と。
しかし、マーケティングチームが欲しかったのは「ユーザー体験がどう変わったか」というストーリーだった。彼らはその情報を元にニュースレターを書き、SNSで拡散する。
「メモリリーク解消」という言葉は、顧客には「今までバグってたのかよ」というネガティブな印象を与えかねない。マーケティング的な正解は「アプリケーションの動作がより軽快になり、長時間使用してもストレスフリーになりました」だ。
エンジニアとしての「誠実さ(正確な技術情報の開示)」と、マーケティングとしての「魅力付け」の間には、常に緊張関係がある。
ここでも「見えない糸」を意識する必要がある。僕たちが実装する機能は、彼らにとっての「弾薬」だ。弾込めもせずに「戦ってこい」とは言えない。
新しい機能を実装する時は、**「これはプレスリリースでどう表現されるだろう?」**と考える癖をつけること。もし可能なら、開発の初期段階でマーケティング担当とランチに行って、「今度こんな機能作るけど、これって売りになるかな?」と聞いてみるといい。彼らの目が輝けば、その機能は間違いない。逆に「ふーん」という反応なら、それは自己満足の機能かもしれない。
3. Support(カスタマーサポート):最前線の「防波堤」たち
そして最後に、絶対に忘れてはならないのが「Customer Support(CS)」だ。彼らはエンジニアにとっての命綱であり、同時に最大の犠牲者になりうる存在だ。
想像してほしい。君が書いたコードが予期せぬ例外(Exception)を吐いた時、最初に怒鳴られるのは誰か? 君じゃない。CSのメンバーだ。彼らは君の代わりに、顧客の怒りを受け止め、謝罪し、何とか状況を収めようとする防波堤だ。
僕がまだ未熟だった頃、エラーハンドリングをおろそかにしていた。「try-catch で囲ってログ出しとけばいいや」くらいに思っていた。
ある日、CSのリーダーから呼び出された。
「この『Unknown Error has occurred. (Error Code: 0x999)』って何? お客さんにどう説明すればいいの? 『回避策』はあるの?」
僕は答えに窮した。ログを見ないとわからない。でもログはお客さんのPCの中だ。
CSが求めているのは、原因究明のための詳細なスタックトレースじゃない(それは僕らが見るものだ)。彼らが欲しいのは、**「顧客に伝えるべき次の一手(Actionable Advice)」**だ。
「入力データが不正です。CSVのフォーマットを確認してください」なのか、「サーバーが混雑しています。5分待って再試行してください」なのか。
エラーメッセージ一つで、CSの対応時間は天と地ほど変わる。わかりにくいエラーは、CSの工数を奪い、彼らの精神を削り、結果的にエンジニアへのエスカレーション(問い合わせ)となって自分に跳ね返ってくる。
**「Supportability(サポートしやすさ)」**も立派な機能要件だ。
コードを書く時、常に「このエラーが出た時、CSのサラは顧客に何と言えばいい?」と自問する。それができれば、君はCSチームのヒーローになれる。
組織という名の「分散システム」をハックせよ
Sales、Marketing、Support。彼らはエンジニアとは異なる言語(KPI、リード、CSATなど)で話し、異なる価値観で動いている。
これを「面倒くさい」と切り捨てるのは簡単だ。
「俺はコードを書くのが仕事で、売るのはお前の仕事だろ」と壁を作ることもできる。これをDevOpsの世界では**「Wall of Confusion(混乱の壁)」**と呼ぶけれど、この壁を作って得することは一つもない。
プロフェッショナルなエンジニアであるということは、C#の文法を極めることだけじゃない。組織という巨大な「分散システム」の中で、各コンポーネント(部署)が円滑に通信できるようにプロトコルを設計することも含まれるんだ。
君の技術的決定(Technical Decision)は、必ずビジネス的結果(Business Consequence)をもたらす。
その「糸」が見えるようになれば、君のコードの質は変わる。
「UIを変えるからSalesに連絡しよう」「エラーメッセージをCS向けに書き直そう」「この機能の売りをMarketingと話そう」。
そうやって紡いだ糸の数だけ、君は組織の中で「替えのきかない存在」になっていく。海外というアウェイの環境で生き残るために、これほど強力な武器はない。
さて、ここまで「ステークホルダーへの影響」と「他部署への波及効果」について話してきた。
理屈はわかった。でも、現実はそう甘くないよね?
「わかっていても、やってしまう」のが人間だし、システムだ。
次回の【転】では、僕が実際にやらかした**「戦慄のケーススタディ」**を紹介しよう。
それは、ほんの数行のコード修正、しかも「良かれと思ってやった修正」が、いかにして組織全体を巻き込む大事故に繋がったかという、今思い出しても冷や汗が出る失敗談だ。
教訓は教科書からは学べない。血の味がする失敗からしか学べないこともある。
心の準備をして待っていてほしい。
戦慄のケーススタディ:「些細な修正」が引き起こした組織崩壊の危機と、そこから学んだ教訓
ここまで、「コードは組織全体と繋がっている」と偉そうに語ってきたけれど、正直に告白しよう。
僕がこのことを骨の髄まで理解できたのは、ある一つの「大事故」を引き起こしたからだ。
それは、入社して1年が経ち、仕事にも慣れ、海外生活の自信もついてきた頃のことだった。今でも、あの日のSlackの通知音が夢に出てくることがある。
これは、たった一つの「列挙型(Enum)」の修正が、会社の収益報告システムを破壊し、物流を止め、僕をクビ寸前まで追い込んだ、地獄の3日間の記録だ。
善良なる動機と、完璧なテスト
当時の僕は、レガシーコードの撲滅に燃えていた。
僕たちがメンテナンスしていたWPFの基幹システムには、いわゆる**「マジックナンバー(Magic Number)」**が散乱していた。
C#
// 悪い例
if (order.Status == 4)
{
// ...出荷処理
}
「4って何だよ!?」と叫びたくなるよね。仕様書を掘り返すと、どうやら「Shipped(出荷済み)」を意味しているらしい。でも、別の場所では「5」が「Delivered(配送完了)」だったり、ドキュメントとコードが乖離していたりして、カオス状態だった。
「これは技術的負債だ。僕が綺麗にしなきゃいけない」
正義感に燃えた僕は、これをモダンな設計にリファクタリングすることにした。C#のEnumを定義し、コードの可読性を高める。エンジニアとして至極真っ当な判断だ。
C#
public enum OrderStatus
{
Pending = 1,
Processing = 2,
Shipped = 4, // わかりやすい!
Delivered = 5
}
さらに、バックエンドのAPIとの通信部分でも、JSONのシリアライザ設定を調整して、数値(Integer)ではなく、可読性の高い文字列(String)としてステータスを扱うように変更した。
“Status”: 4 よりも “Status”: “Shipped” の方が、デバッグもしやすいし、フロントエンド(WPF)とバックエンドの疎通も明確になる。
単体テストはオールグリーン。QAチームの回帰テストも通過した。
「これでコードが綺麗になった。未来のエンジニアは僕に感謝するだろう」
そんな傲慢な達成感と共に、僕はその変更を金曜日の午後にリリースした。(そう、禁断の「Read-Only Friday」を破ってね…)
沈黙の週末と、月曜日の悲鳴
土日は何事もなく過ぎた。アラートも鳴らない。完璧なリリースだったと思われた。
しかし、月曜日の朝、オフィスに着くと空気が凍りついていた。
普段は陽気なSalesのディレクターが、顔を真っ赤にして叫んでいる。
物流部門のマネージャーが、頭を抱えて座り込んでいる。
そして、僕のボス(CTO)が、死神のような顔で僕のデスクに立っていた。
「週末の売上が、ゼロだ」
ボスが低い声で言った。
「は? そんなはずはありません。サーバーは稼働してるし、エラーログも出ていません」と僕は反論した。WPFアプリも正常に動いているし、注文データもDBに入っているのを確認していたからだ。
「違う。『倉庫』が動いていないんだ」
見えない糸の正体:「ゾンビシステム」の逆襲
原因を調査するのに半日かかった。そして判明した事実は、僕の血の気を引かせるのに十分だった。
僕が変更したのは、WPFアプリとメインのWeb APIだけだった。
しかし、この会社には、誰も管理していない、ドキュメントにも載っていない**「幽霊のようなサブシステム」**が存在していたんだ。
それは、創業当初に誰かが書いた、古いWindowsサービスだった。そのプログラムは、データベースを直接監視し、注文ステータスを見て倉庫のロボットに指示を出していた。
そのプログラムのコードはこうなっていた(後で逆コンパイルして震えた)。
SQL
SELECT * FROM Orders WHERE Status = 4
そう、データベースのカラム型は変えていなかったが、僕がAPI層でJSONのシリアライズ設定を変えたことで、アプリケーションが保存する値の「意味」が変わってしまっていたのだ。あるいは、関連するストアドプロシージャが、文字列の "Shipped" を数値の 0 や NULL として黙って変換し、エラーを吐かずにデータを保存していた。
結果、データベース上のステータスは、その古いプログラムが期待する「4」ではなくなっていた。
倉庫システムはずっと「注文なし」と判断し続け、週末に入った数千件のオーダーは一件も出荷されず、倉庫の床に積み上がっていたのだ。
さらに悪いことに、経理部門が使っているExcelのマクロも、この「4」という数値をハードコーディングで参照して売上集計をしていた。
だから、経営陣が見ていたダッシュボードには「売上:$0」と表示され、投資家向けのレポート作成が大混乱に陥っていた。
僕が見ていた「WPFとAPIの世界」は綺麗になった。
でも、その外側に広がる「物理的な倉庫」と「経営の数字」という現実世界との糸を、僕は無慈悲に断ち切ってしまったんだ。
Chesterton’s Fence(チェスタートンのフェンス)
「なぜコードを書き換えた?」
事後検証会議(Post-Mortem)で、物流マネージャーに詰め寄られた。
「コードを綺麗にするためです。可読性を上げるためです」
僕は必死に技術的な正当性を主張した。
その時、普段は無口なシニアエンジニアのデイビッドが、静かに言った。
「君はチェスタートンのフェンスを知っているか?」
「道の真ん中にフェンスが立っている。君は『邪魔だし、何のためにあるかわからないから撤去しよう』と考える。でも、それは間違いだ。『なぜそのフェンスがそこに立てられたのか』を知るまでは、決してそれを撤去してはいけない」
「あの汚いマジックナンバーの『4』は、ただの怠慢で書かれたものじゃなかった。10年前、当時のシステム間の連携を最もシンプルに保つために、あえて残された『共通言語』だったんだ。君はそれを、背景も調べずに『汚い』という理由だけで撤去した。だから狼が入ってきたんだ」
その言葉は、僕のエンジニアとしてのプライドを粉々に砕いた。
僕は「コードの綺麗さ」という自分の美学を優先し、そのコードが背負っている「歴史」と「責任」を無視したのだ。
信頼を取り戻すための代償
その後の復旧作業は地獄だった。
データを手動で修正し(SQLを手書きで数千行…)、倉庫システムを再起動し、怒り狂う顧客への謝罪メールの文面をCSチームと一緒に考えた。
「エンジニアの仕事じゃない」なんて言えなかった。これは僕が引き起こした災害だからだ。
結局、僕がクビにならなかったのは、ボスが「高い授業料を払ったんだから、元を取るまでは辞めさせない」と守ってくれたからだ。
でも、それまで積み上げてきた「技術力のある日本人エンジニア」という評価は消え失せた。残ったのは「ビジネスを理解していない、危険なコーダー」というレッテル。
そこから信頼を取り戻すのには、1年以上かかった。
コードを書く前に、泥臭いドキュメントを読み漁り、古株の社員に「この変な仕様、何か歴史的経緯ありますか?」と聞き回る。
「Change Impact Analysis(変更影響分析)」というドキュメントを誰よりも丁寧に書く。
そんな地味な活動を続けるしかなかった。
失敗の先に見た「全体性」
この失敗は、痛みを伴うものだったけれど、僕の視座を強制的に引き上げてくれた。
コードエディタの中だけが僕の世界じゃない。
僕がタイプする文字は、倉庫のロボットを動かし、トラックを走らせ、遠く離れた誰かの生活に届く荷物になり、会社の銀行口座の数字になる。
その「繋がり」を肌で感じた瞬間、恐怖とともに、奇妙な感動も覚えたんだ。
「ああ、僕たちは本当に、世界を動かしているんだな」と。
リファクタリングは悪くない。改善は善だ。
でも、「Ignorant Improvement(無知な改善)」は、時として「Malicious Attack(悪意ある攻撃)」と同じ破壊力を持つ。
この教訓を胸に刻んだ僕は、もう以前のような「孤独な職人」ではいられなくなった。
僕は「見えない糸」を見るための眼鏡を手に入れたんだ。
そして物語は、最後の結論へと向かう。
失敗から立ち直り、本当の意味での「Connected Engineer」へと成長するために、僕たちが明日から具体的に何をすべきか。
次回、最終章**「結」**で、そのロードマップを提示しよう。
全体を見るエンジニアへ:見えない糸を操り、信頼という資産を築くためのロードマップ
あの「倉庫システム停止事件」から、数年が経った。
今の僕は、以前と同じようにC#でコードを書き、WPFでUIを作り続けている。使っているキーボードも、愛用のVisual Studioの配色テーマも変わらない。
でも、僕の中で「エンジニアリング」という言葉の定義は、完全に別のものに書き換わった。
以前の僕にとって、エンジニアリングとは**「コンピュータとの対話」だった。いかに効率的なアルゴリズムを組み、いかに美しい構文で命令を与えるか。
しかし今の僕にとって、エンジニアリングとは「組織という巨大な有機体の中枢神経を設計すること」**だ。
僕たちが書くコードは、血管であり、神経だ。そこには血液(データ)が流れ、痛み(エラー)が走り、栄養(ビジネス価値)が運ばれる。
この「見えない糸」が見えるようになった今、僕がどのように働き方を変え、そしてその結果、海外という厳しい環境でどうやって「替えのきかないポジション」を確立したのか。
最後に、僕が実践している「Connected Engineer(繋がっているエンジニア)」になるための具体的なロードマップを共有したい。これは精神論じゃない。生存戦略だ。
1. 「Gemba(現場)」への越境:一次情報を取りに行け
トヨタ生産方式の「現地現物」は、ソフトウェア開発でも真理だ。
あの失敗の後、僕はコードを書く時間を少し削って、他部署の現場に顔を出す時間を強制的に作った。
- Salesのデモに同席させてもらう「技術的なサポートが必要かもしれないから」という口実で、営業のオンライン商談にミュートで参加させてもらった。そこで初めて、クライアントがどこで頷き、どこで眉をひそめるかを目の当たりにした。WPFのグリッドコントロールのスクロールが少しカクつく場面で、営業担当が一瞬焦るのがわかった。「パフォーマンス改善」の優先度が、僕の中で「Nice to have(あれば良い)」から「Must(必須)」に変わった瞬間だ。
- CSの問い合わせログを朝一番に読むJiraのチケットになる前の、生の問い合わせチャットを眺める。そこには、ユーザーの生々しい叫びがある。「ボタンが小さくて押しにくい」「エラーの意味がわからない」。これは宝の山だ。
海外のオフィスでは、エンジニアは「地下室の住人」になりがちだ。でも、自分からドアを開けて「Hey, 調子はどう?」とSalesやCSの席に行ってみてほしい。
最初は「何しに来たの?」という顔をされるかもしれない。でも、「君たちの仕事を楽にするツールを作りたいんだ」と言えば、彼らは喜んで苦労話(ネタ)を提供してくれる。
一次情報を持っているエンジニアは強い。PMとの議論でも、「現場ではこう言っていた」という事実は、どんな理論武装よりも強力な武器になる。
2. 「なぜ(Context)」をコードに残す:未来への手紙
「転」で話したチェスタートンのフェンスの教訓から、僕はコードの書き方、特にコメントとコミットメッセージの質を劇的に変えた。
以前のコミットメッセージ:
Fix: Enum value update
(何をしたかはわかるが、なぜしたかが不明)
今のコミットメッセージ:
Fix: OrderStatus Enum definition update
Reason: Marketing requested clarity on ‘Shipping’ vs ‘Dispatched’ for upcoming promo campaign. (Ticket #1234)
Impact: Verified backward compatibility with Warehouse Service v1.2. (See integration test suite A)
コードそのものは「How(どう動くか)」を語る。だからこそ、コメントやドキュメントには徹底的に**「Why(なぜそうしたか)」と「Context(背景)」**を残すんだ。
「なぜここでこの非推奨のメソッドを使っているのか(答え:レガシーシステムとの互換性のため)」「なぜこの処理は非同期じゃないのか(答え:UIスレッドの競合を避けるため)」
これをやるようになってから、チームメンバーからの「What is this?(これ何?)」という質問が激減し、代わりに「Great insight(いい洞察だ)」という感謝が届くようになった。
英語が母国語じゃない僕たちにとって、ドキュメントは「時間をかけて推敲できる最強のプレゼン資料」だ。口頭での議論で負けても、論理的なドキュメントを残しておけば、最終的に信頼は勝ち取れる。
3. 「ドメイン言語」を話す:技術用語からの脱却
C#やWPFの専門用語(Dependency Property, ObservableCollection, LINQ…)は、エンジニア同士でしか通じない方言だ。
経営陣や他部署と話すときは、意識的に**「ユビキタス言語(Ubiquitous Language)」**、つまりビジネスの共通言語を使うようにした。
「リファクタリングが必要です」ではなく、「技術的負債により、新機能の追加にかかる時間が20%増大しています。これを解消することで、来四半期のリリースサイクルを加速できます」と言う。
「サーバーがダウンしました」ではなく、「現在、チェックアウト機能が停止しており、1時間あたり約5000ドルの機会損失が発生しています。復旧見込みは30分後です」と言う。
技術をビジネスの文脈に翻訳する能力。これこそが、シニアエンジニアとジュニアエンジニアを分ける分水嶺だ。
特に海外では、ジョブディスクリプション(職務記述書)に書かれていなくても、全員がビジネスへの貢献を求められる。
「僕はコードを書く人」というアイデンティティを捨て、「僕は技術を使ってビジネスの問題を解決する人」と名乗ろう。そうすれば、周りの扱いは劇的に変わる。
4. 共感(Empathy)駆動開発
そして最後に、最も大切なのが**「想像力」という名の共感**だ。
画面の向こうにいるユーザー。
隣の席で頭を抱えるPM。
深夜にアラート対応をするインフラ担当者。
そして、半年後にこのコードを読む自分自身。
キーボードを叩く前に、一呼吸置いて、彼らの顔を思い浮かべる。
「この例外メッセージで、CSのサラは顧客をなだめられるか?」
「このUI変更で、倉庫のボブは作業効率が落ちないか?」
「このクラス設計で、新人のジョンは迷わずに実装できるか?」
技術力とは、単に難しいコードが書けることじゃない。
自分の技術が、他者に与える影響(インパクト)を制御できる力のことだ。
優しさや配慮と言ってもいいかもしれない。ロジカルな世界であるプログラミングにおいて、最終的に差をつけるのは、この「人間的な温かみ」を含んだ設計思想なんだ。
結び:糸を紡ぐ者(Weaver)として
海外で働いていると、孤独を感じることがあると思う。
言葉の壁、文化の壁、そして技術の壁。
でも、忘れないでほしい。君が書いているそのC#のコードは、確実に世界と繋がっている。
君の指先から生まれた論理(ロジック)が、誰かの仕事を助け、誰かの決断を支え、組織という大きな織物を形作っている。
僕たちは単なる「Coder」じゃない。組織全体を繋ぎ合わせ、強固にする**「Weaver(紡ぎ手)」**なんだ。
あの失敗をしたあの日、僕は辞めなくて本当によかったと思う。
あそこで逃げ出していたら、この景色は見えなかった。
「見えない糸」が見えるようになった今、仕事は以前よりずっと複雑で、責任重大で、そして何倍も面白い。
さあ、Visual Studioを開こう。
今日もまた、新しい糸を紡ぐために。
君の書く一行が、チームを、組織を、そして世界を、少しだけ良い場所に変えることを信じて。
Happy Coding, and Stay Connected.

コメント