Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Polished Ruby Programming翻訳査読書(のようなもの)

"Polished Ruby Programming" by Jeremy Evans

-- Build better software with more intuitive, maintainable, scalable, and high-performance Ruby code

「Rubyの磨きかた -- わかりやすくてメンテナンスしやすい、スケール可能で高性能なRubyコードでソフトウェアを上手につくろう」みたいな感じ?

https://www.packtpub.com/product/polished-ruby-programming/9781801072724

TL;DR

入門から先にステップアップするための、メンテナンス可能なコードを書けるようになるためのRubyのintermediateレベルの書籍。著者のJeremy EvansはRubyコミッターであり、Ruby本体の実装改善や、数多くのライブラリ作成・メンテナンスなど貢献が大きい人物。RubyKaigi 2019のkeynote speakerであり、Ruby Prize 2020の受賞者でもある。受賞理由は「Ruby3のリリースにともなう仕様策定の議論やコミュニティの調停、実際の開発にいたるまで驚異的な活動量と熱意をもって取り組んでいる」。技術的な信頼と実績は抜群。

書籍の内容は、組み込みクラスの活用から独自クラスやライブラリ、DSLの設計といったRuby活用だけでなく、テストやリファクタリング、パフォーマンスのプロファイリング、Webアプリケーションフレームワークの選定といったエンジニアリングプラクティスまでをカバーしている。初級の次を目指したい読者が適切な知識を学ぶのに最適な書籍である。本書がめざましいものであると考えられる点は主に次の通り:

  • Ruby3での変更点を第一人者の観点から解説している(はず)ので、追随を許さない
  • サンプルや事例が、自身の「驚異的な活動量」を踏まえたものになっている(はず)ので、追随を許さない
  • 「驚異的な活動量と熱意」により、Rubyコミッタはもちろん、日本のRubyコミュニティでも既に一定の知名度がある

本書について

The most successful apps become more difficult to maintain over time as the codebase increases in size. Often, the source code reaches a point where a rewrite is required because the application can no longer be effectively maintained. Ruby allows you to enjoy programming by making it as simple as possible to build maintainable and scalable apps. Polished Ruby Programming provides you with recommendations and advice for designing Ruby programs that are easy to maintain in the long-term.

どんなにうまくいったアプリケーションでも、コードベースが大きくなるにつれてメンテナンスしづらくなっていきます。多くの場合、ソースコードの書き直しを迫られるに至ります。アプリケーションを効果的にメンテナンスし続けられなくなるからです。Rubyであればメンテナンスもスケールもできるアプリケーションを限りなくシンプルに実現できるので、プログラミングを楽しめます。本書は、長期間にわたってメンテナンスしやすいRubyプログラムを設計するための推奨事項やアドバイスを提供します。

This book takes you through implementation approaches for many common programming situations, the trade-offs inherent in each approach, and why you may choose to use different approaches in different situations. You will start by learning fundamental Ruby programming principles, such as correctly using core classes, class and method design, variable usage, error handling, and code formatting. Later chapters cover higher-level programming principles, such as library design, use of metaprogramming and domain-specific languages, and refactoring. Finally, you will learn principles specific to web app development, such as how to choose a database and web framework, and how to use advanced security features.

本書では、よくあるプログラミングの状況に応じた実装方針、それぞれの方針に伴うトレードオフ、なぜ状況が異なれば方針も異なる理由を解説します。まずは Rubyプログラミングの基本原則から始めます。組み込みクラスの正しい使い方、クラスやメソッドの設計、変数の使い方、エラーハンドリング、コードの整形。続く後半の章では高レベルなプログラミング原則を扱います。ライブラリ設計、メタプログラミングやドメイン特化言語(DSL)、リファクタリング。最後に、Webアプリケーション開発特有の原則を学びます。データベースやWebフレームワークはどう選ぶのか。高度なセキュリティ機能はどう使うのか。

By the end of this Ruby programming book, you’ll have gained the skills you need to design robust, high-performance, scalable, and maintainable Ruby apps.

本書を読み通せば、堅牢、高性能、スケール可能で、メンテナンスしやすいRubyアプリケーション設計のスキルが身につくはずです。

著者について

Jeremy Evans is a Ruby committer who focuses on fixing bugs in Ruby, as well as improving the implementation of Ruby. He is the maintainer of many popular Ruby libraries, including the fastest web framework (Roda) and fastest database library (Sequel). His libraries are known not just for their performance, but also for their code quality, understandability, documentation, and how fast any bugs found are fixed. For his contributions to Ruby and the Ruby community, he has received multiple awards, such as receiving the prestigious RubyPrize in 2020 and being chosen as a Ruby Hero in 2015. He has given presentations at over 20 Ruby conferences. In addition to working on Ruby, he is also a committer for the OpenBSD operating system.

