訳者による『研鑽 Ruby プログラミング ― 実践的なコードのための原則とトレードオフ』の紹介

書籍情報

『研鑽 Ruby プログラミング ― 実践的なコードのための原則とトレードオフ』

polished-ruby-programming-ja-cover

著者・訳者
Jeremy Evans (著)、角谷信太郎 (訳)
発行日
2023 年 4 月 14 日 第 1 版 第 1 刷
ISBN
978-4-908686-17-7
出版社
ラムダノート
価格
3,600 円 + 税 (紙書籍)
原書
“Polished Ruby Programming” (Packt), 2021 年 7 月発行

訳者個人による本書のサポート用ウェブサイトを https://scrapbox.io/kensan-ruby/ に用意しています。 書籍の入手に関する補足や、書籍の内容について関連情報をまとめていく予定です。

本記事の最後に、Rubyist Magazine 読者に向けた本書のプレゼントのお知らせがあります。お見逃しなく!

当初の予定より 1 年程遅延しましたが、RubyKaigi 2023 に間に合いました……。

2021 年 7 月に原書が発行された Jeremy Evans 著 “Polished Ruby Programming” の日本語版の正式版の紙書籍と電子書籍 (PDF) を 2023 年 4 月 14 日にラムダノート社から刊行することができました。 2021 年 11 月 30 日に販売を開始したβ版から数えると約 1 年 5 ヶ月、翻訳作業用リポジトリの最初のコミット (2021 年 8 月 24 日) から約 1 年 7 ヶ月、Kaigi on Rails 2021 の講演 での「2022 年陽春刊行 (予定)」という予告から遅れること約 1 年、ようやく皆さまのお手元に届けることができました。 特に、関係者各位ならびにβ版の読者の皆さまには大変お待たせすることになってしまい恐縮です。 この場を借りてお詫び申し上げます。 それにしても、著者の Jeremy の登壇予定もある 5 月の RubyKaigi 2023 に間に合ってほんとうによかったです……。

Rubyist Magazine 読者の皆さんが手に取る価値のある一冊になっていると思うので、よろしくお願いします 🙏

本書の紹介

一般的に書籍を紹介するなら、「誰が、どんな内容の本を書いていて、どんな特色があるのか」といったことを書くのが順当だと思うのですが、本書に関しては訳者の私が改めて書くまでもない——ということを「訳者あとがき」に書いたので、ここでも引用します:

本書を楽しむためのコンテキストは、ありがたいことに、導入部分ですでに明らかにされています。原著者である Jeremy Evans さんの Ruby コミュニティにおける活躍ぶりとその評価は「本書に寄せて」で Ruby の言語設計者であるまつもとゆきひろさんによって語られていますし、本書の特徴は「日本の読者の皆さんへ」で原著者自身によっていみじくも説明されています。 それらを要約すると、本書はRuby コミュニティのリーダーをして「完璧超人か」と言わしめるような優れたプログラマーが、「読者が『すでに Ruby をよく知っている』ことを前提」として、「Ruby プログラミングの原則と、実装方針を決めるにあたって考慮すべきトレードオフ」を伝えるために執筆されています。 よって、訳者としてさらに付け加えることはもうほとんどありません (お手元の Ruby と一緒にじっくりと本文をお楽しみください)。[強調は引用者による]

(「訳者あとがき」と、引用文中で言及している「本書に寄せて」「日本の読者の皆さんへ」が本書の日本語版独自コンテンツで、いずれも全文を公開しています。購入の参考にしてもらえるとうれしいです。)

では、本書に「どんな特色があるのか」……これも出版元のラムダノートからの発売開始アナウンス が端的にまとめてくれているのでした。 いわく、「世界でいちばん Ruby を扱うのがうまいプログラマーの一人が、Ruby でプログラムを書いたことがあるすべてのプログラマーに向けて書いた、プログラミングにうまくなるコツが惜しげもなく言語化されている本(原文ママ)」というのはなかなか的を射ていると思います。 本書が「最先端の Ruby プログラマーが何を考えてコードを書いているかを知る最短の方法」であるという結びも良いですね。

