PHPConference 2021での発表資料です。
続)改善失敗から学ぶレガシープロダクトに立ち向かうチーム作りPHP Conference 2021Nakata YudaiCybozu 1
View Slide
プロフィール• 中田 雄大 / なかた ゆうだい• サイボウズ株式会社 Garoon開発 中途採用3年目• 大阪オフィス所属• アーキテクチャのこととか考えるの好きですCybozu 2
Cybozu 3Garoon
Cybozu 4
Garoon• 開発から20年目• PHPは4から7.4に(来年には8.0に)• パッケージ版(Linux・Windows)とクラウド版がある• テーブル数は約850Cybozu 5
Cybozu 6今回の発表は前回の続編
前回Cybozu 7
前回Cybozu 8実際にレガシープロダクトに立ち向かえたのか
Cybozu 9
Cybozu 10
Cybozu 11やってきたこと
やってきたこと• Controller改善• フロントエンド改善• PHPのバージョンアップ• デバッグバーの導入• CI改善、定常作業の自動化、etc.Cybozu 12
Controller改善• ユニットテストを書けるようにする• リクエストデータの取り扱いやレスポンスの作り込みをするためのGaroonでの標準的な方法を提供する• 冗長なコードの削減Cybozu 13
Cybozu 14
Cybozu 15• リクエストパラメーターに配列ベースでアクセスしている• 手動でリクエスト情報を期待する型にキャストしている
Cybozu 16• 依存するクラスのインスタンスをグローバル関数で取得する• 依存するクラスをnewを使ってインスタンス生成する
Cybozu 17• テンプレートエンジンのインスタンスを直接生成する• View構築に関する冗長な記述
Cybozu 18
Cybozu 19
Cybozu 20
Cybozu 21
Cybozu 22
DIコンテナの導入• Controllerでの自動的な依存解決の実現• 環境別の依存性注入や処理の制御• オンプレLinux版、オンプレWindows版、クラウド版...Cybozu 23
フロントエンド改善Cybozu 24
フロントエンド改善• ES2015移行 / TypeScript移行• レガシーなコードベースの改善• インラインJSの削除 / 階層構造の見直し• ReactJS導入Cybozu 25ベトナムチームがリードして、日本チームとも相談しながら発案から実装までベトナムで実施した
レガシーなコードベースの改善• 脱スパゲッティーコード• 不明確な階層構造からの脱却• 使いたいクラスはどこか、抽出したクラスはどこに置くかを整理• インラインJSを抜き出す• リファクタリング後の新しい実装にはユニットテストを書くCybozu 26
Cybozu 27
Cybozu 28• 処理を辿れない• どこから呼び出されているか分からない• どこにコードが配置されているか分からない
ReactJS導入• フロントエンドのコードを1から書き続けるのは非効率• 社内の別プロダクトでも採用されていて利用実績がある• 担当しているベトナムの開発メンバー間で経験者が比較的多いCybozu 29
ReactJS導入• 実際に一部にReactJSを使ったバージョンを11月版から提供• 各種コンポーネントをReactJSで代替することも模索中Cybozu 30
PHPのバージョンアップ• どうしてやる?• セキュリティやライセンスの問題を回避する• 新しい機能を使えるようにする• 元々4だったプロダクトが今は7.4• 来年PHP8.0に移行することに向けて現在準備中Cybozu 31
PHPのバージョンアップの難しいところ• 独自のPHP拡張が存在する• 拡張をしていると、PHPに特化した人材だけでは対応できない• C言語での実装が可能な人材が必要• Changeログを参照して影響範囲の調査• コードを確認するだけでは、挙動を判断できない場合があるCybozu 32
PHPの更新に取り組む中での知見• 自動テスト大事• PHP拡張のユニットテスト ・ PHPのユニットテスト• JSのユニットテスト ・ E2Eテスト• 重要なクラスやハッピーパスだけでも準備するCybozu 33
PHPの更新に取り組む中での知見• 事前の調査も大事だが、早めに動かしてみるのも大事• バグはあったとしても、とりあえず次のバージョンで動かしてみる• 動いていることを確認できるだけでもテンション上がるCybozu 34
デバッグバー• 発端は実行したSQLを確認したいところから• 各種情報を画面から確認できるように• セッション• 実行したSQL• テンプレートエンジンに渡した変数 etc.Cybozu 35
デバッグバー利用ライブラリ: maximebf/php-debugbarCybozu 36
Cybozu 37後日技術ブログにて、いくつかの改善の詳細を書くので是非見てください!
Cybozu 38改善を進めたぞ!
Cybozu 39順調だった?
Cybozu 40ここからは所属チームの話
所属チームの役割• Garoon開発における技術系プロジェクトのハンドリングや実装• 国内におけるGaroon関連の技術系依頼の一次受け• 技術系の視点を持っての意見出しCybozu 41
Cybozu 42改善を進めていたが、、、
Cybozu 43
どんな問題意識があった?• やらなきゃいけない事と改善のプロジェクトの両輪をどう回す?• プロジェクトの優先順位を決めづらい• 各改善プロジェクトが大きくフィードバックサイクルが回りづらい• 他のメンバーが何をやっているか分かりづらいCybozu 44
やらなきゃいけないこといっぱい• 新基盤への移行に向けた対応• 脆弱性対応• 性能改善• 様々な割り込みタスク etc.Cybozu 45
メンバーが何をやってるか分かりづらい• 問題が発生した場合は勿論共有されるが、それ以外も知りたい• そもそもそのプロジェクトの目的/ゴールってなんだっけ?• いまどんなことしてる?• 得られた知見ってある?• いつまでやるんだっけ?順調?Cybozu 46
Cybozu 47改善を継続していくための仕組みが必要
Cybozu 48プロダクト改善の持続性を高めるためにチームのプロセスも改善する
チームのプロセス改善• チームの目的や目標を言語化し、チームの方向性を固める• チームとしてどのプロジェクトを優先するべきか迷いづらくするCybozu 49
チームのプロセス改善Cybozu 50• 定期的にプロジェクトの状況を共有し、スケジュールを考え直す機会を作る• 毎日の昼会でプロジェクトの状況を持ち回りで共有する• 月1でプロジェクトの優先順位を見直し、今月何するか確認する
チームのプロセス改善Cybozu 51
チームのプロセス改善Cybozu 52• 割り込みタスクの対応方法をルール化する• 週ごとに割り込みタスクの一次対応をサブチームに割り当てる• 他チームから事前に相談を受けるための時間を毎日30分確保
Cybozu 53プロセス改善に集中できる人を用意する
プロセス改善に集中できる人を用意する• 片手間でプロセス改善をするのは大変• 本業に手一杯ならチーム外から協力してくれる人を呼ぶのも手• 新しい視点で問題点を発見してもらえる• プロセスの見直しを主導するのは技術者じゃなくてもできるCybozu 54
Cybozu 55
問題意識は解決できたのか• プロジェクトの優先順位を合意して、改善を進められるようになった• 割り込みタスクをチーム内で迷いなく負荷分散できるようになった• 毎日の昼会でプロジェクトの状況や知見を把握できるようになったCybozu 56
Cybozu 57Garoonを開発者にとって魅力的なプロダクトにする
Cybozu 58開発者に向けた改善は、開発者同士で感謝し合える
嬉しいやり取りCybozu 59
嬉しいやり取りCybozu 60
Cybozu 61戦いは続く
改善を進めていく• 前回の発表の通り、改善していくための環境はすでにある• フロントエンドエキスパートチーム、生産性向上チームの協力がある• プロセス改善するためにチーム外から人に来てもらえた• Garoonチーム以外の色んな人に協力してもらえる環境があるCybozu 62
とは言えまだ問題も• 改善をしやすい環境ができ、実際に改善を進めているが、開発20年目のこの製品にはまだまだ改善ポイントが沢山ある• 改善をより進めていくにはもっと人が欲しいCybozu 63
メンテナンスしていかないと人集まらない• 学んだこと、新しいことを使える選択肢を提供したい• 使わない選択をするのはOK、使えない/選択できないのはNG• 広く使わている技術に追従するCybozu 64
Cybozu 65Garoonを開発者にとって魅力的なプロダクトにする