Akatsuki Hackers Lab | 株式会社アカツキ(Akatsuki Inc.)

Akatsuki Hackers Labは株式会社アカツキが運営しています。

人がコードレビューする時代は終わった

背景

crazy_hound

最近GitHubワークフローやコードレビューの文化が普及してきていますが、 コード規約まわりの細かい指摘ってするべきなのか、迷いますよね。 例えばカンマの後にスペースがいるとか、引数が多いときに改行した方が良いとか・・・。 いちいち指摘してたらエンジニア間の人間関係がギクシャクします。

そんな悩みを解決してくれるサービスが、HoundCIです。 HoundCIを使うとPull Requestをopenしたときに自動的にコード規約に違反する箇所をGitHub上でコメントとして指摘してくれます。

アカツキではソフトウェア開発は大きくサーバーサイド(Ruby)及びクライアントサイド(C++)に分かれますが、 数ヶ月前よりサーバーサイドでHoundCIを導入して以降、コード規約の浸透率が高くなった経緯があります。 そこで筆者はクライアントサイドにもHoundCIを使ってみたいと思うようになりました。

ところが、HoundCIは2014年10月現在、JavaScript, CoffeeScript及びRubyにしか対応していません。 そこで本記事で紹介するHoundCIのForkで、HoundCIをC++にも対応させようと思い立ちました。

改修内容

新しい言語に対応となるとそれなりに手間がかかるかなと思いましたが、 マッシュアップで意外と簡単に(1日!)実装できました。 やってることは、Rubyにおいてrubocopがしていたことを、C++においてcpplintに置き換えるだけでした。 こういうかゆいところに手が届くのが、open source のいいところですね。

github.com/sergeant-wizard/hound/compare/cpplint

HoundCIのサービスを普通に使用する場合はFORKしたバージョンで運用できないため、 アカツキではAWS上のプライベートサーバでHoundCIを運用しています。

Rubyのチェックでは、リポジトリ毎にrubocopの設定を変えて運用することができますが、 このForkではそこまで対応していません。 プロジェクトを横断して共通のcpplint.pyを改修しながら運用しています。

ついでに自動修正もしてみた

数ヶ月前から発足したプロジェクトにいきなりhound+cpplintを導入したら、 これまでクライアントサイドでコード規約があまり浸透していないこともあり、 一つのPullRequestで100件近くの指摘が発生してしまうこともありました。 そこで、git-filterを使って機械的に置換が可能な箇所は置換してしまうことにしました。

下記のスクリプトをクライアントリポジトリに追加することで、不注意によるコード規約違反がhoundにより指摘されることが少なくなりました。

Programmers should be Lazy. [gist id=c4ebd58194bcc7fd804c]

ただし、こういったスクリプトを使用した一括置換を運用中のコードに適用するにあたっては、 ロジックの変更がないかをチェックする手間がありますね。

ソシャゲ業界のクライアントコード

ゲーム業界のクライアントサイドは、一昔前は「リリースしたら終わり」で、可読性やメンテナンス性がそこまで重視されていなかったと聞きます。 ところがソーシャルゲーム業界では、1ヶ月に複数回クライアントのバージョンアップデートをすることも珍しくありません。 このような細かいリリーススパンが要求される現場では、クライアントサイドにおいても、サーバーサイドで常識となりつつあるContinuous Integrationの文化や考え方を導入することが不可欠であると思います。 本記事ではその一貫としてアカツキが取り組んだ自動化や、可読性へのこだわりを紹介させていただきました。

Disclaimer

本記事はthoughtbotのScott Albertson氏の許可をいただいた上で掲載しております。