Jeremy EvansはRubyのコミッターです。Rubyのバグ修正と実装の改善に力を入れています。最速のWebフレームワーク(Roda)や最速のデータベースライブラリ(Sequel)など、数多くの著名なRubyライブラリのメンテナーでもあります。彼のライブラリはその性能だけでなく、コードの品質の高さやわかりやすさ、ドキュメンテーション、バグ修正の素早さでも知られています。彼のRubyとRubyコミュニティへの貢献は、いくつもの賞で評価されています。2020年にはRubyPrize、2015年にはRuby Heroを受賞しました。彼は20以上のRubyカンファレンスで講演実績があります。彼はRubyに加えて、OpenBSDのコミッターも務めています。

(JeremyはRubyKaigi 2019のkeynote speakerでもあります)

内容

https://github.com/PacktPublishing/Polished-Ruby-Programming を眺めた。2021/05/13の12:00頃に閲覧。 Packt社から、6/14に評価目的でebookの提供を受けた。

読みながらのメモ

  • 対象読者: Rubyの言語機能やライブラリを使ったプログラミングは可能な段階。ライブラリの作成経験は豊富ではない。知らない機能等について、自分で調べることができる。

PartI

組み込みクラス、独自クラス、変数、メソッド、例外、コードフォーマット。命名規約。 言語の構成要素をボトムアップに積み上げていく流れだが、羅列的なことはしていない。よく遭遇しそうな利用シーンを想定でも判断基準を提供する。根拠は、自身の豊富なRubyプログラミング知見と、言語処理系の設計意図や実装の実態、歴史的背景を踏まえている。折に触れてパフォーマンスの話が出てくるが、著者の個性かな…極限に近い状況での話題も多いので、振り回される人が出ないか心配だけれど、まあ心配しても仕方ないか。

判断が必要な状況とその解決策、そのトレードオフ、別の解決策や別の問題状況…というかたちでストーリーが展開されていくので、読み進めるのは楽しい。言葉づかいの端々に「Rubyのことが好きなんだなー」というのがうかがえて(それはそう)、書き手として信頼できる(それはそう)。

話の展開は普通にパラグラフライティングになっているので、読み進めるうえでの違和感はない。論拠を示すソースが少し欲しいところもあるけれど、訳注で補えばよさそうな範囲。

Chapter1

  • Getting the Most out of Core Classes - When to use core classes
  • 組み込みクラスを最大限に活用する - 組み込みクラスの使いどころ

true/false/nil, Array, Hash, Set, Numeric, Symbol, Struct とかそんな感じ?

Chpater2

  • Designing Useful Custom Classes - Learning when to create a custom class
  • 便利な独自クラスを設計する - 独自クラスの使いどころ

SOLID原則とか、Open Closed原則とか、クラスオブジェクトの扱いとか、大クラス主義/小クラス主義の話?

Chapter3

  • Proper Variable Usage - Using Ruby's favorite variable type, the local variable
  • 適切な変数の使いかた - Rubyでは定番のローカル変数について

変数についてくわしく。サンプルコードのファイルが1,000行以上ある。

Chapter4

  • Methods and Their Arguments - Understanding that there are no class methods, only instance methods
  • メソッドと引数 - 「クラスメソッド」なんかない。あるのはインスタンスメソッドだけ

kwargsや、メソッド本体側でHashがどうなるのか(Hashがいくつアロケートされるかとか)の話題が豊富そう()。

可視性の話もありそう(protectedも解説している)。deprecate_public(jeremyevans作品)の紹介。ruby2_keywordsも出演。

Chapter5

  • Handling Errors - Handling errors with return values
  • エラーのハンドリング -- 戻り値付きでエラーを処理する

raiseとかStandardErrorを活用する話。

Chapter6

  • Formatting Code for Easy Reading - Recognizing different perspectives to code formatting
  • コードを読みやすく整形する -- コードフォーマッティングに関する別の観点

if,unless,and,orとか引数とかkwargsとか? パースが変になるぞヤバい、みたいな話題もありそう。

Chapter7

  • Designing Your Library - Focusing on the user experience
  • 自分のライブラリを設計する -- ユーザー体験にフォーカスする

どんなAPIを提供するか(TSVを扱うクラスの設計)、拡張しやすい設計(プラグインっぽい枠組みの設計)、refrigerator(jeremyevans作品)の紹介。

