「プロを目指す人のためのRuby入門」を読みました

「プロを目指す人のためのRuby入門」

こちらの本になります。著者は伊藤淳一さん(id:JunichiIto)です。

私について

私は昨年の春あたりから Ruby を本格的に学び出しました*1。歴にして半年超というところで、レベルとしては初学者です。

学習初期の一人だけでコードを書いている間は、分からないことがあればネットで調べてコピペのようなことでもしのげてきたのですが*2、本格的に困ったのが他の方のコードを読むときでした。エラーが出て対処したかったり、機能の修正や追加を行いたかったりしても、書いてあることの意味が分からない。魔術のような記述が並んでいて、コピペでしのぐことさえできませんでした。

また、学習初期には「あることを行いたい場合にはこう書けば良いっぽい」と、「勘」で書いていた点もありました*3。そしてその書き方の「手クセ」がついてしまい、「動くからいい」とついその手クセのまま書いてしまいます*4

例えば、「ブロック内で処理した値を配列として戻す」場合に私は下記のようなコードを書いていました。スコープを考えた場合にこのように書くのがいいだろう、と自分で「編み出した」方法です。

source_array = [1, 2, 3, 4, 5]

return_array = []
source_array.each do |element|
  return_array << element if element.odd?
end

return_array

私のレベルはこの辺りです(でした)。

全体の感想

素晴らしい一冊でした。理解があやふやだった点、使いどころがわからなかった点、新しい発見があった点など、読んでいてとても楽しかったです。気になったところに付箋を貼りまくっていたところ、本記事の末尾の画像のような状態になってしまいました(まだ増えると思います)。

以下、トピックごとに具体的に記していきます。

1. Rails にはあえて触れていない

「Railsをやる前に、Rubyを知ろう」と表紙に書かれているように、Rails については書かれていません*5。あくまで Ruby 自体の記述に終止しています。これが私には助かりました。ネットで検索した場合の記事タイトルに「Railsで~」「~をRailsで使う場合」という文字列がよく並び、それらの記事を読んでも本質が見えていないのではないか、という懸念が常々あったからです。

その懸念を払拭してくれました。

2. メリハリがある

「ここは実際には使われないが」「初心者の方には難しいと思うが」などと、内容にメリハリがあるのが良かったです。これにより「最初はとりあえず流し読みで済ませる」と判断ができたからです*6

3. 戻り値の説明が詳しい

普段戻り値を意識しないようなメソッド*7でも、戻り値についての説明がとても詳しいです。これはおそらく本書の特長でもある「テスト」を意識したものであると思っています。

4. 2つのタイプの「読み方」を兼ね備えている

技術書はその読み方により2つのタイプに分かれると思っています。

  • 通読するための技術書
  • 辞書として用いる技術書

本書はこの2つのタイプのどちらにも属します。繰り返し読んで「気づき」を得るためにも有用ですし、分からないことがあった際に辞書的に引くこともできます*8

5. Kindle 版も素晴らしい

いつでもどこでも読みたいと思いましたので Kindle 版も併せて購入しました。Kindle 版も読み手のことが考えられている作りになっています。

いわゆる全ページスキャンしてくっつけただけの電子書籍ではなく、フォントの大小によりページが動的に変わる「電子書籍」です。そして一番ありがたかったのが、脚注に飛んだ場合に「戻る」リンクがその脚注の末尾に付与されている点です。

Kindle の仕様*9から、読書中に端末の「戻る」ボタンを押すと Kindle のトップに戻ってしまいます。したがって脚注に飛んでから元の場所に戻るためには面倒なページ操作が必要でした。その操作を不要にするためのリンクが付与されており、大変快適に*10脚注を読むことができました。

6. 「何が嬉しいのか」が説明してある

Ruby が関わることに限りませんが、仕組みが分かっても「それがあると何が嬉しいの?」と思ってしまう事柄が多々あります。そのような事柄について、例題や具体例を出して説明してくれているのがありがたかったです。

特に第10章の「yield と Proc を理解する」の章ですね。

7. 誤植が無い(少ない?)

技術書で一番困るのが誤植です。後から内容を補足したり書き換えたりしたため、コードの内容にそぐわない記述があったり、そもそもコード自体がどうやっても動かないものであったり……。

初心者なので動かなくて必死で一日中調べてその結果が誤植であった時は悲しくなります。

気になった点

2点、気になった点を挙げます。どちらも些細なことですし、私だけの話である可能性が高いです。

1. サンプルコードの内容は「ひと続き」であることを意識する必要がある

