JJUG CCC 2026 SpringはJavaエンジニアのためのお祭りですが、実はJavaの知識がなくても楽しめるセッションが盛りだくさんです!
Javaは非常に成熟された言語で、大規模サービスでの活用事例も豊富です。それゆえに設計などの理論については他の言語のみの経験であっても非常に有益な知識になると思っています!
そこで、このブログでは、非Javaエンジニアの方でもきっと楽しめる、Java色が薄めのセッションを時間帯別にピックアップしてみました。ぜひ参考に、自分だけのJJUG CCC 2026 Springを歩いてみてください!
10:00 〜
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 (Room G+H)
- 同値分割・境界値分析・デシジョンテーブルといったテスト技法を、「要件の曖昧さ発見」に使う話。「テストは書くもの」の一歩先、「テストで考えるもの」という視点はどんな言語でも活かせます。
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く (Room I, 10:00-10:20)
- 「DI(依存性の注入)」の「依存性」という訳語はなぜ誤解を生むのか。2000年前後の英語文献をひも解きながら、ソフトウェア用語の成り立ちを探る知的好奇心を刺激するセッションです。
Spring AI × MCP入門 (Room M, 10:00-10:20)
- AIエージェントにツールを公開する際の「境界設計の4原則」——どんな操作を公開するか・descriptionをどう書くか・何を返すか・何を記録するか——は、MCPかCLIかを問わない普遍的な設計観点です。
10:25 〜
Javaで絵文字を正しく扱おう🥲 (Room F, 10:25-10:45)
- 絵文字の歴史・Unicode・サロゲートペアの話。「文字数って何?」という問いはどの言語でも共通の罠。絵文字を扱うすべてのエンジニアに関係します。
スパゲッティコードの次はカッペリーニコード?― AI時代に問われる設計責任 ― (Room M, 10:25-10:45)
- AIが生成した「一見整っているが全体が見えにくいコード」を「カッペリーニコード」と定義し、AI時代の設計責任を問うセッション。Claude CodeやGitHub Copilotを日常的に使っているすべてのエンジニアに刺さる内容です。
11:00 〜
個人AIからチームAIへ:開発における品質と生産性の再設計 (Room A+B)
- AIを個人が使う「個人最適」から、チームで組織知として蓄積する「チーム最適」へどう移行するか。プルリクエストを中心とした品質ゲートの構築やコンテキスト統合の考え方は、言語を問わず参考になります。
イベントストーミングと Kiro Spec で実現する、要件の認識合わせプロセス (Room G+H)
- イベントストーミングで整理した業務プロセスをAIに渡してユーザーストーリーを即時生成し、要件と設計のズレをその場で発見するデモセッション。上流工程での認識合わせに課題を感じている方に。
11:25 〜
- Javaで学ぶSOLID原則 (Room M, 11:25-11:45)
- SOLID原則はオブジェクト指向設計の普遍的な指針であり、Javaはあくまで例示に過ぎません。「なぜSOLIDが大事か」をコードで体感したい方はどの言語ユーザーでもどうぞ。
12:00 〜 12:45(ランチセッション)
- 【ランチ付き】肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 (Room E)
- 10年超のモノリスプロダクトにインターフェース分離と依存逆転を適用した実践事例。「インターフェースをどこに引くか」という問いは、言語を問わずレガシー改善に関わるエンジニア全般に共通です。
13:15 〜
ふつうのFeature Flag実践入門 (Room A+B)
- Feature Flagの目的・設計・ライフサイクルを丁寧に解説。「フラグを増やしたら管理できなくなった」経験があるエンジニアに刺さる内容。フレームワークに依存しない考え方が中心です。
テストコードのないプロジェクトにテストを根付かせる (Room C+D)
- テスト文化のないチームにどうやってテストを浸透させるか、技術面だけでなくチームコミュニケーションの観点から語るセッション。どんな技術スタックでも起きうる普遍的な課題です。
チーム全員で実施できるプロジェクトに集中するためのゴール設定を磨くスキル (Room F, 13:15-13:35)
- SMART・ALIVE・FOCUSといったフレームワークを使って、チームが集中できる目標を作るスキルを扱うセッション。エンジニアリングというよりチームビルディングに興味がある方に。
Computer Programming is Dead; Long Live AI-First Programming (Room I)
- 「従来型のプログラミング教育はもう機能しない、AI-Firstプログラミングの時代だ」という主張を展開する英語セッション。AI時代の開発者の姿を考えさせられる内容です。
13:40 〜
- デプロイを恐れていたSpringチームが、月200回リリースするまで 〜真のリスクは停滞だった〜 (Room M, 13:40-14:00)
- 月200回リリースを実現したチームの文化と仕組みの話。「リリースのリスクは変更そのものではなく停滞にある」という思想の到達プロセスは、どんな技術スタックのチームにも参考になります。
14:15 〜
(仮) チームで活用する! — アプリ開発における「AIエージェントの使い方」の設計と実践例 (Room C+D)
- チームとしてAIエージェントを継続的に活用するための「使い方の設計」に焦点を当てたセッション。個人のAI活用からチームの組織的活用へ移行しようとしている方に。
クレディセゾンの内製開発に見る、技術と対話で価値をつくる面白さ (Room E)
- 事業会社のエンジニアが、実装だけでなくユーザーと対話しながら課題を整理し価値を作る話。内製開発に興味があるエンジニア全般向けです。
15:30 〜
一晩で2000PR。Devinで変わるJavaマイグレーション (Room C+D)
- 自律型AIエンジニア「Devin」を活用し、大規模なコード移行を200人月から50人月に圧縮した実例。「AIを使う」から「AIを設計する」という開発スタイルの変化は、Java以外のコンテキストにも広がりつつあります。
AI時代のソフトウェア設計の学び方 (Room G+H)
- AI時代に必要な「設計感覚」をどう習得するか。「自分で手を動かすことは今も重要か」「設計原則やパターンの知識は今も価値があるか」といった問いを扱う、学習論・エンジニアリング論のセッションです。
SLAs, SLOs, and SLIs: Demystifying SRE (Room I)
- SLI・SLO・SLA・エラーバジェットの考え方を、数学的背景から丁寧に解説する英語セッション。信頼性エンジニアリングの基礎として、インフラ・バックエンドを問わずシステムを運用するすべてのエンジニアに価値があります。
16:30 〜
javadoc 再入門 & AI時代のドキュメント戦略 (Room A+B)
- 「シャノンの情報源符号化定理」「AIの限界と停止性問題」といった独特の切り口でドキュメントの意義を問い直すセッション。「AIが書いてくれるなら、もうドキュメントは不要?」という問いへの答えが聞けます。
OpenID Connectによるサービス間連携 (Room C+D)
- OIDC(OpenID Connect)によるサービス間認証の仕組みを解説。クラウドやCI/CDでも広く使われているOIDCは、Javaに限らずWebシステムを作るエンジニアが知っておきたい知識です。
16:55 〜
- Javaコミュニティの関心の変遷を可視化する:JJUG CCC 発表データから見る変化と不変 (Room L, 16:55-17:15)
- 直近5年のJJUG CCC発表データをテキスト分析・データ可視化で読み解くセッション。技術コミュニティのトレンドを俯瞰する視点は、Javaを知らなくても純粋にデータ分析として面白い内容です。
余談
昨年(JJUG CCC 2025 Spring)も同じコンセプトで記事を書いたのですが、今年はAI絡みのセッションが明らかに増えました。去年ピックアップした19本中AI関連は4本ほどでしたが、今年は19本中8本近くがAIに絡んでいます。※ピックアップしたもの以外でもAIへの言及はあります。
去年の記事
hk-it.hatenablog.com
しかもAIに対するトーン、向き合い方が変わっています。去年は「AIって使うべき?生産性は本当に上がるの?」という問いかけ系が多かった印象ですが、今年は「AIは前提、ではどう設計するか」「チームとしてどう組み込むか」という一段抽象度が上がった議論が中心になっています。1年でここまで変わるのか、という感慨がありつつ、これからどう変化していくのかも楽しみです。
ぜひ、会場で皆さんとお会いできるのを楽しみにしています!
おまけ(副産物)
セッション一覧( https://sessionize.com/api/v2/x15nrefa/view/Sessions )をCSVに変換するJavaScript(F12の開発者コンソールで利用する)
const toCSV = (array) => { return array.map(row => { return row.map(value => { const cell = String(value); const escaped = cell.replace(/"/g, '""'); return `"${escaped}"`; }).join(','); }).join('\n'); }; const res = []; const sessions = document.querySelectorAll('ul.sz-sessions--list>li'); for (let session of sessions) { const row = []; row.push(session.querySelector('.sz-session__title').innerText); row.push(session.querySelector('.sz-session__description').innerText); row.push(session.querySelector('.sz-session__room').innerText); row.push(session.querySelector('.sz-session__time').innerText); res.push(row); } console.log(toCSV(res));