「C#だけじゃ生き残れない?モノリス時代からマイクロサービス時代へ、僕が見たアメリカのリアル」

  1. きっかけと問題意識
    1. ■ 渡米直後にぶち当たった“違和感”
    2. ■ モノリス思考が染みついたC#エンジニアの悲劇
    3. ■ 会議の言葉がわからない、ではなく“文脈”がわからない
    4. ■ C#のままでは“専門性”が足りない?
  2. マイクロサービス時代にC#エンジニアが取るべきアクション
    1. ■ 「まずはAzure触っとけ」と言われた理由
    2. ■ 使い慣れたC#で“分散アーキテクチャ”を学ぶ
    3. ■ C#エンジニアがDockerと仲良くなると世界が変わる
    4. ■ 「コードじゃなく、設計を語れ」が評価される現場
    5. ■ 日本で培った“丁寧な実装力”が活きた瞬間
  3. コードじゃ足りない。チームで生き残るための“ふるまい”
    1. ■ アメリカ現場での“評価軸”は「空気を読むこと」じゃなかった
    2. ■ 設計レビューは“ディベート”の場
    3. ■ 「Yes」と言わない、でも「No」だけでもダメ
    4. ■ Slackは“コード以外の人格”を伝える場所だった
    5. ■ “できるやつ”じゃなくて“信頼されるやつ”を目指す
    6. ■ 日本人エンジニアとしての強みを“翻訳”する
  4. C#は道具、あなた自身が価値になる時代へ
    1. ■ 「テクノロジー」よりも「視座」のほうが価値になる時代
    2. ■ 海外で得た“武器”は、C#の枠を超えて使える
    3. ■ 僕のキャリアは、“グローバル対応済みC#エンジン”で走っている
    4. ■ これから海外を目指すC#エンジニアに伝えたいこと
  5. ■ 最後に:C#の未来は、あなたの使い方次第

きっかけと問題意識

C#の仕事をしてると、「まあ、なんとかなるでしょ」って思ってませんか?
僕もそうでした。WPFでがっつりUI設計して、業務アプリを作り込んで、ちょっとしたパフォーマンスチューニングもお手の物。「C#には困ってないし、アメリカ行ってもそのまま通用するでしょ」――そう信じていた自分が、まさか“C#だけじゃ話にならない”瞬間に出くわすとは思ってもいませんでした。


■ 渡米直後にぶち当たった“違和感”

アメリカに来て最初の仕事。某中規模SaaS企業で、金融向けダッシュボードアプリのリファクタリングプロジェクトに入ったんですよ。
「WPF経験もあるし、WinFormsのレガシーコードも読める。これならいける」って思ったんですが……プロジェクトの話についていけない。

理由は明確でした。
**「このコード、全部マイクロサービスで再構築するんだよ」**って一言で、世界が変わったんです。


■ モノリス思考が染みついたC#エンジニアの悲劇

日本ではまだまだ**“一枚岩”のモノリシックなアプリ構成**が主流の会社、多いですよね?
プレゼンテーション層もビジネスロジック層もデータアクセス層も、すべて1つのアセンブリにまとまってて、クラス間の依存も強め。でもそれって、「ちゃんとした設計してる」っていう感覚がある。

だけど、アメリカの現場では違いました。
サービスは全部分解されて、API単位でスケール可能な構成
コードレビューでは「この処理はなぜ1つのサービスでやってるの?分離できるよね?」なんて普通に言われます。

僕のWPFで培った「UIとロジックをどう分離するか」的な議論とは、まったく次元が違いました。


■ 会議の言葉がわからない、ではなく“文脈”がわからない

例えば、会議で「Let’s decouple this logic to a worker service and hook it with Azure Event Grid」なんて話が出てくる。

「え、Worker Serviceって何?Event Gridってイベントログビューアの話じゃないの?」
完全に置いてけぼりです。

.NETの知識はあるのに、クラウド前提・スケーラビリティ前提の思考が全然足りてなかった。
「C#でコードが書けること」と「マイクロサービス時代に設計できること」は、まったく別のスキルセットだったんです。


■ C#のままでは“専門性”が足りない?

