Ruby Silver＆Gold合格したときの勉強方法まとめ

#概要
昨年の10月にRuby技術者認定試験Silver、今年の3月にGoldを受験して合格しました。
それぞれ無事一発合格してきた際に残してたメモを、今更ながら公開します。
これから受験する方の参考になれば。

Ruby技術者認定試験については[こちら](https://www.ruby.or.jp/ja/certification/examination/)。

###書いてる人の受験前スペック
- 社会人歴＝Ruby歴＝3年。Ruby（Rails）やJS中心に開発してるWebエンジニア
- 学生時代にCやJava、PHP、Pythonなど一通り触ってきた、情報系学科出身
 - その割にオブジェクト指向の理解はふわっとしたまま過ごしてきた。

#受験結果
RubySilverは86点、RubyGoldは84点で合格しました。
資格受験用の勉強はそれぞれ二週間ほどです（業務でRubyは使ってるので、あくまで資格対策の期間）。


#勉強方法

諸事情により資格を早く取りたかったので、『資格を取る』を優先した勉強方法をとってました。1日の勉強時間は2-3hくらい。

### まずググる
Rubyを勉強したいなら別ですが、資格を取るだけなら『傾向と対策』を知るのが重要と判断。
『RubySilver』『合格』『勉強法』『1ヶ月』とかで検索かけて、いろんな記事参考にしました。

### 公式問題集を読む
 [Ruby技術者認定試験合格教本 Silver/Gold対応　Ruby公式資格教科書](https://www.amazon.co.jp/Ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-Silver-Gold%E5%AF%BE%E5%BF%9C-Ruby%E5%85%AC%E5%BC%8F%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-%E5%A2%97%E4%BA%95%E9%9B%84%E4%B8%80%E9%83%8E-ebook/dp/B016B877OG)
とりあえず一旦ざっくり通しで読みます。範囲内で、「なんとなく」でも知ってるところは読み飛ばして、まったく覚えていないところを重点的に、最後まで。
読み終わったら次に移る。

### 問題解いて慣れる
はじめは数問単位で分野絞って問題のパターンを覚えます。
だんだん解けるようになってきたなーと思ったら、テストとして50問単位の問題を解いて、実際に採点してみる。
だめだった箇所に関して、もう一度問題集を読みます。それの繰り返し。

ポイントとしては
***1つの資料や本に頼らず、複数の勉強手段を使うこと***
***答えを覚えるだけでなく理由まで説明できるようになること***
が重要だと思ってます。

#### silverのみ
- [Rubyがミニツク](http://www.minituku.net/)※1.8.7系列なので注意。
    - 追記：2019/11頃から繋がらなくなっている模様。
    - 追記2：2020/06現在復活してました

#### goldのみ
- [Ruby技術者認定試験【Gold】模擬問題](https://www.school.ctc-g.co.jp/ruby/training_ruby_gold_01_10.html)
- [ITトレメ Ruby技術者認定【Gold】試験](https://jibun.atmarkit.co.jp/scenter/ittrain/121_cal.html)

#### 両方
- 公式問題集（上述）
- [REX](https://rex.libertyfish.co.jp/)
- [とある資格の勉強会](https://play.google.com/store/apps/details?id=jp.ne.poropi.quizapp.ruby&hl=ja)　※Androidのみですが個人的にイチオシ

### 理解を深める
答えを見てもちんぷんかんぷんなところは実際にpryなどを立ち上げて実行したり、わかるまで本読んだり検索したりしました。特にGoldのメタプログラミングや定数まわりの処理を理解するには必須でした。

[メタプログラミングRuby](https://www.amazon.co.jp/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Ruby-%E7%AC%AC2%E7%89%88-Paolo-Perrotta/dp/4873117437/ref=sr_1_1?adgrpid=55925379040&gclid=CjwKCAiA8qLvBRAbEiwAE_ZzPd1LDzPTr-ARg5BZ1WShAY4yNXuBZiNj_3wzWxaOg6pS1UGqA9rgghoCu3AQAvD_BwE&hvadid=338568618134&hvdev=c&hvlocphy=1009618&hvnetw=g&hvpos=1t1&hvqmt=e&hvrand=3773612300538797796&hvtargid=aud-759377471893%3Akwd-332399423896&hydadcr=27266_11561146&jp-ad-ap=0&keywords=%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0ruby&qid=1575556858&s=books&sr=1-1)

大体どのGold合格記事見ても載せてあるし私も買いましたが、よほど私との相性が悪かったのか、安眠アイテムと化してしまった……( ˘ω˘)ｽﾔｧ
対話形式で書かれていて分かりやすいし、面白い内容だとは思います……思うんですが……。

### 自己最終テスト
REXで90点オーバー取れるようになったし余裕ですわ〜〜〜ってなったくらいにやる。

- [公式配布模擬問題(silver)](https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0)

問題集系サイトは便利ですが、ずっとやってると覚えてしまいます。なので、***最後のテスト前の力試し用に公式問題集の模擬試験や上記模擬問題などは取っておく***と、本当に理解していないところを浮き彫りに出来ます。
Goldの方は模擬問題配布がないので、公式問題集の模擬試験を取っておくほうがいいかも。

上の最終テスト自分でやってみて、点数取れなかったところをあとは重点的にやる。


# 具体的な傾向と対策に関する覚え書き

以下当時の自分が引っかかった、覚えづらかったもののメモです。

## silver
###メソッド：文字列操作系
chop:末尾から1文字を取り除いた新しい文字列を返す。改行文字も同じ（"\r\n"が末尾の場合は、"\r\n"を取り除く）
chomp:末尾の改行文字を取り除く
strip: 文字列の先頭と末尾の空白文字を除去
concat: <<と同じ

###メソッド：配列操作
product:指定した2つのArrayを組み合わせた配列の配列を作る
zip: 指定した2つのArrayの要素を組み合わせた配列を作る
reject: 条件に合わない物を集める
permutation: 順列
combination: 組み合わせ
concat: 末尾に配列を結合
assoc/rassoc: 配列の配列の中で、1/2番目の要素が引数と同じ配列を取得
rotate: 右方向に指定した引数分配列をずらす
transpose: 行列入れ替え

###メソッド：異なる名前で似た処理するメソッド
####Array
collect ⇔ map
delete_if ⇔ reject!
delete_at ⇔ slice!
keep_if ⇔ select!
select ⇔ find_all
detect ⇔ find

####Hash
delete_if ⇔ reject!
merge! ⇔ update
（戻り値などの違いがあるので注意）


#### eql? equal? == ===
equal? ：同一であるか（同じオブジェクトか）
== : 同じ値か、型が違っても値が同じなら同じ（基本はこれ利用）
===: 所属関係があるか（モジュールクラス、範囲オブジェクト、正規表現オブジェクト）。配列や文字列の場合は==と同じ。case文の内部処理で使われているため、case文の条件に範囲や正規表現を用いることができる。
eql? :型も値も同じであるか

#### ヒアドキュメント
<<識別子または<<-識別子を利用、改行は反映される。
 << ではなく <<-を利用すると、終端の識別子をインデント可能（インデントしてると文章の一部扱いされる）
'識別子'のときは変数が展開されない。"識別子"または識別子（クォーテーションなし）だと展開される

#### メソッドと変数で同名の名前をつけたとき
呼び出し優先順位は変数>メソッド

#### do ... endと {} の違い
結合度が違う。

#### オーバライドできない演算子
= ?: .. ... not && and || or ::
自己代入演算子 +=など

#### 予約語
```
nil true false not or and BEGIN END begin end do then yield rescue ensure class module def defined? alias undef super self return while until for in break next redo retry case when if unless else elsif __LINE__ __FILE__ __ENCODING__
```
追記：一部がmarkdownのスタイルとかぶってたのでインラインにしときます……

#### ファイル操作
r:読み込み専用 read default
w:新規作成書き込み専用 write
a:追記専用 append
r+:両用
w+:新規作成読み書き両用。ただしファイルが既に存在したら消す
a+:追記書き込み読み込み両用。f.rewindなどでファイルポインタを最初に動かしたとしても、ファイル末尾に書き込む

#### 試験直前の確認にありがたかった記事
[[Ruby Silver対策]試験範囲メソッドチートシート作ってみた(String)](https://qiita.com/UltraBirdTech/items/5ae3ce20fd77f2cf4a35)
[[Ruby Silver対策]試験範囲メソッドチートシート作ってみた(Array)](https://qiita.com/UltraBirdTech/items/50489e39461b3658aea0)
[[Ruby Silver対策]試験範囲メソッドチートシート作ってみた(Hash)](https://qiita.com/UltraBirdTech/items/38f9ea8777ffa695a124)

## gold
goldに関してはsilverと違ってリスト化しにくいので参考にさせていただいた記事を。
定数、スコープ、Procあたりはしんどかったですね。

[Rubyの名前空間とレキシカルスコープについて簡潔に説明する｡](https://qiita.com/Drumato/items/ec889d0c3b4b94c67120)
[Rubyの定数が怖いなんて言わせない](https://qiita.com/fursich/items/a1b742795cf10eebc73f)
[Ruby Gold 試験範囲を一気に見直す](http://tamata78.hatenablog.com/entry/2015/11/03/101002)
[Procを制する者がRubyを制す（嘘）](http://melborne.github.io/2014/04/28/proc-is-the-path-to-understand-ruby/)
[[Ruby] モジュールの include と クラス継承](https://qiita.com/ksh-fthr/items/6c2b3b231bf26dc5a4e0)
[俺は Ruby について 1bit も理解していなかったので写経する 〜 オブジェクト指向編 (1) 〜](https://inokara.hateblo.jp/entry/2018/01/17/090647)
[Ruby 技術者認定試験 Silver/Gold 対策の個人的なハマり問題集](https://qiita.com/ffggss/items/0bab2a1e80e941378b49)

#ふりかえり
便利なメソッドやRubyの仕様を網羅的に把握するには、手っ取り早いので、Ruby初心者にはおすすめしたいです。
資格の勉強は現場とかけ離れているとはよく言いますが、この勉強したおかげで、それまでなんとなくよくわからんままにふわっと書いてたところが、チョットワカルみたいな感じになったので。
あと、Rubyは便利メソッドがいっぱいあるので、それを把握できるのは車輪の再発明を防ぐという意味でも美味しい。

問題はバージョンが未だに2.1ってことですかね……そろそろアップデートされるかな。アップデートされたらもっかい受けてみたいです。