この、本書で語られている、「Jeremy がどんなことを考えて Ruby のコードを書いているのか」を日本語版で端的にあらわすために出版チームで知恵を出しあって錬成した日本語副題が「実践的なコードのための原則とトレードオフ」です (ちなみに日本語版書名の『研鑽 Ruby プログラミング』はラムダノートの鹿野さんの発案だっと記憶しています)。 ただし、この「原則とトレードオフ」は「Ruby コミュニティとして広く共有されているもの」というよりは、あくまでも「著者である Jeremy にとっての原則とトレードオフ」の色合いが強くなっています ——といっても、20 年近い Ruby 経験のある、著名なライブラリの作者で、Ruby コミッター未就任の状態で RubyKaigi 2019 の Keynote Speaker をつとめて (直後に Ruby コミッターに就任しました)、Ruby のイシュートラッカー のイシューをトリアージしまくったことと Ruby 3.0 のキーワード引数の仕様の整理と実装を牽引した功績から RubyPrize 2020 を受賞した Ruby プログラマーが「Ruby のコードを書くときに大事だと考えていること」は一聴に値するはずですし、本文にもあるように「本書の対象読者は、自分自身の Ruby プログラミングを改善するために原則を学ぶことに関心のある、中級から上級の Ruby プログラマー」です。 中級から上級の Ruby プログラマーが自分自身の Ruby プログラミングを改善するために学ぶなら、当然、本書で語られる (Jeremy による) 原則とトレードオフの内容は自分自身で判断できるはずです (あるいは、本書の筆致に Jeremy がそのように読者を信頼しているということがあらわれているのかもしれません)。

本書の各章はおおむね独立した章になっているので、「中級から上級の Ruby プログラマー」であれば、興味のある章を好きな順番で拾い読みしていただいて問題ないと思います。 当然、冒頭から順番に読んでいただいて何の問題もありませんが、けっこうページ数も多いので、お目当ての章があるなら先取りしちゃってかまわないと思います。 読み進めていく際には、是非、本文の「Jeremy が Ruby のコードを書くときに考えていること」と読者の皆さんそれぞれが Ruby のコードを書くときに考えていることを比較しながら読んでもらえると、実りある読書体験になると思います。 日本の読者の皆さんに楽しんでいただけること以上に訳者としてのよころびはありません。

中級を目指したい Ruby プログラマー向けの本書の読みかた (の一例)

中級から上級の Ruby プログラマーは本書を好きに読み進めればよいですし、そうした人たちは言われなくても好きに読み進めそうな気もします。 しかし、中級プログラマーを目指したいものの、まだ自分自身の判断に自信を持てない Ruby プログラマーはそうもいかないかもしれません。 もちろん、冒頭から順番に読み進めていくという真っ当な方法もあるのですが、本書は第 1 章からして少々クセのある筆致になっています。 そこで、これはあくまでも「私が挙げる一例である」とお断りしたうえで、「第 1 章からちょっと刺激が強いな……」と感じてしまうような、「中級を目指したい Ruby プログラマー」向けの本書の読みかたの一例を紹介したいと思います。

中級を目指したい読者がまず読むとよさそうな 2 つの章

中級を目指したい読者がまず読むとよさそうな章として訳者個人としておすすめしたいのは、「第 I 部 Ruby プログラミングの基礎的な原則」と「第 II 部 Ruby のライブラリプログラミングの原則」それぞれの部の最終章です。具体的には次の 2 つの章です:

  • 第 14 章 ライブラリを最適化する
  • 第 6 章 コードを読みやすくフォーマットする

どちらを先に読んでもかまわないですが、読者にとってすぐに実利があると思うのは第 14 章です。 皆さんの普段の Ruby プログラミングにもすぐに応用できますし、本書を読み進めるうえでも役に立ちます。 第 6 章をおすすめする理由は、本書の第 I 部と第 II 部の残りの部分を読み進めるうえで念頭に置くとよさそうな洞察が得られるからです。この章を読むことで、「Jeremy が Ruby プログラミングと Ruby プログラマーをどのように捉えているか」という本書の世界観を、技術的な詳細にあまり立ち入らずに把握できます。

