エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

JJUG CCC 2023 Spring 参加レポート

経緯

いつも参加しているので、もう定例行事みたいなものになっているので、見かけたら取り合えす参加。
いつものことだけど、新しい視点を手に入れられないかという気持ちで参加した。

また、今回は久々のオフラインのイベントだったので、空気感を味わってみたくて現地に足を運んだ。
自分は、午前中だけ現地に行って、午後は自宅に帰宅してyoutubeで見てた。
水星の魔女を早く見たかったのと、推し活のために帰った。

公式サイト

JJUG CCC 2023 Spring - 日本Javaユーザーグループ/Japan Java User Group | Doorkeeper

JJUG CCC 2023 Spring(会場開催)|EventRegist(イベントレジスト)

参加したセッション

  • 金融系子会社でレガシーシステムしか作ったことないけど、モダン開発に挑戦してみた
  • Apach Commons Mathを使って機械学習
  • GraalVMでのFlight Recorderを使ったパフォーマンス解析
  • SpringBootでメッセージキュー&非同期処理を使ったノウハウ紹介
  • AI を利用した Java 開発の最新情報
  • Virtual Threads - 導入の背景と、効果的な使い方 -

まとめも

金融系子会社でレガシーシステムしか作ったことないけど、モダン開発に挑戦してみた

独自FWで開発 リファクタリングもあまりしなかったため、技術的に置き去りになる現場になっていた 開発者の能力向上に寄与できない現場だった

顧客承認が必要で、不要な変更を避けがち 結果、技術的な遅れ、開発者の向上心の阻害していた

取り込み内容

  • 技術調査から着手
    • モデリング
      • 複数人で実施して、お互いにレビュー
      • UMLの理解がモデリングで役に立った
    • Springへの理解
      • 徹底入門で勉強
      • 公式ドキュメント
    • DDD
      • 著書で勉強
      • エリックエバンスのやつは、最後に読んだ
    • RestfulAPI
      • 勉強しながら作って検証
      • 実践して知識を知見にかえるようにした
      • シンプルなものから開始
      • スプリント回して機能を追加していった
  • 大事なこと
    • 知識の習得と実践はセットで実施
    • 考え方を変えるのが辛かった
      • 手続型⇨DDD
  • 文化の壁
    • 学ぶ文化の醸成
      • 公式ドキュメント
      • 資格取得
    • チャレンジャー
      • 専任化
  • 文化の変更
    • 1年サイクルでは難しい
    • マイクロサービスが銀の弾丸ではない

チーム構成

  • 20代後半
  • マネージャー層1名

プロジェクトの開始は、上層部が感じてた危機感

  • アラートをあげ続けて上層部が動くように働きかけていた
  • 2025年問題?
    • 社会構造の変化によるインパクトがいろんなところに出るよって問題らしい
    • 特に保険業界は、年齢別比率の変化の影響がエグそう

進め方

感想

自分もレガシーシステムの入れ替えの現場に参加中
きっかけは、上層部のセキュリティリスクを考慮から始まった。
一番苦労してるのは、現行の機能を落とさずに移行すること。
機能が古すぎて、ツールによる以降ができないのが、むちゃくちゃ大変。。。

テストで担保しようとしているけど、かなり厳しい。
また、現行の理不尽ロジックで泣かされそう。。。

進捗管理等のマネジメントもしてるけど、メンバーの習熟度がすごく気になってる。
次期のシステム構成とかの構成図がなかったから、自分でなんちゃってUMLを作って展開資料作ったけど、理解しているのかすごく不安になる実装だったりドキュメントが多いのが気になる。。。
おそらく、共通認識を確立して進めないと、結構問題になるような気がするってのを、聞いてて感じた。

銀の弾丸を、シルバーヴァレットって読んでたのがカッコよかった。
中二病の琴線に触れた。
遊戯王VRAINSリボルバーが使ってるカードにありそう。
今度から、俺も銀の弾丸って言うときは、シルヴァーヴァレットって言おう。

Apach Commons Mathを使って機械学習

やってみた感想

  • コード量はpythonと比べて多い
  • 可読性はそこまで悪くない

Javaで数学

  • Apatch
    • Math
    • Numbers
    • Geometry
  • DeepLearning4J
  • MOA
  • Weka

Apatch Common Math

  • 行列演算、確率・統計機能もある
  • クラスタリング
  • 数理最適化
  • 最終更新が2016で終わっていて、メンテされてなさそう。。。

アヤメの分類

  • 機械学習の入門みたいなやつ
  • recordの使い方は、こういう時に使う?
  • pythonJavaを比べるとなると、性能差になる

登壇者がやってみての感想と質疑応答の内容

  • FWによる影響でコード量が変わる
  • pythonの方がお手軽
  • 簡素なものであれば、Javaでもいけるけど、業務に近くなるとキツイかも
  • Javaの散布図:JFDChart

感想

Javaにも図の描画ライブラリなんてあったんだな。。。
初めて知った。
たぶん、自分がやるなら、エクセルとかつかってやりそう。
もしくは、画面表示周りは、npmライブラリ使って、描画は他に任せる気がする。
悪用すれば、図形で絵がかけそう。
ソースをチラ見していたが、recordクラスは、入れ物として使っていたのを見て、やっぱりそう使うよねって思った。

GraalVMでのFlight Recorderを使ったパフォーマンス解析

GCのパフォーマンス

解放されないオブジェクトを追加して検証

  • Native化したものは、ヒープの使用状況が見れなかった
    • 見えない理由:GraalVMのイベント出力が対応されてないため
    • 大替手段:GClogで代用可能

