問題ページへ 問題ページへ 
前回の受験結果ページへ 前回の受験結果ページへ 
解答の解説記事 解答の解説記事 



【Ruby検定】平均点
Webサイトでの受験者 48.7
会場での受験者 27.3
総合 38.0

 まつもとゆきひろ氏が理事長を務めるRubyアソシエーションでは,2007年10月から始まった「Ruby認定試験」を開始した。プログラミング言語「Ruby」の正しい知識を身につけたエンジニアを育成し,Rubyによるシステム開発の普及を目指すことが目的である。

写真1●まつもとゆきひろ氏
写真1●まつもとゆきひろ氏
[画像のクリックで拡大表示]
 ITpro EXPOで実施した「まつもとゆきひろのRuby検定」は,Ruby認定試験と同様,Rubyアソシエーションが監修し伊藤忠テクノソリューションズが問題作製を担当した,本番さながらの試験だ。講評セッションでは,まつもとゆきひろ氏が自ら,伊藤忠テクノソリューションズの大場光一郎氏ともに登壇し問題を解説した。

 平均点は100点満点で38.0点と,全体に専門的な知識を問う難しい試験だった。本番の試験も,伊藤忠テクノソリューションズの技術者が不合格になったというほどで,合格者はかなりの腕の持ち主ということになる。

 各問の正答率は以下のようになった。

問題Q1Q2Q3Q4Q5Q6Q7Q8Q9Q10
正答率(%)32.6 27.6 73.4 52.1 36.3 84.4 23.8 59.3 72.4 42.8

問題Q11Q12Q13Q14Q15Q16Q17Q18Q19Q20
正答率(%)65.5 63.3 31.6 67.8 36.4 18.6 77.7 62.9 73.2 17.2

 正答率が17.2%と,最も低かったのが問題20だ。

【問題20】
以下のコードを実行した時の出力として正しいものを選択してください。

 t1 = Time.parse("S54.7.16 12:00")
 puts t1.strftime("%Y/%m/%d %H:%M:%S")

 【選択肢】 正解
A) parseメソッドが定義されていないため実行時にエラーとなる
B) 「1979/07/16 12:00:00」と標準出力に表示される  
C) 年数は和暦(S54)での入力が許されないので実行時にエラーとなる  
D) dateライブラリが読み込まれていないため実行時にエラーとなる  

写真2●伊藤忠テクノソリューションズ 大場光一郎氏
写真2●伊藤忠テクノソリューションズ 大場光一郎氏
[画像のクリックで拡大表示]
 正解は「A)parseメソッドが定義されていないため実行時にエラーとなる」である。試験はRuby本体のみ,ライブラリを読み込まない状況での振る舞いを問うものだからだ。timeライブラリが読み込まれていればこのプログラムは正常に実行されるためか,42.4%の受験者が「B)『1979/07/16 12:00:00』と標準出力に表示される」と答えてしまった。

 4番にdateライブラリという選択肢があるが,残念ながらdateではなくtimeである。紛らわしいために多くの受験者が間違えてしまったようだ。

 timeライブラリを組み込むには「require "time"」を実行する。

 次に正答率が低かったのが問題16で,18.6%だった。

【問題16】
以下のRubyの演算子の中で再定義可能なメソッドとして定義されているものをすべて選択してください。

 【選択肢】 正解
A) []
B) !  
C) =  
D) <=>

 正解は「A)[] 」と「D)<=>」である。「C++では『=』は再定義できる」(伊藤忠テクノソリューションズ大場氏)ため,混乱した受験者もいたのかもしれない。

 「Rubyでは多くの演算子が再定義可能だが,代入など,メソッドで意味が定義できないものは再定義可能になっていない」(まつもとゆきひろ氏)。そのほかには論理和,論理積などが定義できない。列挙すると「?: .. ... ! not && and || or ::」が再定義できない演算子だ。

 その次に難しかったのは問題7。

【問題7】
以下のコードを実行した時の出力として正しいものを選択してください。

 
 a = [1,2]
 b = "world!"
 a.each{|b| a[0] = "hello"}
 print a[0], " ", b, "\n"

 【選択肢】 正解
A) hello world!  
B) hello 2
C) 1 world!  
D) 1 2  

写真3●ITpro EXPO会場での「Ruby検定」解答解説シアターの様子
写真3●ITpro EXPO会場での「Ruby検定」解答解説シアターの様子
[画像のクリックで拡大表示]
 これは,非常に入り組んだプログラムで,実際にはあまりお勧めできない書き方だが,Rubyの動きに関する知識を試す素材としてご覧いただきたい。

 eachメソッドのブロックには,ブロックパラメータ|b|が定義されています。ブロック内では,配列の要素の1と2が変数bに順に取りだされる。変数bには1と2が順に代入され,eachメソッドの実行後,変数bの値は2になる。

 問題はRuby 1.8が対象だが,Ruby 1.9では結果が変わるため注意が必要だ。Ruby 1.9では,ブロックの中の引数はローカル変数になるため,ブロック外への影響は及ばない。そのため,eachメソッド実行後も,bの値は最初に代入された「World!」のまま。そのため実行結果はHellow World!になる。

 まつもと氏から,Rubyの設計思想が語られる解説もあった。問題11は,例外を補足する構文として正しいものを選ぶ問題だった。正解は「beginとrescure」。

 例外補足構文としては,JavaやC++が採用する「tryとcatch」が有名だ。「tryはやってみるという意味で,例外が起きるのが当たり前というニュアンスがある。そうではなく,例外は本来起きてほしくないもの。例外が起きないのが当たり前で,発生したら救助に行かなければならない」(まつもと氏)。

 ちなみに問題11の正答率は65.5%と高かった。

 最も正答率が高かったのは問題6で,84.4%だった。配列への代入とeachメソッドの動作を問うものだが,Rubyプログラムを書いたことがなければ正答できない問題で,受験者のレベルが高いことがうかがえた。

「他の言語との違い」がポイント

 まつもと氏は,全体を通した受験者へのアドバイスとして「他の言語と違う部分の知識を問う問題が多いので,そういった部分を重点的に学ぶと有効」と助言した。

 Ruby技術者認定試験は,これまで,松江市と東京で紙による試験が行われていたが,2月25日からはコンピュータによる試験が日本全国の200カ所で始まる。さらに4月からは,海外135カ国に英語版試験の配信も始まる予定だ。