Scratch世代の子どものための"Hello,world!"に代わる一行を考える
この記事は『LITALICO Engineers Advent Calendar 2017 - Qiita』20日目の記事です。
Qiitaアカウントは@saorinrinrinなんですが、諸般の事情によりこちらのブログで投稿いたします。
エンジニアのみなさんは、「この世界のことを理解した最初の一行のコード」を覚えているだろうか。
1ヶ月ほど前、知り合いの、とある中学生がついにUnityに目覚めた。
とは言っても、Unity自体は最初に出会ってから半年以上経っているので、正確には、C#に目覚めた。
もりもりコードを書き始めたのだ。
プログラミング言語を書き始める中高生はもう別に珍しくないのだけど個人的に興味深かったのは、その中学生が、
・小学生の頃から3〜4年間に渡ってScratchを使っており、つくりたいアプリはほぼ何でもScratchでつくれるんじゃないかというほどのScratchマスターであったこと
・これまでにも何度かScratch以外の言語をおすすめしたにもかかわらず、使いこなす前に学習をストップし、結局使い慣れたScratchばかり使っていたこと
にある。
なぜ、急にUnity(というかC#)に目覚めたのか。
Scratchのプログラミング方法
ScratchはMITメディアラボが開発したプログラミング環境で、画面上にキーボードで英字を打ち込んでいく方法じゃなくて、コードのかたまりがブロックみたいになっててそれを組み合わせることによってプログラミングしていく。
・マウス操作でできる({}の閉じ忘れとかスペルミスによるエラーがない)
・日本語でプログラムを組める
ことから、小学生から使える教育用のプログラミング言語として有名である。
「ビジュアルプログラミング言語」と言われたりもするんだけど実際はテキスト(文字)読んで理解しないとプログラムを組めないのでここでは「ブロック型言語」としておく。
ブロック型言語からテキスト言語への移行って?
Scratchは見た目以上にいろんなことができて、ひとつの技術や知識を深めていくプロセスを学ぶことができると思っているんだけど、 まぁなんか「早く大人が使っているホンモノのプログラミング言語に移行したら?」みたいなことを言う大人もいる。
個人的には、その言語がその子の手足となって自由な表現を獲得できるものであるならScratchでもViscuitでもそれ以外でも(それが可能な言語なら)いいんじゃない?と考えている。ただ、やりたいことが出てきたときにそれが今の手段(言語)だとできないのであれば、別の手段(言語)に恐れずに移行できる力はあったらいいなぁと思っている。
「わかった!」と思える運命の一行
そんなこんなでUnity(C#)に目覚めた中学生には「自分がつくった3Dゲームをスマートフォンアプリ化したい!」という「Scratchじゃ成し遂げられないこと」への学習動機は十分にあった前提で、聞いてみた。
「ねぇ、これまでもScratch以外のいろんな言語やったじゃん、
どのコードの一行が「わかった!」と思える
決定的な一行だったの?」
この一行が返ってきた。
transform.position += new Vector3 (0f,0f,-0.1f);
え? いきなりこれ?!
"Hello,World!"じゃなくて??(…というのは冗談ですが。)
中学生曰く
「この一行が読めるようになったことで、オブジェクトの変化のさせ方も座標もわかったから何でもできる気がした。あとは変数の書き方わかったときも大事だったけどね」
とのこと。
実際はこの一行はUnityのNew Scriptにデフォルトで書かれている
Update関数の中に書かれてあったものなので少なくとも
void Update () {
transform.position += new Vector3 (0f,0f,-0.1f);
}
ここまでは理解してたと思われる。
(Start関数とUpdate関数のそれぞれの役割もわかっていたかもしれない。)
この一行で何がわかったの?
おそらく上記のコードをその子が理解するときにScratchにおける↓こういう感じのスクリプトが頭に浮かんでいるはずなのである。
特に上のひとつはScratchを使う上でも
ほとんどの人が最初に通るであろう第一歩目的なスクリプトである。
このスクリプトが頭に浮かぶということは、C#の一行が「オブジェクトをz方向に-0.1動かす」を意味しているということ以外にも下記のようなことを一度に理解しているはずなのだ。
・Unityでも、3Dオブジェクトに対してScriptをつけることで、Scratchのスプライトに対してスクリプトを組んでできることと同じようなことはだいたいできる
・Update関数の中に入れるのははScratchでいうと「ずっと」の中に入れるようなもの。
・位置座標や向きなど3Dオブジェクトの属性を取得して何らかの操作をすることができる
・3D世界ではx,yと同じようにzの値を操作することができる
・+=は「〜ずつ変える」!
もちろん厳密にいうと間違ってる部分はあるし、Vectorの意味なんかたぶんわかってない。
でも、今無理矢理正しい概念的知識を身につけさせようとしたも、たぶんすぐに忘れる。その内、自分の中で辻褄が合わなくなって「あれ?」と思ってもっと知りたくなるときがくるので、本当の意味で理解するのはどっちにしろそのときになるのだ。
なんでこの一行で目覚めたのか?
1.新しく出会ったプログラミング言語も、今までやってきたScratchと同じ仕組みだと理解できる環境だったから。
変数の型、変数の宣言、演算子、代入、if文...大人がプログラミング言語を学ぶときに最初に出会うものだが、Scratch世代の子どもたちはそれらを学んでも部分的には理解できるがそれは全体感をつかむことにはならない。全体感をつかむ前に時間がかかりすぎて諦めてしまうこともある。UnityのオブジェクトにNewScriptをAddする感覚はScratchのスプライトにスクリプトをつくっていく感覚に近かったのだろう。
2.子どもの目的(ゲームつくりたい)の最初の一歩(キャラクターを動かす)に直結する一行だったから。
ゲームをつくりたい子どもはまずキャラクターを自由に動かしたい。Scratch世代の子どもたちは位置座標と同じように角度、画像、大きさなどもオブジェクト(キャラクター)の属性だということがわかっている。そのため「キャラクターの座標が変化する」ことさえできれば、他の変化もできたも同然だと思えるのではないか。
アプリやWebサービスをつくりたい子どもなら別の一行になっていただろう。
3.これだけ書けばオブジェクトに変化ができる短い一文だったから。
ゲームをつくるのに特化したライブラリやフレームワークはいろんな言語にあるが、キャラクタースプライトを画面に出すだけで3〜5行ぐらいはコードを記述する必要があるものが多い。Scratch世代のこどもたちはマウス操作でオブジェクトを配置することに慣れている。マウス操作でできていたことが3〜5行のコードが必要になるとするとゲームをつくるまでの道のりがひどく遠く感じてしまうのも仕方ない。 きちんとプログラミングを学ぶのであれば避けて通れない道ではあるが、最初の一行ぐらい、「これならできる」と希望を持ちたい。
まとめ
この記事で言いたかったのは「Scratchからの移行はUnity(C#)がいい!」ということではない。
ゲームをつくりたい子どもは「キャラクターを自由に動かす」 ところから始めたいけれど、アプリがつくりたい子どもは「ボタンがクリックされたら変化が起こる」から始めたいかもしれないし、Webサービスを作りたい子どもは「IDとパスワードでログインする」ところから始めたいかもしれない。
つくりたいもの、その目的に合わせた言語を使えばいいと思っている。
Scratchから始めてC#以外の他の言語を使って何かをつくれるようになった子どもも知っている。
ただ、Scratchを使いこなしている子どもたちの頭の中にプログラミング言語についてどのような知識の枠組みがあって、どのような方略で新しい知識を取り込んでいくのかという観点を考えることは、Scratch世代の今後の学習をサポートする上で役に立つのではないだろうか。
ちなみにインターネット世代の私にとっての小学生時代の最初の一行は
<a href="xxx.html">リンク先</a>
だったように思う。この一文で、Webの世界は無数のページがリンクでつながっているということと、「リンク先」という文字にURLのようなメタ情報をつけることができるということを知った。
みなさんにとっても「最初の一行」があるだろうし、それぞれの時代背景の中で変わっていくものかもしれない。これからの子どもたちの「最初の一行」はどういうものになるだろうか。
この記事は『LITALICO Engineers Advent Calendar 2017 - Qiita』20日目の記事でした。
明日は@wapa5pow さんの「開発環境でHTTPとかの通信をキャプチャしていい感じでデバッグする方法」です。お楽しみに!