Ruby技術者認定試験シルバーを受けてみた
こんにちは、@IT編集部の西村賢です。先日、こっそりRuby技術者認定試験のシルバーを受けてきました。100点満点で88点、合格でした。合格ラインは75点。全50問なので13問落とすと不合格です。私は6問落とした計算です。
感想をヒトコトでいうと、「Rubyのことが良く分かっていないことが分かって勉強になった」というところです。
以下、体験談と感想を書いてみたいと思います。
試験対策は模擬試験をやれば十分かも
試験対策は2つやりました。1つは、模擬試験が2パターン収録されている「Ruby技術者認定試験 公式ガイド」(伊藤忠テクノソリューションズ(著)、Rubyアソシエーション(監修)、ITpro(編集))を使って問題を解いたことです。Rubyの概要や文法の解説部分は、ざっと30分ほど眺めて、いきなり模擬試験をやりました。
2パターンとも80点前後だったので、間違えたところだけを確認して試験対策は終わりにしようかと思ったのですが、せっかくの機会なのでと、Rubyの標準クラスのドキュメントを3時間ほど読みました。ちなみに模試も本番も、どちらも問題数は少なく、制限時間の半分もあれば回答自体は終えられると思います。考えてもしょうがないものですよね。本番では、自信がなくて後で見直そうと思った問題にチェックを付けておいて、後からまとめて再チェックしつつ回答を変更できる機能もあります。コンピュータベースの試験って良くできていますね。受験会場や受験日時の自由度も高いのが楽チンです。私の場合、平日の出社前に自宅から徒歩5分のところに立ち寄って1時間弱で終了、という感じでした。
さて、試験対策は合計6時間ほどと少なめですが、もちろんそれまでにもRubyには触れていました。過去2年ほど、ゆるゆるとRubyやプログラミング一般を勉強しています。例えば「ぷよぷよの19連鎖を書け」という課題で、ぐちゃぐちゃとやってるうちに何とか2時間ぐらいで書けるぐらいにはなりました。ハフマンツリーを構築するクラスを作れと言われたら、Wikipediaを見ながら、Rubyを使って1時間ぐらいで書けるようにもなりました。自分としては、少しはRuby(あるいはプログラミング)が分かってきていたような気もしていたのです。
ところが、模擬試験とドキュメントの通読で、いかに自分がRubyの基礎が分かってなかったのかということに気付きました。楽しい発見も多かったです。
遅延されていたものをイーガーに!
私はIT系媒体の記者・編集者ですから、Rubyなどを通してプログラミングやWeb技術の世界がどういうものかを知っておくのは、基礎体力作りとして重要だと思っています。
とはいえ、Rubyの勉強は趣味的にやっています。そうすると、どうしても遅延学習メソッドになりがちなのでした。遅延学習メソッドというのは、必要が出てきたときに調べて覚えるという泥縄式のアプローチのことです。私の感覚では、いろいろなテーマで目的が達成できるメソッドやイディオムが身に付くと、そこからの学習ペースがスローダウンするような気がします。だいたいのことはちょっと調べればできるようになるからです。
遅延学習ではイディオムも偏りがちです。いつまでもfor文を書いていて、eachを使おうとしない人っていますよね。そういうのって遅延学習の弊害じゃないかと思うのです。mapなんか使わなくてもforでも同じことができますから、forだけでも生きていける、というのも似た問題かもしれません。
そもそも面白そうと思うことばかりやっていると偏るのかな、とも思います。Rubyのまつもとさんが推奨する学習方法として言語処理系を作るというのがありますよね。そういうまんべんなくいろんな知識が必要とされる課題なら別でしょうけど、ちょろちょろと小さなプログラムを作る程度だと偏ってしまうということかもしれません。
例えば、TwitterのAPIを叩いてXMLやJSONはパースすることはあっても、ファイルをシークして書き換えるようなことって、相対的にやる機会が少ないように思えます。でも、電子書籍のファイルフォーマットをいじろうと思ったら、ファイルぐらいいじるわけで、その基礎体力がないなんて、まあRubyが使えるとは全然言えないよね、ということだろうと思います。私は、FileクラスやIOクラス方面の理解がまったくお粗末だったんですね。FileとFileUtilsがどうして2つあるのかも、ちゃんとその理由を認識していませんでした。
遅延学習メソッドになるのは切迫感がないからですよね。書籍にしろコードにしろ、どうしても面白いと思える部分しか読まないということになりがちです。
それで、改めてRubyのドキュメントを読んでみると、自分がいかに基本的なメソッドすら知らなかったことかと思い知りました。改めてちゃんと調べてみると、標準クラスは、ある種の対称性と現実的妥協が混じり合っていて面白いです。各メソッドが破壊的か否か、何を返すかというのは自明で美しい世界のように見えて、実はそうでもないので、よくよく観察し直すのは良いことなのだろうなと思いました。
きっかけとしての資格試験
実務にはほど遠いのかもしれませんが、「試験を受ける。落ちたら恥ずかしいし、お金が無駄になる」という状況を作ると、擬似切迫感が出てくるということはあるかもしれないなと思いました。1万5000円の受験費は安くありません(こういうのは自腹に限ります)。シグナルとして資格が役立つかどうかは別としても、私の場合はキッカケ作りやレベル感を確認できるものにはなったと思います。頭から順にクラスやライブラリを全部眺めてみたり、いい加減な理解だった部分や、あえて調べたり覚えたりしようと思わなかった「めんどくさいだけで面白くない部分」を潰していこうと思えたのは良かったな、と。キッカケ作りに1万5000円は高くない? と思う人もいるかもしれませんが、そんなことを言ったら食費を浮かせるだけでできるはずのダイエットに何万円もお金をかける理由もありませんよね。
恥を承知で、もう少し実例を挙げてみます。
私はファイルオープン時のオプションである「r、w、r+、w+、a、a+」によるオープン後のファイルポインタの位置の違いを、正確に把握していませんでした。必要になったときに調べて試せば分かることだし、覚える必要はないかなとも思っていました。いや、今でも趣味や業務効率化のスクリプト程度なら、それでいいのかもしれないと思っています。
でも一方、こんなもの、ちゃんと理解して覚えてしまえば良いだけのことだったのだ、と試験を受けた後になって思いました。ファイル操作のセマンティクスというのは、OSごとに多少の違いがあるのかもしれませんが、言語以前の基礎知識としてそもそも知っておくべきことなんだろうと想像しています。LinuxのAPIもついでに調べつつ、こういうのが言語の使い方を学ぶことなのかなと愚考しております。
そう考えるきっかけになっただけでも試験を受けて良かったな、と個人的には感じています。資格試験というのは、こうしたことをちゃんと分かっていないダメプログラマを見分けるためのものと考えれば、なるほどなという感じです。
「%Y」と「%y」の違いは重箱の隅つつきか?
こんな例もあります。
Time#strftimeのディレクティブなんて、「どうせドキュメントを見るんだし、覚える必要ゼロ。そもそも%mと%Mとか%yと%Yとか対称性がなくて意味が分からなくね?」ぐらいに思っていました。ところが試験対策として、この辺を自分でマトリックスを書いて整理してみたんですね。そうしたら、「♪パパパラッパッパー」とファンファーレが脳内で響いてレベルアップしたような感覚がありました。よくよくみると、ちゃんと合理的な理由がありそうだし、それなりの規則性があって覚えられました。
strftimeのディレクティブって何だか一貫性や対称性がなくて変だと思っていたんですが、あれってUnix文化の一部なんですね。dateコマンドやEmacsでも同じだったのだと、丸覚えしてから気付きました。仕事では日々の面倒を楽にするためにEmacsLispの小さな関数を良く書くのですが、テキストに日付を挿入するようなケースで、もはや何も調べなくてもスパッと書けるようになりました。あるいは最近CapistranoでMySQLをダンプするtaskを書いたのですが、バックアップのファイル名に日付を入れようとして「なるほどな」と思いました。何も迷わずに「%Y-%m-%d」と書けるんですね。いちいち検索するようでは効率が悪いです。
「%Y」「%y」「%M」「%m」の違いを問うなんて、重箱の隅つつきの知識問題で、試験のための試験でしかないのではないかと私は思っていました。でもそうじゃないかもしれませんよね。利用頻度が高く、ある程度の普遍性がある共通語彙が頭に入ってないのだとしたら、その程度のプログラマだということではないだろうか、と。私が開発を依頼する立場なら、いちいち検索するタイプの人よりも、時刻表現の各言語処理系やOSごとの違い、歴史的経緯、ISOとの関係、ロケールの難しさなどを30分ぐらい楽しそうに語ってくれる人に任せたいなと思います。それに、こういうのって知的好奇心の旺盛さや知的キャパシティの大きさを示すシグナルになり得ると思うんですよね。
試験のジンクス:迷うと間違える
case~whenで100%自信を持って制御の流れを説明できないのだというとにも試験で気付きました。2つ以上のwhen節がtrueとなるとき、どういう動作になると思いますか? この辺りを問う問題について考えているとき、私の頭の中は以下のような思考が流れていました。
「いや、コンパイラ技術が未熟だった時代のCじゃあるまいし、breakとか書かなくても、当然ほかの条件節は無視して抜けて出るよね?」「いやいや、でも、もし微妙な条件があって、複数の条件が合致する場合、本来どういう動作をするべきなんだろうか? 複数のwhenを実行すべきじゃないのか? もしその“本来”があるのなら、Rubyはそうなっているに違いない。これは頻出の引っ掛け問題?」「バカか? そんな挙動は聞いたことがないし、あり得ないよ。そもそも複数条件がマッチして実行を期待するなんて混乱の元。最低なコードだろ」「いやいや、これは……」
私はしばらく考えこんでしまって、結局答えを間違えました。つまり、制御構造の基礎についても100%自信を持って答えられないという程度の理解だったのですね。
もう1つ、似た例があります。例外処理のensure節が実行されないことってあると思いますか? rescue節に何を書けばそういう状況になると思いますか? 私は知りませんでした。試験終了後に調べてみて、なるほど、確かにこういう動作であるべきなのかもなと思いましたが、やはりこの設問も私は間違えて回答してしまいました。
さて、ここまで書いてきたようなことは、実務でプログラミングしている方々なら常識なのでしょう。だから、実務でRubyを使っている人なら何も試験対策をしなくても受かるというのはそうなのだろうな、と思います。ただ、私の場合は試験を受けてみて初めて、基礎をきちんと理解して覚えることの意味が分かったように思います。
こうした気付きを与えてくれるのは、試験を受けるメリットかなと思います。特に、これからRubyに取り組もうという方にはお勧めしたいと思います(私は類似の資格試験であるRails技術者認定試験の運営メンバーの1人なので、この辺はいくらか割り引いて読んでくださって結構です)。
資格試験は役立たないのか?
日本人は資格試験が好きな国民性という話がありますが、その反面、「資格試験なんか役に立たない」という批判も常にあります。設計自体がヒドい試験も多数存在するようですし、そういう批判があるのも当然かもしれません。ですが、私は資格試験は利用すべき人が上手に利用すれば社会的意義はあるだろうと思っています。
実務でバリバリ使えるとか、プロとして十分な能力を証明するという意味では、世にある多くの資格試験は不十分なのかもしれません。
でも、だからといって「役立たない」は言い過ぎとも思います。バランスよく基礎知識や運用上のポイントを問う試験であれば、それは最低限の知識の証明になるでしょう。なので、足切りという意味はあるでしょう。TOEICなども同様で、800点ぐらい取れるのであれば、実務の会話は無理でも基本的な英単語ぐらいは知っていると分かるわけです。逆説的ですが、よく設計された試験であれば、試験対策の勉強をすること自体がスキルアップにつながるということもあります。
逆にこうした客観指標が一般化する以前には、「オレは海外勤務経験があって英語はペラペラで業務もやってる! 試験なんか免除だ!」と、ぜんぜん通じないブロークンイングリッシュで開き直るおじさんに対して、眉をひそめるぐらしか対処法がなかったという話を聞いたことがあります。「オレは仕事でRubyを使ってるし、ちゃんと書ける!」という人の中に、そういう“自称”がいないとも限りません。
大学時代の友人が外資系コンサル企業にいて良く言っていたのですが、MBAで学ぶ内容なんか大して役に立たないというのですね。実務を半年もやり抜くことができれば、MBA以上の力が付くのだから、と。まあ、彼女がいたのは「出世し続けるか、ドロップアウトするかの2つに1つしか道がない」という厳しさで知られる世界屈指の経営コンサル集団だったので、ちょっと例外的かもしれませんが。
MBAで学ぶことは実務に比べたら大して役に立たないという彼女ですが、しかし一方、応募してくる履歴書を見るときに、MBAホルダーというのはある種のシグナルにはなっているというのです。一定以上の能力の証明になります。履歴書を選り分ける際には、やはりMBAという資格は参考にはされている、と。ただ、それは、いきなり履歴書をポイとゴミ箱に捨てられない程度の“お守り”というんです。
MBAの例を、オープンソース技術者に置き換えてみましょう。
「資格試験なんか役に立たない」という偉そうなことが言えるのは、RubyのVMやガベージコレクタは私が書きましたとか、Webサービスを10個ほど作った経験があってフレームワークやライブラリのパッチでOSSに日常的に貢献していますというような実績がある人です。オープンソースの世界には、そういう力のある人はウヨウヨいます。だから、実力を示したいエンジニアはオープンソースで何か貢献するのが近道だし、世の中的にも良いことじゃないかと思います。でも、いきなりそんなことができる人ばかりじゃないですよね。これからRubyに取り組もうという人や、企業の採用担当者にしてみれば、資格というのは、最低限のスキルがあることを示す良いシグナルになるように思います。
開発案件を委託する側からしても、「うちはRubyのエキスパートが揃っています」と主観で言われるよりも、「Ruby技術者認定試験の保有者が5人います」というほうが客観性があって安心できると思います。資格試験を鼻で笑える実力があるのなら、よほど広く知られた実績でもない限りは受験して合格してしまったほうが物事がスムーズに進むことが多い。それが資格というものなのかなと思います。
こういう視点でいえば、Ruby技術者認定試験のシルバーは、よく設計された良い試験なのではないかと思います。まあ私ごときが言っても説得力があるか分かりませんけれどね。