勉強して受ける応用情報の午後選択(5)理系の汎用能力で10点の押さえに使う プログラミング

この分野は取れない人は取れないと言われてる。いわゆる0-100分野である。

しかし,ここでは少し違う使い方を提案してみる。

応用情報のプログラミング問題,知識ではなく,ある種の読み取り力を試している問題だと思っている。マネジメントより読み取り問題だとすら言える。必要な概念は全てその場で読み取れるように書いている。それを(プログラミングに落とし込むために)読み取れる能力があるかどうかを試してきている感じ。

この能力,理系の他の学問でそれを身に付けている可能性がそこそこありえる。そうなると,特別な勉強をしなくても選択できるという展開が出てくる。

要約

ここでは,

  • 何をやってるかを具体例で確認させる問題は理系の汎用能力で取りやすい
  • コードそのものはそんなにごちゃついてない。軽くコードをかければ,この部分も理系学力の転移で行ける。
  • 例え本番で10点しか取れなくても,節約した学習時間・(10点で割り切ることで)節約した問題を解く時間・他の問題を1問捨てられるようになったこと,を使って他で点数を取る。

ということを見ていく。

応用情報のプログラムは処理より抽象能力寄り

応用情報のプログラミングは基本情報のプログラミングと大きく違う。こちらの方が楽ともよく言われる。一方ではるかに難しいという人がいる。

何が違うか?求められていることが全く違う。基本情報は

  • 典型アルゴリズムを知っているか?(知ってると少しだけ有利)
  • コードがトレースできるか?
  • 選択したプログラミング言語の言語知識(とその言語固有の概念・Cならポインタ・Javaならクラス)

あたりを聞いてきてる。どちらかというと,知識と処理を追う忍耐力を聞いてきている感がある。

ところが(最近の)応用情報は,処理を細かく追えるかを聞くことはほとんどない。その代わりに,全体の流れを追えてるか?を聞かれているように見える。そして,そのベースに必要な力は汎用的な理系的な読み取り能力である。ゆえに基本情報のプログラミングがしんどくても応用情報のプログラミングが楽ということはありえるのである。

基本的な設問構成

応用情報の典型的な設問構成は

  1. 数式(といっても最大高校文系数学)を含むこともある与えられた概念をその場で理解できるか(例を通しながら)
  2. 1.の理解を元にして要求されていることをコードに落とせるか
  3. 概念・コードの全体の流れを理解したうえで改善の応用ができるか?

である。こういう設問構成だと,理系学問によって身に付ける汎用的なスキルでなんとかなってしまうのである。

1. 例を通した概念の理解

設問1は,一言でいうと知ってるかでなく読み取れるか?を聞いている。午前程度の軽い知識ぐらいはあることは前提。ただ,知ってれば有利かもしれないが,知らなくてもちゃんと読み解けるように作ってある。知ってるかどうかというより,読み解く能力があるかそのものを試している問題である。

この読み取りのレベルも,汎用的な理系の読み取りレベルでいけるレベルになっていると感じる。古めの問題,特に旧試験時代の問題を見てると,この読み取りの段階で情報を専門にしていないと日本語が日本語に見えないレベルであった。しかし,最近のレベルはそうではない。文系の自分でも普通に読み取れる。

ここの読み取り問題は,マネジメントの国語問題よりよほど国語だと思う。国語というと聞こえが悪いが,(理系寄りの数式も含むこともある)要求が書かれた文章をプログラミングに落とす前に,数値例を使いながらその手触りを理解できるか?というスキルを聞いていると言える。

このスキルは,理系であれば持っている人が多いスキルのはずである。理系の教科書を読むときには日常的にやりそうなことである。よって,超高学力でなくても,そこそこの学力があればこのスキルは持っている可能性が高いスキルである。

