プログラミングの勉強法:実行前に結果を予想する
コードを実行する前に、何が起きるかを予想し、外れたら理由を説明します。変数を手で追い、数日後に小さなプログラムを記憶から書き直し、問題の種類も混ぜましょう。見る、写すだけでは慣れで終わり、予想して自分で書くことで理解が育ちます。

多くの初心者が何週間もチュートリアルに沿って進め、うなずきながら見ているのに、空のエディタの前で手が止まります。これはチュートリアル地獄と呼ばれることもあり、原因は単純です。ついていくだけの学習は、コードを見て「わかる」ことを求めます。プログラムを書くには、自分で「生み出す」ことが必要です。試験や制作で通用するプログラミングの勉強法にしたいなら、練習も生み出す形でなければなりません。
このガイドは、プログラミングの授業の1、2年目の学生と、独学の初心者向けです。例はPythonですが、どの手法もほかの言語で使えます。予想してから実行する流れ、トレースの方法、概念用のカードの形式、1週間の計画を紹介します。
なぜコーディングのチュートリアルは身につかないのでしょうか?
チュートリアルは判断をすべて代わりにやってくれるので、一番難しい「次に何を書くか選ぶ」練習ができません。見たことのあるコードは後で見覚えがあるだけで、知識ではなく認識です。使える頭の中のモデルを作るのは、思い出すことと予想することです。

チュートリアルにも役割はあります。新しい考え方に出会うために使いましょう。そのあと動画を閉じて、見たものを白紙のファイルから作り直します。作り直せなかった部分が、勉強すべきところです。
構文ではなく概念を身につけるには?
コードがメモリ上で何をするかに注目します。各変数が何を指しているか、値がいつどう変わるかです。短いコードの出力を実行前に予想し、外れたら理由を書き留めます。構文は使ううちに身につきますが、概念には意識した練習が必要です。
基本の習慣は4つのステップのループです。1つのコードにかかる時間は数秒で、授業のどの例も練習に変わります。

今すぐ試してみましょう。Pythonで a = [1, 2, 3] とし、b = a を実行し、b.append(4) を呼んでから print(a) します。先を読む前に出力を予想してください。多くの初心者は [1, 2, 3] と答えます。実際の出力は [1, 2, 3, 4] です。b = a はリストをコピーせず、二つの名前が同じリストを指しているからです。この一つの驚きが、変数の仕組みについて何ページもの説明より多くを教えてくれます。公式のPythonチュートリアルには、同じ使い方ができる短いコードがたくさん載っています。
コードのトレースとは何で、なぜ役立つのですか?
トレースとは、コードを手で一行ずつ追い、各行のあとの変数の値を書き出すことです。コンピュータの動きを自分で再現することになり、プログラムを書くのにもデバッグにも欠かせない頭の中のモデルが育ちます。試験でもよく出る形式です。

最後の行には、試験によく出る細かい点が隠れています。Pythonではループが終わっても、ループ変数は最後の値を保持しています。すべての行を書いてはじめて気づく点です。毎週、ループ、条件分岐、関数呼び出しをいくつかトレースしましょう。再帰のように頭に描きにくい内容では特に有効です。
コーディングの概念を長く覚えておくには?
学んでから数日後に、小さなプログラムを記憶から書き直します。「何か」だけでなく「なぜか」を問う概念カードのデッキも作りましょう。数日あけた繰り返しの想起が概念を使える状態に保ちます。一度成功しただけでは足りません。
記憶の研究もこれを裏づけています。ある実験では、最初に正解したあとも思い出し続けた学生は1週間後に約80%を覚えていましたが、一度成功してやめた学生は約35%でした。Karpickeらの報告にあります。コードで同じことをするなら、二分探索やクラス定義を、月曜、木曜、そして翌週に白紙から書き直します。詳しい方法はアクティブリコールと間隔反復を見てください。