衝撃でした。
「え?でもC#って.NET Coreになって、Linuxでも動くし、Docker対応してるし、むしろ最強じゃないの?」って思ってた。
でも現場の人たちはこう言います。

“Yeah, C# is fine. But do you understand distributed systems?”

そう、問題は**「言語」ではなく「設計スキル」**だったんです。

C#はツールに過ぎない。
マイクロサービス時代に必要なのは「どう分離し、どうつなぎ、どうモニタリングし、どうスケールさせるか」という**“考え方”のほう**だった。

マイクロサービス時代にC#エンジニアが取るべきアクション

あの“置いてけぼり会議”から、僕のエンジニア人生は静かに激変していきました。
「これじゃ通用しない」って思った瞬間から、C#の“コード職人”じゃなく、“設計できるエンジニア”に進化しなきゃって腹をくくったんです。


■ 「まずはAzure触っとけ」と言われた理由

上司(といってもすごくフランクなシニアエンジニア)に相談したら、
**「まずAzure触れ。特にFunctionsとApp ServiceとEvent Grid」**って即答されました。

なんでAzure?って思うかもしれません。AWSもGCPもあるのに。
でも**C#エンジニアにとってAzureは“伸びしろの宝庫”**だったんです。

  • Visual Studioや.NETとの親和性が高い
  • Azure Functionsで“イベント駆動型”の考え方が自然に身につく
  • ドキュメントがC#前提で書かれていて読みやすい

WPFで慣れたVisual Studioの快適さを保ちつつ、クラウドネイティブなアプリを“遊び感覚”で構築できる
まずはローカルでAzure Functionsを書いて、イベントトリガーでDBにデータ入れるだけの簡単なアプリを作ってみたら……もう目から鱗でした。


■ 使い慣れたC#で“分散アーキテクチャ”を学ぶ

次に試したのが、Microsoftが公開してる eShopOnContainers

これは.NETで構築されたマイクロサービス・サンプルアプリで、

  • 各サービスがgRPCやRabbitMQでつながってたり
  • Identity Serviceが認証を受け持ってたり
  • Dockerで全部立ち上がったり

とにかく「これが実務か!」っていうリアリティが満載でした。

重要だったのは、新しい言語を覚えなくても、既存のC#スキルの延長線で“マイクロサービス的思考”が学べること。

この体験を通じて、

  • サービス間通信の責任範囲
  • ステートレスとスケーラビリティの考え方
  • ログとモニタリングの重要性

といった、今まで無意識に「自社のITインフラ任せ」にしていた部分を設計視点で理解するようになったんです。


■ C#エンジニアがDockerと仲良くなると世界が変わる

マイクロサービス=Docker。これは避けられない。

最初は「仮想環境?それってHyper-Vじゃダメなの?」って戸惑ったけど、使ってみて驚きました。
Dockerfileに「dotnet publish」書くだけで、C#アプリがどこでも動く。

しかも、Visual Studio 2022以降はDocker連携も進んでて、ローカルデバッグもボタンひとつ。
WPFでローカルだけ完結してた頃とは全く違う、「どこでも、誰とでも動くアプリ」が作れるようになってきた実感がありました。

このときに学んだ技術:

  • Docker & docker-compose
  • ASP.NET Core Minimal API
  • gRPC (高パフォーマンスなサービス間通信)
  • Azure Container Registry & Azure App Service

特にMinimal APIはC#でも「必要な機能だけ書ける」って感覚があって、サービス分割には最適でした。


■ 「コードじゃなく、設計を語れ」が評価される現場

ある日、コードレビューでこう言われたんです。

“Your implementation is clean, but can you explain your boundary decision?”

え、**境界設計の意図まで問うの?**って最初は面食らいました。

でも、これがアメリカの現場で求められてる“設計スキル”の正体でした。

マイクロサービス時代の現場では、

  • 「なぜこのサービスはここで責務を切ってるのか」
  • 「このイベントはどのチームに通知すべきなのか」
  • 「この処理を同期で行うと何がボトルネックになるか」

みたいな「コードの外側の設計判断」が日々問われる。

この思考に慣れてくると、「ただのC#コーダー」から「設計もできるC#エンジニア」に一歩踏み出した実感がありました。


■ 日本で培った“丁寧な実装力”が活きた瞬間

