プログラミングの変数を教えるときの「箱の説明」の是非について。

定番ですが、Kazuhiro Abe氏のアンケートから、端を発したツイート群をまとめました。以外と否定派が多い? 誰でも編集可能にしてるので、気軽に追加してください。
プログラミング データ型 変数
27225view 57コメント
28
アベ先生 (CV: 阿部和広) @abee2
「お名前は?」「○○です」「何歳ですか?」「5さい」という受け答えができる子に、変数をわざわざ箱に例えて、入れたり出したりする必要があるのだろうか。
Hiroaki Kadomatsu @note103
blogged. / “変数は「箱」か? - the code to rock” htn.to/tGnQAo
アベ先生 (CV: 阿部和広) @abee2
プログラミングの初心者に変数を教えるには「箱」で説明するのがよい。 (メンションなどで理由もいただけるとうれしいです)
はなだ☆のぶかず@lisp &ボドゲ勢ボドゲプレイヤー) @nobkz
@abee2 いいえとしました。箱のイメージをプログラムの動きに正確に当てはめないと、理解できなくなるからです。たとえば、「代入」を表現するとき、「箱に入れる」になりますが、そのとき「複数は入らない」ようにしないと誤解すると思います。そしてそれは「箱」のようなものでないと思います
あを蜜柑 @AknEp
@abee2 いいえで、自分が箱の例で理解出来なかったからです。 「x=1;とすると、xが1の代わりになる。 x=2とすれば今度は2の代わりになる」くらいで良いんじゃないでしょうか。あとはユーザー入力させるプログラムでも触らせれば有用性も意味も段々と分かってくるような。
はなだ☆のぶかず@lisp &ボドゲ勢ボドゲプレイヤー) @nobkz
@abee2 また、箱のイメージを最初するとき、おそらくは、箱の大きさを固定してしまい、たとえばx = yなど「箱の中に箱を入れる」という表現はなんとも違和感があるんじゃないかと。僕の主観ですが。
アベ先生 (CV: 阿部和広) @abee2
@nobkz ありがとうございます。比喩は強力なツールですが、例えるものと例えられたものは同一ではないところが辛いと思います。
アベ先生 (CV: 阿部和広) @abee2
@AknEp ありがとうございます。「代わりになる」というのは、代入(代わりに入れる)の意味からしても適当ですね。
あを蜜柑 @AknEp
@abee2 おおっ、確かに仰るとおりですね! そこまでは考えられてなかったので、勉強になります。
はなだ☆のぶかず@lisp &ボドゲ勢ボドゲプレイヤー) @nobkz
@abee2 そうだと思います。結局指導方法の問題になるかな気がします。値を入れる/取り出す、などは箱の説明が上手く行くので、「普通の箱とは違って、プログラムの箱は~」みたいな説明だと上手くいくのかなと考えたりします。
アベ先生 (CV: 阿部和広) @abee2
@nobkz 取り出す(参照する)しても中身は無くならないぞとか、生まれたての箱の内部状態はどうなんだとか、気になって仕方ありません。
Tomoaki Masuda @moonmile
@abee2 YES です。 ポインタの概念と関数の受け渡しに話を繋げるときに、「値そのもの」ではなく「値を入れた箱」を受け渡すように説明しています。変数の概念が分かりやすくなるように「X ← 10」を図示した後に、コードではC言語では「X=10;」と書く、という感じです。
アベ先生 (CV: 阿部和広) @abee2
@moonmile ありがとうございます。その場合、ポインタのアドレスは箱の番号ということになるでしょうか。また、ポインタも変数であるということは、それもまた箱になるのでしょうか。
Tomoaki Masuda @moonmile
@abee2 YESです。メモリ上の何番アドレスに変数の「箱」があって、これを値とみるかポインタとみるかの違いを説明して、ポインタの場合は別の箱/アドレスを示している、という感じで繋げてます。こうするとJavaなどのオブジェクトに話に繋がりやすいので。リスト構造とか配列も。
𝕍𝕚𝕖𝕟𝕟𝕒𝕋𝕒𝕝𝕜𝕖𝕣 @tomooda
箱の場合は排他的ですね。ボールを箱に入れた時、そのボールは他の箱の中には入っていない筈。でも変数の場合は排他的ではありません。 @abee2
アベ先生 (CV: 阿部和広) @abee2
@moonmile そうすると、それは物理的な箱ではなく、概念としての箱になると思いますが、その移行はどのように行われるのでしょうか。物理的な箱のイメージが強すぎて、その移行を妨げたり、誤解を招くことはないでしょうか。
raven @raven_38_
@abee2 NOです。Pythonの変数はオブジェクトに対する参照とされているので箱は違うかなと(他の言語でどう扱われているかはちょっとわからないです)。ラベルというふうに教えています。
アベ先生 (CV: 阿部和広) @abee2
@raven_38_ ありがとうございます。ラベル(札)という方も一定数いらっしゃいますね。
市川愛子@プロセニアム来てね @ichikawa_aiko
@abee2 いいかどうかといわれると「うーん」となりますが、XとかYとか数学用語に拒否反応を示す高校生を相手にするときには、導入のときに「小箱」に入れる感じと表現することがあります。リストは箱が並ぶ棚です。使っていって、変数の性質を理解する感じです。
アベ先生 (CV: 阿部和広) @abee2
@ichikawa_aiko それは、XとかYとか言わなければ良いのではないでしょうか。
バンビちゃん@実際存在しない @pink_bangbi
個人的には『箱』って説明結構わかりやすいと思うんだけどなー C++ でいうと 箱:lvalue(変数) 中身:rvalue(値) x = 10:中身を箱に入れる y = x:x の中身をコピーして新しい箱に入れる z = std::move(y):yの中身をzに移動させる
はなだ☆のぶかず@lisp &ボドゲ勢ボドゲプレイヤー) @nobkz
「変数は箱」という説明で、否定の人達の意見が出たことが多いのですが、理由としはいくつかあって、変数については定番の説明で大多数の方がそれで学習したので、そのおかげで混乱してしまったみたいな体験をされた方が多いのではないでしょうかね?
はなだ☆のぶかず@lisp &ボドゲ勢ボドゲプレイヤー) @nobkz
もうひとつ考えられるのは、「変数」というのは、プログラミングするには当然の機能ですが、そもそもプログラミングの中で高度で複雑な機能なので、そもそも説明が難しいということがあるかもですね。数学でも「変数」は中学から習うもので、もしかしたら学習として後の方にするべきかもしれません。
Вюлка (Ryusei) 🧂📚 @mandel59
assignmentとsubstitutionが日本語だと両方とも代入なのが問題の一端かもしれない
Вюлка (Ryusei) 🧂📚 @mandel59
割当て assignment, 束縛 binding, 代入 substitution, ユニフィケーション unification
残りを読む(8)

