「デスクトップからWebへ:WPFエンジニアがBlazorに出会った日」

突然の指示、突然のBlazor

エンジニア人生には、時々「え、明日からそれ使うの?」という急展開がある。今回、まさにそれが起きた。

私は普段、C#でWPFアプリケーションをゴリゴリ作ってきた。UIはXAMLで、バックエンドはMVVMで、非同期処理もTaskとCancellationTokenで丁寧に設計する。設計書もちゃんと書いて、レビューして、テスト仕様書まで仕上げる。そんなWPFエンジニア生活に慣れきっていた。

そんなある日の朝会。プロジェクトマネージャーが軽く言った。

「次の案件、フロントはBlazorでやるから、WPFメンバーも対応よろしく」

…え? Blazor?
正直その時点で、私は「名前は聞いたことある」レベルだった。
「Web系?C#でフロント?」くらいのイメージ。

朝会が終わった瞬間、ググりまくった。


なぜBlazorを使うのか?(最初の疑問)

調べ始めると、どうやら会社の上層部はこう考えていたらしい。

  • ■ WPFで作ってきたロジックをWebに再利用したい
    → WPFもBlazorもC#ベースなので、ビジネスロジック層のコードが流用できる。
  • ■ クライアントPCへのインストール不要にしたい
    → 今までのWPFアプリは、PCごとにセットアップが必要だった。Blazorならブラウザがあれば動く。
  • ■ 今後のクラウド展開に向けた布石
    → Azure上でホストすれば、世界中どこでも動く。営業的にも「Web対応してます!」と胸を張れる。

WPFエンジニアとしての最初の不安

だけど、正直怖かった。
「HTMLもCSSもほぼ書いたことない」「JavaScript?業務で触ったことゼロ」
そんな自分が、いきなりWebフロント開発?
しかも、UIの作り方も、イベントの捉え方も、通信の流れも、全部違いそう…。

特に心配だったのは次の3つ。

  1. UI設計:XAML脳で、HTML&CSSが未知数
  2. デバッグ:WPFみたいにデバッガでサクッと止められるの?
  3. パフォーマンス:WebAssemblyとかBlazor Serverとか、何がどう違うの?

でも、希望もあった:C#資産が活かせる!

ただ、一つだけ希望が見えたのは「C#でフロントが作れる」という点。
これはWPFエンジニアにとってはかなりデカい。

XAMLのData Bindingとか、MVVMパターンの思想は、BlazorのComponent化と似ているところがあるっぽい。
そして、非同期処理もWPFで使ってきたasync/awaitがそのまま使える。
さらに、サービス層やロジック層のクラスがC#なら、少し手を入れればBlazor側でも使えるという話も。


勉強方法:何から手を付けるべきか?

とりあえず、最初にやったことはこれ。

  • 【ステップ1】
     Microsoft公式ドキュメントで「Blazor入門」を読む。
     → https://learn.microsoft.com/ja-jp/aspnet/core/blazor/
  • 【ステップ2】
     YouTubeで「Blazor 初心者向け ハンズオン」を探す。
     → 実際のUI作りながら学ぶ系の動画が一番入りやすかった。
  • 【ステップ3】
     GitHubでBlazorのサンプルプロジェクトをクローンして動かす。
     → 「Blazor WebAssembly」と「Blazor Server」の違いを体感。
  • 【ステップ4】
     既存のWPFアプリケーションのロジック部分だけ取り出して、Consoleアプリで動かしてみる。
     → 「どこまでWebで使いまわせるのか」をチェック。

会社導入の裏事情(聞いた噂)

実は今回のBlazor採用、どうやら営業サイドからの要望が強かったらしい。

「最近の顧客、Web化を強く求めてるよね」
「インストール型アプリは、セキュリティ審査が厳しくなってきてる」
「クラウド連携ができないと、他社に負けるかも」

こうしたプレッシャーの中で、WPFメンバーにも「Blazorを覚えてもらうしかない」という流れになった。
まさにトップダウンの決定。
だけど、これもエンジニア人生でよくある「会社都合で新技術キャッチアップするタイミング」だ

WPFエンジニアのBlazor実戦奮闘記 ~最初の壁と突破口~

Blazorの学習を始めて数日。チュートリアルアプリはなんとなく作れるようになった。
でも、実際の業務レベルで開発に入るとなった瞬間、想像以上の壁が立ちはだかった。