第 14 章 ライブラリを最適化する

本書ではライブラリとアプリケーションは厳密に使い分けられていませんが、その筆致からは Jeremy 自身の実績と経験を踏まえて、ライブラリのコードを書くことに重点がおかれていることがうかがえます。 本書で説明される内容は Ruby のアプリケーションコードを書く際に適用できる部分もありますが、世界的にも Ruby の第一人者であるささださんが本書のレビューで述べているように、まずは「書きやすく読みやすいコードが一番ですよ」。 ……という注意書きを述べたうえで、この章を最初に読むことをおすすめする理由は次のとおりです。

1.自分の書いたコードの実行性能の話題はいわゆる「入門書」では扱われないことが多い

書籍の目的に照らすと、取り扱う範囲外となるので、説明が割愛されることが多くなります (それはそう)。紙幅には限りがありますから、優先順位の問題ですね。

2. 本書で語られる「トレードオフ」の多くに実行性能の観点が含まれている

翻訳原稿を検索したところ、「実行性能」という単語は、第 10 章と第 11 章を除く 15 章の 162 箇所に出現していました。本書を読み進めていく上で「速い」とはどういうことなのかを手元で試せるようになっていると、本書をより深く楽しめると思います。

3. 「速い書き方」にはバージョン毎で差異があるので、自分で検証できる必要がある

Ruby の実行性能は Ruby 自体の進展に伴ない、リリースバージョンごとで「速い書き方」に差異があります。 そのため、自分の手元で検証できたほうがよいでしょう。 この考えかたについては、前掲のささださんの記事の「性能評価の難しさ」のセクションも参照してください。

事実、本書の「この書き方のほうが速い」という説明自体も、原書出版以降にリリースされた Ruby 3.1 や 3.2 では「速い書き方」が異なるケースがあったので、訳注で補足しています。 そして、そのフィードバックの多くは訳文のレビューに参加をお願いしたささださんから情報提供いただいたものです。 この場を借りて厚く御礼申し上げます。 本当にありがとうございました (みんなも感謝しよう! ……とはいえ、訳文の文責は依然として訳者にあります)。

4.オープンソース活動で実行性能を示すことは提案の説得力に効く

オープンソース活動において、機能提案や問題報告で実行性能を示すことは説得力を増すうえで大切な振る舞いです。 事実、性能評価は広くおこなわれているプラクティスですが、これまで日本語による解説で「定番」と呼べるようなものはなかったと思います (ググれば日本語も英語も記事はたくさん出てきます)。 ——が、状況は少し変わって、2023 年 2 月発行の『WEB+DB PRESS Vol.133』の西山さんの連載、「Ruby 3 標準添付ライブラリ紹介」でベンチマーク関連のライブラリが紹介されました (記事では benchmark-driver も紹介されています)。

本文ではベンチマークのためのツールの使い方だけでなく、ベンチマークとどう付き合っていくべきかという考え方もあわせて示しているので、中級を目指す読者の役に立つと思います。

とはいえ、そのうえでも注意点はある……けれど、やっぱり早めに読んでほしい

ただし、章の最後のセクション、「14.4 何もかもが遅い場合の対処法」は発展的な話題なので、初見では読み流してもらって問題ないと思います。 本文中では筆がのってきたのか、メソッドの引数定義で Jeremy は唐突に「Ruby パーサーをだましてエラーを回避します」といったテクニックを披露しはじめますが、まずは「お、おう……」という感じで読み流してもらって構いません (書きやすく読みやすいコードが一番ですよ!)。

一方で、このセクションのテーマ「何もかもが遅い場合の対処法」は実世界では起こりうる話でもあります。具体的には、これもまた発展的な話題ですが、2023 年 3 月に開催された鹿児島 Ruby 会議 02 での松田さんの講演「Rails 7.1 を n 倍速くした話」はまさに、Rails で「何もかもが遅い場合」に実行性能をどのように改善したかという取り組みを披露していました (あわせて読みたい:「RegionalRubyKaigi レポート (81) 鹿児島 Ruby 会議 02」)。

