クラウドワークス エンジニアブログ

日本最大級のクラウドソーシング「クラウドワークス」の開発の裏側をお届けするエンジニアブログ

MeowCopやめました(RuboCop設定の見直しをしてる話)

記事タイトル「MeowCopやめました(RuboCop設定の見直しをしてる話)」サムネイル

CrowdWorks ジャンヌチーム(技術的負債解消チーム)所属のlinyclarです。
「片付ければ片付く、片付けないから片付かない」をモットーに技術的負債解消に取り組んでおります。

長年放置され負債を生み出す原因となっているRuboCop設定の見直しを最近行っています。今回はその事例を共有します。なお、RuboCopでは各チェックのことをCopと言いますが、この記事では表現のしやすさから以下ルールと書いています。

MeowCopとは

MeowCopとは、簡単に言えばStyleやLayoutなどのRuboCopのStyle Checkerなルールを無効化し、RuboCopをLinterとしてのみ機能させるGemです。
また、兄弟GemにGryという守られているStyleをコードから抽出してくれるGemがあります。
資料:実用的な RuboCop の話
crowdworks.jpではMeowCopを導入し、上記資料にもでてくるGryを適用した状態になっていました。

MeowCopをなぜやめたか

一番目の理由はリポジトリが消滅しているためです。meowcopのRubyGemsのページは健在で gem install meowcopでインストールすることはできますが、 GitHubリポジトリhttps://github.com/sider/meowcop)は404になっています。
去年の4月には更新があったようなので、それ以降となると時期的にsider.reviewサービス終了と関係があるのかなと想像していますが実際のところはわかりません。

二番目の理由はMeowCopもGryもcrowdworks.jpにとっては不向きなGemだったためです。crowdworks.jpは10年以上開発が続いているサービスであり、RuboCopは開発開始からかなり遅れて導入されました。必然、RuboCop導入当時のrubocop_todo.ymlは大量にルールが無効化されている状態となっていました。
そういった状況ではGryの「隠れたコーディングスタイルを、.rubocop.ymlに抽出する」というコンセプトが機能せず、MeowCopが存在しているルール違反を追認する形になってしまい、大半のLayoutやStyleのルールが無効な状態となっていました。
わかりやすい例を挙げれば、Layout/*Indentation系のインデントルール、Layout/Space*系のスペースルールすら違反箇所が大量に出てくる状態です。

どうやめたか

.rubocop.ymlに書かれている以下の設定を削除し、Gemfileからgem 'meowcop'を除去した上でbundle installを実行すれば削除は完了です。

inherit_gem:
  meowcop:
    - config/rubocop.yml

しかし、当然ながらMeowCopが無効化していたルールが有効化されるので、対処しなければなりません。
.rubocop_todo.ymlに追加するでも良いのですが、Metrics系の設定も入っているためMeowCopから設定ファイルを取り込むことにしました。リポジトリが消滅しているので、インストール済のgemからサルベージしました。
rbenvを利用されているなら~/.rbenv/versions/{Rubyバージョン}/lib/ruby/gems/{Rubyバージョン}/gems/meowcop-3.2.0/config/rubocop.ymlにMeowCopのルールがあります。

ルールの見直し活動

ここまでMeowCopについてお話ししましたが、もともとは私の個人的な「なんでこんなにRuboCopのルールがルーズなのか」という憤りに端を発したRuboCop、Reekルール見直し活動があり、MeowCopの除去はその活動の一環でした。そのため、本番はここからでMeowCopによって無効化されていたルールを見直すという活動を現在しています。

していることは非常に単純で一週間に一回無効化されているルールを選んでslackで意見を募集し、合意が取れたら有効化するというやり方を現在はしています。

しかし、無効化されているルールは300件ほどありあまりにも時間がかかること、議論が紛糾して時間を浪費するリスクがあること、有効化と同時並行でルールに違反したコミットがマージされてCIがfailするリスクがあることなどから、すべてのルールを見直すところまではいかないだろうと考えています。

現状で有効にしても警告がでないルールを有効化したり、似たルールをまとめて見直すなどの工夫でペースアップを図っていきたいところです。

個人的な雑感

みなさん研鑽Rubyプログラミングは読まれたでしょうか。同意できるところが多く個人的にお勧めできる書籍です。この本の6章でもRuboCopの話題があります。

そして、こう書いてあります。私が同意できない数少ない箇所の一つです。

RuboCopを導入するにあたって、「デフォルトで有効にされているすべてのCopに目を通して適用可否を判断する」のは大変です。
(中略)
設定パラメーターのAllCops: DisabledByDefaultです。この設定を使うことで、自分たちにとって有用だと確信を持てる構文の検査だけを有効にできます。
研鑽Rubyプログラミング 156p

個人的な経験と現職の状況をみて思うことは「頼むからデフォルトで有効なものはそのままにしておいてくれ!」です。メトリクス系のルールは無効化しようという本書の提案には同意しますが、有効なルールの適用可否を判断するのが大変なら逆の場合でも同じことです。

現在MeowCopによって無効化されているルールは300件近くあり、常識的に考えて絶対適用されているべきだと私が考えるものは180件近くあります。逆に無効にしておいた方が良い、または良いかもと思うものは20件もありません。件数的に有効から無効に見直す方が効率的なのは明らかです。

また、無効化すればRuboCopは沈黙します。沈黙したルールを見つけて有効化するのと、うるさく警告してくるルールを無効化するのであれば、後者の方が効率が良いでしょう。

こういった理由から、私はデフォルト設定でスタートして不要なルールを無効化する方法をお勧めします。

CrowdWorksにおける技術的負債解消

このように、長く運用されている関係で基本的なところの問題が放置されていることがあるのですが、声を上げれば改善していける土壌はあり、「誰からも賛同が得られない」とか「そんなことしている暇があるなら」みたいな空気感はありません。RuboCopルールの見直しも、誰に許可を取るわけでもなく私が勝手に始めたことです。もちろん、通常業務をこなした上でとか、結果の合意を取るといった前提はありますが。

なので、冒頭でいったモットー「片付ければ片付く、片付けないから片付かない」において片付けられない組織上の理由は基本的にありません。片付けると手を上げれば片付けることができます。

We are hiring!

CrowdWorksではサービスが持続的に成長するために「自分が片付ける」と手を挙げてくれるチームメンバを募集しています! ご興味ある方は、ぜひお気軽にご連絡ください。

herp.careers

© 2016 CrowdWorks, Inc., All rights reserved.