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

Appresso Engineer Blog

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

JavaOne 2015 3 日目 - Java 言語の設計者たちはチェック例外をどう考えているのか

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

JavaOne もじつに 3 日目のレポートです!

なお 2 日目の記事はこちら。 appresso.hatenablog.com

3 日目にしてようやく、自分がメインストリームを外したチョイスをしがちなことに気づきつつあります。

Twitter では #j1jp というタグで日本人参加者が様子をつぶやいているのですが、かぶることが滅多にありません!

まあ、どのセッションに出てもそのセッションなりの雰囲気は感じられるし、他の人が出ていないセッションの方が希少価値は高いかも……と、ポジティブに考えることにします。

さて、今日は以下の 6 セッションに参加……する予定でしたが諸事情により実績は 5 セッションです。
詳細は本文にて。

  • Developing Applications with Eclipse Mars
  • Effective and Clean Java Code? Tips and Tricks from the Real World
  • Agile Project Management Antipatterns
  • Ask the Architects
  • Are Profilers Telling the Truth? How Do They Actually Work?
  • Let’s Visualize Log Files for Troubleshooting Java Applications

例によって長いので、時間のない方は興味のあるところだけでも読んでいただけると幸いです!

Developing Applications with Eclipse Mars

Eclipse Foundation の Wayne Beaton さんおよび Tasktop 社の Gunnar Wagenknecht さんによる、Eclipse の最近のトレンドを紹介するセッション。

f:id:appresso:20151028164113j:plain ▲会場はこんな感じです。このセッションは割とすいてます

ふだんは DataSpider ServistaEclipse で開発しているのですが、EGitの辛さ(というか、EGit は便利なのですが、EGit が依存する git 実装の JGit が!)もあって IntelliJ IDEA に乗り換えたい……などと思う今日この頃。とはいえ、当面は Eclipse を使うと思うので、「Eclipse 多機能っぽいけど使いこなせてない機能も色々あるんだろうなー」と思って取りました。

Eclipse Mars の新機能

まず、「EclipseJavaIDE だと思われているけど、実際のところ組み合わせ可能なコンポーネントの集まりなんだよ」という話をします。
会場のアンケート(挙手)でも C++ で使っているという人が結構(5 ~ 10% くらい?)いたのには驚きました。

そのあとの内容は、Eclipse の最新版である Mars の新機能をダイジェストで紹介していくものでした。

等々。
特にインストーラは一つの目玉だったようで、デモも行われました。
そもそも、ここのところ業務にかまけて Mars が出ているのに気づいていなかったので、日本に帰ったら早速 Mars を入れてみようと思います。

便利な既存機能

他にも、いずれも既存機能だと思いますが以下のような機能の紹介がありました。

  • タスク指向 UI
  • 賢いコンテントアシスト
  • Maven との統合
  • Git との統合

「タスク指向 UI」というのは検索してみると、ああ、Mylyn のことのようで(今までは画面が出ても自動的に×ボタンで消してました……)、多数のソースコードを開きすぎてもともと何をしようとしていたのか忘れる、みたいな問題を解決するためのものとのことです。
たしかにそういう場面は結構あるので、時間を作って一度試してみたいと思います。

また、「賢いコンテントアシスト」の例として、

  1. new JFrame()すると、('a' から始まる addComponent() とかではなく)getContentPane() が提案される
  2. それから addComponent() が提案される

……というように、よく使われるものが提案されるんだよ、というデモが行われました。

Eclipse の設定の [Java] -> [Editor] -> [Content Assist] -> [Advanced] で色々挙動を変更できるようなので、こちらも一度試してみたいところです。

Java 9 のサポート

最後に次期バージョン Neon(2016 年 6 月リリース予定)の話があって、Java 9 のサポートに向けて開発中とのことです。
すでに Mars でも動くベータ版が出ています。

Effective and Clean Java Code? Tips and Tricks from the Real World

スピーカーは Java Champion の Edson Yanaga、内容は「世の中には Effective Java とか Clean Code とかのすぐれた本があるわけだけど、現実のプロジェクトでどうしたらわからないことってあるよね? どうやったらいいか考えよう!」ということで楽しみにしていたセッション!
……だったのですが、開始時刻ギリギリに行ったところ入れませんでした。(ガーン)

人気セッションなのでもちろん登録はしていたのですが、JavaOne では開始 10 分前になるとキャンセル待ちの人を入れてしまうのです!
(知ってはいたのですが忘れていました……)

  • 教訓その 6 : (とくに人気が予想されるセッションでは)必ず開始 10 分前までに会場に入りましょう。呑気に JavaOne 弁当食べてる場合じゃありません。

