🏅

【2023年12月版】Ruby Gold v3 受験記 + 参考リンク集

2023/12/04に公開

記事の概要

本記事では、Ruby技術者認定試験のGold version 3(以下、Ruby Gold)の試験の受験に関して以下の内容を紹介します。

  1. なぜ受験をしたのか?受験をして何が良かったのか?
  2. 試験対策
  3. 個人的な注意ポイント
  4. 参考リンク集

筆者の自己紹介

こちらをご覧ください。
https://github.com/yuki-snow1823
Rubyを本業で使い始めて1年半くらいです。エンジニアとしては経験3年くらいです。
Ruby Goldは86点で合格することができました。

なぜ受験をしたのか?

受験の動機は2つあります。

まず、実務的な目的です。業務でRubyを使い始めてからRuby Silverを取得したのですが、もう少し踏み込んだ内容の理解を深めたいと思ったためです。例えば、継承関係だったり、クラスメソッドやインスタンスメソッドの違いだったり、実装の際にそれらを取捨選択する判断基準だったり、そもそもの書き方だったり、そういった部分に自信を持ちたかったので受験を決めました。

もう1つは、今年はRubyに関して頑張りたい気持ちが強かったからです。今年からRubyKaigiやKaigi on Railsにオフラインで参加しました。そこで「Rubyistとして頑張ろう!」「どんな話をしているのかもっと理解できるようになりたい!」という気持ちが強くなったので、Ruby Goldの学習を通じてより深くRubyを学びたいと思いました。これらのカンファレンスからは非常に良い影響をもらったので、ぜひ機会があればオフラインで参加してみてください。

受験をしてみて何が良かったか

1つ目は、継承に関する理解が深まったことです。
受験前はclass Hoge < Fugaのような記法で継承した際とmoduleincludeをした際に生まれる挙動の違いなどがよく分かっていませんでした。例えば、同名のメソッドを親クラスによる継承をしてから、またはincludeしてから実行した際にどうなるか、といった内容に自信が持てるようになったのは良かったと思います。
実務のコードでも多くの継承やMix-inを見かけるので、この知見を活用できそうです。

2つ目は、メタプログラミングを知ることができたことです。
Ruby Goldの対策書籍としても挙げられている『メタプログラミングRuby』を読む以前は、メタプログラミングについてほぼ何も理解していませんでした。(Rubyの元になっている言語とかをプログラミングすること?みたいに思ってました)
実際メタプログラミングを学習してみると「こんなことができるのか!」と驚区ことが多く、Rubyをより好きになることに繋がりました。

書籍の1章の一行目には次のように述べられています。

メタプログラミングとは、コードを記述するコードを記述することである。

コードを記述するコードとは、プログラムが実行中に新しいコードを生成し、それを実行することができることだと解釈しています。動的にメソッドを定義したり、呼び出そうとしたメソッドが無かった際の挙動を自由に変えることができたりするなど、危険が伴う反面、非常に学習していて面白かったです。

3つ目は、自分にとって新しいRubyのクラスやメソッドを知ることができたことです。
Goldの受験をしてからはじめて知ったRubyの内容に、下記のようなものがあります。

  • class Fiber
  • class Thread
  • Object#inspect
  • Hash#transform_values
  • Kernel.#eval...etc

Goldに関しては、Silverより覚えることは少ないと聞くこともありましたが、個人的には新たなたくさんの知識を得ることができたと感じています。FiberやThreadに関しても、まだ積極的に使える場所を理解できてるとは言えませんが、そういったものがRubyには存在していると知れたことが良かったです。

総じて、今後Rubyを学習する際や利用する際に、これらの知識の引き出しが増えたことが良かったと考えています。ライブラリのコードやRuby本体の実装を読む際にも、きっと役立つと思います!

試験対策

このセクションでは、具体的にどのような試験対策を行なったかを述べます。
時系列順に書いていきます。

0. まとめノートを作る

まずは、いつでも学んだことを振り返れるようにNotionに「まとめノート」を作りました。勉強を進めていく中で忘れがちなポイントや、繰り返し間違ってしまったポイントはここにどんどん貯めていきます。

以下のような形で記録していました。基本的には、まずiCloudのメモに記録することでiPhone上でも確認できるようにしました。


ここからiCloudのまとめノート

ここまでiCloudのまとめノート


学習を進めていく上で何度も間違えるポイントはNotionの方のメモに移し、学習の終盤や試験の直前に確認しました。


ここからNotionのまとめノート

ここまでNotionのまとめノート


