プロを目指す人のためのRuby入門を読んだ感想

  • はじめに
  • 各章の感想
    • 1~13章
  • 全体の感想

はじめに

今回はプロを目指す人のためのRuby入門、いわゆるチェリー本🍒を読んだ感想を綴っていこうと思います!

分厚い!!

分厚さで読むのにどれくらい時間がかかりそうか判断できるのは紙のいいところだと思います!それにしても分厚すぎます笑

各章の感想

1章-本書を読み進める前に

この章でエディタの設定や参照すべきソース(公式リファレンス)などを知ることができました!

最初にエディタの設定をしたをしたことで効率的にその後の章の実践課題を進めることができました!

私のエディタ(vscode)の設定を下に載せておきます!

エディタ設定

2章-Rubyの基礎を理解する

この章でRubyの基礎文法、標準ライブラリと組み込むライブラリと外部ライブラリの違い、公式のコーディング規約はないが比較的有名な有志の規約があること、その規約をファイルの保存時に自動で適応してくれる方法があること、式(Expression,値を返す)と文(Statement,値を返さない)の違い、参照の概念、p,ppが開発者向けの出力メソッドであること、自作プログラムはrequire_relativeで読み込むことなんかを知ることができました!

この章を進める中で実際にFizzBuzzプログラムを書いてアウトプットすることで学んだ知識をより定着させることができたなと感じました!

3章-テストを自動化する

この章で「プログラマの三大美徳」

  • 怠惰 「全体の労力を減らすために手間を惜しまない気質」
  • 短期 「コンピュータの動作が怠慢な時に感じる怒り」
  • 傲慢 「自分の書いたプログラムは誰に見せても恥ずかしくないと胸を張って言える自尊心」

を知ることができました!

2章では作成したFizzBuzzプログラムが正常に動いていることを目視で確認していましたが、この章を終える頃にはその目視で確認する手間をコンピュータにやらせることができるようになります!(素晴らしい!これぞ怠慢)

目視で確認してた作業をコンピュータにやらせて満足げにコーヒーを飲む怠慢なエンジニアの図

4章-配列や繰り返し処理を理解する

この章で配列やブロックや範囲、Rubyにおけるミュータブルとイミュータブルなオブジェクト、繰り返し処理とその制御構造を学ぶことができました!

この章でも実際に手を動かしてプログラムを作っていくので学んだことが定着していくのを実感しました。

各用語が端的に説明されている点や配列やブロックや繰り返し処理のメソッドがどのように動くかを詳細に説明している点に魅力を感じました!(10人以上のレビューを潜り抜けてきた用語への信頼感は半端ないなと感じました)

本書を読まなかったら、こうやって動くはずだよな〜という曖昧な仮定に基づいてプログラミングを行なってエラーを頻発させることになっていたと思います。(今では実際の挙動に基づいて判断ができるようになっていると感じています)

曖昧な仮定と実際の挙動に基づくプログラムの安定感の図(意外と仮定でも積み上がるのか??))

5章-ハッシュやシンボルを理解する

この章でハッシュやシンボルを学ぶことができました!

この章でも実際に手を動かしてプログラムを作成するので学んだことが定着したなと感じました!

シンボルと文字列の違いなんかも丁寧に解説されてて、なぜ文字列ではなくシンボルを使うのか?といった疑問に答えてくれるような内容となっていました。

こういった質の良い情報をたくさんインプットすることで良質な判断材料が増えて、コードの質が高まっていくのかなと感じました。

本書のアプローチと筆者の今までのアプローチ

6章-正規表現を理解する

この章では正規表現の便利さを実感しそれを実際に使ってみることができました!

この章が終わる頃には今まで避けてきた呪文のような正規表現/(\d{3})-(\d{4})/が読めるようになります!

文字列の操作も自信を持って臨めるようになります!

7章-クラスの作成を理解する

この章でオブジェクト指向の基礎知識を学ぶことで現実にあるものをプログラムを使って表現できるようになりました!

この章を進める中で、改札機と切符をプログラムで表現することができるようになりました!

このプログラムを作る中でシーケンス図(クラスやオブジェクト間のやり取りを時間軸に沿って表現する図)というものを知ることができます。

実際に手を動かしてプログラムを作る前に、プログラムの流れを図で表すのは重要だなと感じました!

筆者の作成したなんちゃってシーケンス図

8章-モジュールを理解する

この章ではモジュールを学ぶことができます。

小規模なプログラムを作成している間はあまり必要にはならないそうです。

大規模なプログラムやオープンソースライブラリの開発に関わる場合はモジュールの知識が必須になってくるそうです。

軽く目を通してみたのですがすぐに必要にならなかったこともありあまり頭に入ってきませんでした。

Railsなどを学び始めてモジュールが出てきたタイミングでまた本書に戻って読み返してみたいと思っています。

この章を軽く読んだ後の筆者の図

9章-例外処理を理解する

この章では例外処理を学ぶことができました!文法の話だけではなく、例外処理はどのように使うと適切(または不適切か)を学ぶことができました!

他のプログラミング言語でいうExceptionがRubyでいうところのStandartErrorクラスであるという点には驚きました。

こういった知識も本書を読んでいなかったら知らないままだったので本当に読んで良かったなと感じました。

この章あたりからはすごく難しくなってきたので本書の筆者がお勧めしていた読み方(頭の中にインデックスを作る)に切り替えました。