f:id:appresso:20151028164941j:plain ▲こいつが悪い(悪くない)

Books Inc.

次のセッションまでうっかり 2 時間もあいてしまったので、本屋でも行くかシリーズということで Books Inc. に行きました。

f:id:appresso:20151028164951j:plain ▲Books Inc.

日本でいうと神楽坂のかもめブックスあたりに似ている、カフェ併設の新刊書店です。*1
サンフランシスコでは(というかたぶんアメリカ全体で)飲食店の雰囲気が日本とはちょっと違っていて、それに比べると本屋は同じだな、と感じて、なんだかほっとしました。

雑誌がいっぱいあって、「スポーツ」とか「料理」とか「店員のおすすめ」とかのコーナーがあって、ポストカードとか文具とかも置いててかわいい本屋でした。

閑話休題

Agile Project Management Antipatterns

私はアジャイルとかそういう、効率よく、楽しく開発する話が大好き、というか、効率よく、楽しく開発したいと常々思っている人間なので、結構楽しみにしていたセッションです。
スピーカーは Mrowca Katarzyna さん。(読めない……)

名場面その 7「スライドは公開される?」

開始を待っていたところ隣に座った人に「スライドが公開されるか知ってますか?」と聞かれて、まだ始まってもいないのにそんなこと知らないし、よりによってこのタイトルのセッションでスライドが公開されるかどうか気にするのがアンチパターンっぽくて面白いなとこっそり思っていました。*2

症状ではなく根本原因にフォーカスする

内容は思ったよりも初歩的で、以下のような流れでした。

  • Agile Manifesto を一つずつおさらい
  • アンチパターンを一つずつ見ていく
    • プロジェクトマネジメント + アジャイル = 「アジャイルプロジェクトマネジメント」?
    • 開発とテストだけを繰り返し、出荷は一度だけ行う「イテレーション」?
    • バックログがひたすら膨大になって、あるいは「ほぼ完了」の項目がどんどん積みあがって、溢れかえる
    • (等々)

思ったよりも初歩的……と言いつつ、あとあとよく考えたら、この手の話にいまさら目新しいトピックもないのだろうなと思います。

一つも漏らさず全部「とっくに知っている」ことで、でも現実にうまくやれていないことは数多くある、という現状をどうやって変えていくかが問題だな、ということを考えます。

たとえば方法の一つとして、最後のほうでまとめとしてあげられていた「症状ではなく根本原因にフォーカスする」というのをいつでも繰り返し心に刻む、というのは有効かな、とも思いました。
ついつい症状に注目しがちです。だって、目の前にあるのは症状なので。

余談ですが、ネイティブじゃないからか英語がとても聞き取りやすかったです。
意識してきちんと発音しているのだろうし、スピードもネイティブに比べると遅いのだと思います。

あと、Excel Driven Management は欧米人を中心とする JavaOne people にもばかうけでした。

f:id:appresso:20151028164204j:plain ▲EDM

f:id:appresso:20151028164211j:plain ▲まとめると EDM is EVIL

Ask the Architects

Brian Goetz、Mark Reinhold という有名人を含む Oracle の 4 名によるセッション。

f:id:appresso:20151028164558j:plain ▲錚々たるメンバー

表題の通り、彼らがひたすら参加者(と Twitter)からの質問に答えていく形式で、話題も多岐にわたりました。

コンストラクタ、ダックタイピング、関数プログラミング、Stream API と Reactive Framework、Project Valhalla 導入後のプリミティブ型の stream、unsigned 型がない理由、……等々。

f:id:appresso:20151028172849j:plain ▲左から Mark Reinhold、Brian Goetz、John Rose、Alex Buckley

正直なところ、参加者も登壇者も早口で話すので議論の内容をきちんと聞き取れたものはほとんどなかったのですが、その場にいると、どのようなことを参加者/登壇者たちが考えているのかは何となく伝わってきて、(内容がちゃんと理解できない、にもかかわらず!)刺激的な 1 時間でした。

名場面その 8 : Getting rid of checked Exception

面白かったものを一つだけ取り上げると、「チェック例外は……なくした方がいいのでは?」という質問で、対話の端々で爆笑が生まれていました。


Mark「よろしい、よろしい。すばらしい。アンケートを取りましょう。チェック例外をなくしたいと思う人は?」

(手が上がる。案外少なくて、2 割くらい? だったと思います)

