読者です 読者をやめる 読者になる 読者になる

Appresso Engineer Blog

アプレッソのエンジニアが書く技術ブログです。

JavaOne 2015 4 日目 - Java is gone, Elton John comes

こんにちは、アプレッソ開発部の野口です。

JavaOne も 4 日目を無事終えて、いよいよ最終日に向かいます。

今日のことは今日のうちに。
たとえホテルに戻ってきたのが 0 時過ぎで、もう今日じゃなくても、そこは気合で。

4 日目のレポートです!

と、その前に、3 日目のレポートはこちら。

appresso.hatenablog.com

さて、今日は以下の 5 セッションに参加しました。

  • RIA Technologies and Frameworks Panel
  • Legacy Lambda Code in Java
  • Thinking, Fast and Slow, with Software Development
  • Refactoring to Functional
  • Effective Exceptions and Java 8 Streams

それからもちろん、

にも!

大事なことなので最初に言っておくと、Elton John は最高でした。

RIA Technologies and Frameworks Panel

RIA について 5 人の登壇者がいろいろ喋るパネルディスカッション形式のセッション。

Studio for Web の移行パス

私がふだん開発している DataSpider Servista には Studio for Web という Silverlight で実装された極めてリッチな Web クライアントがあるのですが、Microsoft が Sliverlight のサポートを切っていく方針のため、移行パスを探しています。

極めてリッチというのは伊達ではなくて、もともと Swing で開発していたデスクトップクライアントをほぼ丸ごと再現&よりモダンなデザインにする、というコンセプト*1で開発されただけあって、RIA というよりは、Windows アプリケーションがなぜかブラウザで動いていると言った方が伝わりやすいようなシロモノです。

正直なところ、Silverlight 以外の現存する Web クライアントフレームワークでまったく同じものを作ることはおそらくできないと思います。
ゆえに、移行パスの選定は結構重要事項で、また難しい仕事です。

サイボウズさんの大ヒットサービス kintone の UI には希望が感じられます(JavaScript であそこまでできるのならあるいは……)が、JavaScript であそこまでやる方向に舵を切るというのも、会社として大きな決断なので、そう簡単には決められないというのが正直なところです。

It depends

前置きが長くなりましたが、本編です。

セッションは、会場にアンケートを取ったり、適当に質問を受け付けたりしながら進みました。

f:id:appresso:20151029185736j:plain ▲こういうゆるい感じ

パネルディスカッションということで色々と細かい議論はありましたが、総論としては、それぞれトレードオフがあるから、プロジェクトのターゲットや性質をよく考慮して選ぼう、という当たり前のところに落ち着いたように思います。

ついつい「これは!」というソリューションがあるのでは、と期待してしまっていたのですが*2、今のところ見当たりそうにありません。

印象的だったこととしては、HTML5 、Swing、JavaFX といったクライアント技術全般のうち、Swing を使っている人の数がダントツだったことです。
まあ、JavaFX 8 が出てからまだ 1 年半しか経っていないし、それもそうか、とは思うのですが。

ちなみに Java のバージョンについては Java8 が一番多く、さすがに JavaOne だなと感じます。

また、RIA の話題だけに JavaScript の話も多かったのですが、登壇者が会場に振っても総じて反応が薄く、イマイチ盛り上がりませんでした……。

それからモバイルの話が多かったのも印象的でした。
業務上は今のところ気にしなくていいのであまり気にしたことがないのですが、一般的には気になるところですよね。

ほんとうにしたいことは何なのか考えよう

これはセッションの結論というわけではなく私なりに考えたことなのですが、「プロジェクトのターゲットや性質をよく考慮する」ということで、実現したい UI・機能・設計ありきで考えるというよりは、もっとおおもとの UX というか、「ほんとうにしたいことは何なのか」というところから考えた方がいいのでは、という気がしています。

たとえば、まず REST API があって……というところから始まりがちですが、もしかしたら(たとえば)WebSocket が適切な個所があるかもしれませんし、他の技術が使える可能性もあります。
そもそもブラウザで動く必要が本当にあるのかということも問うことができます。

そういった様々な要素を考えあわせて、また組織の強みや今後の方向性も考慮して、検討し、決める必要があるのだなと思います。(大変だ……)

Legacy Lambda Code in Java

次は、25000 行の C# コードを Java に移行した経験から見つけた、ラムダ式でハマりがちな落とし穴を紹介するというセッションです。
スピーカーは Peter Lawrey。

話題はいろいろありましたが、

f:id:appresso:20151029172113j:plain ▲この通りいろいろ

面白かったのは、これとか、

f:id:appresso:20151029172146j:plain ▲答えは、上が Runnable で、下は Callable(call() throws Exception)だから。「ああ!」と思いました。


これとか。

f:id:appresso:20151029172336j:plain メソッド参照だと無駄なオブジェクトが作れられま……いや嘘です。スライド間違ってます。メソッド参照だと、無駄なオブジェクトが、作られません

f:id:appresso:20151029172559j:plain ▲このスライドの true と false もあべこべだと思います。メソッド参照を使った場合、(スコープ内の変数の)キャプチャを行う必要がなく、匿名クラスが呼び出しの都度生成されることもないので、すべての呼び出しのインスタンスは一致するはずです。

ややこしい例を出してしまいました。スライドが間違ってますね。
ちょっと今は時間の都合上難しいのですが、日本に帰ったら念のため検証しておきます。

★上記については、日本の同僚(AWS 関連のアダプタとかを開発している田中さん)が検証してくれたところスライド通りだったそうです。
何か間違って理解しているのだと思うので、保留にします。何が正しいのかわかったら更新します。
→フォロー記事を書きました。

appresso.hatenablog.com


このへんラムダ式に詳しい人にはとっくに当然なのでしょうが、もともと詳しくなかったけど使ってみて詳しくなってきた、という人が増えている(そういう人がスピーカーになったりもしている)時期なのだと思います。(JavaOne 2015 ではそういうラムダ式・Stream API 応用編みたいなセッションが多いように感じます)

ただ、このセッションは全体的には興味深いものが多いながらも、どこかいまひとつ響かなかった……感じでした。(疲れていたからかも……)

Thinking, Fast and Slow, with Software Development

ファスト&スロー』は日本でも文庫まで出ている、ダニエル・カーネマンの有名な本です。その内容を元ネタに、ソフトウェア開発ではこういうことだよね、というセッションでした。
スピーカーは Daniel Bryant。

Java とは直接関係ないセッションだしアジャイルとかも書いてないしすいてるんだろうな~と何となく勝手に思っていましたが、意外と人気でした。
『ファスト&スロー』が有名だからなのか、はたまた。

内容はタイトルの通りで、特筆すべきことはないかな……と思います。
『ファスト&スロー』を読むとよいでしょう。別にそれをソフトウェア開発にあてはめるのは難しいことではないと思います。(実践するのは難しいですが……)

ただ、スピーカーが巧みで、なんだか TED トーク出張所みたいになっていました。
話の内容も TED トークっぽいからかもしれませんが。

f:id:appresso:20151029175121j:plain ▲TED っぽい手の形

端々で皮肉が効いていて、テンポよく笑いを取っていました。
"If you have SOA, even toString() looks like a service" とか。……あれ、今見るとそんなに面白くないですね。

やっぱりプレゼンテーションでは話し方、スピードや間、身ぶり手ぶりも重要なのですね。
そういえば、話すスピードはとても速いのに聞き取りやすい英語でした。

Refactoring to Functional

JetBrains の Hadi Hariri によるセッション。

  • より少ないコード
  • より表現力のあるコード
  • 正しいコード
    • テストを書く必要があるので、テストが書きやすいコード
  • よりパフォーマンスのよいコード

のために、宣言型のコードをどうやって関数型に書き換えていくか、という内容です。

が……(昨日の教訓その 6 を生かして)10 分前に会場入りしたところ、結構埋まっている。
うえに、会場は Golden Gate 6/7/8 というスクリーンが小さい&縦に長いという最悪の会場*3で、画面が見えない!!

文字の大きさもありますが、まず人の頭で画面の半分が見えません。
コードが見えないと仕方ないので、途中で諦めました。

  • 教訓その 7 : 各会場の広さやスクリーンの大きさといった特徴を早めに把握し、予想される混雑度も勘案して会場入りの時間を調整しよう。

ご飯食べたり休憩したりとかもあるから、必ずできる限り早く入る……という風にもしたくないんですよね。
人によってはその方がシンプルでいいかもしれませんが。

ちなみに、コード例は Scala でした。
どうでしょう、たしかに考え方は同じだけど、やっぱり Java でやってくれることを期待した参加者が多かったんじゃないかな……という思いも残りました。(サマリにも一言も書いてなかったし)

Effective Exceptions and Java 8 Streams

