初心者向けプログラミング体験ワークショップ#1
(0)
- 2021年12月18日(土)-19日(日)に「SECCON 2021 電脳会議」というオンラインイベントが開催予定になっています。
- その中で私(川合秀実)は、2021年12月19日(日) 15:50-17:20 の枠でワークショップをする予定です。
- このページは、私がそこでどんな内容のワークショップをやりたいと思っているのか、それを説明するためのものです。また参考になりそうな資料もすべてここからたどれるようにします。
(1) 目的・対象者
- このワークショップの目的は、小学生にプログラミングを体験してもらって楽しい気分を味わって、今後の学習のためのきっかけにしてもらうことです。
- しかし以下で説明する通り、(条件さえ合えば)中学生でも高校生でも大人でも楽しめる内容だと思います。だから対象は小学生限定ではありません。
- このワークショップでは、初心者に手取り足取りで教えるようなことはできないので、(特にPCの操作に自信のない方は)大人の支援者が必要です。・・・つまりは、小学生が保護者の方と一緒に参加するような形式を想定しています。
- なお、自分自身は初心者ではなく、またワークショップ中に初心者の支援をするわけではないけれど、しかしここを読んでいて、このワークショップの見学をしてみたいと思われましたら、その方の参加も可能です(見学参加)。
- 私自身にとって、今回のやり方は初めての試みなので、うまくいくかどうかは正直未知数です。お見苦しいところがあったり、見学に耐えうるものにならない可能性もあります。どうかそれはご了承ください。
(2) 具体的には何をするワークショップなのか?
- ワークショップの時間では、作品発表会を最後に行います。これは参加者が作ったものを発表する場です。基本的には、「今日のワークショップの時間で私は〇〇を作りました。こんな感じで動いています。ここのところが工夫したところです。ここが難しかったです。ここは自分ではできなかったので手伝ってもらいました。・・・面白かったので、続きをお父さんと一緒にやってみたいと思っています。」みたいな話を画面共有しながら話してもらいたいのです。1人当たり3~5分くらいでしょうか。
- そしてこの発表以外の時間は、私の冒頭の3分程度の導入部以外は、フリータイムです。その間に何か作っていただくことを想定していますが、休んでいただいてもかまいません。発表開始時間までに戻ってきてください。
- もちろん、「じゃあ発表会をするので何か作ってきてください」って丸投げするつもりはありませんのでご安心ください(笑)。
- こちらではとりあえず、10個くらいの小規模なサンプルプログラムを提供します。その中から面白いなと思えるものを1つ選んでいただいて、それを入力してみてください。もし作ったものがゲームであれば、是非それで遊んでみてください。もし時間があれば改造を試みてもいいです。たとえば点数をもっと多くするにはどこを改造したらいいでしょうか。きっと自分で入力したのなら、あたりを付けられるはずです。・・・これだけでもいろいろなプログラミングの要素を体験できていると私は考えます。初心者にとっては十分なはずです。
- もちろん参加者の中には、たどたどしいながらも自分でプログラムが組める人がいるかもしれません。それは素晴らしいことです。そういう人は、私の提供したサンプルなど気にせずに自分で作ったものを発表してかまいません。私としては、このワークショップでは参加者のレベルをそろえて共通のゴールを目指すのではなく、各自が各自なりに前進できる機会を提供することを目指しています。だからレベル感が不統一なのは問題ないと考えます。
- そもそも、ワークショップ時間まで待たなければいけない理由があるでしょうか。もしこの説明を読んで面白そうだと思えたら、今すぐにでも自分のペースで始めてしまっていいのです。ワークショップの時間までには、相当にたくさんのことができるでしょう。このワークショップの目的を考えたら、それは極めて素晴らしい成果です。その場合は、ワークショップ時間内にやったことに縛られることなく、「今日はこのワークショップが始まる前からやっていた〇〇について発表します。・・・」と切り出してください。
- またこのワークショップを知る前から自分はすでにいろいろ作っていたという人もいるかもしれません。それはさらに素晴らしいです。その成果を発表したければそれも歓迎します。その時は自分は今何歳で、プログラミング歴がどのくらいなのかも教えてください。そういう発表なら初心者の人も参考になります。そうか、〇〇歳の人が〇〇ヶ月くらいがんばるとあんなにすごいものができるのかーと。
- でも、「もう自分一人であれもこれもできる、もういろんなところで発表して活躍しているぜ!」みたいな人は、さすがに浮いてしまうかもしれないので、このワークショップでは発表はしないほうがいいかもしれません。私としては、まだ発表機会が少ないレベルの人に発表機会を提供して、それで楽しい気持ちになってもらうことを主目的にしているので、それをご理解いただいた上で判断いただけると幸いです。
- このような趣旨ですので、発表内容がどんなものであれ私はポジティブなコメントしか出しません。というかやったことがないことに挑戦してくれた時点で、たとえ少ししかできなくても、それは十分に称賛に価すると考えます。
- 「成果が伴わなければ称賛されない」だと、やる前から「きっと大した成果は出せそうにないからやめておこう、失敗したら恥ずかしい」になってしまいます。成果の有無にかかわらず、努力が無条件に肯定される環境なら、「うまくできるかどうかは分からないけど、とりあえず一度やってみよう、たとえ失敗してもやった分だけほめられるしね」と思いやすいでしょう。自分にプログラミングの適性があるかどうかなんて、やってみなければ分からないですし、やってみるコストはかなり小さいのです。それならあれこれ考えるよりも、気軽にやってみるほうがいいに決まっています。
(3) サンプルプログラム
- なでしこ編(ブラウザだけで動くのでインストール不要でとてもお手軽!)
- (プログラムが日本語で書かれると、あまり知識がなくても結構読める感じがします。・・・「ああ英語圏の人は一般的なプログラミング言語を使っても、こんな気分なのかー。それはすごく有利だろうなあ」と感じる体験ができます。)
- C言語編(私が自作したグラフィックライブラリを使ってミニゲームを作ります)
- HLX編(私が自作したBASIC風の言語を使ってミニゲームを作ります、Windows向け)
- (本当はこれを一番にお勧めしたいところなのですが、しかしまだ言語が開発途上でエラー処理などが甘く、手放しではお勧めしかねる状況です。)
- (既存言語はやっぱりさすがだよなと思います・・・。)(しかしとにかくうちの子供たちにはHLX編で挑戦させています。)
(4) あえてプログラミングに限定しません
- これはプログラミングのワークショップなのですが、しかし発表する作品がプログラミングによって作られたものではなくてもいいことにしたいと思っています。たとえばペイントソフトで描いた絵でもいいと思います。音楽ソフトで譜面を入力してみて演奏させた―でもいいと思います。・・・どうしてそう思うのかを説明します。
- 私も10歳以下の小学生2人にプログラミングを教えてやろうと思っていろいろやってみているのですが、最初は良くても長続きさせることができません。結局、最初はできることが少なくて楽しめないからだと思います。ゲームでもなんでも無料の既成品がとてもよくできていて、それと比べたらつまらなくなるのは当然です。子供の視線を、それらから引き離す必要があると私は考えました。
- 最近の私は子供たちがMSペイントの使い方を教えてみました。それまでの私はこんなのを教えたら座標を計算してプログラムで絵を描くのが面倒になって、もうプログラミングをしなくなるかもしれないと恐れて、あえて教えないできたのです。・・・教えてみたら、ものすごい食いつきでした。座標計算なんてしなくてよくなるし、コピー&ペーストもできちゃうし、undoもredoも完備されているのです。それはもう目を輝かせていろんな絵を描いていました。そして私は「これはよく描けているな」と感じたものをいくつか指さして、それをコピーさせてくれと頼みました。私は自分の基準で子供たちの作品を選んで、作品集を作ることにしたのです。
- 子供たちは今まで「なぜ作らなければいけないのか?」という疑問をきっとなんとなく感じていただろうと思います。そう感じてしまったら、きっと一気につまらなくなったことでしょう。しかし私が傑作を集めて作品集を作ろうとしているのだと知れば、それは作る理由になりうるのです。どこかからダウンロードしたゲームは作品集には選ばれません。でもそれよりはるかに劣る自作のゲームは作品集に選ばれます。・・・こうして比較対象は見知らぬ誰かが作ったすごいものではなく、自分の過去の作品だけになりました。それなら「そんなのやるだけ無駄、どうせ勝ち目なんてない」とは思わなくなったのです。
- 私はプログラムやCGだけではなく、小学校の図工の授業で作った作品(の写真)や、家で作った積み木やブロックの傑作(の写真)、自由帳に描いた絵(の写真)など、そういうものも作品集に加えることにしています。こうすることで、創作活動が全般的に評価されているとわかってもらえています。そういういろんな表現方法の中での比較なら、プログラミングは決して分の悪い表現手段ではないはずです。きっとちょくちょくやってみようという気を起こしてくれるでしょう。視野も広がるはずです。
- とまあそういうわけなので、プログラミングに限定せずに、何か良い作品があってそれを評価してほしいということであれば、ぜひそれを発表してください。あまりかけ離れているとさすがに理解されずに浮いてしまうかもしれないので、まあソフトウェアに関係がある範囲くらいで・・・。
(5) 私がプログラミング教育において最も大切だと感じていること
- これは私の感覚ですが、世間で「プログラミング教育」というと「プログラミング的思考」ができるようにすることで、そのプログラミング的思考というのが何を指すのかというと、「何か複雑な処理をさせたいときに、それを小さくて簡単な処理の組み合わせに分解すること」みたいな説明がされているように思います。・・・これはもちろん重要なスキルですが、しかし私がプログラミングで習得してほしい最大のスキルはこれじゃない気がします。これは私にとっては(プログラミングを通じて学んでほしいことの中では)2番目か3番目くらいに習得してほしいスキルです。
- 私が自分がプログラミングを通じて学んだことのうちで、一番有益だと思っていることは(=自分の子供にもまず第一に習得させたいと思っていることは)、何度失敗してもいい・むしろ失敗するほうが普通・最後に成功すればいい・調べる前に試していいんだ、ということです。これだけだと何を言っているのかよくわからないかもしれません。
- 私たちがプログラムを書く時、一度もエラーが出なくて、バグも出ないことなんて、年に一度もありません。たいていはどこか間違うものです。でもそんなのはすぐに直せます。そして誰もこれを問題だと思っていません。・・・もし仮に「オレは今まで一度もコンパイルエラーを出したことがないんだぜ、どうだすごいだろう」みたいな人がいたとしても、その人の作品が面白くなければ、それにいったいどんな価値があるでしょう。別に何回エラーを出してもいいんです。直せばいいんです。コンパイルエラーを何万回出しても、最終的にそれを全部直せるのなら、それで1点だって減点されるようなことはありません。プログラミングとはそういう世界なのです。最後に一度だけ成功すればそれでいいんです。それまでに何回失敗していてもいいんです。
- 失敗しないように慎重にやる必要はありません。undoやredoを繰り返して、うまくできたやつだけを残せばいいんです。気軽にやればいいんです。そういう世界なんです。そういう世界もあるんです。・・・今はインターネットで検索するのがとても簡単になりました。だから調べるコストはかなり小さいです。それでも、調べる前にちょっとプログラムを書いて試してみることはできます。そのほうが簡単な時は、ぜひそうするべきです(特にいい検索キーワードを思いつけない場合とか)。正解を調べて探さなければいけないということはないのです。実験すればいいんです。そしてもし調べた内容と実験した内容で食い違いがあれば、正しいのは実験のほうなのです。論より証拠なのです。
- この価値観・考え方は、普通の小学生にはかなり驚きをあたえるはずです。大人たちからは間違えちゃいけないとか失敗しないためにああしろこうしろと言われているはずです。もちろん一度の失敗ですべてが台無しになる世界もあります。そういうところでは、失敗しないように注意を払うべきです。でもそれがすべてではないのです。自由に試行錯誤できて、何度失敗しても咎(とが)められない気楽な世界もあるのです。・・・これを理解できて、今は失敗してもいい時なのかどうかがわかるようになって、失敗してもいい時にたくさん挑戦して学べるようになってくれたら、成長速度はどれほど速くなるでしょう。私はこれこそが最も学ばせたいスキルだと思っています。
(6) Q&A
- [Q]実際にやらせてみた時の様子がわかるような情報はありますか?
(7) 講師について
- 川合秀実(かわいひでみ)。
- 1975年生まれ。サイボウズ・ラボ株式会社勤務。
- 2002年度IPA未踏ユース。
- OSASK計画代表。
- 「30日でできる!OS自作入門」著者。
- NICT SecHack365 講師(コースマスター・トレーナー)。
|