Chapter8

  • Metaprogramming and When to Use It - Learning the pros and cons of abstraction
  • メタプログラミングの使いどころ - 抽象化の長所と短所を学ぶ

const_get, define_method, method_missing, extended, instance_variable_defined?, instance_variable_get/set, class_eval, instance_eval, eval, respond_to_missing

Chapter9

  • Designing Useful Domain Specific Languages - Designing your domain specific language
  • 便利なDSLを設計する - 独自のドメイン特化言語を設計する

DBバックエンドにSequelでつなぐSinatraアプリをRSpecのdrb runnerでプロセスごとのバーを出力するテスト用のDSLをつくる? Minitest::Specみたいなのも作るみたい。

Chapter10

  • Testing to Ensure Your Code Works - Understanding why testing is so critical in Ruby
  • 自分のコードがちゃんと動くかテストする - なぜRubyではそんなにもテストが重要なのかを理解する

Given-When-Thenでフィーチャーの説明を書いてる。さすが。時系列を考慮するテストのこと。複雑なテストを分割する話。Minitest::Mock、カバレッジ100%に意味ないよ。

Chapter11

  • Handling Change - Implementing the most common Ruby refactoring techniques
  • 変更の取り扱い - 再頻出のRubyでのリファクタリング技法を実践する

warnを使ってdeprecatedなやつを段階的に移行していく、みたいな感じっぽい

Chapter12

  • Using Common Design Patterns - Learning about many design patterns that are built into Ruby
  • よくあるデザインパターンを使う -- Rubyにはいくつものデザインパターンが組み込まれていることを学ぼう

singleton, forwardable, delegate, Null Object, Visitor, Adapter

Chapter13

  • Optimizing Your Library - Profiling first, optimizing second
  • 自分のライブラリを最適化する -- プロファイリングが先、最適化は後

ruby-prof, bemchmark,benchmark/ips,

こ れ は や ば い。ここがクライマックス。

Part III

Railsとは違った技術スタック(Sequel, RODA)メンテナンスしているライブラリ作者の観点からのエッセイ。ボーナストラックの趣。

Chapter 14

  • The Database Is Key - Treating the database as not just dumb storage
  • データベースが「キー」 -- データベースは単なるストレージじゃない

Chapter 15

  • Web Application Design Principles - Deciding on a web framework
  • Webアプリケーションの設計原則 - Webフレームワークを選ぶにあたって

Chapter 16

セキュリティ

評価

英語でもみんなが読むかと思うとそうでもなさそうなので、日本のRubyistが日本語で読めるようにしたい。入門の先のRubyの「使い方」について、信頼と実績のある英語圏のRubyハッカーのまとまった考えかたを日本語で届けることには意義がある。

既刊の類書

Ginza Rails27 igaiga - Speaker Deck の分類を援用すると「レベルアップ〜実践」に位置づけられそう。

現状で入手しやすい類書は特にない。和書既刊では出版年が5年以上前のものが中心になる。Ruby3に対応しているこのレベルの類書は無い。以下に参考までに具体的な書名を挙げる。

  • オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方(技術評論社) -- レベルアップという観点では近いが、本書のほうが扱う範囲は広い
  • 明解Ruby(Eloquent Rubyの訳書) - ピアソン桐原なので和書は入手困難。出版年が古い。訳文の質も良くない
  • Effective Ruby (翔泳社) - 位置づけとしては近そう。出版年が古い
  • Rubyベストプラクティス(O'reilly Japan) - 同上。出版年が古い
  • リファクタリング: Rubyエディション - 出版年が(ry
  • Rubyによるデザインパターン - 出版年(ry

以上。

@ima1zumi
Copy link

ima1zumi commented May 13, 2021

(TODO: igaigaが「このあたりのレベルの本が欲しいんだよなー」って話していたスライドを見つけてきて貼る)

これでしょうか? このページの「レベルアップ」の本がもっとほしいと仰っていたような気がします
Ginza Rails27 igaiga - Speaker Deck
【オンライン開催】銀座Rails#27@リンクアンドモチベーション - connpass

Loading

@kakutani
Copy link
Author

kakutani commented May 13, 2021

私が思っていたのは、https://speakerdeck.com/igaiga/ginza-rails27-igaiga?slide=10 でした。勘違いでした(Railsの教科書とRailsガイドの間の本がもっと欲しい、っていう話だった)。Railsのことはくわしい皆さんにお任せしたい…。

それはそれとして、Rubyの本の段階分類としての図はポジションの説明として便利に使えそう。

Loading

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment