こんにちわ。hase-k0x01です。
私はとある学校でプログラミングを教えているのですが、多くのプログラミング教材では、変数に関する最初の説明で
変数はデータを格納するための箱(のようなもの)です
と表記されることが多くあります。
果たして、この説明は適切なんでしょうか。本当にこれで理解につながるのでしょうか。むしろこの説明がプログラミングの理解を阻害しているのではないでしょうか。
と、思っている方がいると思いますが、私も疑問に思っている今日このごろです。
実際の変数
実際の変数が何か、については、qiitaをご覧の皆様ならお分かりのことかと思います。
つまり、数字や文字、画像などを数値化して0,1だけで表記しメモリ上に格納し、そのデータに名前をつけたモノといえるでしょう。C言語ではすくなくともそんな感じです。
オブジェクト指向言語では、参照やインスタンスがあったりしますが、すくなくともプリミティブ型についてはそんな感じです。
初心者のつまづきポイントと教え方の困難さ
このような事実(変数はメモリ上にあって...)を理解した上で、「変数は箱」と言われれば、『あぁそうだな、確かに「箱」...かな?』、と理解出来ると思いますが、いきなり「変数は箱」と言われてもうまく伝わらないのではないでしょうか。
「変数は箱」の前提で理解を進めていくと 、「配列は箱を並べたモノ」「型は箱の形」という説明をすることになるのですが、この説明だとポインタや参照の説明をするのが非常に困難になります。
この場合、ポインタのときになってやっとメモリとかアドレスの話が出てくる ことになります。
「変数は実はメモリに格納されていて、アドレスがあって...」
学習者からすれば、
「変数は箱じゃなかったんか~~~!!」
って感じです。ポインタってなんやねん。意味分からん。ってなります。
参照にしたってそうです。箱とは別にそいつを指している参照が有るって言われても、
え、箱を..指している????
ってなります。
というわけで、最初に「変数は箱」って言ってしまうと、あとで話が矛盾してしまうのではないか、と思っています。
くわえて言うならば、「変数は箱」で説明するとき、箱のイラストが3次元になっているのですが、実際のデータの配置は1次元の連続した空間ですし、それを図で表現するなら1ワードずつ区切って並べた2次元の表のようにするのが実際のデータ構造に近くなります。
この差も理解を進める上での障害になっていると考えています。
最初からメモリとかアドレスを教えればいいんじゃない?
そこで、私の授業では、最初からメモリとアドレス(とCPU、バス)の存在を最初に説明しています。
もちろん、市販の教科書には書いていないので、補助教材や板書で説明ですが...
最初の説明はだいたいこうです
- コンピュータの中では数字も文字も画像も、数値として扱われる
- ちなみに、数値は英語でdigitで、digitalというのは数値のという意味
- 数値はメモリに格納されていて、データはメモリの中を一定の大きさに区切って格納される
- メモリ上のデータが格納される場所に「アドレス」で識別される。アドレスは重複しない数値で16進数で表記される(ことが多い)
- メモリ上には0,1つまり2進数でデータが格納される
- 変数(のデータ)はメモリ上に置かれる
- 変数を定義するとメモリ上に変数(のデータ)を置くための領域が確保され、名前が関連付けられる
- プログラムからは、変数を名前で識別できる
...というのを説明したうえで、
「変数は箱に例えられる場合もある」
という感じです。
説明が回りくどいんですが、「変数は箱」と説明して後で矛盾するよりはいいかなあと思います。
実際にそれで理解できるのか
私の授業では、最初に箱として説明した場合に比べて、理解が順調担ったように思われます。
ちなみに、私の授業では、変数の説明はたっぷり30分~1時間はかけるし、教科書もイラスト含め数ページつかっています。
プログラミングの基礎の基礎となる知識なので、時間をかけて理解を浸透させるわけですね。
まわりくどいような教え方ではありますが、これが一番後の伸びがよいのではないかとおもっています。
すべてを理解したうえでの「箱」は良いかも知れませんが、初学者に「変数は箱」と言ってしまうとその例えの背景を知らないので、より深いところを考えようとするための基礎データが頭の中にないわけですね。これではポインタで躓くのも当然といえます。
当然、「メモリってのがあって」という話から始めると、全員が??????っていう感じで宇宙猫の顔になります。
なので、何度も何度も同じ説明をするわけですよね。そうすれば、なんとなく理解も進んでいきます。
おわりに
というわけで、「変数は箱」という説明をやめた方がいいんじゃないか、じゃあ、どういう説明をしたらいいのか、という提案でした。