SideCI Blog

自動コードレビューサービスSideCIを提供している株式会社アクトキャットのコーポレートブログです。



Goのソースコード解析に標準ツールのgo vetを使ってみましょう

企業内においてGoを利用するケースが増えています。コンパイル系であり静的型付けの言語で、実行速度も速いのが特徴です。さらに仕様がシンプルなので習得が容易、かつ書かれたプログラムはマルチプラットフォームで動作します。

人気が出るに従ってチームでGoプロジェクトを進めるケースも多くなるでしょう。そうした中でコードの品質を保ち、保守性を良くするために、ソフトウェアを使ってコードをチェックしましょう。。幾つかのソフトウェアがありますが、今回はGoに標準で組み込まれているgo vetを紹介します。

go vetの使い方

go vetは go tool vet [directory] といった指定方法で実行します。directory はGoのソースコードが入ったディレクトリを指定します。

$ go tool vet path/to/go/project

実行すると、問題のある箇所について指摘が出力されます。

$ go tool vet ./alecthomas/gometalinter/
adjcmartix.go:85: suspect or: char != "" || char != " "
main.go:55: arg usage in Fprint call is a function value, not a function call
resolve.go:161: unreachable code
sparse.go:58: _m might be too small for shift of 32

後はこの指摘事項に沿ってソースコードを修正していくだけです。

ヘルプ

go vet のヘルプは go doc cmd/vet で出力できます。

$ go doc cmd/vet
Vet examines Go source code and reports suspicious constructs, such as
Printf calls whose arguments do not align with the format string. Vet uses
heuristics that do not guarantee all reports are genuine problems, but it
can find errors not caught by the compilers.

It can be invoked three ways:

By package, from the go tool:

    go vet package/path/name

vets the package whose path is provided.

