誰も語らない「レガシーコード」の真実と、海外現場で学んだ「書き直さない」勇気
こんにちは、あるいはこんばんは。
今、このブログをどこの国で、どんなタイムゾーンで読んでいるだろうか?
僕は今、オフィスの窓から見える異国の街並みを眺めながら、少し冷めたコーヒーを片手にこれを書いている。
僕の仕事は、C#とWPFを使った設計開発だ。
「え、今さらWPF?」と思ったそこのあなた。正直でよろしい。
確かに、世の中はWeb系技術やAI、クラウドネイティブな話題で持ちきりだ。Reactだ、Flutterだ、あるいはPythonでの機械学習だと、キラキラした技術スタックがタイムラインを埋め尽くしている。
そんな中で、デスクトップアプリケーション、しかもWPF(Windows Presentation Foundation)を主戦場にしているというと、「レガシー技術の墓場守り」のように聞こえるかもしれない。
けれど、海外の現場に出てみて痛感したことがある。
それは、**「世界はレガシーコードで回っている」**という厳然たる事実だ。
特に、金融、医療、製造業といったミッションクリティカルな領域では、10年、いや15年前に書かれたコードが現役バリバリで動いている。それらは「古い」からといって、決して「無価値」ではない。むしろ、企業の長年のノウハウ、ビジネスロジック、泥臭い例外処理のすべてが詰まった、とてつもない「資産」なのだ。
今日は、そんな「遺産(レガシー)」と対峙し、そこから新しい価値を生み出すための**「The Unconventional Innovation Toolkit(型破りなイノベーション・ツールキット)」**について話をしようと思う。
これから海外で働きたいと思っているエンジニア、あるいは日本で既存システムの保守開発に閉塞感を感じているあなたにこそ、読んでほしい。
「全部書き直したい」という悪魔の誘惑
海外に来て最初のプロジェクトでのことだ。
僕の目の前には、継ぎ接ぎだらけの巨大なモノリシックなWPFアプリケーションがあった。
XAMLはスパゲッティのように絡まり合い、ViewModelには数千行のビジネスロジックが詰め込まれ、Code Behindには「// Do not touch(触るな)」というコメントが亡霊のように漂っている。
コンパイルを通すだけで一苦労。機能追加のたびに別の場所がバグる、まさに「モグラ叩き」の状態だった。
当時の僕は、意気揚々とこう提案した。
「こんなスパゲッティコード、メンテナンス不可能です。最新のアーキテクチャで、ゼロから書き直しましょう(Rewrite)!」
日本人の勤勉さと技術力を見せてやる、と意気込んでいた。
しかし、現地のシニアエンジニア、仮にボブとしよう。ボブは僕の提案を聞いて、少し悲しそうな顔で首を横に振った。
「君の言うことは技術的には正しい。でも、ビジネス的には自殺行為だ」
ボブが教えてくれたのは、「The Big Rewrite(大規模な書き直し)」の罠だった。
既存システムを捨ててゼロから作り直すプロジェクトは、統計的に見ても失敗する確率が極めて高い。
なぜか?
既存コードの中には、ドキュメント化されていない「暗黙の仕様」や「エッジケースへの対応」が無数に含まれているからだ。それらを全て洗い出し、新システムで再現するには、途方もない時間とコストがかかる。
そして何より、開発している数年間の間、ビジネスは止まってくれない。新しい競合が現れ、市場のニーズは変化する。
「2年かけて完璧なシステムを作りました!」とリリースした頃には、そのシステムはもう「時代遅れ」になっているのだ。
「いいか、エンジニアの仕事は『きれいなコードを書くこと』じゃない。『ビジネスの価値を継続的に届けること』だ」
ボブの言葉は、技術志向に偏っていた僕の頭をガツンと殴ったようだった。
海外の現場はシビアだ。結果(Value)が出なければ、即座にプロジェクトは解散、下手をすればレイオフだ。
「コードを綺麗にするために半年ください」なんて甘えは通用しない。
求められているのは、走りながらエンジンを交換するような技術なのだ。
既存資産という名の「鉱脈」
そこで必要になるのが、今日紹介する**「The Unconventional Innovation Toolkit」**だ。
これは、古びたシステムを「負債」として見るのではなく、再利用可能な「資源」として捉え直すアプローチだ。
想像してみてほしい。
目の前にある巨大な泥団子のようなコード。
これをただ捨てるのは簡単だ。でも、その泥の中には、過去のエンジニアたちが血眼になって解決したビジネス上の課題解決策(アルゴリズム)という「宝石」が埋まっている。
その宝石だけを綺麗に取り出し、研磨し、新しい台座(モダンな環境)に乗せ換えることができたら?
それこそが、真のイノベーションではないだろうか。
ゼロからAIを作るのも素晴らしいが、既に動いている信頼性の高いロジックを、API化してスマホアプリから呼べるようにするだけでも、ビジネスにとっては革命的なインパクトがある。
僕たちが目指すべきは、破壊的なスクラップ&ビルドではない。
「Feature extraction(機能の抽出)」
「API-fication(API化)」
「Microservices(マイクロサービス化)」
この3つのステップを用いた、既存システムへの敬意ある「昇華」だ。
特にC#やWPFといった堅牢な言語・フレームワークで作られたシステムは、型安全であり、構造化されていることが多い(たとえスパゲッティであっても、解析可能なスパゲッティだ)。
これらは、モダンなWeb APIやクラウドサービスへと変貌を遂げるための、最高の素材になり得る。
海外エンジニアとしての「付加価値」
少し視点を変えて、キャリアの話をしよう。
これから海外に出ようとしているエンジニアの皆さん。
英語がネイティブ並みに話せて、最新のWebフレームワークも完璧に使いこなせる現地のエンジニアと、どうやって戦うつもりだろうか?
同じ土俵で戦っても、言葉のハンデがある分、僕らは不利だ。
しかし、**「レガシーシステムを理解し、それをモダンな世界へ橋渡しできる能力」**を持っているとしたらどうだろう?
これは、驚くほど重宝される。
なぜなら、どこの国の企業も、捨てられないレガシーシステムを抱えて困っているからだ。
「古いコードも読めるし、最新のアーキテクチャへの移行パスも描ける」
このポジションは、実はブルーオーシャンだ。
「古い技術しか知らないおじさん」でもなく、「新しい技術しか知らない若者」でもない。
過去と未来を繋ぐエンジニア。
これこそが、僕が海外で生き残ってこられた生存戦略の核心だ。
このブログシリーズで伝えること
このシリーズでは、単なる精神論ではなく、C#エンジニアとしての具体的な技術論に踏み込んでいく。
次回以降の展開を少しだけ予告しておこう。
まず**【承】**では、「Feature extraction techniques」に焦点を当てる。
WPFのViewModelに癒着したロジックを、どうやって依存性を断ち切り、純粋なC#クラスとして救出するか。DI(依存性注入)やインターフェースを駆使した、まさに外科手術のようなテクニックを紹介する。ここでは、ReSharperなどのツールを使った具体的なリファクタリングの手順にも触れるつもりだ。
続く**【転】**では、「API-fication」と「Microservices」だ。
抽出したロジックを、ASP.NET Coreを使ってWeb API化し、Dockerコンテナに閉じ込める。
巨大なWPFアプリの一部を切り出し、バックエンドサービスとして独立させ、フロントエンド(WPFやWeb)から利用する。
いわゆる「ストラングラー・パターン(絞め殺しパターン)」と呼ばれる、稼働中のシステムを徐々にモダン化していく実践的なガイドになる。
そして最後の**【結】**では、そうした技術的な変革が、チームやビジネスにどのような影響を与えるのか、そしてエンジニア自身のキャリアをどう変えるのかについて語りたい。
冒険の準備はいいか?
「レガシーコード」という言葉に、うんざりした顔をするのはもうやめよう。
それは、未開のジャングルであり、宝の山だ。
必要なのは、適切な地図と、錆びないツールキット、そして少しの遊び心だ。
あなたが今、保守しているその画面、そのロジック。
そこには、世界を変えるイノベーションの種が眠っているかもしれない。
それを掘り起こす旅に、これから一緒に出かけよう。
コーヒーはもう飲み干してしまったかい?
さあ、IDEを開こう。冒険の始まりだ。
外科手術的アプローチ:複雑に絡み合った機能(Feature)を綺麗に切り出す「抽出」の美学
さて、IDEを開いて深呼吸をしたところだろうか。
前回の「起」では、既存システムを「書き直す(Rewrite)」のではなく「再利用する」ことの重要性を説いた。
今回は、その具体的なハウツー、**「Feature extraction(機能の抽出)」**について話そう。
これは、絡み合ったスパゲッティの中から、特定の麺一本だけを、ソースを飛び散らせずに引き抜くような作業だ。
あるいは、巨大な岩の塊から、ダイヤモンドの原石だけを削り出す「外科手術」と言ってもいい。
海外の現場では、このスキルは「Refactoring(リファクタリング)」という言葉以上に、**「Decoupling(疎結合化)」**という文脈で非常に重視される。
なぜなら、ここがうまくいかないと、次のステップである「クラウド移行」や「マイクロサービス化」なんて夢のまた夢だからだ。
悲劇の始まり:Fat ViewModelという怪物
WPFやMVVM(Model-View-ViewModel)パターンを採用しているプロジェクトで、最もよくある悲劇。
それは、**「ViewModelが何でも知りすぎている」**ことだ。
本来、ViewModelは「View(画面)の状態」を管理するためのものだ。
しかし、現場のコードを見てみるとどうだろう?
ボタンのクリックイベント(ICommand)の中に、データベースへの接続処理、複雑な税金計算ロジック、CSVファイルのパース処理、果てはログ出力まで、全てがべったりと書かれていないだろうか?
これを僕は親しみを込めて(そして憎しみを込めて)**「God Class(神クラス)」**と呼んでいる。
5000行を超えるMainViewModel.cs。
regionディレクティブで隠された、触るのも恐ろしいプライベートメソッドの山。
この状態のコードは、再利用性がゼロだ。Webアプリに移植したいと思っても、ViewModelはSystem.WindowsやUIスレッドに依存しており、切り離せない。
ここで必要なのが、「抽出(Extraction)」の美学だ。
Step 1: 「純粋なロジック」と「UIの都合」を仕分ける
まずやるべきは、コードの「断捨離」だ。
メソッドの一つ一つを見て、自分に問いかけてほしい。
「これは、画面(UI)がないと成立しない処理か?」
例えば、「計算結果を画面のテキストボックスに表示するためにプロパティを更新する」処理は、UIの都合だ。ViewModelに残すべきだ。
しかし、「入力値を受け取って、税率を掛けて、割引を適用する」計算そのものは?
これはUIとは無関係な、純粋な**ビジネスロジック(ドメインロジック)**だ。
海外のテックリードは、コードレビューで口を酸っぱくしてこう言う。
“Keep logic pure.”(ロジックを純粋に保て)
WPFの依存関係(PresentationFramework.dllなど)を一切持たない、純粋なC#のクラス(POCO: Plain Old CLR Object)として、その計算処理を定義できるか?
ここが勝負の分かれ目だ。
Step 2: インターフェースという「契約書」を作る
ロジックを特定したら、いきなりコピペで移動させる前に、**インターフェース(Interface)**を定義しよう。
これが、レガシーコードというカオスな世界に秩序をもたらす「境界線」になる。
例えば、複雑な価格計算ロジックがあるなら、以下のようなインターフェースを切る。
C#
public interface IPriceCalculator
{
decimal Calculate(Order order);
}
たったこれだけ? と思うかもしれない。
だが、この「たったこれだけ」が、強固な結合を断ち切る「ナイフ」になる。
ViewModelは、具体的な計算ロジック(実装クラス)を知る必要はない。「IPriceCalculatorという契約を持った何か」が計算してくれることだけを知っていればいい。
この思考の転換が、**Dependency Injection(依存性の注入)**への第一歩だ。
日本の現場では「DIコンテナなんて大袈裟だ」と敬遠されることもあるが、海外では標準装備だ。テスト容易性(Testability)のないコードは、コードとして認められないことすらある。
Step 3: 移植手術(The Extraction)
さあ、いよいよ執刀だ。
ViewModelの中に埋もれていた計算ロジックを、新しいクラス(例えばStandardPriceCalculator)に移植し、先ほどのインターフェースを実装させる。
ここで重要なのは、**「依存関係の逆転」**だ。
新しいクラスには、MessageBox.Show(画面表示)やDispatcher(スレッド制御)といったUI由来のコードを一切持ち込んではいけない。
もしエラー通知が必要なら、それは戻り値や例外として呼び出し元(ViewModel)に返し、表示の責任はViewModelに持たせる。
この作業は地味で、忍耐が必要だ。
絡まり合った糸を一本一本ほぐすように、変数のスコープを確認し、副作用(Side Effects)がないかを見極める。
ReSharperのようなリファクタリングツールを使えば、「Extract Method(メソッドの抽出)」や「Extract Class(クラスの抽出)」機能が強力な味方になってくれるだろう。
Step 4: 独立したライブラリへの隔離
抽出したクラス群が、System.WindowsなどのUIライブラリに依存していないことを確認したら、それらを別のプロジェクト(Class Library)に移動させよう。
僕はよく、Core や Domain という名前のプロジェクトを作る。
ここに入ったコードは、もはや「WPFアプリの一部」ではない。
コンソールアプリからも、ユニットテストからも、そして将来的には**ASP.NET CoreのWeb APIからも呼び出せる「再利用可能な資産」**へと昇華されたのだ。
この瞬間こそ、エンジニアとして最も脳汁が出る瞬間だ。
巨大な泥団子の中から、ピカピカに磨かれた宝石(ロジック)を取り出し、ショーケース(クラスライブラリ)に並べたような達成感。
ボブ(前回登場したシニアエンジニア)なら、こう言ってウィンクするだろう。
“Now, it can fly.”(これで、こいつはどこへでも飛んでいけるな)
なぜ「抽出」がイノベーションなのか?
「コードを綺麗にしただけじゃないか」と思うだろうか?
いや、これは単なる整理整頓ではない。未来への投資だ。
次回の「転」で詳しく話すが、こうして抽出された「純粋なロジック」があって初めて、システムをAPI化し、マイクロサービスへと分解することが可能になる。
逆に言えば、この「抽出」のフェーズを飛ばして、いきなり最新技術(コンテナやクラウド)を導入しようとしても、それは「汚部屋にルンバを放つ」ようなものだ。すぐに詰まって動かなくなる。
海外で働くエンジニアとして、僕が評価されたのは、派手な新機能を作った時ではない。
この地味な「抽出」作業によって、**「テストが書ける状態」**を作り出し、バグの発生率を劇的に下げ、将来的なWeb化への道筋(ロードマップ)を具体的に示した時だった。
明日からのアクション
あなたの担当しているコードの中に、500行を超えるメソッドはないだろうか?
あるいは、「もし明日、この機能をスマホアプリでも使いたいと言われたら?」と想像してみてほしい。
冷や汗が出たら、それが「抽出」のチャンスだ。
まずは小さなメソッド一つからでいい。
UIの依存を剥がし、インターフェースを切り、独立させる。
その小さな一歩が、巨大なレガシーシステムを動かすレバレッジ(てこ)になる。
準備はできたか?
切り出した「部品」たちが、次のステージでどのように組み合わさり、新たな生命を吹き込まれるのか。
次回、【転】モノリスの逆襲:API化とマイクロサービス化で、その全貌を明らかにしよう。
Web API、Docker、そしてクラウド。現代の武器庫がいよいよ解放される。
モノリスの逆襲:API化とマイクロサービス化で、古いシステムをゾンビのように蘇らせる禁断の術
前回、僕たちは血の滲むような思いで、巨大なWPFアプリ(モノリス)から「価格計算ロジック」という宝石を摘出した。
それは今、MyCompany.Core.Pricing.dll という、なんの変哲もないクラスライブラリとして手元にある。
「で、これがどうしたの? まだWPFアプリの一部でしょ?」
そう思うかもしれない。だが、ここからが魔法の時間だ。
この小さなDLLは、もはやデスクトップアプリの部品ではない。
適切な衣装を着せてやれば、世界中のどこからでもアクセス可能な**「マイクロサービス」**へと進化するポテンシャルを秘めているのだ。
海外の現場で僕が目撃してきたのは、古いコードを捨てるのではなく、**「Wrapping(包み込む)」**ことで蘇らせる、ある種のネクロマンシー(死霊魔術)にも似た技術だった。
Step 1: API-fication(API化)という「現代の衣装」
まずやるべきは、抽出したロジックを ASP.NET Core Web API でラップすることだ。
C#エンジニアの皆さんなら、ここはホームグラウンドだろう。
新しいWeb APIプロジェクトを作成し、前回作った MyCompany.Core.Pricing.dll を参照に追加する。
そして、Controller(コントローラー)を作る。やることはシンプルだ。HTTPリクエスト(JSON)を受け取り、あの「抽出したロジック」に投げ、結果をJSONで返すだけだ。
C#
[ApiController]
[Route("api/[controller]")]
public class PriceController : ControllerBase
{
private readonly IPriceCalculator _calculator;
// ここで前回抽出したインターフェースが活きる!
public PriceController(IPriceCalculator calculator)
{
_calculator = calculator;
}
[HttpPost]
public ActionResult<decimal> Calculate([FromBody] Order order)
{
// レガシーロジックの再利用
var result = _calculator.Calculate(order);
return Ok(result);
}
}
見てほしい。
あんなにWPFのViewModelの中でスパゲッティになっていたロジックが、今や立派な RESTful API として生まれ変わった。
この瞬間、このロジックは「Windows PCにインストールされたアプリ」という呪縛から解放されたのだ。
iPhoneアプリからでも、Linuxサーバー上のPythonスクリプトからでも、このAPIを叩けば、長年企業が培ってきた「正しい価格計算」を利用できる。
これが 「API-fication(API化)」 の威力だ。
ゼロからロジックを書き直す必要はない。ただ「入り口」を変えるだけで、資産価値は何倍にも跳ね上がる。
Step 2: Dockerコンテナへの「封印」
次に行うのが、**コンテナ化(Containerization)**だ。
作成したWeb APIを、Dockerイメージにビルドする。
「WindowsのコードだからWindows Serverじゃないと動かないんじゃ…?」
いいや、違う。
もし君が「承」のパートで、正しくUI依存(System.Windowsなど)を排除し、純粋な .NET Standard や .NET 6/8 クラスライブラリとして抽出できていれば、このコードは Linuxコンテナ 上で動く。
これが意味することは革命的だ。
重厚長大なWindowsアプリの一部が、軽量なLinuxコンテナとして、AWSのFargateやAzure Container Appsの上で、安価に、そして大量にスケールできるようになるのだ。
「ブラックフライデーでアクセスが急増したから、価格計算サービスだけ100台に増やす」なんてことが、クリック一つで可能になる。
かつてオンプレミスのサーバー室で埃をかぶっていたコードが、クラウドの大空を飛び回る姿を想像してみてほしい。痛快じゃないか?
Step 3: Strangler Fig Pattern(絞め殺しのイチジク)
さて、新しいAPIができたからといって、すぐに古いWPFアプリを捨てられるわけではない。
ここで登場するのが、**「Strangler Fig Pattern(ストラングラー・フィグ・パターン)」**だ。
これは、熱帯の植物「絞め殺しのイチジク」に由来する。
宿主となる大木(レガシーシステム)に種を落とし、徐々に根を張り巡らせ、最終的には宿主を枯らして、自分自身が新しい木として入れ替わるという、エンジニアリング界で最も物騒な名前のデザインパターンだ。
具体的にはこうだ。
- 特定機能のAPI化: 今回のように「価格計算」だけをまずAPI化し、マイクロサービスとして稼働させる。
- リダイレクト: 既存のWPFアプリを修正し、内部で計算ロジックを実行する代わりに、作成したWeb API(マイクロサービス)をHTTP経由で呼び出すように変更する。
- Before:
var price = new StandardPriceCalculator().Calculate(order); - After:
var price = await _priceApiClient.GetPriceAsync(order);
- Before:
- 段階的移行: これを機能ごとに繰り返す。「在庫確認」「ユーザー認証」「注文処理」…。
- モノリスの死: 全ての機能がAPIとして外に出された時、元のWPFアプリは単なる「ガワ(UI)」だけになる。あるいは、そのUIさえもWebアプリ(React/Vue)に置き換えられているかもしれない。
この手法の素晴らしい点は、「ビッグバン・リリース」のリスクがないことだ。
システム全体を止めることなく、動き続けながら、細胞の一つ一つを新しいものに入れ替えていく。
もしAPIに不具合があれば、すぐに元の内部ロジック呼び出しに戻せばいい(Feature Toggleを使えば一瞬だ)。
海外現場でのリアル:マイクロサービスは「目的」ではない
ここで一つ、海外の現場での教訓をシェアしたい。
「マイクロサービス」という言葉は魅力的だが、それはあくまで「手段」だ。
僕の同僚のアーキテクトはよくこう言っていた。
“Don’t build microservices. Build monoliths that can be broken down.”(マイクロサービスを作るな。分解可能なモノリスを作れ。)
最初から細かく分割しすぎると、今度は「分散コンピューティングの複雑さ」という別の地獄を見ることになる。
まずは、WPFアプリというモノリスの中で、機能(Feature)を綺麗にモジュール化・疎結合化すること(承の内容)が先決だ。
綺麗に分かれてさえいれば、API化して別プロセス(マイクロサービス)に切り出すのは、必要になったタイミングでいつでもできる。
僕たちが目指すのは、「なんとなくカッコいいアーキテクチャ」ではない。
**「変更に強く、ビジネスの速度に合わせて進化できるシステム」**だ。
古いシステムの一部をAPI化して外に出すことは、そのシステムの新陳代謝を促す最良の治療法なのだ。
次回予告:冒険の終わり、そして始まり
ここまでくれば、君はもう単なる「保守担当者」ではない。
レガシーコードという鉱脈から資源を掘り出し、精製し、クラウドという市場に流通させる「プラントエンジニア」だ。
しかし、技術だけでは語れないことがある。
こうした変革を進める時、一番の壁になるのは実は「コード」ではなく「人」や「組織」だ。
「なんで動いているものを触るんだ」「リスクを取るな」という声に、どう立ち向かうか。
最終回となる次回、【結】エンジニアの価値は「コード」じゃない。
この技術的な変革を、どうやってチームの文化、そして自分自身のキャリアの変革に繋げていくか。
海外でサバイブするための、最後のマインドセットをお伝えしよう。
エンジニアの価値は「コード」じゃない:未来へ繋ぐ架け橋としての働き方と、明日から使えるマインドセット
長い旅だった。
スパゲッティコードに絶望した「起」。
泥臭いリファクタリングに汗を流した「承」。
そして、古いシステムがマイクロサービスとして蘇る興奮を味わった「転」。
今、あなたの手元にあるのは、単なる「整理されたコード」ではない。
過去(レガシー)と未来(モダン)を繋ぐ、強靭な「架け橋」だ。
最終回となる今回は、PCの画面から少し顔を上げて、私たち自身のキャリアと、これからのエンジニアのあり方について話をしたい。
海外の荒波の中で僕が気づいた、**「技術力」よりも大切な「生存本能」**の話だ。
生成AI時代の「人間の価値」
今、私たちの業界は激震の只中にある。
GitHub CopilotやChatGPTに頼めば、綺麗なC#のコードも、完璧なReactのコンポーネントも、数秒で生成される時代だ。
「コードを書くスピード」や「構文の知識」だけで勝負していたエンジニアは、残念ながら淘汰されていくだろう。
では、AIには真似できない、人間にしかできない仕事とは何か?
それは、**「文脈(Context)を読み解き、橋を架けること」**だ。
15年前に書かれたWPFのコードには、当時のビジネスの苦悩、法的な制約、顧客との泥臭い約束事が、コメントにも残らない「空気」として埋め込まれている。
「なぜ、ここでこんな非効率な処理をしているのか?」
AIはそれを「バグ」と判定するかもしれない。しかし、実はそれが特定のVIP顧客のための重要なワークアラウンド(回避策)だったりする。
この**「歴史的背景」を理解した上で、現代の技術(クラウドやコンテナ)へと安全に翻訳してあげる能力**。
これこそが、僕たちのような「レガシーとモダン」の両方を知るエンジニアの独壇場なのだ。
海外のテック企業が、高い給料を払ってでもシニアエンジニアを雇う理由はここにある。
彼らが欲しいのは、最新のフレームワークだけを知っている「コーダー」ではない。
カオスな既存システムを恐れず、ビジネスを止めずに、次世代へと軟着陸(Soft Landing)させてくれる**「パイロット」**なのだ。
「Bridge Builder(架け橋)」としてのキャリア
僕は自分の職種を「ソフトウェアエンジニア」と名乗っているが、心の中では**「Bridge Builder(橋を作る人)」**だと思っている。
- 技術の架け橋: .NET Framework 4.5 と .NET 8 の間を繋ぐ。
- 組織の架け橋: 「動けばいい」という保守チームと、「最新技術を使いたい」というイノベーションチームの間を取り持つ。
- 時間の架け橋: 過去の遺産(レガシーコード)を、未来の資産(マイクロサービス)へと変換する。
この「Toolkit」シリーズで紹介した技術(抽出、API化、ストラングラーパターン)は、すべて「橋」を架けるための道具だ。
この視点を持つと、キャリアの景色が一変する。
「古い技術しか使わせてもらえない」と嘆く必要はない。
その古い技術こそが、イノベーションの燃料だ。
あなたが抽出したたった一つのクラスライブラリが、会社のDX(デジタルトランスフォーメーション)の起爆剤になるかもしれないのだ。
恐怖を好奇心に変える「Wabi-Sabi」のマインド
海外生活で学んだもう一つのことは、**「不完全さを受け入れる強さ」**だ。
日本人の僕は、どうしても「完璧で美しいコード」を目指したくなる。
しかし、現実は常に汚く、不完全だ。
ここで、日本の**「侘び寂び(Wabi-Sabi)」**の精神が役に立つ。
古びて、ひび割れ、継ぎ接ぎだらけのレガシーコード。
それを「汚い」と忌み嫌うのではなく、そこに長い年月を生き抜いてきた「強さ」や「味」を見出す。
スパゲッティコードの中に、必死にビジネスロジックを守ろうとした先人の痕跡を見つけた時、僕は怒りではなく、ある種の敬意を感じるようになった。
「よくぞ今まで、ビジネスを支えてきてくれた。あとは僕に任せてくれ」
そう思えた瞬間、恐怖は好奇心に変わる。
「これをどうやってモダンな設計に昇華させてやろうか?」
このマインドセットさえあれば、どんな炎上プロジェクトも、知的なパズルゲームに変わる。
明日から、あなたはどう動くか?
最後に、これから海外を目指す人、あるいは今の現場で戦う人へ、具体的なアクションを提案したい。
- 「許可」を待つな:リファクタリングをするのに、上司の許可はいらない。「機能追加のついでに、少しだけキャンプ場を綺麗にして帰る(ボーイスカウトのルール)」。これを徹底しよう。小さな「抽出」の積み重ねが、いつか大きな「API化」のチャンスを生む。
- 「ビジネスの言葉」で語れ:「コードを綺麗にしたいです」と言うな。「この部分をAPI化すれば、モバイルアプリ展開にかかるコストを50%削減できます」と言え。技術的負債の返済を、ビジネスの投資に変えるのが、シニアエンジニアの交渉術だ。
- Toolkitを磨き続けろ:今回紹介した手法は、ほんの一部だ。技術は日々進化する。しかし、「問題を分割し、疎結合にし、段階的に移行する」という本質は変わらない。C#もWPFも、あくまで道具だ。大切なのは、その道具を使って何を解決するかだ。
旅の終わりに
僕のPCの画面には、相変わらずVisual Studioが立ち上がっている。
しかし、以前とは見え方が違う。
そこに並ぶ無骨な行の数々は、ただの文字列ではない。未来へと続く道だ。
海外で働くということは、単に場所を変えることではない。
視点を変え、自分自身を再定義する旅だ。
C#エンジニア諸君。
WPF使いの戦士たちよ。
胸を張ろう。
僕たちの手には、世界を、そして過去と未来を繋ぐ「イノベーション・ツールキット」が握られているのだから。
Good luck with your journey.
またどこかの国の、どこかのコードベースで会おう。

コメント