<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>アーキテクチャ &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/アーキテクチャ/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>今話題のマイクロサービス・アーキテクチャについて、本格的に実践中のビズリーチさんに聞いてみた！</title>
		<link>/miyuki-baba/14776/</link>
		<pubDate>Tue, 09 Jun 2015 00:00:51 +0000</pubDate>
		<dc:creator><![CDATA[馬場 美由紀]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[サイト制作]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[アーキテクチャ]]></category>
		<category><![CDATA[フレームワーク]]></category>
		<category><![CDATA[マイクロサービス]]></category>

		<guid isPermaLink="false">/?p=14776</guid>
		<description><![CDATA[連載： アプリケーションアーキテクチャ最前線 (5)巨大化・複雑化したモノリシックなアプリケーション開発から、サービスを小さい単位に分割し、開発のスピードを上げようとするマイクロサービスが注目されています。アプリ開発のア...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/arch/" class="series-287" title="アプリケーションアーキテクチャ最前線" data-wpel-link="internal">アプリケーションアーキテクチャ最前線</a> (5)</div><p>巨大化・複雑化したモノリシックなアプリケーション開発から、サービスを小さい単位に分割し、開発のスピードを上げようとするマイクロサービスが注目されています。アプリ開発のアーキテクチャとして関心はあるのものの、実際にはどのようなメリット・デメリットがあるのかは気になるところ。</p>

<p>そこで、マイクロサービスアーキテクチャを採用して新サービスをリリースしたという株式会社ビズリーチ・CTO室チーフアーキテクトの竹添直樹さんに、お話を伺ってきました。<br>聞き手は、HTML5 Experts.jp編集部・岩瀬義昌（@iwashi86）さん、HTML5 Experts.jp編集長・白石俊平さんです。</p>

<p><img src="/wp-content/uploads/2015/04/microservice-1.jpg" alt="" width="600" height="390" class="aligncenter size-full wp-image-14777" srcset="/wp-content/uploads/2015/04/microservice-1.jpg 600w, /wp-content/uploads/2015/04/microservice-1-300x195.jpg 300w, /wp-content/uploads/2015/04/microservice-1-207x135.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p><style>
.post-detail-contents p {
  text-indent:0
}
</style></p>

<h2>そもそもマイクロサービスって何ですか？</h2>

<p><strong>岩瀬</strong>：そもそもマイクロサービスとは、どのようなアーキテクチャなのでしょうか。</p>

<p><strong>竹添</strong>：システムをがちっとした一枚岩で作るのでなく、コンポーネントに分割して、小さなサービスの集合体として構築するという考え方がマイクロサービスです。各サービス間は疎結合で、HTTPやMessagingなどでつなぎ、通信し合えるように設計します。</p>

<p><img src="/wp-content/uploads/2015/04/hx2.png" alt="" width="605" height="395" class="aligncenter size-full wp-image-14840" srcset="/wp-content/uploads/2015/04/hx2.png 605w, /wp-content/uploads/2015/04/hx2-300x196.png 300w, /wp-content/uploads/2015/04/hx2-207x135.png 207w" sizes="(max-width: 605px) 100vw, 605px" /><span style="font-size: 90%;">　▲<a href="http://www.slideshare.net/takezoe/scala-jissenscala-44962449" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ビズリーチの新サービスをScalaで作ってみた～マイクロサービスの裏側 #jissenscala</a></span></p>

<p><strong>岩瀬</strong>：一般的に、これがマイクロサービスだという代表例はありますか？</p>

<p><strong>竹添</strong>：外側から見ているとわかりにくいですが、Amazonさんのシステムがそうですね。チームがそれぞれ独立してサービスを作っていて、裏側はそれぞれマイクロサービスになっているというのは有名です。</p>

<p><img src="/wp-content/uploads/2015/04/microservice-12.jpg" alt="" width="640" height="428" class="aligncenter size-full wp-image-14842" srcset="/wp-content/uploads/2015/04/microservice-12.jpg 640w, /wp-content/uploads/2015/04/microservice-12-300x201.jpg 300w, /wp-content/uploads/2015/04/microservice-12-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><span style="font-size: 90%;">　▲株式会社ビズリーチ CTO室 チーフアーキテクト　竹添直樹さん</span></p>

<p><strong>岩瀬</strong>：モノリシックのほうはどうでしょう。</p>

<p><strong>竹添</strong>：小さくてまだ立ち上げたばかりのサービスは、モノリシックが多いと思います。そうしたサービスが大きくなるにつれて機動力が落ち、メンテナンスコストも増大するにつれ、マイクロサービス化するという流れが多いのかなと。</p>

<p><strong>岩瀬</strong>：ちなみに例えばWordPressは、がっつり一枚岩で作られている印象があるのですが、モノリシックですか？</p>

<p><strong>竹添</strong>：マイクロサービスの粒度をどう考えるかによりますね。ブログという一つのサービスと見ることもできるし、アーキテクチャとしてはがっちり一枚岩だと思います(笑)。</p>

<p><strong>岩瀬</strong>：確かに、人によって解釈が違うから定義は難しいですね。</p>

<p><img src="/wp-content/uploads/2015/04/microservice-7.jpg" alt="" width="640" height="407" class="aligncenter size-full wp-image-14843" srcset="/wp-content/uploads/2015/04/microservice-7.jpg 640w, /wp-content/uploads/2015/04/microservice-7-300x191.jpg 300w, /wp-content/uploads/2015/04/microservice-7-207x132.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><span style="font-size: 90%;">　▲HTML5 Experts.jp編集部　NTTコミュニケーションズ 技術開発部所属 <a href="https://html5experts.jp/iwase/" data-wpel-link="internal">岩瀬 義昌</a>さん</span></p>

<p><strong>竹添</strong>：たとえば、決済サービスは呼ぶ側からすれば、マイクロサービスと言えるかと。</p>

<p><strong>岩瀬</strong>：たしかに！では、Web制作で最近よく見るシングルページ・アプリケーションはいかがでしょうか？</p>

<p><strong>竹添</strong>：フロントエンドがどうあれ、裏側にあるサーバーサイドのシステムが一枚岩かどうかが、マイクロサービスとモノリシックの違いになります。例えば管理者向けの機能とコンシューマ向け機能がそれぞれが独立されたサービスになっていて、APIで必要なデータだけをやりとりする…といった作りがマイクロサービス。フロントエンドとバックエンドのやりとりが、APIでシンプルになっているからといって、マイクロサービスというわけでもないんです。</p>

<h2>マイクロサービスのメリットとデメリット</h2>

<p><strong>岩瀬</strong>：マイクロサービスのメリットって、どんなところだとお考えですか？</p>

<p><strong>竹添</strong>：そもそも弊社がマイクロサービスを採用したのは、それぞれのサービスが独立して開発やメンテナンスができるからなんです。全サービスのシステムへの影響を考えなくていいのが、最大のメリットと言えるでしょう。どんなシステムも、運用をずっと続けていくとアーキテクチャが古びてしまうことは避けられません。そのときに全部新しいものに載せ換えるのは、全サービスの停止を伴うことが多いので、リスクも高いしコストもかかる。部分的にメンテナンスしたり、稼働できるというのはいいですね。</p>

<p>運用面やバッチ処理、アップデートも、そのサービスごとに単位で入れ替えたりできる。古いアーキテクチャを差し替えるときや、新しいサービスを立ち上げるときも既存システムを止めずに開発できるので、トライアルもしやすいです。また、SEOが重要なサービスと、業務寄りのサービスとでは目指す方向も、適している技術も違います。サービスごとに技術の選択ができるのは大きいですね。</p>

<p>開発者の問題もあって、全部同じ技術でできるかというとそうでもない。エンジニアによって得手不得手があるので、チームとしてもプロジェクトとしてもスケールしやすい面があるなと。</p>

<p><strong>岩瀬</strong>：スケーラビリティはキーワードですね。バックエンドの言語を好きに選べるというのは、生産性も上がるし、組織的なメリットがあると思います。</p>

<p><img src="/wp-content/uploads/2015/04/microservice-14.jpg" alt="" width="640" height="410" class="aligncenter size-full wp-image-14845" srcset="/wp-content/uploads/2015/04/microservice-14.jpg 640w, /wp-content/uploads/2015/04/microservice-14-300x192.jpg 300w, /wp-content/uploads/2015/04/microservice-14-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>岩瀬</strong>：では、マイクロサービスのデメリットはいかがでしょうか？</p>

<p><strong>竹添</strong>：デメリットの部分ももちろんあります。サービスごとに冗長性を考えなくてはいけないので、コストも手間もその分かかります。モノリシックならロードバランサ一つでサービス全体を冗長化できますが、マイクロサービスだとそうもいかないので、オーバーヘッドとかインフラとか運用のコストがかかるのが悩みどころです。</p>

<p>また、実際に開発をやってみるとデバッグが難しいですね。いろんなサービスがつながっているので、どこで落ちたのかがわかりにくい。プログラミング的にも、今まで単純にトランザクションスクリプトで書いていたのがいろんなサービスに分割されていくので、単純にシリアルで呼び出していくとその分遅くなってしまう。</p>

<p>サーバサイドでも、並列に投げられるところはパラレルに取りに行ったりする並列プログラミングや、非同期的な処理を扱うクライアントサイドの知識が求められるようになってきました。慣れていないとキツイかもしれませんね。アプリケーションプログラマに求められるスキルは上がっていると思います。</p>

<p><strong>岩瀬</strong>：これまで同期的なコードを書いてきたプログラマが、マイクロサービスでNode.jsなどの非同期な並列プログラミングをしようとしても、前の癖で同期的に書いてしまって、全然パフォーマンスが出ないというのもあり得るわけですね。</p>

<p>ちなみに先ほどデバッグの話が出ましたが、モノリシックに比べて、時間がかかって大変だったということはありますか？</p>

<p><img src="/wp-content/uploads/2015/04/microservice-9.jpg" alt="" width="640" height="404" class="aligncenter size-full wp-image-14847" srcset="/wp-content/uploads/2015/04/microservice-9.jpg 640w, /wp-content/uploads/2015/04/microservice-9-300x189.jpg 300w, /wp-content/uploads/2015/04/microservice-9-207x131.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>竹添</strong>：作っているときはそうでもないんですが、動かしてトラブルがあったときが大変ですよね。結合させてテストしているときや、プロダクションで何か起きたときのトラッキングとか。セッションIDを全部のログに含めるようにするなど、エラーをトラッキングできる仕組みを最初から作っておけばなんとかなるんですけど、それでも難しい時は難しいですね。</p>

<p><strong>岩瀬</strong>：設計の段階でわかっていればいいけど、結構大変だってことですね。コツがわかってくるといいのかもしれませんが。</p>

<p>では、サービスの監視についてはいかがでしょうか？<br />
以前、マイクロサービスとして各パーツを構築してみたのですが、クラウド上でサービスを作成・破棄することが多く、監視するサービスが増えて大変でした。もちろん、自動化して監視すればいいと思うんですが、その辺は具体的にどうされてましたか？</p>

<p><strong>竹添</strong>：自動で監視できるようにテンプレート化してますね。監視系の運用は、New Relic、Mackerel、SasS、ほかにも使えるものは何でも使ってます(笑)。サーバーの種類に応じて、Webサーバー用やデータベース用などを作ってます。</p>

<p><strong>岩瀬</strong>：いろいろ試されているんですね！</p>

<h2>マイクロサービスの実践例</h2>

<p><strong>岩瀬</strong>：ビズリーチでのマイクロサービス実践例について、聞かせてください。</p>

<p><strong>竹添</strong>：『<a href="https://jp.stanby.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">スタンバイ</a>』というインターネット上から求人情報をクローリングしてくる求人検索エンジンがそうです。</p>

<p><img src="/wp-content/uploads/2015/04/microservice-301.jpg" alt="求人検索エンジン「スタンバイ」" width="640" height="384" class="aligncenter size-full wp-image-15188" srcset="/wp-content/uploads/2015/04/microservice-301.jpg 640w, /wp-content/uploads/2015/04/microservice-301-300x180.jpg 300w, /wp-content/uploads/2015/04/microservice-301-207x124.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><span style="font-size: 90%;">　　▲求人検索エンジン <a href="https://jp.stanby.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">スタンバイ</a></span></p>

<p>垂直方向のアーキテクチャなのですが、コンシューマを向いている部分や、出稿企業に向いている部分、管理的なものや内部のAPIと接続したりといった、マイクロサービスになっています。</p>

<p>バックエンドのいわゆるAPIサーバーなどは、機能別にいろいろあるんですが、フロントも二層に分かれていて、直接HTMLからWebサーバーにアクセスするのではなく、間にAPIをはさんでいます。バックエンドは基本プリミティブに作っていて、フロントのAPIがHTMLを生成して直接返しているところもあります。</p>

<p><strong>岩瀬</strong>：共通する処理とかも結構あるんですか？</p>

<p><strong>竹添</strong>：認証とかがそうですね。例えばスマホのものであれば、同じようなAPIを共用できます…と言いたいところですが、やはりいろいろ予期せぬことが起こりましたね(笑)。</p>

<p>一応、もともとの思惑としてはチームをスケールさせたいという意図がありました。バックエンドとフロントエンドをきっちり分けて、フロントエンドだけでアプリをメンテできるようにしたかったという意図があったんです。</p>

<p><img src="/wp-content/uploads/2015/04/jissenscala.jpg" alt="" width="611" height="436" class="aligncenter size-full wp-image-14818" srcset="/wp-content/uploads/2015/04/jissenscala.jpg 611w, /wp-content/uploads/2015/04/jissenscala-300x214.jpg 300w, /wp-content/uploads/2015/04/jissenscala-207x148.jpg 207w" sizes="(max-width: 611px) 100vw, 611px" /><span style="font-size: 90%;">　▲<a href="http://www.slideshare.net/takezoe/scala-jissenscala-44962449" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ビズリーチの新サービスをScalaで作ってみた～マイクロサービスの裏側 #jissenscala</a></span></p>

<p><strong>岩瀬</strong>：バックエンドはScalaで書かれているんですよね？フロントエンドの人も頑張ってScalaを書かなくちゃならないようなことにはならなかったんでしょうか？</p>

<p><strong>竹添</strong>：全員ががっちり（Scalaを）書かなくちゃならない、ということにならないよう、役割分担を決めて、なるべくフロントエンドで修正が完結するようにしています。とはいえどうしても、サーバーサイドのプログラミングが必要になることもあるので、各チーム一人サーバサイドのサポートをできる人を配置したりはしています。その人が作ったパーツを使って、フロントエンドの人がテンプレートを作ったり。</p>

<p>フロントエンドのほうで全部できるのが理想的なんですけどね。開発のライフサイクルが全然違うので。フロントだけデプロイとか、もっと短いスパンでやっていけるといいなと。ちょっと画面を変えるだけなのに、サーバーサイドも落とさなくてはいけないのは避けたいので、将来的はフロントエンドだけで回せるようにしたいと思っています。まだまだ試行錯誤しているところです。</p>

<p><img src="/wp-content/uploads/2015/04/microservice-11.jpg" alt="" width="640" height="404" class="aligncenter size-full wp-image-14855" srcset="/wp-content/uploads/2015/04/microservice-11.jpg 640w, /wp-content/uploads/2015/04/microservice-11-300x189.jpg 300w, /wp-content/uploads/2015/04/microservice-11-207x131.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>岩瀬</strong>：フロントとサーバーサイドのライフサイクルの長さの違いって、重要ですね。最近のフロントエンドでも、AngularやReactとかいろいろ流行があるから、必要に応じて対応していかなくてはいけない部分もありますよね。</p>

<p><strong>竹添</strong>：とはいっても、現実的には厳しいところもあります。フロントで完結できずに、サーバーサイドのエンジニアがサポートしなくてはいけない部分はどうしても出てきます。サーバサイドをサポートするエンジニアが少なくてボトルネックになってしまったり、PCとスマホで同じようなAPIを共有できると思っていたら、画面に引きずられて、結局画面のAPIが増えて再利用できなかったりすることもありました。パフォーマンスとか工数面で考えると、レイヤーが増えていくのでいい結果が出なかったり、JSONの処理にCPUを使うなどの性能面の課題もありましたね。</p>

<p>結局、時間的にチューニングしている余裕もないし、直接データベースをいじってしまうこともありました（苦笑）。工数的にも、想定よりかかってしまいましたね。</p>

<p><strong>岩瀬</strong>：その辺の開発はホント大変ですよね…。アーキテクチャは毎回試行錯誤されているのだと思いますが、次に設計するときはもっとうまくいきそうですか？</p>

<p><strong>竹添</strong>：実は、ここに来るまで何度かチャレンジはしているんです。最初はモノリシックに作って、それをバラしたり。この『<a href="https://jp.stanby.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">スタンバイ</a>』というサービス自体も、最初から大規模で開発することがわかっていました。工数の都合で密結合となっている部分もありますが、最終的には落ち着くんじゃないかと思っています。次からは、あらかじめ手を打って切り離せるところもあるんじゃないかと。</p>

<p><strong>岩瀬</strong>：サービスのどの部分が、マイクロサービスに変えていきやすかったといったことはありますか？</p>

<p><strong>竹添</strong>：今作っているサービスは、（モノリシックなサービスを）部分的に切り離してマイクロサービス化していったのではなく、一回捨ててマイクロサービスで構築し直したんですよね。既存の安定したサービスの隣や上とかに、新たなマイクロサービスを乗っけていくのであればまだやりやすいのですが、仕様もゆるい状態で全てのサービス開発が並列で進んでいくのが難しいところでした。最初はこの機能とこの機能だけとか縛りを設けて、少しづつ拡張していくとか、一個ずつサービスを作っていくことができればやりやすいと思います。</p>

<p><img src="/wp-content/uploads/2015/04/microservice-5.jpg" alt="" width="640" height="423" class="aligncenter size-full wp-image-14856" srcset="/wp-content/uploads/2015/04/microservice-5.jpg 640w, /wp-content/uploads/2015/04/microservice-5-300x198.jpg 300w, /wp-content/uploads/2015/04/microservice-5-207x137.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>マイクロサービス導入の選定ポイントは？</h2>

<p><strong>竹添</strong>：こないだ海外のScalaのカンファレンスに行ってきたときに聞いたのですが、「<a href="https://hootsuite.com/ja-jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HootSuite</a>」というSNSのクライアントツールを作っている会社が、PHPのモノリシックなアプリケーションからScalaのマイクロサービスにリプレイスしているという話がありました。</p>

<p>それによると、まず最初に手をつけたのが、認証系だったそうです。なぜかというと一番難しいところだから。最も難しいところから一番最初にやれば、ほかのところもできるでしょうという考え方なんですよね。我々は経験値があまりないので、簡単なところからやろうとするけど、強いチームで「頑張ってやるんだ」という覚悟があれば、あとはできるだろうと。</p>

<p><strong>岩瀬</strong>：難しいところからやるって度胸ありますね（笑）。</p>

<p><strong>竹添</strong>：コードを静的解析して、どこが一番複雑かを分析してるんですね。リファクタリングと同じでダメなところからつぶしていく考え方じゃないかと。</p>

<p><strong>岩瀬</strong>：マイクロサービスはパーツが多いので、モノリシックなサービスに比べて壊れやすいと思うのですが、何か設計のポイントはありますか？</p>

<p><strong>竹添</strong>：ユーザー向けのサービスで、一個壊れると止まってしまうようなところは、必ず冗長化させるようにしています。ただ、全部冗長化させるとコストがかかるので、社内向けのシステムやバックエンドで動いているバッチ処理など、1日くらい止めてもいいサービスならゆるめにするとか、強弱をつけて冗長化しています。</p>

<p><strong>岩瀬</strong>：クリティカルなところはかなり力を入れているんですね。</p>

<p><strong>竹添</strong>：検索サービスは弊社のサービスとしてかなりメインになっていくので、スケールすることが前提です。コストをかけても実装しておくようにしていました。</p>

<p><strong>岩瀬</strong>：マイクロサービスは冗長化しておくように、頑張って作らないといけない部分もありますよね。</p>

<p><strong>竹添</strong>：弊社はAWSを使っているのと、冗長化についてはかなり学んでいるので、その辺はなんとかなっています。もちろん、エンタープライズのミッションクリティカルなものと比べると、やりきれていない部分もありますけどね。本当なら相乗りさせられるものはしたほうが運用も楽になるし、コストも下げられると思いますが、まだそこまでやりきれてない。</p>

<p><strong>岩瀬</strong>：今回はマイクロサービスで作ったけど、次回はモノリシックで作ったほうがいいとか判断に悩むことがあると思うのですが、何か選定ポイントはありますか？</p>

<p><strong>竹添</strong>：開発のときのオーバヘッドや、インフラコストで見ると、短期的にはデメリットのほうが大きいと思っています。どこかで損益分岐点はあると思うんですが。とりあえずスモール仕立てでやってみようとか、成功するかまったくわから状況なら、モノリシックで作って、後から大きくなったタイミングでマイクロサービスにしてもいいのではないでしょうか。</p>

<p>ただ、Webのサービスが大きくなるときはビジネスとして勝負時だし、攻めどきなので、
その事業が大きくなるタイミングでシステムを止めてコアアーキテクチャを変えるという判断は簡単にはできません。経営判断が必要になるかと。</p>

<p><img src="/wp-content/uploads/2015/04/microservice-6.jpg" alt="" width="640" height="389" class="aligncenter size-full wp-image-14854" srcset="/wp-content/uploads/2015/04/microservice-6.jpg 640w, /wp-content/uploads/2015/04/microservice-6-300x182.jpg 300w, /wp-content/uploads/2015/04/microservice-6-207x126.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>もしリソースがあるなら、現状のモノはエンハンスを続けながら、マイクロサービスで作りなおすなど、体制を組むという選択肢もあるが難しいですね。特に企業向けのサービスをやっていると、機能的に変わってしまうとか、デグレードしてしまうのは、許されない面もあるので。最初からこれだけ大きなサービスにするというように決められたら、マイクロサービスで作るという判断もできると思います。</p>

<p>大きくなったタイミングで経営判断もあるが、あきらかにスケールすることが見えていればマイクロサービスにするほうがいい。ある程度大きくなってくると、プロダクトとしても、チームとしてもマイクロサービスでないとスケールできない。モノリシックだとレガシー化してしまうので、新しい技術も入れられないし、新陳代謝していかないと新しい人も入ってこない。両面的に健全ではないです。</p>

<p><strong>岩瀬</strong>：例えば新しくチームメンバーが増えたとき、モノリシックなら全体像が見えるけど、マイクロサービスは全体像が見えにくくて困る…といったことはないのでしょうか？</p>

<p><strong>竹添</strong>：それはもちろんありますね。ただ、ひとつひとつのサービスのインターフェイスが明確であれば、それほど問題はないはずです。サービス開発を立ち上げたばかりだと難しいところもありますが、なんとか頑張って、インターフェイスだけはちゃんとしようと思っています。まだそこまで到達していない過渡期ではありますが…。</p>

<p><strong>岩瀬</strong>：インターフェイスは、ほぼJSONでやりとりしているようですね。JSONのスキーマはどのように定義しているのでしょうか？<a href="http://json-schema.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JSON Scheme</a>を使ったりしているのでしょうか？</p>

<p><strong>竹添</strong>：インターフェースは、内部ではScalaのオブジェクトで定義しています。JSONを直接さわることはほぼありませんね。ただそれだと、（Scalaを知らない）フロントエンジニアにとってはハードルが高いので、そこもカバーできるようなものがあるといいのですが。型定義の強いTypeScriptにトライしているチームもありますね。</p>

<p><strong>白石</strong>：インターフェース定義がJSONを前提としていないということは、他のシリアライズ方法に切り替えることも難しくなさそうですね。先ほど、JSONのシリアライズ・デシリアライズ処理の負荷の話が少し出ましたが、例えばそれをJavaのシリアライゼーションやProtocol Bufferに置き換えたりすることで、処理負荷を軽減することもできるんでしょうか。</p>

<p><strong>竹添</strong>：その辺も研究はしています。ただ扱っているデータがテキストが多いので、バイナリ形式にしてもあまり速くならないんですよね。<a href="http://msgpack.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MessagePack</a>とかも試しましたが、あまり変わらなかったので、今は使いやすさでJSONを選んでいます。コンパクトな情報でやりとりしているところは、プロトコルを変えたりとか、今後検討の余地はありますが。</p>

<p><strong>白石</strong>：マイクロサービスのAPI設計はどのように行うのですか？サービス同士が複雑な依存関係を持たないように設計するには？</p>

<p><strong>竹添</strong>：マイクロサービスの設計を適切に行うのはなかなか難しいですが、あるまとまった処理を他の部分から独立させうるかどうか、複数のサービスから利用されうるかどうか、といったところがひとつの判断基準になると思います。その上で、データベース処理を必要とするかどうかによって、ライブラリとして実装するか、サービスとして実装するか判断する感じでしょうか。データベースアクセスを伴わないなら、ライブラリとして配布すればいい。データベースアクセスを伴うのであれば、マイクロサービスにすることを考えますね。</p>

<p><img src="/wp-content/uploads/2015/04/microservice-15.jpg" alt="" width="640" height="412" class="aligncenter size-full wp-image-14851" srcset="/wp-content/uploads/2015/04/microservice-15.jpg 640w, /wp-content/uploads/2015/04/microservice-15-300x193.jpg 300w, /wp-content/uploads/2015/04/microservice-15-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>白石</strong>：データベースって、どうしているんでしょうか。マイクロサービスごとに別々のデータベースを持っているのか、それともひとつのデータベースを複数のマイクロサービスが共有しているイメージでしょうか？</p>

<p><strong>竹添</strong>：いえ、マイクロサービスごとにデータベースは分けています。</p>

<p><strong>白石</strong>：じゃあ、トランザクションはどうするんですか？</p>

<p><strong>竹添</strong>：マイクロサービスごとに切ってますね。</p>

<p><strong>白石</strong>：マイクロサービスをまたがるような処理を、ひとつのトランザクション内で行いたいという場合はありませんか？</p>

<p><strong>竹添</strong>：それぞれのマイクロサービスを、適切な粒度で切っているので、基本的には大丈夫かと。もっと大きくなって出てこないとは言い切れないかもしれませんが、そうなったら外側の仕組みでなんとかするかんじですね。</p>

<p><strong>白石</strong>：SOAPという選択肢はないですか？<a href="https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=ws-tx" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WS-Transaction</a>とかあると思いますが。</p>

<p><strong>竹添</strong>：ないですね。フロントがスマートフォンのアプリだったり、JavaScriptだったりするので、フロントエンドから使いやすいフォーマットということで。トランザクションが必要なところが切り出せているのと、参照系がほとんどなので現段階では問題として浮上していませんね。出てきたときには、大きな課題になるかもしれませんが。</p>

<p><strong>白石</strong>：マイクロサービス・アーキテクチャと、アジャイル開発との相性はいかがでしょう？特に、複数の小さなチームが連携しなくてはならないとなると、それぞれのチームがアジャイルに独立して進めるのは難しいのでは…と思ったのですが。</p>

<p><strong>竹添</strong>：私たちもスクラムで開発していますし、マイクロサービスとアジャイル開発の相性は良いと思っています。マイクロサービス間で、密に連携しなくてはならないという状況はそれほど多くないですし、そうした必要が生じた場合は、マイルストーンを置いて調整します。</p>

<p><strong>白石</strong>：例えばサービスに一個の機能を追加するとき、チームを横断した変更が必要になったりしませんか？</p>

<p><strong>竹添</strong>：チームとしてはマイクロサービスごとに（フロントエンドからデータベースまで）縦に分けているので、チーム内で完結しますね。そして、それぞれのチームの中でフロント・サーバーなどの役割分担があります。ひとつひとつのサービスの粒度も、小さいものから大きいものまであります。単機能のサービスもあれば、大きなWebアプリケーションだけど一つのマイクロサービスというものまであって、その中でスクラムを回すかんじですね。</p>

<p><strong>白石・岩瀬</strong>：いろいろ試行錯誤やチャレンジをされているお話を伺い、マイクロサービス・アーキテクチャ実践のポイントが見えてきた気がします。本日は貴重なお話をありがとうございました！</p>
]]></content:encoded>
		
		<series:name><![CDATA[アプリケーションアーキテクチャ最前線]]></series:name>
	</item>
		<item>
		<title>JJUGのエキスパートが語るエンタープライズ・アーキテクチャの過去、現在、未来──SOAP・RESTからIoT・ウェアラブルまで</title>
		<link>/yoshikawa_t/14403/</link>
		<pubDate>Fri, 15 May 2015 00:00:38 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[アーキテクチャ]]></category>
		<category><![CDATA[エンタープライズ]]></category>
		<category><![CDATA[クラウド]]></category>

		<guid isPermaLink="false">/?p=14403</guid>
		<description><![CDATA[連載： アプリケーションアーキテクチャ最前線 (4)特集企画「アプリケーションアーキテクチャ最前線」では、さまざまな視点からアプリケーションアーキテクチャをエキスパートたちに語っていただきます。今回は、エンタープライズ・...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/arch/" class="series-287" title="アプリケーションアーキテクチャ最前線" data-wpel-link="internal">アプリケーションアーキテクチャ最前線</a> (4)</div><p>特集企画「アプリケーションアーキテクチャ最前線」では、さまざまな視点からアプリケーションアーキテクチャをエキスパートたちに語っていただきます。今回は、エンタープライズ・アーキテクチャについて取り上げます。</p>

<p>HTML5・モバイル・IoT・ウェアラブルなどビジネス環境が激変する中、エンタープライズ・アーキテクチャはどういう課題を抱えていて、どうあるべきなのか。今回は、<a href="http://www.java-users.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JJUG (日本Javaユーザーグループ）</a>でご活躍中のお二人に話を伺うことにしました。</p>

<p><img src="/wp-content/uploads/2015/04/hx-21.jpg" alt="" width="600" height="354" class="aligncenter size-full wp-image-14671" srcset="/wp-content/uploads/2015/04/hx-21.jpg 600w, /wp-content/uploads/2015/04/hx-21-300x177.jpg 300w, /wp-content/uploads/2015/04/hx-21-207x122.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p>アーキテクチャを主軸に第一線で活躍している<a href="https://www.gxp.co.jp/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">グロースエクスパートナーズ株式会社</a> 執行役員の鈴木雄介さんと、「流しのアーキテクト」を自称する<a href="http://www.architectus.co.jp/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">株式会社アーキテクタス</a> 代表取締役の細川努さんを交えて、エンタープライズ開発出身の白石俊平編集長がさまざまなトピックスをぶつけていきます。</p>

<h2>XML Webサービスは今どうなったのか</h2>

<p><br>
<strong>白石：</strong>とりあえず、昔話から軽く聞いてみたいですね。まずは、エンタープライズ内のシステム間連携でよく話題に上がる、<a href="http://ja.wikipedia.org/wiki/SOAP_%28プロトコル%29" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SOAP</a>とRESTについての現状について、どうお考えでしょうか？
<br><br>
<strong>鈴木：</strong>SOAPは下火だと思われがちですが、私の知る限り、今でもよく利用されています。RESTとJSONの組み合わせも当然よく使われているんですが、（SOAPは）<a href="http://ja.wikipedia.org/wiki/Web_Services_Description_Language" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">WSDL</a>で型定義ができるので、それなりにかたいシステム間連携だったりすると、WSDLがあるほうがコードの自動生成もできるし、非常に楽なのでよく使われています。</p>

<p><img src="/wp-content/uploads/2015/04/hx-131.jpg" alt="" width="600" height="370" class="aligncenter size-full wp-image-14680" srcset="/wp-content/uploads/2015/04/hx-131.jpg 600w, /wp-content/uploads/2015/04/hx-131-300x185.jpg 300w, /wp-content/uploads/2015/04/hx-131-207x128.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />　　 ▲グロースエクスパートナーズ株式会社 執行役員 鈴木雄介さん</span>
<br><br>
<strong>細川：</strong>とはいえ、SOAPの上位レイヤで規定されている<a href="http://en.wikipedia.org/wiki/WS-Reliability" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">WS-Reliability</a>だとか<a href="http://ja.wikipedia.org/wiki/WS-Security" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">WS-Security</a>などの様々なプロトコルは、あまり使われていない印象です。
<br><br>
<strong>白石：</strong>では、システム間連携などではプレーンなSOAPがよく使われているということですね。
<br><br>
<strong>鈴木：</strong>まあSOAPもRESTも用意する、というパターンが多いんじゃないでしょうか。オブジェクトモデルは同じで、それをSOAPでもJSONでも表現できるように設計しておくというパターンは、比較的多いような気がします。
<br><br>
<strong>細川：</strong>あと僕が気になるのは、スケーラビリティなんですよね。SOAPだとちょっと気になるのはやっぱりシリアライズ・デシリアライズの処理が重いし、トラフィックも増大するじゃないですか。そういった意味だとやっぱりREST + JSONのほうにもメリットがありますね。本来だったら使い分けみたいなところが重要なんですけど、いまだにSOAP一択という開発現場も多い。</p>

<p><img src="/wp-content/uploads/2015/04/hx-151.jpg" alt="" width="600" height="357" class="aligncenter size-full wp-image-14692" srcset="/wp-content/uploads/2015/04/hx-151.jpg 600w, /wp-content/uploads/2015/04/hx-151-300x179.jpg 300w, /wp-content/uploads/2015/04/hx-151-207x123.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />　　　▲株式会社アーキテクタス 代表取締役 細川努さん</span>
<br><br>
<strong>白石：</strong>どっちかに寄せちゃったほうが考えることが少なくて、楽ってこともあるかもしれないですね。
<br><br>
<strong>鈴木：</strong>一長一短…というとつまらない話になってしまいますが（笑）、実際のところそういう結論になっちゃいますね。HTML5が盛り上がっている現在、JavaScriptと相性が良いJSONにはすごく価値がある。一方で例えば、日付型をどう扱うんだとか、型定義やコードの自動生成がしづらいというJSONには苦手な分野もあるのですが、SOAPはそういう部分に強い。「SOAPはXMLだからダメ・ダサい」ということは、実際のシステム開発には全く当てはまらないと思いますよ。
<br><br></p>

<h2>エンタープライズアーキテクチャパターンは今も有効か</h2>

<p><br>
<strong>白石：</strong>アーキテクチャという点では、<a href="http://www.amazon.co.jp/dp/4798105538" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">マーティン・ファウラーのエンタープライズ アプリケーションアーキテクチャパターン</a>が昔は王道だったかとと思うんですが、それは今も有効なんでしょうか？
<br><br>
<strong>鈴木：</strong>あれは普遍的なものなので、時代が変わったからといって使えなくなってしまうようなものではありません。ただ、昔と比べると今はWeb API主導型のアプリケーションが主流になりつつありますね。クライアントのマルチデバイス化は当然エンタープライズでも相当重要なので、「サーバー側はAPIを提供するだけ」というスタイルに移行しつつあるのは、Webでもエンタープライズでもまったく変わらないと思います。
<br><br>
<strong>白石：</strong>具体的には、<a href="http://ja.wikipedia.org/wiki/JAX-RS" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">JAX-RS</a>を利用するとか？
<br></p>

<p><img src="/wp-content/uploads/2015/04/hx-18.jpg" alt="" width="600" height="390" class="aligncenter size-full wp-image-14678" srcset="/wp-content/uploads/2015/04/hx-18.jpg 600w, /wp-content/uploads/2015/04/hx-18-300x195.jpg 300w, /wp-content/uploads/2015/04/hx-18-207x135.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<br>
<strong>鈴木：</strong>JAX-RSもありますし、JSON用のバインディングAPIもJava EE 7で標準化されたので、何の違和感もなく使えますね。
<br><br>
<strong>細川：</strong>エンタープライズ アプリケーションアーキテクチャパターンは非常に洗練されていたのですが、実際のエンタープライズ・アプリケーションはもっと泥臭いです（笑）。
例えば<a href="http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A6%E3%83%A9%E3%83%BC" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">マーティン・ファウラー</a>の提唱するモデルだと、プレゼンテーションレイヤからデータレイヤまでが3、4層ぐらいなんですが、実際はビジネスロジックだけで3層以上に分けたりとか、ビジネスロジックとプレゼンテーションの間にいろいろ挟んだりとか、端から端まで数えると下手したら10層ぐらいあるものも実際のプロジェクトでは山ほどありました。
<br><br>
<strong>白石：</strong>僕もそういうプロジェクトをやったことがあります。なんか別のメソッドを呼び出してるだけのメソッドが大量にあったり（笑）。
<br><br>
<strong>細川：</strong>そうそう。なので、どちらかというとほんとに綺麗なレイヤリングはできてなかったというのが現実ですね。最近、６〜７年以前につくられた数十万ステップくらいのシステムをいくつか実際に解析してみたんですけど、結構面白い結果が出たんですよ。サーバーサイドJava（JavaEE）としては最新ではなく、まだJ2EEと呼ばれていた頃のシステムです。どのシステムも、一番複雑度が高いのはビューとデータアクセス（永続化）、アーキテクチャ共通系のモジュールです。ビジネスロジックの部分は量は膨大なんですけど、複雑度自体は比較的シンプルなんです。 
<br><br>
何が言いたいかというと、古い世代のサーバーサイドJavaは、ビューとアーキテクチャ制御に作り込みが必要で、そこのところが本当に大変だった。例えば、ビューのところのバリデーションなんかは、かなり作り込みが必要で、簡単な画面作るのも相当手間がかかってたんですよね。結局は、<strong>かつてのJava EE（J2EE）って、エンタープライズ系プログラマーが本来集中すべき業務上のロジックにあんまり集中できていなくて、もっと簡単にできるはずのところに手間がかかっていた</strong>のが現実だったんじゃなかったかなと。
<br><br>
<strong>白石：</strong>ほんとにそうですよね。オブジェクトの変換とか、別のメソッド呼び出すだけとか、<a href="http://ja.wikipedia.org/wiki/Facade_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ファサード</a>作ってそこに一生懸命集めるだけとかやっていて、なにやってるんだろうこれは…とか思っていました。
<br><br>
<strong>細川：</strong>以前はそうでしたね。そのレガシーなところが今はみんなの足を引っ張ってる（笑）。現在は、それがどれだけ良くなってるか、というところですよね。
<br></p>

<p><img src="/wp-content/uploads/2015/04/hx-16.jpg" alt="" width="600" height="343" class="aligncenter size-full wp-image-14675" srcset="/wp-content/uploads/2015/04/hx-16.jpg 600w, /wp-content/uploads/2015/04/hx-16-300x172.jpg 300w, /wp-content/uploads/2015/04/hx-16-207x118.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<br>
<strong>白石：</strong>今の流れをまとめると、ビューの複雑なところっていうのが、だんだんクライアント側に寄ってきていて、ようはHTML5でリッチクライアント化されてきて、サーバー側はAPIを提供しているだけになっていると。
<br><br>
<strong>鈴木：</strong>大きくはそうです。ただ、エンタープライズシステムの場合、とにかくシステム間連携が多くて、1つの企業の中でいろんなシステムがあって、ほとんどのシステムが関連付いているのが当然になっています。そうするとクライアント側からするといろんなシステムにいちいちログインして使うのは面倒くさいので、どうやってシンプルに使うのかというのが今の大きなテーマになっていると思います。サーバー間で連携したり、クライアント側でアグリゲーションしたりというのが今の課題としてあって、エンタープライズの場合は、そこがシンプルにならないので、それがひとつの前提になっています。
<br><br>
<strong>白石：</strong>なるほど。そのシステム間連携がさきほどおっしゃっていたようにXMLベースだったり、RESTだったりという感じですね。
<br><br>
<strong>鈴木：</strong>はい。企業って、いろんなユーザーといろんなシステムがあるので、いわゆる一般コンシューマー向けのECサイトのようなシステムもあれば、例えば人事システムみたいなものもありますよね。人事システムだと、人事部だけが使うのでユーザーが10人しかいなかったり、でも社員数10万人を支える人事システムっていうと相当でかいっていうものだとか。じゃあその2つが同じアーキテクチャで、同じ作り方でいいんですかっていうと全然そうじゃないですよね。
<br><br>
企業の中のさまざまなシステムの中で、HTML5に合うものもすごく増えてますし、HTMLの可能性が広がったことでやれることもすごく増えましたが、一方でそれが銀の弾丸ではないです。ここはRESTでつくったらいいよねとか、ここはWSDLがちゃんとあってSOAPでやったほうがいいよねっていうのがある。そこは全体の中での選択してやっていけばよいことです。エンタープライズの人って古めかしい人印象があるかもしれないですけど、新しいことも古いこともやらきゃいけないので、そういう意味ではちゃんとまともにやっている人は、それを両方うまくバランスよくやっていますね。</p>

<h2>エンタープライズとモバイル</h2>

<p><br>
<strong>白石：</strong>最近のエンタープライズ業界に疎くて、初心者的な質問で申し訳無いのですが、モバイルをエンタープライズで使うというのはもうかなり普通に行われていることなんでしょうか。
<br><br>
<strong>鈴木：</strong>そうですね。モバイル、タブレット、PC、専用の機器とか、何を何に使うといいよねっていうユースケースはちゃんと考えなきゃいけないですが、モバイルはものすごく重要なツールとして使われています。
<br><br>
<strong>白石：</strong>エンタープライズでモバイルといえば結構HTML5が使われているという話を聞くのですが、実際そうなんですか？コンシューマ向けだと、ネイティブアプリが全盛です。</p>

<p><img src="/wp-content/uploads/2015/04/hx-19.jpg" alt="" width="600" height="369" class="aligncenter size-full wp-image-14679" srcset="/wp-content/uploads/2015/04/hx-19.jpg 600w, /wp-content/uploads/2015/04/hx-19-300x185.jpg 300w, /wp-content/uploads/2015/04/hx-19-207x127.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<br>
<strong>鈴木：</strong>そもそもモバイルという文脈で求められる操作性とか機能が、エンタープライズの場合はそんなにネイティブでやらなくてもいいようなものが多いので、HTML5がフィットしてるんじゃないかと思います。例えば、ゲームはネイティブアプリがいいといわれますが、別にあそこまでビジュアル的なものとか、細やかな操作性はあんまり求められることはないと。
<br><br>
なので、HTML5でやるっていうのは多いんじゃないでしょうか。Webアプリであれば、リリースも楽ですしね。去年ぐらいまでは写真とか音声とかでいろいろやろうとすると、まだまだHTML5では制約が多いということでネイティブアプリという選択もありましたが、そうした制約もブラウザが進化してきてだんだん問題にならなくなってきています。
<br><br>
<strong>白石：</strong>なるほど。ちなみに、そうしたHTML5で書かれた業務アプリは、ハイブリッドアプリとしてインストールする形が多いのか、それともWebサイトとしてURLでアクセスする形で作るんでしょうか。
<br><br>
<strong>鈴木：</strong>それは両方あります。どちらにも利点があるので。</p>

<h2>クラウドがアーキテクチャに与えた影響は？</h2>

<p><br>
<strong>白石：</strong>これも初心者的な質問で恐縮です。クラウドがエンタープライズのアーキテクチャに与えた影響はありますか。
<br><br>
<strong>鈴木：</strong>もちろんあります。クラウドができたことで一番大きかったのは、PaaSという概念ができたことですね。あるニーズに特化したものっていうのは共有化されたものが使われるべきだっていう概念がはっきりしたのはPaaSのおかげです。例えばAWSのラインナップを見て貰うとわかるんですが、CDNありますねだとか、ロードバランサありますねだとか、ストレージ、サーバーノード、認証認可とか、メールの配信サービスとか、ああいうものはPaaSとしてみんなが共有して使うべきだという概念ができた。
<br><br>
なので、そういうプラットフォームを用意してその上にアプリケーションを作って、アプリケーションはUIを含めてそれだけに特化して、なるべくプラットフォームの機能をうまくつかってやっていくていうアイデアは、今のエンタープライズでも浸透している考え方だと思います。</p>

<p><img src="/wp-content/uploads/2015/04/hx-17.jpg" alt="" width="600" height="394" class="aligncenter size-full wp-image-14677" srcset="/wp-content/uploads/2015/04/hx-17.jpg 600w, /wp-content/uploads/2015/04/hx-17-300x197.jpg 300w, /wp-content/uploads/2015/04/hx-17-207x136.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<br>
<strong>細川：</strong>開発者視点でいうと、開発者ができる領域が増えてきましたね。従来だと、サーバ構築とソフトウェア開発は別々のものでしたが、プログラマーがだんだんとクラウドを前提にして、環境を構築するようになってきた。そうすると、同時にパフォーマンスだとかセキュリティだとかをエンジニアが自分で考えなきゃいけない時代になってきていて、Webエンジニアだとかエンタープライズエンジニアとかの区別はなくなってきている。そういう意味では、フルスタックで両方できなきゃまずいんじゃないでしょうか。
<br><br>
<strong>鈴木：</strong>もうそれはエンタープライズでも間違いなくそうですね。
<br><br>
<strong>細川：</strong>もうひとつの特徴としては、昔は大規模＝エンタープライズということが多かったんですが、今ではコンシューマー向けとかゲームだとか、そっちのほうがより大規模なんですよね。それを実現しているのがやっぱりクラウドなのかと思っています。そういった意味でも、これからはWebエンジニアこそ大規模を得意にならなきゃいけないんじゃないかと。サーバーとクライアントのメッセージの単位なんかもパフォーマンスに大きく影響するので、そういったところも、かなりノウハウを積まないといけなくなってきています。</p>

<h2>エンタープライズ・アーキテクチャの未来像</h2>

<p><br>
<strong>白石：</strong>IoTとかウェアラブルとかを見据えて、今後どういうふうにエンタープライズ・アーキテクチャが変わっていくべきか、ご意見はありますか？
<br><br>
<strong>鈴木：</strong>IoTを真剣にやろうとすると、先ほど細川さんが言っていた大規模っていうのがエンタープライズに戻ってくるんですよね。対応するデバイスの数が、今まではユーザーが数万人ですんだのが、億になるかもしれない。例えば、すべてのダンボール箱にチップがついたらどうなるんだろうっていう世界を考える。そうすると日本で流通しているダンボール箱は何箱あるんだとか、ものすごいクライアントの数になってしまう。そうなってくると、エンタープライズがまた大規模な性能を頑張らないといけなりますね。
<br><br>
例えば、わかりやすい例でB2Bのケースを考えると、トラックをトレースする仕組みを作ることになったとします。じゃあ全国にあるトラックを全台管理しますとなったときに、全部で何台あるのか。1台のトラックにセンサーがいくつついているのかということになると、センサーが車輪それぞれにあって、それぞれのタイヤのすり減り方を計測して、運転手が寝てるんじゃないかというのを監視するセンサーがあって、速度・加速度をとるセンサーがあって…というようにトラックにすごい数のセンサーがある。</p>

<p><img src="/wp-content/uploads/2015/04/hx-22.jpg" alt="" width="640" height="353" class="aligncenter size-full wp-image-14690" srcset="/wp-content/uploads/2015/04/hx-22.jpg 640w, /wp-content/uploads/2015/04/hx-22-300x165.jpg 300w, /wp-content/uploads/2015/04/hx-22-207x114.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br>
そして、トラックを1万台管理します、データを500msごとに取るとすなると、ものすごい数になる。つまり、B2BでIoT、ウェアラブルというのはB2Cのスケーラビリティをエンタープライズでもう1回頑張らないといけないということになる。今、Webの人が大規模で頑張っているテクノロジーセット、例えば大量のストリームを処理しながらイベントドリブンでやるっていうのは昔からエンタープライズにあって、それがWeb側ですごく実用化されて使われていたのが、またエンタープライズに戻ってくる。そういう流れが未来にはやってくるんじゃないかなと考えています。
<br><br>
<strong>白石：</strong>なるほど。ちなみに、もう実際にIoTの案件とか発生しているんでしょうか。
<br><br>
<strong>鈴木：</strong>相談はかなり増えてきてますね。まだ実証実験ぐらいが多いという感覚ですが。今は車がうまくいっていて、ホンダの事例がわかりやすいです。日本中の車のブレーキの発生情報を集めてるんですけど、それを解析すると事故が発生しやすい曲がり角がわかるんですよね。みんながたくさんブレーキを踏んでいる曲がり角がどこかっていうのを提供しているんですよ。そしたらそれを元に道路の信号とか標識とかを改善するってことをやっています。</p>

<h2>まとめ</h2>

<p><br>
<strong>白石：</strong>本日は、エンタープライズ・アーキテクチャについて様々なご意見をいただき、誠にありがとうございました。最後に、読者に向けて一言お願いします。</p>

<p><img src="/wp-content/uploads/2015/04/hx-20.jpg" alt="" width="600" height="387" class="aligncenter size-full wp-image-14681" srcset="/wp-content/uploads/2015/04/hx-20.jpg 600w, /wp-content/uploads/2015/04/hx-20-300x194.jpg 300w, /wp-content/uploads/2015/04/hx-20-207x134.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<br>
<strong>鈴木：</strong>自分たちの生活を考えると、やっぱりエンタープライズ業界の会社が自分達の生活を支えてるわけじゃないですか。それがより便利になったり、役立つようになったり、世の中が進化するっていうのはとても大事なことだと思うんですよ。なので、それが実現されるためにはどうしたらいいのかっていうときに、エンタープライズとかWebとかそういう区切りはどうでもよくて、どうやれば本当に価値がでるのか、そういうのを考えるのが面白い。
<br><br>
ただ、社会基盤として変えてはいけないところもエンタープライズにはどうしてもあるので、それをどのように変えずに、より新しいことにトライしながら今あるものの価値をより高めるのかというところが大事ですね。なので「エンタープライズwww」という風潮はよろしくないと思います（笑）。</p>

<p><img src="/wp-content/uploads/2015/04/hx-211.jpg" alt="" width="600" height="381" class="aligncenter size-full wp-image-14682" srcset="/wp-content/uploads/2015/04/hx-211.jpg 600w, /wp-content/uploads/2015/04/hx-211-300x191.jpg 300w, /wp-content/uploads/2015/04/hx-211-207x131.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<br>
<strong>細川：</strong>2点あって、ひとつは、今までのエンタープライズ開発は、ユーザーの言われたものを作るという風潮が多かったんですが、今後はユーザーと一緒につくるっていうのは大事になってくるんじゃないかと考えています。そういう意味ではエンタープライズ業界もWeb業界と同じようにUXとか、よりユーザーが求めるものは何かというところを柔軟に対応してかなきゃいけない。エンタープライズもWebに学ばなきゃいけないということ。
<br><br>
もうひとつは、今後、変化がたくさんあって、それに対応するためにエンタープライズ側、Web側が両方対応しないと対応できないんじゃないかなと思う。これらの技術の変化に対応できるようにフルスタック、両方できるようなエンジニアが増えてくると心強いんじゃないでしょうか。</p>
]]></content:encoded>
		
		<series:name><![CDATA[アプリケーションアーキテクチャ最前線]]></series:name>
	</item>
		<item>
		<title>フレームワーク対決！Angular VS React仮想パネルディスカッション</title>
		<link>/yoshikawa_t/14459/</link>
		<pubDate>Mon, 11 May 2015 00:00:30 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[React.js]]></category>
		<category><![CDATA[アーキテクチャ]]></category>

		<guid isPermaLink="false">/?p=14459</guid>
		<description><![CDATA[連載： アプリケーションアーキテクチャ最前線 (2)特集企画「アプリケーションアーキテクチャ最前線」では、さまざまな視点からアプリケーションアーキテクチャをエキスパートたちに語っていただきます。今回は、今話題のAngul...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/arch/" class="series-287" title="アプリケーションアーキテクチャ最前線" data-wpel-link="internal">アプリケーションアーキテクチャ最前線</a> (2)</div><p>特集企画「アプリケーションアーキテクチャ最前線」では、さまざまな視点からアプリケーションアーキテクチャをエキスパートたちに語っていただきます。今回は、今話題のAngularJSなどのJavaScript MVCフレームワークの台頭と進化、そして新しいアーキテクチャであるFluxとそのフレームワークであるReactなどについて、既に先行して学んでいるエキスパートたちにその知見を聞いてみました。</p>

<p>今回はフレームワーク対決ということで、エキスパートたちがAngularとReactという陣営に分かれ、それぞれのフレームワークについて疑問点をぶつけたり、議論したりする仮想パネルディスカッションという形式でお伝えします。単なるパネルディスカッションとは違って、<strong>キーワードは「プロレス」</strong>です。まさかりの投げ合い、disり合いOKという形で、<strong>NGワードは「適材適所」「ケースバイケース」</strong>などです。白熱した議論をお楽しみください！</p>

<p><img src="/wp-content/uploads/2015/04/avr-9.jpg" alt="" width="640" height="415" class="alignnone size-full wp-image-14521" srcset="/wp-content/uploads/2015/04/avr-9.jpg 640w, /wp-content/uploads/2015/04/avr-9-300x195.jpg 300w, /wp-content/uploads/2015/04/avr-9-207x134.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />　<span style="font-size: 80%;">　▲議論が白熱する選手たち。左から、久保田光則さん、金井健一さん、増井雄一郎さん、小林徹さん</span></p>

<h2>選手入場（自己紹介）</h2>

<p><br>
<b>白石：</b>さて、それではプロレスを始めていきましょうか（笑）。まずは、皆さんの簡単なプロフィールと一押しのフレームワークなどを教えてください。
<br><br>
<strong>（React陣営）</strong><br>
<img src="/wp-content/uploads/2015/04/avr-17.jpg" alt="" width="120" height="134" class="alignleft size-full wp-image-14550" /><b>小林：</b>小林徹（@koba04）と申します。前職でソーシャルゲームを作っていました。そのときはBackboneとかAngularとかを使っていて、今はReact.jsに興味があって、業務でも使っていこうかと思っています。　　　　　　　　
<br><br>
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
<br>
<img src="/wp-content/uploads/2015/04/avr-16.jpg" alt="" width="120" height="149" class="alignleft size-full wp-image-14549" /><b>増井：</b>増井雄一郎（@masuidrive）です。一押しのフレームワークは、ReactとFluxなんですが、ReactはViewのライブラリなので、Fluxになるのかなと。複雑なことをやるのは嫌いなので、なるべくシンプルに書けるということでReactとFluxの組み合わせは気に入っています。あとは自由度が高いという点も気に入っています。</p>

<p><br><br>
<strong>（Angular陣営）</strong><br>
<img src="/wp-content/uploads/2015/04/avr-14.jpg" alt="" width="120" height="136" class="alignleft size-full wp-image-14545" /><b>金井：</b>金井健一と申します。フリーランスで、AngularJS Japanユーザーグループの管理人をしています。一押しはAngularですね。Angularは何がいいかというと、フルスタックなところで、悪い面もありますが良い面のほうが多いんじゃないかと思います。学習コストが高いというのもよく言われますが、それだけ機能が多岐に渡っているということなので、いったん使いこなせればすごくいいフレームワークだと思います。
<br><br>
<img src="/wp-content/uploads/2015/04/avr-152.jpg" alt="" width="120" height="145" class="alignleft size-full wp-image-14548" /><b>久保田：</b>久保田光則と申します。アシアルという会社でエンジニアをやっています。会社ではOnsenUIというフレームワークを作っています。3年か4年くらい前からずっとJSとかフロントエンドばっかりやってきていて、ちょっと前はKnockoutJSがいいなと思っていたんですけど、気がついたらずっとAngularJSばっかり書いていました（笑）。Angular2は野心的な方針で、いろんなものを取り込んで最高のものにしていこうという気概が感じられるので注目していかないとなと思っています。
<br></p>

<h2>お互いのフレームワークへの疑問点など</h2>

<p><br>
<b>白石：</b>このパネルディスカッションの今後の流れとしては、僕のほうからは何かコントロールするということはないので、レフェリーみたいなものだと思ってください（笑）。自由にやっていただければと思います。それでは、今回の本題ということで、お互いのフレームワークについて疑問点だったり、disったりということをお願いします。
<br><br>
<b>小林：</b>Angularは、1.04ぐらいのときに使っていて、実際にプロダクトに使ったんですが、結構情報がなくて辛かった思い出があります。DirectiveってよくわからないのでシンプルにControllerとかScopeとかで頑張ってやったという印象がありますね。
<br><br>
<b>金井：</b>当時は、結構そうかも。ただ今は、ドキュメントも充実してきているので今はさほど辛くはないかなと思いますね。Reactはルーティングとかバインディングとかその辺はどこまでできるんですか？</p>

<p><img src="/wp-content/uploads/2015/04/avr-41.jpg" alt="" width="640" height="395" class="alignnone size-full wp-image-14530" srcset="/wp-content/uploads/2015/04/avr-41.jpg 640w, /wp-content/uploads/2015/04/avr-41-300x185.jpg 300w, /wp-content/uploads/2015/04/avr-41-207x128.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>増井：</b>React自体はほんとにViewだけなので、まったくそこはケアしないですね。Fluxは考え方なので、実はすごい小さいんですよ。Dispatcherだけなので数百行ぐらいしかない。あとそこにどうやってルーティングをやるかというのは、React Routerとか外部のコンポーネントを組み合わせて使うので、標準では持っていないです。そこは大きく違いところだと思います。
<br><br>
僕はAngular使っていないんですが、会社（トレタ）のほうでは、PC向けの機能は全部Angularで作ってるんです。でもそこの中の人に聞くと、CRUDみたいなよくあるアプリケーションは結構楽にできて、Angularがなかったら短期間では作れなかったと思うと言われました。ただ、そういうパターンからはずれてしまうとすごい書きにくいかもしれなくて、拡張していくとき、パターンが複雑化してきたときに本当に耐えうるのかが不安と聞きました。そういう傾向ってどうなんですかね？</p>

<p><img src="/wp-content/uploads/2015/04/avr-6.jpg" alt="" width="640" height="421" class="alignnone size-full wp-image-14522" srcset="/wp-content/uploads/2015/04/avr-6.jpg 640w, /wp-content/uploads/2015/04/avr-6-300x197.jpg 300w, /wp-content/uploads/2015/04/avr-6-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>久保田：</b>何もかもScopeとかで管理しようとすると結構はまりどころ多いなというイメージがありますね。細かいインタラクションとか、例えばドラッグ＆ドロップを直接使いたいときって、結局DOMを触るしかなくて、DOM触るにはDirectiveっていうものが用意されています。Directiveは、ある程度DOMに対してのいろんな機能を追加するとか、細かいDOMの操作を担当するものなんですよ。全部Controllerで管理しようとするとすごいぐちゃぐちゃになったりするんですけど、ちゃんと自分でDirectiveを作って管理すると扱いやすいと思います。
<br><br>
<b>増井：</b>なるほど。あと、Angular1系と2系ってはたから見てると、2系が年末だか来年だかに出て、結構互換性がないっていう話で、1系は捨てちゃうっていうことを聞いてそこはちょっと怖いかなっていう印象はありますね。
<br><br>
<b>金井：</b>2系が主流になって、1系が減ってこない限りはサポートするという話ですね。なので、そこは早いうちにアップデートしないといけないかもしれません。
<br><br>
<b>増井：</b>でもアップデートってまるまる書き直しなんですよね？
<br><br>
<b>久保田：</b>ng-japanでもアナウンスされてましたが、Angular2とAngular1を共存する方法はあって、1系のコードと2系のコードを混在させることができるようですね。</p>

<h2>今からフレームワークを採用するとしたらどちらを使う？</h2>

<p><br>
<b>増井：</b>今から新しくプロジェクト始めるときにどのフレームワークで作ろうかみたいなときに、実際に作る人は悩むんですかね。
<br><br>
<b>白石：</b>実際、今作ろうと思っているものがあるんですが、悩みますね。
<br><br>
<b>金井：</b>なんでそこはAngularじゃないんですか（笑）。</p>

<p><img src="/wp-content/uploads/2015/04/avr-11.jpg" alt="" width="640" height="399" class="alignnone size-full wp-image-14528" srcset="/wp-content/uploads/2015/04/avr-11.jpg 640w, /wp-content/uploads/2015/04/avr-11-300x187.jpg 300w, /wp-content/uploads/2015/04/avr-11-207x129.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>白石：</b>Angularはでかくて複雑すぎて怖いんですよね。しかもAngular2が迫っているという。この今のタイミングで採用するのはちょっと怖い。
<br><br>
<b>増井：</b>そういう意味では、僕はReact.jsがなくなっても、React.jsと同じものを書ける自信があるんですよ。FluxとReact.jsをまるっとFacebookがやめました、明日からReactはありませんと言われたときに、僕はReact全体をメンテナンスできる。まるっと同じものを作れっていわれたら、まあ頑張って作れる。Angularは作れる気がしない。
<br><br>
<b>金井：</b>作れる気はしないですね（笑）。
<br><br>
<b>増井：</b>僕は結構そこが怖くて。なので、大きいフレームワークは採用しにくいっていう面があります。あと、MVCの上にMVCを乗っけるというのは、その考え方はすごくToo Muchかなと。サーバーサイドは、サーバーサイドでMVCを作っていて、さらにクライアントサイドでMVCを作るわけじゃないですか。MVCの2階建てはアーキテクチャとして本当にいいのかっていうのはすごく思っていますね。
<br><br>
そもそもモデルをデータベースから作って、ちゃんとAPIにしているはずなのに、それをさらにもう一回モデルとして扱う、あんまり効率的じゃないんじゃないかっていう。Reactだけに限ると、MVCのVしかないので、そもそも書いて読んだJSONをそのままViewで表示するってことをやったりするんです。だけど、実はAPIが揃ってると結構なWebアプリケーションで、そもそもモデルまでおこさなくてもいいんじゃないかっていう気がするんですよ。</p>

<p><img src="/wp-content/uploads/2015/04/avr-5.jpg" alt="" width="640" height="388" class="alignnone size-full wp-image-14523" srcset="/wp-content/uploads/2015/04/avr-5.jpg 640w, /wp-content/uploads/2015/04/avr-5-300x182.jpg 300w, /wp-content/uploads/2015/04/avr-5-207x125.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>金井：</b>JSONをとってきて出すっていうのはAngularでもできるので、それはアプリの設計によるのかなという気がしています。Angularの場合は、さらにそこから変更もできるという利点があります。
<br><br>
<b>増井：</b>それにしてはToo Muchすぎるんじゃないかと。
<br><br>
<b>金井：</b>それだけしたい場合には確かにそうですね。
<br><br>
<b>増井：</b>結構なケースがそれで済むんじゃないかっていう気はしていて。実はクライアント側でMVCが必要なほど複雑な処理するケースってそんなに多いのかなと。
<br><br>
<b>久保田：</b>まあでも実際には、もちろんアプリの要件によると思います。ハイブリッドアプリって結局JSでなんでもやるので、API叩けばそれで終わりというわけじゃなくて、むしろJSのほうでいろんなことを書かなきゃいけないって感じになるので、API叩けばそれで終わりっていう感じにはならないですよね。
<br><br>
APIってネットワーク越しにやるんでそれってすごく重たいし、あんまりやりたくないっていうのはモバイルアプリだと多いです。そもそもモバイルアプリだとネットワーク繋がらないってこともあるので、それを解決するにはローカルのほうでデータを保持して、繋がったら同期をとるっていう感じになるので、モデルがないとちょっと辛いという感じになりますね。</p>

<h2>JSXは気持ち悪い？</h2>

<p><br>
<b>白石：</b>JSXがキモいんですけど…。
<br><br>
<b>増井：</b>あれは気持ち悪いんですよ実際（笑）。キモいっていうのはまったく異論ないんですけど、あれはあれで理にかなっていると思っています。DOM操作がなんで難しいかっていうとそもそもこのDOMをみたときに、これがいつどこで書き換わるかわからないし、さらにこのボタンを押したときにどこで何が起こるかわからない、イベントは1個じゃなくて100個でも張れるので。っていうのに対してJSXの場合はそういうのを一応ビューとロジックを同じところに書くことで、さらにイベントリスナーを1対1にすることによって、そういう複雑性を省きましょうという考え方なので、気持ち悪いことは認めつつ、理にはかなっているかなと。
<br><br>
1番の問題は、HTMLしか書けない人がこれを触れないっていう。コーダーと分離ができないっていう点ですよね。ただこれはもっと根本的な問題で、Reactは画面の一部をコンポーネントとしてスコープを作りましょうっていう考え方で、HTMLを切ってるんじゃなくて、プログラミングスコープを切ってるんですよ。それって見た目のデザインとはちょっと違って、アーキテクチャのデザインの話なので、見た目とロジックを切り離すっていうところに、そもそも無理があるじゃないかっていうことですね。</p>

<p><img src="/wp-content/uploads/2015/04/avr-8.jpg" alt="" width="640" height="400" class="alignnone size-full wp-image-14534" srcset="/wp-content/uploads/2015/04/avr-8.jpg 640w, /wp-content/uploads/2015/04/avr-8-300x188.jpg 300w, /wp-content/uploads/2015/04/avr-8-207x129.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>金井：</b>そこらへん（画面の一部をコンポーネントとしてスコープを作る）は、Angularも目指すところは同じかもしれないですね。
<br><br>
<b>増井：</b>そのやり方が違うってだけなんでしょうね。
<br><br>
<b>久保田：</b>ちょっといいですか。別にJSXって気持ち悪くなくないですか。
<br><br>
<b>小林：</b>私も全然違和感ない（笑）。
<br><br>
<b>白石：</b>人によるんだ。
<br><br>
<b>増井：</b>僕も去年からReactを知ってたのに触ってなかったのは、JSXです（笑）。あれで毛嫌いして触らなくて、でもあんまり話題になってるので去年の年末年始から本格的に触ってみたというのがあります。あれは僕個人も気持ち悪いです（笑）。
<br><br>
<b>小林：</b>ぱっと見たときに、あれ（JSX）がやりたいフレームワークなのかなと思っちゃうんですよね。
<br><br>
<b>増井：</b>日本でのReactの評価は、Virtual DOMっていう技術キーワードとJSXという見た目にすごく左右されている印象がありますね。</p>

<h2>Virtual DOMって本当に早いんですか？</h2>

<p><br>
<b>白石：</b>Virtual DOMって本当にそんなに早かったりするんですか。ぱっと考えると差分をComputeとする計算処理も必要だし、フロントのDOMと仮想DOMって2つ持っているメモリも喰いそうだなと思うんですけど、実際はどうなんですか？</p>

<p><img src="/wp-content/uploads/2015/04/avr-10.jpg" alt="" width="640" height="412" class="alignnone size-full wp-image-14524" srcset="/wp-content/uploads/2015/04/avr-10.jpg 640w, /wp-content/uploads/2015/04/avr-10-300x193.jpg 300w, /wp-content/uploads/2015/04/avr-10-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>小林：</b>実際は何が一番早いかっていうのはやっぱりDOMを直接触るのが一番早いっていうのは間違いなくて、でもそれってコードとしても複雑になるじゃないですか。モデルのデータの変更された部分だけをどういう風に反映するのかっていうところが煩雑になる。Virtual DOMだと、ひとつの状態をもっておいて、パっと更新すると差分だけを綺麗に反映してくれるので、DOMを直接触るよりは遅いですが、該当部分のDOMを全部入れ替えるよりは早いという感じです。最速ではない。
<br><br>
<b>白石：</b>最速ではないと。わりとプログラマーがいい加減な処理をしてもいいってことですね。
<br><br>
<b>増井：</b>Reactはとりあえずざっくり書けば、そこそこ速いっていうような考えですね。
<br><br>
<b>久保田：</b>最近、Atomで内部でReact使ってたけどパフォーマンスのために削除したっていう話がありましたね。
<br><br>
<b>白石：</b>え、そうなんですか。もう使わなくなっちゃったんだ。
<br><br>
<b>小林：</b>最初のやつがちゃんと構造化されていなくて遅かったのをReactにして、ちょっと速くなって。そこをベースにDOM職人が頑張ってやったらさらに早くなったっていう感じですね。</p>

<h2>Angularは謎のルールが多い</h2>

<p><br>
<b>白石：</b>Angularを触ったり調べたりしたときに僕的には謎のルールがすごい多くてとっつきにくかった。例えば、$変数が多すぎ。何々のときは$なんとかが多くて、なんだこれはっていう（笑）。
<br><br>
<b>金井：</b>あれ何なんでしょうね。$$とかあるしね（笑）。</p>

<p><img src="/wp-content/uploads/2015/04/avr-7.jpg" alt="" width="640" height="397" class="alignnone size-full wp-image-14535" srcset="/wp-content/uploads/2015/04/avr-7.jpg 640w, /wp-content/uploads/2015/04/avr-7-300x186.jpg 300w, /wp-content/uploads/2015/04/avr-7-207x128.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>白石：</b>Dependency Injectionを実装したのはいいんだけど、まず引数の名前で当てるからminifyしないでねとか、minifyしてもいいように別の書き方も発明したよとか配列で指定できるようになったりとか。なんかもう歴史上の問題かもしれないんですけど、謎ルールが多すぎる感があるんですけど。そこらへんはどうなんでしょう？
<br><br>
<b>久保田：</b>やっぱりそこは気持ち悪いなと思います。でも昔からずっと実務上の必要からそういうのが増えてきたのかなと思いますね。あとから来た方がどうしたもの洗練されたものになっていくので…。
<br><br>
<b>増井：</b>Angularっていつできたんでしたっけ？
<br><br>
<b>金井：</b>結構前で、2009年ですね。
<br><br>
<b>増井：</b>そんなに前なんだ！
<br><br>
<b>金井：</b>Angular1が2012年ぐらいなので、そこで注目された感じですね。2009年にできたフレームワークが5年くらい経って実用になりつつも、辛くなってきたということでAngular2を開発しているということだと思います。Angularのいいところっていうのは、その時々で結構先のことを見据えてやろうとしていて、1系だとWeb Componentsを実装したくてDirective作ったりしてるし、Object.observe()欲しいよねっていって2way bindingを実装してみたりとか。どんどん攻めてるんですよね。
<br><br>
<b>増井：</b>そういうイメージはありますね。</p>

<h2>実はReactは大きい</h2>

<p><br>
<b>白石：</b>ちなみにフレームワークの大きさでいうとどうなんでしょう。
<br><br>
<b>増井：</b>ReactってViewのライブラリだけのくせにすごいでかいんですよ。へたしたらjQueryよりでかい。
<br><br>
<b>金井：</b>フレームワークのサイズが大きいと、モバイルのユースケースで叩かれませんか、重いとか。Angularは相当叩かれた覚えがあります（笑）。
<br><br>
<b>増井：</b>とはいっても画像ひとつ分ぐらいですからね。Reactも実際よくあるReactのダメなところに「でかい」っていうのはいろいろ言われていて、でも現実ユーザーからそういう話があがってるわけではなく、数字で見てっていう部分があります。あと、Reactはサーバーサイドレンダリングを持っているので、ファーストビューはサーバーサイドで出しちゃって、その後にJS読み込むっていうことができるので、そういう意味では十分早いですね。面倒くさいですけど、やろうと思えばできます。
<br><br>
<b>白石：</b>今、ダウンロードしてみたんですけど、Angularがminify時で126KBで、Reactが121KBという結果に。</p>

<p><img src="/wp-content/uploads/2015/04/avr-13.jpg" alt="" width="640" height="394" class="alignnone size-full wp-image-14538" srcset="/wp-content/uploads/2015/04/avr-13.jpg 640w, /wp-content/uploads/2015/04/avr-13-300x185.jpg 300w, /wp-content/uploads/2015/04/avr-13-207x127.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>増井：</b>しかも、AngularはMVCで、ReactはVだけで、ですからね（笑）。
<br><br>
<b>金井：</b>やれること全然違う。（Angularは）ルーティングからバインディングからすべてできるのに（笑）。</p>

<h2>検索可能にするサーバーサイドレンダリング</h2>

<p><br>
<b>増井：</b>Reactのひとついいところは、サーバーサイド生成ができるのでぐぐったときに引っかかるんですよね。クローラーは基本的にはJSを実行しないので、みんなテンプレートにはじめから引っかかりそうなキーワードを入れたりとかして頑張るんですけど。でもReactはサーバーサイド（Node.js）でReactエンジンを実行してHTMLを生成することができるんですよ。そうすると例えば、基本的な部分をファーストビューで表示すると、JSが実行されなくてもHTMLで画面が見えて、JSが実行されると残りの部分が表示されるという段階的にできるですよ。
<br><br>
そうすれば、検索エンジンに引っかかるし、JSがもし（ブラウザで）動作しなくても本文はちゃんと読めるというメリットがあります。といってもそれをやるには、それなりに考えて書かなきゃならなきゃいけなかったり、その実行エンジンをいろいろセットアップしなきゃいけないので、手放しでできるっていうわけでもないんですが。</p>

<p><img src="/wp-content/uploads/2015/04/avr-12.jpg" alt="" width="640" height="384" class="alignnone size-full wp-image-14537" srcset="/wp-content/uploads/2015/04/avr-12.jpg 640w, /wp-content/uploads/2015/04/avr-12-300x180.jpg 300w, /wp-content/uploads/2015/04/avr-12-207x124.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>小林：</b>海外はやっぱりReact導入してるところは、サーバーサイドレンダリングもやっているところが多いですね。海外のほうがサーバーにNode.jsを使うのは結構一般的で、日本だとあんまりないから意外なんですけど。サーバーサイドレンダリングできるからReact採用してるっていうとこも結構ありますね。BBCとか。
<br><br>
<b>増井：</b>ぐぐれるっていうのはでかいですからね。
<br><br>
<b>白石：</b>なるほど。じゃあAngularのほうは、どうですか？
<br><br>
<b>久保田：</b>まあAngular2に期待ですね。Angular2のレンダリングのアーキテクチャについて設計文書が公開されていて、その中でVirtual DOMを使いますと言っています。
<br><br>
<b>小林：</b>Ember.jsも次のバージョンでHTMLbarsとsimple-domを組み合わせてサーバーサイドレンダリングできるようになる予定で、これからのフレームワークはサーバーサイドレンダリングはついてきそうな気がしますね。
<br><br>
<b>久保田：</b>あと、ちょっと面白いと思ったのがサーバーサイドレンダリングだけでなく、Viewの処理をWeb Workerでやりたいっていう点ですね。
<br><br>
<b>増井：</b>Web WorkerはReactでもやるっていってますね。そんなに進んでないですが。
<br><br>
<b>白石：</b>確かに仮想DOMは、本物のDOMじゃないからWorkerでいじれるし、間のメッセージングにコストがかからなければ割と早そうですね。
<br><br>
<b>増井：</b>そこ（Reactの仮想DOM）の差分の計算までWorkerでやってしまうので、それなりの速度がでるはずですね。ChromeもServiceWorkerとか機能を強化してるのでたぶんそういうのに合わせてるんだろうなと思います。</p>

<h2>開発速度・生産性の比較</h2>

<p><br>
<b>小林：</b>たぶんReact使っても開発速度って上がらない。書く量も結構増えますね。</p>

<p><img src="/wp-content/uploads/2015/04/avr-18.jpg" alt="" width="640" height="406" class="alignleft size-full wp-image-14553" srcset="/wp-content/uploads/2015/04/avr-18.jpg 640w, /wp-content/uploads/2015/04/avr-18-300x190.jpg 300w, /wp-content/uploads/2015/04/avr-18-207x131.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>増井：</b>むしろ下がります（笑）。プログラムでひとつ大事なところは、1年後に触れるかどうかだと思っていて、よくプログラムは書くより読む時間、回数のほうが多いので読むことを考えて書くべきだって言う考えがありますよね。時間がかかっても読みやすく書いて、それによってコード量が増えるのはプログラムとしてしょうがないんじゃないかっていう考えがあって、Reactはそういう考えに近いですね。なので記述量は減らないし、同じの書いたら5〜10倍ぐらいになっちゃっていう話もあって、あきらかにめんどくさいです。
<br><br>
<b>金井：</b>AngularJSは、預ける部分が大きいので、勝手にやってくれる。コード量は圧倒的に減りますね。なのでCRUD系作るときはすごく早いです。</p>

<h2>おわりに</h2>

<p>このように議論はすごく白熱して、興味深いトピックスが目白押しでした。楽しんでいただけましたでしょうか。今回は「議論は平行線だった」ということで終わりたいと思います。</p>

<p><img src="/wp-content/uploads/2015/04/avr-1.jpg" alt="" width="640" height="385" class="alignnone size-full wp-image-14515" srcset="/wp-content/uploads/2015/04/avr-1.jpg 640w, /wp-content/uploads/2015/04/avr-1-300x180.jpg 300w, /wp-content/uploads/2015/04/avr-1-207x125.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>
]]></content:encoded>
		
		<series:name><![CDATA[アプリケーションアーキテクチャ最前線]]></series:name>
	</item>
		<item>
		<title>乗るしかない！Reactのビッグウェーブに！─isomorphic tokyo meetupに参加してきた</title>
		<link>/shumpei-shiraishi/14895/</link>
		<pubDate>Fri, 01 May 2015 03:01:33 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Fetcr]]></category>
		<category><![CDATA[Flatiron]]></category>
		<category><![CDATA[Flummox]]></category>
		<category><![CDATA[Flux]]></category>
		<category><![CDATA[Fluxible]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[Rendr]]></category>
		<category><![CDATA[Virtual DOM]]></category>
		<category><![CDATA[isomorphic]]></category>
		<category><![CDATA[アーキテクチャ]]></category>

		<guid isPermaLink="false">/?p=14895</guid>
		<description><![CDATA[連載： アプリケーションアーキテクチャ最前線 (1)おはようございます。編集長の白石です。 昨日（2015年4月30日）、isomorphic tokyo meetupに参加してきました。 というのも実は近々、HTML5...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/arch/" class="series-287" title="アプリケーションアーキテクチャ最前線" data-wpel-link="internal">アプリケーションアーキテクチャ最前線</a> (1)</div><p>おはようございます。編集長の白石です。</p>

<p>昨日（2015年4月30日）、<a href="http://nodejs.connpass.com/event/13363/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">isomorphic tokyo meetup</a>に参加してきました。</p>

<p>というのも実は近々、HTML5 Experts.jpでは「Webアプリケーション・アーキテクチャ」に関する特集を行う予定なのですが、そこでキーワードとして挙げられていたのが<strong>isomorphic。</strong>
サーバサイドとクライアントサイドでコードの共有を促進するのが主な目的の一つ、というところまでは理解できたのですが、実際のところ、アーキテクチャはどう変わるのか？
それを探りたいと思っていたところ、ちょうどよくイベントの開催がアナウンスされていたので、急遽取材させていただきました。</p>

<p>取材を快く受け入れてくださった、主催の<a href="https://twitter.com/yosuke_furukawa" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Yosuke FURUKAWA</a>さん、本当にありがとうございました。</p>

<p>この記事では、トップバッターで講演されていた<a href="https://twitter.com/koichik" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">koichik</a>さんの講演内容を中心にご紹介して、isomorphicに触れるきっかけとなる記事を目指します。</p>

<p>なお、本日の講演者の皆様による資料はこちらになります。</p>

<h2><a href="http://nodejs.connpass.com/event/13363/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">isomorphic tokyo meetup</a>の発表資料</h2>

<h3>「Isomorphic Survival Guide」(by <a href="https://twitter.com/koichik" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">koichik</a>)</h3>

<p><a class="embedly-card" href="https://speakerdeck.com/koichik/isomorphic-survival-guide" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Isomorphic Survival Guide</a>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script></p>

<h3>「Isomorphic Web development with Scala &amp; Scala.js」(by <a href="https://twitter.com/TanUkkii007" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TanUkkii</a>)</h3>

<p><a class="embedly-card" href="http://www.slideshare.net/TanUkkii/isomorphic-web-development-with-scala-and-scalajs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Isomorphic web development with scala and scala.js</a>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script></p>

<h3>「実践isomorphic (+ Electron)」(by <a href="https://twitter.com/mizchi" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">mizchi</a>)</h3>

<p><a class="embedly-card" href="https://speakerdeck.com/mizchi/shi-jian-isomorphic-plus-electron" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">実践Isomorphic(+ Electron)</a>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script></p>

<h3>「Unified Interface on Isomorphic JavaScript」 (by <a href="https://twitter.com/axross_" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">axross</a>)</h3>

<p><a class="embedly-card" href="http://www.slideshare.net/axross/unified-interface-on-isomorphic-javascript" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Unified Interface on Isomorphic Javascript</a>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script></p>

<h3>「やみくも isomorphic から抜け出すために足りてないもの」 (by <a href="http://twitter.com/Jxck_" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Jxck_</a>)</h3>

<p>※資料は後日公開だそうです。</p>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">今日のスライドがちょっと片手間すぎるので、公開はいろいろ直してからにします。 <a href="https://twitter.com/hashtag/isomorphic_meetup?src=hash" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">#isomorphic_meetup</a></p>&mdash; Jxck (@Jxck_) <a href="https://twitter.com/Jxck_/status/593792866075353088" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">2015, 4月 30</a></blockquote>

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<h2>koichikさんによる「Isomorphic Survival Guide」つまみ食いレポート</h2>

<p><a href="https://twitter.com/koichik" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">koichik</a>さんの「Isomorphic Survival Guide」は、まずIsomorphicという言葉の語源からでした。ギリシャ語で「同じ」という意味を表す「isos」という言葉と、「形」という意味を表す「morphe」という言葉を合わせたものだそうです。</p>

<div id="attachment_14897" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/01_isomorphic.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/01_isomorphic-640x480.jpg" alt="isomorphicの語源" width="640" height="480" class="size-large wp-image-14897" srcset="/wp-content/uploads/2015/05/01_isomorphic.jpg 640w, /wp-content/uploads/2015/05/01_isomorphic-300x225.jpg 300w, /wp-content/uploads/2015/05/01_isomorphic-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">isomorphicの語源</p></div>

<p>同じ成り立ちの言葉として、「metamorphic」や「polymorphic」があるとのこと。オブジェクト指向の世界で頻繁に用いられる「ポリモーフィック」という言葉が、isomorphicと同様「-morphic」で終わる単語だと気づいたのはこの時が初めてで、ハッとしました。</p>

<div id="attachment_14898" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/02_x-morphic.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/02_x-morphic-640x480.jpg" alt="&quot;-morphic&quot;で終わる言葉はほかにも" width="640" height="480" class="size-large wp-image-14898" srcset="/wp-content/uploads/2015/05/02_x-morphic.jpg 640w, /wp-content/uploads/2015/05/02_x-morphic-300x225.jpg 300w, /wp-content/uploads/2015/05/02_x-morphic-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">&#8220;-morphic&#8221;で終わる言葉はほかにも</p></div>

<p>で、isomorphicが語られるときには、「クライアントとサーバの間でのコード共有」や「フロントエンドとバックエンドの間でのコード共有」と紹介されることが多いですが、そもそもクライアントとフロントエンド、サーバとバックエンドが同じ意味の単語なのか、そこには人による解釈の違いもあれば、指している意味合いの違いもある、と指摘。</p>

<div id="attachment_14899" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/03_2x2.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/03_2x2-640x480.jpg" alt="クライアント・サーバという用語とフロントエンド・バックエンドという用語は同一ではない" width="640" height="480" class="size-large wp-image-14899" srcset="/wp-content/uploads/2015/05/03_2x2.jpg 640w, /wp-content/uploads/2015/05/03_2x2-300x225.jpg 300w, /wp-content/uploads/2015/05/03_2x2-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">クライアント・サーバという用語とフロントエンド・バックエンドという用語は同一ではない</p></div>

<p>この講演においては、クライアントとサーバはネットワークの「こちら側」と「あちら側」、フロントエンドとバックエンドは情報の入出力を「人間相手に行う」のか「ストレージ相手に行う」のか、という意味で取り扱う。</p>

<div id="attachment_14900" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/04_definition.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/04_definition-640x480.jpg" alt="本講演における用語の定義" width="640" height="480" class="size-large wp-image-14900" srcset="/wp-content/uploads/2015/05/04_definition.jpg 640w, /wp-content/uploads/2015/05/04_definition-300x225.jpg 300w, /wp-content/uploads/2015/05/04_definition-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">本講演における用語の定義</p></div>

<p>例えば90年ごろの「C/Sシステム」（いわゆる「クラサバ」）は、クライアントのWindowsマシン上で「人間向け」（フロントエンド）の処理も「ストレージ向け」（バックエンド）の処理も行われていました。このように、クライアント＝フロントエンド、サーバ＝バックエンドという対応関係は時代によって変遷してきており、J2EEが提唱した三層アーキテクチャやRIAなど、様々なアーキテクチャと製品が模索されてきました。</p>

<div id="attachment_14901" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/05_cs.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/05_cs-640x480.jpg" alt="C/Sシステム" width="640" height="480" class="size-large wp-image-14901" srcset="/wp-content/uploads/2015/05/05_cs.jpg 640w, /wp-content/uploads/2015/05/05_cs-300x225.jpg 300w, /wp-content/uploads/2015/05/05_cs-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">C/Sシステム</p></div>

<div id="attachment_14902" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/06_bbff.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/06_bbff-640x480.jpg" alt="フロントエンドとバックエンドの変遷" width="640" height="480" class="size-large wp-image-14902" srcset="/wp-content/uploads/2015/05/06_bbff.jpg 640w, /wp-content/uploads/2015/05/06_bbff-300x225.jpg 300w, /wp-content/uploads/2015/05/06_bbff-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">フロントエンドとバックエンドの変遷</p></div>

<h2>isomorphicに挑戦してきた様々なフレームワーク</h2>

<p>こうした中、少しでも開発から無駄をなくすために、クライアント／サーバ、フロントエンド／バックエンドの間でコードを共有できないかという可能性が探られてきました。</p>

<p>「isomorphic」という単語は、筆者としては最近になって聞くようになったのですが、実は2011年にリリースされた
「<a href="http://flatironjs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Flatiron</a>」というフレームワークが提唱した概念だったそうです。4年近くも前から使われていた用語だったのですね。</p>

<div id="attachment_14903" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/07_flatiron.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/07_flatiron-640x480.jpg" alt="Flatiron" width="640" height="480" class="size-large wp-image-14903" srcset="/wp-content/uploads/2015/05/07_flatiron.jpg 640w, /wp-content/uploads/2015/05/07_flatiron-300x225.jpg 300w, /wp-content/uploads/2015/05/07_flatiron-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Flatiron</p></div>

<p>しかし、Flatironはそれほど普及することなく現在に至ります。その後もYahoo!の「<a href="https://github.com/yahoo/mojito" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Mojito</a>」や、一時期大きな話題になった（今でもアクティブに開発されていますが）<a href="https://www.meteor.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Meteor</a>など、様々なプロダクトがisomorphicなアプローチにチャレンジしてきました。しかしこれらがあまり大きく普及しなかった要因は、「（プロダクト利用者にとっての）どんな課題を解くのか」が不明瞭だったり、ニッチ過ぎたり、先進的すぎたりしたことにあると指摘。</p>

<div id="attachment_14904" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/08_frameworks.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/08_frameworks-640x480.jpg" alt="どんな課題を解くのかが重要" width="640" height="480" class="size-large wp-image-14904" srcset="/wp-content/uploads/2015/05/08_frameworks.jpg 640w, /wp-content/uploads/2015/05/08_frameworks-300x225.jpg 300w, /wp-content/uploads/2015/05/08_frameworks-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">どんな課題を解くのかが重要</p></div>

<p>そんな中、<a href="https://www.airbnb.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Airbnb</a>が2013年に公開した「<a href="https://github.com/rendrjs/rendr" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rendr</a>」
は、SPA (Single Page Application)の「初期表示が遅い」「SEOが弱い」という課題を解決すべく生み出されたもので、
かなり実用的でした。</p>

<div id="attachment_14905" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/09_rendr.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/09_rendr-640x480.jpg" alt="Rendr(Airbnb)" width="640" height="480" class="size-large wp-image-14905" srcset="/wp-content/uploads/2015/05/09_rendr.jpg 640w, /wp-content/uploads/2015/05/09_rendr-300x225.jpg 300w, /wp-content/uploads/2015/05/09_rendr-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Rendr(Airbnb)</p></div>

<p>RendrはBackbone.jsを拡張してisomorphicな環境を実現するものでした。Rendrは、以下のように様々な可能性を切り開きました。</p>

<ul>
<li>サーバサイドにおけるフロントエンドレイヤをJavaScriptで提供することで、クライアントとサーバのコード共有を実現しやすい</li>
<li>サーバサイドにおけるフロントエンドレイヤがセッション管理を行うことで、バックエンドのAPIをステートレスに保つことができる</li>
<li>サーバサイドにおけるフロントエンドレイヤがAPIゲートウェイとしてデータ変換を行ったり、様々なバックエンドAPIを組み合わせて
フロントエンドに提供する（オーケストレーション）ことを可能にする</li>
<li>上記のことから、（サーバサイドにおける）フロントエンドとバックエンドの疎結合な関係や、バックエンドの実装をJavaScript
に縛られず自由に開発できるようになり、ステートレスなマイクロサービスが協調して一つのサービスを作り上げるという構成を構築しやすい</li>
</ul>

<div id="attachment_14906" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/10_rendr-isomorphic.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/10_rendr-isomorphic-640x480.jpg" alt="Rendr的なIsomorphicの可能性" width="640" height="480" class="size-large wp-image-14906" srcset="/wp-content/uploads/2015/05/10_rendr-isomorphic.jpg 640w, /wp-content/uploads/2015/05/10_rendr-isomorphic-300x225.jpg 300w, /wp-content/uploads/2015/05/10_rendr-isomorphic-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Rendr的なIsomorphicの可能性</p></div>

<h2>Reactの波に乗れ！</h2>

<p>ですが、Rendrがリリースされた時期はAngularJSが人気を獲得した時期と重なっており、残念ながら大きな話題にはなりませんでした…。しかし今、「仮想DOM」というキャッチーなキーワードを引っさげ、<a href="https://facebook.github.io/react/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">React</a>が登場するや、非常な人気を博して今に至ります。</p>

<div id="attachment_14907" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/11_react.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/11_react-640x480.jpg" alt="Reactの仮想DOM" width="640" height="480" class="size-large wp-image-14907" srcset="/wp-content/uploads/2015/05/11_react.jpg 640w, /wp-content/uploads/2015/05/11_react-300x225.jpg 300w, /wp-content/uploads/2015/05/11_react-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Reactの仮想DOM</p></div>

<p>しかしReactはあくまでビューだけに特化したライブラリ。アプリケーションアーキテクチャとしては、Facebookが
「<a href="https://github.com/facebook/flux" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Flux</a>」を提唱していますが、公式な実装が提供されたのはFluxの一部分
のみであったため、独自実装が乱立する事態となっています。</p>

<div id="attachment_14908" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/12_flux.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/12_flux-640x480.jpg" alt="Flux" width="640" height="480" class="size-large wp-image-14908" srcset="/wp-content/uploads/2015/05/12_flux.jpg 640w, /wp-content/uploads/2015/05/12_flux-300x225.jpg 300w, /wp-content/uploads/2015/05/12_flux-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Flux</p></div>

<p>Fluxを用いたアプリの基本的な構成は以下のようになります。
フロントエンド部分に限ってみると、処理の流れが綺麗に一方向（unidirectional）になっているのがわかります。</p>

<div id="attachment_14909" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/13_fluxapp.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/13_fluxapp-640x480.jpg" alt="Flux的アプリの基本要素" width="640" height="480" class="size-large wp-image-14909" srcset="/wp-content/uploads/2015/05/13_fluxapp.jpg 640w, /wp-content/uploads/2015/05/13_fluxapp-300x225.jpg 300w, /wp-content/uploads/2015/05/13_fluxapp-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Flux的アプリの基本要素</p></div>

<p>そして何よりReactが期待されているのは、仮想DOMの仕組みを応用したisomorphicなアーキテクチャ。クライアントでは仮想DOMを実際のDOMツリーに変換しますが、サーバサイドでは仮想DOMからHTML文字列を出力するようにできるので、クライアントとサーバのどちらでも同様のコードが実行できるわけです。</p>

<p>Reactに関係するisomorphicなライブラリには、以下の様なものがあります。</p>

<div id="attachment_14910" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/14_react_isomorphic.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/14_react_isomorphic-640x480.jpg" alt="Reactに関係した、Isomorphicなライブラリ" width="640" height="480" class="size-large wp-image-14910" srcset="/wp-content/uploads/2015/05/14_react_isomorphic.jpg 640w, /wp-content/uploads/2015/05/14_react_isomorphic-300x225.jpg 300w, /wp-content/uploads/2015/05/14_react_isomorphic-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Reactに関係した、Isomorphicなライブラリ</p></div>

<p><a href="https://github.com/acdlite/flummox/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Flummox</a>も期待のライブラリ。</p>

<div id="attachment_14911" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/15_flummox.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/15_flummox-640x480.jpg" alt="Flummox" width="640" height="480" class="size-large wp-image-14911" srcset="/wp-content/uploads/2015/05/15_flummox.jpg 640w, /wp-content/uploads/2015/05/15_flummox-300x225.jpg 300w, /wp-content/uploads/2015/05/15_flummox-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Flummox</p></div>

<p>Yahoo!が開発中の<a href="https://github.com/yahoo/fluxible" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Fluxible</a>は、比較的重量級なアプローチの、isomorphicなFluxアプリケーションコンテナ。</p>

<div id="attachment_14912" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/16_fluxible.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/16_fluxible-640x480.jpg" alt="Fluxible" width="640" height="480" class="size-large wp-image-14912" srcset="/wp-content/uploads/2015/05/16_fluxible.jpg 640w, /wp-content/uploads/2015/05/16_fluxible-300x225.jpg 300w, /wp-content/uploads/2015/05/16_fluxible-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Fluxible</p></div>

<p>Fluxibleが使用する「<a href="https://github.com/yahoo/fetchr" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Fetchr</a>」は、バックエンド（の窓口となるWeb API）へのアクセスを、クライアントサイドとサーバサイドで同様のコードを用いることを実現します。正しくセットアップしていれば、Fluxアプリケーションのisomorphic化を促進できると期待されています。</p>

<div id="attachment_14913" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/17_fetchr.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/17_fetchr-640x480.jpg" alt="Fetchr" width="640" height="480" class="size-large wp-image-14913" srcset="/wp-content/uploads/2015/05/17_fetchr.jpg 640w, /wp-content/uploads/2015/05/17_fetchr-300x225.jpg 300w, /wp-content/uploads/2015/05/17_fetchr-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Fetchr</p></div>

<h2>まとめ</h2>

<p>isomorphicなアーキテクチャは長い間模索されていましたが、これまでいまいち波に乗り切れていませんでした。しかし今はReactが非常に人気を博し、isomorphicなアーキテクチャの実現に対して、多くの人々が注力しています。</p>

<p>マイクロサービスとの相性も非常に良いと考えられ、今後大きな潮流になっていくのは間違いないでしょう。</p>

<div id="attachment_14914" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/18_matome.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/18_matome-640x480.jpg" alt="まとめ" width="640" height="480" class="size-large wp-image-14914" srcset="/wp-content/uploads/2015/05/18_matome.jpg 640w, /wp-content/uploads/2015/05/18_matome-300x225.jpg 300w, /wp-content/uploads/2015/05/18_matome-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">まとめ</p></div>

<p>Reactの波に乗り遅れるな！</p>
]]></content:encoded>
		
		<series:name><![CDATA[アプリケーションアーキテクチャ最前線]]></series:name>
	</item>
		<item>
		<title>実例から考える、HTML5時代のエンタープライズ・アーキテクチャ</title>
		<link>/mitsuruog/9518/</link>
		<pubDate>Wed, 20 Aug 2014 00:00:29 +0000</pubDate>
		<dc:creator><![CDATA[小川充]]></dc:creator>
				<category><![CDATA[システム開発]]></category>
		<category><![CDATA[WebAPI]]></category>
		<category><![CDATA[アーキテクチャ]]></category>
		<category><![CDATA[エンタープライズ]]></category>

		<guid isPermaLink="false">/?p=9518</guid>
		<description><![CDATA[連載： エンタープライズ開発特集 (2)HTML5の時代となり、フロントエンドの重要性が増してきています。業務システムにおいても、HTML5を本格的に適用する事例が増えてきました。このような環境において、バックエンドを含...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/enterprise/" class="series-197" title="エンタープライズ開発特集" data-wpel-link="internal">エンタープライズ開発特集</a> (2)</div><p>HTML5の時代となり、フロントエンドの重要性が増してきています。業務システムにおいても、HTML5を本格的に適用する事例が増えてきました。このような環境において、バックエンドを含めた次世代アーキテクチャのベストプラクティスを模索するというのが本記事の趣旨です。</p>

<p>本記事では、HTML5時代におけるアーキテクチャの概要を提示した上で、アーキテクチャ実装の具体例として、「OData＋UIフレームワーク」を採用した事例を紹介します。その上で、このアーキテクチャを採用した場合のメリットと、今後の課題について記述していきます。</p>

<h2>HTML5時代における業務システムアーキテクチャのポイントとは</h2>

<p>業務システムにおけるHTML5化の流れについては、「<a href="https://html5experts.jp/albatrosary/3191/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JavaからHTML5ヘ。業務システムの開発におけるWeb技術の変化と適応事例</a>」にて、<a href="https://html5experts.jp/albatrosary/" data-wpel-link="internal">エキスパートの佐川夫美雄さん</a>が語っているように、HTML5時代において「JavaScriptフレームワークを用いたWebアプリケーション」が主流となることは、私自身も間違いないと感じています。</p>

<p>佐川さんが記事の中で語っているように、従来はブラウザで表示するためのHTMLをバックエンドが作成していましたが、今後はデータのみを返して、フロントエンドでHTMLを組み立てる方法が、今後は主流となっていくことでしょう。<br />
その上で、どのようなアーキテクチャになるのかを考えてみると、フロントエンドとバックエンドを切り離した俯瞰図を描けるかどうかが、大きなポイントとなります。</p>

<p>こちらにアーキテクチャ俯瞰図を記載します。
<img src="https://lh5.googleusercontent.com/-c-D7FGvXo10/U-HQEWe_csI/AAAAAAAACT0/pXT71fZA0Ck/w727-h301-no/ex-1.png" alt="アーキテクチャ俯瞰図" /></p>

<p>では、大きな3つの構成要素について見ていきましょう。</p>

<h3>1.フロントエンド</h3>

<p>フロントエンドはAjaxの普及以降、大規模・複雑化が進んでいます。最近では、「<a href="http://backbonejs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Backbone.js</a>」「<a href="https://angularjs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AngularJS</a>」に代表される「クライアントMV*フレームワーク(※)」と呼ばれるライブラリをベースに構築されることがほとんどです。その場合、UIは「<a href="http://getbootstrap.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Bootstrap</a>」など「CSSフレームワーク」と呼ばれるUIのみの特化したライブラリを組み合わせることが主流です。また、「<a href="http://www.sencha.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Sencha</a>」に代表される、UIコンポーネントと呼ばれるUI部分を含んだオールインワンタイプの「UIフレームワーク」を利用するケースもあります。</p>

<p>(※)クライアント側フレームワークはMVC、MVVM、MVWなど複数の考え方が存在しているため、それらをまとめて「MV*」と表現しています。</p>

<h3>2.バックエンド</h3>

<p>HTML5時代のバックエンドは機能特化型で進化してきました。フロントエンドに対してWeb APIを公開し、主に、永続化やトランザクション・認証管理・サーバーサイドキャッシュなどの用途で利用されます。また、セキュリティ上の理由でフロントエンドに配置できないビジネスロジックを配置します。そのため、従来のオンプレミス環境にとどまらず、クラウド上に構築されたり、BaaS、（モバイルに特化した）mBaaSなど、クラウドサービスを利用するケースもあります。</p>

<p>フロントエンドから見たバックエンドは、「JavaEE7（JAX-RS）」「Node.js」「Ruby on Rails」など、どんな言語やフレームワークで実装されているかは、あまり重要な違いではありません。重要なことはバックエンドがどのようなWeb APIを公開しているかということです。</p>

<h3>3.通信</h3>

<p>通信は主に軽量で、JavaScriptでの扱いが容易なJSONが主流となっています。ただし、システム間連携といったユースケースに代表されるような、厳密にデータ型を指定したい状況ではXMLの使用も一考に値します。</p>

<h3>業務システムアーキテクチャのポイント</h3>

<p>このように、HTML5時代における業務システムアーキテクチャのポイントとは、バックエンドとフロントエンドを切り離し、Web APIを経由してデータアクセスしていることです。そして、特に重要なことはWeb APIのインターフェースをどのように設計するかです。</p>

<p>バックエンドとフロントエンドを分割するアーキテクチャを採用した場合のメリットは、並行開発ができるということがあります。そして重要なことは、両者を紐づける制約がWeb APIのインターフェースであるため、インターフェースさえ守って入れば、片方に影響を与えることもなく、もう片方を作り替えることができるということです。例えば、オンプレミス上で構築してある古いバックエンドを、クラウド上に他の言語で再構築するようなことも可能です。</p>

<p>バックンドのWeb API化は、ビジネス変化の激しい今日において、業務システムが安全に変化し続けるための最重要要件だと考えています。</p>

<h2>業務システムにおいてWebAPI設計を難しくする3つのポイント</h2>

<p>HTML5時代の業務システムは、WebAPIを介した疎結合なアーキテクチャに移行していくのがトレンドであることは先ほど述べた通りです。フロントエンドとバックエンドの並行開発を成功させるためには、正しいWebAPIを早期に設計することが重要です。</p>

<p>WebAPI自体は、Web2.0時代にブームがあったように古い歴史のある技術であり、ノウハウが蓄積されている部分もありますが、ここでは業務システムにおいてWebAPI設計を難しくする3つのポイントについて提示した上で、WebAPI設計をどのようなスタンスで進めて行くべきか記述します。</p>

<h3>1. データアクセス条件の多様性</h3>

<p>売上データのWebAPIを例に説明すると、業務システムでは同じ売上データを取得する際に、様々な条件を与えます。これは、業務システムを利用するユーザーに多様性があるためです。例えば、拠点・店舗・地域・売上日・担当者・品目などの項目が挙げられます。さらに画面ごと、ユーザのロールごとに細かく条件が異なる場合も存在し、多様性を考慮した設計が必要です。これらの条件はWebAPIのURLパラメータとして定義される項目です。</p>

<p>URLパラメータを設計した後に並行開発していくのですが、当初から正しいURLパラメータを設計することは難しく、必ず後の工程に変更が入ります。</p>

<h3>2. データアクセス時のエンティティ間の関連</h3>

<p>データアクセス先が、複数のマスタデータ（エンティティ）を結合したデータを返すことも特徴です。これは、業務システムが扱うデータが、複数のエンティティに正規化された上で保持されているためです。売上データに対する店舗などのマスターデータをイメージしていただければ、分かりやすいかと思います。</p>

<p>こちらも実際に実装してみると過不足が多く見つかるポイントです。</p>

<h3>3. トランザクション処理</h3>

<p>WebAPIはステートレスの前提で作られているため、WebAPIをまたがるトランザクション処理は苦手です。特にロールバック処理を行いたい場合は、WebAPI単独で処理が完結してしまうため、以前の処理を打ち消すWebAPI呼び出しを行う必要があります。</p>

<p>そのためトランザクション処理を行う場合は、WebAPIとバックエンドの処理の間にトランザクション処理を担うレイアーを作成するような工夫が必要で、業務のトランザクションを考慮したWebAPI設計が必要です。</p>

<h3>WebAPI設計にて取るべきスタンスとは</h3>

<p>業務システムにおいてWebAPI設計を難しくするポイントについて説明しました。フロントエンドとバックエンドを繋ぐWebAPIは両者の影響を受けやすく、将来を見越して設計することが難しいこと、理解していただけたかと思います。そのため、WebAPIの設計は「最初に設計を固める」より「<strong>作りながら育てる</strong>」というスタンスで取り組むべきだと考えます。</p>

<p>次は、HTML5時代のアーキテクチャを実現する具体例として、「OData＋UIフレームワーク」の組み合わせを紹介します。</p>

<h2>作りながら育てるWebAPI設計を実践するための1つの選択肢「OData」</h2>

<p>WebAPI設計は「<strong>作りながら育てる</strong>」と提示しましたが、終わらないタスクほど嫌われるものはありません。実際の業務システムの開発においては、将来の変更も見越した網羅性のあるWebAPI設計を行って、後の変更の影響を最小限に止める方が現実的です。</p>

<p>最初に網羅性のある設計ができ、変更にも柔軟という、そんな都合の良いものが果たしてこの世の中に存在するのでしょうか？　そこで、注目したものが<a href="http://www.odata.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">OData</a>です。</p>

<p>ODataとは 「Webアプリケーションにおける、データアクセス方法を標準化したプロトコル」です。Microsoft、IBM、SAP、Citrix社など中心となりデータアクセスプロトコルの業界標準となるよう動いています。WebAPI版のODBCやO/Rマッパーのようなものと言えばイメージしやすいと思います。</p>

<p>ODataはHTTPをベースにしているため、一つ一つのデータアクセスは通常のHTTPでのWebAPIとなんら変わりませんが、次に代表されるようなデータアクセスに関する様々な指定をURLパラメータとして標準で定義しています。</p>

<ul>
<li><strong>順序指定：</strong><code>$orderby</code></li>
<li><strong>ページング：</strong><code>$skip</code>(開始位置）<code>$top</code>(取得件数)</li>
<li><strong>フィルタ：</strong><code>$filter</code></li>
<li><strong>部分取得：</strong><code>$select</code></li>
<li><strong>関連エンティティ取得：</strong><code>$expand</code></li>
</ul>

<p>URLパラメータの詳細は<a href="http://www.odata.org/documentation/odata-version-2-0/uri-conventions" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちら</a>を参照ください。</p>

<p>このように、URLパラメータでデータアクセス方法を柔軟に変更できるため、従来は大掛かりな変更が必要であったWebAPIの変更が、URLパラメータで吸収できることが多くなります。従来のWebAPI設計が変化に弱い硬直的なものだとすると、ODataを利用したWebAPI設計は変化に強く柔軟なものです。</p>

<p>しかし、OData特有のURLパラメータを生成することが非常に面倒であるため、今日まであまり普及しなかったことも事実です。最近では<a href="http://datajs.codeplex.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">data.js</a>、<a href="http://www.breezejs.com/home" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Breeze.js</a>などOData対応のJavascriptライブラリが登場し、UIフレームワークの<a href="http://sap.github.io/openui5/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">OpenUI5</a>と融合することで状況が変わったと考えています。</p>

<h2>ODataとUIフレームワークの融合がもたらすメリットとは</h2>

<p>ODataとUIフレームワークが融合することの最大のメリットは、データアクセスからUIへの結果反映まで、難易度が高く繊細な部分をUIフレームワークで隠蔽できることです。</p>

<p>UIコンポーネントに対してODataとのマッピングを施すことで、UIフレームワーク側でユーザの操作(ページングやフィルタ処理など)があった際、自動的にバックエンドへデータアクセスするためのURLを生成します。さらに、バックエンドから取得したデータはUIフレームワークが自動でUIコンポーネント側へ変更を反映します。</p>

<p>私が携わったシステムでは、UIフレームワークとODataを組み合わせることによって、データアクセスとUIへの結果反映の部分のコード量を、大幅に削減することができました。こちらが、ODataとUIフレームワークを適用した場合のアーキテクチャの概要図です。</p>

<p><img src="https://lh5.googleusercontent.com/-xlkwjdbYsDg/U-HQFFAqSAI/AAAAAAAACT8/-Vyx-ZpSKlg/w731-h289-no/ex-3.png" alt="OData+OpenUI5" /></p>

<p>（※）ODataを利用するためにはOData仕様に準拠しているWeb APIを実装しているバックエンドが必要です。これをODataServiceと呼んでいます。</p>

<p><em>ODataとOpenUI5を利用した実装例とチュートリアルについては、私が作成した<a href="http://mitsuruog.github.io/Openui5-with-OdataService/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">OpenUI5とODataを使ってWebアプリケーションを作る</a>に一通り記載したものがあります。参照していただければ雰囲気がつかめると思います。
</em></p>

<p>上の紫の部分がODataとUIフレームワークを組み合わせることによって隠蔽される部分です。フロントエンドが得意なエンジニアが少ない、業務システム開発の現場にてこれだけ実装する範囲を隠蔽できるのであれば、現実味のある選択肢の1つではないでしょうか？</p>

<h2>そんなに甘くないぞ！バックエンドのOData化。救うのは.NET系エンジニア</h2>

<p>一見、幸せになれそうに見える「OData+UIフレームワーク」アーキテクチャですが、最大の課題はバックエンドのOData化です。私の携わったシステムでは「<a href="http://help.sap.com/nwgateway" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SAP Netweaver Gateway</a>」というSAP社の製品を導入することでバックエンドのOData化を実現しています。</p>

<p>現在、もっとオープンかつ手軽な方法でOData化が実現出来ないか模索しています。中でもMicrosoftの「<a href="http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-22" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ASP.NET Web API 2.2</a>」は少ないコード量でODataを生成することができ、今最も注目しているOData化の方法です。 今後は、「.NET」系のノウハウとコラボレーションしていき、より簡単にバックエンドのOData化が実現できるようしていきたいと考えています。</p>

<h2>さいごに</h2>

<p>今回は、いくつか有効性を検証しているアーキテクチャの中で、「OData＋UIフレームワーク」という、一般的にあまり知られていないアーキテクチャを紹介しました。今後、様々なUIフレームワークがODataを標準でサポートし、より選択肢が増えることになれば、一気に業務システムのHTML5化におけるデファクトになる可能性があると感じています。</p>

<p>また、業務システムを切り口にした場合、一般的なWeb開発では注目されないテクノロジーに注目することも、なかなか興味深いです。</p>

<p>HTML5時代の業務システムにおいて有効なアーキテクチャはいくつも存在すると思います。これを機に、このような議論が業界内で進むことを期待しています。そして、日本のエンタープライズITをより良いものにしましょう！</p>
]]></content:encoded>
		
		<series:name><![CDATA[エンタープライズ開発特集]]></series:name>
	</item>
	</channel>
</rss>
