チーム内にフォーマットツールを入れてみて早3ヶ月が立った

こんにちは。まっちゃんです。

11月も終わり東京も大分寒くなっているので皆様体調にはお気をつけてください。
外に出る際に服装を考えろという声を様々な箇所から頂くのでそろそろコートを出そうと思います。

本日はテックリードな取り組みとしてフォーマットツールを一部入れてみたお話をします。

もともと、テックリードの役割を担うにあたりミッションが課せられていました。
その内容としてソースコードの静的解析やlint、○○のマイグレーションなどに取り組む予定でした。
但し当時はチームの状況も加味できず、自分の考えも深堀りできていない、動けていないこともあり、当時できたことはフォーマットツールの導入だけでした。

問題

前の記事にも書きましたがチームのエンジニア構成は 初級者(ジュニアエンジニア) が多い状況です。

blog.engineer.adways.net

コードレビュー時にインデントや空白などのコーディング規約に関する指摘が多く、本来行いたいロジックのレビューになかなか割くことができませんでした。
人間、やはり抜けや漏れが発生するもので「直して」と言ったものの、また次のレビューでは同じ指摘を行いました。
このような時間に生産性は無いのでツールを通して課題解決を狙いました。

対象

チームでは Perl と Scala を扱っています。

Perl は Perltidy を使って手動で整形を行なう
Scala では Scalariform を使って自動で整形を行なう

ことにしました。

導入

Perl

インストール

$ brew install perltidy

差分対象ファイルを適用

対象リポジトリで実行
開発が新規ファイルだったので追加されたファイルのみ実行するスクリプトで対応しました

$ git diff --name-status master | grep '^A' | awk -F' ' '{print $2}' | xargs perltidy -enc=utf8 -ole=unix -i=4 -l=150 -syn -cti=1 -nolq -noll -nsfs -nsts -asc -tso -pt=2 -msc=2 -bar -mft=1 -boc -kbl=2 -b

Scala

pulugins.sbt に scalariform を追加

addSbtPlugin("org.scalariform" % "sbt-scalariform" % "1.6.0")

build.sbt に scalariform 設定を追加

import com.typesafe.sbt.SbtScalariform
import com.typesafe.sbt.SbtScalariform.ScalariformKeys
...
) ++ Seq(scalariformSettings: _*) ++ Seq(
  // for scalariform
  ScalariformKeys.preferences := ScalariformKeys.preferences.value
  .setPreference(AlignParameters, false)
  .setPreference(AlignSingleLineCaseStatements, false)
  .setPreference(AlignSingleLineCaseStatements.MaxArrowIndent, 40)
  .setPreference(CompactControlReadability, false)
  .setPreference(CompactStringConcatenation, false
  .setPreference(DoubleIndentClassDeclaration, false)
  .setPreference(FormatXml, false)
  .setPreference(IndentLocalDefs, false)
  .setPreference(IndentPackageBlocks, false)
  .setPreference(IndentSpaces, 2)
  .setPreference(IndentWithTabs, false)
  .setPreference(MultilineScaladocCommentsStartOnFirstLine, false)
  .setPreference(PlaceScaladocAsterisksBeneathSecondAsterisk, false)
  .setPreference(PreserveSpaceBeforeArguments, false)
  .setPreference(RewriteArrowSymbols, false)
  .setPreference(SpaceBeforeColon, false)
  .setPreference(SpaceInsideBrackets, false)
  .setPreference(SpaceInsideParentheses, false)
  .setPreference(SpacesWithinPatternBinders, false)
)

compile時に反映される

...
[info] Formatting 10 Scala sources {file:/builds/sample/project/}core(compile) ...
...

導入においては、自分がそもそもやりたい事ができていない、チームを巻き込めなかったなども問題点が多々ありました。
マネージャーに協力してもらい、他チームの知見を共有してもらう、実際のツールをペアプロを通してリポジトリに導入、チームへの導入推進を一緒に行いました。
ありがとうございます。

実際に使ってみて

Perl

  • 新規開発時は問題なく反映すればOK
  • 手動なので忘れることがある
  • 既存修正時は全てにかかってしまうためコマンドの修正が必要

Scala

  • 自動で反映されるので漏れが少ない
  • 細かく設定ができるが適切な設定まではできていない

まとめ

指摘は減り、効果が少しでもあると判断したので導入して今も継続して様子見しています。
但し細かな指摘はまだまだあるので別問題があると感じています。なのでその問題を見つけて解決しないといけません。
初級者(ジュニアエンジニア) が多いチームでの開発の進め方やレビュー方法などを引き続き考えていきたいです。

最後に

来週から12月なので アドベントカレンダー が始まります!
アドベントカレンダーも是非ご覧くださいませ。