Failure is Success in Progress - SIからWeb転身後の学びLog

駆け出しWebエンジニア向けのTipsなどを紹介します

『プロを目指す人のためのRuby入門』から学べること - Railsチュートリアルを終えてから

※はじめての執筆になります。ご承知おきください。

 

現在、Rubyistになるべく孤軍奮闘をしてます!
そこで、登竜門であるRailsチュートリアルを終え、
次のステップとして、こちらを読ませていただきました。

 

ruby-book.jnito.com

 

この本から、チュートリアル後の駆け出しRubyistが学び・得られることについて
Railsチュートリアルを終えた人の感覚で、章ごとに紹介したいと思います(^O^)/

※ 具体的な内容については本を購入しましょう!
※ 主題となる1章〜10章を対象としています(全12章)

 

全体を通して

各章に散りばめられている例題において、テスト駆動開発で思考をシミュレートしながら解いていく工夫がなされています。

それがとてもよかったです。

 

テストを書く

 →テストが動くことを確認

  →あえて失敗する

   →実装する

    →テストをパスする

というように思考の流れをシミュレートして実装しつつ学べます。

 

初学者にありがちな単なるコードの写経ではなく、パズルを解くように「じゃあ次はこのロジックで書いていくのかな?」と思考を巡らせながら進めることができたので、知識の定着がしやすいなと感じました。

 

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

対象の読者、全体像、本を用いた学習法などが紹介されています。
まず、本を購入する前に、ここで自身のレベル感と照らし合わせましょう!

 

個人的には、

といったスキル感や疑問のある方にぜひオススメしたいなーって思います(^O^)/

 

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

Rubyが条件分岐や式の評価をする際に、数値や文字列といったリテラルがどう扱われるのかなど、
他言語の基礎的な部分はRubyではどうなのかを学ぶことができます。

 

Rubyではあらゆるものがオブジェクトとして扱われていることをみなさん知っていましたか?

 

この特性により、実行時にオブジェクト自身がメソッドのふるまいを実装しているとみなせるというダックタイピングが一つの特徴かなと思います。(Pythonなど他の動的型付け言語にもある概念でRuby固有ではないみたいです)

 

また、もし他言語の経験があるのならば、ifのような条件分岐においてnilも「偽」として扱われるというのは特筆すべきことかもしれませんね!例えば、次のようにPHPだったらNullの判定をパスした上で比較みたいなことをやる必要がなかったりします。

$var = 1;
if (isset($var1) && $var == 1) {
    foo();
}

あとは、他言語でありがちなメソッド定義時にreturnやメソッドの()がなかったり、文字と文字列はどう扱うの?とかだったりについても触れてます。

 

Railsチュートリアルでも軽く触れられてはいましたが、メソッド呼び出しの末尾に?や!をつけるのはどういう振る舞いをするメソッドだっけ?というおさらいにもなるかなと思います。

 

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

Railsチュートリアルでも扱ったMinitestというテスティングフレームワークを使って、あらためてテスト自動化を学べます。

ターミナルに返ってくるエラーコードや説明に抵抗があったり、意味をちゃんと知りたい!っていう部分について詳細に触れてくれてます。

 

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

ブロックについても触れられてて、それが特にためになります。

 

CやJavaなどむか〜しからある言語を使ってた人ではforで回してごにょごにょとかやりがちですが、著者の伊藤さんいわく

5〜6年Rubyを使っていますが、for文を書いたことは一度もありません

とのこと。なるほど。

 

繰り返し処理で同じようなことを実現するために、チュートリアルでもeachメソッドにブロックを渡してましたよね!そこでブロックの概念を自身でイメージ化できなかったのであれば、解説とともに図示してくれてるのでそんな人にはぜひ!

 

個人的には、そういった繰り返しの対象となる配列に対し、各要素を書き換えて新たに配列を返すmap/collectや、要素を評価して真や偽どちらかの要素の集合(配列)を返すselect/find_all/rejectや、要素の合計値sumを求めるために楽になるinject/reduceなどのメソッドの存在とそのふるまいを学べたことが意義深かった章でした!

 

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

Railsチュートリアルやってて、:hogeとかfoo:とかコロンの位置と意味が混同してわけわかんないことありませんでしたか?それについて明快になります。

 

コラムまでしっかりチュートリアルをやりこんでいたら、前にコロン→"シンボル"で、後にコロン→"ハッシュの一種の記法"というのが答え。というのは、理解していると思うのですが、他のインプットの量が多いのでなかなか意識が回らないんですよね><

 

特に、チュートリアルをやってて、その混乱を招くのがメソッド呼び出しで【メソッド呼び出しの最後の引数がハッシュの場合、{}を省略できる】というルールに則ったときにハッシュとシンボルの記法が混在したパターンがハマるポイントかなと思いました!

 

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

正規表現について正直あまり良くわかっていない方にこそ必見かもしれません!

 

ご丁寧にも、著者:伊藤さんの正規表現のQiita記事を紹介いただいており、それがとてもわかりやすい!私はまだ正規表現の理解が未熟な頃、初心者向けの記事を色々調べましたが、この記事が最もわかりやすかったです!

 

正規表現が既知の人にとっては、検索対象文字列のキャプチャを名前付き(シンボルや文字列)で受け取る方法や、Regexpクラスのオブジェクトを介さなくても、マッチング処理できるStringクラスの便利メソッド(slice, split, gsub)などの用法を知れるので、双方にとってもためになる章になります。

 

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

