●トレースは必要ですか?

 
トレースは時間がかかるため、効率が悪い気がします。
 プログラムを作っていれば自然にできるようなるという話も聞きました。やはりトレースしたほうがいいのですか?

 
 (福嶋注:この他にも、類似のご質問をいくつかいただいています。)

福嶋:理想をいえば、始めからプログラミング言語を使ってプログラムをたくさん作って、プログラミングセンスを身につけるのが最もいいでしょう。
 コンピュータが大好きで、自分でプログラミングに興味をもった人は、何時間もプログラミングに取り組みます。このため、意識的にトレースをしなくても、プログラミングができるようになります。実は、デバッグの過程で、無意識にトレースを繰り返しているのですけどね。
 私も学生時代にパソコンに魅せられて、徹夜でキーボードを叩いていました。昔は、雑誌にプログラムが掲載されていて、それをキーボードから打ち込んでいたのです。ゲームで遊びたいという理由で、何十本も打ち込んだと思います。そのうちに、いつも出てくる言葉(命令)は、素早く入力できるようになり、少し意味が分かるようになってきます。プログラムを作れるようになったと自信がもてたのは、雑誌に載っていた野球ゲームの改造を重ねた後でした。私も、トレースの訓練はしていません。
 プログラミングが大好きで、学校でも自宅でもプログラミングに取り組む時間が十分にある人は、プログラミングを通して学習したほうが楽しいですね。

 しかし、限られた時間の中で、プログラミングの学習をするするとき、トレースをすることは、とても効果的です。
 数十年前に、商業高校に情報処理科ができた頃は、1人が1台のコンピュータを使うことなど夢物語でした。中学校を卒業したばかりの生徒たちが、コンピュータを使わずに、机上でプログラミングセンスを身につける方法として、トレースの訓練を積むという指導法が生れたそうです。
 私は、25年ぐらい前に、ある専門学校の情報処理科で、小学校の計算ドリルのように、繰り返し大量のトレースをさせるという指導法を知りました。自分でも実践してみて、確かに教育効果が上がることを確認しています。
 トレースの訓練がいいのは、頭の良し悪しにあまり関係なく、誰でも一定量の訓練を積めば、必ず結果が出るところです(*1)。

 これは、運動神経の良い悪いにあまり関係なく、練習をすれば、誰でも自転車に乗れるようになるのと似ています。
 自転車の練習を始めても、最初は、バランスがとれずに倒れてしまって、乗れるようになる気がしません。それでも練習を続けていると、ある日、昨日まで乗れなかったのが嘘のように、突然、1人で乗れるようになりますよね。
 プログラミングも、少しずつできるようになるのではなく、ある日、できるようになります。毎日の経験が、バケツに水を貯めるように蓄積されていき、水がいっぱいになると突然できるようになります。

 トレースをしても、しばらくは変化がなく、こんなことに時間をかけて、はたしてプログラミングができるようになるのだろうか、と不安に思う人もいるでしょう。
 自転車に乗れるようになるまでの時間に個人差があるように、トレースの訓練も、結果が出るまでには個人差があります。
 しかし、毎日、少しずつでも水を貯めれば、必ずバケツから水が溢れる日がやってきます。

 学生や独学者は、できるようになった日、頭の中のCPUが完成した瞬間に気づく人が多いですよ(*2)。
あれ? 分かるぞ」という感触ね。「あれ、乗れたよ」と同じです。 

 頭の中にCPUができると、流れ図や疑似言語問題が理解できるようになります。ここまでくれば、基本情報技術者試験の午後のアルゴリズム問題は、問題演習を積むだけで解けるようになります。
 逆に、頭の中にCPUができる前に過去問題の演習をしても、類似問題が出たときに運が良ければ解けるというレベルで足踏みする人が多いです。
 確信をもって正解を選べない、なんとなく当たるけど、自信がない