コメント

kzt @kztiam 2016年6月10日
型が自動的に決まる言語はアマゾンのダンボール箱に入れている。なんて。
jjeioajjfkk @mzpjkgaGKjfva 2016年6月10日
箱っていうと函数を連想する派。
夢の中ハッピー @anatanomunenido 2016年6月10日
箱で教えたれてポインタで死んだ俺
シン @saeki_s 2016年6月10日
例えではなく、いっそのことメモリで何やっているのかをそのまんま説明するのはハードル高すぎかな。
ask @whirlpool 2016年6月10日
教える相手の年齢と頭の出来によって、妥当な教え方はそれぞれ違うと思うんだけど。
3STT:3P(K.U.Z.) @KUZ_3STT3P 2016年6月10日
物体に例えて理解できるのは空間把握能力があるからであるが、空間把握能力が高すぎるか低すぎるかすると、箱の大きさが気になったりそもそも箱が思い浮かばなかったりと・・・ そもそも、箱の重要性は”中身を隠すこと”って基礎を忘れた人が多いせいで箱で教える意味がない。
裸茶P@このゲームは足を使います @chiba_daten 2016年6月10日
変数の概念は「適切に教えれば誰でも理解できる」ものではなく、「わかる人はどんな説明でもわかるし、わからない人はどう説明しても理解できない」という類の概念であることを認めてある程度諦めちゃったほうが良いと思う
かえでこ @KaedekoSakura 2016年6月10日
大事なのは、「変数と言う値をしまえる箱があります」と言う知識じゃなくて、「使うと問題を解決できる変数と言う便利な概念があります」と理解させること。そのためには、なにが「問題」かをきちんと把握させることが必要で、その問題を「解決したい」と思わさせることができればよりベターで、そうした設問がきちんとなされていれば、説明をするのにつかわれる比喩が箱かどうかなんて、些末なことだと思うんだ。
3STT:3P(K.U.Z.) @KUZ_3STT3P 2016年6月10日
箱なのは「変数の中身が無い状態」が理解できない人がいるので「見えないだけで中身はある」と認識させるため。 「箱には3が入っています箱の中身に2を足すと?」で5と答えさせてから「箱の中身は4でしたと見せて再度計算させる」ことで「箱の中身がわからないままでも計算式を作れる」という変数の基礎概念を教えるためにあるのが箱。
かえでこ @KaedekoSakura 2016年6月10日
よくゲーム的な勉強方法で「ブロックを組み合わせることでプログラムになる」アプリとかあるけれど、こういうのに「ポインタで躓く」とか言わないじゃん。
かえでこ @KaedekoSakura 2016年6月10日
知識先行型は失敗するような気がするなぁ。それって、繰り返し書けます、条件分岐書けます、目の前の問題をプログラムで解決?わかりません、って人を作るだけじゃなかろか。
アルビレオ@炙りカルビ @albireo_B 2016年6月10日
「箱」と「名札」を同等に考えちゃダメだよ。参照やポインタでつまづくのはそこを区別できないからだもの
アルビレオ@炙りカルビ @albireo_B 2016年6月10日
KaedekoSakura そういのは「キャラクターの座標」「キャラクターの種類」のような直感的に把握できる変数以外は極力隠しているので、そこからもう一歩複雑なものに進もうとするとポインタどころか変数でつまづくこともけっこうありえます。ワーク変数のような抽象的な変数の概念でわからなくなることがある
初瀬 神楽 @Kagura_d34272 2016年6月10日
Q:変数って何? A:変な数だよ  と教えた人が居たとか何とか。 個人的には「 A = A + 1; 」って数学で考えたら「何言ってんだお前ふざけんな」な表記なんで、変な数ってのもあながち間違いやないと思ったり(但し「変数をどう教えるか」という答えにはなってない)
KIMATA RobertHisasi @robert_KIMATA 2016年6月10日
マンガでJavaScriptがわかると思っているのかお前は | 第2章 変数と関数 http://www.comico.jp/challenge/detail.nhn?titleNo=14519&articleNo=3
初瀬 神楽 @Kagura_d34272 2016年6月10日
んで実際、最近だとC#やるのかJavaやるのかPHPやるのかJavaScriptやるのかで必要な知識も考え方もある程度変わってくるんで(JavaScriptとかだと「ポインタ」とか概念あるわきゃないし)あまり概念的なことから入ると逆に躓きそうやねーと思うん。
闇ときどき豚 @yami_buta 2016年6月10日
たとえ話というのは、これから理解しようとしている人が理解できればいいので、すでに理解している人がわざわざ理解できない理屈をひねり出しても仕方ないのでは。
アルビレオ@炙りカルビ @albireo_B 2016年6月10日
ポインタは参照の古典的な形にすぎない。いまどき参照の概念がない言語って教育用に割り切ったものくらいしかないのでは
Chief Buster @chief_buster 2016年6月10日
プログラムの変数は初等数学の変数の概念とさほど違わないので、中学の数学の教科書が参考にならないでしょうか?思いつきに過ぎませんので、ご参考まで。
うさきち@アニキじゃねーよ! @aliceblue555 2016年6月10日
変数とは代入のことだったのか!と納得しかけたものの私数学の基礎ができてないので、関心する部分と???となる部分が…。 まとめのおかげで理解が深まると良いなと思います。
牡山羊 @ZkR7cFrAUAIernN 2016年6月10日
箱だけじゃなく他の例え方も一緒に知っておくと良いと思う。学校のゲタ箱とか、お前の机の一番下の引出しとか、お前のベッドの下の空間とか。何でも入れられる的な意味で。
Chief Buster @chief_buster 2016年6月10日
Kagura_d34272 せっかくNiklaus Wirth大先生らがALGOLで代入演算子を":=”、比較演算子を”=”にしたのに、Cを始めとする主流言語が代入演算子を”=”のままにするから...
みこみこ。 @MikoMiko2048 2016年6月10日
レジスタ使うと変数が大きなものではないようなイメージに
kkitmur @kkitmur 2016年6月10日
同じ名前だけど、場合によって違う数。 例えば年齢は人によって違うし、一年後にはみんな変わっているよね。でもそれはみんな「年齢」って名前の数だよね? みたいな
アルビレオ@炙りカルビ @albireo_B 2016年6月10日
kkitmur それは変数というよりオブジェクトのプロパティ的な概念。変数ってのはもっとちょくちょく中身が入れ替わるものとして理解した方がいいので「入れ物」の比喩の方が合ってると思う。「入れ物」と「中身」のつながりは一時的なものってのが重要だと思うよ
ニド @2ewsHQJgnvkGNPr 2016年6月10日
chief_buster 代入は極めて使用頻度高いんだから1文字にしたい、という切実な要求があるので……「x=x+1」「x+=1」「x++」は1,2文字しか違わないのにこんな記法が導入されるわけだし……
ニド @2ewsHQJgnvkGNPr 2016年6月10日
いや、変数名が長くなったらその分だけ差が広がるな。失礼。 でも「x+=1」「x++」は1文字しか……
Chief Buster @chief_buster 2016年6月10日
2ewsHQJgnvkGNPr その1byteをケチったせいで、後々まで祟ったと言う好例ですな。最近のプログラミング記法(オブジェクト名やメソッド名の長さ...etc.)を見れば、なんて馬鹿な事をしたのだろうと。 なおx+=1とx++は、かつてアセンブリコードにした時に違ったのですよ。今のコンパイラなら最適化でそんな事は起こるはずもありませんが、初期のCは高級マクロアセンブラのような物だったので。
kkitmur @kkitmur 2016年6月11日
albireo_B あー確かにプロパティになっちゃいますね
深井龍一郎 @rfukai 2016年6月11日
chief_buster 昔は記憶領域が高価だったから仕方ないんじゃないですかねぇ。
アルビレオ@炙りカルビ @albireo_B 2016年6月11日
Cはコンパイラを作りやすいようにかなり割り切った言語だからねぇ。考え方としてはPascalの影響が強いのに構文はC言語風にしたjavaがPascal風の代入文にしてれば、javascriptにも反映されてそれなりの勢力を作れたのかも
ma10ma19(今日もほえほえ) @ma10ma19 2016年6月11日
いまプログラミングを教えている世代は皆、すがやみつる先生の『こんにちは!マイコン』でBASICを学んだからなあ。 変数を箱で例えるのはそのなごり。
アルビレオ@炙りカルビ @albireo_B 2016年6月11日
2ewsHQJgnvkGNPr chief_buster ++も+=も「代入演算子の右辺に式、左辺に代入先」という原則を崩してる異端児という意味で同類でして、ソースコードのバイト数をケチる以上に「機械語命令をそのまま演算子にしたもの」というコンパイラが楽をするための存在と言った方がいいような…でも実際に使用頻度が高い上に、コードを読むときも「長い変数名=長い変数名+1」なんて書くよりも何をしているのか把握しやすいというメリットは大きいので「なかった方がよかった」とは思えないんですよね。特にfor文とか
うてん。 @uten00 2016年6月11日
プログラムにおける変数は変数単体で考えるんじゃなく定数との比較でどう違うのか理解すべきもんかもしれない。
沸騰石 @jnk9801 2016年6月11日
ストレートに「メモリの領域に名前を付ける。」と言って理解できないようなら、そこまでの教育が間違っている。 と思う僕はかなり偏っているのかな?
nekosencho @Neko_Sencho 2016年6月11日
誰に何を説明するかで適切かどうかは変わってくるからなあ。
Chief Buster @chief_buster 2016年6月11日
rfukai 多分アカデミズムとハッカー文化の喧嘩の結果だと推測してますw
ちいさいおおかみ〜クリアカード編〜 @siu_long 2016年6月11日
mzpjkgaGKjfva 連想するも何も、元来は"函"数と書きましたからね。
まづ(*´♡`*)🍌🐟 @netabare_yan 2016年6月11日
変数は部屋そのもの、ポインタは部屋番号を書き留めたアドレス帳って教えてるなあ。
ちいさいおおかみ〜クリアカード編〜 @siu_long 2016年6月11日
変数にも色々あって、名探偵なのかおばけなのか盗人なのかスパイなのか…そんな感じでしょう。後、排列は例えば野球のオーダー表とかで理解可能になりますね。喩え方も色々工夫しませう。
kartis56 @kartis56 2016年6月11日
xが1の代わりになる はポインタじゃないかなぁ…
Shimaden⛄ÿú*゜司馬殿 ซิมะเด็ง @SHIMADEN 2016年6月11日
変数は箱じゃないよ。例えばソロバン。常に何かの値を持ってる。その値を変えること(代入)と読み取ること(参照)ができる。箱みたいに空になったりはしない。
かえでこ @KaedekoSakura 2016年6月11日
albireo_B そこまで言った場合問うべきは、「5歳児に必要か?」ではなかろか。
かえでこ @KaedekoSakura 2016年6月11日
「なんで変数という概念が必要か」を教える(または感じさせる)ことよりも、「変数という概念はいかなるものか?」を一生懸命教えようとしている気がして、専門学校でよく見た失敗事例一直線。
Dcdcxr @Dcdcxr 2016年6月11日
これ、子供にプログラミングを教える時の話?
かえでこ @KaedekoSakura 2016年6月11日
「初心者」やら、「プログラムを教える」も、きちんと定義しないとブレブレだと思う。
すいか @pear00234 2016年6月11日
ツイートやコメント欄で「箱じゃなくて○○のほうが~」「××な教え方のほうが~」って言ってる人の内容を見るに、箱の喩えこそが「ベストではないとして現時点で存在しうる最もベターな喩え」であるってのを痛感したな。「下手な考え休むに似たり」ともいうかな。
瑞樹 @mizuki_windlow 2016年6月11日
変数を何かにたとえて考えた事ってないや……変数は変数であり、それ以上でもそれ以下でもないって感じの認識だな。一番近いのは「中学一年の数学で習った“x”と“y”こそが変数」って間隔かもなぁ……まあ、私、他人にプログラムを教わった事も教えた事もないけど……
藤堂雷鳥🖖 @CHICKEN_TODO 2016年6月11日
比喩なんだからすべてが同じように表現できているわけじゃないし、考え方の1つでしかないよ 本当の動きを理解したいならアセンブラ読んだ方が分かりやすいし
ばしにぃ @hiro_orso_viola 2016年6月11日
なんつーか、「箱」のイメージや概念が固定化されてる(としている)事自体に違和感を感じるけど。あと「変数」「定数」ってレベルの段階でポインタとか教える考慮は必要ないと思う。そもそも最初からオブジェクト指向ならアドレスの概念ほとんど不要でしょ。
蒲田 典弘 @lets_skeptic 2016年6月11日
教える対象が違うのだから銀の弾丸はない。そして比喩は実物と一致しない。
ばしにぃ @hiro_orso_viola 2016年6月11日
そういえば値を代替するという意味での変数とか、数学の方程式でxとかyとか普通に習うと思うんだけど…箱で連想できないと後で方程式習ったときも分からないのでは…?
ヘルヴォルト @hervort 2016年6月11日
PS2のRPGツクールで変数を覚えた俺参上。
T.Nakagawa @nora1962 2016年6月12日
「型」とか、「オブジェクト」の概念、「関数型プログラミング」とか将来のこと考えると、箱のたとえはおすすめしない。
gwn001 @gwn001 2016年6月12日
初めてプログラミングを教わった時やはり箱で習ったんですが、脳内ではずっと変数が犬小屋で値が犬でした。(犬好き) 犬のタイプによって犬小屋も違うものを用意したり、犬小屋によって中に何匹も犬が入れたり。
ログインして広告を非表示にする
ログインして広告を非表示にする