LCL Engineers' Blog

バス比較なび・格安移動・バスとりっぷを運営する LCLの開発者ブログ

ジュニアクラスのエンジニアに勧めるRuby技術者認定試験Silver&Gold

この記事はLCL Advent Calendar 2020 - 11日目の記事です。 qiita.com

自己紹介

バックエンドエンジニアの高良です。
半年前の入社を期に沖縄から東京へ移住して来ましたが、初体験の冬の寒さに圧倒されており日々新しい暖房グッズを探すことに暇がありません。
前職はSIerで金融系PJのインフラ周りを担当していましたが、Webサービスの開発に興味があったところ、縁あってLCLにバックエンドエンジニアとして入社させて頂けることになりました。現在はRailsによるAPI開発を担当しています。

なぜ取ろうと思ったのか

実際の開発業務に携わるのは入社してからが初めてでした。
元々独学でRuby・Railsを学んではいましたが、どちらかというとRailsの使い方に偏っており、機能単位のロジックの実装スキルに欠けている状態だったため最初の段階では四苦八苦することが多かったです。
そこでメンターの先輩にオススメされて興味を持ったのがRuby技術者認定試験でした。
現在の状況を改善するためにも、資格取得を上期の目標として設定したいという旨をマネージャに相談した所、受験費用は会社負担でOKと言われた事に背中を押され、0から素のRubyに向き合おうという気持ちで資格学習を始めることになりました。

結果

結果としては3ヶ月程でSilver・Gold共に取得することができました。
受験した感想を言うと、Silver・Gold両方ともにかなり役に立ってます。
実務においても「体系的に学んでなかったらここでかなり詰まってただろうな...」と感じるコードに頻繁に出会います。
そもそもプログラミング言語の取り扱いの経験が圧倒的に不足していたため、ガッツリと基本的な操作を学べる機会が出来たのが大きかったです。 特に非情報系の学部卒からプログラミング学習をスタートした方だと似たようなケースが多いかと思います。そういった方が体系的にプログラミングを学習する機会として資格学習に取り組むのはかなりアリではと感じました。
具体的にどういった部分が役に立ったのか、どのような手順で学習したのか等を解説しようかと思います。

実務で役に立ったところ

・文字列・数値・配列・ハッシュ等の基本的なクラスの取り扱いに慣れることができた

Silverでメインになる範囲です。
Rubyで主に取り扱うクラスのメソッドに関する問題が大量に出題されます。
下記が一例です。

  • String
    concat chop chomp split
    upcase slice scan

  • 数値型クラス(Numeric,Float,Integerなど)
    ceil floor round ** chr
    next pred times upto

  • Array(Enumerable含む)
    each each_with_index map inject
    compact uniq transpose flatten sort
    pop push shift unshift

  • Hash(Enumerable含む)
    keys values fetch clear delete reject
    transepose invert has_key? include?

これらのメソッドの使い方を一通り覚えなければならないので、実際に触って試すことを繰り返すうちにRubyの挙動に慣れてきます。
このあたりの操作については実務でも頻繁に行うものなので、学習の効果が目に見えて分かるのが楽しいです。

また、下記のような引っ掛け問題も勉強になります。

s1= 'Hoge'
s2= 'Fuga'

s1 << s2
s1.chop
s1.chomp
s1 + s2

puts s1

それぞれのメソッドの動作が分かれば解けるのでは?と思ってしまいそうですがトラップがあります。
こちらの答えは'HogeFuga'になるんですが、破壊的メソッドや値渡しの概念を理解してないと、 「s1.chopがあるのに最後の文字が消えてない!」と思ってしまいがちです。
このような知識が無ければ、現実で似たような問題が発生した場合、違うメソッドを使ったり、可読性や実行速度の低い書き方をしてしまうなど、目の前の「わからない」を先送りして、ヨシ!としてしまうような事も発生するでしょう。
しかし実装でなく問題形式の場合、とりあえず動けばヨシ!的な手段を取ることが出来ないため、「なぜ動かないのか?」と徹底的にRubyと向き合う事になります。
この資格はそういった所を突いてくる問題が多く、結果それが基礎力の上昇に繋がります。

ハッシュの取り扱いに関しての問題も多いです。 例えばキーの記法について認識が曖昧、ということも学び始めでは多いんじゃないでしょうか。

# キーを文字列にして宣言
hash1 = { 'key1' => 'value1', 'key2' => 'value2' }

# キーをシンボルにして宣言
hash2 = { key1: 'value1', key2: 'value2' }

# キーはシンボルだがhash1と同じ宣言方法
hash3 = { :key1 => 'value1', :key2 => 'value2' }

# キーと値の両方がシンボル
hash4 = { key1: :value1, key2: :value2 }

ここの理解が曖昧だと、値を取り出す際のエラーの原因にもなります。 最初のうちは混同しがちですが、こういった所も体系的に学ぶことで文字列とシンボルの違いについても理解が深まります。
このように基本的な型の取り扱い方に関する問題を解いていく内に、Rubyの基礎力が自然に鍛えられていきました。

・オブジェクト指向を理解することでコードリーディングの速度が向上した

