JJUG CCC 2018 Fall レポ

# はじめに

2018/12/15（土）JJUG CCC 2018 Fallに参加してきました。

JJUG CCCとは、毎年2回、春と秋に開催する日本最大のJavaコミュニティイベントです。

Java関連の技術や事例に関する良質なセッションが行われ、
また異なる分野で活躍するJava技術者が一堂に会する場ともなっています。

本投稿は、当日のレポート記事です。

＊私は2012年からJavaでWebアプリケーション開発を行ってきましたが、実は今回が初参加です。

# JJUG CCC 2018 Fall まとめ

## ccc_m1 Pivotal認定講師によるSpring Framework 5.1ハンズオン！

＊弊社、カサレアルの技術講師、多田によるセッションです。
　私は、チューターとして、ハンズオン中にお困りごとがあった場合の、
　サポート役として参加させていただきました。

https://www.slideshare.net/masatoshitada7/pivotalspring-framework-51-spring-boot-21-jjugccc

Spring初心者向けのハンズオン形式のセッションです。

二枠分の時間（途中休憩を入れて1時間45分）を使って、
SpringでのWebアプリ開発を体験できるセッションです。

講師よりSpringの簡単な説明が20分ほど行われました。
（Springの概要を図を使って説明しているので、わかりやすいと思います！）

その後ハンズオンの開始です。

ハンズオンに関しては、会場のWi-Fiが非力（54名収容の部屋で同時接続可能数が30！）で、
環境構築に戸惑ってしまう場面が多々ありました。
（ハンズオン用に公開したプロジェクトの構成では、どうしてもインターネットに接続している必要があります。）
環境構築に必要な資材をすべて zip で固めて、当日配布できるようにする、
などの予防策が必要だと感じました。

実際に動くものを、一から自身の手で作り上げていく経験は、とても貴重だと考えます。
（経験の浅い方であれば、本番稼働中のアプリの改修等で、
　一部分にしか触れず、全体を意識する機会は少ないのではないか、と考えています。）

これからSpringを始めようとしている方のきっかけになれば幸いです。

## ccc_a3 IBM CloudとKubernetesでSpring Bootのマイクロサービスを簡単に！

https://speakerdeck.com/taijihagino/java-spring-boot-with-kubernetes-on-ibm-cloud

IBM Cloudを利用するとすぐにKubernetesを利用できるようになり、
マイクロサービスを簡単にDeployできることを学びました。

ライブコーディングによるデモンストレーションを拝見しましたが、
IBM Cloud のアカウント取得後に、

 - WebのダッシュボードからKubernetesクラスターの作成

を行えば、すぐにKubernetesが利用できるようようになります。

アカウント取得にはクレジットカード登録が不要で、
間違った操作で課金される心配も少ないです。

また、通常、コンテナ環境を構築するには課金対象となるようですが、
クラスターが1個であれば無料で使えるとのことなので、
気軽にKubernetes環境を構築することができそうです。

## ccc_g4 今こそStream API入門

https://www.slideshare.net/skrb/stream-api-125945709

Java SE 8 で登場した Stream API ですが、
実際の開発現場では未だ導入が見送られているという話をよく聞きます。
当日もそれを表しているかのように、
210名収容可能な大部屋に立ち見が出るほどの盛況ぶりでした。

Stream APIを使いこなすためには、**習うより慣れろ**、とのことです。

割と経験を積んだ人にこそ当てはまることとして、
　　_仕組みに納得いかないと落ち着かない_
ということがあると思います。

しかし、よくわからないからこそ、実際に手を動かしてみる必要があるのです。

例え話として、

　_タンパク質の熱変性 60度_
　_メイラード反応 155度_

　**→この知識を知っていたら、オムレツをうまく作れますか？**

という問いかけをされましたが、納得感があります。

どんな事でも新しいことは、とにかく難しく感じやすいですが、
まずは、従来の記述を新しい書き方に少しづつ置き換えていくことから取り組み、
徐々に慣れていったほうが、結果的に身に着けることができます。

