Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

『Polished Ruby Programming』(Jeremy Evans著)を読みました

追記

『Polished Ruby Programming』はその後日本語訳がリリースされました。

『研鑽Rubyプログラミング』は英語版を買った人も買うべき

こんにちは、hachi8833です。夏休み課題図書というわけではありませんが『Polished Ruby Programming』を2回読み、Webチーム内でも発表しました。

既にjnchitoさんが書評記事を書いてくださっているので、なるべく違う切り口で、かつネタバレにならないように書いてみようと思います。

なお、本書は『研鑽Rubyプログラミング』(仮題)として翻訳が進行中です。

参考: 研鑽Rubyプログラミング β版 – 技術書出版と販売のラムダノート

著者について

Jeremy EvansさんはRubyコミッターであり、Railsにもコントリビューションしていた時期もあります。OpenBSD版のRubyのメンテナーでもあります。

jeremyevans/openbsd-ruby-ports - GitHub

昨年末にRuby Award 2020を受賞した直後のインタビュー記事を以下でも読めます。また、RubyKaigi Takeout 2021にもスピーカーとして登壇が決まりました。

参考: Interview with Jeremy Evans, OpenBSD Ruby ports maintainer by Evrone

私が最初にJeremy Evansさんを知ったのは2019年のRubyKaigiでトリを務めたのを見たときでした(以下の動画)。特濃のキーノートスピーチが忘れられません。今チラ見すると本書との共通点があちこちにあるように思えました。

Jeremy Evansさんは以下のgemを手掛けていることで知られています(リポジトリには他にも多数のgemがあります)。Sequelは引き継ぎでメンテナンスを行っているそうです。本書でもSequelとrodaは頻繁に登場しています。

jeremyevans/sequel - GitHub

jeremyevans/roda - GitHub

jeremyevans/rodauth - GitHub

jeremyevans/ruby-warning - GitHub

jeremyevans/erubi - GitHub

読み方

ちなみにKindle版を買いました。

1回目はKindleでマーカーを付けながらざっと駆け抜け、2回目はサンプルコードを動かしながらDocbaseにmarkdownで自分用に17章をエイヤでまとめました。

これはあくまで自分用に作ったドッグフーディング的なまとめであり、翻訳ではありません。当然ながら非公開なのであしからず。

書籍のサンプルコードは以下のリポジトリで公開されています。当然ながら書籍がないとさっぱりわかりませんが、読み進めながら動かしてみたところすべて問題なく動きました。

PacktPublishing/Polished-Ruby-Programming - GitHub

同書の特徴

Rubyに特化した中小規模ライブラリ設計の全方位的な知見を網羅

週刊Railsウォッチでも言及されていたように、Rubyに特化した最適なコードの書き方や知見が盛りだくさんです。Railsアプリのユーザーコードよりは、ライブラリの作成やメンテナンスを対象とした中規模または小規模の設計が中心という印象です。

参考: 週刊Railsウォッチ(20210810)『Polished Ruby Programming』

プロのRuby開発者に既に知られている内容もそれなりにあるかと思いますが、Rubyのコアのパフォーマンスを知り尽くした人が網羅的かつ統一的に書いているのがありがたい点です。

情報が新しい

Ruby 3.0をベースにしているので情報が新しく、過去バージョンのRubyとの違いについても必要に応じて言及されています。

特に、Ruby 2.7からRuby 3.0にかけて行われたキーワード引数の改修は著者が大きく貢献している部分だけあって、Ruby 3.0がリリースされてから満を持して本書を執筆したのだろうと想像しています。

参考: プロと読み解く Ruby 3.0 NEWS - クックパッド開発者ブログ

Rubyの言語設計思想をベースにしている

同書の解説は、Ruby言語が「何を重視していて」「何を重視していないか」を出発点としていると感じました。

たとえばRubyではローカル変数が他のインスタンス変数やクラス変数などより重視されている理由や、Rubyのハッシュが[]のキーが無効の場合にnilを返す理由、シンボルと文字列の違いや適切な使い分けについての解説などのさまざまな知見を、Rubyの言語設計思想と特性を踏まえて詳しく説明しています。

最適化の知見が豊富

全般に、Rubyコードの高速化はいかにオブジェクトの生成を避けるかが大きなポイントと感じました。ただしその都度、最初は最適化よりもきれいな設計を目指すべきとも述べられています。「最適化を急ぐな」「今のRubyは最適化しなくてもたいてい速い」は再三強調されています。

スコープゲート

本書でスコープゲートという用語を今頃知りました。どうやら「メタプログラミングRuby」でも使われているようです。

参考: passingloop • Ruby の class_eval でスコープゲートを乗り越えるもの、乗り越えられないもの

メタプログラミングとDSL

Rubyは他の言語と異なり、通常のプログラミングとメタプログラミングの間に大きな差はないと説いています。

そしてメタプログラミングやDSLはどうしても抽象度が高くなり、それがよい抽象なのか悪い抽象なのかを見分けるのは簡単ではないとしています。本書の目的のひとつが、そうした抽象の良し悪しを見分けられるようになることだそうです。

プラグインシステム

