JJUG CCC 2018 Spring レポ

# JJUG CCC 2018 Spring まとめ

## ccc_m1 まだまだこれから！ JUnit5入門
- https://speakerdeck.com/rshindo/jjug-ccc-2018-spring

JUnit5のセットアップから各種アサーションの実行、4(旧バージョン)からの移行方法など、幅広く学びました。JUnit5になってAPIが一新されたことは知っているものの、具体的にどこがどう変わったかはいまいち理解できていなかったので参考になりました。

JUnit5で改善されたところの例は、次のような題材がありました。どれも、JUnit4のときに不便に感じていたことだったため、早速使ってみたいと思います。

- 1つのテストメソッドで複数のアサーションを実行する
    - (4) どれか1つが失敗すると、それ以降のアサーションは実行されない
    - (5) assertAllメソッドを利用すると、それぞれの成功/失敗に関わらずすべてのアサーションが実行される
- 例外発生のテスト
    - (4) (expected=XXXException.class)とクラス名を指定する
        - 例外メッセージをテストしたいときはさらに工夫が必要
    - (5) assertThrowsメソッドを利用する
        - 例外メッセージもテストしやすくなった
- 構造化テスト(テストをグループ分けする方法)
    - (4) public staticな内部クラスを宣言する
    - (5) 内部クラス(public static以外も可)に@Nestedアノテーションをつける

このような利点はあるものの、既存のテスト(JUnit4以前で書いたもの)を置き換えることのメリットはさほど大きくないということも学びました。今後は、新規テストはJUnit5で書きつつ、既存のテストはJUnit Vintageで動かしていくことになりそうです。


## ccc_a2 Kotlin+Spring Bootでサーバー開発
- https://www.slideshare.net/KiyotakaSoranaka/kotlin-spring-boot

2017年のGoogle/IOでAndroid開発の第一言語となったKotlinについて、サーバサイドでの活用方法を学びました。KotlinとSpring Bootと合わせると、かなり効率のよい開発が行なえます。

- Kotlinの便利な構文
    - プロパティ構文
    - companion object
    - 名前付き引数・引数のデフォルト値

ただし、Spring Bootの機能と併用する場合、注意が必要なこともあります。

- (例)Controller用のメソッドの引数でデフォルト値を使う場合
    - @RequestParamアノテーションのdefaultValueを使う
    - Kotlinのデフォルト値を作るとSpring起動時に例外が発生する

IDE(IntelliJ IDEA)の補助機能を使えば、よりKotlinらしいコードが効率よく書けるようになることもわかりました。Kotlinの知識がまだ少ないときでも、少しずつ導入できそうです。

## ccc_m4 収益を支える中規模アプリケーション開発奮闘記

- https://www.slideshare.net/tamrin69/jjugccc2018-app-review-postmortem

SmartNews社の広告サーバ開発にあたって、気をつけていることを、主に「コードレビュー」という観点から解説したセッションです。

SmartNewsのコードレビューでは、プログラムの正しさよりも「プロダクトとしてどうあるべきか」を重視してレビューを行っています。そのため、背景となる資料や論文を読みながらレビューを行っており、プログラムだけを見る場合に比べてかなり時間がかかります。しかし、しっかりと背景まで理解した上でレビューを行うため、プログラムが原因の不具合はめったに起こらないそうです。

コードレビューの指摘事項では、次のような項目が挙げられました。

- 古いJava(SE 6レベル)の知識のまま実装していないか
    - 文字コードの指定方法
    - ファイルの扱い方
- 実行時の効率を意識しているか
    - MapとArrayの使い分け
- 安全なデータ構造を維持しているか
    - @Lombok.Dataでsetterを外部に公開していないか

また、ボトルネックを見つけるための計測方法のコツも学びました。SmartNewsは、ある一定時間(朝7時頃や号外発表時など)にアクセスが急増します。このアクセスに対応するため、一定の間隔でその時点の負荷を計測するではなく、ある一定時間の最大負荷(アクセス数)を計測しているそうです。

レビューの指摘事項の中には、普段無意識で書いているような内容も含まれていました。自分のできる範囲で、少しずつ改善していきたいです。

## ccc_a5 如何に"データが壊れない"管理画面を作るか

- https://www.slideshare.net/ssuser4227af/ss-99108791

ccc_m4に引き続き、SmartNews社の広告サーバについての話を聞きました。このセッションは管理画面周辺とデータ構造の話が中心です。同じプロダクトを題材にした話でも、切り口が異なれば内容も全く異なることに驚きました。

広告サーバ内では、データを「壊さない」ことよりも、巨大なデータを適切に分割し、処理を分担することで一貫性を保つことを重視しています。データを分割するときは、それぞれの機能が解くべき問題を意識します。

- Ad Server(広告の配信) : 大量のデータを効率よく配信する
- Ad Frontend(管理ツール) : データをわかりやすく表示する

機能が増えると、それぞれを接続する部分で変換作業が必要になります。変換作業は不具合が発生しやすく、いわばシステムの「汚れ」とも言える部分です。SmartNewsでは、この「汚れ役」をAd Frontendに担わせることで、他の機能がそれぞれの責務に集中できるように設計されています。

こういった工夫で、SmartNewsの開発はProductivity(拡張性・機動性・安全性などをまとめた概念)を維持しています。

巨大なデータは、ただ分割するだけでなく、それぞれの関係を意識し、全体の複雑性をできる限り低く保ちつつ開発を進めることを心がけたいです。

## ccc_e5 JavaエンジニアのためのDocker入門

- https://speakerdeck.com/sammy7th/javaenziniafalsetamefalsedockerru-men-number-jjug-ccc-number-ccc-e5

Docker未経験から、Spring Bootで構築したWebサーバを配置したコンテナを起動するところまでを大まかに把握するセッションです。Dockerが有名になってからしばらく経つものの、本格的に触る機会を逃していたため、これを機に再入門するつもりで参加しました。

Dockerのクライアントさえインストールしておけば、単純なコマンドでコンテナイメージのダウンロードやコンテナの起動が実現します。コマンドもgitやMavenを触っていればわかりやすいものが多かったです。

- コマンドの例
    - docker pull : 公開されているDockerコンテナイメージをダウンロードする
    - docker run : コンテナを起動する
    - docker build : DockerFile(設定ファイル)を元にコンテナを構築する

一度タイミングを逃してしまったため、この時期に未経験者向けのセッションに参加できたことはとてもありがたかったです。自分だけで始められる内容でもあったので、少しずつ進めていこうと思いました。

## アンカンファレンス Part3(学習・情報収集編)

JJUG CCCでは、セッションを聞く以外にもできることがあります。

- 出展ブースを見る
    - ブースによっては質問・会話もできる
    - ヨーヨーももらえる
- アンカンファレンスに参加する

アンカンファレンスでは、イベント当日に議題を募り、参加者全員で議論を交わします。私は、情報収集やプログラミング教育が議題となる時間に参加しました。

JJUG CCCには、様々な立場からJavaに関わる人たちが参加しています。それぞれの意見が聞けるのがアンカンファレンスのよいところです。プログラミング教育に求めることという議題でも、コードの書き方から基礎となる理論(アルゴリズム)まで、幅広い意見が挙がりました。全員が納得したのが「エラーを見ても折れない心を身に着けてほしい」で、笑いが起こる場面もありました。

懇親会などで自分から話しかけるのが難しい場合は、こういった機会を使ってみると良いかもしれません。


## ccc_a8 DDDとクリーンアーキテクチャでサーバーアプリケーションをつくっている話

- https://www.slideshare.net/JSUXDesign/ddd-99098285/JSUXDesign/ddd-99098285

JJUG CCCに限らず、勉強会の場では、本などでまとまる前の情報が共有されることがあります。このセッションの題材は、今まさに開発中のシステムでした。プロトタイピングに失敗してから、DDDの考え方を用いて再構築するまでの流れ、またその中で効果があったこと、起きている問題など、現場の「ナマ」の情報がほぼそのまま公開されました。

- 効果があったことの例
    - ユビキタス言語を決めるときに、プログラムの命名規則を含める
    - ソースコードレビューの観点を予め決めておく
- 起きている問題の例
    - コーディング規約で定めていないところがバラバラになってしまう
    - ドメインごとに概念を変換する作業(translater)が大量に必要になる

試行錯誤の過程まで知る機会はなかなかありません。知識を得てから、それを開発に活かすまでの過程を知れたことで、ハードルが高いと思っていたDDDが少し身近に感じられるようになりました。