## ccc_c5 既存アプリケーションでKotlinを導入してみた

https://docs.google.com/presentation/d/1wTm_eSbsM2ihfz27QpSHzuRcCIhcRYKom-Vx_-FfUts/edit#slide=id.g4a45c17187_0_0

JavaユーザがServer Side kotlinを使ってみて、
よかった点と気をつけるべき点について学びました。

よかった点として、

 - Kotlin独自の記法により冗長に感じていたコードの量を減らすことができる
 - 統合開発環境によって既存のJavaのソースコードからKotlinのソースコードへの変換ができる
 - Javaと併用して使える
 - Spring Frameworkが公式にサポートしている

という事があるようです。
新規作成するときでなく、既存アプリケーションでの置き換えでも非常に有効です。

反対に、気をつけるべき点として、

 - Java側がNullを返す時に、Nullableで受ける、もしくは、Java側もOptionalを返す必要がある
 - バージョンアップがJavaよりも激しい印象があり、新しいバージョンへの追従をしっかりと行う必要がある
 - KotlinをJVMで動かしているため、利用するJDKをどれにするかについては、Java同様議論の対象

という事があるようです。

また、**冗長なコードを短くかけるからと言って、それが必ずしも、わかりやすい**、とは限らないそうです。
新しい記法はチームで利用するにも浸透に時間がかかるので、徐々に使っていく工夫が必要です。

## ccc_a6 オイラ大地の18年拡張し続けているECサイトをSpring Bootとk8s on Azureでマイクロサービス化する事例

https://www.slideshare.net/hiroakikobayashi1806/18ecspring-bootk8s-on-azure

既存システムをマイクロサービス化した時に実際に採用した手法などを学びました。

アプリケーションは、24時間稼働し続けます。
また、十数年間進化を続けてきたアプリケーションは、巨大で複雑です。
いっきにマイクロサービス化することは出来ないので、ストラングラーパターンを利用して、
機能の特定部分を徐々に置き換え、レガシシステムを段階的に置き換える手法をとります。

マイクロサービスでは、各サービスが使用する情報は、
そのサービスからだけアクセスされるように、データベースを分割するのが原則です。

しかし、既存のシステムでは、SELECTで複雑なjoin構文を多用し、
多数のドメイン更新を1トランザクションで行なっていることが多いです。

DBの分割はすぐには出来ないと判断した場合は、
アプリケーションの分割だけを先に行う工夫が必要です。

また、クラウドサービスはAzure、アプリケーションはSpring Boot、
コンテナオーケストレーションはkubernetesを採用していますが、

 - Azure開発元のMicrosoftはJavaに対して好意的である
 - SpringもAzureのサポートを行なっている
 - Azure Kubernetes Service (AKS)というKubernetes環境の管理サービスがある

という背景があり、有力候補の一つと言えます。

## ccc_a7 GCを発生させないJVMとコーディングスタイル

https://www.slideshare.net/kenjikazumura/gcjvm

GCは時には、アプリケーションの実行を止めてしまう事もありやっかいなものですが、
いざチューニングをしようにも、同じソースコードでも、
JVMの種類やインライン状況によっては、GCが発生したり、しなかったりするので、
最適解を見つけ出すのは困難です。

しかし、GCは日々進化を続けています。
GCの発生を抑えるために本来の目的とかけ離れた実装は好ましくありません。
まずは、見やすいコードを書くことを心がけましょう。

# まとめ

Kotlinによるサーバサイド開発や、マイクロサービスの波が、
ますます強くなっていると感じました。

新規開発でなく、既存のアプリケーションで、
Kotlinを取り入れる、マイクロサービス化している、
という事には、驚きました。

しかし、メリットがあることも十分理解できました。

アプリケーションのライフサイクルとの兼ね合いでは有力な選択の一つなのだと感じました。

弊社のラーニングサービスにも積極的に取り入れていきたいと思いました。