はじめまして、こんにちは。
今回が初投稿になりますので、お手柔らかにお願いします。
コロナの臨時休校もあり時間を持て余していた10歳(小学4年生)の息子が、『SCRATCH』と言うプログラム学習サイトにハマり、1ヵ月ほどで10数本のゲームを作成して公開するまでになったので、『SCRATCH』の簡単な紹介と、プログラムを学んでいく過程を見てきて感じた驚きや気付きを綴っていきます。
僕の息子は、勉強嫌いで運動も嫌いです。
とにかくゲーム好きで、TVゲームやスマホゲーム、人生ゲームなどボードゲーム、さらにアミューズメントパークのメダルゲームとなども好きです。
そんな息子がプログラムを始めるようになったのは、たまたま個人開発で子供教育に役立つサービスでも作ろうかなと息子に相談していたところ、「自分もプログラムしてみたい!」と話してきたので、とりあえず『SCRATCH』に触れさせてみたことが始まりになります。
臨時休校で時間を持て余していることもあり、今では自作のゲーム開発にどっぷりとハマっています。
簡単に言うと『コンピュータに何らかの処理をさせる命令を記述したモノ』です。
コンピュータ向けの指示書です。
指示書の送り先は人間ではなくコンピュータですので、人間では指示通りに実行しなかったり、逆に人間とは異なり空気を読んでよしなに実行しますが、コンピュータは良くも悪くも指示通り正確に実行します。
身近なところではスマホアプリやゲーム、電化製品などもプログラムで動いています。
2020年から小学校でプログラミングは必修科目になります。
以下は文部科学省のサイトで記載されている内容の抜粋になりますが、プログラミング教育には社会で必要となる資質・能力を育んでいける側面があるとされています。
読解力、論理的思考力、創造性、問題解決能力などは、時代を超えて常にその重要性が指摘されてきており、これからの時代においてもその重要性が変わることはない。これらに加えて、情報や情報技術を問題の発見・解決に活用していく力(情報活用能力)の重要性も高まっている。
学校内外での実施が進められているプログラミング教育には、論理的思考力や創造性、問題解決能力といった資質・能力を育むという側面と、コンピューターを動かすために必要なコーディング(プログラミング言語を用いた記述方法)を学ぶという両側面がある。
参考文献)
文部科学省『小学校段階におけるプログラミング教育の在り方について』
僕の息子が通う小学校ではパソコンクラブにあり、息子は入りたいと話しています。
簡単に『SCRATCH』について紹介します。
『SCRATCH』は、「ビジュアルプログラミング」と言われる視覚的にプログラムが学べるプログラム学習サイトです。
視覚的に学べるというのも、C#やPython、JavaScriptなどのようにコードを記述するのではなく、背景とスプライト(操作するオブジェクト)に画像と音を設定したり、コードブロックをパズルのように組み合わせてプログラミングしていきます。
背景とスプライトを処理するコードブロックは、7つの命令と変数、複数の命令をまとめてられるメソッドが定義されています。
命令
- 動き
- 見た目
- 音
- イベント
- 制御
- 調べる
- 演算
変数
- 変数
- 変数
- リスト
メソッド、関数
- ブロック定義
キャッチャー(スプライト)を動かす簡単なコードを紹介します。
1. 🏁が押されたら(イベント)
2. 位置を縦-200、横-100に移動(動き)
3. スプライトを表示する(見た目)
4. 「とうっ!」と2秒後に言う(見た目)
5. コスチューム(画像)をpitcher-b にする(見た目)
6. 2秒待つ(制御)
7. スプライトを消す(見た目)
このようにパズルのように処理を組み合わせてプログラミングしていくことができます。
そもそも「プログラムで何がしたいのか?」と言う話です。
「えっ?」と思うかも知れませんが、プログラムは何かを実現する手段でしかないので、「プログラムで何がしたいのか?」を見つけることは大事なことです。
ここ数年で未経験からエンジニアを目指す人が多くなり、僕の周りでもプログラミング学習を始めた友人・知人が数人います。
彼らは参考書などの教材でプログラミングの基礎から学んでいくのですが、ある時期になると「結局、何をしたら良いのか分からない!」と言う疑問が生まれるらしく相談されることがあります。
「プログラムで何ができるのか?」「プログラムをどう活かせば良いのか?」が分からないままプログラミングを学んでいる状態だったようです。
僕はプログラミングを始めたきっかけが仕事でしたので、「設計書通りに実装する!」とか「顧客の要望通りに実装する!」など何をすべきかを決められていたので、そのような疑問を持つことはなかったのですが、仕事ではないところでプログラミングの学習を始めた人は、そのような疑問を持つことがあるようです。
小学生の時に四則演算を習っても、四則演算を使って何かをやろうと発想する子は少なかったと思いますが、それと同じように思えます。
そんな相談に僕は「プログラムで何がしたいのか?(何をつくってみたいか?)」を小さいことで良いから設定した方が良いと答えています。
『SCRATCH』が良いのは、他の人の作品が公開されているので、「プログラムで何をつくってみたいか?」を見つけやすいことです。
他の人の作品を見たり、プレイすることで「プログラムで何ができるのか?」を理解でき「こんなゲームをつくってみたい!」と想像することができます。
教育の観点から言うと、他の人の作品から『創造性』を育む上で必要な『想像性』を育むことができます。
『SCRATCH』では、他の人の作品でも中身のコードを見ることができます。
さらにリミックスと言う機能で、他の人の作品を流用して改造版を作ることもできます。
他人の作品をリミックスして、少し変えただけでも「自分がつくった!」と感じることができます。それが所謂『成功体験』になります。
成長を加速させる上で『成功体験』の重要性はご存知の通りです。
プログラミングにハマる瞬間は人それぞれだと思いますが、
息子にとって、この「自分がつくった!」と感じることが、プログラムにハマる大きなきっかけになりました。
「自分がつくった!」と言う『成功体験』をすることで、「次はどんなゲームをつくろうか?」と考えるようになり、継続して自分の作品をつくっていくことで、さらに『創造性』を育んでいけます。
さらに他の人の作品とコードが見れることで、「これはどうなってるのだろう?」「こうしたいけど、どうやれば良いのだろう?」を参考になる作品を探して読み取っていくようになります。
他の人の作品を参考にすることは、『解読力』や『問題解決能力』にも繋がると思います。
プログラミング学習サイトですので、当然ですがプログラミングの基礎は学べます。
Main関数
Main関数とは、プログラムを実行して最初に呼ばれる処理です。
所謂プログラムのエントリーポイントです。
『SCRATCH』では🏁を押すとプログラムが実行されます。
命令ブロックに:flag_black:が押されたイベントが用意されており、この【イベント】を使うことでプログラムにスタート位置が存在することが理解できるようになります。
変数
変数とは、値を保持(出し入れ)できる入れ物です。
『SCRATCH』ではプライベートやパブリックのような変数にアクセスできる範囲の区別はありませんが、プロジェクトで使用する変数を定義できます。
上記の「戦車バトルシューティング」と言うゲームでは、左下の【HP】と右上の【敵】で変数を使用しています。
変数を使えるようになることで、プログラムにおける値を保持の考え方を学ぶことができます。
制御文
プログラムの主に使用される制御文は、ほぼ命令ブロックで用意されているので【制御】の命令ブロックを使うことで、If文などの制御文の役割が学べています。
If文(もし〇〇だったら処理する)
For文、While文(〇〇の条件が成り立つ場合はを繰り返す)
無限ループ(ずっと繰り返す)
Sleep処理(〇〇まで待つ)
イベント
イベントとは、何らかの操作をされたり、何らかの事象が発生した時にONになるスイッチのようなモノです。
『SCRATCH』では、onClickイベントなども定義されています。
またイベントを発生(着火)させたり、発生させたイベントを受けとることができます。
関数
関数とは、複数の処理を1つにまてめたモノです。
『SCRATCH』では、【ブロック定義】でブロック名や引数を設定して、複数の処理を1つにまてめることができます。
ただ今時点では息子はまだ使いこなせてはいないようです。
アニメーション
スプライトを動かしたり、画像を切り替えたりできます。
『SCRATCH』では、前述の【動き】や【見た目】の命令ブロックで処理します。
息子は、この背景やスプライトを動かすことからプログラミングしていました。
「絵が動く!」「背景が変わる!」のは視覚的に分かりやすいので、プログラミングしている実感は得やすいですね。
「ビジュアルプログラミング」は、普通にプログラムに比べてアニメーションを実装する難易度が低いように感じます。
非同期処理
非同期処理とは、複数の命令を並列して実行する処理を言います。
『SCRATCH』では、背景やスプライトのコードに同じ【イベント】の命令ブロックを複数配置することができます。
例えば、背景とスプライトに以下の【イベント】を配置することで、背景では音を流して、スプライトで別の処理を並列して処理させることができます。
ただ息子本人は、シリアル(直列)かパラレル(並列)かどうかは意識してはいないですね…
再利用と部品化
『SCRATCH』では、前述したように公開されている作品のコードを見れたりリミックスすることができますが、それだけではなく作品にスプライトや背景を書き出して自分の作品に取り込むことができます。画像や音声も吐き出すことが可能です。
さらにバックパックと言う機能で書き出さずに保存することも可能で、バックパック機能では背景やスプライト以外にもコードを部分的に保存することもできます。
バックパック機能を使うことで、プロジェクトを越えた範囲でスプライトやコードを部品化して再利用することができます。
息子は同じようなゲームを何個かつくっていますが、同じような動きをするスプライトを使い回していたりいます。
ただ、まだ関数やコードを部品化して使い回すまでには至っていませんね。
『SCRATCH』を初めて1ヵ月ほどで30本ほどゲームを作成して、既に10数本のゲームを公開しています。
ゲームのレベルはマチマチですが、大人でも楽しめるゲームは数本あります。
他の人が公開したゲームもインプットになってますが、自分で作成したゲームをインプットに、さらに次のゲームを創造してアウトプットすることを繰り返しています。
また自分の公開したゲームのプレイ数が増えたり、数は少ないもののコメント、イイネをもらえることもモチベーションに繋がっているようです。
僕自身がまったくアウトプットできていないので「グサッ!」と突き刺さります…
知識が増えると、それに伴い選択肢が多くなり、選択肢が多い故に「あーでもない、こーでもない」「あっちが良い、こっちが良い」と考える時間だけが長くなってしまうことがあると思います。
選択肢が多いこと自体は悪くないですが、息子は選択肢を持っていないので、少ない選択肢の中で考え、すぐに試すことを繰り返して何とか実現しようとします。
スピード感を持ってトライ&エラーに取り組む姿勢には本当に驚かされます。
つくりたいゲームの難易度が高くなれば高くなるほど壁にブチ当たることが多くなり、そこで諦めてしまうことがあります。
息子のつくったゲームのバグを指摘して直してもらうのですが、ロジックに問題があったり修正が困難な場合だと、そのバグを放置したままにすることがあります。
前述の選択肢の話とは矛盾してしまいますが、ゲームの内容を少し変更したり、他の手段を探してみたりと代替案を考えられるようになると良いなと感じています。
『SCRATCH』では「使い方」と「メモ」を設定できるのですが、未設定のままゲームを公開している場合があります。
前述のバグ放置も同じですが、まだプレイする人のことを考えられていないです。
「もっとコメントやイイネが欲しい!」➡「もっとプレイを楽しんくれる人を増やす!」➡「プレイしてもらう為には何をしたら良いか?」をゲームの説明だけでなく、タイトルの付け方やゲームの難易度などなど考えられるよう話したりもしますが、まだ今の段階では強く求めてはいません。
とは言え、もう少しプレイヤーとしての立場を意識して考えられるようになれると良いなと思っています。
「結局、どんなモノが作れたの?」って話ですが、
せっかくなので10歳の息子が『SCRATCH』で作成したゲームの軌跡を紹介していきます。
【タイトル】逃走中第一話(https://scratch.mit.edu/projects/370410878/)
処女作です。
プログラムを学びはじめた時に誰しもが通る「とりあえずやってみた」感が強く表現されている作品となっています。
【タイトル】ハイパー鬼ごっこ(https://scratch.mit.edu/projects/370510088/)
緑の丸(スプライト)を操作して、別の丸(スプライト)から逃げるだけのゲームです。
【タイトル】アンダーテールシューティング!(https://scratch.mit.edu/projects/375131577/)
自分が大好きなゲーム「アンダーテール」をインスパイアして作ったゲームです。
インベーダーゲームのように敵の攻撃を避けながら敵を攻撃します。
最初の作品と比較して成長しているのが分かります。
上記の3つ以外にも「PKゲーム」や「ジャンケンゲーム」などを含め、1ヵ月ほどで10個以上のゲームを作成しています。
興味がありましたら、こちらからプレイしてみてください。イイネしてもらえると息子も喜びます。
勉強嫌い、運動嫌いでゲームにしか興味のなかった息子が、ゲームから離れたはいないもののプログラム(ゲーム開発)に興味を持って、毎日プログラミングをするほど没頭していることは嬉しいことです。
またこのまま息子がプログラムを続けていくかは本人が決めることですが、息子と一緒に何らかのゲームやサービスを開発したいと言う1つの目標ができました。
長々ととりとめもなく書いてしまいましたが、最後まで読んでいただきありがとうございました。
また別のテーマでも投稿していきたいと思いますので、次回も読んでいただければ嬉しいです。