■ 壁①:UI設計の文化が違いすぎる!

まず最初にぶち当たったのが「UI設計」の考え方の違い。

WPFでは、XAMLでレイアウトを組んで、Grid や StackPanel でレイアウト調整して、DataBindingCommandでイベント駆動するのが当たり前だった。

ところがBlazorになると、
HTMLタグベース。
レイアウトはdivsectionarticle、Flexbox、Grid、しかもCSS必須。
イベントバインディングも、ボタンなら@onclickとか、完全に別世界。

さらにCSS!
WPF時代は、デザイナーさんが作ってくれるXAMLスタイルに頼ってきたので、自分ではCSSの知識ゼロ。
「marginとpaddingってどう違うの?」レベル。

社内でもWPFエンジニア勢が集まってSlackで叫びまくった。

「StackPanelどこ?!」
「DataTemplateってどうやるの?」
「MVVMは…どこ行った?」


■ 壁②:状態管理がわけわからん!

次にハマったのがState管理

WPFでは、ViewModelのプロパティが変わったら、INotifyPropertyChangedでUIが自動更新される世界。
ところがBlazorでは、
「ページ間をまたいだ状態保持」
「非同期イベント後の再描画制御(StateHasChanged)」
「ScopedサービスでのDI管理」
…などなど、いきなり新しい概念が大量に出てくる。

特にハマったのはこの2つ:

  • ページ間でのデータ共有
    → 「あれ?別ページに移動したら、データ消えたんだけど!?」
  • 非同期イベント後のUI更新
    → 「awaitした後、UIが更新されない?なんで??」

この辺りは本気でMicrosoftのドキュメントを読み込んだ。
特に助かったのは以下。


■ 壁③:HTTP通信が当たり前すぎる世界

WPF時代は、基本的にローカルDBやファイルIOで完結していた。
ところがBlazor開発では、APIとの通信が前提になる。

つまり、HttpClientでREST API呼び出しが日常。
JSONのパース、非同期通信、エラーハンドリング…全部Web標準。

最初の一週間、私はひたすらSwaggerと格闘していた。

「エンドポイントどこ?」
「POSTボディの型、これで合ってる?」
「CORSエラーって何???」


■ でも、少しずつ見えてきた希望の光

そんな感じで右往左往していたものの、数週間が経過する頃には、少しずつ光が見えてきた

理由はこれ。

  • ① C#で書ける安心感
    → async/await、LINQ、Task、全部使える。
  • ② WPF時代の設計思想が生きる
    → コンポーネント単位の分割は、まさにMVVMの「View」と「ViewModel」の分離に似てる。
  • ③ サーバーサイドとの連携が簡単
    → ASP.NET Coreとの親和性がめちゃくちゃ高い。

そして何より、

「WPFエンジニアがBlazorに移行できれば、フルスタックへの道が開ける」

これが社内でも囁かれ始めた。

「これまでデスクトップしかできなかった人が、Webフロントもできるようになれば、キャリアの幅が広がるよね」
「フルスタックって言えるようになるじゃん」
そんな前向きな空気が少しずつ生まれてきた。


■ 実際にやってよかった学習法(この時期編)

この時期特に効果があった学習法はこれ:

  • 【実プロジェクトでの小タスク担当】
    → 「簡単なページ作成」や「小さなAPI連携」から入る。
  • 【ペアプログラミング】
    → Blazor経験者(少ないけど…)と組んで、一緒に画面作り。
  • 【Microsoft Learn モジュール】
    → 無料の「Blazor WebAssembly Fundamentals」コースが神レベルでわかりやすかった。
  • 【HTML/CSS基礎動画】
    → ドットインストールの「HTML/CSS入門」やYouTubeでのCSS Flexboxチュートリアル。

Blazorでつかんだ小さな成功体験と気づき ~「あ、できるかも!」と思えた瞬間~

Blazorの勉強と格闘の日々が続いた。
最初の頃は正直「これ、挫折するんじゃないか…」って何度も思った。
でも、あるタイミングから空気が変わり始めた。

それは、初めて「自分で作ったBlazor画面」が、ちゃんと動いたとき


■ 初めての「成功体験」:検索フォームの作成

プロジェクト内で与えられた最初の実タスクは「検索画面」の作成だった。

