Ruby技術者認定試験Silverに合格した際の勉強法

先日、Ruby技術者認定試験silverに無事一発合格できました。

  • Ruby技術者認定試験を受けるべきか?
  • 合格した人って何をどのくらい勉強したんだろ?
  • 過去問とか実際に出た問題を知りたい

という思いや疑問を受験前の自分も抱いていたので、当時の勉強法や実際に出題された問題をまとめてみます。

Ruby技術者認定試験とは

Ruby技術者認定試験制度は、Rubyベースのシステムを設計、開発、運用するエンジニア、Rubyでシステム提案を行うコンサルタント、Rubyを教える講師及びRubyを学ぶ学生などを対象とした認定試験制度です。認定者は、Ruby技術者としての技術力を公正に評価され、高い水準のRubyによるシステム開発能力を持つことを認定されます

引用元:Ruby Association

簡単にまとめると「Rubyの基礎的なことなら知っているよ」ということをを証明できる資格です。

試験概要

  • 制限時間90分
  • 50問で4択(1問2点)
  • 76点以上で合格
  • 難易度はGoldとSilverの2つ
  • 受験料は16,500円(学生は半額)
  • GoldはSilverを合格しないと受験できない

試験の難易度

この試験ですが、しっかりと勉強していけば決して難しいものではありません。Goldはかなり難しいと聞きますが、Silverに関してはそこまで身構える必要は無いかと思います。

というのも、本番の問題は後述する参考書やサイトの問題を少しいじったようなものがほとんどなのです。

要領の悪い筆者に関しては1か月弱かかりましたが、一般的には2〜3週間ぐらい勉強すれば合格できるのではないでしょうか。

結果発表はいつ?

得点に関しては本試験終了後すぐに公開され、合否もその場で判明します。

そしてもし合格だった場合、1週間後ぐらいに電子版での合格証明書が届きます。

早めの予約がおすすめ

今回受験して感じたことですが、とりあえず早めに試験の予約をしてよかったです。

私が怠惰だからというのもありますが、いつまでも予約しないと「まだ受けないから勉強しなくていいや」みたいな思考になってズルズルいってしまうので、取り敢えず早めに予約しておくのが良さげかと。試験は基本いつでも受験することが可能ですからね。

合格までの勉強法

  1. 参考書を1.5周ぐらい読む(1〜3週間)
  2. 頻出のメソッドを覚える(4〜5週間)
  3. ひたすら問題演習(5〜6週間)

勉強期間は1か月半ぐらいで、学校の勉強の合間にマイペースで進めていました。

1. 参考書を1.5周ぐらいする

Ruby技術者認定試験合格教本をメインの教材としていました。ぶっちゃけこれ一冊さえあればなんとかなるかと思います。

ですがこの参考書、かなり簡潔にまとめられているもののボリュームが相当あります。

実際私も序盤は「読破するぞ」と意気込み1〜2週間近く睨めっこしていたのですが、しばらくしてから「あれこれ一生終わらなくない?」と気付くことに。

なので一通り読んで理解したら、すぐ次のステップに移ってよいかなと。どうせ問題演習で分からないところを調べる辞書として手垢まみれになるので。今になって思うのは「もっと早くから問題演習に取り掛かればよかった」、これに尽きます。

ちなみに上の参考書は説明が端折ってあるところもあるので、そこはたのしいRubyなどの他の書籍で補完していました。

2. 頻出のメソッドを覚える

試験ではメソッドに関する問題が大半を占めるのでまずメソッドと仲良くなる必要があります。そこでベタではありますが、単語帳を用いて暗記する方法をとりました。

ちなみに単語帳に書いたメソッドの数は130ぐらいです。(覚えたとは言ってない)

※何が何でも一発合格したいという方以外は、ぶっちゃけここをすっ飛ばして問題演習に取り掛かってもいいと思います。

3. ひたすら問題演習をする

そしていざ問題演習へ。

一日50問を解くことをノルマとし、間違えた問題やポイントは逐一メモ帳にまとめていました。

問題演習ができるサイト

次にその問題演習で利用した2つのサイトをご紹介します。

1. REX

REXはRuby技術者認定試験の問題をランダムで出題してくれるサイトです。ちなみにGoldの問題もあります。

