社員ブログ
HOME  社員ブログ
ホーム > .NET, Java, Windows, スマートフォン, ツール, データベース, デザイン, 社員:プリースト, 開発言語, 雑記 > MVVMとその周辺技術 ~新技術との向きあい方~

MVVMとその周辺技術 ~新技術との向きあい方~

2013年10月11日 7時31分02秒

こんにちは。プリーストです(^^)

久々に技術的なネタを考えようと思い立ちブログを書いています。


この記事は昔お世話になっていた先輩のアーキテクトの方と以前にFacebookで話した内容から発想を得ています。


○ソフトウェアプロダクト開発の分業について

今後、画面とビジネスロジック、もしくはスマホ等のクライアントサイドとWebサービス等のサーバサイドの開発、更にデザイン、もっと更にビジネス運営の分業化はもっと進んでいくと思われます。

最近、スマホに代表される第三のプラットフォームの登場で、カラー、配置、ツール使用のテクニック等のデザインの基礎知識だけではなく、UX設計、レスポンシブデザイン、HTML5等、デザインに関する知識が急速に広がりを見せており、ビジネスの結果に直結するほど重要性を増しています。

またスマートフォン、タブレット、リッチクライアント、もしくはHTML5 + JavaScript、各プラットフォームのネイティブ環境等クライアント技術の選択肢も増え、複数に同時に対応しなければならない局面も増え、使える技術の幅で解決方法の幅に大きな違いが出るでしょう。

サーバサイドはどうかというと、RoRに代表されるフルスタックフレームワークの登場やREST、WebSocket等の新しいクライアントとのコミュニケーション方法、今までのリレーショナルDBに加えビッグデータ等非構造化DBといった新しい技術の選択肢が増え、今までより更に、適切な技術を選択し、プロダクト全体を設計する事がコーディング自体のスピードアップより開発効率に大きく影響するでしょう。
クライアント-サーバシステムにおいてもクライアントアプリケーションの配布コストが格段に低くなり、Webシステムとクライアント-サーバシステムのどちらの構成をとるかという点も今までより考慮が必要になってきます。
更に、使用可能なデータの幅が広がることで現実社会や企業、個人の課題を解決する独自のアルゴリズムがプロダクトの差別化において重要なセールスポイントとなる事も多くなるでしょう。

それと同時に、一旦高効率な技術の組み合わせのパターンが完成したり、またはフルスタックのフレームワーク、完成度の高いUIライブラリを使ったりすると個人でも十分1つのプロダクトを完成させることができる時代でもあり、面白くなってきたなと思います。


○とあるプロジェクトにて

2年程前にMicrosoftの最新技術を使ったシステムを開発する機会がありました。
その時のお客様がMicrosoftMVPに選ばれている方ということもあり、基本的なシステム構成はその方が作ってくれましたが、Microsoftの最新技術をふんだんに使用したモダンで高効率な構成でした。。
システム構成は、クライアント-サーバとWebシステムの混合で、同じDBを社内システムではクライアント-サーバシステムを用い、遠隔地の取引先ではWebシステムをインターネット経由で使用するという構成です。

システム構成の雛形を作っていただいた後は殆ど一人で完成までこぎつけました。
一人でも開発が間に合った要因としては、その雛形がすごくよくできていたこと、そのMVPの型に開発の道筋を既に示して頂いていたこと、Microsoftの新しい.Net技術が誰でも開発できる技術から、多少難解でも開発効率を優先した技術にシフトしていた事かなと思います。理解するのは結構大変でしたが(笑)


これは、最近リリースされたJava7でも、簡易性や間違いのなさより開発スピードを求める変更がされています。どちらもRuby on Railsが発表され、その開発効率と人気に刺激を受けたのだと思います。

この辺の新潮流へのタイミングの違いは、より早く新しいプラットフォームへ移行することがビジネス上重要なMicrosoftと現存のコミュニティと開発者の支持を大切にしたいJava陣営とのビジネスモデル上の違いとも言えるかもしれません。
Oracleとの関係で今後Javaがどうなっていくのかは注意深く見守りたいと思います。

Java7では下位互換性の為に保留したよりアグレッシブな機能もJava8では取り入れられる予定のようです。

Java新時代へ – [1]JVM、API、言語仕様—Javaは三つの柱をベースに進化を続ける:ITpro


そのプロジェクトで使用したMicrosoftの技術は下記です。
1つのプロダクトを1つのベンダの技術で作るにしてもこれだけ多くの技術を使用するんだなとびっくりしました。
一言でC#といっても下記に書いたのはほんの一部でしかなく、他にも数々の開発プラットフォームやフレームワークがありMicrosoft1社でよくこれだけの数のプロダクトを作れているなと関心したくらいです。

以下の説明は私がこんなことかなと理解したことを書いています。もし間違っていたらご指摘くださいませ(^^)

■C#
■WPF(Windows Presentation Foundation)
■Silverlihgt

■MVVMパターン
MVVMパターンとイベント駆動開発、そしてMVC/MVP/PMパターンとの関係 – 何故MVVMなのか – the sea of fertility

今までのボタンクリック等のイベントがコマンド、ビヘイビア、アクションといったプロパティベースの考え方となり、画面のコントロール等にそれらを設定することで操作時の挙動を決定します。
この考え方によってインターフェイスデザインと操作による処理を明確に分離できる構成となっています。

■WCF RIAServices
WCF RIAServicesで業務アプリケーションをよりシンプルに (1/5):CodeZine
サーバサイドのDBアクセスやドメインモデルを使ったサービスを、サーバにある事を意識せずに透過的に扱えます。
これは設定ファイル等でクライアント-サーバ間の規約を設定すると、余計な通信ロジック等を書かずに実装できる事を意味します。