プラグインシステムの書き方についても1章を割り当てていて、可能ならライブラリにプラグインシステムを導入することを推奨しています。著者のRodaやRodauth gemはプラグイン方式を取り入れているので、その経験が生かされているのでしょう。

テストとリファクタリング

テストとリファクタリングにも1章ずつ費やしていて、同じく力が入っています。プロファイリングとベンチマークを繰り返しながら達人がコードを次第にきれいにしていく様子が手に取るようにわかります。

「カバレッジ100%に意味はない」という記述も印象的でした。

コードのスタイル

コードのスタイルについても1章を割いています。プログラマーを大きく「詩人タイプ(いろんなスタイルで書きたい派)」と「哲学者タイプ(スタイルを揃えたい派)」に分けて論じているのが面白い点です。

SOLID原則やデザインパターン

よく言われているように、本書でもRubyではJava方面由来のSOLID原則やGoFのデザインパターンはそのまま適用できるとは限らないと説いています(オープン/クローズ原則はRubyのコアライブラリでも完全に無視されているなど)。

デザインパターンにも1章を費やしていますが、扱われているのはJavaでおなじみのGoFのデザインパターンよりはるかに少ない8個に絞り込まれています。Visitorパターンについても、訪問先にメソッドを追加しない修正版Visitorパターンを紹介しています。GoFにないObject Poolデザインパターンを本書で初めて知りました。

参考: デザインパターン (ソフトウェア) - Wikipedia
参考: Object Pool Design Pattern - GeeksforGeeks

「デザインパターンはRubyではさほど重要ではないが、それでも知っておくと役に立つ」という記述が印象的でした。なお本書には「継承vsコンポジション」のようなトピックはありません。

Web

Webについては、最後の3章でデータベース選びと設計、フレームワーク選びやORM選び、セキュリティなどについて解説しています。

フレームワークはRailsだけではなく、Sinatra、Grape、そしてRodaを扱っています。Rodaは著者自ら作ったフレームワークだけあって解説にも力が入っており、ルーティングツリーとアクションが一体化した独特の作りと高速性に興味を惹かれました。

読んでみて

『Polished Ruby Programming』は、Rubyらしい(idiomatic)素直で読みやすい書き方が大半を占めている印象です。あっと驚く黒魔術やメタプロも少し登場しますが、その都度警告しています。

ベテランらしく、設計の解説ではトレードオフ(主にパフォーマンスときれいな設計のバランス)がしばしば強調されています。「どちらの設計がよいかは場合による」がほとんどで、「常にこう書くべき」「こう書いておきさえすればよい」という書き方は少なく、自分好みの設計を出しすぎないよう可能な限り配慮しているのが伝わってきます。それでも著者の設計の好みがほんのりと感じられるのも面白い点です。

RuboCopのコードサイズ制限については珍しく「悪影響しかない」とやや強めの口調でした。気持ちわかります。

英語についても、あいまいになりやすい代名詞を避けて読みやすく書かれている点に好感が持てました。その分1つの文が長めで係り結びも増えますが、おそらく機械翻訳でかなりスムーズに翻訳できると思います。著者のドキュメンテーション能力の高さを実感しました。個人的な趣味ですが、アメリカンジョークがほとんどない点も好きです。

Sandi Metz『オブジェクト指向設計実践ガイド』はRuby向けのオブジェクト指向設計を学ぶ本として有名ですが、『Polished Ruby Programming』はSandi Metz本とはだいぶ趣が異なるように思いました。

  • Sandi Metz本はオブジェクト指向ありきでパフォーマンスにはあまり言及せず、Rubyに限定しない印象
  • Jeremy Evans本はRuby言語の設計思想と内部パフォーマンスを土台にしていて、オブジェクト指向やデザパタは必ずしも主役ではない印象

『Polished Ruby Programming』にはC言語のコードはまったく登場していません。おそらくRuby内部のC言語にまで言及したらきりがなくなってしまうからだろうと想像しました。なお、以下の『Rubyのしくみ』はRuby内部のC言語コードがビシバシに登場します。本書を読んでおくと役に立ちそうです。

本のつくりとしては、Kindleで読んだせいなのか、地の文とコードサンプルがなぜか同じフォントになっている点がちょっと読みづらく感じました。また、章内の見出しはほとんどがh2h3レベルでしたが、h4レベルの見出しまでブレイクダウンされていたらさらに読みやすくなりそうです。


Polished Ruby Programmingより

以下のkakutaniさんのgistにもあるように、本書には類書がほとんどないのも特徴です。

参考 Polished Ruby Programming翻訳査読書(のようなもの)

jnchitoさんのチェリー本を卒業してRubyやRailsのコードを実務で書くようになった中級者以上におすすめだと思います。また、他の言語の経験者がRubyを詳しく知るにも向いていそうです。ライブラリ作者がどんなことを考えているかを知るのに絶好の本です。

私の血となり肉となるにはだいぶ時間がかかりそうですが、『Polished Ruby Programming』は私にとって「繰り返し読みたい本」となりました。Docbaseにまとめたおかげでいつでも自分用に検索できるのがうれしい😂。

JavaScriptでこういう本があったらぜひ読みたいのですが、どなたかご存知でしょうか。



CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。