「4.7.2」の最後のサンプルコードは以下のようになっています。

a = [1, 2, 3, 1, 2, 3]
# 値が2である要素を削除する(削除した値が戻り値になる)
a.delete(2) #=> 2
a           #=> [1, 3, 1, 3]

# 存在しない値を指定するとnilが返る
a.delete(5) #=> nil
a           #=> [1, 3, 1, 3]

一番最後の a[1, 3, 1, 3] ということに「えっ?」と思ってしまったのです。[1, 2, 3, 1, 2, 3] の間違いじゃないのかと思ったのです。そして改めて読み返すと、「最後の adelete(2) した後に delete(5) した a」 なので、[1, 3, 1, 3] で合っていることが分かります。

私の誤読に過ぎないのですが*11、確かもう一箇所ほど*12同じような記述を見かけたので、少し気になりました。

2. 「式全体の評価」

これも私の知識不足に基づきます*13

「2.10.1」の説明に「Ruby は式全体が真または偽であることが決定するまで左辺から順に式を評価します」という記述があります。その後に具体例を出した記述があります。しかしここでつまずいてしまいました。具体的には以下の記述の場所です*14

nil || false || 2 || 3 の戻り値が 2 になるのは、2 を評価した時点で式全体の真偽値が真であることが確定したためです」

え、「一番最初の nil が現れた時点で全体が『偽』であることが確定ではないの?」と考え込んでしまいました。しかしこれは誤りですよね。そしてなぜ誤りであることに気づかなかったというと、以下の知識が無かったからでした。

  • AND でのみ結ばれた式全体の真偽を左辺から評価する場合、「偽」が出た時点で評価が確定する
    • 「偽」が出たら「真」にひっくり返ることはない
  • OR でのみ結ばれた式全体の真偽を左辺から評価する場合、「真」が出た時点で評価が確定する
    • 「真」が出たら「偽」にひっくり返ることはない
  • ANDOR が混在した式全体は……
    • 考えたくもない……

以前、いわゆる「nilガード」がどうしても理解できなかったのですが、今回上記の気付きを得られたおかげでようやく理解できました*15

要望

要望を挙げさせて頂きます。

1. Kindle 版も一緒に買うとツラい(金銭的に)

本書に関する要望では全く無いのですが、紙の本と電子書籍の両方をそのままの値段で買うことに以前からツラみがあります*16。どのような方法にするか非常に非常に難しいところだと思うのですが、両方購入する場合は何らかのメリットが欲しいです。

2. Rails の書籍も読みたい

伊藤さんは普段は Rails を書いていらっしゃるということで、同じようなコンセプトで Rails の書籍も読みたいと思いました。

まとめ

ついページを開きたくなるような工夫が多くなされており*17、長く愛読する一冊になると思います。Ruby の技術書として長く定番書になる一冊だと思います。

また明日も適当にパラパラっと眺めてつまみ食いをしようかと思います。

書籍近影

f:id:gregminster:20180128161348j:plain

f:id:gregminster:20180128161409j:plain

受け手のことが考えられている

本書とは直接関係ない点なので最後に書かせていただきます。

この書籍や伊藤さんの書かれる内容に一貫していることは、「常に受け手のことを考えている」ということだと思います。これは文章という表現だけにとどまることではなく、例えばプロダクトを開発する際やコミュニケーション全般の際においてもこの姿勢を発揮されていることと推察します。

他者が関係する場では何よりも「分かりやすさ」を重視したやりとりが必要です。独りよがりになったり自己満足を求めたりしてしまうと誤解を生んでしまう可能性があるからです。それは結局みんなを不幸にしてしまいます。

私も時として相手の状況を推し量らずに突き進んでしまうことがあり、この姿勢を見習うべきであると再認識しました。

*1:本ブログのつたない記事の変遷を見ればだいたい分かるかと思います

*2:とても良くない

*3:とても良くない

*4:それを指摘される環境にないことも影響しています

*5:最後に補足的に少し書かれてはいますが

*6:proc と lambda の違いのあたり

*7:たとえば puts

*8:索引も充実しています

*9:おそらく

*10:そして躊躇なく

*11:コメントでコードがいい感じに区切られていたりするのも一因かもしれませんが

*12:具体的な場所は失念しました……

*13:Ruby や プログラミング の、というより数学的な理解

*14:&& の部分でも同様です

*15:恥ずかしながら、おかげで JavaScript のショートカット演算もスッと理解できました

*16:ただ、本書はその価値が十分にあります

*17:たとえば見開きページを維持しやすい紙質にしてあったり

Powered by はてなブログ