チーム開発を活性化するためにやったこと

最近STNSのバージョンアップ記事ばっかり書いていたので、今日はチーム開発について書いてみます。僕は2016年からペパボのエンジニア職位制度のミドル層にあたるシニア・エンジニアという職位につきました。シニア・エンジニア以上の職位についてはエンジニアとして優れた存在であり続けることはもちろんのこと、それに加えて社内のエンジニアの育成や、社の全体の技術的課題の解決が求められます。

自身がなんからのプロダクトを生むことや、社の課題を解決するのは自分で手を動かせばよいだけなので、特に何も考える必要はありませんでした。対して社内のエンジニアの育成を考えた場合に、僕はまずはチームをいかに活性化し、生産性を高めるか?という事を考えました。
その理由は下記の3つです。


1. 生産性が上がるとこなせる仕事量が増加し、その結果、経験値が蓄積しやすい。
2. 生産性が上がると無駄に残業せずに早く帰れて最高!!(自己研鑚の時間が出来る)
3. 生産性が上がると、なんか自分やれてる感が生まれて更に頑張るから成長する


チームとしての生産性を上げるために半期中にいくつか施策を打ちました。その中から今日は3つを紹介します。

自動テストで記法チェック、自動修正を導入する

コードレビューをする際に、例えばphpであれば下記のようなコードが書かれていた場合。

if($hoge == "fuga"){
  echo "check";
}

ifと(の間にはスペースを入れましょうなどといった指摘って、言われた方も正直どうでもいいと思うってしまうし、言う方もタイプする時間が無駄ですよね。何も生まない指摘はしないに越したことはないので、下記のようなコードをCIツールで自動実行しています。

# !/bin/bash

success=0
files="$(git diff --name-only --diff-filter=M origin/master HEAD | grep ".php$")"
rootdir=$(cd ../$(dirname $0) 2>/dev/null;pwd)

if [ `which php-cs-fixer` ]; then
    cmd=php-cs-fixer
else
    cmd=$rootdir/vendor/bin/php-cs-fixer
fi

array=($(echo $files))
for file in $(echo $files); do
  echo "php-cs-fixer fix $file;"
done
echo

for file in $(echo $files); do
    info "$file"
    php -l $file && $cmd fix $file --dry-run --diff
    test $? -ne 0 && success=1
done

exit $success

内容的にはGitHubのmasterのHEADと比較し、差分があるファイルに対して、php-cs-fixerというPHPの自動記法チェック、修正ツールを実行しています。記法に誤りがあれば、下記のようにコマンドを発行し、自動で修正しています。

$ php-cs-fixer fix path/to/file.php

ちなみにこのスクリプトは同僚の@linyowsさんが作っていたものをこっそり拝借させてもらいました。これによりチーム内でどうでもいい指摘によるモチベーションのダウンや、レビューにかかる時間を短縮し、生産性を上げることが出来ます。

botによるチームタスク管理

Webサービスの運用においては日々様々なインシデントやバグの顕在化が起こります。そういったタスクは突発的に起こり、多くの場合に即日対処が求められます。タスク管理ツールについてはたくさんありますが、僕のチームではSlack+GitHubIssue+Rubotyを利用しています。例えば何らかのタスクが発生した場合は下記のようなコマンドをSlackに発行します。

osadakun_issue

issue

そうすると、GitHub上にラベル日直を付与されたIssueが作成されます。作成されたIssueにインシデントや対応の内容を記載します。追加されたタスクについては下記のようにコマンドを発行し確認することが出来ます。
osadakun_list

また決まった時間(16時とか)に自動でSlackにコマンドが発行される仕組みがあるため、タスクの漏れを防ぐことが出来ます。
この運用のメリットは下記のとおりです。


1.コミュニケーションツールとタスク管理が一つのインターフェースになる
2.ホワイトボードなどを利用しなくても、全員が同じ画面をみて会話することが出来る
3.GitHubのIssueと組み合わせることでFlow情報とStock情報両方が管理できる


特に2.ホワイトボードなどを利用しなくても、全員が同じ画面をみて会話することが出来るについてはSlackのタスクリストを見ながら、「このタスク今どうなってるんですか?」「それはIssueのこの部分に書いてある」と言った会話が何気なく出来るのってすごく便利です。
またIssueのクローズとともにタスクリストから消えるので消えないIssue=終わってないタスクということで管理がし易いです。
これに加え中長期的なタスクについてはTrelloを利用し、週に1回のタスクミーティングでタスク管理をしています。

コードレビューを定時化

これは結構個人的な話なのかもしれないのですが、僕自身がSlackのメンションとトークが苦手で、メンションやトークのたびに集中が止まるのがすごく勿体無く思えています。特に複数人で開発していると、コードレビューお願いします @dev-teamみたいなメンションが人数分飛ぶわけで、開発のスピードが上がれば上がるほどメンションされる回数が増えてきます。そのたびに集中が途切れるのは非常に勿体無いので、レビュー待ちというラベルをGitHubに作成し、そのラベルが付与されたPRを定期的に通知する仕組みを作成しました。

osadakun_review

こうすることにより例えば、10時、11時・・・のように定時で通知し、通知された時に一斉にレビューすることにより、AさんとBさんの言ってることが違う問題や何度も時差的にコメントが付いてそのたびに対応して時間を失うようなことが軽減できます。

最後に

今回は生産性を上げるという観点で記事を書きました。僕が取ったアプローチは大きくまとめるとチームで嫌と思うことを減らすということです。嫌だと思うことを取り除くことで、結果的に生産性の向上に寄与できる部分はあるのかなと考えています。下期は時間を作って学問的にチームビルディングを学びたいと考えているので、良書があればぜひ教えて下さい!