SIでWebシステムやるなら Java? いやいや ASP.NET MVC でしょ
お仕事(つまりSI、企業向け受託開発)で Webシステムを開発する際に、どんなアーキテクチャにすべきか、どのフレームワーク(プログラミング言語)を採用すべきかを考えた時、最近では ASP.NET MVC が良い選択だと実感しています。
ではなぜそれが良いのか、またメディアやネット上で流行りの他のフレームワーク、Ruby on Rails や PHP, Struts, Play, Node.js などよりどこが良いと思っているのか、実際の開発現場にいるエンジニアとして考えていることを整理してみました。
先に断っておきますが、前置きが長いです。
結論だけ読みたい方は一番最後の節まで読み飛ばして下さい。
まずはビジネス観点で
まず、SI業界では Ruby や Node.js の案件はまだ見たこと無い。
何が多いかというと、汎用機を除くと Java がほとんどで、その次が .NET、それ以外は少数派という市場構成。
.NET の内訳としては VB が大半だが C# も少なからずある。*1
PHP は小〜中規模なら見たことある。
他のフレームワークや言語について
まずは Ruby や PHP について。Railsなんかはとても良いフレームワークで、PHPにもいくつか良いとものがあると思いますが、これらは今の段階ではエンタープライズ系には向かないと思う。内製するならまだしもSIではちょっと考えられない。あとJavaについても少し考察。
Java
- エンタープライズ系はレガシーなJavaが多く、Java 7 はほとんどない。少し前のシステムなら Java 6、ヘタしたら Java 5。さすがに 1.4 は無いと思う。1.4は総称型とオートボクシングがないのでまともに使えないよね。
- Javaは言語仕様が厳格な反面、冗長すぎて面倒くさい。→生産性が低い。例えば、型推論、デリゲート、ラムダ式、プロパティ、がないとか。
- Windowsアプリ系も出来ないことはないけど、Windowsのシステムプログラミングには向かない。
- 新規開発するなら Java 8 より Scala に移行した方がいいんじゃないかと思う。PlayFramework 2 とか Lift とかあるし、過去のJava資産も流用できるし。
- そんなわけで勝手にオワコン認定してる。なくなることはないだろうけど、少なくともイノベーションが起きるとは思えない。ポストCOBOL?(超個人的な見立ての話です。根拠なし。)
- ただひとつ気になる点をあげれば Android 周辺での動きかな。
後半は少し話が飛躍しすぎてるかも。
C#がイイんです!
で、ASP.NET MVC は C# でも VB でも利用可能なので、ちょっと話がそれるかも知れませんが、例えば Java と C# を比較したときに C# の方が生産性が高いのなら、C# が使えるフレームワークを選択すれば良いと思っています。
C#がイイと思う理由(主にJavaと比較)
- Delphiからの流れがあり、Javaより後発なので、モダンな言語のいいとこ取り。
- Java風の記法なのでとっつきやすい。
- LINQ 超強力!もうこれなしでコレクション操作できない!
- 言語仕様がオープンになり、Mono とか出てるし、VC + MFC時代と違ってベンダーロックしない。とは言っても発展が続くかどうかはMS頼みなところが大きい。
- IDEサポート(これはC#というよりVisual Studioの話)
実は世間一般での C# の評価がちょっと低すぎると思ってます。
あと LINQ!これだけでも生産性が大きく向上します。知らない人は使ってみる価値があると思う。
VBじゃない理由
次に、VBはダメだと思う理由。(これは個人的な、非常に感覚論に近い理由です。開発現場の状況に合わせてVBを選択するのがベストなときももちろんあると思っています)
文化の違い
歴史的な要因や、VBAやVBSなどといった簡易的なプログラミング環境があるためか、プログラムの専門家でない人でもVB利用者として存在する。ネット上や実社会のコミュニティにも存在する。
C#文化の人とVB文化の人では、エンジニアリングに於いて思考のベクトルが大きく異なる。ありていに言えば、より良く書こうということよりも、とりあえず動けば何でも良い、といった思考になることが多い。早い話がコピペ思考。
それが悪いとは言わないが、結果的に技術的負債を盛大に抱えたシステムになりがち。ていうか必ずなる。VBでまともなシステム見たこと無い。マジでこれまでにたった一つも無い。
これはPHP文化圏にも同様に感じていることですね。WordpressなんかはPHPでよくできてると思うんやけどな。ちゃんと設計すればいいのに、手軽に作れるのがPHPのいいところなので、それが裏目に出ているような気もする。
ASP.NET MVC 発見
上記の理由から、C# で Ruby on Rails 的なフレームワークはないかずっと探していた(WebForms については論外。全く眼中になかったし、ほとんど業務で使ったこと無い)。
で ASP.NET MVC なわけですよ。実際、まともに使えそうだと思ったのは ASP.NET MVC 3 からですかね。
ASP.NET MVC とは
従来の ASP.NET とは全くの別物。コア機能は共通なようだが、フレームワークとしての設計思想や概念は全く異なる。
もうちょっと別の名前にして欲しいぐらい。
従来の ASP.NET は WebForms といって、Windowsデスクトップアプリと同じような感覚でWebアプリを作れるようにしよう、という発想で作られたフレームワーク。個人的にはかなり邪悪なものだと思っている。
対してMVCは、まぁ早い話が Rails のパクリ。
ASP.NET MVC が良いと思う理由
とりあえず思いつくままにあげてみる。(2014/2/27 良くない理由が混じっていたので修正しました)
- Rails ゆずりの CoC (設定より規約)の精神。たとえばクラスとビューの命名だけでURLルーティングが行われる、みたいな。面倒な設定は一切不要。
- MVCなのでユニットテストが書きやすい!(これはWebFormsに対する優位性かな)
- かなり賢いモデルバインダー。最近のFrameworkではもう当たり前になってきてるような気もするけど。
- MVC 3 から全く新しいビューエンジン「Razor」に移行し、古いASPXスタイル <% 〜 %> タグ地獄から脱却。結局デザイナとプログラマが分業することって、SIではほとんど無いので、直接C#コードがかけるほうが良いと思う。*2
- MVC 4 から Web API にも対応。レスポンスとしてオブジェクトをreturnするだけで、JSON や XML に自動変換してくれる。
- MVC 5 で Bootstrap がデフォルトになり、結構イイ感じ。
- オープンソース。http://aspnetwebstack.codeplex.com/ Apache ライセンス 2.0。
- その気になれば Mono を使って Linux サーバでもホスティング可能。
- エンタープライズ系以外でも、Windows系レンタルサーバも出てきてるし、クラウドならAWSもいいけど本家本元の Azure も凄くイイ。企業5年以内の開発会社なら BizSpark で相当使える。
- SignalR もありますよ。これは何かというと、WebSocket を使ってRPCをするようなイメージ。クライアント側でJSメソッドコールするとサーバ側のメソッドが実行されて戻り値が返される、みたいな。WCFのマルチプラットフォーム化を目指してるんだろうか。。。?
留意点
留意点として、「M・V・C」 の Model の部分は厳密に言えば提供されないことについて書いておきます。
早い話が、Rails で言う ActiveRecord みたいな魔術はついてません。要するにDBインタフェースに何を使うかは自由です。
Entity Framework を組み合わせるのが一般的な構成のようです。RailsチックなModelクラスからのスキャフォールディングは出来ます。なので簡単なマスメンぐらいなら自動生成するだけでCRUD操作が完成します。
ただし、Oracle と組み合わせる場合 EntityFramework のコードファーストに対応してないので注意が必要。DBファーストのみ。あと、EntityFramework はパフォーマンスが悪いのがネックかな〜。
ダラダラと書きなぐってすんません。かなり主観的で感覚論です。もうちょっとマシなレポート書けるようになりたいな〜 orz
*1: ソフトウェアメトリックス調査 http://www.meti.go.jp/meti_lib/report/2012fy/E002056.pdf
*2:ちなみに他のビューエンジンも使うことが出来ます。ピュアHTMLが良いならSparkとか。