Mark「チェック例外最高! このままでいいよ、という人は?」

(わずかながら手が上がる)

Mark 以外の誰か*3「チェック例外は、まあ……悪くないよ、妥協点としては、という人は?」

(一番多く手が上がる。「なくしたい」のときにちょっと迷いましたが、私もここで上げました)


あとの流れとしては、おおむね妥協点としてまずまずだよね、というところに落ち着いていったと思います。
「チェック例外、……まあそんなものだよね。チェック例外の是非みたいなことにこだわってる時間があればもっと別のことに人生の貴重な時間を使った方がいい」みたいな発言もあって、やはり爆笑を呼んでいました。

私自身、チェック例外には「失望していた」時期があって、というのは以前 C++ をメインに使っていて、野放図に発生する例外にうんざりしていたこともあり期待が大きかったから(期待してたのに、中途半端だし、めんどくさい!)なのですが、Java を 2 年くらい使ってきて、最近は「結構めんどくさいところも多いけど、コンパイル時にチェックされるドキュメンテーションとしては役に立つこともあるよね」くらいに態度が軟化しています。

ただ、ラムダ式との組み合わせの相性の悪さだけは……何とかしてほしいですね。

安全港宣言

完全に余談ですが、最初に「スライドはタイトルの 1 枚しかないよ。ひたすら質問に答えるからね!」みたいなことを言っていたのですが、Twitter で "Safe Harbor Statement は?" と突っ込まれたからかあとから適当に追加していて、ウケていました。

f:id:appresso:20151028164804j:plain ▲雑な Safe Harbor Statement(その場でコピペした)

Are Profilers Telling the Truth? How Do They Actually Work?

Yale 大学の Fabian Lange さんによるセッション。

表題の通り、プロファイラの仕組みを解き明かしながら、その出力を疑っていく内容で、昨日の XRebel のセッションとも共通するところがたくさんありました。

もともとそんなに詳しい領域ではないので、かぶる部分があっても、おさらいになってむしろちょうどよかったです。

f:id:appresso:20151028181409j:plain ▲プロファイラのシェアは VisualVM がダントツ

(プロファイラの実装に使われる)「JVMTI(JVM Tool Interface)は Java において最高のものだ」と言っていたのが印象的でした。
たしかに、そうだなと思います。私の知る限りでは、これほどまで詳細にプログラムの動作状況を外部から取得できる言語/プラットフォームはありません。(知らないだけで、.NET とかはもしかしたら近いのかもしれませんが……)

話題はやはりサンプリングとインストゥルメンテーション(トレース)の特徴におよび、それぞれの問題点がデモによって示されました。

サンプリングの問題点 : honest profiler is honest

サンプリングの例として、hprof を使います。対象となるプログラムは、定番の、素数を探すもの(PrimeFinder クラス)です。

結果は以下の通り。

  • Java 6 では ArrayList.add() に CPU 時間の 80% がかかった(素数を探しているのに、そんなはずがない!)
  • Java 7 では AbstractStringBuilder.<init> に CPU 時間の 70% がかかった(そんなはずもない!)
  • Java 8 では AbstractStringBuilder.<init> に CPU 時間の 45% がかかり、PrimeFinder.findPrimes() に 20% がかかった(ようやく素数を探してる感じが出てきたけど……)

なんてこと!
でもこの不可解な結果、プロファイラを使ったことのある人なら見覚えがあるかもしれません。

原因は昨日のセッションでも出てきた safepoints で、やはり honest profiler がいけてるよ、とのことでした。

そして結果は、

  • honest profiler を使った場合、PrimeFinder.findPrimes() に CPU 時間の 90% 強がかかった(これだ!!)

とはいえ honest profiler も完全無欠ではないので、過信はできません。

インストゥルメンテーションの問題点 : int 一つで

インストゥルメンテーションの例としては、多くの処理*4を行うメソッドに、int 型のカウンタを 1 つだけ追加したらどうなるか、というものでした。

で、結果はというとやはり「影響がある」という結果です。(具体的な数値は忘れてしまいましたが、数十パーセントほどの、int 一つの割には驚くべき数値が出ていたと思います)
ここでは言及されませんでしたが、昨日話題に上がっていた「スタックの深さによる偏り」ももちろん問題となります。

問 : プロファイラは真実を述べているか?

答 : 述べていない。なぜなら、そんなことは不可能だから。ハイゼンベルクも述べたように、観測は対象に影響を与えてしまう。*5

