Slide 1

Slide 1 text

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


Slide 2

Slide 2 text

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


Slide 3

Slide 3 text

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


Slide 4

Slide 4 text

加納 悠史
 レガシーシステムの開発
 @Ykanoh65
 株式会社 ラクス
 所 属
 お仕事
 その他
   Twitter
 PHPer ダイビング 観葉植物 
 カノウユウジ
 オフショア窓口 / イベント登壇


Slide 5

Slide 5 text

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


Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

オフショアチームの
 タスク範囲
 ▰ 要件定義後の設計
 ▰ バグの調査 / 修正方針検討
 ▰ 実装 〜 単体テスト
 ▰ 受入テスト作成 / 実施
 ▰ 結合テスト作成 / 実施
 ▰ 脆弱性診断 etc...
 7 仕様理解がすごい たまに仕様の矛盾を指摘される ... 不明点はバンバン質問くれる バグの数は多くない 全くないわけではない ブラックボックステストはしっかりやってくれる

Slide 8

Slide 8 text

そんな
 ベトナムチームの
 弱点...


Slide 9

Slide 9 text

コード品質


Slide 10

Slide 10 text

コード品質が悪い例 
 ▰ 何重ものif文
 ▰ 参照渡しの引数
 ▰ せっかくのクラスに条件分岐追加
 悪意があるわけではない。 
 むしろバグを出さないことには気を使ってくれている。 
 function hoge($user, $isNeedXxxFlag ) { if ($nanika == $NANIKA_TEISUU ) { : : if ($isNeedXxxFlag ) { //なにか特別な処理 } : : return true; } return false; }

Slide 11

Slide 11 text

レガシーシステムから脱却をしたい
 
 しかし 実装の主力 であるベトナムチームの
 コード品質はよろしくない
 
 いくらリファクタリングの工数をとっても
 逆リファクタリングされちゃあね...


Slide 12

Slide 12 text

よし


Slide 13

Slide 13 text

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


Slide 14

Slide 14 text

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


Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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


Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

戦 略


Slide 20

Slide 20 text

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


Slide 21

Slide 21 text

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


Slide 22

Slide 22 text

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


Slide 23

Slide 23 text

現状日本からのFBは不十分
 ▰ 母国語が違うので丁寧に指摘しないと齟齬発生!
 
 
 → 齟齬を恐れて FB をためらう
 メイン:ベトナム語 サブ:英語をちょっと
 メイン:日本語 サブ:英語をちょっと 日本 チーム ベトナム チーム 翻訳 チーム 日本とベトナムチームのやりとり
 翻訳チームを挟む
 ▰ コード納品 = 結合フェーズ手前の忙しい時期
 → 忙しいと FB を諦めてしまう


Slide 24

Slide 24 text

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


Slide 25

Slide 25 text

対策1
 フィードバック阻害要因を除去
 FB と 修正要否 を分離
 ▰ 修正は不要な FB もOK!!
 → 納期を気にせず FB できる
 Need Fix 以下の修正をお願いします。 ~~ ~~ Not Need Fix 以下は確認のみお願いします ~~ ~~ FB イメージ


Slide 26

Slide 26 text

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


Slide 27

Slide 27 text

▰ FBでは事例集を指し示す
 ▰ “ガード節 の意図は ここを見てください”
 ▰ “変数名 で防げるバグについては ここを参照”
 ▰ “単一責務 について ここにまとまっています”
 対策2
 繰り返し使える事例集を用意
 指摘の説明が省略できる!!


Slide 28

Slide 28 text

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


Slide 29

Slide 29 text

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


Slide 30

Slide 30 text

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


Slide 31

Slide 31 text

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


Slide 32

Slide 32 text

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


Slide 33

Slide 33 text

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