中級者を目指す読者が冒頭から順番に読み進めると、第 14 章に到達するのは少し後になるかもしれません。 書籍の外の実践にもすぐ応用できる内容なので、先に読んでおくとお得な章として紹介しました。

第 6 章 コードを読みやすくフォーマットする

Jeremy が本書を通じて語る、Ruby プログラミングにおける「実践的なコードのための原則とトレードオフ」は、Ruby の機能や文法だけでなく、Ruby 自体 (具体的には CRuby、MRI と呼び習わされている C 言語を中心とした実装) が動作する仕組みを読者がある程度理解していることを前提にしています。

中級を目指したい読者に向けて、本書を読み進めるうえでの理解を深めるための関連リソース を、サポート用ウェブサイトで多少は補足したいと考えています。 とはいえ、本書の技術的な詳細への立ち入り度合いは第 1 章から容赦がありません。 せっかくの「中級を目指したい読者」が取り組もうとしてくれたのに、序盤で振り切られてしまっては勿体ないと思っています。

そこでおすすめしたい章は、本書の残りを読み進めるうえで念頭に置くとよさそうな「原則とトレードオフ」についての考え方を、技術的な詳細にあまり立ち入らずに把握できる第 6 章です。

この章で扱うのは「コーディングスタイルの一貫性」です。プログラミング言語のレベルでコーディングスタイルの一貫性のトレードオフを判断している言語もありますが、Ruby はそうではありません。Ruby ではコーディングスタイルの一貫性はプログラマーが判断します。 なにしろ Ruby では、その普及と発展を目指す組織である一般財団法人 Ruby アソシエーションが情報を提供している「コーディング規約」に関するページの冒頭が「Ruby の正式なコーディング規約はありません」と力強く始まります (コーディング規約のページなのに!)。本書の言い回しを借りるならば、このことは「Ruby を好むようなプログラマーであれば特長と考えるでしょうし、そうは思わないプログラマーであれば他の言語を使いたいと考えるでしょう (第 5 章より)」。

一筋縄ではいかない Ruby のコーディングスタイルの一貫性について、Jeremy は「実践的なコードのための原則とトレードオフ」という観点からどのような見立てを持っているのでしょうか。訳者なりに簡単に整理してみます。

「実践的なコード」

  • わかりやすく、メンテナンスが容易である
  • チームのパフォーマンスを損なわない

「原則」

  • 一貫性のあるコードはわかりやすさに寄与する
  • チームにとって有意義だと思える構文の議論に集中する
  • コードにどんな意味があるのかはプログラマーが判断する

「トレードオフ」

  • 一貫性があるからといってわかりやすいコードであるとは限らない
  • コーディングスタイルの一貫性を心地よく感じる「哲人」にとっては、一貫性の欠如が「生産性」に強い悪影響を及ぼすかもしれない
  • コーディングスタイルの一貫性を味気なく感じる「詩人」にとっては、一貫性の強制が「仕事の楽しみ」を奪うかもしれない

「コードにどんな意味があるのかはプログラマーが判断する」というのはコードの一貫性の話題に限りません。 残りの章も読み進めていくうえでも (さらに言えば他の書籍を読む際にも)、念頭に置いてもらえたらと思います。

また、ここにまとめた「原則とトレードオフ」はあくまでも Jeremy が示す、Jeremy の観点からの「原則とトレードオフ」です。 他の Ruby プログラマーにはそれぞれの「原則とトレードオフ」があることでしょう。 「研鑽の積まれた (polished)」状態というのはそういうものだと思います。 たとえば、RubyKaigi 2022 での大場さんの講演、「The Better RuboCop World to enjoy Ruby」では「コーディングスタイルの一貫性」について、本書とは異なる視点から「原則とトレードオフ」が語られました。 「詩人」「哲人」のような定見を持つに至らない練度のメンバーも含めたチーム開発では「一貫性」をどのように考えればよいのでしょうか (「……そうはいっても現実は厳しい」のは確かだが、それでも Ruby の「たのしさ」を失わずにいるには?)。

