僕が伝えたいメッセージは
コンピュータは君たちのものだよ
こんなに可能性があるんだよ
ということ,逆にこれだけは伝えたくないというメッセージは,
コンピュータはこんなに便利ですよ
でした.
可能性の話をします.音楽で考えてみましょう.音がポーンと一つなったとき,「これが音楽の基本なんだ,ふーん」と思うでしょう.音が二つポンポンとなると,少し印象が変わってきます.悲しく聞こえたり,楽しく聞こえたり.音が三つ四つと増えると,もうメロディと言えそうなものが聞こえてもっと色々な感情が表現できます.音楽ってすごい可能性があるなあと思えるでしょう.逆は,最初からサザンの曲を聴かせても違う意味で音楽の素晴らしさは伝わるかもしれませんが,自分で作ろうとか音楽そのものの可能性とかは伝わらないと思います.
Scratchの画面を見ると,タブで整理されているとはいえ,何か色んなアイコンが大量に並んでいます.まあ,プログラム言語を知っている人なら,こららをさーっと見るだけで大体どれくらいのことが出来そうかわかりますけど.最初からこんなに数があれば,何のすごさを見せたいのか焦点がぼけてしまいませんか.組み合わせることですごいということを伝えるのに不向きだと思いました.
「もし端についたら、跳ね返る」なんて導入するのは,すごく気持ちがわかりますよ.これを入れると便利ですし,特に入門のときにこういうのがあるとすごく教えやすいです.でも,そういう入門用の機能はさりげなくやるべきであって,こんな機能として見せちゃったらダメでしょう.これって,僕がこれだけは伝えたくないメッセージである「コンピュータはこんなに便利ですよ」そのものなんですよね.
ブロックが導入されたのは良かったと思います.だったら,「端についたら跳ね返る」という一つ上のレイヤの機能はそのブロックで作るべきでしょうね.端の判定と180度回転でいいのかな.
Scratchで嫌なのは,オブジェクト指向が中途半端に入っているということでしょうか.スプライトがあって,このスクリプトは選択しているスプライトの中に書かれているものだというモデルですね.ものを制御する,という見せ方がもの凄く全面に出ていると思います.Logoの亀もそうでしたし,ロボットのプログラミングをしてライントレースというのもやられてますけど,全部ひっくるめて,僕は嫌いです.
嫌いである最大の理由は,それがコンピュータらしくないからです.
らしくないのに,それを押し出すものだから,素人さんは「それがコンピュータだ」と思っちゃうじゃないですか.だから嫌なのです.何かを制御するというのは,コンピュータのごく一部です.
僕が考える,コンピュータのすごさは,自分でプログラム言語を作れる,ということです.Viscuitが動くためには,5段階くらいのプログラム言語の階層があります.二つの言語をまたいでいるところにコンパイラがあったり,FlashPlayerがあったり.こういう言語の階層のことをぼんやりでも頭に浮かんで欲しいのですよね.複雑なものには大抵こういう階層構造があります.ビスケットでもプログラミング言語もどきのプログラムを作ることができるんです.突き詰めて言えば,データの並びで何か意味を表現する,ってことですから.
オブジェクト指向も子供にはどうかなと思います.
オブジェクト指向って,プログラミングの中でかなり大人しいというか,優等生というか,まあ,複雑なシステムをどうやって秩序を保つかということですよね.なんでわざわざあるかというと,そうしなければぐちゃぐちゃになるからです.
オブジェクト指向が無い状態で,ぐちゃぐちゃのことを体験しなければ,オブジェクト指向のありがたさはわかりません.子供が何かを学ぶには整理され過ぎているんですよ.しかもそれが必要になるほど複雑なことをさせるわけでもなく.
コスチュームというのも,あれは何なんでしょうね.オブジェクトの一状態ということでしょうけど.スプライトがまずあって,その下に何枚かコスチュームがある.これは難しいと思いますよ.もちろん丁寧に順序立てて教えれば,小さい子でもマスターすると思います.でも,そんなことやってもコンピュータの可能性とか自分のもの感とか生まれるんでしょうか.それなりには獲得するでしょうけど,なんかすごく矮小化されたものになるように思うのですね.
変数とか制御構造とか,非常に古いプログラミング言語の構成要素ですけれど,そういったものが表に出ているのも嫌いです.そういうことを自由自在に使いこなせる人になって欲しいためにやっているんでしょうかね.
ビスケットだとそれなりに苦労しますけど,変数とか繰り返しのようなものはビスケットの構成要素の中で工夫できたりします.先日やったゲームを作るワークショップでも,小学校高学年の子が,弾が二発当たらないとやっつけられないお化けというのを自分で考えて(何もこちらで教えずに)作りました.どうやって作ったかわかりますか?お化けの絵を2種類用意しただけです.一発目が当たるとお化けは口を大きく開けます.口を開けたお化けは弾に当たるとやられます.絵を二枚重ねて,状態を表現している子もいます.これはかなり高度です.
こんな感じで,オブジェクト指向だったら得意なはずの,状態遷移を持つプログラムは,ほんとに普通に作られています.
機能が沢山あると,教えるのも大変だと思います.「もし..なら..」って,プログラムをやった人ならわかるでしょうけど,普通の人はこれだけ見てなんだかわからないでしょう.これを教えるのって大変だと思いますよ.大変なのが数が多い.使わないときは隠せるならいいんですが見せちゃうと,子供にこれは何,これは何って全部聞かれてしまうんじゃないでしょうか.
Viscuitのデザインで重視したことで,子供同士での教え合いを促す,というのがあります.言うのは簡単ですが,なかなか難しいです.子供が自分たちの言葉で理解できていないと教えられません.Scratchは中で起こっていることが複雑すぎて無理だと思います.ちなみに,ある小学校では小2の子が新一年生にViscuitの使い方を教える,という光景が普通に見られます.もちろん彼らが理解できる範囲の機能しか見せていないすごくシンプルな画面にしてますが.
新しいScratchになって,クローンというものが導入されたんですね.これはひどい仕様です.Scratchには継承が無いという中途半端さなので,複製されたものにはスクリプトはありません.猫が複製されても,親猫と同じ動きをしません.で,それを解決するために,「クローンされたとき」というのがあって,これは日本語訳が苦しいですね.英語だと「when I start as a clone」で,やった意味が分かったのですが重要なのはwhenじゃなくてIですね.
オブジェクト指向だから,メッセージを受ける人をどうやって指示するか,というのが構文上必要なわけです.ですが,Scratchにはそれが無くて,GUI的に現在選択しているスプライトに対して,という解釈をしているのですが.複製すると,親と子で分かれるので,子に対してどういう動作をさせるか別に指示しなければならない.それで,苦し紛れに「クローンされたとき(when I start as a clone)」が入ったわけですね.旗が押されたらというのが親にだけ動きます.スプライトにローカルな変数は作れるみたいですが,それは複製されないんですね.こういう仕様で複製をきちんと設計するのは難しいとは思いますが.僕だったら,複製したらそれらにもちゃんと名前がついて,スプライト一覧にも表示されるようにするかなぁ.で,子のスクリプトは親のコピーが薄く表示されてて編集はできないようになっているとか.
オブジェクトの複製は,Scratchはまだましな方で,プログラミンや前田ブロックはもっとひどい仕様です.これらは簡易言語ですね.プログラミング言語の土俵にはまだ載せられないです.
少しは言語のことになってきたかな.僕の誤解があればコメントで教えてください.
コンピュータは君たちのものだよ
こんなに可能性があるんだよ
ということ,逆にこれだけは伝えたくないというメッセージは,
コンピュータはこんなに便利ですよ
でした.
可能性の話をします.音楽で考えてみましょう.音がポーンと一つなったとき,「これが音楽の基本なんだ,ふーん」と思うでしょう.音が二つポンポンとなると,少し印象が変わってきます.悲しく聞こえたり,楽しく聞こえたり.音が三つ四つと増えると,もうメロディと言えそうなものが聞こえてもっと色々な感情が表現できます.音楽ってすごい可能性があるなあと思えるでしょう.逆は,最初からサザンの曲を聴かせても違う意味で音楽の素晴らしさは伝わるかもしれませんが,自分で作ろうとか音楽そのものの可能性とかは伝わらないと思います.
Scratchの画面を見ると,タブで整理されているとはいえ,何か色んなアイコンが大量に並んでいます.まあ,プログラム言語を知っている人なら,こららをさーっと見るだけで大体どれくらいのことが出来そうかわかりますけど.最初からこんなに数があれば,何のすごさを見せたいのか焦点がぼけてしまいませんか.組み合わせることですごいということを伝えるのに不向きだと思いました.
「もし端についたら、跳ね返る」なんて導入するのは,すごく気持ちがわかりますよ.これを入れると便利ですし,特に入門のときにこういうのがあるとすごく教えやすいです.でも,そういう入門用の機能はさりげなくやるべきであって,こんな機能として見せちゃったらダメでしょう.これって,僕がこれだけは伝えたくないメッセージである「コンピュータはこんなに便利ですよ」そのものなんですよね.
ブロックが導入されたのは良かったと思います.だったら,「端についたら跳ね返る」という一つ上のレイヤの機能はそのブロックで作るべきでしょうね.端の判定と180度回転でいいのかな.
Scratchで嫌なのは,オブジェクト指向が中途半端に入っているということでしょうか.スプライトがあって,このスクリプトは選択しているスプライトの中に書かれているものだというモデルですね.ものを制御する,という見せ方がもの凄く全面に出ていると思います.Logoの亀もそうでしたし,ロボットのプログラミングをしてライントレースというのもやられてますけど,全部ひっくるめて,僕は嫌いです.
嫌いである最大の理由は,それがコンピュータらしくないからです.
らしくないのに,それを押し出すものだから,素人さんは「それがコンピュータだ」と思っちゃうじゃないですか.だから嫌なのです.何かを制御するというのは,コンピュータのごく一部です.
僕が考える,コンピュータのすごさは,自分でプログラム言語を作れる,ということです.Viscuitが動くためには,5段階くらいのプログラム言語の階層があります.二つの言語をまたいでいるところにコンパイラがあったり,FlashPlayerがあったり.こういう言語の階層のことをぼんやりでも頭に浮かんで欲しいのですよね.複雑なものには大抵こういう階層構造があります.ビスケットでもプログラミング言語もどきのプログラムを作ることができるんです.突き詰めて言えば,データの並びで何か意味を表現する,ってことですから.
オブジェクト指向も子供にはどうかなと思います.
オブジェクト指向って,プログラミングの中でかなり大人しいというか,優等生というか,まあ,複雑なシステムをどうやって秩序を保つかということですよね.なんでわざわざあるかというと,そうしなければぐちゃぐちゃになるからです.
オブジェクト指向が無い状態で,ぐちゃぐちゃのことを体験しなければ,オブジェクト指向のありがたさはわかりません.子供が何かを学ぶには整理され過ぎているんですよ.しかもそれが必要になるほど複雑なことをさせるわけでもなく.
コスチュームというのも,あれは何なんでしょうね.オブジェクトの一状態ということでしょうけど.スプライトがまずあって,その下に何枚かコスチュームがある.これは難しいと思いますよ.もちろん丁寧に順序立てて教えれば,小さい子でもマスターすると思います.でも,そんなことやってもコンピュータの可能性とか自分のもの感とか生まれるんでしょうか.それなりには獲得するでしょうけど,なんかすごく矮小化されたものになるように思うのですね.
変数とか制御構造とか,非常に古いプログラミング言語の構成要素ですけれど,そういったものが表に出ているのも嫌いです.そういうことを自由自在に使いこなせる人になって欲しいためにやっているんでしょうかね.
ビスケットだとそれなりに苦労しますけど,変数とか繰り返しのようなものはビスケットの構成要素の中で工夫できたりします.先日やったゲームを作るワークショップでも,小学校高学年の子が,弾が二発当たらないとやっつけられないお化けというのを自分で考えて(何もこちらで教えずに)作りました.どうやって作ったかわかりますか?お化けの絵を2種類用意しただけです.一発目が当たるとお化けは口を大きく開けます.口を開けたお化けは弾に当たるとやられます.絵を二枚重ねて,状態を表現している子もいます.これはかなり高度です.
こんな感じで,オブジェクト指向だったら得意なはずの,状態遷移を持つプログラムは,ほんとに普通に作られています.
機能が沢山あると,教えるのも大変だと思います.「もし..なら..」って,プログラムをやった人ならわかるでしょうけど,普通の人はこれだけ見てなんだかわからないでしょう.これを教えるのって大変だと思いますよ.大変なのが数が多い.使わないときは隠せるならいいんですが見せちゃうと,子供にこれは何,これは何って全部聞かれてしまうんじゃないでしょうか.
Viscuitのデザインで重視したことで,子供同士での教え合いを促す,というのがあります.言うのは簡単ですが,なかなか難しいです.子供が自分たちの言葉で理解できていないと教えられません.Scratchは中で起こっていることが複雑すぎて無理だと思います.ちなみに,ある小学校では小2の子が新一年生にViscuitの使い方を教える,という光景が普通に見られます.もちろん彼らが理解できる範囲の機能しか見せていないすごくシンプルな画面にしてますが.
新しいScratchになって,クローンというものが導入されたんですね.これはひどい仕様です.Scratchには継承が無いという中途半端さなので,複製されたものにはスクリプトはありません.猫が複製されても,親猫と同じ動きをしません.で,それを解決するために,「クローンされたとき」というのがあって,これは日本語訳が苦しいですね.英語だと「when I start as a clone」で,やった意味が分かったのですが重要なのはwhenじゃなくてIですね.
オブジェクト指向だから,メッセージを受ける人をどうやって指示するか,というのが構文上必要なわけです.ですが,Scratchにはそれが無くて,GUI的に現在選択しているスプライトに対して,という解釈をしているのですが.複製すると,親と子で分かれるので,子に対してどういう動作をさせるか別に指示しなければならない.それで,苦し紛れに「クローンされたとき(when I start as a clone)」が入ったわけですね.旗が押されたらというのが親にだけ動きます.スプライトにローカルな変数は作れるみたいですが,それは複製されないんですね.こういう仕様で複製をきちんと設計するのは難しいとは思いますが.僕だったら,複製したらそれらにもちゃんと名前がついて,スプライト一覧にも表示されるようにするかなぁ.で,子のスクリプトは親のコピーが薄く表示されてて編集はできないようになっているとか.
オブジェクトの複製は,Scratchはまだましな方で,プログラミンや前田ブロックはもっとひどい仕様です.これらは簡易言語ですね.プログラミング言語の土俵にはまだ載せられないです.
少しは言語のことになってきたかな.僕の誤解があればコメントで教えてください.
面白いなと思って読んでいたら突然前田ブロックについて言及されていたのでコメントさせていただきます。
「前田ブロックのクローンはもっと酷い」とのことですが、どのように酷いと思われるのか、もう少し詳しく教えて下さい。
前田ブロックにおける複製は、オブジェクトのひな形(クラス)を定義するということで行われていて、仕様書を書くようにブロックを並べると、その通りに動くようにすることが目的です。
前田ブロックは仕様書に現れることの少ない配列やループの概念を教えずにプログラミングの最初のステップを超えることを目的として設計しています。
前田ブロックはJavaScriptの入門として使うことを意識しており、編集中にいつでもJavaScriptへのコンパイル結果を確認することができます。最終的にはブロックをコードに置き換え、ユーザがJavaScriptを使いこなす手引きとなるように設計しています。
まだ開発途上ですが、最終的には実用的なプログラムを前田ブロックだけで記述することを目的にしています。
コンピュータの本質論を伝えたいViscutやScratchとは根本的に目的が異なります。
これは設計目的が違うというだけなのでひとくくりに「酷い」と主張されるのはいかがなものでしょうか。
たとえばViscutやScratchで作成されたプログラムをAppStoreで販売する、ということはかなり非現実的です。しかし前田ブロックの目標はまさしくそこにあります。
Viscutは面白いと思って注目していたのですが、こういう斬り方をされるのは残念です
前田ブロックについてはもう少しちゃんと調べて書こうと思っていたので,そのときまたお願いします.
前田ブロックのどのバージョンを参照するのがよいでしょうか?Webで検索して色々と出てくるので.
おっしゃるように前田ブロックはソースコードが吐き出されるところはすごく面白いと思っていました.僕もViscuitのコンパイラを作ってはいるんですが,まだ外に出せるようなものではありません.
もう一つ,ViscuitをやったあとJavascriptのような言語にどのようにつなげるのか,というのは一つの課題でして,そのあたりとか.
でも,「酷い」いいすぎですね.すみませんでした.プログラミンは「酷い」ですが.
前田ブロックは現在派生バージョンがいくつかあります。
コロコロゲーム工作ブロック
http://www.corocoro.tv/corocoro_block/
MOONBlock
http://moonblock.jp
現在、MOONBlockは解説書を準備中です。
確かに前田ブロック(現MOONBlock)には、継承や配列など、本来プログラミング言語ならば当然もってるいべき機能ブロックが入っていません。
これは、現在のところMOONBlockは高速にプロトタイピングするためのものとして割り切っているからです。
MOONBlockの目指す世界はあくまでも実用的なアプリケーションを開発可能なビジュアル言語で、今は準備していませんが、たとえばウィンドウコンポーネントを表示してボタンが押されたら何か反応するだとか、クイズゲームや簡単なGUIアプリケーションが作れるとか、そういうことを目指しています。
そういう点で、Viscutはもちろん、Scratchやプログラミンとは根本的に異なることを目標としています。
現状のMOONBlockに足りない仕様があることは重々承知しています(まだうまれて一年ちょっとしか立っていないので)が、そもそもブロックで全て解決しようという発想で作られていないので、現状はこうなっているのです。
配列に関しても、様々な現場で子供から大人まで多くの人にプログラミングを教えてみた経験から、配列やループといった処理を子供はともかく大人が感覚的に理解するのが難しいことから、「出現」ブロックに「たくさん出てくる」という項目を追加し、ランダムな位置にたくさん登場する状態をループ、配列なしで作ることが出来るようにしています。これは極めて意図的な仕様で、MOONBlockではif文やループ、配列など、プログラミング初心者が最初につまずくポイントを意図的に遅らせています(ループもifも存在しますが、全く使わなくてもゲームが作れるようになっています)。
配列がない、というのもオブジェクトのコレクションクラスで解決しています。
ただし、仰るように、分散されたインスタンスに個別に名前をつけたりすることができないので、MOONBlockにおける当たり判定はコレクションへのイベントとして実装されています。
これも、本来、単純なゲームを開発するために最低限必要なものは何か、ユーザがイメージした結果にできるだけ再短時間でたどり着ける方法は何か考えた結果、ループを組むのは時間の無駄であるという考え方からこうなっています。
グローバル変数ブロックを使えば、「たくさんでてくる」を使いながらも、ループで作ったときと同じように整列させたりすることもできます(が、これはできるというだけで推奨されていません。出現位置を細かく指定したい場合は初期位置ブロックで個別に指定できます)。
ループも存在するので、古典的な方法でパペット(MOONBlockではSpriteクラスをそう呼びます)を生成し、なおかつ生成したパペットに対して初期設定を行うことができます。この初期設定のやり方は、ループを記述する部分(パペット生成命令を発行する部分)で行うので、Scratchほど苦しい内容ではありません。
僕もScratchとプログラミンには疑問を感じるところもありますが、一緒くたに「酷い」とだけ言われてしまったのでどこがひどいのか教えていただきたいと思って書いたまでです。
私自身はViscut自体には以前から注目しており、簡単な二進加算機を作って遊ばせていただいたりしたこともあります。継承の仕組みも記述の仕組みも興味深いと思っています。
私はビジュアル言語が事実上ScratchとeToysしか存在していない状況に非常に危機感を覚えています。
私自身はプログラミング言語の未来は(プロが使うものとして)ビジュアル言語にあり、もっとビジュアル言語の研究が活発になるべきだと思っています。
そういうわけで、個別のご指摘に頷きつつも、「酷い」という書かれ方しかされていなかったので、伺ったまでです。
MOONBlockは発展途上の言語なので、ご指摘いだたければできるだけ柔軟に対応させていただけると思います。
僕ものんびりと研究をしてますが,若い人たちが僕のやっていることをまったく脅かしてくれないので安心しきってます.その2進加算器の例も2003年のビスケットで既に出来ていたのですから.というか,StageCast はご存知ですか?これは元々はKidSimというので,1995年ごろのものですが,これでも多分できます.
http://www.stagecast.com/
前田ブロックがどう酷いかというのは記事の前半部分にちゃんとかいてありますね。
子供がやりたいだろうと勝手に思っている操作を、大人がおしつけていて、他の選択肢を奪っているところにあるとおもいます。
つまり、他に命令したいことがあったとしても、自分で試すなんてことはとてもできません。(これは実際にプログラムでは出来ることなんですよ?)
何が出来るかを探しただけになりますね。
開発者が、これなら子供にもプログラムが組めるだろうというおごりです。
viscuitには、そのおごりはありません。
むしろ、プログラムは子供のほうが得意になるかも知れませんね。
ほとんどのビジュアルプログラミングは、子供を見下して作られています。前田ブロックが、他のヴィジュアルプログラミングとどうちがうのでしょうか?
scratchがダメなら、当然前田ブロックもダメでしょうw
思想もなにもないパクリですよね。
前田ブロックの思想はこうよみとれます
「えらいえらい、君にも出来たでしょ?」
(そういう風につくってあげたんだよ)
原田さんはviscuitで、原田さん自信が想像もしなかったようなプログラムを作っている子供に驚かされるのがうれしいそうですよ。
だから僕もサイクロイド曲線で動かしたがっているなんて(もちろん冗談のつもりだったんですけど)、間違っていましたね。
そっかー。そうですね。
ヴィジュアルプログラミングはもっともっと広がっていく分野だと思いますが。原田さんの思想を受け継いでいって欲しいです。
それから、もっともっとよい思想に洗練されていって欲しいですね。
前田ブロックの開発チームのように、ほとんどのプログラマーは、パクってシェアを獲得できないかなという思想しかないのが悲しいです。
コードもコピーとペーストだけで作ったんですよね……。
前田ブロックで、子供達が遊べる方法と同じように。
思想ってすごいですね……。
原田さんのような思想をもった技術者がこの先に現れてほしい。
それには、他のヴィジュアルプログラミングではなく、viscuitで遊ぶような子供でなくてはなりません。
前田ブロックで遊んだ子供たちは、プログラマーになっても、前田ブロックのようなものを、コピーとペーストだけで作るようになってしまいます……
ああ、それは本当に悲しいこと。
viscuit → 自由
これの違いが分からない大人がいるってのがほんとに悲しい……。
しかも、子供に向けて作られているってのが。
そういう大人に育って欲しいって意味なんですね。
まぁでもそうでしょう。前田ブロックを作った自分達みたいになってほしいんですもんね。
はぁ……なんかがっかりさせられちゃったけど。
原田さんは希望だと思う。viscuitを知ることが出来てよかった……。
嫌いじゃなくて、使い方しだいでは?
スクラッチのここが使いにくいならわかるのですが、嫌いでは困りますね。
Scratchは低い床、高い天井、広い壁の言語です。
チューリング完全ですらないViscuitとは違います。
それでいいのでは?
別にスクラッチでなにかの開発を続けていくわけではないでしょう。
もし私が最初に触ったのが1pythonだったりしたら今頃プログラミングをやめているでしょう。