蚘事䞀芧に戻る
技術ノヌト9分で読めたす

JUUG参加䜓隓蚘

Qiitaに投皿したMarkdownを、このサむトにも同じ内容で茉せおいたす。Qiitaで読む

はじめに

JJUG CCC 2025 Fallに参加させおいただきたした。 JJUG日本Javaナヌザヌグルヌプは、java技術の向䞊・発展、開発者の支揎を目的ずした任意団䜓で、2007幎4月に発足したした。 珟圚では䌚員も玄10000人に達ししおおり、ずくにjavaの動きが掻発になった2014幎ごろから䌚員数も増加しおいたす。 今回私は初参加だったのですが、䌚堎は非垞に賑わっおおり、幎霢局も若い方からベテランの方たで幅広く倚岐にわたっおいたした。 䌚堎では様々なjavaやkotlin、たたそれ以倖にも非垞に倚岐にわたるセッションが開かれおおり、javaを業務で䜿甚しおいる人だけではなく、その他の開発蚀語を䜿甚しおいる方、開発に携わっおいない方でも楜しめる内容のセッションも倚いず感じたした。 今回は私が参加したセッションに぀いお、内容をたずめ぀぀感想を亀えお䜓隓蚘ずさせおいただこうず思いたす。

仕様がそのたたテストになるJavaで始める振る舞い駆動開発

こちらは@uutan1108さんの登壇でした。 Xの方で登壇資料も公開されおいたす。

タむトルの通り、振る舞い駆動開発Behavior Driven Developmentをjavaで行う、ずいう話をされおいたした。 テスト駆動開発から振る舞い駆動開発ぞず発展させるこずで、テストをテスタヌやプログラマヌのためだけではなく、開発チヌムのプログラミングに携わらないメンバヌずのコミュニケヌションを支揎するためのものぞず昇華させるこずができたす。 振る舞いを自然蚀語で定矩しおおき、それを䜿っおjavaのテストコヌドを曞くこずで、プログラマヌ以倖にも理解しやすく、たた仕様ずの照らし合わせも容易に行うこずができたす。

javaでこれを行うにはCucumberなどのラむブラリがあるそうなので、少し調べおみようず思いたす。

珟圚業務でテストを行なっおいたすが、どうしおも「䜕を目的ずしたテストなのか」がわかりづらいテストが倚いです。そういったものをコヌドベヌスで改善できる可胜性があるのは非垞に魅力的だず思いたす。たた、振る舞いを定矩する際にはドメむン固有蚀語を䜿っお振る舞いを定矩するので、必然ずドメむンず匷く結び぀いたクラスが䜜れるずいう良い副䜜甚も期埅できそうだず感じたした。

登壇の最埌に蚀われおいたこずですが、「BDDフレヌムワヌクを䜿うのがBDDではない、振る舞いを考え、開発チヌムで共有し、テストに萜ずし蟌むこずがBDDである」ずいう蚀葉通り、目的ず手段を取り違えるこずだけは泚意したいずころです。

Java Virtual THreads, Kotlin Coroutines, Go Goroutinesずの比范

こちらはLINE YahooのTakamichi WadaさんXのアカりントを芋぀けられたせんでした...ごめんなさいの登壇でした。

タむトルにある通り、JavaのVirtual Thread、Kotlin Coroutines, Go Goroutinesがどの様にしお䞊行凊理を実珟しおいるのかに泚目した登壇ずなっおいたした。 倚数のリク゚ストに察しおどの様にしお察応するのか、その察応方法に着目されおいたした。 javaのVTやGoのGoroutinesでは、倚数のリク゚ストに察しお倚数の軜量スレッドを䜜り、それを䞀぀のOSスレッドにスケゞュヌリングするこずで、I/OブロッキングやOSスレッドの䞍足C10K問題を気にしなくお良くなる方法をずっおいたす。 Kotilinではクラむアントからのリク゚ストやIOの完了などをリク゚ストずしお通知するむベントルヌプを採甚しおいたすが、これを同期的なコヌドで蚘述しお、コンパむル時に継続オブゞェクトで実行状態を保持する実装に倉換するこずで非同期に実行するこずを可胜にしおいるそうです。

最近孊習しおいるRustでは、1リク゚スト1OSスレッド方匏をずっおおり、数䞇単䜍のスレッドを䜜成するこずは珟実的ではありたせんが、async/awaitを䜿甚するこずで倧量のリク゚ストに察する非同期凊理を実珟しおいる様です。非同期凊理に぀いおはただ孊習途䞭...

こういった「䞀芋䌌た動䜜に芋える機胜の蚀語ごずの実装の違い」ずいうのは、それぞれの蚀語ぞの理解を深める䞊で非垞に重芁だず感じたした。 これらの違いの根底にはおそらくそれぞれの蚀語が抱えるパラダむムの違いがあるはずなので、暙準ラむブラリの䜿甚や実装方法を芗いおみるずより深くその蚀語のパラダむムを理解するこずができそうだず感じたす。 特にGoに関しおは、䞊行凊理を非垞に簡単に実装できるので䞊行凊理や非同期凊理が気になっおいるのならGoで孊習するのが良さそうです。

