kagamihogeのblog

2007-11-09

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

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

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

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

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

1. サンプルコードを書き写す

2. コンパイルエラーをなおす

3. 動かしてみる

4. 意図しない動作をしているコードをなおす

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

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

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

#include <stdio.h>

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 アプリ全盛期を過ごしてきた若者にとっては黒い画面で文字数字がウネウネ動いてるだけじゃモチベーションが保ちにくいかもなぁ…と思ったりもする。

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

とおりすがりとおりすがり 2007/11/10 01:12 HalloWorldからはじまるプログラムが入門になったのは比較的最近(15年くらい)のことだと思います。おそらくCが普及してから。それまではBASICやアセンブラの時代でしたが、まっさきにこれがくることはなかったはず。かえるの歌を鳴らしてみようとか線や円を引いてみようってのがすぐにありました。

C言語が普及して、描画やサウンドが標準ライブラリから取り除かれた結果、かえって表現力が落ちたのは有名だと思います。

入門でこんなのが書かれていたら、だれだってプログラミングに興味を持ちませんよね。音楽や計算やお絵かきが真っ先に来た昔は、文法がおざなりになっていましたけど、入門の正しい姿だと思います。楽しければ、いくらでも勉強しますって。

kagamihogekagamihoge 2007/11/10 12:56 > 入門でこんなのが書かれていたら、だれだってプログラミングに興味を持ちませんよね。
なるほど・・・俺のプログラミングに対する原風景は大学の講義で始まったものなので、どーにも理詰めな教育方針を前提に考えてしまっているんだなぁ。大学でバブルソート習ったときが「プログラミングすげぇ!」な原点だったもので。まぁ、学問を修める立場としてはそれほど間違ってないスタートだったとは思うんですけどね。

ただ、誰しもが最初からコンピュータの基礎理論から興味持つわけじゃない、ってことには中々気付かなかった。計算はともかく音楽やお絵描きにはアンマリ興味持たなかったからなぁ・・・貴重なコメントありがとうございます。

Mr_T_0023Mr_T_0023 2007/11/12 09:09 Mr.Tです、こんにちは。
グラフィカルなもんなどは入門本としての売れるための条件っぽいところが
あるような気もします。(日本では)
結果、HowTo本に成り下がってしまう可能性が高いため、プログラムの世界の
門を叩くという意味では、きちんと学ぶための本や機会というのはやはり
学校という枠が一番王道なんじゃないかと、思いますが。
#独学を否定するわけではないです。

kagamihogekagamihoge 2007/11/13 20:40 コメントのレスになってないんですが、プログラマーの初期教育に関してみんな興味あるんですねぇ。そこには色々な思惑が絡んでるんだと思いますが、色んな意見が見れて面白いです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証