By files:

    go tool vet source/directory/*.go
  :

オプションについて

解析する項目をオプションで指定できます。デフォルトでは -all が指定されており、すべての項目をチェックを実行してくれます。例えば、到達しないコードのみを見つける場合は -unreachable を使います。

$ go tool vet -unreachable ./alecthomas/
alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/resolve.go:161: unreachable code
alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/decode.go:123: unreachable code

他にポインタを数値に変換する際に unsafe.Pointer を使っていると警告を出せる -unsafeptr オプションがあります。

$ go tool vet -unsafeptr ./alecthomas/
alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/external.go:302: possible misuse of unsafe.Pointer

// コードは次のようになっています
if pc != 0 {
  fn = (*ssa.Function)(unsafe.Pointer(pc)) // indeed unsafe!
}

基本的にはすべての項目をチェックで良いと思いますが、必要に応じてフラグを指定して、必要な種類の項目・解析のみを実行してください。


go vet は標準的な、これまでの経験上問題と推測される点を指摘します。つまり指摘事項が必ずしも問題とは限りません。とは言えコンパイラでは問題がない内容でも指摘してくれるでしょう。内容に沿って修正することで、分かりやすいコードに仕上げられるでしょう。

Go言語用のコード解析ツールはCPUリソースを多く消費するものが多くあります。そのため、ローカルのPCで実行するには時間がかかってしまって煩わしく感じることがあるかもしれません。そんな際にはGitHubでPull Requestと連携してGo言語用解析ツールを実行する、コードレビューの自動化用のCIサービスであるSideCIがお役に立てると思います。SideCIはgo vetにも対応しています。無料トライアルがありますので、まずはお試しください

bundlerのoutdatedコマンドを使ってGemfileの古いライブラリをチェックしましょう

RubyプロジェクトではBundlerを使って依存ライブラリの管理を行うのが一般的です。ライブラリのインストールは簡単にできますが、その後適切に最新バージョンを追いかけないとセキュリティ上のリスクが発生することや、アップデートの差分が大きくなりすぎてアップデートしたくでも難しくなりがちです。

続きを読む

Railsを書き始めたばかりの人に特にオススメ。Rails流のコードの書き方を教えてくれる rails_best_practices を使ってみましょう

Ruby on Rails を使ったシステム開発では The Rails way や Rails 流と言った開発手法に沿って行うことで高い生産性を保持できるようになります。つまり流儀をきちんと学び、それに従って開発するのが大事です。

そうした流儀、ベストプラクティスをチェックできるツールが rails_best_practices になります。単に文章などで読むだけでなく、コードを静的解析して指摘するツールを使うことで、何が間違っていてどう書くべきなのかがはっきりと分かるようになるでしょう。

続きを読む

SideCIはレビューにフォーカスするため、負債カンバンを廃止しました

こんにちは。今日は私たちSideCIのメンバーにとって、また、ユーザの皆様にとって、大きなアナウンスをさせて頂きます。

2016年8月末より技術的負債を可視化し、その返済を支援する機能である「負債カンバン」を提供しておりました。本機能はベータ版として、Ruby on Railsプロジェクトに限定して提供しておりましたが、2017年6月28日をもって一度本機能をクローズさせて頂きました。

TechCrunchにて「自動コードレビュー「SideCI」が、技術的負債を可視化する「負債カンバン」提供開始」といった形でご紹介頂くなど、大きく反響があった機能ですが、少なくても直近1年ほどはコードレビューの自動化にフォーカスするため、一度クローズするという判断をするに至りました。

f:id:sideci:20170714195548p:plain 負債カンバンのイメージ

負債カンバンの成り立ち

SideCIを提供していく中で、「SideCIによるレビューの自動化によって新しく書くコードについては品質が担保されるようになった。一方で、過去に書いたコードがボトルネックになっている部分がある」といった課題をお聞きする機会が多くありました。そのため、その課題を解決するための機能を開発していこうという決定をし、製品内容の検討をはじめました。

技術的負債については、次のような声をよくお聞きしました。

  • 開発を進めるに当たってボトルネックになっている、技術的負債を返していきたい
  • 技術的負債がどこにあるか、どんなものがあるかはエンジニア個々人が定性的な感覚として持っているのみで、チーム内の共通認識はない

そのため、負債カンバンは次のような機能を解決策として盛り込みました。

  • 技術的負債を可視化する
  • 負債の深刻度合い、改修することによる投資対効果を判別し、優先度を付ける
  • 優先度をカンバン形式で表示することで、どこから取り組むべきかをわかりやすく示す

これらの機能によって、負債が可視化され、どこから返済していくべきなのかがわかりやすく、また、チーム内で共通の認識として持てるようになったと考えています。

負債カンバンの課題

一方で、負債カンバンには大きな課題が残っています。それは、技術的負債を返済するためのモチベーション、時間、その他色々な技術的負債の返済にあたって必要なプロセスを解消することが出来ていない点です。そのため、負債カンバンで可視化された技術的負債に納得感を持って頂ける方々、共通認識としての納得感(メンバー間の肌感のズレの少なさ)を持って頂くところまでは実現できているものの、実際の技術的負債の返済に貢献しているケースはまれでした。

可視化はあくまで第一歩に過ぎず、可視化したものを片付けていくための機能群が必要だと考えています。

一方で、SideCIはレビューの自動化に注力しており、レビューの自動化の点においてもたくさんのやるべきことが残っている中で、「レビューに時間がかかる」という課題とはまったく別の課題である、「技術的負債の返済が進まない」に対して商品開発を続けることは、適切ではないと判断致しました。

また、SideCIは生産性の向上への寄与を第一に考えており、レビュー自動化を提供しています。技術的負債は返済することは生産性の向上に繋がる点も大きくありますが、生産性の向上に寄与する技術的負債のみを機械的に発見することは難易度が高く、現状ではノイズが混ざってしまいがちです。

例えば、1行が300文字になっているコードを全て80文字にしたからといって、開発生産性が上がるわけではありません。インデントがタブとスペースが混同されているコードをどちらかに揃えても、生産性は上がりません。スパゲッティコードを解きほぐすリファクタリングは後々の生産性の向上に繋がりますが、とても難易度が高く、すぐに取り組めるものではありません。また、コードから読み解けない技術的負債が本質的な問題のこともよく有りますが、それはコードの静的解析から発見することは難しいです。

生産性に寄与する返済すべき技術的負債のみを見つけ、改善することは、2017年現代ではまだ難しいのです。

もちろん、私たちはそれに真摯に取り組むため、スパゲッティコードを見つけるのに役に立つ、Ruby言語でよく使われいるMetricFu内部の循環複雑度計算機saikuroに代わる新しい循環複雑度計算機のcycromaticを開発したりもしましたが、まだまだ道のりは遠いと考えるに至りました。

負債カンバンの今後の位置づけ

負債カンバンは2017年6月28日にクローズされました。いっときの間、負債カンバンの開発プロジェクトは凍結されます。 「技術的負債の返済が進まない」という課題の代わりに、「技術的負債が今後増えることをレビュー自動化によって防ぐ」ことに今まで以上にフォーカスします。

また合わせて、類似した別の観点として、「今はとっても急いでいるのでこのPullRequestに含まれる技術的負債は認識しつつもMergeする、あとで返済する」といったシーンで実際にあとで返済出来るようにする、新しいカタチの負債カンバンを作ることが1案としてあります。もしかしたらそれはカンバンではないかもしれませんが。

今後のSideCI

私たちはコードレビューの自動化を支援する、カスタムルールをRuboCopのCop追加などに比べて圧倒的に簡単に追加することが出来るQuerlyや、誤検知を恐れずにルールを書いていけるようにするための新WebUIである、アビシニアンモードの提供などを行ってきました。 現在では「アビシニアンモード」がSideCIの標準の挙動となり、従来のコメントを行うモードはオプションの機能に変更になりました。

このアビシニアンモードが標準になることで、SideCIに以下がデータとして蓄積されるようになりました。

  • どのような指摘が納得感があるか(実際に修正されるか)
  • どのような指摘が意味が無いか(無視されがちか)
  • 意味がないとしたらその理由は何か

これらを活用し、新しい機能群を提供していく事を計画しています。

おわりに

SideCIは世界で最も良いレビューの自動化サービスとして開発を続けて参ります。 ご利用いただき、ユーザの皆様方とともに、成長を続けていければ幸いです。

CoffeeScriptのコードを静的解析器のCoffeeLintにレビューしてもらおう

素のJavaScriptが書きづらいと感じる方は少なくありません。波括弧や普通の括弧が多く、読みづらいと感じてしまいます。そんな中作られたのが代替言語のCoffeeScriptです。CoffeeScriptは変換用のコマンドを介して素のJavaScriptになります。CoffeeScript自体はRubyやPythonから学び取った点の多い、可読性の高いシンプルな構文となっています。

続きを読む