注解・正しい基本情報技術者試験の勉強法、あるいは基本情報が「役に立たない」といわれる理由の考察

id:eel3:20111127:1322361996 は7割ぐらいネタだったので、それを引っ剥がして残り3割の本音の部分を明らかにしてみようと思う。なので今回はネタ無し。

基本情報技術者の資格は実務にも役に立つ」という主張は本音

最初に書いた以下の部分はネタではなく本音だ。

コの業界では「この手の資格は役に立たない」と主張する人も多いようだけど、私自身はこう考えている。

  1. 技術的な方面で色々とやってみたいのなら、
  2. やりようによってはそこそこ役に立つ。
  3. 但し即効性はないし、内容は比較的保守的(最新技術より枯れた技術*1。温故知新)。
  4. あと費用対効果の観点では検討していない。

注意すべきなのは2番目の項目で、乱暴に言ってしまえば勉強の仕方を間違えたら全く役に立たない。費用対効果でみれば「大赤字だけど全く効果なし」という悲しい結果に終わってしまう。

どこら辺が本音かというと、私自身がコの業界で働いてみて基本情報技術者試験で勉強した内容が(全てではないものの)実際に役に立っているからだ。

もちろん一応国家試験であるという性質上、特定のOSやらフレームワークやら何やらの知識は問われないということもあり、勉強した内容に即効性はない*2。しかしそれは裏を返せば特定の商品知識以外で知っておくべきことだったり複数の商品(例えばOS)から共通する部分を抽象化して概念として取り出したものだったりする訳で、決して無駄な内容ではない。

また問われる内容は比較的保守的で、間違ってもホッテントリになるような流行の技術やその筋の専門家が唸るような最新の研究成果などは含まれていない。とはいえ実際に仕事する場合は枯れた技術を多用することも多いし、何より新しい技術(といわれるものの大半)は過去の技術の改良版や焼き直しだったりする訳で*3、そういったものを正しく捉えようとすると「じゃあ過去はどうだったのか?」という所を知っている必要があることも多い。

「勉強の仕方を間違えたら全く役に立たない」は仮説だ。但し私の中ではほぼ事実だろうと考えている。

私自身は実際に働いていて基本情報技術者試験の勉強で学んだ内容が役に立っている。一方でここ2〜3年ほど新人をみていて思ったのだが、彼らは在学中に基本情報技術者に合格していたり、又は入社後に受験して合格したりしているものの、実際に何らかの作業を行う段になると学んだはずの内容をすっかり忘れてしまうようだ。

例えば構造化設計のモジュール強度・結合度について学んだはずなのに、複数の雑多な機能を詰め込んだ処理の切り分け方が変な関数を書いたり、意味もなくグローバル変数を定義してローカル変数代わりに使ったりする。あるいはTCP/IPやLAN間接続について学んだはずなのに扱うLANの構成を理解できず、見当違いのことをしていて「マシンに接続できません」となったりする。

何度か彼らと話してみたのだが、どうも彼らは勉強した内容をすっかり忘れていたり、あるいは学んだ知識を仕事で応用するとか実際に扱う技術と絡めて捉えることが思いも寄らぬ行為であるようだ。

私と彼らの差は一体どこから生じているのだろうか? 考えた結果、現時点では勉強方法の違いに起因するのではないかという結論に達している。この辺りは後述する。

勉強方法がキーだとなれば、実際に彼らと一緒に仕事をする可能性がある私としては「単に合格を目指すだけでなく、実際に仕事で生かせるように勉強してくれ」というのが本音だ。特に就職後に受験する場合、社会人の貴重な余暇を勉強に費やすなら「合格はしたものの実務には何の役にも立たない」よりも「合格できなかったけど実務に役立っている」の方がマシだ。もちろん「合格できて、実務でも役立っている」がベストなのは言うまでもない。

勉強方法の基本方針は本音だが「問題集は捨てる方向で」は言い過ぎ

勉強方法の基本方針として提示した内容は本音だが、少し注意が必要だ。

試験に特化した勉強ばかりすることは悪だ。ならばどう勉強するか?

  1. 問題集ではなく教本の類を買う。それも出題される問題の背景となる部分の解説がキッチリ書かれているやつ。
  2. 問題3割、解説7割ぐらいの配分で勉強する。解説部分の理解、仕組みの把握を重視。解説の裏を読みとるべし。
  3. あと手を動かす。教本に書かれている知識や理論を実践に移すことで、現実の技術/開発と結びつけて考えられるようにする。

これに尽きる。

(1) は本当だ。(2) は配分は別として解説部分の理解に重点を置くべき、という主張だ。

基本情報技術者試験は先に「この分野のこの内容を勉強しておいてね」というシラバスがあり、シラバスの内容をどの程度理解できているか確かめるために年2回の試験がある。