自分の場合、iCloudのメモを振り返ったタイミングで、定数探索、freezeの挙動、クラス変数に関してよく間違えていることがわかったので、それぞれのメモの役割を分けて記録をつけていたのがよかったです。

1. Ruby技術者認定試験合格教本を読む

学習を記録する用意ができたら、まずRuby技術者認定試験合格教本を読みました。

https://gihyo.jp/book/2017/978-4-7741-9194-2

内容も読みつつ、巻末に模試があるのでそれを3回ぐらい行いました。最初に1回やってみて、学習の中盤、終盤にも行う感じです。
最初に1回やったときは30点くらいしか取れませんでしたが、勉強しはじめてもう1回行って60点、直前にやって90点、とスコアを上げることができました。

本を読むことで基礎的な勉強をすることができますし、模試からも似たような問題が出題されていそうなので、合格を目指すならマストだと思います。

2. メタプログラミングRubyの1〜5章を読む

次に、メタプログラミングRubyを読みました。これはRuby Gold公式の受験対策用資料にも挙げられています。

https://www.oreilly.co.jp/books/9784873117430/

読みはじめたときは、メタプログラミングが何なのかまったく分かりませんでしたが、この書籍では丁寧に解説があって楽しかったです!1日1章読むようなペースで内容が作られていて、ペースを保って読むことができました。

この書籍を読むと、試験対策ができるだけではなく、冒頭で説明したように動的にメソッドを定義する方法や、呼び出そうとしたメソッドが無かった時の挙動を変更する方法など、Rubyのおもしろいポイントをたくさん知ることができます。

実際、この書籍で学習した内容は業務に活かせた部分もありますし、これまで読めなかったコードが読めるようになったので、試験のためではなくRubyエンジニアとして役に立ちました。試験に出そうな範囲が5章までだったのでいったん学習をとめましたが、試験後にすべて読みました。

3. RExを平均90点取れるまで繰り返す

次に、RExです。

https://rex.libertyfish.co.jp/

これは、リバティフィッシュ株式会社さんが提供してくれているRuby技術者認定試験の対策Webアプリです。さまざまな問題を解いて、点数を出してくれます。

大変お世話になりました。この場を借りてお礼を申し上げます。

Ruby Goldの範囲の中から出題をしてくれて、上記に挙げた本をただ読んだだけでは解けないような応用問題もたくさん出してくれます。

このRExを何度も解き、間違った問題をメモして、電車の中で読むのを繰り返しました。
終盤は電車に乗っている30分の間で、問題50問1セットを解いたりもしました。

問題を解く中で注意していたことは、なぜ解答がそうなるのかを説明できるようにすることです。正解の理由を説明できない問題は実際に調べて、不安がなくなるようにしました。

直前の平均点は85点ほどでした。他のRuby Goldの記事を拝見すると90点や満点をとっていらっしゃる方もいましたが、自分にとってはなかなか難しかったので、当日は見直しをしっかりして凡ミスをなくそうと注意しました。

4. 実行環境で実際に試す

書籍も読んで、ある程度問題を解いたら

  1. 実際に自分でコードを書いて
  2. 実行結果を予想して
  3. 答え合わせをする

といったことを行いました。

Paizaさんのサービスを使うと、バージョン3系のRubyでサクッとコードを実行できるのでありがたかったです。

https://paiza.io/ja/projects/new

例えば、includeprependを複数実行する場合、どのような結果になるのか。

module A
end

module B
end

module C
end

module D
end

class E
    include A
    include B
    prepend C
    prepend D
end

p E.ancestors # DCEBA

では、include A, Bのようにした場合もどうなるでしょう。ぜひ試してみてください。

また、定数探索はどのように行われるのか。

class Base
  CONST = "Hello, world"
end

class C < Base
end

module M
  class C
    CONST = "Good, evening"
  end
end

module M
  class C
    def greet
      CONST
    end
  end
end

p M::C.new.greet # "Good, evening"

「〜だから、〜という結果が出るはずだよな?」と仮説を立ててコードを書いて実行し、あっていたら「じゃあ、次はもっと複雑にしてみてどうなるだろうか?」という学習をの繰り返しました。

5. 模擬試験

ここまでできたら、時間を測って模擬試験を行いました。

具体的には、Ruby技術者認定試験合格教本の模擬試験と、下記のリンクの試験です。

prep-test/gold_ja.md at version3 · ruby-association/prep-test · GitHub

Gold.md · GitHub

6. 先人のみなさまのブログを読む

さらに行ったのが、受験をした人や試験範囲の記事を書いている人のブログを読むことです。

