Ruby技術者認定試験(Silver 2.1)に合格しました

12/17に、Ruby技術者認定試験(Ruby Association Certified Ruby Programmer Silver ver 2.1)を受験し、見事合格しました。点数は78点とギリギリでしたが、一回で受かるとは思ってなかっただけにとても嬉しかったです。忘れないうちに勉強法とか対策の仕方とか、自分がやったことを書いていきたいと思います。

#勉強期間
ざっと1ヶ月半くらいです。勉強自体は10ヶ月ほど前から始めていたのですが、大学の勉強ややることがあるたびにRubyの勉強を後回しにしていたため、空白期間が8ヶ月ほどあったので実質このくらいかなと。あまり明確に勉強した期間は覚えてません。すいません。

#使用した教材
- [Ruby技術者認定試験公式ガイド](https://www.amazon.co.jp/RUBY技術者認定試験-公式ガイド-ITpro-BOOKs-伊藤忠テクノソリューションズ/dp/4822234304) - Ruby1.8対応版なので少し古いですが（現時点で新品がないです）Silverの出題範囲を一通り、効率よく抑えることができます。模擬問題も100問と充実しており、とてもオススメです。ただ、網羅性はあるとは言い難いので、この１冊で試験合格は少し難しい感じがします。

- [パーフェクトRuby](https://www.amazon.co.jp/改訂2版-パーフェクトRuby-Rubyサポーターズ/dp/4774189774/ref=pd_sbs_14_5?_encoding=UTF8&pd_rd_i=4774189774&pd_rd_r=a8b23b71-01fc-11e9-b946-19175fe0db1c&pd_rd_w=a2Ikm&pd_rd_wg=4FzM2&pf_rd_p=cda7018a-662b-401f-9c16-bd4ec317039e&pf_rd_r=BZYAYBEHD3MCMR8TZ2PZ&psc=1&refRID=BZYAYBEHD3MCMR8TZ2PZ) - 公式ガイドだけじゃ補えない知識があったらこれでなんとかしてもらおうと買いました。結果的にあまり使わなかったです。鈍器。
- [REx - Ruby Examination](https://rex.libertyfish.co.jp) - GitHubのアカウントを持っていれば誰でも使うことができるWeb問題集です。自動で答え合わせをしてくれたり、結果を記録してくれます。同じような問題でもコードが一部だけ変わっている、と言うような出題が多いので、答えを覚えてしまうことなく勉強ができます。実際、この問題集でしか見たことないようなメソッド(Array#zip,Array#transpote)が今日受けた試験で出てきました。
- [ミニツク - Rubyのe-ラーニング研修システム](http://www.minituku.net) - e-ラーニング形式で問題を解いていくweb問題集です。僕はこの中の「Ruby技術者認定試験(Silver)対策コース」のみを解きましたが、Ruby初心者に向けた「Ruby入門コース」や、プログラムの作成練習がしたい人向けの「Ruby演習コース」などもあります。無料で誰でも使うことができます。解説も丁寧でオススメです。
- [模擬問題集(Silver試験用)](https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0) - 50問の模擬問題が載っています。個人的に、本番の試験と一番難易度が近かったような気がします。

あとは公式リファレンスを見たりRubyの実行環境があるので適宜プログラムを実際に動かしてみたりしました。

#勉強法

勉強の仕方は他に受かった方がブログで書いていたりしますのでさらっといきます。

1. 公式ガイドを2周読む（1.8から2.1で多少変わった点があるかもしれないので、本に載っているソースコードは実際に動作を見たりした）
2. 公式ガイドの模擬問題を解く→間違えたところに印
3. 解説読んだり実際に試してみたり公式ガイドを見返すなどする
4. もう一回2,3を行う
5. 印がついたところのみもう一回→全問、一回は自力で正解するまでやる
6. 他の問題集も同様に（RExは印をつけられないのでとにかく何度も）

#抑えた方がいいところ

決していい点で合格したわけではないからこそ、「もっとここ覚えとけばよかったな」とか「これは抑えておいてよかったな」と言う点をまとめておきます。参考にしてみてください。

##破壊・非破壊メソッドのこと
試験では色々なメソッドについて聞かれます。それが破壊的メソッドなのか非破壊メソッドなのかの区別をきちんとつけておきましょう。「!」がつくか否かで判断できるのはいいですが、注意しておきたいのは「!」がついていなくても破壊的な役割をするメソッドです。例えば、`Array#concat`や`Hash#update`は破壊的メソッドです。自分が受けた試験でもこの二つは出題されました。

##同じ働きをするが、名前が違うメソッド
中には、名前が違っていても同じ働きをするメソッドがあります。特に

- `Array#map`と`Array#collect`
- `Array#find`と`Array#detect`
- `Array#find_all`と`Array#select`

は、それぞれ違う名前ですが同じ動きをします。そして挙動もそれぞれにて似ているので抑えておいてください。問題を解くうちに色々出てくると思うので、ことあるごとに整理しておくと良いです。(ver1.8現在のものです)

##挙動が似ているメソッド
これは本当に大切だと思います。例えば、

>テキストファイルを読み込んだファイルオブジェクトから1行ずつ読み込み表示したいときに、目的と一致するIOクラスのメソッドはどれか。2つ選べ。

>1. read
2. find
3. gets
4. readline
5. readlines

なんて問題が出た時、それぞれのメソッドの挙動が言えますか？また、正解の２つの中にも微妙な挙動の違いがあります。このような似た挙動をするメソッドは区別をつけて覚えたほうがいいです。他にも、

- `String#chop,String#chomp`
- `Hash#reject(!),Hash#delete,Hash#delete_if`
- `String#eql?,String#equal?`
- `Array#pop,Array#push,Array#unshift,Array#shift`

など。まだまだありますが探してみてください。

##File#openのモードとstrftimeの書式設定
どの問題集にも必ずと言っていいほど出てくる、紛らわしさの象徴（だと個人的に感じている）です。少し局所的な話ですが、ファイルを開くときに設定する`a,r,w,a+,r+,w+`のことと

```ruby:main.rb
require 'date'

p DateTime.now.strftime("%Y/%m/%d(%a) %H:%M:%S　There is a 40%% percent chance of rain today.")
```

の`%Y/%m/%d`の部分とかですね。

strftimeの書式設定については自分がまとめた記事もあるので是非参考にしてみてください。

[Rubyで時刻の書式化色々まとめ](https://qiita.com/fyhcu/items/0cbab102700761d48727)

#終わりに
結局は「紛らわしいところをちゃんと区別して覚えられるようにしよう」と言うところですね。参考書に書いてある明瞭なところはちゃんと覚えたつもりでしたが、こういうところがいまいち覚えきれずに点を落としてしまったのが悔しいところです。また何か大切なことがあれば追記します。

#補足
今回の解説は、基本的に自分が勉強した参考書の通り、ver1.8に基づいて説明しています。極力現バージョンに対応するよう調べながら書いたつもりですが、何か修正などありましたらコメントなどよろしくお願いします。それでは。

就活頑張ります。