$30 off During Our Annual Pro Sale. View Details »

PHPerが再利用可能な情報提供でオフショア先とコード品質向上に取り組む / PHPer try improve the code quality

Y-KANOH
September 25, 2022

PHPerが再利用可能な情報提供でオフショア先とコード品質向上に取り組む / PHPer try improve the code quality

~ オフショア先のコード品質向上は難しい ~

オフショアの場合、遠隔地であることだけでなく言語や文化、環境が違うため、お互いに意図を理解できているかや共通の認識を持てているかどうかが怪しくなってしまいます。
特に、コード品質向上のために行ったコードレビューのフィードバックについては、

・正しく内容を理解してもらえているか
・フィードバック内容を次回のコーディングに活かしてもらえるか

など、オフショア先との意思疎通が障壁となって、改善が行えない場合が多くあります。

そこで、私のチームではコードレビュー時に「再利用可能な」情報を提供することで、サービス全体のコード品質向上に取り組んでいます。
このセッションでは、

・どのようにしてオフショア先のコード品質向上に取り組めばいいのか
・オフショア先のモチベーションを保ちながらどのように改善を行っていくのか

などを、PHPのコードを紹介しながらお話しします。

Y-KANOH

September 25, 2022
Tweet

More Decks by Y-KANOH

Other Decks in Technology

