はじめに
先日、LTイベント「Qiita Night~Rails~」にて登壇させていただきました。
そこで、Railsで大規模Webアプリケーションを 開発するときに知っておきたいテクニックを Qiita の Rails を例にいくつか紹介しました。発表資料はこちらです。
アーカイブ動画もあります。
これまで大規模 Rails で役立つテクニックをそれぞれ記事として紹介しました。
この記事は、LT で話した残りの部分、「Qiita が Rails のコード品質を担保するためにやっていること」を紹介します。
Qiita が Rails のコード品質を担保するためにやっていること
それぞれ簡単に紹介していきます!
RuboCop
Qiita の Rails では RuboCop を導入しています。RuboCop は Ruby のコードを静的解析し、よくない書き方があると指摘してくれます。
実行のタイミングとして、Git の pre-commit hook により commit する際に実行されます。ここで違反しているコードがあると commit できないようになっています。また、GitHub Actions でも実行しているので、 RuboCop のルールに違反した状態で merge されないようになっています。
RSpec
Qiita では、テストライブラリとして RSpec を使用しています。
Qiitaではテストをちゃんと書く文化が根付いていて、Model や Controller などを中心にできる限りテストは書くようにしています。LTでも紹介しましたが、SimpleCov でカバレッジを計測したところ 90% となっていました。
また、テストが多いことによるデメリットとして Flaky Test が発生してしまったり、仕様が大きく変化するとテストの修正箇所が多くなってしまうこともありますが、テストがあることで得られる恩恵を考えると、それを直すのも苦ではないと思います。
Yard
Qiita では、Yard の記法でメソッドの引数と戻り値の型をコメントとして記載しています。
こんな感じです。
# @param query [String]
# @param variables [Hash]
# @return [Hash]
def post(query, variables)
response = client.post({ query: query, variables: variables }.to_json)
JSON.parse(response.body)
end
すべてのメソッドで Yard によりできているわけではないですが、public なメソッドには基本的に書く方針になっています。それにより、メソッドをどのように使えばいいのか、何が返ってくるのかがわかりやすくなっています。
その他
品質担保に影響していそうなQiitaの文化を少し紹介します。
- コーディング規約
- RuboCop で捕捉できない Ruvby のルールなどをコーディング規約としてまとめています
- 障害が起きたときなど、再発しないようにするためルールを追加することがあります
- 設計
- できるだけ設計になるように心がける文化があります
- 入社時のオンボーディングとしてオブジェクト指向設計の習得があったりします
- ドキュメント文化
- Qiita のエンジニアだからこそ、Qiita の記事投稿が推奨されています
- プライベートな内容は Qiita Team にドキュメントを書くようにしています
- 上記のコーディング規約やオンボーディングの資料などもQiita Teamに書かれています
おわりに
ここまで、Qiitaでコード品質を担保するためにやっていることを紹介しました。ですが、まだまだできていないことももちろんあります(ライブラリのアップデートなど)。ですので、これからもコード品質の担保のためにできることがないか探して、また紹介できることが増えたら記事にしていきたいと思います。