Effective Ruby image with misaki. (image by @BookMisaki)

Effective Ruby を読みました。この記事では、Effective Rubyがどのような本なのかという紹介と、僕がこの本を読んで得た感想について書きます。

Effective Rubyとはどのような本か

Effective Rubyは、Rubyの中級者〜上級者向けに書かれた、Rubyをよりよく使うためのTips集のような本です。しかし、単なるTips集ではなく、Rubyの比較的高度な機能を解説しつつも、その機能のpros/consや、使うときの注意点などを議論しています。

例えば、例外処理で使うretryという命令があります1resuceブロックの中にretryを書くと、beginブロックの頭からもう一度処理を実行してくれます。

begin
  do_something_may_raise_exception
rescue e => Timeout::Error
  sleep 5
  retry # beginブロックに戻ってやりなおす
end

これは、APIサーバーが一定の割合でタイムアウトエラーを返すような場合に便利です。一定時間待てばAPIサーバーが復旧するということがわかっていれば、一定時間待ってリクエストを送信し直すことで処理を継続できます。 しかし、少し考えるとわかりますが、このコードは容易に無限ループを生成します。例えば、APIサーバーが完全に落ちてしまって、時間をおいても復旧しない場合です。

無限ループを生成すると兵庫県警に逮捕されてしまうので、retryを使う場合はリトライ回数に上限を設け、無限ループを回避するべきです。

retry_count = 0

begin
  do_something_may_raise_exception
rescue e => Timeout::Error
  if retry_count < RETRY_LIMIT
    retry_count += 1
    sleep 5
    retry
  else
    raise Timeout::Error, "Timeout #{RETRY_LIMIT} times."
  end
end

こうすることで、無限ループを回避しつつリトライを行うことができます2

このようにEffective Rubyでは、Rubyの詳しい機能について説明しつつも、その機能のpros/consや、使う際の注意点もしっかりと議論されています。この本を読むことで、自分が書くRubyのコードをより良くすることができるでしょう。

感想

Effective Rubyで取り上げられているトピックについて、以前から知っていたものも結構多いなと感じました。例えばメタプログラミングの章は知っていることばかりだったし、コレクションやテスティングの章もだいたい知っていました。僕は4年間もRubyを書いているので、これは当たり前のことではあります。逆に4年間もある特定の言語を書いていて、入門書レベルの知識しかないという人はいないと思います(個人の感想です)。

一方で、4年間もRubyを読み書きしているのに、知らないことというのはまだあるものなのだなとも思いました。例えばretryもそうですし、throwとかの命令や Perl風のグローバル変数 、あとはガベージコレクションやファイナライザなども知らなかったです3。それに加えて、なんとなく知っていたが細かい挙動を把握していなかったものというのも結構あって、例えばextendincludeprependの違いとか、lambdaprocの違いとか、protectedsuperの挙動とかは、雰囲気で理解していたなあと思いました。

今になって考えてみると、僕はRubyを学び始めるにあたって、入門書とかチュートリアルのようなものを読んだことがないです。初めてRubyを書いたときは、バイト先の先輩のコードを真似してコードを書いていました。そして、コードレビューをしてもらったりRubocopに怒られたりして、いつの間にかRubyが一通り書けるようになっていました。その後RubyのOSS開発に参加する機会があって、コードリーデイングを通して割と高度なRubyのプログラムの書き方を学んだり、メタプログラミングRubyを読んだりしたりしましたが、Rubyを 体系的に 学んだことが実は一度もありませんでした。

Effective Rubyのトピックを知っていたり知らなかったりしたのはそういうところに原因があって、つまり今までつまみ食い的に読み書きしたことがあることについては知っているし、そうでないことについては全く知らなかったということでしょう。今回Effective Rubyを読んで、知らないことがまだまだあるなあと思い、もっとよくRubyを書けるようになれるぞという気持ちになりました。また、一度厚めのRubyの入門書をざっと読むなどして、知識の抜けや漏れがないかどうか確認したほうが良さそうだという気持ちになりました。

この本についてはもっと早い段階で読んでおきたかったという気持ちがあります。Rubyが一通り書けて、Ruby on Railsで1からWebアプリが作れるようになったよ、というぐらいのレベル感の人が読んでおくと、非常に大きな学びが得られるだろうなと思いました。

参考

  1. 僕はRubyを書いて大体4年めぐらいなんですが、retryのことを知りませんでした。自分が例外処理を書かない人間であるということがバレてしまいますね… 

  2. retryを使う際の注意点は他にもあるのですが、本の丸写しになってしまうのでここでは避けます。詳しく知りたい人はEffective Rubyを買ってください。 

  3. GCの存在自体は知っていたが、その動作とかは知らなかった。