昔ながらの静的型付けの言語を経験していると、クラスから生成されたものを「オブジェクト」や「インスタンス」、そのふるまいを「メソッド」や「サブルーチン」といった処理単位として表現することがあると思います。

 

では突然、Rubyの開発環境にジョインして「レシーバ」や「メッセージ」と言われたときそれが何を指しているかわかりますか?きっと馴染みがないため「?マーク」が頭に浮かぶと思います。「レシーバ」はメソッドを実行する際のインスタンスを、「メッセージ」はそのメソッドの事を指すのです。ことRubyでは、SmallTalkという対話的なオブジェクト指向言語の影響があるので、そういった表現をするようです。チュートリアルでは知り得なかったことですね!

 

あとは、Foo::bar? みたいなダブルコロン(::)で表現された箇所がチュートリアルにあって、いまいち腑に落ちないことがありませんでしたか?私はあまり腑に落ちてなかったです。

 

先述の例の場合、Fooクラスのクラスメソッドbarを呼び出すという意味を持つのですが、チュートリアルでは使用例はさほど多くなく、どちらかというとクラスの継承元がFoo::Barみたいになっていたのをよく見かけたと思います。このダブルコロンの表現は次章の「モジュール」とも関連性が深く、この章と次章を学ぶことで、その違いが明快になると思います。

 

全般的に、Rubyにおけるクラスの継承関係や定義の仕方や公開レベルの設定など学べる章ですが、他言語(e.g. Java)とふるまいがやや違っていたりするので、この章については何度も見返したいなと思える章でした。

 

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

前章で、クラスの継承元でダブルコロン(::)がチュートリアルで見かけたというのを例示しましたが、その正体がクラスや定数などの名前衝突を防ぐための名前空間でした。

 

例えば、ActiveSupport::TestCaseActiveやActiveRecord::Migrationといったものは、ダブルコロンの左側で名前空間を括られているということですね。ただ、クラスの中にクラスをネストしてもできるし、モジュール内にクラスを記述してもできる点が少しややこしいところ。

 

特筆すべきは、Rubyのクラスは複数のクラスを同時に継承するのを良しとしない単一継承を前提としている(また、継承はis_aの関係でなければならない)ので、同じような共通機能を持っていて、複数のクラスで使いたいがis_aの関係にない場合は継承を避けるべきという点かと思います。そういったis_aの関係にないが、共通機能として扱いたい概念がモジュールで、その使用について学ぶことができます。

 

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

他言語では、try~catchという表現で記述できたりしますが、rubyではbegin~rescueという表現を使います。
(※ catchはRubyでは別の用途で使われているので注意)

 

この章では、例外処理を安易に多用しrescueで捕捉すべきではないということ、使う場面で適切に処理した上で、トレースできるようにログを残さなければならないということは心得ておきたいと思いました。予期せぬエラーや障害に耐えうる堅牢なシステムを構築するためには最低限知っておかなければならない項目だと思うので、要チェックです!

 

特に、例外クラスの継承関係の図と、例外処理のベストプラクティスは必読の項目だと思います。

 

10章:yieldとProcを理解する

主に、ブロックを渡すということに焦点をおいた内容でした。 

 

いままで、RailsRubyの組み込みライブラリを用いて、ブロックを渡して処理をしましたが、それを自作でも当然作り込むことができます。そうすることで、より柔軟な実装や、Railsの高度な機能を扱うことができるようになるようです。

 

Javaでいうところの8から登場したラムダ式、Swiftのクロージャで処理を委譲するといった概念に近いのでしょう(解釈が間違っていたらすみません)

 

Rubyでは、メソッド間の受け渡しにおいて、ブロックはProcクラスのオブジェクトに変換され、yieldするか、そのレシーバからcallすることでブロックを呼び出すことができるようです。

 

ここを学ぶことで、前の章で学んだ便利メソッドの省略記法 ['a', 'b', 'c'].map(&:upcase) というような記述がおまじないとして覚える必要がなくなります。

 

最後に

いかがだったでしょうか?

 

今回は、Railsチュートリアル終えたけど、この本からどんなことが学べるの?
という視点で書いてみました。 

 

私事で恐縮ですが、現在転職活動中で、この本の学びがとても役に立っています。

  • CodilityのようなE-CodingTestをこなすための基礎力に確実になっている
  • Live-CodingTestで実装根拠の説明ができる
  • 「好きな言語は?」と聞かれたときに相手にきちんと説明できる
    → Rubyである前提ですが 笑

加えて、Rubyの本質的な理解がRails本の読解力向上につながっているという実感があります。

 

ぜひともRailsチュートリアル後はそこで生じた疑問を携えて、
この本でRubyに原点回帰することをオススメしたいなと思いました。

 

購入時の補足ですが、
もし経験なければ電子書籍で購入してみるといいかもしれません。

  • 持ち運びが楽
  • 文字検索できる
  • 目次からジャンプできる
  • 若干安い
  • 改訂されている

はじめての電子書籍でしたが、この点でとてもよかったです。
なので、技術評論社の本を買うときは今度から電子版を買おうかと思います!

 

book.mynavi.jp

 

こちらも現在学習中ですので、お伝えできればいいなと思っています!

 

Have a Good Ruby Life
(^O^)/