プログラミングの最初の壁は逐次実行 #projava

プログラミングの入門書で、変数だとかfor文なんかは丁寧に例えなどを使って説明されていることが多いのですけど、逐次実行はほとんど説明されていることがありません。
入門書を書く人にとって、逐次実行は自明であって説明が必要なものではないという認識があると思います。

プログラムに慣れた人にとって、プログラムが上から順に実行されるというのは当たり前で学習が必要なことには思えないと思います。
「見たままやん」
となるのではないかと。

けど、実際には上から順に動くというのがよくわからないようです。
「あ、プログラムって上から順番に実行されるんですね、わかってなかった」
と言われたことがあります。そういうふうに言ってくれる人がいるということは、言わないけどわかってなかったという人が何倍もいるはずです。

通常の文章というのは、基本的には一定の状態を仮定して書かれていて、前部と後部で表す状態が違うということはありません。文章の順番を入れ替えても、表したい内容には違いがありません。物語は状態が変わっていくように見えますが、実は冒頭から、結末の状態を書き記しているだけだったりします。読み込みの遅さを利用して結末の状態が徐々に明らかになることで物語が進行します。
数学で複数の式が提示されても、それはすべての式が同時に常になりたつ関係式で、式を評価するごとに関係がかわるということはないです。
つまり、文章にしろ数学の式にしろ、一行ずつ処理が進んで状態が変わる、ということに慣れていないわけです。

考えてみると、上から順に動くという場合にはどの行を実行しているのかというステートの管理が必要です。
プログラミング初心者の場合、そういった自明に思えるステートというのが頭のなかに構築できていません。

そして、重要なステートのひとつには変数があります。
変数の説明のために箱だと例えてみたり、いや箱ではなく場所だと言ってみたり、変数の特性についてあの手この手で説明がされてきました。でも結局のところ、変数がわからないということは、逐次実行がわかっていないことが原因の可能性があります。
少なくとも、逐次実行がわかっていないと、変数の内容が変化していくことがわかりません。

int a;
a = 3;
print(a);
a = 5;
print(a);

のようなコードがわからないというとき、変数のふるまいがわかっていないように見えますが、実際はコードが順に実行されていくということがわかっていない可能性があります。だとすると、変数の特性をいくら説明しても無駄ということになります。

また、逐次実行がわかっていないのであれば、その一部が繰り返されるループも当然わからないということになります。
逐次実行を丁寧に習得させれば、変数やループではつまづきにくくなるかもしれません。

そのため、「プロになるJava」では、まず最初にJShellを使って自分の手でコードを一行ずつ動かすことで、プログラムが一行ずつ実行されて状態が変化していくことを体感してもらうようにしています。
JShellでウィンドウを出すコードを動かしてもらったあとでそのコードをまとめたプログラムを作ってもらって、ソースコードに書いたものは一行ずつ実行されるんだということが実感できるようにしています。

またforループではデバッガを使って処理の動きと変数の値の遷移を追うようにしています。デバッガで処理や変数の動きを追うことも、プログラムや変数の理解には大切なので、プログラミングの学習にIDEが必要だと思っています。

残念ながら「創るJava」と違って、「プロになるJava」の元ネタを使って実際に人に教えてないので、実際のところはこれからほんとの初心者の人が読んだり研修に使われたりすることでわかってくるとは思うのですが、少なくとも今までの、ひとまとめのソースコードを提示して一気に動かして一行ずつ解説するというアプローチよりはうまくいくのではないかなと思っています。