JJUG CCC 2016 Fallに参加してきました #jjug_ccc

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、小澤です。

2016/12/03に開催されたJJUG CCC 2016 Fallに参加してきました。

2016-12-03 13.14.24

JJUG CCCとは

JJUG CCCのイベントサイトによると

JJUG CCCは、例年2回、春と秋に開催する日本最大のJavaコミュニティイベントです。Java関連の技術や事例に関する良質なセッションが行われ、また異なる分野で活躍するJava技術者が一堂に会する場ともなっています。

となっています。

聴講したもの

さて、今回は8トラック+ブース展示ということで非常に多くのセッションが同時並行で開催されていました。
まずは、その中で聴講してきたものをリストアップさせていただきます。

  • Prepare for Java 9: Java 9 に備えよう
  • SpringはどうやってDIしているのか?
  • メンバーのスキルアップ、どうしてる -Java 100本ノックで新加入メンバーを鍛えてみた-
  • どうしようJUnit5
  • JVMのトラブル解決のためにやったこと~メモリー/スレッド
  • Javaでつくる低レイテンシ実装の技巧 〜GCはさだめ、さだめは死。〜
  • バイトコードが君のトモダチになりたがっている
  • なお、現段階でスライドが公開されているものにはリンクを貼っています。 公開され次第適宜リンクは追加してく予定です。
    他のセッションのものも含め各スライドへのリンクはGithubでリストアップされいるようなのでそちらもご参照ください。

    各発表の概要

    詳細な話についてはスライドを参照していただくとして、聴講したものの簡単な概要と感想を書かせていただこうかと思います。

    Prepare for Java 9: Java 9 に備えよう

    こちらはタイトルの通り、Java9の新機能紹介と非互換となる要素の話でした。
    Java9はまだリリース前ということで、発表でも言われていたようにここで記載されている内容は正式なリリースでのものとは異なるかもしれません。

    新機能として大きいものとしてあげられていたのが

  • Project Jigsaw
  • Project Kulla(JShell)
  • の2つでした。

    Project Jigsawは特に注目されているもので、モジュールというものを導入する仕組みになります。
    このモジュールの導入によって、クラスパスに含まれる大量のJar問題の解決やpublic/private/protecedよりもより細かくパッケージに対するアクセスコントロールが行えるようになるとこのことです。
    モジュール対応は標準ライブラリにも適用され、コミュニティの中でもこちらは非常に苦労されているとこのことでした。

    非互換の要素についてもJEPの番号などとともに多数記載されています。
    こちらも詳細は資料の方を参照していだければと思います。

    ほとんど影響を受けないもプロジェクトもあれば対応にかなり苦労する書き方をしているであろうプロジェンクトもありそういった感じなので一度確認してみるといいかと思います。

    SpringはどうやってDIしているのか?

    こちらはサンプルのソースを元に、Springないの実際のソースコードを追っていくという内容でした。
    私自身Springに明るいわけでもないため、概要を書くというは難しいのですが幸いにしてスライドは公開されています。
    自分でも内容を追ってみたいという方はそちらを見ていただけると、Springを始めOSSや巨大なプロジェクトのソースコードを見るに際してどこを足ががりにしていくかのヒントにもなるのではないかと思います。

    また、OSSなどは「使っているが詳細は知らない」という方も多いかと思いますが、ソースを追うことでより細かい仕様の理解やトラブルシューティングなどにも役立ちます。 そういった意味でも一度見ておくといいものと思います。

    メンバーのスキルアップ、どうしてる -Java 100本ノックで新加入メンバーを鍛えてみた-?

    こちらは技術的な内容というよりは、教育やプロジェクトマネジメントに近いものでしょうか。
    Java 100本ノックに関してはどういったものかの説明程度にとどめ、それをJavaの理解を深めるためにどのように活用するのかといった話になっておりました。

    発表で語られていたことは、大事なのは答え合わせよりもきちんとレビューとするということです。
    Pull Requestで回答を投げてもらう形式でやっていたということですが、「なぜそう記述するのか」や「その処理は具体的に何をしているか」などを説明するようなレビューをかなり時間をかけて行ったということでした。 そうすることで、より本質的な部分への理解が深まり、ちゃんと理解してコードを書けるようになるということでした。

    レビューには時間がかかるが、教育には金銭面だけでなく時間も投資しなければならないと言っていたのが印象的でした。
    コードレビューは教育的な側面だけでなく、プロジェクト運営上もどのように行うべきかが度々議論されるものなので、そういった時にも役立つのではないかと思います。

    どうしようJUnit5

    こちらもJava9同様まだ正式版がリリースされる前のものなので、スライドに記載されている内容から大きく変更があるかもしれないとのことでした。

    JUnit5の機能についての解説でしたが、具体的な内容はスライドを参照していただくとして、気にかけておく必要がある点としては

  • JUnit4以前とは互換性がない
  • パッケージが異なるので1つのシステム内で旧バージョンと共存できる
  • の2点でしょうか。
    現段階で正式に取り入れていく必要はないが、将来的には移行してく方がいいということと、互換性はないが既存のテストについて全てを一気に置き換える必要はなく、新しく作るものから利用していくのがいいやり方ということになるでしょう。

    JVMのトラブル解決のためにやったこと~メモリー/スレッド

    Javaそのもののテクニックというよりは、一般的なものも含めてプログラムというものがどのように動いているかから始まるセッションでした。

    スタックやヒープといったメモリの扱いやGCにはどのような手法があるのか、スレッドやプロセスの話などから始まります。
    ある程度その辺りの知識やアセンブラのコードを見たことがある人でなければイメージしづらいものだったかもしれません。

    後半はJavaで利用出来るツールを使って、スレッドのロックやメモリリーク、GCのダンプを見る方法などを紹介していました。
    こちらは、問題が起きて苦労された方も多い話題かと思いますのでテクニック集として役立つ内容なのではないかと思います。

    Javaでつくる低レイテンシ実装の技巧 ~GCはさだめ、さだめは死~

    こちらの内容は、もはやこれはJavaの話なのか?という部分とそれでもJavaを使う愛を感じる内容でした。

    発表中にも説明されていた、システムのパフォーマンスを表すスループットとレイテンシにおいて、数ms(ミリ秒)やns(ナノ秒)の世界でレイテンシを極限までチューニングしていくような内容となっています。
    ネットワークの速度から「光速が遅い」という結論に至るくらいには苦労されているようです。

    プロファイラを使って測定する際はJITによる影響を考慮したりCPU使用率100%担っていないならそもそもちゃんと負荷がかかってないななどから始まり、C/C++のためのプロファイリングであるperfコマンドも利用しています。
    さらにはCPUやそのコアの内部構造にまで至り、CPU内のL1, L2といったキャッシュヒット率などにも触れています。
    一般的なtopコマンドなどではCPU使用率100%となっていても、メモリアクセスが多いと演算部分の遊んでいる状態になっており、パフォーマンスを十分に発揮できていないため、そこまで見れるプロファイリングツールを駆使して最適化を図るということでした。

    後半はGCの話で、JavaのパフォーマンスチューニングはC/C++並みに行えるが、唯一避けられないのがこのGCによる停止ということでした。
    これに関してはG1GCがかなりいいという結論でした。

    バイトコードが君のトモダチになりたがっている

    最後に聴講したセッションとなります。

    実はこのセッションはタイトルからバイトコードを読むような話かと思って聴講しに行ったのですが、そういう話ではありませんでした。

    Java Agentやバイトコード操作用のライブラリを利用してどのように動かす前のプログラムや動いているプログラムの内容を書き換えるかという話でした。
    実際に記述したソースコードを追っての説明でしたのでこの場で内容について記載するのは難しいのですが、一見するとあまり使うことはなさそうな仕組みではあるものの実はライブラリやフレームワークの中で利用している何てことがありそうなものだなと感じました。
    実際Hibernateなどで利用しているとのことです。

    全体的な所感

    今回、なんとなく「久しぶりに行こうかな」くらいのノリで参加してきたのですが、いろいろと楽しめました。
    Javaやその周辺技術の最新事情に触れられたり、コードを書くだけであれば意識することも少ない内部の動きに関する話もあったりと盛りだくさんでした。

    一方でデータ分析周りの話があまりなかったのは少し残念でした。
    スポンサーということもありElastic Searchはありましたが、HadoopやDeepLearning4Jの話などはJavaに関連するので多少はあっても...と思いました。

    また、懇親会で飛び入りLTさせていただた(飛び入りなのでスライドなし)、Java9で使えなくなるアンダースコア1文字のメソッドをHadoopが使っているというはなしですが、HADOOP-11875で話が上がっているようです。