ここでも Jeremy と大場さんのどちらかが「正しい」というわけではありません。それぞれの状況に応じた適切なトレードオフがあるだけなのです (要はバランス……!)。

Jeremy は Ruby プログラミングと Ruby プログラマーをどのように捉えているか

他にもこの章の Jeremy の「原則とトレードオフ」には興味ぶかい点があります。 それは、「哲人」への配慮を見せながらも「(詩人は)『詩人』であるがゆえに、さまざまなスタイルでコードを読み書きできる」(それが一貫性を強制されるものであっても)、と詩人に対する信頼のようなものが垣間見えるところです (「Ruby を好むようなプログラマー」には「詩人」も多そうです)。 訳していた当時は、「つまり詩人はトレードオフフリー……ってこと??」と思ったりしたものです。

ここに限らず、本書では Jeremy は全編を通じて Ruby そのものと Ruby プログラマーへの信頼を隠しませんし、なぜそうなのかをあまり説明しません。 これは訳者のような「Ruby 好き」にとっては「ですよね〜」という強い共感ポイントなのですが、読者によっては説明の足りなさにもどかしさを感じるかもしれません (「Ruby をキメると気持ちいい(RubyKaigi 2008)」ので仕方ない……)。 しかし、本書の対象読者として想定されている「自分自身の Ruby プログラミングを改善するために原則を学ぶことに関心のある、中級から上級の Ruby プログラマー」とはそうしたことが明示的に解説されなくても「わかる」プログラマーのことなのかもしれません。あるいは、Jeremy は読者にそうしたことが「わかる」存在であることを期待しているのかもしれません (これは推測です)。

この章を通じて「Jeremy が Ruby プログラミングと Ruby プログラマーをどのように捉えているのか」という本書の世界観の片鱗をあらかじめ掴んでおくことは、本書の残りを読み進めていく際に、技術的詳細のなかで迷子になることを防ぐ役に立つと思います (たぶん……)。

次はどの章を読むとよさそう?

第 14 章と第 6 章に目を通したら、その後は冒頭から順番に読み進めていってもらっても構いませんし、(中級から上級の Ruby プログラマーのように) 自分が興味のある章を好きな順番で読み進めていってもらってもまったく問題ありません。

訳者個人としておすすめしたい章は他にもたくさんありますが、この記事で紹介した 2 章に次ぐ章をひとつ挙げるならば、「第 4 章 メソッドと引数」でしょうか。 Jeremy 自身が Ruby 3.0 のキーワード引数の仕様の整理に取り組んだだけあって、特にキーワード引数について詳細に解説してくれています。 引数の種類の説明のスタイルも独特なので、ご自身の理解と照らして読み進めてみるのも興味ぶかいと思います。 また、この章では、ruby2_keywordsという互換性のための機能についても丁寧に説明されています。 ruby2_keywordsは、訳注で補足もしているように、Ruby 3 時代を迎えた現代にあっては、これから書き下ろす Ruby コードではその出番も減っていくと思いますが、既存のライブラリのコードを読んだり、メンテナンスする局面では出会うこともある機能です。 その考え方は理解しておくと役に立つと思います。

他におすすめの読み方: 先達の力を借りる

米国在住 (投稿当時) の Yuki さん (これは Ruby コミッターの西嶋さんでは?) が Amazon.com に投稿している、書の原書のレビュー が示唆に富んでいたので紹介します。

For beginners, I’d recommend finding an advanced Ruby programmer for your network that you can ask questions to. It may take time to understand even a short snippet of code, but long-term, the knowledge you gain from this book will be valuable.

(引用者訳: 初学者の皆さんには、質問できる Ruby にくわしいプログラマーをご自身の周囲で見つけることをおすすめします。文中の短いコード片を理解するのにも時間がかかるかもしれませんが、長期的には、本書から得られる知識はかけがえのないものになるでしょう)