頭の中のインデックス

  • 例外を捕捉して処理を続行する場合 🍒p369

  • 例外処理の流れ🍒p369

  • 例外オブジェクトから情報を取得する 🍒p372

  • クラスを指定して捕捉する例外を限定する 🍒p373

  • 例外クラスの継承関係を理解する 🍒p374

  • 他のプログラミング言語のExceptionクラスがRubyでいうところのStandardErrorクラスである。

  • 継承関係とresucue節の順番に注意する 🍒p375

  • 永遠に実行されないrescue節を作らないためにはスーパークラスよりもサブクラスを手前に持ってくるようにする。

  • StandardErrorとそのサブクラスを捕捉するのであればrescue のみで良い(例外クラスを指定しない)

  • 例外発生時にもう一度処理をやり直すretry 🍒p378

  • 無条件retryで無限ループを発生させないために、カウンタ変数でretryの回数を制限する。ネットワークエラーなどの一時的に発生している問題が例外の原因であれば何度かやり直すことで正常に実行できる可能性がある

  • 意図的に例外を発生させる 🍒p379

  • 例外処理のベストプラクティス 🍒p381

    • 安易にrescueを使わない
    • rescueした情報を残す
    • 例外処理の対象範囲と対象クラスを極力絞り込む
    • 例外処理よりも条件分岐を使う
    • 予期しない条件は異常終了させる
    • 例外処理も手を抜かずにテストする
  • プログラミング初心者は「例外が発生したら即座に異常終了させよう」もしくは「フレームワークの共通処理に全部丸投げしよう」と考える方が安全。Railsでは例外発生時の共通処理が最初から組み込まれている

  • 例外をrescueしたらその場で情報を残さないと詳細な情報が失われてしまう、手がかりが多いほど原因調査は楽になる

  • 例外処理を書く場合は、例外が発生しそうな箇所と発生しそうな例外クラスをあらかじめ予測し、その予測を例外処理のコードに反映させる。

  • 例外処理を書く前に公式リファレンスを読んで、問題の有無を事前に確認できるメソッドが用意されていないかチェックすべし

  • ensure 🍒p392 例外の有無に関わらず実行する処理

  • ensureの代わりにブロックを使う 🍒p393

  • ファイル処理のように「使用したら必ずリソースを解放する」という処理はRubyではブロック付きのメソッドを使うことで自動的に処理できるケースが多い。なのでensure説を自分で書く前にそういった便利メソッドが用意されていないか公式リファレンスを確認する癖をつけるべし

  • 例外処理のelse 🍒p393 例外が発生しなかった場合の処理

  • 例外処理と戻り値 🍒p394

  • begin/endを省略するrescue修飾子 🍒p396

  • $!と$@に格納される例外情報 🍒p397 可読性を考えると組み込み変数を使わない方が好ましい

  • 例外処理のbegin/endを省略できるケース 🍒p397

  • rescueした例外を再度発生させる 🍒p399 プログラム自体は異常終了させ、その情報はログに残したい時に使うテクニック

  • 独自の例外クラスを定義する 🍒p399

10章-yieldとProcを理解する

この章ではブロックを利用するメソッドの定義とyield、Procオブジェクトについて学ぶことができるようです。

この章の内容もすぐには頭に入ってこなかったのでRailsの学習を始めてから-> { }yieldこんな記述が出てきたら本書に戻って読み返してみたいと思います。

11章-パターンマッチを理解する

この章ではパターンマッチの基本や利用パターン、ガード式や1行パターンマッチなどの応用的な使い方を学ぶことができるそうです。

配列やハッシュのデータ構造に着目して条件分岐をさせたいときはパターンマッチが活躍できるそうなので、その際にまた本書に戻って読み返したいと思います。

12章-Rubyデバッグ技法を身につける

この章ではバックトレース(スタックトレース)の読み方、よく発生する例外クラスとその原因、プログラムの途中経過を確認する方法、汎用的なトラブルシューティング方法を学ぶことができます。

バックトレースとは「プログラムが実行されてエラーが発生するまでのメソッド呼び出し履歴を示した情報のこと」と本書に記されています。

この情報を読み解けるようになることでエラーを早く解決できるようになるそうです。

またよく発生する例外クラスとその原因を知ることでスタックトレースに記されている例外クラスをパッとみただけでどこを修正すれば良いのかが分かるようになりました!

これは本当にすごいことで、何か間違ったことをしてもエラーが実行時に教えてくれるんです!

今までは読む気になれなかったけど読めるようになると逆に今までなんで読んでこなかったんだ〜って思いました。

デバッガを用いて対話的にデバッグすることでデバッグの効率が上がるなと感じました。

汎用的なトラブルシューティングのパートでは小さなパーツがどういう挙動をするのかをirbで確認することであったり、ログを読む大切さ、公式ドキュメントをむべき理由やパソコンの前から離れる大切さなんかを学ぶことができました!

この章は目から鱗のような情報がたくさん詰まっていました!

本書の中の実践課題をやる中でエラーに遭遇し途方に暮れることがあると思うのですが、その時こそこの章を読むべきタイミングなのではないかなと感じました。

13章-Rubyに関するその他のトピック

この章では様々なトピックを「広く・浅く」解説していました。

その中でも印象に残ったのはRailsの中のRubyと素のRubyには違いがあるというトピックです。

Railsの中のRuby独自の挙動があることを事前に知ることができて良かったと感じました。

全体の感想

  • 筆者の長い経験の中で洗練されてきた各用語の定義を写経することで理解を深めることができました。
  • とにかく分厚い!!内容が濃い!!実践楽しい!!
  • ただ文法を学んだのではなく、歴戦の強強エンジニアの叡智を教えてもらった感じがしました。(実際に業務でRubyを使い始めてある程度経ってからまた読み返したいと思いました)
  • 海外ドラマsuitsのマイク・ロスのような写真記憶ができない僕でも本書の見出しが抽象化されている(Ruby特有の単語のみではない)おかげで必要な情報にありつけるなと感じました。
  • 仕事を始めてからも側において必要になったらすぐに読めるようにしておきたい!そんな一冊でした!