変数は「箱」か?

ここ数日、業務が落ち着く頃合いを見計らっては週末に行われるPerl入学式の資料に手を入れていました。

資料は校長の @papix さんがざーっと一気に作ってくれて、ぼくがやったのはちょこちょこっとしたリファクタリングというか、文字校正みたいなものでしたが、それだけでもいろいろ勉強になって楽しかったです。
(あいにく、ぼくは当日参加できないのですが)

さて、その資料を作る際にはメンバーの方々とあーでもないこーでもないと様々な議論をしていたのですが、その一つに「変数を『箱』に喩えて説明しているけど、これでいいのか?」という話がありました。

「箱」か「名札」か

プログラミング入門者に「変数」の概念をどう伝えるか、といったときに、そこでどんな喩えを用いるか、というのはなかなか伝統的なイシューだと思われるのですが、ぼく自身の結論から言うと、現代では「箱」よりは「名札」とするほうが妥当かなと思っています。

なぜなら、「箱」にモノを入れた場合、その箱を同時に使えるのは1回きりになるからです。

具体的な例をひとつ考えると、たとえば「ミスター」と書かれた箱に「長嶋茂雄」氏が入っているとします。
言うまでもなく、長嶋さんは世界に一人だけなので、その箱も一つしか作れません。

しかし実際には、変数というのは一度に何回も使えるものなので、

ミスターといえば巨人。ミスターといえば背番号3。ミスターといえばサード。ミスターといえば……

みたいに使いたいわけですが、この「ミスター」を箱として考えてしまうと、2つめ以降の「ミスター」に置ける「箱+長嶋さん」が存在せず、喩えとして破綻します。

言い換えれば、「箱」に喩えても成立する状況というのは、その変数を一回しか呼び出さないときだけです。

ミスターといえば巨人。以上!

一方、もしこれが「名札」であれば、このような破綻は起きません。
名札はいくらでも量産でき、実体(長嶋さん)は一つ存在すれば充分だからです。

よって、どちらが適切か、といえば「名札」の方だと思います。

入門書の現状

しかしながら、身の回りにある入門書を見ると、どちらかと言うと「箱」の例を使うもののほうが多いようです。

ざっと見ただけでも、以下がそうでした。

一方、「名札」を使っているものは以下でした。

これとほぼ同じ意味で、ドットインストールは「ラベル」と言っています。
(特定の言語によらないのでトップページにリンクしておきます)

また、とくに何かに喩えていないものもあります。

その他、ちょっと変わっているというか、さすがと思ったのは深沢千尋さんの以下の2冊。

こちらでは「中学校の数学で出てくるxとかyのようなもの」と説明されています。なるほど。

くだらない話?

ところで、上記の「箱」組の最後に挙げた前橋和弥さんの『センス・オブ・プログラミング!』では、変数を何に喩えるかというそのものズバリの話題があり、以下のように書かれていました。

本書に限らず、変数を「箱のようなもの」と説明している入門書は多いものです。
ただ、これは妥当なたとえではないという人もいます。その主張は、

変数が「箱のようなもの」で、その箱に値を入れることが「代入」であるとするなら、その「箱」からまた別の「箱」に代入を行ったとき、前の「箱」は空になってしまうはずではないか。

というものです。
これは確かに一理あります。
(略)
こう考えると、変数は「箱のようなもの」というより、「メモ用紙のようなもの」とでも考えたほうがよいのかもしれません。
(略)
しかし――変数が「箱」であるのか「メモ用紙」であるのか、そんなくだらない話を真剣に議論してもしょうがないでしょう。たとえ話は所詮たとえ話です。「変数」が実際にどのようなものかを知りたければ、結局、「メモリ」の話を抜きにすることはできないと思います。