なお,お勉強(知識の暗記)をしなくても解けるの問題ってどうなの?という人向けに誤解のないように強調しておくが,このスキルは普通の人は訓練ゼロで身に付くものではない。あくまで他の勉強(高校数学・高校理科・大学の主に理系の専門の勉強)によって培われた汎用的なスキルである。ここの問題は,それを転移させて解きやすい問題だと言っているだけである。

基本情報より応用情報のプログラミングが簡単と感じる(プログラミング慣れしていない高学力の)人が多い理由はここにあると思っている(そしてわりと自分もそっち側)。

2. 読み取ったことをコードに落とす

さて,設問1で読み取ったことだがそれをコードに落とすわけだが,これも基本情報より楽である。まず,疑似コードが圧倒的に読みやすい。日常言語感覚で読み下せる。軽くPythonぐらい一通り勉強しておけば読むのには困らない(そしてたぶんだいたい理系1回生ぐらいで一度は触れるレベル)。

さて,本文の説明をプログラムに落としていくことになるのだが,これも細かな文法とか処理はいらない。ある種の抽象化されたレベルで処理を追っていれば解答が導ける。

  • コード全体が何をやってるかをざっと把握する
  • 穴埋めを要求させるか箇所が何をしようとしている箇所なのかを理解する
  • 文中のどの部分に対応するかを見つける

のプロセスで行ける。(これらのプロセスは往復が何度も入る)

非常にシンプルである。トレースをひたすら積み重ねないと解答が出にくい基本情報に比べると,はるかに抽象的な把握でいける。そして,部分的にわかったら部分的に点数が取れるようにもできている。

3. コード(処理方法)の改善

ここも,コードの改善というかなんというか抽象的な改善とか理解であることが多い。コードの細かな挙動で捉えるというよりも,ある種のストーリー(モデル)のように読むことを求められていることが多い。

1.は何かの理系学問をやってれば自然と身に付けてるスキル。2はまあコード力次第だが,ごちゃごちゃはしてないのでやりやすい。3.は2.をそうすると,1と3はほぼ汎用の理系学力,2はちょっと軽くPythonぐらいが書ければ良いになる。

完璧主義を捨てて引いた目で問題を見る

プログラムは理論的には高得点が取れる。手が滑れば0にもなるから怖い。そして,それだけに目がいきがちである。完璧にいけないしミスも怖いから,自分は取るのをやめようになりがちである。良くわからないマネジメントの方が魅力的に見えたりもする。

しかし,冷静に引いた眼で考えてみたい。20点近くを取ろうとするから大変なのである。10~12点取ろうとしたらどうなのか?そうしたら,問題によっては選択することが得な場合も出てくる。特に,理系でそこそこの学力があるのなら(まあこのそこそこも人それぞれで難しいのだが),このケースは相当にある。

全てを完璧にミスなく取れと言われれば確かに厳しい。超高学力・経験・習熟・センスのうちのいくつか必要になる。しかし,手をつけてみると1は取れました,という回はけっこうある。そして,2も埋めてみたら一部の欄は独立に良い感じで埋まったとか,3は全体は良くわからないが聞きたいことは流れでこうじゃない?でなんとなく行けることもある。そうなれば,いつの間にか5割~6割の点数は積み重なっている(配点非公表なので断言はできないが)。

先入観にとらわれず,こういう展開に持ち込めないかを事前検討して,軽く訓練をしておく価値は十二分にある。もちろん,プログラミングなので,試験後に大勘違いが発覚でゼロというリスクや爆発の魅力とは隣り合わせにはなるが。

ローコスト勉強で1題を軽いボギー(5割)で消化したと考える

対策も,そこそこの勉強時間でいける(というか行ける場合に選択する)。知識ではなくその場で読み取るしかないので,短期で伸ばすのは無理なので対策はやりようがないとも言える。そこで得た対策時間をどうするかというと,セキュリティとかネットワークとか知識や演習セット数が命となる分野に対して投入をするのである。あるいは勉強時間のかかるデータベースにつぎ込んで,データベース選択を目指す。そうすれば,ここで失った2点は取り返せる。