[レポート]
2ヶ月前になりますが、2009年4月9日(木)〜10日(金)の2日間にかけて、東京の品川カンファレンスセンターにて「QCon Tokyo 2009」が開催されました。この記事では、カンファレンス全体の様子と、筆者が参加したセッションの内容をレポートします。
QConは、技術情報サイトInfoQ主催のカンファレンスです。InfoQは海外では有名な技術情報サイトで、特定の技術・方法論に偏らず、Java、.NET、LL言語から、アーキテクチャ、SOA/クラウド、アジャイル、RIAまで、あらゆる最先端の技術的話題が発信され、技術者同士のコミュニケーションの場になっています。QConも同様で、とくに現在のソフトウェア開発の最先端を担う著名スピーカー(Kent Beck、Martin Fowler、Ralph Johnson、Rod Johnson、Eric Evans、Gregor Hohpe、・・・)が数多く集まることで人気を博しています。また、こうした著名人同士の交流の場にもなっているようです。
QConはこれまで、米国(San Francisco)と英国(London)でのみ開催されてきました。筆者のように海外でのQConを長年うらやましく思ってきた人には、待望の東京初開催となりました。
今回のQCon Tokyoでは、アーキテクチャ、RIA、Ruby、クラウド/SOA、アジャイル、事例紹介の6つのトラックが用意されました。San Franciscoが16セッション、Londonが17セッションあったのに比べると、セッションの層は圧倒的に薄いです。海外からのスピーカーをもっと呼んでほしい、というのもありますが、同時に日本にいる我々がもっと頑張って情報発信していかなければならないのだろうとも思いました。(QCon主催者側も、参加者にInfoQ Japanへの記事提供をお願いしていました。)
有料カンファレンス(参加費3万円)ということもあり内容の濃さに大いに期待していたのですが、蓋を開けてみればスピーカー陣が比較的豪華だった以外は、他のカンファレンスとそれほどの違いは感じられませんでした。常連スピーカーの中には、他のカンファレンスとほとんど同じ内容の講演をされている方もいました。筆者が過度な期待をしていたのかもしれません。
参加者の人数は、筆者の感覚で200人前後です。2日目は、1日目に比べてやや人が減っていたように感じます。同時期に開催された北京(QCon Beijing)の方が、人数は圧倒的に多かったそうです。人口比率の差も当然あるのでしょうが、北京は非常に活況だったようです。
今回、全体を通して筆者が感じたテーマは「クラウド」と「リーン開発」でした。クラウドが話題になるのは当然な気もしますが、リーン開発がこれほど盛り上がっているとは予想外でした。いま欧米のソフトウェア開発の現場は、リーン開発を積極的に採り入れようとしているようです。
Martin Fowler氏(ThoughtWorks社チーフサイエンティスト)
Fowler氏は現在DSLについての本を書いていますが、このセッションはその一端を先取りして紹介するものでした。DSL本自体は、来年夏頃の出版を予定しているそうです。なお、オブジェクトの広場が2008年に翻訳した『ThoughtWorksアンソロジー』にもFowler氏のDSLについてのエッセイがありますので、ぜひそちらもご参照下さい。
![]() |
ThoughtWorksアンソロジー アジャイルとオブジェクト指向によるソフトウェアイノベーション ThoughtWorks, Inc. 著、オブジェクトの広場 訳 オライリー・ジャパン, 2,730円 276ページ ISBN: 978-4-87311-389-0 |
Fowler氏が定義するDSLとは、以下の4つを満たすものです。
DSLを使うと、JavaやC#のような汎用プログラミング言語で記述した場合に比べて、特定の問題の意図をより明確に表現できます。汎用言語の代わりにXMLを使う方法もありますが、XMLではまだまだ読みやすいとは言えません。
DSLの作り方には、「外部DSL(external DSL)」と「内部DSL(internal DSL)」の2つのアプローチがあります。
Rubyは内部DSLを作るのに非常に適した言語ですが、Javaでも「流れるようなAPI(fluent API)」を使って実現できます。
DSLの実行は一般に、まずDSLを解析して意味論モデルを作り、次にそれをコンパイルして実行形式にする(コンパイル型)か、意味論モデルを直接実行する(インタプリタ型)、という流れになります。
言語処理系というとコンパイル型が中心ですが、DSLでは簡便なインタプリタ型の方が流行るだろうとFowler氏は言います。内部DSLであれば、アプリケーションのドメインモデルにDSLの変換ラッパを被せるだけで、インタプリタ型のDSL処理系が出来上がります。
また最近では、「言語ワークベンチ(language workbench)」という面白いDSLツールが登場しています。言語ワークベンチとは、ソースコードでなく意味論モデルが中心にあり、そのモデルをソースコードやUML図など様々なビューに投影(projection)して編集するツールです。まだ実用段階ではありませんが、Intentional Software、JetBrainsのMPS(Meta Programming System)、MicrosoftのOslo、Xtextなどの製品があります。
最後にFowler氏が強調したのは、DSLはビジネスユーザが「書く」ための言語だ、という誤解です。これは幻想でしかなく、本当に重要なのは、ビジネスユーザが「読める」という点にある、とのことです。つまり、DSLはシステム開発の一部をビジネスユーザに任せるためのものではなく、ビジネスユーザと開発者とのコミュニケーションを促進するツールなのです。
Jeff Barr氏(Amazon社シニアマネージャ)
「・・・ in Action」というタイトルから、AmazonのAPIを使った具体的なクラウドプログラミングの話を期待していましたが、Amazonのサービス内容と料金体系の紹介が中心で、宣伝色の強いセッションでした。唯一面白かったのは、事例紹介の部分です。
Amazonは元々ネットの本屋として登場しましたが、今やクラウドの一大プレイヤーにもなっています。そのため、筆者はAmazonのビジネスがよく分からないでいたのですが、Barr氏はAmazonのビジネスを明確に以下の3つだと定義していました。
AWSでは、以下のサービスを提供しています。
大手企業でS3を採用した事例として、New York Times(NYT)の過去記事閲覧サービスが紹介されました。これは、半世紀以上前からの古い新聞を、紙面をそのまま画像スキャンした形で閲覧できるサービスです。過去記事データのストレージとして、S3が使われています。
NYTのような大企業でもクラウドの利用が進んでいることに筆者は驚きましたが、考えてみれば過去記事閲覧サービスはNYTにとっての中核ビジネスではありません。万一サービスが停止しても、それほど企業価値が損なわれないものとも言えます。米国においても、まだまだそういったリスクの少ないところからの導入が中心なのだな、という印象を受けました。
Martin Fowler氏(ThoughtWorks社チーフサイエンティスト)
3.years.of(:ruby)
という、Rubyistならニヤリとしてしまいそうなタイトルで始まったセッションです。ThoughtWorks社(TW)の、実ビジネスにおける3年間のRuby適用に関するレポートでした。TWは数少ない、本気でSIにRubyを採用している企業ですので、その実経験のレポートというのは非常に貴重だと思われます。
TWは、2006〜2008の3年間で、41件のRubyプロジェクトをやっています。規模の平均は20人×1年間(=240人月)で、もっとも大規模なプロジェクトは自社製品Mingle(アジャイルプロジェクト管理ツール)の開発プロジェクトで、約20人×30ヶ月(≒600人月)です。
「次もRubyを使いたいか?」との質問をプロジェクトの参加メンバに聞いたところ、Yes=36人、No=5人でした。Noと答えた人の理由は、「Rubyを導入しても生産性が変わらなかった」「他システムとの統合が面倒くさい」「社会的な原因から」というものでした。
こうした経験から、Rubyは簡単、柔軟で、効率性が高く、アジャイル開発に非常に向いていると言えます。ただし、Rubyを導入する際は、以下のポイントが重要です。
Rubyのコードベースは扱いにくいのではないか、という意見もあるようですが、実際にはそのようなことはありません。ただし、最初は優秀なメンバで構成された小チームで始めて、次第にコードベースを大きくしていくのがいいようです。
Rubyは確かに遅いです。しかし、パフォーマンスの問題はDBアクセスに起因するものがほとんどで、システム全体で考えればRubyによる影響は低いと言えます。
Mingleは確かに遅く、高性能なマシンでないと動きませんが、その代わりにチームの生産性は高くなっています。製品が高性能なマシンを必要とすることと、チームの生産性を上げることとの間にはトレードオフがありますが、Mingleチームは生産性を優先しています。マシンの性能向上ペースは速いので、長い目で見て製品の遅さは問題にならないとの判断からです。
ActiveRecordを使ったデータアクセス層のテストをどうするか、という問題があります。テスト対象メソッド以外でも実際にDB接続すると遅いため、TWではメソッド単位でスタブを作ってテストをします。この方法で、Mingleでは2000テストが10分ほどで終了します。
ActiveRecordはデータアクセス層を抽象化できるのがメリットですが、パフォーマンス上の理由から、だいたい20%は直接SQLを書きます。抽象化が一部崩れてしまいますが、ある程度は仕方ないものと認識しています。
丸山不二夫氏(早稲田大学教授)
クラウドコンピューティングにおける新しい概念、「CAP定理」、「結果整合性(Eventual Consistency)」、「BASEトランザクション」を紹介したセッションです。従来のDBトランザクションの性質であるACID属性は、クラウドの世界では通用しなくなり、代わりにこうした新しい考え方が台頭する、というお話でした。
クラウドの技術的特徴は、拡張性(Scalability)と可用性(Availability)です。拡張性の実現には、スケールアップよりスケールアウトが重要になります。可用性を実現するには、複数のレプリカを作り冗長化する必要がありますが、そのとき整合性(Consistency)が問題になります。
「CAP定理」とはUC BerkleyのEric Brewer教授が考案した定理で、Consistency、Availability、Partition-tolerance(分割耐性)のうち2つの性質しか両立できない、というものです。クラウドでは分割(「P」)は必須なので、アプリケーションに応じて「C」と「A」のトレードオフをしていかなければなりません。
「クラウドはエンタープライズの基幹システムには向かない」「クラウドはコンシューマ向けのもの」というのは誤解で、「C」(整合性)優先なのか「A」(可用性)優先なのかをしっかり認識することで、エンタープライズにクラウドを採用することも十分可能です。
整合性については、「結果整合性(Eventual Consistency)」という概念が重要になります。これは、一時的に不整合が発生することはあっても、一定時間経てば整合性は回復し、長い目で見れば整合性が保たれているという性質です。MicrosoftのAzureは、アーキテクチャレベルで結果整合性を実現する仕組みが採用されています。
結果整合性の概念は、eBayアーキテクトのRandy Shoup氏のセッションでも登場しました。クラウド技術者の間では、すでに共通認識となっている概念のようです。
DBトランザクションについては、ACID *2 の代わりに「BASEトランザクション」という概念が重要になります。BASEとは、以下3つの性質を指します。
たとえば、クラウド上で並行処理をする場合、可用性を上げるためには、いかに排他ロックを掛けない設計にするかが重要になります。この場合、アーキテクチャにキューを導入することで、可用性を優先しつつ、並行処理の順序性を実現できます。
クラウドのACID属性については、GoogleのGregor Hohpe氏のセッションではBASEとは異なる概念が提案されています。ぜひそちらも参照してください。
*2 DBトランザクションのACID属性とは、DBが完全な状態を保つためにDBトランザクションが保持すべき4つの性質、「Atomicity(原子性)」「Consistency(整合性)」「Isolation(独立性)」「Durability(永続性)」のことを指す。
Rod Johnson氏(Spring Framework創始者、SpringSource社CEO)
エンタープライズ開発の世界がこれからどう変化していくか、そしてその中でSpring Frameworkが今後どのような役割を担っていくつもりか、を紹介するセッションでした。セッションでは、技術的に踏み込んだ話題は一切なく、一方でSpringSource社の戦略を意識したメッセージ性を強く感じました。筆者の個人的な印象ですが、Johnson氏はCEOという肩書きもあるように、かつてのようなJava EE技術者ではなく今は経営者として専念しているように感じました。
昨年来の世界的不況により、企業のコストカットが進んでいます。その流れから、エンタープライズ開発ではシンプルなものが好まれるようになります。YAGNI(You Aren't Gonna Need It)で必要なものだけを作る「リーン開発」が今後さらに普及するでしょう。
これから重要になるのは「開発者」です。90年代までは、IBM、Sunなどシリコンバレーのベンダが主導権を握ってきましたが、現在は技術的な選択肢が膨大なため、それを取捨選択する開発者が主役になります。
OSSもさらに普及するでしょう。OSSは、コミュニティベースで開発されるため、本質的にシンプルなものだけがコミュニティに受容され、生き残るからです。OSSの時代には、国の違いが重要でなくなる一方で、言語の違いは非常に重要になります。
Springが今後取り組もうとしている課題は、以下の通りです。
Javaの開発/デプロイは、Ruby on RailsやDjangoに比べると、まだまだ複雑です。Springは、Grails、Spring tc Server/dm Serverなどに力を入れて、この課題を解決しようとしています。
Javaには非常に多くのOSSの選択肢がありますが、Microsoft Visual Studioのような統一感が欠落しています。部品同士が緊密に調整されることで、心地よく高級感ある乗り心地を実現するトヨタのLexusのような、「大きな絵」=統一されたビジョンがJavaには必要です。Springは、そうしたビジョンをJava開発者に提供するプレイヤーになることを、今後の戦略としています。
エンタープライズJava開発も、これからはリーンの時代になるでしょう。
Gregor Hohpe氏(『Enterprise Integration Patterns』共著者、Google社ソフトウェアエンジニア)
EIP著者による、クラウドにおける新しいプログラミングモデルについてのお話です。前半は一般的な新しいプログラミング概念についての話題でしたが、後半はGoogleの技術スタックについての紹介がメインになり、多少の宣伝色を感じるセッションでした。
プラットフォームとしてのインターネットは、疎結合、拡張性、標準準拠、耐障害性、無限の計算資源、普遍性などの夢のような性質をもたらします。その代わりに開発者は、コールスタック、トランザクションなどのシンプルなプログラミングモデルが存在しない、計算上の前提や確実性、順序性をもたない、などの難しい問題に対処しなければなりません。
新しい時代のACID属性 *3 は、DBトランザクションの性質ではなく、計算の順序に関するものになります。
同じくACIDの再考でありながら、上述の丸山不二夫氏が示したBASE属性とは異なる切り口なのが面白いところです。丸山氏はあくまでDBトランザクションにこだわって新しい性質を再定義していますが、Hohpe氏は計算の順序という別の観点に注目して、そこに同じ頭字語のACIDを見出しています。
*3 従来のACID属性とは、DBが完全な状態を保つためにDBトランザクションが保持すべき4つの性質、「Atomicity(原子性)」「Consistency(整合性)」「Isolation(独立性)」「Durability(永続性)」のことを指す。
クラウドでは、2フェーズコミットによる分散トランザクションを実現することは困難です。私たちエンタープライズ開発の技術者はトランザクションなしでどうやってアプリケーションを作るのかと疑問に思いますが、現実世界を見ると、意外に多くの振る舞いがトランザクションなしで成立しています。Hohpe氏は、一例として、スターバックスにおけるドリンク注文処理を紹介します。
スターバックスでは、レジで注文を受けると、客がお金を払う前からドリンクを作り始めます。スターバックス側がきちんとドリンクを提供できることと、客側がお金を払えることの両方を確認してから、ドリンクとお金を同時に交換するという意味での「2フェーズコミット」は行われません。ドリンクを作ったのに客が財布をもってなかった、といった不整合を未然に防ごうとするのではなく、不整合が起こったら以下の3つの方法で柔軟に対処するのです。
なお、この話題については、Hohpe氏のブログ記事「スターバックスは2フェーズコミットをしない」(筆者翻訳)でより詳細に議論されています。ぜひそちらも参照してください。
こうした新しい考え方を必要とするクラウドに対して、Googleは以下のプログラミングスタックを提供します。
また、上記のプログラミングスタックを利用するための開発環境Google App Engineに、2009年4月にJava版が登場しました(これまではPython版だけでした)。
Webコンテナ | Java Servlet |
データストア | JDO & JPA |
HTTP | java.net.URL |
メール | javax.mail |
メモリキャッシュ | javax.cache |
Randy Shoup氏(eBay社アーキテクト)
eBayの大規模オークションサイトを支えるベストプラクティスを、パターンとして紹介したセッションです。eBayはあくまで大規模分散技術のユーザなので、宣伝色は一切なく、純粋に実践的ノウハウを共有するものでした。今回、筆者が最も秀逸に感じたセッションです。
大規模ウェブサイトのアーキテクチャでは、次の5つの特性が重要になります。
これらの特性を実現する大規模ウェブサイト構築のベストプラクティスが、以下の5つです。
「分割しない限り、スケールできない(If you can't split it, you can't scale it)」 ― すべての問題を、データ、負荷、使用方法に基づいて管理可能なチャンクに分ける必要があります。
上記2パターンの帰結として、以下のプラクティスが導かれます。
システムの性能を最大限に活用するために、できる限り非同期処理を活用します。
最もコストが掛かるのが人間です。人手が介在することで、拡張性や応答性も低下します。そのため、マシンを最大限に利用して自動化し、人手の作業を排除します。
あらゆるものが落ちることを前提に設計することで、システムの耐障害性を高めます。
クラウドの前提であるCAP定理を理解して、受け入れることが必要です。いかなる時もシステムに不整合が起こらない「即時整合性(Immediate Consistency)」と、まったく整合性を保証しない状態との間には、幅広いレベルでの「結果整合性(Eventual Consistency)」があります。即時整合性が本当に必要なシステムは、たとえ金融システムであっても、意外に少ないはずです。分散トランザクションでなく、結果整合性を積極的に使うようにします。
QConのスピーカー陣が集まって、会場の参加者と一緒に、エンタープライズ開発の「次の2年」について議論する、というQConの定番セッションです。通訳の関係もあってか、登壇したのはすべて海外スピーカーでした。登壇スピーカーは以下の通りです。
Martin Fowler、Rod Johnsonの両氏はスケジュールの都合もあってか、2日目に帰国してしまい、このセッションには不参加でした。代わりに、Marinescu氏が2人の代弁者としてその意見を伝えました。
本稿執筆に当たって、QCon Tokyoでご一緒したkentaro714氏の参加レポート「QCon Tokyo 2009に行ってきた」を大いに参考にさせていただきました。ありがとうございます。
|
© 2009 佐藤 匡剛 |
|