ビスケットのあれこれ

ビジュアル言語ビスケット(Viscuit)に関するあれこれを書いてゆきます.

コンピュータはバカだけどすごい

2016-04-30 12:25:39 | 1
コンピュータとは何かということを言い続けてますが,それ自身ぼんやりした話ですよね.知っている人はなんとなく知っていて,知らない人はまったく知らない.一体何と言われてもぼんやりしたことしか言えない.

ということなので,僕が考えていることを,少しずつ説明してみます.

まず,みんなに知ってもらいたいのは,「コンピュータはバカだけどすごい」という話です.コンピュータの動きってときどき,信じられないくらいバカな動きをしますよね.一方でむちゃくちゃ賢い動きもする.どうしてそうなっちゃうのかということです.

コンピュータはプログラムで動いています.そのプログラムの中身はというと,小さな命令があってそれを組み合わせて一つのプログラムになっています.どれくらい小さな命令かというと,これが人間が考えるよりもずっとずっと簡単な・単純なことしかできません.数を読む,数を書く,数を引く,数を足す,数を比べる.本当にこんなことしかできません(本当にそうです).コンピュータがいろんなことができるのは,いろんなことを数に置き換えているからですけれど,もう一つ重要なことは,単純な命令しか使っていないけれど,それはそれはものすごい数の命令の組み合わせでプログラムにしているからです.10個や100個ではないです.1万個や100万個くらいの命令の組み合わせで動かしています.それがものすごい速さで動いて命令の多さが見えてこないので誤解されるわけです.

コンピュータがバカというのは,単純な命令しか実行できない,ということです.コンピュータがすごいのは,むちゃくちゃ多い命令を高速に実行するからです.コンピュータがバカだというのはプログラムを書く人だけの秘密ですね.

僕が,大人向けの講座でやっているトランプの遊びをご紹介しましょう.これはコンピュータの命令を組み合わせることがどれくらい難しいことなのかということを体験するものです.

2人ペアになって,トランプを5枚配ります.わかりやすいように,5枚のマークは同じものにするとよいです.

トランプを伏せておいて,それを数の小さい順に並べるという課題を,二人で解決します.

一人は命令を出す役,もう一人はコンピュータ役です.

命令出す役の人はカードの数を見てはいけません.コンピュータ役の人にやって欲しいことを言うだけです.

コンピュータ役の人にお願いできることは次のことです.
 カードを動かしてもらう.
 2枚のカードのどちらが大きいかを聞く.


こんな感じですすみます.

a「このカードとこのカード,どっちが大きですか」
b「こっちです」
a「では小さい方のカードをこっちへ,大きい方のカードをこっちへ動かしてください」
b「はい」

a「このカードとこのカード,どっちが大きいですか」

これを繰り返します.

まずは,最短で並び替えるということは考えなくて良いです.というのは,最初にカードがどのように並んでいるかで手数が変わるからです.それよりも,間違わないように慎重にやるようにしましょう.終わったと思ったら,ひっくり返して確認します.コンピュータ役の人はどこで間違ったかを知っているので(でもゲームの途中では言えない)教えてもらいましょう.たった一回のミスが最後まで尾をひきます.コンピュータ側の人からみると「その操作はさっきもやったのに」と思うような無駄なことも,命令する人にはわからないですよね.

何度か役を交代して,間違わないように命令をだすということがどれくらい難しいのかを身を以て体験しましょう.人間とコンピュータの違いがすごくよくわかるとおもいます.

(ぜひ身近な人ととやってみてください.プログラムを知っているからと言って,簡単にできるわけでは無いようですよ)

よく,コンピュータのアルゴリズム的な考え方が重要だ,といった言い方を聞きますけど,そもそもアルゴリズムというのはどういうものでしょう.

実は,この遊びではまだアルゴリズムにまでは到達できていません.命令を出す役の人は,カードがどのように動いたかを観察して,その都度次の手を考えているからです.でも,何度か交代してやっているうちに,必勝法というのがわかってきます.こういう考え方で,こういうときにはこうすればよい,といったことですけど.必勝法が思いつくと,その方法を文章に書くことができます.その文章を読んだ人もまったく同じやりかたで一発で成功できるようになります.この必勝法のことがアルゴリズムなのです.

必勝法ができると,ゲームの間はそのやり方に従って命令を出せばよいだけなので,ほとんど頭を使いません.必勝法を知らない頃はすごく考えていたのに,考えなくても,できるようになります.道具をつかったり(カードを並べた位置に印をつけるとか),カードの並べ方,重ね方などを工夫して,より手順が少なく,頭を使わない必勝法がよい必勝法です.

一方で人間がトランプの数を小さい順に並べる作業を考えてみましょう.人間の場合は,カードが全部表を向いています.なのでパッと見たら一番小さいカード,大きいカードがすぐにわかります.あとは両手を使ってささっと並べ変えれば終わりです.カードの枚数が100枚くらいになったらさすがにそんな簡単にはできませんが,5枚くらいだと本当に簡単です.人間がどれくらい高度で複雑な命令を実行できるかよくわかるとおもいます.

