Goldman Sachs、 GS Collectionsでラムダ式を活用

COMMUNITY
ABOUT US
JAVA TECH
JAVA IN ACTION
Goldman Sachs の
ニューヨーク支社で
話す JVM アーキテク
チャ・チーム・マネー
ジャ、Donald Raab 氏
(左)とアプリケーショ
ン・プラットフォーム
担当グローバル責任
者、John Weir 氏。
JCP Executiveシリーズ
Goldman Sachs、
GS Collectionsでラムダ式を活用
Goldman Sachs の John Weir 氏と Donald Raab 氏が、GS Collections
の開発、Java SE 8 のラムダ式による影響、さらには JCP での活動に
ついて語ります。STEVE MELOAN
写真:LAURA BARISONZI/GETTY IMAGES
ORACLE.COM/JAVAMAGAZINE ///////////////////////////// MARCH/APRIL 2014
Java 8
Is Here
J
ohn Weir 氏は Goldman Sachs のアプ
リケーション・プラットフォーム担当グ
ローバル責任者です。Goldman Sachs
は 2011 年に Java Community Process
(JCP)の Executive Committee に選出さ
れており、Weir 氏はその代表を務めていま
す。Weir 氏はかつて、
クレジット・デリバティ
ブに関する FpML Standards Committee
と FpML Architecture Committee で
blog
14
ORACLE.COM/JAVAMAGAZINE ///////////////////////////// MARCH/APRIL 2014
COMMUNITY
JAVA IN ACTION
JAVA TECH
ホワイトボードに書
いた問題に取り組む
Weir 氏とそれを
見つめる Raab 氏。
ABOUT US
レクションを操作して、数百万から数億も
の要素を持つリストやセット、マップを処理
していました。コードベースは非常に膨大
で、数千からときには数万もの反復パター
ンが手書きの for ループで実装されていま
した。
Java SE 8 がリリースされるまで、コレク
ション分野には高機能な API が存在せず、
開発者は何度も何度もパターンを再作成し
なければなりませんでした。私たちの目標
は、開発者のコード内で " どうやって " から
" 何を " を切り離すことで重複コードを減ら
す関数型 API を提供することでした。また、
Fork/Join ライブラリによる並列性を活用す
ることで、開発者が複数のプロセッサ・コ
アを使用してパフォーマンスを最適化でき
るようにしたいとも考えていました。
8 のラムダ式に対応する準備はできていま
GS Collections 向けの API には、
すが、Java 5 から Java 7 まででも動作しま
Smalltalk での私のプログラミング体験
す。
が大きく影響しています。Smalltalk には
Java Magazine:内部反復が GS
select、reject、collect などの便利なメ
Java Magazine:GS Collections の発端に
Collections のキーとなる概念です。内部反
ソッドがあります。長い年
ついてお聞かせください。こ
復が非常に効果的である理由とは何でしょ
月をかけて、flatCollect や
の取組みはいつ開始され、当
実現性の確認
groupBy、partition、zip など うか。
初の目標はどのようなもの
「
JSR
プロセスを介し
のメソッドを追加しました。こ Raab 氏:内部イテレータは、操作している
だったのでしょうか。
コレクションの実装の詳細を隠して、エラー
れらのメソッドは、Haskell、
Raab 氏:GS Collections は
て、コミュニティがイ
を減らします。この内部イテレータのおか
Ruby、Scala といった言語で
2004 年、CARAMEL と呼ばれ
ノベーションを慎重に
げで、開発者は処理対象の各種データ型
得られた経験が影響していま
る Goldman Sachs の社内プ
吟味する必要がありま
を最適化するという義務から解放されます。
す。そのほかに、HashMap
ロジェクトとして開始されまし
内部イテレータは、実行すべき処理を受け
や ArrayList、HashSet など
た。CARAMEL という名前は、
す」
取ると、データ・コレクション内のすべての
の JDK Collections クラス
Collection(コレクション)、
要素に対してこの処理を適用します。
を、最適化したもので置き換
Array(配列)、Map iteration
̶Goldman Sachs、ア
たとえば、あるコレクションを別のコレク
えています。GS Collections
library(マップ反復ライブラリ) プリケーション・プラット
ションに変換する場合、ターゲットとソース
は、大規模と小規模の両方
に由来します。当時、私たち
フォーム担当グローバル
のサイズが同じだと分かっていれば、アル
のパフォーマンスに合わせて
は 10 ∼ 100GB レベルの非常
責任者、John Weir 氏
ゴリズム内で事前にサイズを設定できるた
チューニングされています。
に大きな Java ヒープを扱って
め、開発者が実装の詳細を扱う必要はなく
最新バージョンである Java SE
おりこの領域内で大規模なコ
Goldman Sachs の代表を務めていました。
1997 年の入社以来、数々の上級技術職を
歴任した Weir 氏は、2004 年にテクノロ
ジー・フェローとなり、2008 年にマネージ
ング・ディレクターに就任しました。
Donald Raab 氏は、Goldman Sachs 技
術部門のエンタープライズ・プラットフォー
ム・グループに属する JVM アーキテクチャ・
チームのマネージャーです。Raab 氏は JSR
335(Lambda Expressions for the Java
Programming Language)の専門家グ
ループのメンバーとして活動しており、JCP
Executive Committee における Goldman
Sachs の代表代理の 1 人でもあります。
2001 年に PARA チームのテクニカル・アー
キテクトとして入社した Raab 氏は、2007
年にテクノロジー・フェローとなり、2013
年にマネージング・ディレクターに就任しま
した。
blog
15
一息入れながらプ
ロジェクトを仕上げ
る Weir 氏と Raab
氏。
なります。このアプローチによってコードが
簡素化され、再利用しやすくなります。
Java では、ほとんどの開発者が先行反復
と呼ばれる方法を実装しており、この場合、
計算は即座に実行されます。しかし、わず
かに遅れて処理が実行される遅延方式で計
算を実行する方が便利な場合もあります。
開発者にとってこのような処理の実装は容
易ではありませんが、内部反復を使用する
と、処理の詳細はコレクション・クラスによっ
て内部で対処されます。
また、内部反復はコード保守にも大きな
効果を発揮します。大規模なコードベース
がずっと読みやすくなるため、長いアプリ
ケーションの寿命を考えると、生産性への
影響はとてつもなく大きいと思われます。
Java Magazine:Java SE 8 のラムダ式と
ORACLE.COM/JAVAMAGAZINE ///////////////////////////// MARCH/APRIL 2014
List<Integer> results = new ArrayList<>();
for (Integer each : list)
{
if (each > 50)
{
results.add(each);
}
}
その一方で、Java SE 8 を使用した GS
Collections の Select パターンは次のように
なります。
/**
* Aggregate the total order values by
item.
*/
@Test
public void totalOrderValuesByItem()
{
MutableMap<String, Double> map =
this.company
.getOrders()
.flatCollect(Order::getLineItems)
.aggregateBy(LineItem::getName,
() -> 0.0, (result, lineItem) ->
result + lineItem.getValue());
Verify.assertSize(12, map);
Assert.assertEquals(100.0, map
.get("shed"), 0.0);
Assert.assertEquals(10.5, map
.get("cup"), 0.0);
}
list.select(each -> each > 50);
Java 8 にはもう 1 つ非常に魅力的な仮想
拡張メソッドというものがあります。これも、
GS Collections にとって有用です。この機
能はインタフェースへの動作の追加を可能
メソッド参照によって、保守とレビューが
にしますが、デフォルトのメソッドと動作を
無駄がなくすっきりと簡単になります。これ
組み込むことで、GS Collections のテスト
らのイノベーションを活用するため、言語
COMMUNITY
JAVA IN ACTION
JAVA TECH
階層内の重複コードの量を減らせます。ま
た、フレームワーク全体を通じて、さまざ
まなテスト関連事項を組み合わせてマッチ
ングすることができるようになります。
Java SE 8 の機能であり、ラムダ式と密な
関係にあるメソッド参照も、GS Collections
に効果があります。メソッド参照を使用する
ことで、より簡潔で読みやすい形式で関数
型 API を利用できるようになります。
次のメソッド参照コード例は、GS
Collections Kata Java 8 Solutions から抜粋
したものです。
ABOUT US
GS Collections はどのようにやり取りするの
でしょうか。ほかにも関心のある Java SE 8
機能はありますか。
Raab 氏:GS Collections は最初から、ラ
ムダ式に体現された概念に基づいて開発
されています。Java SE 8 にラムダ式が組
み込まれたことは本当に素晴らしいことで
す。今後は GS Collections の API で幅広く
ラムダ式を利用できるようになります。GS
Collections には、呼出し時にラムダ式を渡
せる関数型メソッドが 90 以上もあります。
この Java SE 8 機能がもたらすメリットは
大きく、たくさんのコードを削除できると思
います。おそらく20 ∼ 30% ぐらい削減さ
れるでしょう。
たとえば、Java SE 7 で書かれた Select
パターンは次のようになります。
blog
16
ORACLE.COM/JAVAMAGAZINE ///////////////////////////// MARCH/APRIL 2014
COMMUNITY
JAVA IN ACTION
JAVA TECH
で抽出するこの新しいメソッドの実行には
およそ 3.5 倍もの時間がかかり、JVM 上に
いくらかのガベージを作り出していました。
コミュニティは Goldman Sachs が持つ多彩
なコードベースのおかげでこの問題を発見
し、私たちは Executive Committee におけ
る役割を通じてフィードバックを提供するこ
とができました。
私たちは JSR プロセスにも直接参加して
います。協力メンバーとして、ラムダ式や
Collections API、JCache API、Identity API
に関与してきました。また、JCP プロセス
に求められる運営、発展、前進方法に関す
る議論や協議にも参加しています。
Java Magazine:JCP メンバー企業にはそ
れぞれ異なる関心事や優先順位があります
が、これらのニーズはどのようにして JCP
内で取りまとめられているのでしょうか。
Weir 氏:Executive Committee が持つ大
きな強みの 1 つは、参加組織の幅広さで
す。Java プラットフォームのベンダーや再
販業者から、フレームワークやライブラリ
のプロバイダ、そして、Java ユーザー・グ
ループ(JUG)やエンドユーザーに至るま
で、さまざまな組織が参加する Executive
Committee は、Java の発展を導くという目
標に向けて全員が協力する優れた代表者コ
ミュニティです。
この目標によって、ベンダー側では激し
い競争があったとしても、コミュニティとし
ては 1 つになれるのです。私たちが目指す
のは、断片化することなく1 つにまとまった
Java プラットフォームの維持であり、今後
も幅広い機能要望に対応したいと考えてい
ます。
Java Magazine:標準の推進とイノベーショ
ンの推進のバランスは、どのように取れば
ABOUT US
と JVM(Java 仮想マシン)内で最適化を
実施しています。
Java Magazine:GS Collections はいつオー
プンソース化されたのでしょうか。また、
その過程についてお話しいただけますか。
Raab 氏:GS Collections をオープンソー
ス化したのは 2012 年 1 月でしたが、その
前に社内的なオープンソース化を行いまし
た。Goldman Sachs は多数の開発者とア
プリケーションを擁しており、非常に協力
的でコンセンサス主義の組織です。私たち
は、GS Collections の実行可能なユーザー・
コミュニティがあるのかどうかを、オープン
ソース化を行うことで調査したかったので
す。そして、明確な需要がそこにあること
がわかりました。
コレクション・ライブラリをオープンソー
ス化するだけでなく、私たちは付属のトレー
ニング・ライブラリである GS Collections
Kata も含めることに決めました。このライ
ブラリは GS Collections だけでなく、Java
SE 8 のラムダ式とメソッド参照の習得に適
したツールです。
Java Magazine:JCP プロセスに対する
Goldman Sachs のこれまでの貢献について
お聞かせいただけますか。
Weir 氏:私たちはいくつかの異なるレ
ベルで JCP プロセスに関与しています
が、Executive Committee における役割
は各ステージでの JSR のレビューです。ま
た、社内のネットワークを利用して、数
千名いる Goldman Sachs の開発者から
JSR のフィードバックを得ています。たとえ
ば、日付と時間の API を追加 / 改善した
JSR 310 に関して、私たちは Joda-Time の
getDateTimeMillis に取って代わるメソッド
の問題を発見しました。時間をミリ秒単位
ラムダ式がコードに与
える影響を確認する
Raab 氏と Weir 氏。
良いとお考えですか。
Weir 氏:誰もがイノベーションを求めてお
り、イノベーションは常にそこにあります。
イノベーションは、開発者が問題を解決す
るための必須要素なのです。CARAMEL か
ら GS Collections への発展については先ほ
ど Donald が話しましたが、このソフトウェ
アは、簡単で透明性が高く、より魅力的な
API を求めて開発者が努力した結果の産物
です。Java エコシステムの体制は非常に
blog
17
大きく、たくさん
のコードを削除
できると思いま
す。
おそらく20 ∼
30% ぐらい削減
されるでしょう」
̶Goldman Sachs、
JVM アーキテクチャ・
チーム・マネージャ、
Donald Raab 氏
ORACLE.COM/JAVAMAGAZINE ///////////////////////////// MARCH/APRIL 2014
MORE ON TOPIC:
COMMUNITY
JAVA IN ACTION
ニティは大規模で多様性に富んでいます。
また、先日は OpenJDK への参加契約に
も署名しました。直接的な貢献をしたいと
考えています。このプロセスを通じてオープ
ンソース・コミュニティに恩返しできればと
思います。
Java プラットフォームは、Goldman
Sachs のインフラストラクチャにとって非
常に重要な要素です。コミュニティや弊社
の利益のため、今後も Java が進化、発展
し続けるよう全力を尽くすつもりです。</
article>
JAVA TECH
たらすメリットは
ん。GS Collections を通じて、多数の開発
者がソフトウェアの発展に関わることで得ら
れるメリットを目にしてきた私たちは、特に
このプロセスを中心的価値と位置づけて投
資を行っています。つまり、私たちは開発
者の参加を広げることに特に力を注いでい
ますが、この参加拡大は、コミュニティの
利益を最優先するように、よく考えられた
系統的な方法で実施する必要があります。
この課題について、JSR 348 で取り組んで
います。開発者の参加が増えると、新しい
イノベーションが Java プラットフォームに
組み込まれる割合も高くなると考えていま
す。私たちは、世界中の何百万もの Java
開発者が JCP プロセスに参加できるように
するため、あらゆる機会を提供したいと考
えています。
Java Magazine:最後に一言お願いします。
Weir 氏:JCP プロセスとの関わりは楽しい
ものです。Executive Committee での役割
は優先度の高い活動ですが、JSR に関して
意見する場合はしばしば社内の JUG を利用
しています。
JSR への参加は私たちだけでなく、幅
広い Java ビジネスに利益をもたらします。
GS Collections Kata について Donald が述
べたとおり、私たちが GS Collections 向け
に作ったトレーニング資料を使って、ラム
ダ式や Java SE 8 に関する全般的なトレー
ニングが行われています。このように、より
大きなコミュニティに貢献できたことをうれ
しく思います。
Raab 氏:私も John と同じように、Java に
対する私たちのコミットメントについて述べ
たいと思います。私たちは、ニューヨーク
やロンドン、香港など、世界各地の JUG と
協力しています。素晴らしいことに、コミュ
ABOUT US
変化をもたらす
「
(ラムダ式が)も
オープンであり、このオープン性が、イノ
ベーションに拍車をかけています。そこに
は、実際の問題を解決している有能な人々
の知恵が結集しています。しかし、多種多
様なニーズを満たすには、JSR プロセスを
介して、コミュニティがイノベーションを慎
重に吟味する必要があります。何百万もの
開発者がこれらの標準によって左右されま
すから。また、プラットフォームはまとまり
のある全体として機能しなければなりませ
ん。
JSR プロセスの透明性を高めるために、
JSR 348 で行われた取組みは非常に有益な
ものでした。専門家グループに対して、公
開メーリング・リストの使用と公開課題追跡
ツールの管理が義務付けられました。JSR
348 には、すべての JCP メンバーと一般メ
ンバーがプロセスを参照し、意見を述べ、
プロセスに参加する機会を持たなければな
らないと規定されています。これらの成果
によって JSR プロセスの不透明性が大幅に
改善され、可能な限り幅広いコミュニティ
が関与するようになるでしょう。
Java Magazine:JCP への参加方法の改善
については、どのようにお考えですか。
Weir 氏:現在、Executive Committee は
参加を改善する方法についての議論を重ね
ています。製薬会社から金融サービスや消
費財メーカーまで、さまざまな企業がかな
りの数の Java 開発者を抱えています。個
人が JCP に加入してプロセスに参加するに
は、その雇用主による Java Specification
Participation Agreement(JSPA)への署
名が必要です。JSPA は法的な契約である
ため、何らかの制約が存在する企業もある
と考えられ、結果的に、一部の Java 開発
者には JCP に関わる仕組みが存在しませ
Java 8
Is Here
Steve Meloan:元 C/UNIX ソフトウェア開
発者。Wired、Rolling Stone、Playboy、
SF Weekly、San Francisco Examiner など
の各誌に Web やインターネットに関する
記事を執筆している。近著はサイエンス・
アドベンチャー小説の『The Shroud』。ま
た、The Huffington Post に定期的に寄稿
している。
blog
LEARN MORE
• GS Collections
• ラムダ式
18