要件はシンプル。

  • テキストボックスにキーワード入力
  • 「検索」ボタンを押す
  • サーバー側APIにキーワードを投げる
  • 結果をリスト表示する

WPFで言えば、TextBox、Button、ListViewの組み合わせ。
…が、Blazorでは全部違う。

最初はこんなことに悩んだ。

  • HTMLでどうレイアウトするの?
  • @code ブロックってどこまで何書いていいの?
  • API呼び出しは HttpClient で合ってる?
  • 画面更新タイミングはいつ?

でも、試行錯誤の末、完成した。


■ Blazorで作った初めてのコード断片(当時のメモより)

<input @bind="SearchKeyword" placeholder="キーワードを入力" />
<button @onclick="OnSearch">検索</button>

@if (Results != null)
{
<ul>
@foreach (var item in Results)
{
<li>@item.Name</li>
}
</ul>
}

@code {
private string SearchKeyword;
private List<SearchResultItem> Results;

private async Task OnSearch()
{
Results = await Http.GetFromJsonAsync<List<SearchResultItem>>($"api/search?keyword={SearchKeyword}");
}
}

動いた瞬間、めちゃくちゃ嬉しかった。


■ 「できた!」の先にあった気づき

この小さな成功体験をきっかけに、いろんな気づきが生まれてきた。

① WPFエンジニアの強みは「UIの状態管理力」

MVVMで磨いた「UIの状態とデータの関係をきちんと設計する力」は、Blazorでもそのまま活かせる。
特に「ユーザー操作に合わせて画面をどう切り替えるか」「バインド元データはどこに持つか」
…この辺りの考え方は、Blazorでも同じだった。


② 非同期処理の知識が超役立つ

WPFで非同期APIコールに慣れていたおかげで、async/awaitの使い方、エラーハンドリング、キャンセルトークンなどの扱いはすぐに応用できた。


③ フロントエンドの「設計力」が問われる世界

Blazorでは、コンポーネント単位の再利用性状態管理の分離が求められる。
これってまさに「WPFのUserControl設計」や「ViewModel設計」とそっくり。

このあたりから、「自分が今までやってきたことは無駄じゃない」って思えるようになった。


■ 社内でのポジションも少し変わってきた

この時期から、社内の空気も変化してきた。

Blazor案件が増えるにつれ、WPFメンバーの中でも「先に習得した人」がミニリーダー的な存在になっていった。

自分も自然と、後輩や他メンバーから「Blazorでこれどうやるの?」って聞かれる側に。
SlackでのBlazor質問チャンネルにも、回答側で参加できるようになってきた。

正直、ちょっと嬉しかった。

「自分、成長してるかも…」


■ 「WPFエンジニアならでは」のBlazor学習法(この頃の実体験)

  • 既存WPFアプリのロジックをBlazorに移植する小課題を作る
    → 例:「データグリッド表示機能」「検索条件バインド処理」など。
  • BlazorのライフサイクルをWPFのLoadedイベントに置き換えて考える
    → 「OnInitializedAsync」→「Loaded」
    → 「OnParametersSetAsync」→「プロパティ変更後の反映」
  • Razor構文を「XAML + C#コードビハインド」に置き換えて頭で理解
    → .razorファイル = XAML + CodeBehind 的に考えるとすんなり入った。
  • HTML / CSSは「レイアウトのXAML化」と割り切ってパターンで覚える
    → FlexboxとかGridレイアウトは、WPFのGridとStackPanelをイメージして慣れていった。

■ 少しずつ見えてきた「Blazorの楽しさ」

そして、なによりも大きかったのは…

「自分の書いたUIが、インストールなしで、ブラウザ上でサクッと動く」という感動。

社内の別チームにURL渡すだけで、

「え、これ、動いてるじゃん!」
「もうインストール不要?」
「なんか未来感あるね!」

そんな声がもらえた。

これまで、.exeファイル渡して、
「.NETランタイム入ってますか?」
「バージョン違いで動きません」
とかやってた日々が、少しずつ変わっていった。

WPFエンジニアがBlazorに挑戦して得たもの、そしてこれから

数ヶ月前、突然降ってわいた「Blazorやって!」指令。
最初は不安と混乱だらけだった。
けど、今振り返ると、それは自分にとって**「キャリアの転機」**だった。


■ 会社全体としてのBlazor導入のメリットが見えてきた

プロジェクトが進むにつれ、社内でもBlazorの導入効果が目に見えて出てきた。