(p33-34・太字原文ママ

この結論には、正直、残念な思いがしました。本書は非常に面白く、現時点を含めて数年にわたって少しずつ読み続けているのですが、それでもこのくだりの意見には賛同できません。

なぜなら、ここで「くだらない」と表現されているささいな矛盾に引っかかるのは、著者にイチャモンを付けたいだけの性格の悪い誰かではなく(まあ、そういう人もいるかもしれませんが)、同書が対象にしている、ぼくのような入門者だからです。

そのような入門者を示す良い例として、@uzulla さんがブログに書かれた以下の話があります。

実際に聞かれた事ですが、たとえばfor文は以下のようなものですが、$i、というのがよくわからないといわれました。

for($i=0;$i>10;$i++){
    echo $i;
}

どこの本にも$iとかいてあるので、これは$iでないといけないと勘違いする人とかいます。

「なぜ $i なんだろう?」という疑問は、非入門者にはなかなか湧いてこないものかもしれませんが、入門者はこういう「どうでもいいこと」にバリバリ引っかかります。

「さっきまで $foo だった変数名がなぜ今度は $hoge なんだろう? 何か意味があるのだろうか?」とか思います。

そういう状況が生じてしまうのは、教える側が「そんなことはどうでもいい」と思っているがゆえに、その点をテキトウに説明してしまっているからです。

逆に、もし教える側が「そうそう、こういう細かいところで初心者は引っかかるんだよな〜」ということをわかっていて、またそうした疑問を尊重していれば、変数名を付ける際に foo と hoge を無規則に混在させるようなことはしないでしょうし、上のうずらさんの例で言えば、「ここにある $i というのはとくに意味はありません。$j でも $k でも $abcdefg でもいいです。でも、 i が打ちやすいのでそうしておきます」といった説明を事前にできるかもしれません。
教わる側としても、先にそれを聞いていればわざわざそんな質問をする必要はなくなります。

ここで言いたいことは、そういったことを「くだらない」と思うのは教える側でしかなく、教わる側にはそれがくだらないかどうかすらわからない、ということです。

そして、もし最初から疑問が生じづらい(矛盾の少ない)喩えを用意できていれば、それによって教える側も教わる側も、貴重な時間や労力を節約できるはずだということです。

直感的かどうか

さてしかし、ここまで「名札」推しのぼくでしたが、冒頭で紹介したPerl入学式の最新の講義資料では、それまで採用されていた「箱」の例を直しませんでした。(よって今も「箱」のまま)

その理由は、第一には「面倒だから」で、何が面倒なのかというと、この資料は基本的に複数人の合議のもとに作られているので(資料の作成メンバーは東京だけでなく大阪にもいて)、あまりホイホイ自分勝手に変えられない、ということがあります。

変えられないと言っても、べつにメンバー間の雰囲気が悪くて提案できない、といったことではなく、実際には今回も「どっちかというと箱より名札のほうがいいし、今後のトレンドはそうなっていくと思う」などと偉そうなことを普通に伝えましたし、メンバーもまたそうした意見に耳を傾ける度量を持ってはいるのですが、それでも意思決定にかかる時間が少し負担になりそうだったので、無難に現状維持を選択しました。

逆に言うと、もしこれがぼく個人の文責によるものなら、迷わず「名札」にしたと思います。

そして、直さなかった理由はもう一つあって、それは「箱」のほうが直感的というか、映像的に状況をとらえやすい、と感じるからです。

ぼく自身、入門時期には上に列記したような「箱」に喩えている本を通して変数の雰囲気を把握しましたし(とくに結城浩さんの本ではイラストが明快で直感的だった)、確かにその喩えはある種の人の頭の中ではゆくゆく破綻していきますが、同時にそれは致命的な破綻でもなく、学習に支障をきたすようなものではないとも思います。

言い換えれば、一時的に必要なハシゴとして、とりあえずその時に用が足りる道具として「箱」を使うのはアリかなと思っています。

まとめ

え、じゃあ結局何に喩えればいいと思ってるの? と聞かれたら、もし「箱」とそれ以外の何かから選ぶのであれば「名札(ラベル)」がいいと思います。

しかし一方で、そもそも何かに喩える必要があるのか? という自問も必要だと思います。

たとえば、上に挙げた『かんたんPerl』や、同著者による以下の本では、

変数の説明の最中にいきなりパソコンのメモリ(実物)の写真を登場させて、「この中にはトランジスターがびっしり植えられていて……変数を用意するとそのぶんの領域を確保してくれて……」みたいな大変具体的な話が展開されていたりします。
喩える気ゼロ。という気もしますが、これもまた一つの解だと思います。

変数は「箱」か? という問いに対しては、そうとも言えるし、そうじゃないとも言えます。

しかしいずれにせよ、大切なことは、「それが入門者にとって効果的なのかどうか」を考え続けることだと思います。
「とりあえずこんな風に説明しておけばいい」という標準的な例を洗練させながら、最終的には、その瞬間に目の前にいる「教わる人」に最適な説明を考えていくべきでしょう。

*1:手元にあるのは第3版なので厳密にはこの第5版については不明です。