シラバスIPAのサイトで公開されているが、その内容自体は実務経験者の私から見ても妥当なものだ。システムの大規模化に伴う分業化が進んでいたり分野によって使用する技術が異なることもあってシラバスの全内容が必須とまで主張できないものの、「この内容をキッチリ理解できていたら役に立つよね」という風に思う。

ではなぜ合格できても実務で役に立たないのか? 恐らく大半の人は試験に合格する為の勉強をしてしまい、出題された問題の背後にある理論・思想・歴史的経緯の勉強が疎かになっているのだ。実際に仕事で役に立つのはそういった理論だとか背景の部分だ。なので問題集よりも教本の類を買って解説部分を重点的に学習する方が実務に生かせる可能性が高くなる。

解説重視の学習には試験に生かせるメリットもある。過去問にない新しい問題が出題された時に怯まずに解くことができるのだ。つまり問題の傾向が変わっても合格できる可能性が高くなる。

一方で試験に合格すること、つまり出題される問題を解けるようになることを重視するとどうなるか?

合格しようという気持ちが強いと、どうしても学習内容が試験問題の傾向と対策やら過去問やらに偏っていく。しかしそれらの内容は基本情報技術者応用情報技術者の試験に特化したものだ。極めても「試験」に通じた人にしかなれない。現実の開発とは少しばかり方向が違うのだ。

この極端なバージョンが「過去問等の問題集をひたすら解く」という勉強法で、この方法の実践者は今までの試験の内容に通じた人になれるので、今までと同じような試験内容なら合格する可能性が高くなる。その反面、出題される問題が入れ替わったりした場合には合格する可能性は落ちるのだが*4

とはいえ一応試験な訳だし、受験する以上は合格も出来たほうが嬉しい。そういった意味では問題集の存在を否定できないのは事実だ。

また基本的に基本情報技術者の勉強は座学が中心なので、実務に生かすには一手間必要だ。それが (3) の「手を動かす」だ。このよい例だと思っているのがオートマトンというか状態遷移で、座学で勉強した時点ではイマイチ有用性が理解できないと思うのだが、実際に何らかの動作モードを抱えるシステムを設計したりパーサの類を実装したりする際に非常に役に立つ。

ただ (3) の内容は実務には役立つものの、試験合格に繋がるかと言われると非常に微妙なのだが。

「参考資料」はコの業界で食べていきたいなら読むべきだが……

試験対策用の教本の解説部分は、例えるなら要約版だ。たった2〜3ページの内容であっても、世間を見渡せばその内容で1本の論文や1冊の本が書かれていたりする。なのでより深く学習したいのならその筋の技術書を買って読むべきだろう。要約によってそぎ落とされた部分が明確になり、理解が深まるはずだ。

また教本はシラバスに沿って区切られた個々の分野について解説しているものが大半で、区切られた分野同士の有機的結合は学べない。この点も教本以外の技術書が頼りになる。

例えばシラバスに論理演算や論理ゲートについての項目が存在するのは何故か? 教本だけではハッキリしないこの疑問の答えは『CODE コードから見たコンピュータのからくり』あたりを読むことで明確になるはずだ。こういった疑問を放置して学習するのと解明しながら学習するのでは、モチベーションが大きく違うのではないだろうか。

但し参考書を読めば合格できるかと言われると……やはり非常に微妙なのだ。

「参考資料を買い込んで読め」や「手を動かせ」の個々の内容はネタ?

ネタというか、基本情報技術者の勉強とは別に私自身が個人的にやってきた内容の羅列だ。まあほとんど趣味なので当てにしてはならない。

とはいえ技術大好きな人や学習意欲の高い人は余暇に技術書を読んだりコードを書いたり勉強会やカンファレンスの類に出たりしているはずだ。

ただそれは「基本情報技術者試験に合格するため」ではない。

結論

基本情報技術者の勉強を実務に生かせるようにしようとすると「試験に合格する」という目標に合致しない項目が多々出現するという点で、「この門をくぐる者は一切の希望(合格)を捨てよ」は真実なのかもしれない。

とはいえ合格することを目標とする人が大多数であり続ける限り、「基本情報技術者の資格なんて役に立たない」と言われ続けるのだろう。

*1:もっとも、分野による違いはあれども大抵の仕事では最新技術よりも枯れた技術の占める割合の方が大きいのだが。

*2:あえて言えばSQLプログラミング言語(のうちC言語COBOLJava)は比較的即効性があるのかもしれないけど、仕事で要求されるレベルからすると無茶苦茶基礎の内容だ。

*3:時には既存の技術を反面教師としたものもあるだろう。

*4:例えば2005年秋の基本情報技術者試験の合格率をその前後数年と比較すること。