ちなみに、日本での経験が無駄になったかというと、全然そんなことはなかったです。

特に、

  • UI設計で気を配るユーザー体験の視点
  • WPFのMVVMパターンで鍛えた責務分離
  • レビューで指摘されない“安定した実装”

これはアメリカでも評価されます。

「この人、なんでこんなにコード崩れないの?」って言われたとき、
「あ、それ日本の現場で叩き込まれました(笑)」って笑いながら答えたのを覚えてます。

ただ、その上で**「設計意図を言語化して共有できること」が新しい評価軸**だったんです。

コードじゃ足りない。チームで生き残るための“ふるまい”

スキルのキャッチアップがひと段落したある日、僕はふと気づいたんです。
「技術はある。でも、まだチームの“仲間”にはなれてないかもしれない」って。


■ アメリカ現場での“評価軸”は「空気を読むこと」じゃなかった

日本の開発現場では、相手の意図を察して、黙って対応して、
「気が利くな」と思われることで信頼を得てきました。

でも、アメリカは違う。
黙ってる=関与してない、理解してないと思われる。

だから最初のうちは、
「おれ、空気読んで動いてるのに評価されない」
って、地味にへこんでました(笑)。


■ 設計レビューは“ディベート”の場

初めて設計レビューに出たとき、かなり衝撃を受けました。
全員が自分の意見をガンガン出してぶつけ合うんです。

  • 「このサービスはこっちの責務じゃない?」
  • 「そのAPI非同期にする意味ある?」
  • 「Event GridよりService Busの方がよくない?」

僕は最初、その空気に圧倒されて黙ってました。
でもそのままだと、「この人は設計に興味ないんだ」って思われてしまう。

で、ある日思い切って、

「このユースケースって、ユーザー登録よりも支払い完了をトリガーにした方が自然じゃないですか?」

って意見を出したら、「いいね、それ、理由ある?」って、ちゃんと聞いてくれたんです。
技術的に完璧な意見じゃなくても、発言することで会話の一部になれる。
これが、僕にとっての最初の“文化突破”でした。


■ 「Yes」と言わない、でも「No」だけでもダメ

文化的なギャップでもうひとつ苦戦したのは、「断り方」。

日本では、「あ、それちょっと難しいですね…」って曖昧に断ることが多いですが、
アメリカでは、それだと「結局どうするの?」と逆に混乱を招く。

一方で、「No, that’s impossible」と即答すると、「ネガティブな人」と取られる。

ある先輩が教えてくれた“魔法のフレーズ”がこちら。

“I see your point. One thing I’m concerned about is…”

これを使えば、

  • 相手の意見を否定せずに、
  • 自分の技術的な懸念を丁寧に伝えられる。

つまり、「反対する」のではなく「一緒に考える」スタンス

この言い回しを覚えてから、設計レビューや朝会でも、意見が通りやすくなった気がします。


■ Slackは“コード以外の人格”を伝える場所だった

意外なところでも信頼構築のカギがありました。
それが、Slackなどのチームチャット。

日本の感覚だと、業務外のことをSlackで書くのって「サボってる感」があるけど、
アメリカではむしろ**“雑談こそがチームビルディング”**。

ある日、チームの誰かが「My dog turned 3 today!」って写真貼ってたから、
「So cute! Happy birthday to your dog!」って返したら、
その日の夕方には「Hey, Hiro, wanna join us for lunch Friday?」って誘われてました(笑)。

Slackの雑談で“人間味”を見せることが、チームに溶け込むためのファストパスだったんです。


■ “できるやつ”じゃなくて“信頼されるやつ”を目指す

時間が経つにつれて、僕のコードレビューにコメントが少なくなっていきました。
最初は「見てもらえてないのか?」って不安だったけど、違いました。

ある同僚がこう言ってくれたんです。

“I trust your judgment, Hiro. You always think through your boundaries.”

つまり、「あいつの設計は安心できる」って思ってもらえていたんです。

それって、C#の知識やクラウドの知識を超えて、
設計の意図を伝え、会話をし、信頼を積み重ねることで得られたものだった。


■ 日本人エンジニアとしての強みを“翻訳”する