■Entity Framework
エンティティ フレームワークの概要

これは、DBのリレーショナルモデルとビジネスロジックのオブジェクトモデルを相互変換する機能で、Hibernate等のO/Rマッパーと類似したフレームワークです。
これを使うと今までループを使用して何行も書いていた処理が1行で書けてしまうので実装、変更がとても楽になります。
様々な判定文も抽出条件として書けるのでぱっと見で何をしたいかが分かりやすい所もすごくいいです。

■LINQ(Entity Frameworkで使用するクエリ言語)
統合言語クエリ (LINQ: Language-Integrated Query)
これは、リレーショナルDBのデータのみではなく、配列等のアプリケーションデータもSQLに似たクエリを使用して、集計処理や抽出処理を可能にする言語機能です。
更新処理よりもクエリを使う方が圧倒的に多いでしょうか。

■ラムダ式
C#ラムダ式 基礎文法最速マスター - @IT
これはメソッド等の引数として処理自体を渡す時に使用します。
今までは、デリゲートという機能を使って処理の型を定義しインスタンス化して渡さなければならなかったものが、1行で書けてしまいます。
メソッドに渡す処理(これもメソッド)は呼び出す処理事に異なることが多いのでその場で簡単に書けるこの機能はとても重宝します。
便利な反面、意味を理解するまではとっつきにくいということもあります。



○.Net技術の要点

MVVMパターンが一番の要点となる技術で難解かなと思います。
コマンド、アクション、ビヘイビア、トリガーといったプロパティベースの書き方はそれまでの.Net技術にあったインターフェイス、デリゲートといった処理呼び出し技術を活用してイベントや、メソッドの呼び出し形式を統一し、UIから見るといつでも付け替え可能にしてUIとビジネスロジックを分離することが目的の技術です。
プログラマとデザイナの協業をターゲットにしています。

WPF/Silverlight開発をすると、最初に出会うこれら多くのカタカナ言葉にウッ!!とくる方も多いかと思いますが、結局は処理の呼び出し方をパターン毎に定型化し呼び出し側で付け替え可能にする試みが本質だと思ってます。

また、ラムダ式、匿名メソッド、アクション、ビヘイビアはデリゲートを簡易に記述できるようにする試みであり、LINQを簡易に記述する目的やイベントを簡易に記述する目的があります。

このプロジェクトを通じてインターフェイス、デリゲートが.Net技術の基本技術なのかもしれないなとその時は感じました。
Microsoftが分かりやすさや開発者がミスしないように縛ることよりも、きちんと学習した技術者の生産性を重視し始めているように思えます。
スキルにばらつきのある大規模開発よりも少数精鋭で行う開発をターゲットにし始めているのではないかと感じました。
Ruby on Rails等の生産性を意識した方針転換であることは間違いなさそうです。この流れにJavaも追随していたり難しくても高効率のエディタが流行ったり時代の流れを追いかけるのも楽しいです。


以前にFacebookで話した先輩は、目の前にある技術を自分の考える自然なアーキテクチャの為に利用はしても技術に振り回されることはありませんでした。常にその人の思想の方が一歩先を行っている感があって、数年後に同じ思想の技術が出るとやっぱりすごいなと思わされます。

その方は自分なりの自然なアーキテクチャの感覚を持っていたり、.NetやJavaの技術の本質よりさらに本質のドメインモデル vs トランザクションスクリプトといった設計の本質まで発想していて、今思い出してもすごい人です。


○まとめ

新しい技術と対峙する時に大切な事は、その実装方法の詳細ではなくその技術の目的や本質に目を向け理解を深めることかなと思っています。
そうすればプロジェクトで技術の選択をする時の判断力、アーキテクチャを設計する時の見通し、新技術の理解スピードが格段に違ってきます。


この記事で紹介した.Netの一部の技術は、スキルにばらつきのあったり人数が多くコードの統率が取りづらい大規模開発には向かないかもしれません。
新技術は常に何かの課題を解決する為に古い技術にあった何かを犠牲にして生まれてきます。

それに2年前のこれらの技術は、Microsoftだけで見ても、Windows8とストア・アプリというプラットフォームが出てきた今では古い技術になってしまいました。
それでもその時に学んだ本質とその目的はこれからも役に立ち続けるでしょう。

様々なプラットフォームが乱立する現在は逆に全ての企業が共通プラットフォームとして、HTML5 + JavaScriptの方を向いているということあり、Javaと合わせて興味もそちらにシフトしていきますが、古い技術、新しい技術をその状況に応じてフラットな視点で見る姿勢は保ち続けたいです。


ソフトウェアの技術は他の分野の技術と異なりハードウェアの制約以外自然の制約を受けることはほとんどありません。 人が意図を持ってその人の頭から生み出した技術です。 なので、その技術の設計者の意図、目的に近づくことが本質を知るということなのかなと思います。


最終的には、開発者への思いやりやプロダクトを使用するユーザが本当はどんな非機能要件を望んでいるかといったユーザへの思いやりが根っこに必要なんだろうなぁと思います。


ちなみに、そのプロジェクト終了後にまとめの為にリンク集を作成したものを貼っておきますので参考までに。

WPF、Silverlight、MVVMを使う人にオススメ記事 – NAVER まとめ



※デリゲート:メソッド等に処理(メソッド)を渡す時のポインタのような働きをする。
またはポインタを表現するインスタンスを生成する為のメソッド専用のクラス定義の
ようなものとも言える。

デリゲート (プログラミング) – Wikipedia

それでは、また♪


.NET, Java, Windows, スマートフォン, ツール, データベース, デザイン, 社員:プリースト, 開発言語, 雑記 , , , , , ,

  1. コメントはまだありません
  1. トラックバックはまだありません