2019年10月18日
川俣晶の縁側ソフトウェア技術雑記 total 2889 count

.NET Coreの錯誤の正体とは何だろう?

Written By: 川俣 晶連絡先

「.NET Coreの錯誤って何だろう」

「どういう意味だ?」

「うん。.NET CoreはBlazorで使ってる時は致命的な問題を引き起こしていない。しかし、過去のソースコード資産を持って行ってみるとビルドが通るところまでまず行けなかった。イマイチどころか、イマ3ぐらい、いろいろ足りない」

「なんでそんなに差が出るのだろう」

「.NET Frameworkというのは、既に使われていない盲腸のような機能も長い間提供してくれるので、美しくはないし高性能でもないが、過去のソースコード資産を継承しやすかった」

「それで?」

「でも、.NET Coreというのは過去のダメなAPIは削ってもっと良いものに置き換えようとする技術だ。美しく性能は高いが移行コストはとても高く付くし、下手をすると全部書き直しになってしまうケースもあるがそんな予算はまず付かない」

「全く新規に書き直しになるBlazorなら、【どうせBlazor対応でほとんど書き直しだから.NET Coreへの移行コストなどたかがしれている】ということだね」

「そう。でも、膨大な過去のコード資産は違う。特に性能面で不満のないただのWindowsアプリが、ただのWindowsアプリとして動かすためにコストや時間を掛けられるのかと言えば掛けられない」

「MacやLinuxで動くようになるという特徴は?」

「WinFormやWPFのアプリは動かないよ」

「あれ? じゃあ手間暇を掛けるメリットって何?」

「新しい技術に立脚するようになって性能面や安定性でメリットがある」

「でもさ。不慣れな新し技術を使えば性能を引き出せるかどうか分からないし、そもそもソースを大幅に書き換えると安定性はむしろマイナスだよ」

「まあそういうことだな。実はあまりメリットがないんだ。長所は、【.NET Coreバンザイ。何もかも.NET Coreを理解して全てのメリットを引き出す】という.NET Core信者にのみもたらされる。別に.NET Coreを好きでも愛しても理解してもいない人に微笑んでくれるかどうかは分からない」

「それで君としてはどうする気だい?」

「Blazorは別に.NET Coreベースでもいいよ。事実上UIまわりは全部書き直しだ。非互換性は致命的な問題にはなっていない」

「じゃあ他のアプリは?」

「Windowsアプリは.NET Framerworkベースで行くよ」

「その理由は?」

「今更手間を掛けたくないので、既存の知識で書きたいが.NET Coreになると【あったはずのAPIがない】という事件がわりと起こるのでね。そこで開発が止まるのは効率が悪すぎる。そもそも、今更Windowsアプリのために時間は使いたくないのだ」

「ではWebのサーバアプリは?」

「それについては、未検討だ。ただ、できるだけサーバの役割を減らしていこうというのがBlazor支持の理由だからして、もうあまり大きなプログラムは書かない見込みだ。どれを使っても大差ないだろう」

結論 §

「結局.NET Coreの錯誤とは何だったと君は思う?」

「新しいフレームワークで新しいコードを書くのなら.NET Coreでもいい。でも、既存のコード資産を継承させようとしたのは失敗だったと思うよ。それはコストが掛かりすぎる」

「なぜマイクロソフトはコストが掛かりすぎる方法を推し進めているんだい?」

「そりゃ、.NET Coreと.NET Framerworkを両方メンテするとコストが掛かるからだよ」

「つまり、マイクロソフトはコストを掛けたくないので客に高コストの方法を要求しているということかい?」

「さあ、正確なところは知らない。ただし、今のままだと.NET Frameworkは第2のVB6になるね。ニーズが高すぎてサポートを切れなくなる」

「結局コストが掛かるんじゃないか」

「そうかもしれない」

「君は.NET Coreはどうあるべきだったと思う?」

「今までできなかったことを実現するための分野に特化するべきだったと思うよ。かつて、Windows 8のストアアプリもAPIにかなり非互換性があったけれど、全く異質の新しいアプリ世界を実現するためのものだから、まあ納得した。実際にはいろいろ上手く書けない機能もあったけどね。でも、.NET Coreはそうではなかった。過去のコード資産を移行させるために同じことをやると言ってしまった。そこは不味かったと思う」

「結局、Windows 8の時にストアアプリを書くために全く新規のAPIを使うことには納得したが、既存のアプリも全部同じAPIを使えと言われたら無理……という話と同じってことだね」

「まあな」

オマケ §

「ちなみに.NET CoreがWinFormやWPFをサポートしたら.NET Frameworkは要らないと言っているが人がいるがとんでもない勘違いだ」

「どこが間違いなんだい?」

「仮にサポートが完全だったとしても、プロジェクトから参照しているライブラリの中で、.NET Core対応できないライブラリが一つでもあれば移行はできない」

「あらゆるライブラリが.NET Core対応した後じゃないとなかなかプログラム本体の移行は難しいってことだね」

「しかもライブラリ自身が参照しているライブラリもあるからな。全部.NET Core対応するのは楽な話ではないし、もしかしたら対応できないかもしれない」

「対応できないって?」

「予算がないとかソースが見つからないとか。理由はいろいろ」

「そもそも開発した会社が残っていないとか」

「あり得る」

「今更WinFormを使うのは、豊富な外部UIコンポーネントが揃っているからという理由もあると思うけど、それが全部.NET Core対応してくれないとなかなか移行はきつそうだね」

「きついだろうね。代替品があっても肝心な機能が欠けていて開発が頓挫するとか。そういうことも割とよくある」