こちらは主にGoldの範囲です。 Goldはオブジェクト指向関連の問題が半分強を占めており、特にクラス継承やメソッドの探索方の問題が多いのですが、これらを理解することで既存PJのコードリーディングの速度が格段に上がりました。

例えば学び始めだと「定義したはずのメソッドがなぜか上手く呼び出せない...」という事がよくあると思います。 その際、メソッドを呼び出した時にRubyが行うことの下記2つのルールを理解していれば、どこが原因でエラーが発生しているのか特定が容易くなります。

・レシーバからメソッドを探しに行く、見つからなければ継承チェーンを登って探す  
・メソッドが見つかったらレシーバをselfにしてメソッドを実行する

selfの正体や継承チェーンの仕組みは理解するまで苦労しました。
しかし一度理解できれば、複数のクラスが絡んでくるような少し複雑なコードでもパニックを起こさず冷静に処理を追えるようになり、結果的に開発スピードの大幅な向上に繋がりました。

・その他役に立った所

・例外処理の細かい仕様(raiseの使い方や例外クラスを指定しない場合の補足対象など)
・定数の参照(Railsでもよく見かける2重コロンの意味など)
・ブロックとProc(ブロックのスコープ、yieldの仕様やProcオブジェクトの使い方)
・正規表現(Rubyではないが、結構ガッツリ問題が出るので記憶に定着する)
・特異クラス(直接的にはあまり意識しないが、継承チェーンの理解に役立つ)

このあたり、細かい仕様は知らずに何となく使っている方も初学者だと多いのではないかと思います。
そこまで頻繁に触れないような所だと、ググる→しばらくすると忘れる→またググるという非効率なループになってしまいがちです。
しかし繰り返し問題を解き続けることにより記憶に定着し、結果として都度ググる手間が減り結果として開発速度の向上に繋がります。

勉強方法

実際に使用した教材を紹介します。
ちなみに勉強時間はそれぞれ1.5時間×1ヶ月強=50~60時間くらいです。
SilverとGold合わせると100時間強くらいですね。

Silver・Gold共通

・改訂2版 Ruby技術者認定試験合格教本(Silver/Gold対応)

公式から出ている教材です。そのため収録されている模擬試験の問題が本番とかなり近いので必須と言えるでしょう。
Silver・Gold両方の問題と各問の丁寧な解説も載っています。
試験にあまり出ない部分の解説も多いので、最初から全て読み込むというよりは一旦問題を解いた後にリファレンスとして使うのが良いでしょう。 中古で探すと改訂前の初版が格安で売られていますが、そちらは使われているRubyのバージョンも古く、現在の試験範囲と内容が大幅に異なっているので注意が必要です。

・REx – Ruby Examination(要Githubアカウント)
rex.libertyfish.co.jp
Silver・Gold共に大量の問題が掲載されています。
模擬試験では毎回違う問題が出題され、それぞれの解説も丁寧かつコピペも可なので、気になるコードがあれば手元ですぐに動かせます。
スマホ版のUIも優れており、外出中の空いた時間にもよく使っていました。
ただSilverの問題に関してはかなり本番に近いのですが、Goldは本番よりはかなりに難しめに作られているような気もしました。
例えばこのサイトだと定数のスコープについての問題が非常に多かったのですが、本番だと2〜3問程度しか出ませんでしたし、公式の模試でもそこまで重要視されている印象は受けませんでした。
私の場合、参考までにこのサイトの模試でSilver90点台、Gold70点台が安定して取れるようになった頃に受験し、1発合格することが出来ました。
完全無料なので、興味がある方は上記の公式教本を買う前にまずこのサイトの練習問題を1度解いてみるのが良いかと思います。

・プロを目指す人のためのRuby入門


動作がよく分からない部分のリファレンスとして使っていました。
特に苦手だったProcやlambda周りのサンプルコードが非常に分かりやすかったです。

Silverで使った教材

・silver_j.md
silver_j.md · GitHub

・Rubyがミニツク Ruby技術者認定試験(Silver)対策問題集 www.minituku.net

こちらも無料の問題集です。
問題も本番に近いので必ず解いておきましょう。

Goldで使った教材

・メタプログラミングRuby 第2版


Goldはオブジェクト指向の問題が半分近くを占めているため、そこの理解が曖昧なままだとGoldの合格は至難の業と言っていいでしょう。
こちらの書籍はRubyのクラスの継承や特異クラス、メソッド探索について丁寧に解説されています。その部分がある程度理解できるようになれば、Goldの問題の半数近くはパズルを解くだけのような感覚になります。必読です。
なお試験範囲と被るのは本書の5章までです。最速で試験合格を目指す場合は5章までを繰り返し読むといいでしょう。

・Ruby技術者認定試験【Gold】模擬問題(CTC)
www.school.ctc-g.co.jp
無料の問題集です。難易度が比較的易しめなので、こちらで高得点を取れても油断しないようにしましょう。

さいごに

入社してすぐ学習を始めましたが、初めのうちに学んだ事で成果を存分に業務に活かす事が出来ています。
Goldと聞くと若干ハードルが高く感じますが、きちんと学習ステップを踏んでいけば実務経験が浅くても合格できる難易度になっているので、ぜひジュニアクラスのエンジニアにこそチャレンジしてみてほしいです。