kagamihogeの日記

kagamihogeの日記です。

Hello, world から始まらないプログラミング教育

"Hello, world." はといえば、やっていることは出力のみで、そのコードだけから「プログラムで何が出来るのか」を予備知識無しでイメージしろ、というのは初めての人にとって困難であるかもしれない。"Hello, world." は「プログラムという世界の全体像」を俯瞰するには、あまりにも盛り込まれた要素が少なすぎるように思える。

最初のプログラムとして "Hello, world." は適切か? - 帰ってきた人生戦闘詳報

在学中にプログラムの師である先生と「Hello, world から始まらないプログラミング教育」について話していたのを思い出した。

先生が提唱していたやり方は、まず最初に典型的なプログラミングのプロセスを一通りやってみせつつ生徒にも同じことをやってもらう、というものだった。段階としては、

1. サンプルコードを書き写す
2. コンパイルエラーをなおす
3. 動かしてみる
4. 意図しない動作をしているコードをなおす

を一通り体験してもらう。先生が言うには「書いたプログラムが実際に動くまでには 2 つの壁がある。1 つはコンパイルエラーの修正、もう 1 つは自分の思ったとおりにプログラムが動くまでコードを修正すること。これはプログラマーである限り一生付きまとうことなので、いちばん最初にこのことを教えたほうがいい」という。

サンプルコードを書き写し、コンパイルエラーをなおす

まず、何も考えずに下記のようなコードを打ち込んで、これまた何も考えずいわれたとおりにコンパイルのコマンドを打ち込んで下さい、と指示する。サンプルコードの内容についてはトラックバック先のエントリを参照のこと。


#include

int main(int argc, char *argv[] {
int a,b,c,d;

scanf("%d", &a)
scanf("%d", b);
c = a + b;
scanf("%d", &d);

if (c == b) {
printf("OK\n");
} else
printf("NG\n);
}
return 0;
}

当たり前だが上のコードは大量のコンパイルエラーを吐き出す。ここでは、文法の仔細には立ち入らずに、プログラムというのはルールに則って書かなければならないことだけを強調する。

そして、生徒と一緒にコンパイルエラーを一つずつ潰していきながら、ルールには様々なものがあることを教える。カッコや""などは、対応関係がなければいけない、行末には ; が必要、など。また、include 文や & など、プログラミングにはおまじないがあることにも触れる。

コンパイルエラーが出たときの対処ノウハウも実際にやりながら教える。例えば、エラーメッセージがたくさん出たら、まず一番上のエラーと行数に着目してとりあえず残りは無視しておく、一行直すと一気にエラーは減っていく、など。要は、コンパイルエラーには典型的なパターンがあることを知って貰う。

先生曰く、「やたらと出てくる(英文の)エラーメッセージに圧倒されてやる気が削がれてしまう人間が少なからずいる」という。であれば「コンパイルエラーがたくさん出て困ってしまうのは、初心者にはありがちなこと」だと始めに教えるのが良策ではないか、と。そして「先生が実演してみせたようにコンパイルエラーの直し方にはパターンがあり、何度か経験すれば自然とわかるようになる」等と安心(?)して貰うことが重要、とのこと。

動かしてみて、意図しない動作をしているコードをなおす

コンパイルエラーを無くせば動くプログラムが完成する。ただ、このプログラムを実際に動かしてみると妙な動作をしてしまう。ここでは、自分の意図したとおりにプログラムを書くことの難しさについて触れる。

ここでは、愚直に c == b を c == d に書き換えるように指示を出す。これでプログラムは思ったとおりに動くようになる。ここで重要なのは、プログラムというのは、字面の上ではほんのちょっとしたミスしかしていないのにも関わらず、非常にヘンテコリンな動きをしてしまう、という特徴があること。

意図しない動作を直すのはコンパイルエラーを直すより格段に難しい。何せ、とりあえず動作はしてしまっているのだから。

先生曰く、「コンパイルエラーを直すことと、いわゆるバグを直すことは別々の難しさがある。その辺りがごちゃ混ぜになると、その人にとってのプログラミングが「何だかよくわからない難しいもの」に成り下がってしまう」という。なので「サンプルコードを写す→コンパイル→コンパイルエラーを無くす→動かす→動かない部分を書き直す、という「型」をまず徹底しておく。次に何をすべきなのかわからなくなる状況を作らないことが大切」とのこと。


このように、まず最初にプログラミングではなく、プログラミングはどのような活動なのか?について教えてはどうだろうか、という話を当時していた。まぁ、実際に実践してみたわけではないので有効かどうかは所詮机上の空論なのだが…。

Hello, world から始まらないプログラミング教育を目指して

…のように、「コンピュータの五大機能」と呼ばれるものがすべて盛り込まれた、極めて良質な教材サンプルとなっているのだ。「コンピュータのプログラムで何が出来るのか?」という点に関して言えば、すべてこのプログラムの延長線上で考えることが可能になる。

最初のプログラムとして "Hello, world." は適切か? - 帰ってきた人生戦闘詳報

少なくとも id:big-bros が指摘するように Hello, world から始めるのは今の時代にはもうそぐわないと俺も思う。それに、ナンカ入れるとナンカ出てくる、というソースをまず最初に作っちゃえばそれ以降の勉強にこれをテンプレートとして使えるようになる。イチから作るより何か基になるものを改造していく方が楽なのは言うまでも無いこと。

先生は、プログラミングのすすめ方そのものを初期教育の主眼にしてはどうか、と考えていたが、そのときのサンプルに「コンピュータの五大機能」をすべて含んだものを使えばより効果的なのではないか…と。

うーん…なんか、まだ所詮は空論、な気が…w

ってまぁなんというか書いてて思ったのは

コンソールベースの勉強って古臭いのかなぁー?とか思ったり。javascript で画面がグリグリ動いたり、ruby の余計なおまじないの少ないシンプルな言語から入ったほうが今はいいのかも。ケータイと web アプリ全盛期を過ごしてきた若者にとっては黒い画面で文字数字がウネウネ動いてるだけじゃモチベーションが保ちにくいかもなぁ…と思ったりもする。

ただなんつーか、ココでは明示的に書かなかったけど、以上の内容は大学の初等プログラミング教育を念頭に置いていたりする。コンピュータサイエンスの徒であらんとする人を対象にするなら別にかまやしないかも。