ロックに関する分析

  • マルチスレッドで、排他制御を実施
  • ロック時間を長めで検証

  • Native化

    • すべて同等の出力で検証可能

IOパフォーマンス

  • GraalVMだと出力が未実装

コード実行パフォーマンス

  • バブルソートの処理時間が長めになる実装で検証

  • native化

    • 情報が出力されない
    • 原因:executionSampleが出力されてないから
    • 実装済みにはなっている。
    • 最新環境だと、レポートは出たが、出力内容がJavaと異なっている
      • 何かしらの不具合がありそう

チューニング手法

いま時点だと、Javaでチューニングしてからnative化になりそう
イベントの出力対象が今後増えれば、Javaの解析手法がそのまま使えるということが分かった

感想

GraalVMは、知っていたけど、ログの出力に差があるのは、初めて知った。
言っていた通り、native化する前で再現させて、パフォーマンスチューニングさせるのが正解だろうなとは思う。
使うには、もう少し時間を置いてからかもしれない。

SpringBootでメッセージキュー&非同期処理

アーキテクトの働き - 開発の維持 - 構造的な問題解決 - システムの安定稼働

非同期導入の背景

  • メッセージキューを用いた非同期処理の話

メッセージキューのメリット

  • 好きなタイミングで処理できる
  • デプロイをタイミングを分けられる
  • 疎結合になる
  • メッセージキューの仕組みが高い品質で保たれている必要がある
  • 考えることが増える
    • エラー処理
    • 再実行
  • スケールしやすい
  • 導入のハードルを下げて、実装難易度を下げる必要がある

非同期処理

  • 指針の説明は、既存の設計方針から似通ったものを流用
  • ネーミングも現行にある設計しそうから流用

SpringBoot+Amazon SQS

Amazon SQS:Amazon SimpleQueueService

ポーリングの仕組みの選択肢
  • AWS Lambdaを利用
  • Spring Cloud AWS
Spring Cloud AWSについて
  • プール数があるので、状況に応じて設定する

プロジェクト構成

  • WebAPIのレイヤー構成は揃えた
    • Controller
    • Service

ノウハウ

  • 扱いやすさの代償
    • 一部システムで非同期を無視した実装ができてしまった
      • 呼び出す側は、APIを叩くだけなので、非同期という認識が薄くなった
      • 実装の簡略化はできたが、設計不備ができやすい状況になってしまった
  • 監視・スケール
    • メッセージキューの状況がパフォーマンス状況になる
    • メッセージキューの状態は監視する必要がある
    • 水平スケールをやることで処理遅延の解消ができる
  • 段階リリース

    • 疎結合になっているので、段階リリースができた
      • キューの動作確認
      • キュー以外の機能確認
      • バッチ処理でもできるけど、テスト内容だったり、環境準備がより少なくていい
      • 問題の早期発見にもつながった
  • 処理状況の確認

    • 現在鋭利対応中
    • ステータスの管理テーブルだけ作る構成をしている

感想

キューイングは、そんなに難しいものではないと思うが、開発者のレベルがバラバラなのだろうか?
抽象化とUMLによるしつこいくらいの説明でなんとかなりそうな気もするが、外野と当事者とは違うから、問題の見え方が違う気がした。
キューイングは、キューを見れば状況が分かるのがいいところだと思った。
監視対象があきらかになっているので、状況分析はやりやすそうだと感じた。
疎結合にしたことで、段階リリースが可能だったというのは、勉強になった。
疎結合のメリットはいろいろあるけど、リリースのメリットは、初めて理解できた気がする。

AI を利用した Java 開発の最新情報

デモで色々見せてくれたので、感想だけ書く。

やっぱり、指示の仕方が良くないと、結果が想定と違うみたいだな。

github copilotは、使ってもいいとは思うが、まだ業務で使うのは怖いな。。。 github copilot chatは、使っても良さそうだが、やっぱり情報漏洩等のセキュリティリスクが問題になってきそう。

問い合わせ部分は、AIチャット導入は進みそうだな。 少なくとも、いくつかのサイトでは、もう導入されてそうなUIだったりしている。

Virtual Threads - 導入の背景と、効果的な使い方 -

virtual thread

  • JVMが管理する軽量スレッド
  • スループットの向上が目的
    • IOが多いシステムで効果的
    • 応答時間はちょっと悪化
  • 使い方は従来のスレッドと同じ

Threadの問題点

  • 例外処理が難しい
  • デバックしにくい

  • threadの問題点を解決するためのvirtual Thread

  • Virtual Threadの生成:Executors#newVirualThread
    • 直生成もできるが、やらない方が無難

VirtualThreadの注意点

  1. synchronizedはなるべく使わない
    1. synchronized=モニタロック
    2. ボトルネックになる可能性大
    3. イミュータブルのクラスを活用し、状態の変更をを止める
    4. Callableを使う
    5. ReentrantLockを使えないか検討する
  2. ThreadLocalを使わない
    1. ミュータブル、ライフタイムが不明確
      1. ボトルネックになる可能性大
    2. FWの対応を待つ
  3. スレッドを使い回さない
    1. 使い捨て
    2. スレッドプールは、ExecutorServiceに任せる

おすすめの本

Java並行処理プログラミングを勧めていた

みつけた感想やまとめブログ

JJUG CCC 2023 Spring 個人メモ - Qiita

JJUG CCC 2023 Spring ( #jjug_ccc ) - セッション資料の一覧 - 地平線に行く