はじめに
JJUG CCC 2017 Fallに参加しました。
前日飲んでたので午後からの参加になりましたが。
その時のメモです。
セッション一覧
DDD × CQRS - コマンドとクエリでORMを使い分けた話
- CQRS・・・書き込み用モデルと読み込み用モデルを分ける
- システムが大きくなると書き込みの制御が複雑化、読み込みは複数テーブル参照…となっていく
- 書き込みと読み込みの要件の違い
- 分離すると処理効率がいい書き方ができてコードがシンプルに
- ORM・・・オブジェクト中心とSQL中心
- オブジェクト中心・・・Hibernateなど
- SQL中心・・・jOOQ、JPQLなど
- HibernateとjOOQは併用できる
- 質問「パフォーマンスは?」 回答「今回は内部システムだったのでそこまで重視しなかった」
劇的改善 CI4時間から5分へ〜私がやった10のこと〜
- CIの時間が長すぎて深夜に1回しか回せない問題
- CIは速いほうがいい(10分以内がよい、遅くとも20分以内)
- CIが長くなると複数人のコミットが混ざったりして問題があった時の原因特定が難しい
- エンジニアもCIが自分のコミットで回っているのをそもそも忘れる
- CIが終わらなくてリリースが遅れる
- ビルドと単体テストでCIを使っていたが特に単体テストが問題点だった
やったこと
- Controller⇛Service⇛Repository⇛RDB…の層をまたぐようなテストを原則しないようにした
- アノテーションの変更:
@SpringBootTest
はビーンが全部登録されてWebサーバーまで立ち上がってしまうので重い、@WebMvcTest
は必要なビーンしか登録されないから速い - Service層はアプリケーション外とのやり取りがないのでシンプルなJUnitテストをやってDIは使わない
- (やらなかった)RepositoryでFilterによるBean選択・・・本番のデグレがこわい、稼働しても車輪の再開発になる
- 負債となったテストの改善: ある程度の規模の開発だとテストが増える、ひとつずつ潰したり、レビューしたり遅かったら潰すなど
- テストの削除: テスト自体は何回も回すことにメリットが有り、保守しにくいテストを残すとデメリットなので削除する決断を
- CI再構築&並列テスト環境構築: CIはそんなに重視してなかったから個人のPCでやっていた ⇛ AWSに移行、金で解決できるものは金で解決した方がいい
- テストサイズの導入: Googleが提唱するテストサイズの導入、テスト実行タイミング JUnit
@Category
、maven-surefire-plugin
のgroupsで実施 - プルリクエストのFeedBack: プルリクエスト単位で速く開発者にフィードバックするようにした プルリク上で行えるものを色々フィードバックできるようにした(CIの充実性の向上)
速くなってフィードバックしやすくなった!
質問:
もっと入り組んだようなシステムもあると思うが今回はちゃんと層が分かれていたからこういう改善ができたということか
回答:
最近作られたプロダクトで、比較的キレイに作られていたので層にちゃんと分かれている。
コード自体がぐちゃぐちゃだったりする場合はまずはコード自体のリファクタが必要となる。
Docker ではじめる Java EE アプリケーション開発
- いちいち開発用PCにプロジェクトごとに環境作って…みたいなのはつらい
- 【Dockerデモ】なかなか上手く行かず
- DockerHubからコンテナのイメージをダウンロードしてインスタンス化することで仮想的なプロセスが上がる仕組み
- JavaEE環境がたった3コマンドでできる
- JavaIDEはDockerフレンドリーなものが無い
Java 8 Stream APIの代わりにEclipse Collectionsを使って開発してみた
Eclipse Collectionsのサンプルがいっぱい紹介されてて、ほえーって見てた
入社してから運用しているサービスの運用改善奮闘記
- 若い女性がターゲットのピクトリンクというアプリの運用、会員1300万人
- 様々なプロジェクトやツールが持っているDBの接続URL⇛DBリプレース時に全プロジェクトファイルを修正
- The Twelve-Factor App Ⅲ.設定: 環境変数に設定値を入れてアプリケーションを参照
-
Spring Cloud Config
: リポジトリから設定を取得してJSONとして返却 - JavaScriptの依存関係の解決: フロントエンドでやりたいことが増えた ⇛ ファイル間での依存関係ができた ⇛ 機能を削除しにくい
-
Require.js
を使おうと思ったが依存JS実行が遅い ⇛webpack
を使用して一つのJSに! ⇛ Node.jsの環境が要る、トランスパイルが必要 - 非エンジニアの人にはNode.jsのインストールは敷居が高い
- UIテストの自動化ではGaugeを使用
-
Gauge
を使用すると日本語でテスト内容が書ける -
Selenium
だとプログラムライクになってしまうが、Gauge
だと非エンジニアでも書けるようになる -
Gauge
のデメリットとしては、現在ベータ版でバージョンアップすると動かなくなることがある、テストが多くなるとステップの定義がごちゃごちゃになりやすい -
Gauge
のプロジェクト構成 (Gauge
⇛Gauge Java
⇛DbUnit
やSelenide
) - 改善はコツコツが大事!
おわりに
いきなり何もかも便利なものを導入するわけにはいかないけど、
少しずつでもコツコツと良い方向に改善していくことが大事だなーと思いました。