参考書や本試験より難易度は少し高めですが、これに慣れておくことで本試験が簡単に感じるようになります。前半に「そこまで難しくなかった」と書きましたが、それもこのサイトでしごかれたおかげかもしれません。

しかし50問解いて初めて点数と解説が見られるので、ある程度まとまった時間が必要になるのが少しネックですね。

2. DIVE INTO EXAM

DIVE INTO EXAMは先ほど挙げたREXと同じように、問題をランダムで出題してくれるサイトです。

難易度は参考書より少し高めで、REXよりは少し簡単です。余裕があれば触ってみるといいかもしれません。

結局どのサイトを使えばいいのか

私の場合はここで挙げたサイトを全部日替わりで50問ずつ解いていたのですが、本試験で出た問題の多くは参考書の練習問題から多く出ていました。

なので以下のような流れでやってくのがおすすめです。

  1. 参考書の問題を完璧に解けるようにする
  2. REXの問題にも少し手を出し、実際の試験形式に慣れる

実際に出題された問題

この試験、実は過去問といった過去問があまり出回っておらず、あまり本番の問題を体験できる機会がありません。

そこで本試験を受けて印象に残っていた問題を思い出せる範囲でまとめました。試験前の確認の際などに参考にしてみてください。

zipとtransposeの違い

a = ["松", "竹", "梅"]
b = ["松" ,"たか", "子"]
a.zip(b) do |i| #選択肢1
p i
end
[a,b].zip do |i| #選択肢2
p i
end
[a,b].transpose.each do |x,y| #選択肢3
p [x,y]
end
[a,b].transpose.each do |i| #選択肢4
p i
end

この中で同じ出力結果になるのはどれかという問題。

基本的にほとんどの問題で選択数の指定があるのですが、この問題含め稀に「複数選択」というのがあるので注意が必要ですね。

正規表現

/^[Rr]uby$/
/^Ruby|ruby$/
/^[Rr][u][b][y]$/
/^R|ruby$/

この中から「Ruby」もしくは「ruby」という文字列にのみマッチする正規表現を2つ選ぶ、という問題。

確かこれは参考書の練習問題でも出ていたので助かりました。例えば選択肢4の場合、行頭がRならなんでも許されてRolandでもマッチしてしまうので注意が必要ですね。

「?A」

pA

これも参考書の練習問題で出たもので、「この類の問題が本当に本番で出るのか?」と高を括ってたら本当に出題されました。

grepメソッド

a = ["a", "8", "b", "123", "c"]
p a.grep(/d/).length

grepはその配列を引数の正規表現にマッチする要素のみにすると、いうのは理解していたのですが、この場合「\*とか+はないから一桁の8のみ?」「それとも123の方も?」とかなり迷いました。

答えとしてはどちらも当てはまります。2が出力されます。

exit

begin
p 1/0
rescue ZeroDivisionError
p "hogehoge"
exit 1
ensure
p "fugafuga"
end

実行結果を聞かれるものでした。

文字コードの設定

# coding:Shift-JIS
# -_- charset: Shift-JIS -_-
# encoding:Shift-JIS

「この中で文字コードをShift-JISに設定できるものはどれですか」的な問題。(4つ目の選択肢は忘れました、すいません)

これも参考書の問題で出たので助かりましたね。

!の付かない破壊的メソッド

そのメソッドが破壊的か非破壊的か覚えてないと解けないような問題がありました。

なので先にの付かない破壊的メソッドを全て覚えてしまえば、「それ以外のメソッドはが付かない限り非破壊的だ」と判断できるので楽になります。

ruby/destructive-method)

というわけでそんな「の付かない破壊的メソッド」をクラスごとに以下にまとめたので参考にしてみてください。

Stringクラス

  • concat
  • insert
  • replace
  • <<
  • []=

Arrayクラス

  • pop
  • shift
  • unshift
  • push
  • concat
  • insert
  • fill
  • replace
  • delete
  • delete_at
  • delete_if
  • clear
  • <<
  • []=

Hashクラス

  • shift
  • replace
  • delete
  • delete_if
  • clear
  • update
  • []=

破壊的メソッドの返り値

a = [123, 456, 789]
p a.delete(810) # => 123
p a.slice!(0,1) # => 456

破壊的メソッドの返り値についても注意が必要ですね。

例えばdeleteslice!の場合に返されるのは、要素が消された配列ではなく「消した要素」です。