📘

ジュニアエンジニアが「研鑽Rubyプログラミング ― 実践的なコードのための原則とトレードオフ」を読んでの所感

2025/01/03に公開

https://www.lambdanote.com/products/polished-ruby

私のスペック

ざっくり言うと座学は多少積んでるけど、実戦経験の少ないやつ。
業務でRubyコードを書いたことはほとんどない。
個人で作ったクソアプリくらいで、あとは本をいくつか(チェリー本パーフェクトRailsなど)読んだくらいのジュニアエンジニア(にすら達していないかも)。
そんな私がさらに座学を積み、理論上はRubyを極めるために本書を読んだ。

所感概要

ライブラリを作る上での原則がまとめられている。
ライブラリを作らないなら読む必要はない? いや、体感6割くらい活きる部分がある。
サブタイトル通り、Rubyのコードを書く上でのトレードオフを詳説してくれる。
トレードオフとして極限まで実行速度にこだわるなら、という話が多く出てくるが、その部分は話半分でいいかも。ある手法のメリットが出てこない場合、実行速度が上がるメリットしかないケースが多そうなため。
個人的に嬉しかったのは、設計原則やデザインパターンの解説。内部でどう使われているか知りたかった。内部実装の話はあると嬉しかった。特にRubyヒープ、VM、スレッドの話とか。
即値オブジェクトやメソッド引数の解説はありがたい。ここまで深く解説してくれるものはあるのか。
ポジショントークが強い部分もある(Sequel、Rodaを勧めたい感じの)。否定するわけではなく、せっかく書籍を書くなら宣伝するべきと思うし。
著者のjeremy evansさんはrubyコミッタも務める熟練エンジニア。翻訳の角谷さんも補足しながら書いていると思うが、理解し難い部分もある。そのため生成AIを使って補完しながら読むと良さげ。私は特にセキュリティ分野は浅いので、メモリアドレス空間のランダム化の話はついていけず。その他デザインパターンや浅い分野は生成AIに聞きながらだと理解が捗った。

特に印象に残ったテーマ

他にもシンボルと文字列の違い、即値オブジェクトの活用、フォーマットしすぎると詩人が困る、コードが最小=最速の話など、学びは多かった。が、特に印象に残ったテーマを挙げる。

SOLID原則

上司から原則を学べ、と言われて学んだものの、Rubyで適用できずにモヤモヤしていた。
本書には答えが書いている。Rubyは柔軟すぎるがゆえ、適用しきれない原則がある。クリティカルな話で、読んでよかったと思えた。
適用しきれないのはオープンクローズドの原則。Rubyは変更を閉じることができないため、原則に沿うことができない。積極的に変更に閉じないような思想となっているため。

デザインパターン

別で設計の勉強も進めていて、GoFのデザインパターンを学習していた。RubyやRailsではどのように活用されているのかを理解できた。AdapterとStrategyの違いなど、勉強したものが登場して「はいはい、これね」と言う気分にさせてくれた。

他にもNull Objectのトレードオフは面白かった。ぼっち演算子を使ってnilのNo Method Errorを回避したことがあり、全部に対処するのがめんどくさーと思っていたので。デメリットとして、オブジェクトを作る分、即値オブジェクトのnilよりも実行速度が落ちることはその通りだなーと思った。

Object Poolの話はもう少し深堀りしたい。Object Poolとは、頻繁に生成・破棄されるオブジェクトをあらかじめプールして再利用することで、メモリ管理やオブジェクト生成コストを削減するデザインパターン。Rubyを扱っていてメモリ管理を気にすることなんかほとんどないので、仕組みくらいはメンタルモデルを構築しておきたい。

キーワード引数と位置引数の分離

キーワード引数の歴史と課題、バージョンアップによる解消まで、詳説されている。

Ruby3.0でキーワード引数が大きく変わったことが知っていたが、詳しく知らなかったので、歴史と合わせて知れて嬉しかった。コミッタならではの話もあったのではと考える。

Ruby3.0へのバージョンアップにおけるキーワード引数の分離: 
https://www.ruby-lang.org/ja/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/

概要だけ触れると、Ruby2.6まではメソッドに引数としてハッシュを渡すと、自動的にキーワード引数として受け取るようになっていた。結果、ハッシュ形式の位置引数とキーワード引数が混じってしまい、プログラムが混乱してしまうケースがあった。ex) 位置引数の最後尾としてハッシュ形式の値を渡す。

Ruby2.7以降は、ハッシュ形式の位置引数とキーワード引数を分離するようになった。ハッシュをキーワード引数に自動変換しないため、キーワード引数ということを明示する必要がある。

おすすめできる人

ライブラリを作る人。ピッタリ。

Rubyコードの実装・設計を行う人。二部のライブラリの設計やら拡張の話はすっ飛ばしていい。ベテランでも、Ruby内部の最適化やパフォーマンスに関する深い洞察、設計思想に触れることで新たな学びが得られる部分が多いと感じた。

Discussion