対策としては、プロファイラを過信せず、参考にとどめること。ごくわずかな差にとらわれてはいけない。
それから、ベンチマークには JMH を使うこと。*6

早くもスライドが公開されているので、気になる方はぜひ。

speakerdeck.com

Let’s Visualize Log Files for Troubleshooting Java Applications

三日目のラストは、Acroquest Technology の石田浩司さん、および Java Day Tokyo や JJUG CCC でもおなじみの谷本心さん(所属は同じく Acroquest Technology)によるセッション。

日本でもおなじみの*7トラブルシューティングネタです。

「log = 丸太」、突然の漫才など、笑いに貪欲な感じで始まりました。(ウケてました)

f:id:appresso:20151028182118j:plain ▲セッション開始前の様子。B A B Y M E T A L とシンメトリな感じになっていて美しい

名場面その 9「現場で起きてるんだ」

課題は、ホテルの予約サイトのレスポンスが地獄のように遅いこと。

それをはじめはコードリーディングとリファクタリングで解決しようとしていたが、効率が悪すぎた。
そこでログを活用しよう! という流れでした。

この辺で踊る大捜査線の「事件は会議室で起きてるんじゃない! 現場で起きてるんだ!」を英語でキメていましたが欧米人を中心とする JavaOne people には全く反応がなく、なぜ入れたのか不明で逆に面白いみたいになっていました。

ELK スタックで解決!

ここで出てくる ELK スタックという言葉は初めて聞いたのですが、ログ解析ではおなじみの

  • Elasticsearch
  • Logstash
  • Kibana

の組み合わせのことです。

ログを可視化したうえで、たとえば ApacheアクセスログMySQL のログ、といったように複数のログを視覚的に突き合わせ、無事原因を突き止めることができた、という話でした。

f:id:appresso:20151028182216j:plain ▲視覚的に比較するとわかりやすい!

他にもログを定常的に処理し続けるための Log Streaming Hub の仕組みや、商業的な指標を可視化するということも紹介されていました。

アプレッソは現状パッケージビジネスが中心なので、大量のログを日常的に扱うことはないのですが、サービスをやることになったらこれは必須だなと思います。

Null Pointers

JavaOne のメイン会場である Hilton の横の Taylor Street に作られた Duke's Cafe で、19:00 から Duke's Choice Award というイベントが行われていました。

f:id:appresso:20151028183822j:plain ▲ビールの品ぞろえが妙によくてうれしい

そこに Null Pointers というバンドが出て、メンバーの一人は日本から来ている @itohiro73 さんだということもあって、見てみました。

f:id:appresso:20151028183952j:plain ▲Null Pointers!

Null Pointers はエンタープライズらしからぬゆるいグルーヴでブルースの曲(曲名はわからなかった)や The BeatlesLed Zeppelin 等の有名な曲を演奏してくれて、楽しい夜になりました。

最後は JavaJava~ Ja, Ja, Ja, Java~というゆるすぎる歌詞の曲でおしまい。

f:id:appresso:20151028184041j:plain ▲@itohiro73 さんは Optional なのでドラムだけでなくボーカルもするようです

ステージの正面にいたビールを 12 杯くらいテーブルに並べているアホなハッピーな二人組みも大喜びで、アンコールも出ました!

(追記)@itohiro73 さんから教えていただきました!

4 日目につづく

いよいよ後半戦にさしかかってきました。

今なんだかんだこちらの時間で午前 3 時前で、いよいよブログ書き続けるのも勝負の様相を呈しています。

明日はセッションはもちろんですが、Treasure Island でのイベント(Elton John and Beck performs!)も楽しみたいと思います!

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

appresso.hatenablog.com

*1:実は技術書コーナーがあるかなと期待していたのですがありませんでした……かもめブックスにないのと同じように。

*2:コード例がたくさん出るようなプレゼンテーションなら、写真を撮るかどうかにもかかわるので重要ですが、この手の話はスライドとかよりは話をどう理解するかが重要なんじゃないかな……と思ったので

*3:忘れました……

*4:数値を足したり引いたり……。なんだか最適化されてしまいそうですが、このケースでは最適化は行われない、とのことです

*5:余談ですが、スピーカーは猫の例をあげていたので、シュレディンガーとごっちゃにしている気がします。あるいは冗談に冗談を重ねるかたちでごっちゃにしたのかもしれませんが。

*6:実のところ、私は JMH に「観測者効果」が適用されない理由がわかっていません。なぜ? どなたかわかる方いらっしゃれば教えてください。

*7:と言いつつ、いつも人気がありすぎて私は入れたことがないのですが……