実際に受験して落ちてしまったけど、こういうところに注意したほうが良いなどを書いてくださっている方もいらして感銘を受けました。記事の公開タイミングによっては、試験のRubyのバージョンが2系の場合もあるので注意が必要ですが、問題によっては同じ部分もあるので非常に勉強になりました。

QiitaやZennにも記事はありますが、Google等で検索するとブログが出てくるので、自分はそちらを中心に読みました。

Ruby Gold 試験範囲を一気に見直す - 気軽に楽しくプログラムと遊ぶ

Rubyゴールド落ちちゃったから資格試験に出た問題を振り返ってみる - おぴよの気まぐれ日記

【HSPミニマリストの合格体験記】Ruby Gold 合格しました!落ちたかと思った… | しゆのぼのぼの日記

7. まとめノートを読んで、弱い部分を見直す

ここまでできたら、あとは0で作成したまとめノートを振り返って、間違いやすいポイントを直前まで注意して試験を受けるだけです。

必ず、1〜6の勉強の際に間違ったポイントはまとめノートに適宜書きましょう。

TIPS 1:2→3の差分を見る

ここまでで対策は十分だと思いますが、Ruby Goldはバージョン2系の試験も過去にあったので、Rubyが3にバージョンアップした際の差分を見ておくのも大事だと思います。

自分は @jnchito さんの記事を読みました。

https://zenn.dev/jnchito/articles/24e0bd7fd1045d

TIPS 2: ChatGPTも間違える

Ruby Goldの問題やメタプログラミングに関する質問をChatGPT(GPT-4)にすると、間違いを返答することが多々ありました。ちょっとした解答の確認に使うのは良いですが、必ず公式ドキュメントなどを読んで正しい説明かを確認しましょう。

個人的な注意ポイント

学習をしていて、個人的に間違えることが多かった部分を共有いたします。

freezeの挙動

str = "Hello"
str.freeze
# str << " World" # FrozenError

num = 10
num.freeze
# num = 20 # 問題なし

array = [1, 2, 3]
array.freeze
# array << 4 # FrozenError
# array[0] = 10 # FrozenError
array += [4] # 問題なし

sample_num = array[0]
sample_num = 10 # 問題なし

どういう変更を行うとFrozenErrorになるのか。言い換えると、オブジェクトに変更を加えているように見えて加えていない書き方はどれかなど考えることが多かったです。

定数探索

継承や得意クラス、グローバル変数などが関わるとさらに難しくなります。

class C
  CONST = "Hello, world"
end

$c = C.new

class D
  class << $c
    def say
      CONST
    end
  end
end

p $c.say # "Hello, world"

可変調引数と展開

これもよく間違えました。

def array(a, *b)
    p b
    p "---"
    p *b
    p "fin"
end

array(1, [2,3,4])
array(1, 2, 3, 4)
array([1, 2, 3], 4)

# 実行結果
=begin
[[2, 3, 4]]
"---"
[2, 3, 4]
"fin"
[2, 3, 4]
"---"
2
3
4
"fin"
[4]
"---"
4
"fin"
=end

クラス変数、クラスインスタンス変数

それぞれ継承先でどのような扱いがされるのか調べておいたほうが良いです。

module M
  @@val = 75

  class Parent
    @@val = 100
  end

  class Child < Parent
    @@val += 50
  end

  if Child < Parent
    @@val += 25
  else
    @@val += 30
  end
end

p M::Child.class_variable_get(:@@val) #150
class C
  @v = 1
    def m
      @v
  end
end

p C.new.m # nil

以上、自分の苦戦したポイントでした。

参考リンク集

最後に、お世話になったリンク集です。

よく見ていたもの

https://rex.libertyfish.co.jp/

https://qiita.com/universato/items/e5a9b2fb75e412f8e780

先人のみなさまのブログ

https://opiyotan.hatenablog.com/entry/ruby-gold

https://shiyu-no-bonobono.com/it-programming/【hspミニマリストの合格体験記】ruby-gold-合格しました/

https://rightgo09-ruby.hatenadiary.org/entry/20121226/p1

https://tamata78.hatenablog.com/entry/2015/11/03/101002

問題に関連した記事

https://qiita.com/super-mana-chan/items/ca728d90db7c53295b15

https://speakerdeck.com/hogucc/kaigi-on-rails-2023

https://qiita.com/heburushu/items/13c5d7f3a5c17482fd11

知らなかった用語

https://jeea.or.jp/course/contents/12115/

以上になります!これから受験される方を応援しています!

Discussion