【メリット①:開発コストの削減】

従来のWPFアプリ開発では、

  • UI開発はXAML担当
  • ロジック開発はC#担当
  • 配布作業はインフラチーム
  • バージョン管理、インストーラ作成、ユーザーごとのPCセットアップ…

など、各工程でコストがかかっていた。

Blazorに切り替えたことで、

  • クライアント側はブラウザのみ
  • デプロイはサーバー上の1箇所だけ
  • ユーザーごとのPCセットアップ作業ゼロ
  • バージョンアップはサーバー側で即反映

これだけで、年間数百万円規模のコスト削減が見えてきた。


【メリット②:ビジネススピードの加速】

営業サイドからはこんな声が出るように。

「今まで提案できなかったお客様にも、Webベースってだけで商談が通りやすくなった」
「テレワークユーザーでもすぐ使ってもらえる」
「新しいSaaS型サービスとして売り出せる」

クラウド展開も視野に入ることで、会社全体のビジネスモデルが「プロダクト提供型」から「サービス提供型」へと進化しつつある
これって、まさにBlazor導入がきっかけだった。


【メリット③:技術者のスキル拡張】

WPFチームのメンバーも、一人また一人とBlazorに対応できるようになり、

  • 「フロントエンドもできます!」
  • 「APIとの通信もOK!」
  • 「クラウド側の設定もわかります!」

という、フルスタック寄りな技術者が社内で育ってきた。


■ 自分自身のキャリアに起きた変化

このBlazor案件を通じて、自分にも確実な変化があった。


【変化①:フロントエンド開発への苦手意識が消えた】

「HTMLとかCSSとか…わけわからん」
そんな感覚が、今はもうない。

もちろんまだプロのWebデザイナーには敵わないけど、自分で簡単なUIならサクッと作れるようになった
「必要に応じて学べばいい」というマインドに変わった。


【変化②:クラウドサービスへの関心が高まった】

Blazorを使うことで、自然とAzureやAWS、API Gateway、Web API設計などの知識もついてきた。

「次はAzure Functionsとか勉強してみたいな」
「SignalR使ってリアルタイム通知とかやってみたい」
そんなふうに、技術への好奇心が広がっていった。


【変化③:コミュニケーションの幅が広がった】

フロントエンド、バックエンド、インフラ、営業サイド…
色んな部署の人たちと、**「同じ言葉で会話できるようになった」**のも大きな収穫だった。

特に営業チームやPMとの会話で、

「これ、Webなら即対応できますよ」
「次回リリースでバグ修正すぐ反映できます」

こんな風に提案できるようになったのは、エンジニアとして大きな武器になった。


■ 今後伸ばしていきたいスキル

Blazor案件を経験した今、次に自分が伸ばしたいと思っているのは次の3つ。

  1. 本格的なHTML / CSS / JavaScriptスキル
    → Blazorだけではどうしてもカバーしきれない細かいUI調整や、JS interopの部分で苦戦する場面がある。
  2. Web API設計力
    → フロントエンドとバックエンドのつなぎ目設計は、エンジニアとしてこれから必須スキル。
  3. クラウドサービス(Azure/AWS)の基礎知識
    → 今後の案件ではクラウドホスティングが当たり前になるため、デプロイ、ストレージ、セキュリティあたりを抑えたい。

■ 最後に:これからBlazorに挑戦するWPFエンジニアへ

もし今この記事を読んでいて、

  • 「WPFしかやってこなかったけど、大丈夫かな…」
  • 「Web開発、未経験なんだけど…」
  • 「Blazorって難しそう…」

そんな不安がある人がいたら、声を大にして言いたい。


「大丈夫。WPFでやってきたことは、必ずBlazorで活きる!」


確かに最初はつまずく。HTMLやCSSに混乱する。状態管理で頭を抱える。
だけど、一つ一つ乗り越えれば、きっとWebフロント開発も楽しくなる。

むしろ、これからの時代、
「デスクトップもWebも両方できるエンジニア」
はめちゃくちゃ市場価値が高い。

自分もまだまだ学びの途中だけど、Blazorを通じて一つ確信したことがある。


「変化を恐れず、技術に貪欲でいることが、エンジニア人生を面白くする。」


そんな気持ちで、次の案件も楽しみながら取り組んでいこうと思う。

コメント

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