このような人は、もう少しで水が溢れるところまで来ているので、最後まで水を入れて溢れさせないともったいないですよ。

 いつやるの? 
 今でしょう
 (*3)

 ドリルのようにトレースを訓練したい人には、読者エリアに、「秘伝のアルゴリズム」をPDFで公開しています。必要に応じてご利用ください。

 「うかる! 基本情報技術者」(新「集中ゼミ」)に掲載しているアルゴリズムやアルゴリズム補講で扱っているアルゴリズムは、基本情報技術者試験を対象にしたものです。世の中には、優れたアルゴリズムがたくさんあります。
 頭の中にCPUができても、試験合格がゴールではないので、次の段階として、
 ・先人たちが残してくれた多くのアルゴリズムを学ぶ
ということも大切です。ただ、これは合格後でいいでしょう。

 また、プログラムを作るには、プログラム言語固有の文法や考え方を学んでいく必要があります。


*1) 自転車の練習を始めた日に、乗れる子がまれにいますよね。正直にいうと、プログラミング未経験でも、トレースの訓練なしに、始めからアルゴリズムの問題を解くことができる学生がまれにいます。そのような学生には無駄な訓練になりがちなので、指導する側は注意が必要です。トレースの練習をしなくてもアルゴリズムの問題が解ける人は、学習時にトレースをする必要はありません。
*2) 仕事でプログラミングを始めた人の場合は、毎日、長い時間、プログラミングに取り組み、行き詰っても近くに指導者(分かる人)がいます。このため、自分で気づかないうちにできるようになっていた人が多いようです。

*3) もちろん予備校のCMのパクリです(笑)。

(2012/12/8) きちんと書こうと思っていたら、回答が遅くなって申し訳ありません。
(2014/01/30)書籍名などを一部修正。



●再帰関数のトレースに時間がかかるのですが?

 
再帰関数のトレースに苦労しています(時間がものすごくかかる)。
 定規を使うとトレースしやすいことがわかったのですが、他に何か“テクニック”はありますか?

 

福嶋:再帰関数は、クイックソートのところで示したように、同じ関数がたくさんあると考えて、ぜひトレースしてほしいですね。時間がかかっても、最初から最後まで自分でトーレースしてみると、どこから呼ばれて、どこに戻るのか、再帰関数の仕組みが、よく理解できます。定規を置いて、どこに戻ってくるか分かるようにするのは、とってもよい方法です。

 さて、トレースの訓練をある程度積んだら、今度は量から質へ、学習のやり方を変えていきます。

 ふっくゼミの補講でいえば、基本編は、徹底的にトレースをする、頭を使う前にまず手を動かせばいい、という感じです。最初から最後までトレースをして、アルゴリズムを理解できれば十分です。

 応用編になると、基本編のトレースの訓練で養った基礎力を育てて、応用力を伸ばしていく段階です。
 まず、流れ図や疑似言語プログラムの全体をながめて、塊(ブロック)ごとに、そこで何の処理をしているのかを考えるようにします。
 まったくトレースをしないということではなくて、簡単なトレースをして処理内容をつかむのですが、最初から最後までをトレースするようなことは減らしていきます。

 再帰関数は、時間をかけて、いくつかのアルゴリズム(再帰選択ソート、クイックソート、マージソート、再帰2分探索ぐらいでいいですよ)をトーレスされていれば、再帰の仕組みは理解されています。
 もう、最初から最後まで、いちいちトレースする必要はありません。

 再帰選択ソートの回で話したと思いますが、再帰関数を用いた流れ図や疑似言語プログラムを読むときには、再帰関数の中で呼び出してる関数(自分自身)は、既に完成している関数だと考えてトレースすればいいのです。
 例えば、クイックソートなら、範囲を指定して呼び出したら、その範囲が整列(ソート)されて返ってくると考えればいいのです。最初の頃にトレースしたように、自分自身を繰り返し呼び出すところまで、毎回トレースする必要はありません。
 再帰を乗り越えれば、基本情報技術者試験で出題されるアルゴリズムの壁を越えたことになります。後は平たんな道です。上位試験に進むと、別の壁が立っていますけどね。

(2012/12/8) きちんと書こうと思っていたら、回答が非常に非常に非常に遅くなって誠に申し訳ありません。もう見てらっしゃらないかもしれませんね。恐縮!