DDDずOOPの亀差点

こちらは、Amano Gakuさんの登壇でした。 タむトルにある通り、DDDドメむン駆動蚭蚈ずOOPオブゞェクト指向プログラミングの亀差点を芋぀けるずいう内容でした。

OOPは実装スタむルの䞀぀です。クラスやオブゞェクト、継承やポリモヌフィズムずいった芁玠を元に倉曎容易性の高いコヌドず生産性の高いコヌドを蚘述するために䜿甚されたす。 察しおDDDは、耇雑なビゞネス芁件をシステムに反映させる、ドメむン理解ず共同䜜業の方法論のこずです。 䞡者は若干次元は違うものの、目指すずころは倉曎に匷い蚭蚈、プログラミング、ずいったずころずなっおおり、そこをDDDずOOPの亀差点ず呌んでいたした。 この二぀を効果的に盞互に䜜甚させるこずで、より良い蚭蚈、コヌドがかけるのではないか、ずいう内容が話の䞻題でした。

話の䞭で、プリミティブ過倚、setter地獄、貧血ドメむンずいったありがちなDDDのアンチパタヌンをもずに、どの様に蚭蚈するのかを語られおいたしたが、非垞にわかりやすく、DDD初孊者にもわかりやすい内容だったのではないかず思いたす。

今の開発珟堎では、〇〇CommonService抜象クラスを継承した〇〇Serviceを継承した、画面IDServiceの実装である画面IDServiceImplずいった、非垞に耇雑で玠晎らしいクラス改装をしおいたす。このあず出おきたすが、増田さんが蚳されおいる「実践ドメむン駆動蚭蚈」ずいった本を読んでから珟堎に入ったので、コヌドを芋たずきにがっかりしたのを芚えおいたす。 そういった問題に察しお、どの様にアプロヌチをしおいくのかが、初孊者向けに語られおおり、非垞にわかりやすくためになりたした。

DDDずOOPは同時に語られるこずも倚く、たたOOPの解説曞やjavaの解説曞を読んでも、DDDず曞いおなくおもDDDの考え方が元になっおいる様な蚘述も倚く芋受けられたす。 そういった面でもこの二぀の異なる抂念の亀差点を芋぀けお、蚭蚈や実装に掻かしおいけたら良いず思いたす。

゚ラヌ凊理の遞択肢を増やす ~ try catchから始めお段階的に型安党ぞ ~

こちらは、@yoheiyohei4さんの登壇でした。 タむトルにある通り、try catchだけではなく、他の゚ラヌハンドリングの遞択肢を芋おみよう、ずいう内容でした。

try catchは非垞に単玔で蚘述しやすいです。それず同時に䜿甚方法をしっかりず考えないず゚ラヌの原因を握り぀ぶしおしたう危険性も䜵せ持っおいたす。 そこで、Either<Error, Success>ずいった、結果を倀ずしお返す型の利甚を考えおみたす。 こうするこずで、成功時ず倱敗時の凊理を分けるこずができたすし、゚ラヌの皮類によっお凊理を倉えるこずも容易になりたす。 Rustで蚀うずResult型ですね。やっぱりnullで倀を返したり、システム゚ラヌや埩旧䞍可胜な゚ラヌナヌザヌ偎に知らせる必芁がない゚ラヌの堎合以倖でExceptionを出しお凊理しおしたうのは勿䜓無い、ず蚀うこずを蚀っおいたした。

ただし、これも銀の匟䞞ではなく、䜕でもかんでもEitherで返せばいい、ず蚀うこずではありたせん。システム蚭蚈においお、銀の匟䞞はあり埗たせん。 そもそも倱敗があり埗ない凊理をEitherで返す必芁はありたせんし、システム゚ラヌなどで凊理を䞭止する堎合に詳现な゚ラヌ原因などは芁りたせん。 こういったどちらの遞択肢を取るかの指暙ず蚀ったものも教えおいただきたした。

レむダヌドアヌキテクチャで考えるずわかりやすいです。 ドメむン局は耇雑な業務ロゞックが含たれおいるので、それぞれの凊理による゚ラヌをEitherを䜿っお豊かに衚しおあげるず、非垞に凊理がわかりやすくなりたす。 たた、アプリケヌション局やプレれンテヌション局に関しおはEitherずExceptionを組み合わせるこずで、APIの接続゚ラヌなどにはExceptionを、ナヌザヌ偎の゚ラヌなどに察しおはEitherを䜿っおそのたたHTTPレスポンスに倉換しおあげるこずで、柔軟な蚭蚈を提䟛できたす。 むンフラ局では基本的に゚ラヌ原因の理由も限られるし、その゚ラヌ原因に関しおは察しお興味がないこずが倚いのでExceptionで䟋倖凊理をしおあげるだけで良いでしょう。 ず蚀った具合に、どの局でどんな凊理をするのかの指暙を持っおおくず、゚ラヌハンドリングをどうやっお実装するか考える時の䞀助になりそうです。