Benjamin Weber(http://benjiweber.co.uk)による、Java のチェック例外を Stream API とどう組み合わせるか、という話。

Stream API では、ラムダ式を使う場面が多数出てきます。
そして、多くのラムダ式の(文法上の)実体は java.util.function パッケージの関数型インタフェースで、これらの関数*4は基本的にチェック例外をスローしないことになっています。

そうしたとき、ラムダ式の中でチェック例外を投げるメソッドを呼ぶことができません。
これをどう解決するか……というのは、Stream APIラムダ式を使ったことのある方なら誰もが抱えたことのある課題だと思います。

f:id:appresso:20151029180312j:plain ▲こういうやつです

既知の方法

セッション全体としてはさまざまな方法が提案されましたが、まずは以下のような方法をあげました。

  1. catch してかわりに null を返すようにする
  2. catch してかわりに Optional を返すようにする
  3. catch して RuntimeException に変換する

これらは私にとって既知の方法で、今までは 2. か 3. を取ることが多かったです。(3. の場合、ログを出力しておく)

新しい方法

続いて、(私にとって)新しい方法が大きく分けて二つ紹介されました。

まず、

4. catch して Either<T, E> に変換する

Either というのは Java の標準にはないクラスなのですが、メソッドから型安全な二つの値を返したいときに使えるクラス(の考え方)で、なかなか便利です。
以下のサイトにわかりやすく解説されています。(というかページ全体の内容がこのセッションとかぶり気味です……)

それから、

5. static な unchecked() メソッドを用いる

ラムダ式を unchecked() というメソッドでラップするという方法です。
unchecked() もやはり Java の標準にはありません。

その実装は以下の通り。

f:id:appresso:20151029182444j:plain ▲unchecked()

f:id:appresso:20151029182434j:plain ▲ExceptionalFunction

つまり、例外を投げる関数を、例外を投げない関数に変換するということです。

これを見たときには「ああ……」と嘆息してしまいました。笑*5

関数型インタフェースの種類ごとに「例外を投げるバージョン」を定義するのがちょっとめんどくさいですが、ほぼ単純作業ですし、一度定義してしまえば簡単です。
導入を検討する価値は十分あると思います。

その先へ

そしてこれらのテクニックを組み合わせたさらに進んだ方法が提案された……のですが、ついていけませんでした。

もちろん私の理解力/英語力の問題もあるのですが、あんまり難しいものだとチーム全体で使うには厳しい、ということもあります。
個人的には、まずは Either 単体か unchecked() 単体ならチームへの導入を検討してみてもいいかな、と思っています。*6

スライドとコードが公開されているので、興味のある方はぜひどうぞ。

Oracle Appreciation Event

今日もがんばりました。

最終日前日は、例年 Bay Bridge の途中にある Treasure Island という島に行って、イベントが行われます。

f:id:appresso:20151029182900j:plain ▲シャトルバスに並びます並びます。乗車時間は 30 分くらい。

f:id:appresso:20151029182958j:plain ▲ついたー!

飲み物と食べ物が提供され、観覧車やらゲームコーナーやらがあります。
エンタープライズとは何なのか考えさせられます。

f:id:appresso:20151029191204j:plain ▲観覧車

f:id:appresso:20151029183311j:plain ▲食べ物に 20 分くらい並んだので必死すぎて写真撮るの忘れました……。エンタープライズとは何なのか考えさせられます。仕方ないので写真は何となく遠景。

そして待つこと 2 時間弱。(地味に長い……)*7

f:id:appresso:20151029183548j:plain ▲鈴なり!

Elton John が登場します!*8

f:id:appresso:20151029184105j:plain ▲写真に気を使ってられなくて盛大にブレてますが左側の赤いピアノのところに座っているのが Elton John です。近い。

f:id:appresso:20151029184153j:plain ▲こちらはスクリーンの映像ですがアップで! 手が神っぽい!

名場面その 10 : 人生にとって大事なことは

端的に言って最高でした

本当に最高で、というのは私は結構音楽が好きでフジロックとかにも行って外タレも色々見ているのですがその中でもトップ 3……いや 5……少なくとも記憶の限りではトップ 3 *9 と言ってよいくらい最高で、うっかり「人生にとって大事なことは Java とかそういうことではないのでは……?」という思考に至りましたがホテルに帰ってきたら治ったのでご安心ください。

Elton John は最高でした。*10

そして Beck も見たかったのですが最後までいたら倒れそうだったので(眠くてフラッとする瞬間がありました……Elton John が始まるまでは)、大事を取ってホテルに戻りました。

明日は最終日!

明日はいよいよ最終日です。

登壇者の面々を含む日本人参加者の多くが参加するという噂の蟹パーティーにも滑り込みで申し込みができました。
なんだかんだでいまだにこっちで日本語を発していない*11ことがいい加減気にかかっていたので、とても楽しみです!

(追記)記事を上げました!

appresso.hatenablog.com

*1:伝聞なのでちょっと違うかもしれません。違ったら訂正してください>アプレッソの人

*2:あーたとえば JavaFX が Web に対応するとか……

*3:初日の Scala のセッションもここでした。なぜコードがたくさん出てくると目されるセッションをここでやるのか……!

*4:その関数型インタフェースの唯一のインスタンスメソッド

*5:まあ、……たしかに。たしかにたしかに。でも、やろうとしなかった!

*6:もちろん、両方個別に導入したら誰かが自然と組み合わせて使い始める、というシナリオもありえますが。そういうときはその人が勉強会やら開いてくれると嬉しいですね。

*7:本来は交流の時間なのでしょうが、電波が通じなくて誰にも連絡が取れず、知らない外国人に拙い英語で話しかける勇気も持たず、一人彷徨っていました

*8:正確にはまず Oracle の人が紹介に出てきたのですが Elton John が待ち遠しすぎてよく覚えていません

*9:潔くない

*10:Elton John の歌声、ピアノ、スターらしい振る舞いはもちろん、ドラムの Nigel Olsson のもったりした、重みのあるビートもすばらしかった……

*11:正確にはさきほど独り言で初めて発しました