Transcript

  1. PHPerが
 再利用可能な
 オフショア先と
 
 
 取り組む
 株式会社ラクス
 加納悠史
 コード品質向上に
 で


    情報提供

  2. 宣伝:来週火曜!!
 https://rakus.connpass.com/event/258493/ 


  3. 宣伝:来週火曜!!
 https://rakus.connpass.com/event/258493/ 
 後で読んで!!


  4. 加納 悠史
 レガシーシステムの開発
 @Ykanoh65
 株式会社 ラクス
 所 属
 お仕事
 その他
  

    Twitter
 PHPer ダイビング 観葉植物 
 カノウユウジ
 オフショア窓口 / イベント登壇

  5. 会社で
 オフショアやってるよ
 🙋


  6. オフショアチームの
 タスク範囲
 ▰ 要件定義後の設計
 ▰ バグの調査 / 修正方針検討
 ▰ 実装

    〜 単体テスト
 ▰ 受入テスト作成 / 実施
 ▰ 結合テスト作成 / 実施
 ▰ 脆弱性診断 etc...
 6
  7. オフショアチームの
 タスク範囲
 ▰ 要件定義後の設計
 ▰ バグの調査 / 修正方針検討
 ▰ 実装

    〜 単体テスト
 ▰ 受入テスト作成 / 実施
 ▰ 結合テスト作成 / 実施
 ▰ 脆弱性診断 etc...
 7 仕様理解がすごい たまに仕様の矛盾を指摘される ... 不明点はバンバン質問くれる バグの数は多くない 全くないわけではない ブラックボックステストはしっかりやってくれる
  8. そんな
 ベトナムチームの
 弱点...


  9. コード品質


  10. コード品質が悪い例 
 ▰ 何重ものif文
 ▰ 参照渡しの引数
 ▰ せっかくのクラスに条件分岐追加
 悪意があるわけではない。 


    むしろバグを出さないことには気を使ってくれている。 
 function hoge($user, $isNeedXxxFlag ) { if ($nanika == $NANIKA_TEISUU ) { : : if ($isNeedXxxFlag ) { //なにか特別な処理 } : : return true; } return false; }
  11. レガシーシステムから脱却をしたい
 
 しかし 実装の主力 であるベトナムチームの
 コード品質はよろしくない
 
 いくらリファクタリングの工数をとっても
 逆リファクタリングされちゃあね...


  12. よし


  13. ベトナムチームの
 コード品質を
 上げよう!!


  14. まずは原因分析
 コード品質がよくない理由
 1.既存コードがよくない
 ▰ 20年以上継ぎ足されたコード
 ▰ フレームワーク未使用
 ▰ トランザクションスクリプト
 ▰

    神共通関数ファイル
 2.ベトナムに情報がない
 ▰ 参考書はほぼ英語
 ▰ ドキュメントは充実してない
 ▰ 既存コードが教科書

  15. まずは原因分析
 コード品質がよくない理由
 1.既存コードがよくない
 ▰ 20年以上継ぎ足されたコード
 ▰ フレームワーク未使用
 ▰ トランザクションスクリプト
 ▰

    神共通関数ファイル
 2.ベトナムに情報がない
 ▰ 参考書はほぼ英語
 ▰ ドキュメントは充実してない
 ▰ 既存コードが教科書
 すぐの対応は不可能
  16. まずは原因分析
 コード品質がよくない理由
 1.既存コードがよくない
 ▰ 20年以上継ぎ足されたコード
 ▰ フレームワーク未使用
 ▰ トランザクションスクリプト
 ▰

    神共通関数ファイル
 2.ベトナムに情報がない
 ▰ 参考書はほぼ英語
 ▰ ドキュメントは充実してない
 ▰ 既存コードが教科書
 すぐの対応は不可能
  17. まずは原因分析
 コード品質がよくない理由
 1.既存コードがよくない
 ▰ 20年以上継ぎ足されたコード
 ▰ フレームワーク未使用
 ▰ トランザクションスクリプト
 ▰

    神共通関数ファイル
 2.ベトナムに情報がない
 ▰ 参考書はほぼ英語
 ▰ ドキュメントは充実してない
 ▰ 既存コードが教科書
 英語
 英語
 英語
 英語
 日本語
 英語

  18. まずは原因分析
 コード品質がよくない理由
 1.既存コードがよくない
 ▰ 20年以上継ぎ足されたコード
 ▰ フレームワーク未使用
 ▰ トランザクションスクリプト
 ▰

    神共通関数ファイル
 2.ベトナムに情報がない
 ▰ 参考書はほぼ英語
 ▰ ドキュメントは充実してない
 ▰ 既存コードが教科書
 → 学習材料が足りていない!!
 すぐの対応は不可能
  19. 戦 略


  20. 戦 略
 日本からのフィードバックを
 学習材料 にしてもらう


  21. フィードバックを
 次に活かす
 コードレビュー時にFBを行う FB内容を元に学習をしてもらう 次回の実装で学習内容を活かす FB:フィードバック


  22. フィードバックを
 次に活かす
 コードレビュー時にFBを行う FB内容を元に学習をしてもらう 次回の実装で学習内容を活かす FB:フィードバック
 キーポイント
 日本からのFBを
 増やす!!


  23. 現状日本からのFBは不十分
 ▰ 母国語が違うので丁寧に指摘しないと齟齬発生!
 
 
 → 齟齬を恐れて FB をためらう
 メイン:ベトナム語

    サブ:英語をちょっと
 メイン:日本語 サブ:英語をちょっと 日本 チーム ベトナム チーム 翻訳 チーム 日本とベトナムチームのやりとり
 翻訳チームを挟む
 ▰ コード納品 = 結合フェーズ手前の忙しい時期
 → 忙しいと FB を諦めてしまう

  24. できるだけ
 フィードバックを増やす
 対策が必要だった


  25. 対策1
 フィードバック阻害要因を除去
 FB と 修正要否 を分離
 ▰ 修正は不要な FB もOK!!


    → 納期を気にせず FB できる
 Need Fix 以下の修正をお願いします。 ~~ ~~ Not Need Fix 以下は確認のみお願いします ~~ ~~ FB イメージ

  26. ▰ 「ガード節とは」
 ▰ 「変数名の命名について」
 ▰ 「責務を単一にする方法」
 対策2
 繰り返し使える事例集を用意


  27. ▰ FBでは事例集を指し示す
 ▰ “ガード節 の意図は ここを見てください”
 ▰ “変数名 で防げるバグについては ここを参照”


    ▰ “単一責務 について ここにまとまっています”
 対策2
 繰り返し使える事例集を用意
 指摘の説明が省略できる!!

  28. レビュアーを 楽 に
 事例集検索ツールを配布
 レビュアーから
  「資料読んでないから使えないよ」
 と言われないように
 利用しているChrome拡張


  29. FBに事例集を使う
 もう一つの理由
 繰り返しの学習効果
 ▰ 反復してFBを行う
 ▰ 修正によるアウトプットを行う
 → 反復学習による知識の定着


  30. 実際にやってみて
 レビュアー
  もやもやしてたコードにコメントできるようになった
 
 ベトナムチーム
  可読性の高いコードについての質問があった!!


  31. 効果はすぐには出ない
 ただし、
 ▰ 結果が出るのはおそらくもっと先...
 ▰ 根気よく続ける必要がある


  32. まとめ
 オフショア先のコード品質で悩んでいませんか?
 ▰ FBの阻害要因を排除
 ▰ オフショアチームの情報源になる教材を用意
 ▰ レビュー時には教材を指し示してFB
 ▰ 根気よく手を抜かずに続けていく


  33. 宣伝:来週火曜!!
 https://rakus.connpass.com/event/258493/