Share
Embed
ビズリーチにおけるリアーキテクティング実践事例 / JJUG CCC 2025 Spring
2025年6月7日に開催された「JJUG CCC 2025 Spring」の登壇資料です。
https://ccc2025spring.java-users.jp/
▼関連資料
ユーザー数100万人規模の事業成長を止めずに、レガシーコードと戦う
https://speakerdeck.com/visional_engineering_and_design/jjug-ccc-2022-fall
-----
Visionalのエンジニアリングに関する最新情報はX、ブログで発信しています!📣
▼Visional Engineering Blog
https://engineering.visional.inc/blog/
▼VISIONAL ENGINEERING / X
https://twitter.com/VISIONAL_ENG
Visional Engineering & Design
July 02, 2025
Transcript
59 slides
-
ビズリーチにおけるリアーキテクティング実践事例 ~ 大規模システムを継続的に変革するための組織 × アーキテクチャ戦略~ @JJUG CCC 2025 Spring
株式会社ビズリーチ(Visionalグループ) 菊池 信太郎 1 -
菊池 信太郎 2012〜 株式会社ニトリ • 店舗 / 物流でトラブルシューティングしたり、現場の改善を回したり
2014〜 SIer • 受託開発やSESで複数プロジェクト経験 • テックリード・PM・EMとして開発経験を積む 2018〜 株式会社ビズリーチ • ビズリーチのtoBプロダクトを中心に開発 • EMとしてリアーキテクティングの推進、組織横断プロジェクトなどのリード • 現在はプロダクト本部プラットフォーム統括部 統括部長 2 自己紹介 -
8 ユーザー数100万人規模の事業成長を止めずに、レガシーコードと戦う / JJUG CCC 2022 Fall - Speaker Deck
技術的負債が積み重なり、開発生産性が低下(2018年頃) JJUG CCC 2022 Fallでレガシーコードとの戦いについてお話しました。今回はその続編です。 -
デリバリに過度なプレッシャー • 事業が急成長していると、技術的負債を生んでしまう意思決定が起こりやすい • QCDSのうちコスト、納期、スコープが固定されると品質が下がる 密結合で凝集度が低いプログラム構造が原因でテストが書きづらい • プレゼンテーションロジックとドメインロジックがちゃんと分離されていない • API呼び出しやDBアクセスなど副作用がドメインロジックと同じ場所にあった
• 度重なる変更でスパゲッティ化したコードは何をやってるのかを読み解くのも一苦労 大規模プロジェクトを計画し、実行しきる組織力が不足 • 過去これまでに何度か技術的負債解消プロジェクトは立ち上がってはいた • 短期間の課題解決能力は高いが、プロジェクトマネジメントの経験が浅い傾向があった 9 レガシーコードの生まれた原因分析 -
10 現在進行系でプロダクトを改善中 引用:Betsy Beyer, Chris Jones, Jennifer Petoff, Niall Richard
Murphy『SRE サイトリライアビリティエンジニアリング』(オライリー・ジャパン, 2017) p.88「サービスの信頼性の階層」 -
11 現在進行系でプロダクトを改善中 ①現状把握とプロセス整備から始め、緊急 度の高いリスクは応急処置 ④段階的な内部品質改善 ②ポストモーテムを通じた継続 的な改善サイクルの確立
③自動化、プロセス、テスト、 QA の強化 引用:Betsy Beyer, Chris Jones, Jennifer Petoff, Niall Richard Murphy『SRE サイトリライアビリティエンジニアリング』(オライリー・ジャパン, 2017) p.88「サービスの信頼性の階層」 -
アジリティを獲得し、開発スピードと信頼性を上げるために、4つの観点から整理 • 価値提供への集中 • 透明性・検査・適応 • 変化は機会 • 失敗からの学習 13
アジリティを獲得するために考えるべきこと • 自動化による品質保証 • テスト駆動開発 (TDD) • 継続的なリファクタリング • 知識の共有と品質向上 • 柔軟なアーキテクチャ • 自己組織化チームの組成 • 明確な役割と責任 • 心理的安全性の醸成 • ステークホルダーとの協調 • 学習する文化の支援 組織 技術 • イテレーティブな開発 • 継続的なフィードバック • フローの最適化 • 価値に基づく優先順位付け プロセス マインドセット -
15 リアーキテクティング前のプロダクト構造 バックエンドは Java で出来ている巨大なモノリス • commonという名の巨大なpackageが共有されており、全プロダクトが密結合 • 昔ながらのSSRがほとんどで、フロントエンドとバックエンドが密結合
• 複雑なトランザクションスクリプトになっており、全般的にコードの凝集度が低い -
影響確認、コミュニケーションに時間がかかる • 適切なモジュール分割がされていないので、オーナー不在になりがち • なにか改善しようにも影響範囲が大きく、都度他のチームとコミュニケーションが発生する 変更、テストに時間がかかる • テストが書きづらいこともあり、マニュアルテストを手厚くやらないと不安になる •
JavaやSpringなどのバージョンアップをするにもかなり工数がかかる ビルドに時間がかかる • ちょっとした変更で広範囲にビルドが走る • 組織拡大に伴い、ビルド時間が伸び続ける 16 発生していた問題の一例 -
「Explicitly define the context within which a model applies. Explicitly
set boundaries in terms of team organization, usage within specific parts of the application, and physical manifestations such as code bases and database schemas. Keep the model strictly consistent within these bounds, but don't be distracted or confused by issues outside.」 ― Eric Evans『Domain-Driven Design: Tackling Complexity in the Heart of Software』(Addison-Wesley Professional,2003) モデルが適用されるコンテキストを明示的に定義する。チーム組織、アプリケーションの特定の部分における使用、コー ドベースやデータベーススキーマのような物理的な表現など、境界を明示的に設定します。これらの境界内ではモデル の一貫性を厳密に保ちますが、境界外の問題に惑わされたり混乱したりしないようにします。 19 参考:Bounded Context(境界づけられたコンテキスト) 引用:Martin Fowler「martinfowler.com,Bounded Context」 (https://martinfowler.com/bliki/BoundedContext.html) -
マイクロサービス化による疎結合化は非同期・結果整合性の許容とセット • 全てAPIを同期的につないでいくと、疎結合化のメリットが薄れる • 非同期に処理して、結果整合性の担保で問題ない場合は、トランザクションを分離したい • エンティティの状態ではなく、ドメインイベントによって責務を分けることができる 24 「残」とイベント駆動でコンテキストをつなぐ レジュメ更新
<Event> レジュメ審査残 審査完了 <Event> 審査完了通知 ステータス更新 レジュメ更新 審査 Context 会員 Context レジュメ審査 -
26 • 小さく書き直すことで、すぐに成果が出る • 実際の成果を目にすれば安心するので、一気に書き換えるよ うな時間的プレッシャーやストレスを回避できる • 書き直して新しくなった機能は、モダンアーキテクチャで機能
改善を進めることができる • お客様への公開が先になる場合は、フィーチャーフラグを使う ことでリリースとデプロイを分離できる ビッグバンリライトを避ける ビッグバンリライト • リリースされるまで書き換えの効果を享受できない • 競合他社に何年もの先行を許すことになる • 大規模になるほどリスクと不確実性が増し遅延する • 遅延するほど、チームへのプレッシャーは大きくなる • 再構築の結果、元よりもさらに悪くなる可能性がある 参考: Martin Fowler「Maarten’s Newsletter,The Explosive Nature of 'Big Bang' Rewrites」 (https://mdalmijn.com/p/the-explosive-nature-of-big-bang ) 段階的な書き直し 継続的にビジネス成長させるなら、原則ビッグバンリライトは避けるべき -
「色んな所で細かい改善を打つのもよいのだが、結局の所はそのサービスに置いての「一番の大通り」に施策を打つの が最も効果が良いと言うのがメルカリでの施策を通して得た学びだ。」 「全ユーザの10%しか使っていない場所を2倍良くするよりも、95%のユーザが使っている場所を1.1倍改善するほうが 遥かに結果が出やすい。」 引用:樫田 光「グロースの逆説 : メルカリで分析とサービスグロースをやる前に知りたかったこと」
(https://note.com/hik0107/n/n91e296a409a9) 30 「大通りを大事にしろ」 -
33 実際にCプロダクト / 採用企業向けプロダクトで実践したアプローチ 1. 新デザインの企画 2. 既存プロダクト全体へ最低限の変更で新デザインを適用 3. 表層デザイン・情報設計を再構成し、新しいアーキテクチャで実装してリリース
(グロナビの配置など、場合によってはCSSの適用難度が高い。弊社は力技でなんとかしました😇) デザイン負債を抱えているプロダクトの改善アプローチ -
リアーキテクティング後は、70-95%のテストカバレッジを保っている • Codecovでカバレッジを可視化 • チームごとにカバレッジ目標を設定 • カバレッジが高い ≠ 品質が高いなので、100%は必要ない •
Googleによると ◦ 60%:「許容できる」 ◦ 75%:「賞賛に値する」 ◦ 90%:「模範的」 38 テストカバレッジは「品質の出発点」 -
リアーキテクティングの中でテストのあり方も変えていく必要がある 39 テストピラミッドの段階的実現 引用:「Move Fast & Don't Break Things 」―
Google Test Automation Conference 2014 (https://docs.google.com/presentation/d/15gNk21rjer3xo-b1ZqyQVGebOp_aPvHU3YH7YnOMxtE/edit?slide=id.g3f5c82004_8611#slide=id.g3f5c82004_8611) -
改善前 E2Eテストもユニットテストも不足しているところからのスタート →アイスクリームコーンですらない(!) リリースプロセス改善 デプロイ頻度を上げるため、もともと実施していた手動シナリオテスト(E2Eテスト)を自動化 →アイスクリームコーンの形に 現在 リアーキテクティングにより、各プロダクトでテストが整備されつつある
今後 Small / Medium テストを増やし、Large テストを最小限に減らし、テストピラミッドへ! 41 アイスクリームコーンからピラミッドへ段階的に移行 -
アジリティを獲得し、開発スピードと信頼性を上げるために、4つの観点から整理 • 価値提供への集中 • 透明性・検査・適応 • 変化は機会 • 失敗からの学習 43
アジリティを獲得するために考えるべきこと • 自動化による品質保証 • テスト駆動開発 (TDD) • 継続的なリファクタリング • 知識の共有と品質向上 • 柔軟なアーキテクチャ • 自己組織化チームの組成 • 明確な役割と責任 • 心理的安全性の醸成 • ステークホルダーとの協調 • 学習する文化の支援 組織 技術 • イテレーティブな開発 • 継続的なフィードバック • フローの最適化 • 価値に基づく優先順位付け プロセス マインドセット 再掲 -
アジリティを獲得し、開発スピードと信頼性を上げるために、4つの観点から整理 • 価値提供への集中 • 透明性・検査・適応 • 変化は機会 • 失敗からの学習 44
アジリティを獲得するために考えるべきこと • 自動化による品質保証 • テスト駆動開発 (TDD) • 継続的なリファクタリング • 知識の共有と品質向上 • 柔軟なアーキテクチャ • 自己組織化チームの組成 • 明確な役割と責任 • 心理的安全性の醸成 • ステークホルダーとの協調 • 学習する文化の支援 組織 技術 • イテレーティブな開発 • 継続的なフィードバック • フローの最適化 • 価値に基づく優先順位付け プロセス マインドセット 再掲 -
アジリティを獲得し、開発スピードと信頼性を上げるために、4つの観点から整理 • 価値提供への集中 • 透明性・検査・適応 • 変化は機会 • 失敗からの学習 46
アジリティを獲得するために考えるべきこと • 自動化による品質保証 • テスト駆動開発 (TDD) • 継続的なリファクタリング • 知識の共有と品質向上 • 柔軟なアーキテクチャ • 自己組織化チームの組成 • 明確な役割と責任 • 心理的安全性の醸成 • ステークホルダーとの協調 • 学習する文化の支援 組織 技術 • イテレーティブな開発 • 継続的なフィードバック • フローの最適化 • 価値に基づく優先順位付け プロセス マインドセット 再掲 -
47 「どんな悪いことが起こりそうか」を考えるのではなく、「すでに悪いことが起こってしまった」という前提で考える プレモーテムを実施する理由 • 「どんな悪いことが起こりそうか」を考える方法だと … ◦ 自分たちの計画の欠点を見つけることと同義
◦ 欠点がない方が優れているという評価・価値観と相反する ◦ 楽観的になる(都合の良い解釈をしてしまう) • 「すでに悪いことが起こってしまった」という前提で考えると … ◦ 後知恵が使える ◦ 原因を多く考えられた方が優秀 プレモーテム(死亡前死因分析)の実施 -
アジリティを獲得し、開発スピードと信頼性を上げるために、4つの観点から整理 • 価値提供への集中 • 透明性・検査・適応 • 変化は機会 • 失敗からの学習 50
アジリティを獲得するために考えるべきこと • 自動化による品質保証 • テスト駆動開発 (TDD) • 継続的なリファクタリング • 知識の共有と品質向上 • 柔軟なアーキテクチャ • 自己組織化チームの組成 • 明確な役割と責任 • 心理的安全性の醸成 • ステークホルダーとの協調 • 学習する文化の支援 組織 技術 • イテレーティブな開発 • 継続的なフィードバック • フローの最適化 • 価値に基づく優先順位付け プロセス マインドセット 再掲 -
ドメイン知識が検索・再利用できる状態を目指し、Cosense(旧:Scrapbox)でWikiを再構築 • 階層構造ではなく、リンクによって整理されるため、人が増えても破綻しない • 索引を作るようにメンテナンスすることで、みんながよく使うページほど品質が高くなる仕組み • 議事録、プロダクト仕様、調査、相談、思考メモなどを全てCosenseで書き始めた • 関連ページをまとめたSmart Contextをexportする機能も追加され、LLMとの親和性も高い
→NotebookLMやClaudeに参照させて使うことができる 52 ナレッジマネジメントの実践 引用: https://scrapbox.io/support-doc-jp/Cosense_基本の3つの動作 -
特にモジュール分割を進める中で直面している課題 • システム構成が複雑化し、システムの依存関係を全て知るのが難しくなっている ◦ Backstageなどで、システムコンポーネントの情報を全て集約し可視化する ◦ そろそろPlatform Engineeringチームが欲しくなってきている • モジュール間・チーム間のインタラクションが発生し、認識齟齬が起こる
◦ 将来像や設計方針を言語化し、共有する ◦ SLOを整備し、エラーバジェット運用などで障害発生時の判断をシステム化する 55 アーキテクチャを進化させる中で生まれた新たな課題 -
• AIコーディングツールで開発は加速する(している) • 要求・要件を言語化し、リファレンス実装もある「あとはやるだけ」の作業はすでに『Claude Code』や『Devin』で実 装できてしまう • 普段の開発もAI活用は進み始めているが、さらに大規模なリライトなども今後検証予定 56 AIによるリアーキテクティングの加速
https://www.anthropic.com/claude-code https://www.cursor.com/ja -
• Bounded Context(境界づけられたコンテキスト)で分割するのは、人間にとって認知負荷が下がり嬉しいが、AI にとってもコンテキストウィンドウ(モデルが一度に考慮または記憶できるトークン単位のテキスト量)が存在するた め、嬉しいものになる • これまでアジリティを獲得するために、変更容易性・テスト容易性を高めたり、テストピラミッドの実現を目指してき たが、AIコーディングツールの登場によって、これまで以上に開発の加速に耐えられるような開発環境を整えられ るかどうかで圧倒的な差ができてしまうのは容易に想像がつく •
小さいチームで、AIと一緒に計画し、AIといくつかのモジュールを開発するようになると思うが、人間の認知能力が ボトルネックになるので、Platform Engineering、ナレッジマネジメントなどへの投資も必須になってきそう 57 AIによる開発パラダイムシフト -
• ソフトウェアエンジニア • エンジニアリングマネジャー • QAエンジニア • MLエンジニア • MLOpsエンジニア
58 各ポジション絶賛募集中! https://hrmos.co/pages/hrmos/jobs/3100100100963/apply カジュアル面談はこちらから Engineering Blog https://engineering.visional.inc/blog/