トランプを相手にしてますから一番小さい数が1で,一番大きい数が13ということを知ってますけれど,本当の問題は,数の範囲もわかりませんし,どっちに偏っているかもわかりません.

本当のコンピュータも,ここでやったように2つの数の大小を比べる,数を書く,数を読む,という命令しかできません.それらを組み合わせて,膨大な数を小さい順に並び替えているのです.並び替えるというだけで命令数は1000くらいは必要でしょう.

コンピュータでいろんなことをさせてますね.最近は写真に写っている顔を交換するという面白いアプリが流行っていますが,写真は1点1点の色を数で表してその計算だけで,こういうすごいことをやらせているんですから.

「コンピュータとは何か」の一つとして,コンピュータはどこがバカで,どうしてすごいのか.なんとなくわかりました?


では,次の疑問,何万,何百万という命令を間違わないように組み合わせなきゃないわけですが,それはどうやってやるのでしょう.そういう感じで,コンピュータ入門講座は進んで行きます.

小学校でのプログラミングの授業案

2016-04-21 13:14:27 | 1
プログラミングを小学校からやるという方針がやっとでましたね.僕も以前から主張していましたが,政府の後押しが出たのは喜ばしいことです.ところが,やはりというか「そんなことは小学生のうちからやる必要はない」という意見もチラホラでています.コンピュータが嫌いな人から出ているのならまだしも,コンピュータの専門家の中からも聞こえてきます.こんなのいつひっくり返るかわからない危うい決定なんですから,せめて専門家の間では足並みを揃えたいところですが.

こうなる理由は「プログラミングを教える」ということがちゃんと定義されないで,それぞれが思ったことを言っているからですね.ということなので,僕が考えている小学生向けの授業をざっとご紹介しようと思います.

僕は,各学年で45分の授業を2回ずつで,6年間で12回(毎週2コマではなくて年間で2コマです)というのを考えています.プログラミングを教えると色々な効果があると言われていますが,それらは全部後回しで,この12回では子供達に「コンピュータとは何か」ということを少しずつ教えてゆきます.

1,2年生
 自分の書いた絵が動く.メガネを二つ以上つかってゆらゆらさせたり,2コマのアニメーションをさせたりする.

 伝えたいこと:コンピュータは自分たちのものだという感覚.作った通りに動く.間違うと間違った通りに動く.作品はネットで公開されるので,見られても恥ずかしくない作品を作ろう.


3年生
 身の回りにあるコンピュータが入っているものを探してみる
 尺取虫が動く.尺取虫がボールをける.

 伝えたいこと:ひとつひとつのメガネは単純な動きしかしない.メガネを組み合わせると複雑な動きになってゆく.身の回りのコンピュータとビスケットとは何が同じで何が違うか.同じなのは単純な命令(メガネ)しかないということ,違うのは命令(メガネ)の数が何万,何百万という途方もなく多い.多いから複雑.コンピュータには最初から複雑な動きが入っているわけではない.命令を組み合わせるから複雑になる.


4年生
 風邪が感染して広がってゆくシミュレーション.

 伝えたいこと:ものと情報の違い.ものは複製できない.情報は簡単に複製できるので,簡単に拡散する.一度広がってしまったものを消すのは難しい

5年生
 2進数のカウンタを作る

 伝えたいこと:計算するとはどういうことか.人間がする計算とコンピュータがする計算の違い.2進法は簡単な計算方法だからコンピュータに採用されている.

6年生
 矢印を並べて,それに従って動く絵.

 伝えたいこと:今までのビスケットの遊び方とはちょっと違う遊び.メガネを作るだけじゃなくて,絵をどのように並べるかで動き方が変わる.プログラムとデータの関係.データを解釈してうごくプログラムがあると,データの並びそのものがプログラムのように見えてきて,それがプログラミング言語になる.プログラミング言語の階層があって,ビスケットの上にもう一つ矢印言語を作ったということ.プログラミング言語という発明はコンピュータが発展した大きな理由である.1万個のメガネのプログラムを間違えないように作るのは大変だけど,プログラミング言語を間に入れると,メガネの数が人間が扱える範囲にまで減らせられる.
(この授業が一番伝えたいこと.コンピュータがどうしてすごいのか,ということを子供達に知ってほしい)


この他にも,ゲーム作りや絵本作りといった楽しい授業もいろいろとできるのですが,それらは図工とか国語の時間にやるべき内容ですよね.子供達のウケはすごく良いのでやりやすいとは思いますが,すべての子供たちがやるべきだとは思いません.そこで狙っている内容はプログラミングじゃなくても教えられるからです.

それに対して,コンピュータとは何かを教える授業は,プログラミングでしか教えられないので,それが必須にする理由なのです.

これらをやる理由は,小学校にある田んぼの話などこのブログにもいろいろと書いてますね.