Upgrade to Pro — share decks privately, control downloads, hide ads and more …

モノリス化したコード・組織の両方を分割して​ アーキテクチャを改善する​ / Develope...

モノリス化したコード・組織の両方を分割して​ アーキテクチャを改善する​ / Developers Summit 2023 Summer

2023年7月27日開催の Developers Summit 2023 Summer での登壇資料です。
サイボウズ kintone 開発チームでの、コード・組織を分割する開発改善の取り組みについて紹介しています。
https://event.shoeisha.jp/devsumi/20230727/session/4465/

Kaiichiro Ota

July 27, 2023
Tweet

More Decks by Kaiichiro Ota

Other Decks in Technology

Transcript

  1. 本発表の内容 3 モノリス化した コード・組織 肥大化したコード、 複雑化の進行 停滞感、 プロセスの重さ 1. コード分割

    2. チーム分割 複雑化の抑制、 モノリス化を防ぐ オーナーシップの芽生え、 チーム独自のプロセス改善 継続的に発展できる コード・組織へ 3. 両分割の連携 kintoneチームの アーキテクチャ改善
  2. 発表者について ▌前田 浩邦 (マエタ ヒロクニ) ⚫ 基盤チーム プログラマ ⚫ コード分割について発表

    ▌太田 絵一郎 (オオタ カイイチロウ) ⚫ 新機能開発チーム マネージャー ⚫ チーム分割について発表 ▌内山 武尊 (ウチヤマ タケル) ⚫ 新機能開発チーム プログラマ ⚫ 各分割のふりかえり、連携について発表 4
  3. ▌ユーザーの属性が違うと、利用するkintoneの機能も異なってくる ⚫ 現場で業務をする人 (アプリを使う人) → アプリ機能 ⚫ 情シス・業務リーダー (アプリを作る人) →

    アプリ設定機能 ▌コード分割では、このようなメンタルモデルに、実際のコードを合わせる コード分割の基準: プロダクトマネージャー (PM) のメンタルモデル 13 現場で業務をする人 (アプリを使う人) 情シス・業務リーダー (アプリを作る人) レコードを表示する アクセス権を変更する kintone アプリ機能 アプリ設定機能
  4. 分割後に目指す状態 (サーバーサイド) 14 GetRecordController com.kintone.app UpdateAccessRight SettingController IAccessRightService AccessRight SettingDto

    com.kintone.appsettings AccessRight SettingService Impl RecordDto 共有モジュール 依存を禁止 アプリ機能 アプリ設定機能 RecordService
  5. 分割後に目指す状態 (サーバーサイド) 15 GetRecordController com.kintone.app UpdateAccessRight SettingController IAccessRightService AccessRight SettingDto

    com.kintone.appsettings AccessRight SettingService Impl RecordDto 共有モジュール 依存を禁止 アプリ機能 アプリ設定機能 RecordService 機能に対応するパッケージを作成 機能に属する全コードをパッケージに配置 機能の性質上関わらないならば、 コードでも関わらせない
  6. 分割後に目指す状態 (サーバーサイド) 16 GetRecordController com.kintone.app UpdateAccessRight SettingController IAccessRightService AccessRight SettingDto

    com.kintone.appsettings AccessRight SettingService Impl RecordDto 共有モジュール 依存を禁止 アプリ機能 アプリ設定機能 RecordService 機能の性質上関わりがあるならば、 現状は共有を許容
  7. 分割後に目指す状態 (フロントエンド) 17 RecordList Component RecordListPage js/app/components AccessRight SettingPage js/appsettings/components

    アプリ機能 アプリ設定機能 依存を禁止 GlobalHeaderComponent TableComponent 共有モジュール AccessRight Component JS API
  8. 分割による凝集度の向上 22 画面A アプリ設定 画面 共通モジュール アプリ設定 専用処理 画面A アプリ設定

    画面 共通モジュール アプリ設定 専用処理 アプリ設定機能 依存を 禁止 ▌共通モジュールにアプリ設定専用処理が書かれていた 機能ごと分割することによって凝集度が向上し、可読性が改善
  9. 複雑化の抑制 23 画面A アプリ設定 画面 共通モジュール アプリ設定 専用処理 画面A アプリ設定

    画面 共通モジュール アプリ設定 専用処理 アプリ設定機能 依存を 禁止 ▌共通モジュールに画面専用処理を書くような 凝集度を下げる変更を無意識にやりがち 依存関係を監視することで、複雑化を抑制する
  10. 振り返り - コード分割 ▌効果 ⚫ 凝集度の向上と複雑化の抑制 ⚫ 既存コードを変更したときの影響範囲の確認を容易にする ⚫ モノリス化を防ぐ

    ▌課題 ⚫ コード分割の加速 ⚫ 分割したコードにオーナーシップが必要 ⚫ 元に戻さないために機能の境目を意識し続ける必要がある 25
  11. 「チーム分割」以前の体制 ▌kintoneの新機能開発チーム ▌Large Scale Scrum (LeSS) ベースの複数チーム開発 ⚫ エンジニア3〜4名/チーム ×

    4〜6チーム ⚫ 全員がプロダクト全体を作る ⚫ 柔軟にリソース配分できるメリット ⚫ ここをやるぞ!となったらリソース一点集中できた ▌チームをスケールしつつ、大小の機能アップデートをコンスタントに毎月リ リースしてきた 27
  12. 「チーム分割」の提案 ▌目的:認知負荷を減らし、チームの自律性を高めること ⚫ 自律性 = 内発的動機付けの要素 ⚫ Ref. モチベーション3.0(ダニエル・ピンク) ⚫

    プロダクトの持続的成長には、開発スピード・モチベーションどちらも重要 ▌何を変えるのか? ⚫ 「全員が全機能を作る」をやめて、チームごとに担当領域を持ち分担 ⚫ スクラムマスターを置く(長らく不在だった) 30
  13. 現在(2023年7月)のチーム体制 33 アプリ設定チーム ⚙️ アプリチーム 🍮 ナビゲーション/ スレッド系チーム 🐤 システム管理/

    外部連携チーム 🐰 各チームにエンジニア、QA、 スクラムマスターが所属 デザイン/ ドキュメント プロダクト マネージャー 全体スクラム マスター 各領域にフォーカスして動く人たち: 領域横断で動く人たち:
  14. ▌コア機能かつ分割しやすそうな、アプリ設定機能の分割にチャレンジ (2022/11 ~ 2023/01) ▌目的 アプリ設定チーム⚙️ (アプリ設定機能のオーナー) による分割の学習 コード分割トライアルプロジェクト (チーム分割

    → コード分割) 45 ▌アプリ設定機能のうち1/4を分割できた ▌プロジェクト終了後も分割を継続中 ▌チーム分割 → コード分割という形の補完
  15. 補足情報 ▌「コード分割」について ⚫ 技術ブログ記事 ⚫ https://blog.cybozu.io/entry/2023/03/14/110000 ⚫ JJUG CCC 2023

    Spring 発表資料 ⚫ https://speakerdeck.com/hirokunimaeta/jjug-ccc-2023-spring ▌「チーム分割」について ⚫ DevOpsDays Tokyo 2023 発表資料 ⚫ https://speakerdeck.com/kaiichiro/fei-da-hua-monorisuhua- surupurodakutokai-fa-zu-zhi-wozi-lu-de-dexiao-sanatimuqun- nibian-eteiku-kintonekai-fa-timunoshi-li 51