もし情報処理試験を受けるなら、合格を目指すな

情報処理試験を受けることの是非については触れないけど、もし受けるのなら合格を目指すな、技術的な知識の下地がない人は特に目指すな。

そんな説教じみた戯言を、プログラミング未経験な新人やプログラマになるかもしれない学生に言ってしまいたい衝動に駆られることがある今日この頃、皆様はどのようにお過ごしでしょうか、花粉症ですかそうですか。

あ、ここでの「情報処理試験」ってのは旧試験の基本情報技術者ないしソフトウェア開発技術者を指している。新試験だとITパスポートと基本情報技術者かな? 応用情報技術者は……とりあえず保留。それより高度な区分の試験は除外しているので注意。*1

まず事実から。

  • 情報処理試験に合格しなくてもプログラマにはなれる。これは「バカでもプログラムは書ける」ということじゃなくて、医師みたいな「合格しないと免許をもらえない」類の試験じゃないということ。情報処理試験って一応国家試験なんだけどね。

そして私の周辺での傾向。

  • 大抵の会社では、情報処理試験に合格したことに対する評価はあまり高くない。学生が就職する時は、「おっ勉強してるね」という意味でそこそこ評価される。若手のうちも比較的評価されやすい傾向にあるけど、大概は「合格したら褒賞金」程度の扱いじゃないだろうか? 資格手当てがでる会社も、昇進の基準にしている会社もほとんどないはずだ。理由の1つは、恐らく「基礎的な所を問われる試験だよね」という認識が会社側にあるのだろう。他の理由については、下の項を見てほしい。
  • プログラマには「資格よりも実力だよ」という人が多い。私見だけど、資格の有無に関係なく、できる人はできるし、できない人はできない。まあ、ある意味当たり前といえば当たり前なんだろうけど。
  • ある程度の経験を積んだプログラマは、保有資格よりも業務経歴で評価される傾向にある。

分野にもよるんだろうけど、基本的にプログラマってのは実力*2で判断される。例えばどんなプロジェクトでどんなことを経験してきたか、技術的にはどんな分野が得意か、とかが重要。「資格なんて業務の役に立たないよ」と公言する人もいるくらいだ。

じゃあ情報処理試験なんて全く役に立たないかというと、それはちょっと違うと私は思うのだ。これも分野による偏りがあるんだろうけど、私の経験*3からすると「使い方次第では役に立つよ」という感じかな。

  1. 全てじゃないけど、各試験のカリキュラム自体には、仕事で使う技術が含まれている。例えば私の場合、
    • コンピュータ科学基礎。数値とデータ表現は『Write Great Code〈Vol.1〉ハードウェアを知り、ソフトウェアを書く』なんて本がでてるぐらい大事。データ構造の知識も、リストやキューは自作するし*4STLのコンテナを選択する基準にもなる。あと論理演算と状態遷移も使う。
    • コンピュータシステム。CPU、メモリ、OSの基礎知識が無いと話についていけない。というか多少なりとも知ってるから、もう少し突っ込んだ内容の話でも時間をかければ理解できるというか。
    • システム開発モデルは、せめて有名どころの名前ぐらい知ってないと。モジュール強度と結合度は関数/メソッド分割の指針になる*5。関数レベルで単体テストするなら、ホワイトボックス/ブラックボックステストの知識も重要*6
    • ネットワーク関連の開発をすることが多いので、OSIの階層モデルとTCP/IPの知識とか必須。資料を読んで一度で理解できなくても、OSIの階層と照らし合わせて力技で理解したりとか、そういった逃げ方もできる*7
    • セキュリティの基礎知識は、毎日パソコンを使う人としては必須となりつつある予感。ネットワーク関連の開発の人だから、という理由もあるかも。
  2. 技術的に優秀な人は、例え情報処理試験を受けたことがなくても、そのカリキュラムに含まれているような知識を(全てじゃないとしても)持っている。気になった技術書を読んだり、趣味でオープンソースのツールをハックしたり、ツールを自作したりして、彼らは業務以外でも知識や経験を蓄えている。マイコンボードにITRON系のOSを載せて遊んでる人もいるぐらいだ。

何が言いたいかというと、情報処理試験ってカリキュラム的には思ったよりも要所要所を押さえてるので、勉強するのは無駄ではない、ということだ*8

カリキュラム的には。

微妙に引っかかる書き方なのは、「試験に合格すること」のみを目的に勉強したら意味がなくなっちゃうからだ。例えば「とにかく過去問やりこみ! 選択肢まで覚えちゃったぜ」みたいな勉強法とか。

そんなもの、すぐに忘れちゃうよ*9

そうじゃなくて、例えば問題集じゃなくて教本に書かれている内容を読んで、中身を理解してほしい*10。どういう仕組みなのかを理解して欲しい。仕組み重要。問題が解けるかどうかなんて二の次なんだ*11

そうやって勉強した内容は、意外と応用が利く。仕事中に何かの拍子で勉強した内容がよみがえって、「ああ、あれはこういうことだったんだ」と理解が深まったり、逆に「ここは、あの時勉強したアレをベースに考えればよさそうだ」と筋道を立てるのに役立ったりする。少なくとも私はそうだったし、今でも5〜10%ぐらいは3年前に基本情報技術者試験を受ける時に勉強した内容で食べてると思う。

だから、もしあなたが情報処理試験を受けるというのなら、是非とも合格を目指さないで勉強してほしい。それで後々に多少なりとも楽ができるのなら、勉強に費やした時間は無駄にはならないのだから*12

蛇足

とはいえ、ついでに合格できたら一石二鳥で嬉しいのが人情ってものだと思うので書いておく。

「内容の理解」に重点を置く勉強をしておくと、試験にでる問題が変化した時にも対応できるという利点がありますよ!

そうやって私は2005年秋の基本情報技術者試験を切り抜けたのだった。あの時は新しい問題が出題されて合格率が下がった*13のだけど、個人的には少しも難しいとは思わなかった。まあ若かったからなぁ、あの時は。

*1:何かよい言い方は無いだろうか?

*2:何をもって「実力」とするかは難しいところなので、ここでは言及しない。てか分からないので言及できないんだけど。

*3:詳細は書けないけど、組み込み系で研究色がやや強めな所に潜り込んでいる。ネットワーク関連の開発が多い。

*4:C言語で開発してて、且つ便利なライブラリが無いので。

*5:なるべく単機能、なるべく引数と戻り値でデータ受け渡し。

*6:「最低でも単体テストプログラマの責任」な環境なので。

*7:誤った理解をしてしまう可能性があるから、あまりよくない方法なんだけど。

*8:もちろん商品知識は問われないので、即戦力的に使える知識はすずめの涙かもしれないけど。この辺りも分野によるんだろうなあ。

*9:少なくとも私の場合は。

*10:教本が分かりにくいなら、分かりにくかった分野に関する入門向けの専門書を読んでも構わない。

*11:まあ解けた方が都合はいいんだけど。

*12:但し費用対効果を検討したわけじゃないので、「是非とも受けましょう」とは言えないのだけど。

*13:合格率は12.8%だった。