コードを声に出して説明すると本当に役立ちますか?
はい。各行をわかりやすい言葉で、クラスメイトや机の上のゴム製のアヒルに説明すると、読み飛ばしていた手順が見えてきます。その行がなぜあるのか言えないなら、それが次に勉強すべき概念です。
プログラマーはこれをラバーダック・デバッグと呼び、学習研究ではより一般に自己説明と呼びます。考え方は同じで、推論を言葉にすると、黙って読むだけでは飛ばしてしまう隙間を埋めざるを得なくなります。解答例を勉強するときは、ブロックごとに止まり、それが何をするのか、そして著者が別の方法でなくこれを選んだ理由を言ってみましょう。
これは、授業の例、ライブラリのドキュメント、友人の作品など、出会うどんなコードにも使えるので、プログラミングの概念を深く身につける最も手軽な方法の一つです。予想のループと組み合わせれば、課題でバグになるずっと前に、ほとんどの勘違いを見つけられます。
種類の違うコーディングの練習問題は混ぜるべきですか?
はい。あるトピックに慣れたら、複数のトピックの問題を混ぜ、ループか再帰か、リストか辞書かといった、どの道具が合うかを自分で判断させます。実際の問題や試験が求めるのはその選択です。
中学1年生787人を対象にした数学の研究では、問題の種類を混ぜて練習した生徒は抜き打ちテストで61%、一種類ずつ練習した生徒は38%でした。教育科学研究所(IES)が資金を出したランダム化試験の結果です。プログラミングにも、方法を選ぶという同じ難しさがあります。小さな練習問題集を作ってトピックごとにタグをつけ、毎回複数のトピックから出題しましょう。やり方はインターリーブ学習の記事で解説しています。
プログラミングの授業の1週間の計画
講義やチュートリアルで概念に出会ったら、その日のうちに例で予想のループを回します。週の半ばに小さなプログラムを一から書き、週の終わりに混合の練習問題と、先週のプログラムの記憶からの書き直しを行います。
- 1日目:講義の例をすべて予想して実行する。
- 2日目:関数呼び出しを含む1つを含め、2つのコードを手でトレースする。
- 3日目:例を見ずに、その概念を使った小さなプログラムを書く。
- 5日目:今週と以前の範囲の混合問題。
- 7日目:先週のプログラムを記憶から書き直し、見比べる。
あわせて、バグ日誌をつけましょう。バグごとに症状、原因、勘違いしていた概念を書きます。数週間たつと自分の弱点の一覧になり、数学や理科で使われる間違いノートの方法とよく似ています。ほかの科目のガイドは、理科の勉強法から読み始めてください。
よくある質問
プログラミングの概念を身につけるのにどれくらいかかりますか?
変数、ループ、条件分岐、関数といった基本は、着実に練習して数週間で自然に感じられるようになるのが普通です。再帰やオブジェクト設計のような深い考え方はもっと時間がかかり、制作のたびに上達します。総時間より、短い時間を定期的に続けることが大切です。
複数のプログラミング言語を同時に学ぶべきですか?
初心者のうちは、たいていおすすめしません。概念は言語をまたいで使えますが、二つの構文を同時に学ぶと細部が倍になります。まず一つの言語に慣れ、そのあと二つ目に進めばずっと速く習得できます。
学習中にAIでコードを書かせてもいいですか?
自分で試したあとに、コードの説明や考え方の確認に使いましょう。先にAIが答えを書いてしまうと、力がつく練習を飛ばすことになります。自分で予想するか書いてから、見比べるのがよいルールです。
紙のプログラミング試験にはどう備えますか?
試験の形式に合わせ、手でトレースしてコードを書く練習をしましょう。エディタなしで短い関数に時間を計って取り組み、あとで実行して確認します。1つずれる誤りやループの境界に注意してください。
参考文献
- The Python Tutorial, Python Software Foundation (予想してから実行する練習に向いた、短いコード例が載った公式チュートリアル。)
- Metacognitive strategies in student learning: Do students practise retrieval when they study on their own?, Memory (Karpicke, Butler and Roediger, 2009) (最初の成功後も思い出し続けると1週間後の保持は約80%、項目を外すと約35%だった。)
- Efficacy Study of Interleaved Mathematics Practice, Institute of Education Sciences, U.S. Department of Education (中学1年生787人。予告なしのテストで、混合練習は61%、一種類ずつの練習は38%だった。)