職場の同僚や地域コミュニティの仲間、オンラインでのつながりなど、自分よりも研鑽が進んでいそうな Ruby プログラマーに質問したり、一緒に本書を読んだりするのも多角的な視点からの洞察が得られそうです。 いわゆる読書会や輪読会のような形式で読み進めていくのもよいかもしれません。 もし、質問する相手が周囲に見つからない場合は、ruby-jp の Slack や、日本語版サポート用の Discord サーバー で質問してみるのもよさそうです。 最近では「わからない単語を ChatGPT に聞きながら読む」という戦法もあるようですが、回答の確からしさには十分お気をつけください。

おわりに

「中級を目指したい読者」に警戒心を抱かせるような紹介の仕方になったかもしれませんが、「技術書は気に入った一節を見つけるだけでいい」という名言もあります。 訳者のお気に入りの一節はをここでひとつだけ紹介するなら「第 14 章 ライブラリの最適化」の文中にある「Ruby のように動的で使いやすくプログラマーフレンドリーな言語で高速なのは Ruby だけ」です。 皆さんにも、まずは気楽に読んでもらって、気に入った一節を見つけてもらえるとうれしいです。 本書の感想を SNS に投稿する際には、#研鑽 Rubyのハッシュタグを添えてもらえると、訳者がエゴサーチしやすいので助かります (見つけた「感想」はサポート用ウェブサイトのインターネット上の記事など のページに記録しています)。 皆さんの感想が読めることをたのしみにしています。

読者プレゼントのお知らせ

出版元であるラムダノート社さまのご厚意により、『研鑽 Ruby プログラミング ― 実践的なコードのための原則とトレードオフ』の紙書籍と PDF を 3 セット、ご提供いただけることになりました。 そこで Rubyist Magazine 読者のなかから3 名の方に、1 セットずつプレゼントしたいと思います。 興味を持たれた方は、下記リンク先の応募要件に目を通していただいたうえで、応募締切日までに必要事項をフォームに記入、送信ください。 Rubyist Magazine 読者の皆さまからのご応募をお待ちしております!

(応募多数の場合は抽選となります。また、当選者の発表は書籍の発送をもってかえさせていただきます)

応募締切 (とその後の抽選) から発送まで待てない方は是非、紙書籍を買うと電子書籍版の PDF がついてくるラムダノート社の直販ページ から本書をご購入ください (Kindle 版の販売予定はありません)。 また、紙書籍の購入金額との差額等で電子書籍版をお求めになることはできません。 各種オンライン書店や実店舗でお求めの場合はご注意ください。

緊急告知: RubyKaigi 2023 の会期中に会場近辺で訳者が本書を手売りします!!

Rubyist Magazine 0062 号のリリース時点では詳細未定になりそうですが、訳者個人として本書を持ち込んで、若干冊数の対面販売することを計画しています。詳細は決まり次第、本書のサポートページでお知らせします。

ちなみに RubyKaigi 2023 では著者の Jeremy も登壇予定 ですし、「本書に寄せて」を寄稿いただいたまつもとさんも (当然ですが基調講演で) 登壇予定 です。 訳者である私、かくたにもRubyKaigi 2023 Team の一員 として会場に出没します (RubyKaigi の会期前後に松本で訳者のサインが欲しい方は、先に Jeremy のサインをもらってください 🙏)。 本書の関係者のサインをまとめて獲得できる絶好の機会です。是非ともご活用ください!

著者について

かくたに

個人事業主。一般社団法人日本 Ruby の会理事。GitHub: @kakutani, Twitter: @kakutani。るびまがまた発刊されるようになってとても嬉しいです。今回のるびまへの寄稿は 0041 号の EuRuKo 2012 参加レポート (を、2013 年に書いた) 以来、実に 10 年ぶりでした。かつては自分の名乗りがひらがなで「かくたに」だったことを久びさに思い出しました。『研鑽 Ruby プログラミング』買ってくれ!!!