アーキテクチャをスマートに。

株式会社ネオジニア代表。ITアーキテクトとしてのお仕事や考えていることなどをたまに綴っています。(記事の内容は個人の見解に基づくものであり、所属組織を代表するものではありません)

SIでWebシステムやるなら Java? いやいや ASP.NET MVC でしょ

お仕事(つまりSI、企業向け受託開発)で Webシステムを開発する際に、どんなアーキテクチャにすべきか、どのフレームワークプログラミング言語)を採用すべきかを考えた時、最近では ASP.NET MVC が良い選択だと実感しています。

ではなぜそれが良いのか、またメディアやネット上で流行りの他のフレームワークRuby on RailsPHP, Struts, Play, Node.js などよりどこが良いと思っているのか、実際の開発現場にいるエンジニアとして考えていることを整理してみました。

先に断っておきますが、前置きが長いです。
結論だけ読みたい方は一番最後の節まで読み飛ばして下さい。

まずはビジネス観点で

まず、SI業界では Ruby や Node.js の案件はまだ見たこと無い。
何が多いかというと、汎用機を除くと Java がほとんどで、その次が .NET、それ以外は少数派という市場構成。
.NET の内訳としては VB が大半だが C# も少なからずある。*1
PHP は小〜中規模なら見たことある。

他のフレームワークや言語について

まずは RubyPHP について。Railsなんかはとても良いフレームワークで、PHPにもいくつか良いとものがあると思いますが、これらは今の段階ではエンタープライズ系には向かないと思う。内製するならまだしもSIではちょっと考えられない。あとJavaについても少し考察。

Ruby
  • Ruby は柔軟性がありすぎて熟練度の低い人が入り混じったチームで開発を行った場合に、技術的負債を抱えやすい。
  • いろんな書き方が出来てしまうため、結局コーディング規約とかでガチガチにせざるを得ない。Perlなんかも同じ。
  • バッチとかで補助的に使うか、グルー言語として活用するなら便利だと思う。
  • 少数精鋭でのアジャイル開発なんかには向いていると思う。
PHP
  • PHP は逆に学習コストが低く、手軽すぎるため必然的に設計をおろそかにしがちで、大規模になってくると技術的負債を抱えやすい。(と感じる実装がとても多かった)
  • VBも歴史的な背景やVBAなどの影響もあり、文化的にかなりそれに近いと思っている。(後述)
  • ちゃんと設計すれば問題ないが、PHPVBの文化圏にそれが出来る人が居ない。(少なくとも自分が見聞きした現場ではそうだった)
  • ただしPHPリファクタリングしづらいと感じた。またすっぴんのPHPではなく何かフレームワークを使うべきでしょう。
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 MVCC# でも VB でも利用可能なので、ちょっと話がそれるかも知れませんが、例えば JavaC# を比較したときに C# の方が生産性が高いのなら、C# が使えるフレームワークを選択すれば良いと思っています。

C#がイイと思う理由(主にJavaと比較)
  • Delphiからの流れがあり、Javaより後発なので、モダンな言語のいいとこ取り。
    • 型推論
    • 文字列比較は == でOK
    • プロパティがあるのでゲッターセッター不要
    • 検査例外なし
    • デフォルト引数、名前付き引数
    • デリゲート、ラムダ式
    • dynamic型を使えばダックタイピングも可能
  • Java風の記法なのでとっつきやすい。
  • LINQ 超強力!もうこれなしでコレクション操作できない!
  • 言語仕様がオープンになり、Mono とか出てるし、VC + MFC時代と違ってベンダーロックしない。とは言っても発展が続くかどうかはMS頼みなところが大きい。
  • IDEサポート(これはC#というよりVisual Studioの話)

実は世間一般での C# の評価がちょっと低すぎると思ってます。
あと LINQ!これだけでも生産性が大きく向上します。知らない人は使ってみる価値があると思う。

VBじゃない理由

次に、VBはダメだと思う理由。(これは個人的な、非常に感覚論に近い理由です。開発現場の状況に合わせてVBを選択するのがベストなときももちろんあると思っています)

  • オブジェクト指向的な過去の遺産を引きずっている。これはメリットととらえることも出来るが、個人的には良いと思っていない。
  • インクリメント演算子 i++ がない。C系から来た人にはこれツライっす。
  • C系の言語と比較してコードの文字の量が多く、パッと見でうるさく感じる。(慣れの問題かも)

それから重視したい点として、同じ.NETでも C#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 良くない理由が混じっていたので修正しました)

  1. Rails ゆずりの CoC (設定より規約)の精神。たとえばクラスとビューの命名だけでURLルーティングが行われる、みたいな。面倒な設定は一切不要。
  2. MVCなのでユニットテストが書きやすい!(これはWebFormsに対する優位性かな)
  3. かなり賢いモデルバインダー。最近のFrameworkではもう当たり前になってきてるような気もするけど。
  4. MVC 3 から全く新しいビューエンジン「Razor」に移行し、古いASPXスタイル <% 〜 %> タグ地獄から脱却。結局デザイナとプログラマが分業することって、SIではほとんど無いので、直接C#コードがかけるほうが良いと思う。*2
  5. MVC 4 から Web API にも対応。レスポンスとしてオブジェクトをreturnするだけで、JSONXML に自動変換してくれる。
  6. MVC 5 で Bootstrap がデフォルトになり、結構イイ感じ。
  7. オープンソースhttp://aspnetwebstack.codeplex.com/ Apache ライセンス 2.0。
  8. その気になれば Mono を使って Linux サーバでもホスティング可能。
  9. エンタープライズ系以外でも、Windowsレンタルサーバも出てきてるし、クラウドならAWSもいいけど本家本元の Azure も凄くイイ。企業5年以内の開発会社なら BizSpark で相当使える。
  10. 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とか。