僕たちが日本で身につけてきたものって、
実はすごく海外でも通用する。でも、伝え方を変えなきゃ伝わらない。

  • 丁寧な設計 → 「Why this approach?」にちゃんと答える
  • テストの網羅性 → 「How did you ensure coverage?」で具体的に説明する
  • 段取り力 → JiraやNotionで可視化して伝える

つまり、スキルを“ローカル言語”から“グローバル言語”に翻訳していく作業が必要だったんです。

C#は道具、あなた自身が価値になる時代へ

アメリカで働き始めてから1年半。
気づけば、週次の設計レビューで**“ファシリテーター役”を任されるまでになっていました。**

C#のコードが書けるだけだった僕が、
クラウドアーキテクチャを語り、設計会議をリードし、
チームの中核として**「意思決定の一員」になった。**

そしてこの経験が、僕自身の「キャリア観」を大きく塗り替えてくれたんです。


■ 「テクノロジー」よりも「視座」のほうが価値になる時代

最初は、C#だけで何とかしようとしてました。
でも現場に入って分かったのは、“言語”よりも“構造”を考える力が重要だということ。

たとえば、こんな質問がよく飛んできます:

  • 「このアーキテクチャ、スケールに耐えられる?」
  • 「このサービス、他のチームに再利用される想定ある?」
  • 「障害が起きたとき、どこをログで追える?」

これって、C#でどう書くかというより、どう設計するか・どう守るかの話ですよね。

そう、求められているのは「道具の使い方」じゃなく、
“構造と価値”を考えられる人間なんです。


■ 海外で得た“武器”は、C#の枠を超えて使える

今、僕が次に取り組んでいるのは、BtoB向けのSaaS製品の設計リード

C#は変わらず使ってるけど、それは「中心」じゃなく「選択肢の1つ」になりました。

  • バックエンドは .NET 8 + gRPC
  • 一部サービスは Node.js(API Gateway用)
  • インフラは Azure Kubernetes Service(AKS)
  • 分析は Pythonでバッチ処理

昔の僕だったら、「他言語ムリ!」ってなってたかもしれないけど、
今は「問題に対してベストな解決策を構成できるか」が軸になってる。

それは、C#を軸にクラウドや分散設計を学び、
チームと対話しながら意思決定を積み重ねた日々があったからこそ、できるようになったことなんです。


■ 僕のキャリアは、“グローバル対応済みC#エンジン”で走っている

僕が海外での経験を通じて再定義した自分の価値、それは:

「C#で描ける設計図を、グローバル基準で翻訳し、提案できる人」

たとえば、こんな場面でそれを実感します:

  • オフショアチームとのやりとりで、英語で設計意図を共有
  • 非C#エンジニアにも分かる形でサービス構成を説明
  • ビジネス側の人に「この設計がどうビジネス価値に貢献するか」を言語化

つまり、「C#で動くモノを作れる」だけじゃなく、
**「チームを動かせるエンジニア」**に成長できた、ということなんです。


■ これから海外を目指すC#エンジニアに伝えたいこと

もし、この記事を読んでいるあなたが、

  • C#しか使ったことがない
  • 英語は得意じゃない
  • モノリスでの開発が中心
  • クラウドもDockerも触ったことない

そんな状況だったとしても、大丈夫です。僕もまったく同じスタートでした。

大切なのは「スキルセット」じゃなく、「マインドセット」。

つまり、

  • わからないことを素直に認めて、
  • 小さく手を動かして、
  • チームと会話して、
  • 成長の余地を楽しめること。

そして、“技術者”から“設計者”へ、さらに“価値提案者”へと進化する勇気です。


■ 最後に:C#の未来は、あなたの使い方次第

モノリシックなアプリケーションが悪いわけじゃない。
WPFでUIを美しく作るのも素晴らしい。
でも、もし「このままでいいのかな」と思っているなら――

C#を“書く”だけでなく、“語れる”ようになってみてください。

クラウドに載せて、イベントドリブンにして、サービス単位で語れるようになったとき、
あなたのC#スキルは世界で通用する「武器」になります。

そしてその武器は、**誰かに雇われるためのものではなく、
“チームに価値を提供するための道具”**になるはずです。

そのとき、あなた自身が**モノリス(ひとりの職人)から、マイクロサービス(価値の集まり)**へと進化しているはずです。


コメント

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