まりぴよこのブログ

日々の日記。技術ネタでまとまりきってないものの記録、伝わる文章の書き方を練習とか。

Railsの上達方法

ココ半年くらい、集中的にRailsの勉強をやって、(最初の時と比べたら)かなり上達した!と思うので、上達方法を書いてみる。

普段お仕事は他の言語やフレームワーク使ってて、Railsやりたいんだよな〜というプログラマさんにオススメの勉強方法。

  • RailsTutorial
  • コピーアプリを作る
  • デバッグ力を上げる方法

Railsの識者の方に、こうするのが良いよと薦められて、その通りやったら本当に上達した!と思うので、半年前の自分に向けて書いてみる。

RailsTutorial

Railsの勉強はじめよう!と思ったら、最初に取り組むべきサイト。

ただし、ちょー内容濃いので、Rails初めての場合、少なくとも2周は回らないと全然やり切れた感ない。。

ポイントは

  • 1周目はとにかくわからなくても進める(テスト系・演習系は出来なかったとしても気にしない)
  • 1周目終わって、うむ・・まだまだ全然である、と思ったら2周目に取り掛かる(今度はテスト系・演習系にも取り掛かれるはず)

ちなみに私の場合、3周しました・・

自分の趣味時間を使ってやってたので、2年くらいかかっちゃった・・・(途中だらけたのもあるけど)

その間RailsTutorialのサイトはどんどんバージョンアップしてました・・

  • 1周目:3.2版
  • 2周目:4.0版
  • 3周目:4.0版(3周目だから自分のRailsのバージョンだけ4.2で何とかできるだろ!と思ったら、思いの外苦戦した)

今改めて見たら 4.2版が出てるんですね・・・(すごいな〜常に変化しとる)

コピーアプリを作る(少なくとも3つ)

ここからはここ半年間の集中的取り組みでやったところ。 あまりダラダラし過ぎないほうがよい。

世の中の有名アプリ(自分がよく使うものなどが良い)をコピーする

自分で独自アプリを作るより、有名アプリの仕様をコピーするほうが、Railsの実装の学習に専念できるので良い!

主要な機能をコピーする

  • スタイルなど、この段階ではあまり気にしない
  • RailsTutorialで学んだRailsとしてのお作法を実際のアプリを作る段階で適用する
  • 必須ではないけど、早い段階でHerokuにデプロイ出来る状態にしておくと、テンションが上がって良い

最初に作る機能をピックアップしておくと良い

ピックアップせずにやり始めてしまうと・・

  • 自分に甘くなる「これ難しいからやっぱなしで良いや」とか
  • 完成を追求しすぎる(有名アプリはやっぱりすごいので、こだわりすぎるとコピーするのも相当大変になる)
例:StackOverflowのコピーアプリ
  • ユーザーはログイン出来る
  • ユーザーは質問を投稿出来る(編集・削除できる)
  • ユーザーは回答を投稿できる(編集・削除できる)
  • ユーザーは質問・回答に投票できる
  • ユーザーは質問・回答にコメントをつけられる
  • ユーザーは質問を一覧で表示できる(10件でページネーションする)
  • 質問にはタグが付けられる
  • 質問・回答はMarkdownで記述できる
  • 質問者は回答を承認できる
  • ユーザーは貢献度に応じてバッジを貰える

規模的にはこんな感じで十分みたい。

README.mdとかに書いておくと、Githubに上げた時、いい感じに表示されてやる気がでる。

この段階で初めて作ったコピーアプリ

github.com

7/3 ~ 7/30まで作業してたぽい履歴が残っているので、まるまる1ヶ月くらいかかってる。。 (遅すぎ・・)

未だにHeroku上に残ってるコピーアプリ

Micro StackOverflow

デバッグ力を上げる方法

ツールを知る

better_errors

必要なGem

group :development do
  gem 'better_errors'
  gem 'binding_of_caller'
...
binding_of_callerで知っていると嬉しいデバッグテク
  • 変数の中身が知りたい箇所で、わざと未定義の変数を書いておく
  • Undefined local variable or method.. で止まってくれるので、binding_of_callerで有効になる live shell機能を使って変数を調べまくる

f:id:mpiyok:20151010110903p:plain

Rails Panel

必要なGem

group :development do
  gem 'meta_request'
...

Chromeの拡張で、どこでどのコントローラーが呼ばれて・・とかがブラウザから見れるようになる

IDEに助けてもらう

  • RubyMine有料だけどすごい助けてくれる
  • 定義元に飛べるので、何が起きているのか理解するのにすごい助けになる
  • 先生だと思って投資する

オススメの使い方

  • 30日お試しができるので、コピーアプリを作る段階で試してみると調度良い
  • 30日間でコピーアプリを作らねばならぬ!と緊張感も沸くのでより良い
  • 30日終わる頃には無くては生きられない状態になる w

ちなみに私の場合、最初のコピーアプリは vim メインで作ってて、1個目のコピーアプリ後、自分のデバッグ力の無さに絶望して、かねてから使ってみたいなと思っていたRubyMineに手を出した。

もっと早く使ってりゃよかったよ・・と思いました。。

何はともあれroutesを把握!

  • Routesでアプリの地図を把握する
  • Routesを確認しないまま闇雲にアプリを動かしても、どこで何が起きているのか全くわからん状態になる

Routesホント重要

  • リソースフルに定義されてるところは普通に判断できるので、getとかmatchとかで独自に名前を指定している箇所が、どういう状態になってるか確認する
  • 把握したRoutesから、最初に見るべきControllerを見つける
  • ココだ!と思ったControllerに特に問題が見つけられない場合、継承関係やモジュールの読み込みなんかも注意してみる

コードをよく読む

Rubyの1行は濃い。。

rubyでは1行でいろんな処理が行われることがあるので(特に見知らぬgemのDSLが呼ばれてたりすると、めっちゃ挙動が変わったりする)ので、問題になっていると思われる箇所が特定できたら、1行1行ちゃんと読む。

多言語から来た人は特に注意

焦っていても決して読み飛ばさない

メソッド名がRubyの慣習に従っている場合でも、『こんな処理をしててくれてるに違いない』とスキップしたりせずに、コードの中も一度は(ちゃんと1行1行)確認する。

例えば、メソッド名が ? で終わってる場合、true/falseを返してくれるメソッドである、というのがRubyの慣習だけど、ウッカリ中で値を設定しちゃってたり、値を返し忘れてたり、とかそういうこともある。(デバッグ中なので、問題が発生したアプリを読んでいるということを念頭に注意深く進む)

それでも問題が解決しない時は、範囲を広げて(ココ!と思ったところが見当はずれという場合もある)コードをよく読む。 落ち着いて1行ずつ読むが大事!