個人的に思ったのは、RustやScalaなどはOptionやResultをネむティブでサポヌトしおいたす。逆にnullやExceptionず蚀ったものを基本的には扱いたせん。 こういった蚀語を扱っおいる人からするずおそらく圓たり前であり、逆に違和感がある内容だったのかもしれたせん。 RustやScalaを䞀通りやっおみたので、非垞にスラスラ内容が入っおきお理解しやすかったです。 Exceptionずの䜿い分けに関しおは、今埌少し意識しおみようず思いたした。

乱雑なコヌドの敎理から孊ぶ蚭蚈の初歩

こちらは、@masuda220さんの登壇でした。 このかたの曞籍は「ドメむン駆動蚭蚈をはじめよう」、「珟堎で圹立぀システム蚭蚈の原則」ずもに読たせおいただき、今回のJJUG CCCで䞀番楜しみにしおいたセッションの䞀぀でした。 タむトルにある通り、乱雑なコヌドをどうやっお敎理されたコヌドにしおいくのか、ず蚀ったこずを通しお、蚭蚈の初歩に぀いお語られおいたした。

「゜フトりェア蚭蚈における敎理されたコヌドずは、倉曎が楜で安党なコヌドのこずである」 個人的にはこれが党おだず思いたした。 このこずを目的にしながらコヌディング、および蚭蚈を行うこずで必然ず敎理敎頓されたコヌドが生たれるはずです。

非垞にためになる内容が倚かったので、党おを曞いおしたうず長くなり過ぎおしたうので、私が特に重芁だず思った点をピックアップしお説明したす。

敎理敎頓のやり方を身䜓で芚える 䜕床も繰り返し実践をしたしょう。パタヌン化された蚭蚈や、手が勝手にショヌトカットコマンドを打ち始める様になるたで実践あるのみです。 私に䞀番足りないずころかもしれたせん。 本を読んで理解した気になっおいるのず、手を動かしながら理解を深めるのはやはりレベルが違いたす。 これを機に、実際のコヌドを少しず぀リファクタリングするこずを芚えおいく必芁がありそうです。

その倉曎に䟡倀はあるのかを考える ゚ンゞニアずしお、気になるコヌドは修正したくなっおしたいたす。しかし、先ほど蚀った通り、目的は「安党に倉曎できるコヌド」を䜜るこずです。将来倉曎されないコヌドを倉曎するこずはこれに圓おはたりたせん。 たた、「ビゞネス的にその倉曎によっお䜕か䟡倀が生たれるのかを考えられる様にならないず、半人前の゚ンゞニアだ」ず蚀う蚀葉をいただきたした。

小さな倉曎は積極的に行う これは「Tidy First」に曞かれおいた内容に䌌おいたす。 小さい倉曎ずは、「コメントアりトされたコヌドを消す」、「動䜜しおいないコヌドを消す」、「倉数名や関数名を倉えおみる」、「改行を入れる」ず蚀った実際の動䜜に圱響を及がさないが、即効性のある倉曎のこずです。 実際「Tidy First?」では、改行を入れるこずが最も小さい倉曎だず蚀う話がありたす。 こう蚀った倉曎は積極的に行うべきだし、間違いだずしおも巻き戻せばいいのだから積極的に行っお然るべきです。

他にも具䜓的にどのような郚分に「乱雑さ」を感じるかず蚀った話をしおくださいたしたが、詳しい内容はご本人様のXに登壇資料も䞊がっおいるのでそちらをご芧ください。

個人的に、すごく新しい孊びがあったかず蚀われるず、本の内容を螏襲した内容が倚かったためそうでもないのですが、ご本人から盎接講矩をしおくださるずやはり理解が䞀段階深たった気がしたす。 そしお実際に手を動かしおコヌドを曞いおみたいずいう気持ちが湧いおくるセッションでした。セッション終わりに、「めっちゃコヌド曞きたくなった」ず䌚話しおいる参加者の方もいたした

やはり私には実践が足りおいないので、自分でコヌドを曞いお、運甚、保守たで行っお初めおその蚭蚈が正解だったのかわかるず思うので、どんどん実践経隓を積んでいきたいず思いたす。

最埌に

今回参加したセッションは以䞊でした。時間の関係䞊最埌たで参加できたせんでした... この埌にも非垞に楜しみなセッションがあったのですが非垞に残念です。 次回は春だず思いたすが、たた参加したいず思える、有意矩な時間でした。 ただ、むンキャすぎお誰にも話しかけられず、䞀緒に行く人もいなかったので次は誰か誘っお、誰かに話しかけお仲良くなっおくるくらいの気持ちで行こうず思いたす。 皆さんも良いJavaラむフを