pockestrap

Programmer's memo

RubyKaigi 2017 CFP - Writing Lint for Ruby

なにこれ

RubyKaigi 2017 に submit した CFP です。この CFP は採択されました

この CFP を書く時に、RubyKaigiのCFPへの応募例 #rubykaigi - ククログ(2017-06-06) などを参考にしていました。
そのため、私が書いた CFP も公開して、少しでも来年の RubyKaigi / 他のカンファレンスへの proposal を出す際の参考になったら良いと考え、公開することにしました。
(CFP を出したのははじめてなので、あまり参考にはならないかもしれませんが)

なお、RubyKaigi で話す内容の細かいところは CFP とは変わってくると思います。


以下 CFP の内容

Title

Writing Lint for Ruby

Abstract

This talk describes how to write Lint for Ruby program.

Lint finds bugs from code automatically. So, if you can write Lint, you can reduce bugs from your code automatically. This talk includes the following topics.

  • Implementation of existing Lint such as RuboCop and Reek.
  • How to create new Lint or add a new rule to existing Lint yourself.

Details

このトークでは、Lintを知らない/知っている/使ったことがある人が、「Lintを書いてみよう」と思えるようになることを目的とします。 具体的には、Rubyを書いていてバグを見つけた時、

  • そのバグはLintで防ぐことが可能なのか / 簡単なのか
  • どのようにLintを書けば、そのバグを防ぐことが出来るのか

を判断でき、可能であればLintを書いてそのバグを防げるようになることを目的とします。

参加者には Ruby を日常的に書いている人を想定しており、前述の通り Lint に関する経験は特に問いません。 そのため、Lintのコードを実際に書いている人には物足りない内容になると思います。

このトークでは、「Lintを書いてみよう」と思えるようになるため、以下の概要について述べます。

  • Lint とは何か
    • Ruby 用のLint (RuboCop 等)について、何をするツールなのかを解説します
    • 「コードを静的に解析して、バグとなりうるコードを見つけるツールである」などを実例を交えて解説します。
    • 実装の内部には触れません。
  • Lint では何が出来るか / 何が出来ないか(難しいか)を解説します。具体的には以下についてです。
    • Lint は変数の動きを追いません(実施するにはコストがかかるため、RubyのLintの多くはそれを行っていません)
    • Lint は解析対象の Ruby コードを実行しません
      • 実行しないとわからないことがあります。
      • テストを書いたほうが(実際にコードを実行できるため)より適切な場合があります。
  • Lint はどのように書かれているかを解説します。
    • Ruby のコードを AST として扱うこと
      • ripper や parser gem によってパースされ、ツリー状になったコードを扱うことについて解説します
    • AST を辿っていく方法について
      • 具体的に RuboCop の例をとりあげます。
      • RuboCopがどのようにASTを辿り、問題のあるコードを検出しているかを解説します。
    • Lint を実際に作る方法について、複数の観点から解説します
      • RuboCop のルールを足す例
      • 新たにツールを作る例

Pitch

Lint を使うと、バグになりうるコードを自動的に検出することが可能です。ですが、Lint を開発している人は少ないのではないでしょうか? Lint を開発出来るようになることで、より多くのバグの原因を自動的に見つけることが出来るようになり、よりRubyを安心して書くことが出来るようになります。 このトークを通じてより多くの人がLintを書くようになり、より安心してRubyを書くことが出来るようになることを目指します。

また、私は代表的なRubyのLintであるRuboCopに100以上のコミットをするなどしており、Lintの内部構造を理解しています。そのため、私はこのトピックについてトークをするのに適切な人間だと思います。