絶望か、お宝か?海外で直面した「レガシー」の現実
どうも!海外(例えばドイツあたり)で、C#とWPFをメインにエンタープライズ系の設計・開発をやっているエンジニアの「ケン」です。こっちに来て、かれこれ数年。日本でバリバリやっていた皆さんが、これから海外で働きたいって思った時に、「これ、知っとくとマジで得するよ」っていう実体験ベースの話を、カジュアルにお届けしようと思ってます。
さて、記念すべき(?)第一回のテーマは、これ。
「レガシーシステム」です。
うわっ、て思った人、いますよね(笑)。
エンジニア、特に若手でイケイケな人ほど、この言葉に拒否反応を示しがち。
「レガシーとか、触りたくないっす」
「俺は最新のReactとGoで、マイクロサービス作りたいんで」
「WPF?まだ使ってんの?(失笑)」
分かります。その気持ち、めちゃくちゃ分かります。
僕も日本にいた頃は、どっちかというと新しい技術を追いかけるのが好きでした。WPFも、当時は「Windows開発の未来だ!」と思って飛びついたクチですが、今や世間はWeb、クラウド、AI一色。C#は.NET Core (.NET 5以降) のおかげで息を吹き返したけど、WPFって言うと、ちょっと「お、おう…」みたいな空気、ありますよね。
でもね、これ、海外で働き始めて、特にヨーロッパの老舗企業とかと仕事すると、価値観が180度、いや、540度くらい(一周半)ひっくり返るんですよ。
こっちで僕が最初に関わったプロジェクト。
ある製造業の、基幹システムでした。クライアントは、それこそ100年以上の歴史があるような「ザ・老舗」。
で、ソースコード開くじゃないですか。
「……ん?」
ソリューションファイル(.sln)の最終更新日、2008年。
使ってる.NET Framework、3.5。
UIはもちろん、WPF。それも、MVVMパターンなんて導入される前の、コードビハインドに数千行のロジックが書いてある、ゴリゴリの「遺産」。
正直、最初は「マジか…」と思いました。
「これを、俺がメンテすんの?」「作り直した方が早くない?」
日本から意気揚々とやってきて、いきなり10年以上前のコードの海に放り込まれたわけです。
新人エンジニアが「レガシーは嫌だ」って言うのと同じマインドセットに、僕も一瞬、足を突っ込みかけました。
でも、数週間、そのシステムと格闘して、気づいたことがあるんです。
「このコード、バグが、ない。」
いや、ゼロじゃないですよ。もちろん細かいのはある。
でも、10年以上、この会社の「心臓」として動き続けて、日々の膨大なトランザクションを処理し、世界中の工場を動かし、何億ユーロっていう売上を生み出し続けてきた。
そこには、バグが出尽くし、磨き上げられ、最適化された「安定」という、とんでもない価値があったんです。
ここで、海外で働くエンジニアを目指す皆さんに、一つ目の「人生術」というか、「視点の転換」をシェアしたい。
「レガシーシステムは、『負の遺産』ではなく、『検証済みの資産』である」
このマインドセット、めちゃくちゃ大事です。
特に海外。アメリカのスタートアップとかならまだしも、ヨーロッパの多くの国では、「新しいこと」よりも「安定して動くこと」に、日本人が想像する以上に重きを置きます。
彼らにとって、この10年動いてるWPFアプリは「ゴミ」じゃないんです。「宝」なんです。
だから、「こんな古いの、イケてないんで、最新のWeb技術で全部作り直しましょう!」なんて提案したら、どうなるか。
「は?君、何言ってるの?今、完璧に動いてるものを、なんでわざわざリスク取って壊す必要があるんだい?バグ出たら、君が全責任取ってくれるのか?」
って、一蹴されます。ガチで。
これ、日本にいると「技術的負債の返済」とか「モダナイゼーション」って言葉で、リプレイスが正義みたいに語られること、多くないですか?
もちろん、それが必要な場面もある。
でも、「今、価値を生み出しているコード」に対するリスペクトが、こっちは半端ないんです。
じゃあ、古いコードを一生塩漬けにして、メンテだけし続けるのか?
WPFエンジニアは、そういう「守り」の仕事しかできないのか?
いや、全く違います。
ここからが、今回のブログの核になる「フック」の話。
“Future-Proofing Your Legacy: A Strategic Mindset”
(あなたのレガシーを未来対応させる:戦略的マインドセット)
そう、僕ら「レガシー」と呼ばれる技術(C#やWPFも含む)を知るエンジニアの本当の仕事は、「作り直す」ことじゃない。
今ある「検証済みの資産(レガシー)」を尊重しつつ、それを「未来の要求」にも耐えられるように、賢く「進化」させていくことなんです。
このブログシリーズで僕が皆さんに提供したいのは、まさにこの「戦略的マインドセット」。
具体的には、
「どうやって、その10年モノのレガシーシステムと共存する、長期的なアーキテクチャのロードマップを描くか?」
「”安定第一”のアプローチを適用しながら、どうやって未来の需要に備えるか?」
「(僕らみたいな)アーキテクトやシニアエンジニアが、どうやって”高価な革命(=全部リプレイス)”じゃなくて、”賢い進化(=部分的な改善)”を会社に提唱していくか?」
これって、ただの技術論じゃないんです。
ぶっちゃけ、これからのエンジニアにとって、最強の「サバイバル術」であり「人生術」だと、僕は本気で思ってます。
だって、考えてみてください。
新しいフレームワークなんて、毎年出ては消えていくじゃないですか。
でも、「今ある動いているシステムを、どうやって安全に、効率よく、未来に繋げるか」っていうスキルは、10年後も20年後も、絶対に腐らない。
特に、C#とWPFで培われる「ステートフル(状態を持つ)なクライアントアプリ」の設計思想や、「堅牢なエンタープライズ・アーキテクチャ」の知識は、形を変えて、Webでもクラウドでも、絶対に活きてきます。
この「起」のセクションでは、まず皆さんに「レガシー、怖くないよ」「WPF、オワコンじゃないよ」っていう、マインドセットの転換をしてもらいたかったんです。
海外で働くってことは、こういう「キラキラしてないけど、超重要なシステム」と向き合うことの連続でもあります。
そこで「うわ、レガシーだ」って絶望するか、「なるほど、これが会社の心臓か。どうやって進化させてやろうか」ってワクワクするか。
この差が、あなたのエンジニアとしての市場価値を、めちゃくちゃ左右します。
次の「承」のセクションでは、じゃあなんで「全部リプレイス」っていう「高価な革命」が、多くの現場で失敗するのか?
そして、僕らが取るべき「安定第一」のアーキテクチャ思考(Stability-First Approach)って、具体的にどういうことなのかを、僕がやらかした失敗談も交えながら、深く掘り下げていこうと思います。
乞うご期待!
なぜ「全部リプレイス」は失敗するのか?安定第一のアーキテクチャ思考
どうも、ケンです。「起」のパート、読んでくれました?
「10年モノのWPFアプリは、ゴミじゃなくて『宝』だ」
「レガシーは『検証済みの資産』だ」
っていう、マインドセットの話をしました。
とはいえ、ですよ。
そうは言っても、エンジニアの性(さが)として、「うわ、このコードひどいな…全部書き直してぇ…」って思う瞬間、ありますよね。
僕もWPFのコードビハインドに5000行のイベントハンドラが書いてあるのを見た時、一瞬、ディスプレイを閉じようかと思いましたもん(笑)。
「こんなメンテ不能なもの、置いておくだけ無駄!」
「最新の.NET 8とMAUI (もしくはBlazor) で、サクッと作り直した方が、絶対に幸せになれる!」
この「全部リプレイス(作り直し)したい」っていう誘惑。
これを、僕は「高価な革命(Expensive Revolution)」って呼んでるわけですけど、なんでこれが「高価」で、そして「大抵失敗する」のか。
今日は、僕がこっち(海外)に来て、まだイケイケだった頃にやらかした、ガチの失敗談をシェアします。これ、マジで皆さんの「人生術」として役立つはずなんで、心して読んでください(笑)。
あれは、僕が今の会社じゃなくて、別のクライアント先に常駐してた時のこと。
そこにもあったんですよ。「秘伝のタレ」みたいになってる、古いWPFアプリが。
そいつは、ある特定の(でも超重要な)顧客向けの、見積もり作成ツールでした。
UIはまぁ…うん、って感じ。XAMLもぐちゃぐちゃ。でも、動いてはいた。
当時の僕は、まだ「レガシー=悪」っていう思想が抜けきってなかったんですね。
「ケン、これ見てくれよ。このアプリ、新しいOS(Windows 11とか)で動かすと、たまに挙動がおかしいんだ。ついでに、新しい見積もりロジックも追加したいんだけど、もう誰も触れなくて…」
とマネージャーに相談されたんです。
チャンス!と思いましたね。
「これ、コードベースが古すぎます。メンテナンスするより、Web APIとReact(当時はそれが流行ってた)で作り直しましょう!6ヶ月もあれば、ピカピカのWebアプリができますよ!そしたらスマホからでも見積もり作れますし!」
僕は自信満々に提案しました。
マネージャーは最初渋ってたんです。「今動いてるものを、わざわざ…?」って。
でも、僕は「技術的負債」とか「スケーラビリティ」とか、それっぽい横文字を並べて、なんとか説得したんです。「革命」を起こそうとしたわけです。
そして、プロジェクトは始まった。
最初の1ヶ月は、最高でした。
クリーンなアーキテクチャ、新しいCI/CDパイプライン、イケてるUI。
「やっぱ、作り直して正解っすよ!」なんて、チームで盛り上がってました。
地獄が始まったのは、3ヶ月目からです。
僕らが「ピカピカのWebアプリ」を作っている間も、当然ながら、ビジネスは止まらない。
例の「古いWPFアプリ」には、相変わらず「今すぐ対応しろ」っていう緊急の修正依頼が来るんです。
「あ、ケン。悪いけど、A社向けの特別割引ロジック、今月から料率変わったから、古いアプリの方、直しといてくれる?」
え?そっちも直すの?
僕らは新しいの作ってるのに?
でも、ビジネスは待ってくれない。
結局、古いWPFアプリのコード(あの5000行のコードビハインド)を、泣きながら解読して修正するハメになりました。
一方で、新しいWebアプリの開発も進めなきゃいけない。
もう、この時点でカオスです。
そして、最悪の事態が発覚します。
古いWPFアプリのロジックを、新しいWebアプリに移植しようとした時。
誰も、そのロジックの「すべて」を理解していなかったんです。
「この計算式、なんでここで『1.05』を掛けてるんですか?」
「さあ…?10年前に辞めたハンスさん(仮名)が書いたコードだから…でも、これがないと、なぜかB社の請求額が合わなくなるんだよ」
これです。
「全部リプレイス」が失敗する最大の理由。
それは、**「10年分の暗黙知(ドキュメント化されてない、担当者の頭の中にだけあったノウハウや、バグ修正の歴史)を、完全になめていた」**からです。
僕らが「ひどいコード」だと思ってた5000行のロジックは、「ひどい」んじゃなくて、「10年分のビジネスの例外処理とエッジケースの塊」だったんです。
月末にだけ動く謎の処理。
特定の顧客コードの時だけ適応される謎のフラグ。
それこそが、会社が10年間かけて培ってきた「検証済みの資産」の正体だった。
仕様書?そんなもの、とっくに更新されてません。
「ソースコードが、仕様書」だったんです。
結局、どうなったか。
6ヶ月で終わるはずだったプロジェクトは、古いWPFアプリのロジックを解読する「リバース・エンジニアリング」作業に大半の時間を費やし、1年半かかりました。
予算は3倍に膨れ上がりました。
そして、リリースされたWebアプリは…バグだらけでした。
「古いアプリだと、この見積もり1000ユーロだったのに、新しいアプリだと998ユーロになるぞ!何が起きてるんだ!」
…ええ、あの「1.05」の掛け算とか、そういう「暗黙知」の移植漏れが、無限に出てくるんです。
もう、お分かりですよね。
これが「高価な革命」の末路です。
じゃあ、どうすればよかったのか?
ここで、僕が血反吐を吐きながら学んだ「人生術」が出てきます。
それが、「安定第一 (Stability-First)」のアプローチです。
これは、「何もしない」って意味じゃないですよ。
医者の「ヒポクラテスの誓い」と一緒です。
「まず、害をなすなかれ (First, do no harm)」
僕らが向き合ってるシステムは、会社の「心臓」なんです。
心臓が動いてる(=ビジネスが回ってる)のに、「ちょっと動きが古いんで、最新の人工心臓に交換しましょう!」とか言って、いきなり心臓を止めちゃダメなんです。
僕らがやるべきだったのは、「バイパス手術」です。
心臓(=古いWPFアプリ)は、動かし続ける。絶対に止めない。
その代わり、新しい機能(=新しい見積もりロジック)が必要になったら、それは「別」の場所に、新しいサービス(例えば、C#で書いたWeb API)として作る。
そして、古いWPFアプリから、その「新しいAPI」を「呼び出す」ように、そーっと繋ぎ変える。
これなら、リスクは最小限です。
最悪、新しいAPIがバグってても、古いロジックに戻せばいいだけ。心臓は止まらない。
この「安定第一」のマインドセット。
これこそ、海外のマネージャーやクライアントが、エンジニアに一番求めている価値なんです。
彼らは、ピカピカの技術より、「ビジネスが止まらないこと」を、100倍重視します。
「ケン、君の提案は、ビジネスのリスクをちゃんと考えてくれてるね」
こう言われるエンジニアになれるかどうか。
「全部リプレイス」っていう「革命」を夢見るエンジニアは、ある意味「無責任」です。
「検証済みの資産」をリスペクトし、どうやって「安定」を保ったまま「進化」させるかを考える。
それこそが、僕らC# / WPFっていう「堅牢なシステム」を知ってるエンジニアが、海外で発揮できる最大のバリューなんです。
次の「転」のセクションでは、じゃあ具体的に、この「安定第一」のバイパス手術をどうやるのか。
「心臓」であるWPFアプリを活かしつつ、「賢く進化」させるための、僕らアーキテクトの具体的なテクニック(あの「絞め殺しのイチジク」とか「腐敗防止層」とかの話)を、C#のコードも交えながら、ガッツリ解説していきます。
C#とWPFは「枯れて」いない。「進化」させるアーキテクトの役割
どうも、ケンです。「承」のパートで、僕がやらかした「全部リプレイス(高価な革命)」の地獄、読んでいただけたでしょうか(笑)。
あの見積もりツールの一件で、僕は骨身にしみて学びました。
「10年分の暗黙知をなめるな」
「ビジネス(心臓)を止めるな」
「エンジニアのエゴ(ピカピカの技術使いたい)より、まずは安定第一 (Stability-First) だ」
と。
じゃあ、どうすればよかったのか?
「承」の最後で、「バイパス手術」って話をしましたよね。
心臓(=レガシーなWPFアプリ)は動かし続けたまま、新しい血管(=新しい機能やWeb API)をそーっと繋ぎ込んで、血流(=ビジネス価値)を改善していくアプローチです。
今日は、この「バイパス手術」を、僕らC# / WPFエンジニアがどうやって「安全」かつ「賢く」実行していくのか、その具体的な戦術(アーキテクチャ・パターン)を2つ、紹介します。
これ、マジで海外の現場で「お、こいつ分かってるな」と思われるための必須スキルなんで、コーヒーでも飲みながら、じっくり読んでください。
戦術その1:すべては「通訳」から始まる。「腐敗防止層 (Anti-Corruption Layer)」
「バイパス手術」って言っても、いきなり古いWPFアプリ(.NET Framework 3.5とか)から、最新の.NET 8で動くWeb APIを叩こうとすると、十中八九、問題が起きます。
なぜか?
**「文化(データ構造)が違いすぎる」**からです。
古いWPFアプリ(僕が「心臓」と呼んでるやつ)の中って、だいたいこんな感じじゃないですか?
Customerっていうクラスがあるんだけど、なぜかプロパティが150個ある(God Object)。- 顧客住所も、
Address1,Address2,Address3…みたいに、全部ベタ書き。 - 状態(ステート)の管理がカオス。
GlobalStaticVariables.IsSpecialMode = true;みたいなのが、コードビハインドのあちこちに散らばってる。
一方で、僕らが新しく作るWeb APIは、クリーンでいたいですよね。
CustomerDtoは、必要なIDと名前だけ。- 住所は
AddressDtoっていう別のクラスに分けたい(正規化)。 - APIはステートレス(状態を持たない)に設計したい。
ここで、「承」の僕みたいに、古いWPFアプリから、この新しいAPIを「直接」呼び出そうとすると、どうなるか。
古いWPF側で、あの150個のプロパティを持つCustomerオブジェクトから、必死こいて新しいCustomerDtoとAddressDtoを組み立てるロジックを書くハメになります。その「変換ロジック」が、あの5000行のコードビハインドに、さらに追加されるんです。
地獄ですよね。
逆に、新しいAPI側が「忖度」して、「古いアプリが使いやすいように」と、150個のプロパティを持つLegacyCustomerDtoみたいなのを受け入れ始めたら…
おめでとうございます。新しいAPIが、古いシステムに「腐敗」させられました。
これを防ぐのが、**「腐敗防止層(Anti-Corruption Layer = ACL)」**です。
難しく考えなくていいです。要は「通訳」です。
古いWPFアプリと、新しいWeb APIの「間」に、専用の「通訳クラス(あるいは、専用のクラスライブラリ・プロジェクト)」を一個だけ作るんです。
<-> [Anti-Corruption Layer (Translator)] <-> [New Web API]]
この「通訳 (ACL)」の仕事は、たった2つ。
- 古いWPFアプリから、「古くてカオスなデータ(あのGod Objectとか)」を受け取る。
- それを、新しいAPIが喜ぶ「クリーンなデータ(DTO)」に翻訳して、APIを呼び出す。
- (逆も然り)APIから返ってきたクリーンなデータを、古いアプリが理解できる形式に翻訳して返す。
例えば、C#で書くと、こんなイメージです。
WPFのコードビハインド側は、もう「通訳」を呼ぶだけ。
C#
// --- 古いWPFのコードビハインド (例: MainWindow.xaml.cs) ---
// ※こいつは .NET Framework 3.5 かもしれない
// ACL (通訳) をインスタンス化
private readonly QuotationACL _translator = new QuotationACL();
private void CalculateButton_Click(object sender, RoutedEventArgs e)
{
try
{
// 1. 古いUIから、古いデータオブジェクトを作る
var legacyRequest = new LegacyQuotationRequest
{
CustomerCode = txtCustomer.Text, // "A-001" みたいな古いコード
PriceA = decimal.Parse(txtPriceA.Text),
// ... 他にもカオスなデータが50個 ...
};
// 2. 「通訳」に丸投げする (ここが最重要!)
// コードビハインド側は「どうやってAPIを呼ぶか」
// 「どうやってデータを翻訳するか」を一切知らない。
NewPriceResponse response = _translator.GetNewPrice(legacyRequest);
// 3. 結果をUIに反映
lblNewPrice.Content = response.TotalPrice.ToString();
}
catch (Exception ex)
{
// 通訳がエラーを処理してくれる
MessageBox.Show("エラーが発生しました: " + ex.Message);
}
}
で、「通訳」であるACL(これは別プロジェクト。こっちは.NET Standard 2.0とか、.NET Framework 4.8とか、少し新しくてもいい)の中身はこうなります。
C#
// --- ACL (腐敗防止層) のクラス (例: QuotationACL.cs) ---
// ※こいつが「翻訳」と「API呼び出し」の汚れ仕事を引き受ける
public class QuotationACL
{
// 最新の.NET 8で動いてるAPIを叩くクライアント
private readonly HttpClient _newApiClient;
public QuotationACL()
{
_newApiClient = new HttpClient { BaseAddress = new Uri("https://new-api.mycompany.com/") };
// (本当はHttpClientはstaticかDIすべきだけど、イメージとして)
}
// 「通訳」メソッド
public NewPriceResponse GetNewPrice(LegacyQuotationRequest oldRequest)
{
// 1. 「翻訳」開始 (ここがACLの心臓部)
// 古いカオスなデータを、新しいクリーンなDTOに変換する
var newApiRequest = new NewApiRequestDto
{
// 「暗黙知」だったコード変換ロジックを、ここに集約!
ClientId = ConvertLegacyCodeToNewId(oldRequest.CustomerCode),
Items = new List<ItemDto>
{
new ItemDto { Sku = "SKU-A", Price = oldRequest.PriceA },
// ... 複雑なマッピング ...
}
};
// 2. 新しいAPIを呼び出す (WPF側はこれを知らない)
// (※ 本当は非同期 (async/await) でやるべきだけど、
// 古いWPFに組み込む都合上、あえて同期で書くことも現場では多い)
var httpResponse = _newApiClient.PostAsJsonAsync("api/v1/calculate", newApiRequest).Result;
if (!httpResponse.IsSuccessStatusCode)
{
// エラー処理も「翻訳」する
throw new Exception("新しい見積もりAPIでエラーが発生しました。");
}
// 3. 結果を翻訳して返す
var apiResult = httpResponse.Content.ReadAsAsync<NewApiResponseDto>().Result;
return new NewPriceResponse { TotalPrice = apiResult.CalculatedPrice };
}
// 「暗黙知」だったロジックは、この通訳の中に封じ込める
private string ConvertLegacyCodeToNewId(string oldCode)
{
if (oldCode == "A-001") return "CUST_10001";
// ... (10年分の秘伝のタレ) ...
return "UNKNOWN";
}
}
// --- 古いアプリとACLが使う、共通の戻り値 (イメージ) ---
public class NewPriceResponse
{
public decimal TotalPrice { get; set; }
}
// --- (参考) 新しいAPIが使うDTO (ACLだけが知ってる) ---
internal class NewApiRequestDto
{
public string ClientId { get; set; }
public List<ItemDto> Items { get; set; }
}
// ... (以下略) ...
どうです?
これだけで、古いWPFアプリ(コードビハインド)は、汚い翻訳ロジックやAPI呼び出しの詳細から解放されました。
そして、新しいAPIも、古いカオスなデータ構造に「腐敗」させられることなく、クリーンな設計を保てます。
これが「賢い進化」の第一歩です。
戦術その2:「絞め殺しのイチジク (Strangler Fig)」で、乗っ取れ
ACL(腐敗防止層)で「連携」ができるようになったら、次はいよいよ「置き換え」です。
でも、「全部リプレイス」はダメ、って言いましたよね。
そこで使うのが、**「絞め殺しのイチジク (Strangler Fig)」**パターンです。
マーティン・ファウラーが提唱した、超有名なパターン。
熱帯雨林にあるイチジクの木は、まず大きな木(ホスト)に「ツタ」として巻きつくんですよ。
で、ツタはどんどん太く、強くなって、栄養を吸い取りながら、ホストの木を「覆い尽くして」いく。
そして何十年も経つと、中のホストの木は枯れてなくなり、ツタだったイチジクの木が、新しい大木としてそこに立っている。
これを、システムに例えるんです。
- ホストの木: レガシーなWPFアプリ(心臓)
- ツタ: 新しい機能(Web APIや、新しいWeb UI (Blazorとか))
「全部リプレイス」は、ホストの木をいきなり切り倒そうとして、生態系(ビジネス)を破壊する行為です。
「絞め殺しのイチジク」は、違います。
ホストの木(WPF)は、活かし続けます。
- ステップ1 (連携): まず、「見積もり計算」機能だけ、新しいWeb APIとして作ります。そして、ACL(さっきの通訳)経由で、WPFからそれを呼び出すようにします。(=最初のツタを巻き付ける)
- ステップ2 (置き換え): 次に、「顧客管理」機能。これはUIごと新しくしたい。じゃあ、Blazor Serverあたりで、ピカピカの「顧客管理Web画面」を作ります。
- ステップ3 (乗っ取り): 古いWPFアプリのメインメニューにある「顧客管理」ボタン。これを押した時の動作を、変えちゃうんです。
- (旧)古いWPFの顧客管理画面(Windows.Forms.Formとか)を開く
- (新)新しく作ったBlazorのWeb画面を、ブラウザで開く。 (
Process.Start("https://new-crm.mycompany.com/..."))
- ステップ4 (繰り返す): これを、「商品管理」「在庫管理」「請求書発行」…と、機能単位で、一つ、また一つと、新しいWebサービスやWeb画面に置き換えていきます。
これを繰り返していくと、どうなるか。
1年後、古いWPFアプリの機能は、半分くらいが新しいWebサービスへの「リンク集」みたいになってます。
でも、ビジネスは止まってない。ユーザーは、機能ごとに新しいUIに少しずつ慣れていけます。リスクも分散されてる。
そして3年後。
ついに、古いWPFアプリのすべての機能が、新しいサービス(ツタ)に置き換えられました。
古いWPFアプリ(ホストの木)に残ってるのは、メインメニュー(ランチャー)だけ。
その時こそ、レガシーシステムが「引退」する時です。
ホストの木は、静かに枯れていく(アンインストールされる)。
誰も困らない。なぜなら、すべての機能は、すでに新しいツタ(Webサービス群)によって、完全に置き換えられているから。
これが、「高価な革命」じゃなくて、**「賢い進化」**です。
そして、気づきましたか?
この「ACL」や「Strangler Fig」戦略において、僕らC# / WPFエンジニアのスキルが、どれだけ重要か。
WPFは、オワコンじゃないんです。
「賢い進化」を支える、最強の「ハブ(拠点)」であり、「ホストの木」なんです。
- 安定性: 10年動いてるWPFは、これ以上ないくらい「安定」してます。
- 連携力: C# (.NET Framework) は、最新の.NET 8のAPIだろうが、gRPCだろうが、何でもござれで呼び出せます。ACL(通訳)を書くのに、C#ほど適した言語はありません。
- 資産: ローカルPCのプリンタや、工場に繋がってる特殊なシリアルポート機器を制御するロジック。こういうのはWebじゃ(まだ)難しい。WPF/C#が「資産」として持ってる部分です。
僕らアーキテクトやシニアエンジニアの本当の役割は、
「WPFは古いから、捨てましょう!」と「革命」を叫ぶことじゃない。
「今動いているこのWPFという『資産』を『ハブ』にして、ACLとイチジクの木パターンを使い、ビジネスを止めずに、3年計画でシステムを『進化』させましょう」
と、具体的なロードマップを描き、経営陣やマネージャーに**「提唱」**することなんです。
「転」はここまで。
最後の「結」では、この「賢い進化」を提唱できるエンジニアになることが、僕ら自身のキャリア、つまり「人生術」として、どれだけ最強の「Future-Proofing(未来対応)」になるのか、という話をします。
高価な「革命」より賢い「進化」を。未来の自分を助けるキャリア術
どうも、ケンです。
いやー、長かったですね(笑)。でも、ここまで読んでくれたってことは、あなたも「レガシーシステム」っていう、この深くて面白い沼に、片足くらいは突っ込む覚悟ができたんじゃないでしょうか。
軽く振り返ってみましょう。
- 「起」: 10年モノのWPFアプリは「ゴミ」じゃない。「検証済みの資産(お宝)」なんだ、っていうマインドセットの転換をしました。
- 「承」: 「全部リプレイス(高価な革命)」がいかに危険か、僕の失敗談で学びましたね(笑)。心臓(ビジネス)を止めるな、「安定第一 (Stability-First)」が鉄則だと。
- 「転」: じゃあどうする?の答えとして、「腐敗防止層 (ACL)」っていう”通訳”と、「絞め殺しのイチジク (Strangler Fig)」っていう”乗っ取り”戦術、この2つの「賢い進化」のテクニックをC#のコード交じりで解説しました。
そして今日、この「結」で、僕がこのブログシリーズを通して、これから海外で働きたいC# / WPFエンジニアの皆さんに、一番伝えたかった「人生術」について話します。
フックの最後の一文を、もう一度見てみましょう。
“The architect’s role in advocating for smart evolution over expensive revolution.”
(高価な革命よりも、賢い進化を「提唱」する、アーキテクトの役割)
これ、単なるプロジェクト管理論じゃないんです。
これこそが、僕らエンジニアの「キャリアを未来対応させる (Future-Proofing)」最強の戦略なんです。
考えてみてください。
世の中には、大きく分けて2種類のエンジニアがいると、僕は思ってます。
1. 「革命家(Revolutionist)」タイプのエンジニア
彼らは、常に新しい技術を追いかけています。
「レガシーは悪だ」「全部ReactとGoで書き直すべきだ」
「WPF?まだ使ってんの?(失笑)」
こういう人たちです(昔の僕だ…耳が痛い…)。
彼らは、ピカピカのスタートアップで、ゼロからモノを作るのは得意です。
でも、3年経って、自分たちが作ったそのシステムが「レガシー」になり始めた頃、彼らは飽きて、また次のピカピカの現場(革命)を求めて去っていきます。
彼らは、「育てる」とか「進化させる」っていう視点が、根本的に欠けていることが多い。
2. 「進化論者(Evolutionist)」タイプのエンジニア
彼らは、まず「今、動いているもの」にリスペクトを持ちます。
「この10年モノのWPFアプリが、どうやって会社の心臓として動いてきたのか」を理解しようとします。
そして、「承」で学んだ「暗黙知」や「安定性」という価値を、絶対に捨てません。
その上で、「転」で学んだ武器(ACLやStrangler Fig)を使って、
「この『お宝』を活かしつつ、どうやって未来の要求(Web対応とか、クラウド化とか)に応えていくか」
という、「賢い進化」のロードマップを描くことができます。
さて、これからあなたが海外で働こうとするとき。
特に、ヨーロッパの歴史ある製造業や、アメリカでも大手のエンタープライズ企業に入ろうとするとき。
彼らが喉から手が出るほど欲しがっているのは、どっちのエンジニアだと思いますか?
圧倒的に、「進化論者」です。
なぜなら、世の中の99%の会社は、「ゼロから作る」ことよりも、「今ある資産を、どうやって安全に、安く、未来に繋げるか」という問題で、毎日頭を抱えているからです。
「革命家」は、会社のマネージャーにこう言います。
「全部捨てて、作り直しましょう。5億円と3年ください。バグは出るかもだけど、イケてるシステムができますよ」
…こんなの、ギャンブルですよね。
「進化論者」は、こう言います。
「あなたの『心臓』は動かし続けます。まず、”通訳”(ACL)を2週間で作って、一番要望の多い『見積もり計算』だけ、新しいAPIに繋ぎます。リスクは最小限です」
「そして、3年計画の『イチジクの木』プランを立てました。これなら、毎年1億円ずつ、3年間で、ビジネスを一度も止めずに、システムを丸ごとWebに移行できます。途中で止めることも可能です」
あなたがマネージャーなら、どっちのエンジニアに、自分の会社の「心臓」を任せたいですか?
どっちのエンジニアに、高い給料を払ってでも、チームに残ってほしいですか?
僕が言いたいのは、これです。
「C#とWPFを知っている」ということは、決して「古いエンジニア」だということじゃない。
それは、**「エンタープライズの『心臓』を触れる、数少ないエンジニア」**だっていう、最強の「証明書」なんです。
多くのWeb系エンジニア(革命家タイプ)は、WPFや.NET Frameworkの「お宝」に触りたがりません。怖いですから。
でも、僕らは触れる。僕らはC#を知っている。僕らは「心臓」の構造を理解できる。
だからこそ、僕らは「革命家」にはなれない、「進化論者」という、超ハイバリューなポジションを取れるんです。
古い世界の言葉(WPF, .NET Framework, 10年分の暗黙知)と、新しい世界の言葉(.NET 8, Web API, Blazor, クラウド)の両方を話せる、「通訳」であり「アーキテクト」になれる。
これこそが、僕がこのブログで伝えたかった、一番「得する情報」であり「人生術」です。
Future-Proofing Your Legacy
(あなたのレガシーを、未来対応させる)
この「レガシー」っていうのは、古いWPFアプリのことだけじゃありません。
僕らエンジニア自身の「キャリア(Legacy)」のことでもあるんです。
新しいフレームワークを追いかけるだけの「革命家」のキャリアは、そのフレームワークが廃れたら終わってしまいます。
でも、「今ある価値を、未来に繋げる」という「進化論者」のスキルは、10年後も20年後も、絶対に廃れません。
なぜなら、**「システムは、必ず古くなる」**からです。これは、技術界における唯一の「真実」です。
だから、胸を張ってください。
僕らのC#とWPFのスキルは、「賢い進化」を提唱できる、最強の武器です。
その武器を持って、「高価な革命」で悩んでいる海外の企業を、助けに行ってやりましょう。
それが、僕ら自身のキャリアを「未来対応」させる、一番確実な道だと、僕は信じています。
最後まで読んでくれて、ありがとうございました!

コメント