Ruby Goldに合格したので、勉強方法をまとめてみた(2020年11月版)

[Ruby Silverに合格したので、勉強方法をまとめてみた(2019年2月版)](https://qiita.com/jonakp/items/7f7550eeea78973a0a7f)
の続編。

先日Ruby Goldに合格した。90点だった。中々頑張ったと思う。
需要のほどは分からないが、忘れないうちに勉強方法をまとめてみる。

単に勉強方法を並べるだけでは面白みに欠けるので、
各学習段階における本番のスコア予想を**完全な独断と偏見に基づいて**示してみる。
つまり「ここまでやれば本番でこの位の点数になる気がする(無責任)」という話。

勉強の結果どのくらい合格に近づいているか？というのは、モチベ維持にも役立ちそうだと思い添えてみた。
まぁ私の感覚に基づくものなので、記事の賑やかしとして参考程度に捉えてほしい。
(メインコンテンツはあくまで勉強方法！)

# とりあえず結論
- さらっと試験範囲に目を通す(予想スコア: なし)
- Rubyのオブジェクト指向をがっつり学ぶ(予想スコア: 50-60点)
- 問題集を繰り返し解く(予想スコア: 70-80点)
- 先人の残したブログで知識を補う(予想スコア: 85点以上)

# 前提
### 学習開始時点での私のRuby経歴
- 実務で半年〜１年。(Ruby以外の言語を含めると実務トータル2年弱程度)

### 学習期間 & 学習時間
- 学習期間: 2週間ちょっと
- 学習時間: 40〜50時間(平日2,3時間、休日5時間)

# 本題: 勉強方法
## さらっと試験範囲に目を通す(予想スコア: なし)
まずは大まかに試験範囲のイメージを掴む。
ググって出てきた合格記事を上からいくつか読み比べて、試験範囲の大まかな特徴がつかめればOK。

以下の書籍の 2〜5章でRuby Goldの試験範囲を眺めるのも良い。
[[改訂2版］Ruby技術者認定試験合格教本（Silver/Gold対応）Ruby公式資格教科書](https://www.amazon.co.jp/dp/B0756VF9Y3)

すると恐らく以下のような傾向が見えてくると思う。

- オブジェクト指向に関する設問が全体の半分強を占める
    - 特異クラス？メソッドの継承ツリー？ あとメタプログラミングRubyを読むと良いらしい？
- 残りの半分弱は、実行環境・文法・ライブラリ等から少しずつ出題される。
    - 「これいつ使うんだろう？」って話もたくさん。。。^^;

ひとことで言えば、
**「オブジェクト指向関連はガッツリ学ぶ必要があるようだが、その他は種類が多くてよくわからん」**
という印象を持つだろう。

その認識は正しい。Ruby Goldの実態は大体そんな感じだ。

### 本記事の構成の話
ということで本記事では以降、

- 「オブジェクト指向関連」をどうガッツリ学べば良いか？ 
- 「その他は種類が多くてよくわからん」箇所をどう押さえていけば良いか？

の2点を中心に説明していく。


### 学習完了時点での予想スコア
なし

この時点では特に学習の成果を気にする必要はないだろう。ウォーミングアップみたいなものなので。

## 「オブジェクト指向関連」をガッツリ学ぶ(予想スコア: 50-60点)
前述の通り、試験問題の半数強はオブジェクト指向関連の設問になる。
まずはここを押さえるのが手堅いだろう。

Ruby Goldにおけるオブジェクト指向関連の設問は、例えば以下のような内容を含んでいる。
(本記事では便宜上これらを「Rubyのオブジェクトモデル(に関する知識)」と呼ぶ事にする)

_クラスの継承・Mix-inを考慮したメソッドや定数の探索順, 特異クラス・特異メソッド・クラスメソッド, インスタンス変数(クラスインスタンス変数)・クラス変数・定数等のスコープ, etc..._

### 読むべき本(テンプレ)の話
ではRubyのオブジェクトモデルをどのように"ガッツリ"学べば良いか？
幸いな事にこれにはもうテンプレがある。以下の書籍を読めば良い。

- [[改訂2版］Ruby技術者認定試験合格教本（Silver/Gold対応）Ruby公式資格教科書](https://www.amazon.co.jp/dp/B0756VF9Y3) の4章

- [メタプログラミングRuby 第2版](https://www.amazon.co.jp/dp/4873117437)の1〜5章

**この２冊はRuby Goldを受けるなら可能な限り手に入れた方が良い。**
(他の教材はおおよそネットで無料で手に入る)

### ここがRuby Goldの山場だという話
この辺りの知識(特にメタプログラミングRuby)は一度で理解するのが難しいかもしれない。ただ、ここだけは真正面から取り組んだ方が良いし、Ruby Goldに関係なくその価値がある。繰り返し読み、関連知識をググり、できる限り手を動かす事をオススメする。内容としては教本の方が少しやさしいのでそちらから手を出すのも良いだろう。(大したアドバイスができず申し訳ない...他にも良い記事いっぱいあるのでググって...)

何度読んでも分からない場合はまだRuby Goldは少し早いのかもしれない。もう少し経験を積んで改めて挑戦することを考えてもいい。(私も以前メタプログラミングRubyを読もうとして途中で挫折した経験があったり)

逆に言えばこれ以上難しい話はRuby Goldの試験範囲には存在しない。これ以降は(めんどくさいことはあっても)全く理解できない内容は出てこないだろう。ここが山場なので気合いを入れて学習したい。

メタプログラミングRuby(1〜5章)の内容が9割程度理解でき、オブジェクト・クラス・特異クラスの関係性の図(５章の図5-5)を頭の中で思い描けるようになる辺りが学習完了の目安だろう。もしくは以下のサイトの図も理解度を測るちょうど良い目安になると思う。

[「クラスはオブジェクトである」に辿り着くまで](https://buildersbox.corp-sansan.com/entry/2019/04/16/110000
)

### ちょっと足りない話
実はこの2冊だけだとオブジェクトモデル関連で少し弱い点がある。軽く学習方法を紹介する。

#### 定数探索周り
定数探索は**「最初はレキシカルスコープ、見つからなかったら継承チェーン」**
ということだけ覚えて少しググってほしい。
(絶対参照/相対参照辺りは一旦理解を保留しても良い。あくまで調査した範囲だが、Ruby Goldではその点をあまり問われない。全く無いとは言えないが...)

きっちりした情報がほしいという人は[Rubyの仕組み](https://www.amazon.co.jp/dp/B01IGW56CU/) の第6章が参考になる。
該当箇所は20ページ程度なのでこのためだけに買うには少しお高いが、
Ruby自体に興味のある人なら買って損はない。

#### クラス変数
クラス変数に関しても少し足りない。これは公式リファレンスが参考になる。

https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#class
https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#class_var_scope

特に以下の記載が重要になると思う。

> クラス変数は、その場所を囲むもっとも内側の(特異クラスでない) class 式または module 式のボディをスコープとして持ちます。

この辺りは一旦保留して、問題集を解きながら実際に行き当たったタイミングで調べるのも良いかもしれない。

### 学習完了時点での予想スコア
**50-60点**

ここで受けてもまぁ受からないよね、というレベル。

**根拠:**

- 「Rubyのオブジェクトモデルに関する知識」を問う設問が全体の半分強ある
- 恐らく無勉でも運だけで20点位は取れる(はず)

## 問題集を繰り返し解く(予想スコア: 70-80点)
オブジェクトモデルを押さえたらもう問題集を解きはじめて良い頃合いだ。

前述の**「その他種類が多くてよくわからん」試験範囲**はどうするって？
1つ1つ学習するのはめんどくさいので、実際の問題を解きながら調べながらで学んでいくことをオススメする。

この辺り種類は多いものの出題の形式は大体決まっているようだ。パターンを押さえてそこから知識を広げていく方が効率が良いだろう。(ただしその分「知識を広げる」行為は主体的に行う必要がある)


### 使える問題集の話
問題集は以下の3つを使えばOK。(他はあまり見つからない)

- [REx(Ruby Examination)](https://rex.libertyfish.co.jp/)
- [[改訂2版］Ruby技術者認定試験合格教本（Silver/Gold対応）Ruby公式資格教科書](https://www.amazon.co.jp/dp/B0756VF9Y3)  
の基礎力確認問題 & 模擬試験 **(両方重要。本番にそのまま出ることも！)**
- [CTC Ruby技術者認定試験【Gold】模擬問題](https://www.school.ctc-g.co.jp/ruby/training_ruby_gold_01_10.html)  
  (サ終してしまったITトレメとわりと同じ内容という風の噂)

問題集はひたすら周回するのが一番手っ取り早い。
ソシャゲのマラソンみたいなノリで、ひたすら走るべし。

実際に私が用いた手順を紹介する。参考にしてほしい。

1. RExを３回連続90点以上取れるようになるまで回す  
(RExは受ける度にある程度問題が変わるので一番オススメ！)
2. 教本の問題を解き、100点が取れるまで繰り返す
3. CTCをサラッと解く(この段階では恐らく容易に良い点が取れるはず)

### 問題集の答えを覚えてしまって困る話
問題集を繰り返すと必然的に答えを覚えてしまう。
この状態でただ漫然と問題をこなしても、本番で通用する知識を身に付けるのは難しいだろう。

そんな時に強くオススメしたいのが、
**問題の背景や出題意図、回答の理由等を(頭の中なり口に出したりして)毎回説明してみる**
ことだ。

問題によっては今ひとつ上手く説明できなかったり、ちょっとした疑問が浮かぶものがあると思うので、問題番号をメモっておく。後ほど徹底的に調査して、説明できる/疑問を潰す事を繰り返すと、学びの深度が増して合格に近づく。

調査のやり方としては例えば、、、

- 問題集の解答を読む
- ネットや書籍で調べる(特にRubyリファレンスは積極的に活用したい)
- irb等で実際に動作を確かめる
- 理解した内容をメモしてみる

などなど。。。

特にirb等で実際に動作を確かめると、自然と派生動作も確かめたくなるのでオススメだ。

また学んだ事を文章に落とし込むのも良い。以下のブログで紹介されている"学習メモ"が参考になる。
個人的には「なんとなく理解しているがイマイチ不安」な内容を深めるのに特に効果があった。
[RubySilverに合格したので学習メモを公開](https://chihaso.hatenablog.com/entry/2020/10/01/234139)

この辺りを広く深くやればやるほど、応用の効く知識が身につき、恐らく本番に強くなるだろう。

### 学習完了時点での予想スコア
**70-80点**

運がよければこの段階でも合格できるかもしれない。。。というレベル。

**根拠**

- 自分の経験として、RExで３回連続90点以上取ったあと、初見の教本の模擬試験で80点を取った  
(本番はそれよりも難しいことも考慮)
- 合格記事を数多く漁った限り、上の問題集で頻出っぽい問題を落としていても、合格点に達し得る様子

## 先人の残したブログで知識を補う(予想スコア: 85点以上)
この段階でも運が良ければ合格できるようにも思う。ただそれもせいぜい60%程度の確率だろう(適当)。
受験料が15000円とお高めなRuby Goldでは少し心もとない。

ここからは先人の残してくれたブログを見ながら知識を磨き上げていく。実際のところ上の問題集ではカバーしきれていない内容も多いので、確実な合格のためには欠かせないプロセスかなぁと思っている。

以下私がお世話になったブログを紹介する。これら全てを、ページ内でさらに紹介されているリンク先含めて押さえれば、本番での初見殺しを可能な限り回避できるはず。

- [Ruby Gold勉強方法のまとめのまとめ](https://tamata78.hatenablog.com/entry/2015/08/17/215136)
- [1ヶ月後「Ruby Association Certified Ruby Programmer Gold version 2.1」に合格する方法](https://qiita.com/sogu/items/5ff2bf8702e14daf1804)
- [武田哲也さんのRuby技術者認定試験受験記](https://togetter.com/li/769555)
- [Ruby Goldで92点をとって合格する勉強法まとめ](https://www.tom08.net/entry/2017/09/22/221840)
- [ruby gold 落ちました・・・](https://qiita.com/7sgg_m/items/95be0f9b80502218ad8c)
- [Ruby Gold 試験範囲を一気に見直す](https://tamata78.hatenablog.com/entry/2015/11/03/101002)

### やっぱりただ読んでるだけじゃ良くない話
上のブログを見る際も、問題集で分からない事に遭遇した時と同じように対応した方が良い。つまりただ書いてあることをなぞるのではなく、理解するために色々な手段をとり、出来れば実際に手を動かす。

また関連リンク含めるとそこそこ分量はあるので、合間に改めて問題集を解く時間を作ると多少気分が紛れる。ここまで来ていれば1回30分ちょっとで終わるだろう。ブログの内容も踏まえれば相乗効果でさらに学びが深まるはず。1日1回はいずれかの問題集を解く、というのも良さそうだ。(やった)

多分この頃にはRuby Goldの勉強にとっくに飽きて嫌になっているとは思う。私も早く終わらせたい気持ちでいっぱいだった。でももうひと踏ん張りだ。できる範囲でやってみて！

### 学習完了時点での予想スコア
**85点以上**

ある程度余裕を持って合格できる、はず。。。

**根拠**

- 上のブログ全てに目を通した私が、本番で目にした完全初見の内容は2,3問程度だった。  
  (もちろん運もあるとは思うが。。。)
- 90点とった(私が)

# さいごに
まぁこんだけ頑張れば受かるよ多分！受かると思いたい！

あとは試験当日に体調を崩さないように気をつけることと、当日は２種類の本人確認書類が必要になること辺りに注意して、ズバッと合格を勝ち取ってください！

改めてになるけど、予想スコアは併記した程度の薄弱な根拠しかないのであくまで参考って思っておいてね！

最後にこんなに長くなるとは思わなかった！ 疲れた！ なげぇよこの記事...