のらりくらり

物理化学分野のポスドクです。プログラミング、読書、自転車などが好きです。

c言語ってどう教える物?

知り合いが大学の講義で困って、C言語を誰かに教えてもらいたいといっているらしい。
そんな話を今日友人に言われて、助けられるものならいくらでも助けるとは言ったんだけど、C言語(に限らずプログラミング言語?)ってそもそも人にどう教えるものなんだろ?
という疑問にぶつかっています。
自分はバイト始めたとき、ひと通り、CとRubyは書けたからなぁ・・・
それまでは何度も始めたり止めたりを繰り返しながら、知識をWEB等で断片的にでも仕入れて、Cに関してはK&Rでそれらをまとめていくって形でやっていました。
実際、プログラミング言語って(英語・フランス語などの自然言語もそうかも知れないけど)、文法事項の特定箇所だけが分かっていてもあんま意味なくて、それより全体的になんとなくでいいから雰囲気つかめて、とりあえずプログラム書けるっていう状態にもっていくのがまずは重要なんじゃないかと思っています。

じゃぁ、僕はそのC言語が分かんなくて困っている人にどういうふうに助けるべきなのか。パッと考えついた選択肢を以下に。
1、文法を教える(講義みたいな?)。
2、とりあえず簡単なプログラムをたくさん書かせる。
3、大学で出た課題だけやってあげる(これはマズいか)。
4、本を読んでもらって、意味ワカンネってとこだけ解説。

とりあえず、まず何に困っているのかを考えてみるテスト。
1、用語がわかんない。
・・・これは結構あると思います。たとえば、普段何気なく使っている引数とか変数とか言うワード。変数っていっても数(∈N)じゃないじゃん。インスウってなんだよ?みたいな。関数?渡す値はvoidだと?戻り値?意味不明。
自分もホンットに始めたてのころはこのへんからよく理解出来ていなかった。とりあえず、高校までの数学で出てくる変数とかの概念を一時的に捨ててみることでしょうか?
それにしても、数学でいう関数とは違って、プログラミングにおける関数は(一般には好ましくないが)環境という概念が影響することが説明しづらい。

2、ポインタって?
自分はこれは躓かなかったんで何とも言いようがないんだけど、でもポインタって分かりにくい概念なのかもしれません。
まずは、プログラムはメモリ上で展開され、メモリはロッカーのようになっていてそれぞれのロッカーの扉には番号が振ってあって、その番号がアドレスで・・・みたいなよくある説明。メモリってなんだよ?そこから分からないのかもしれない。

二つ目に、「ポインタ」っていう用語の意味。
いろいろな本がポインタとアドレスを混同させるような説明表現をしていたりするのかも。上も実際はポインタの説明というよりアドレス(参照)の説明に過ぎません。あとは、普段「〜へのポインタを渡す」って言う時にポインタ≒アドレスの意だから分かんなくなるのかな。
ポインタとは、アドレスとその型のメモリ中でもつ幅(オフセット値)の2つの値をもつ変数である、っていうことが重要。

うん、難しい。続きは後日。