Posted at

プログラミング初学の小中高校生に関数やメソッドやサブルーチンの必要性を伝えるには

More than 1 year has passed since last update.

ツッコミ、ご指導、よろしくお願いいたします。



背景

塾講師のアルバイトっぽいことをして、塾を運営している先生と対話して、

「なるほど」

と思ったので書き留めておく。


生徒のスキル



  • 苦しんで覚えるC言語を、塾を運営している先生と一緒に一通りやったが、色々忘れてる。


  • Scratchでゲームは作れるが、「ブロックを作る」の使い方が分からない。

  • 高校数学1Aを学び始めた位。



なぜScratchに「ブロックを作る」機能があるのか

既に何かを作るのに十分なブロックがあるのに、なぜユーザーが新たにブロックを作る必要があるのだろうか。しかも「数値や文字列や真偽判定を受け付ける」というブロックである。

これにより、プログラムを細分化することができる。そして上手に作ったブロックは、必要以上にブロックを追加する手間を省く。

このブロックに与えた数値や文字列や真偽判定は、作ったブロック内でデータとして使うことができる。

「しかし、そんなこと必要なのだろうか、全てどのスプライトから見れるデータで扱えば良いのではなかろうか」

確かにその考え方もありである。しかし後々困ったことになる。詳しくは後術。


なぜプログラムを細分化する必要があるのか

「共通した処理をまとめ、それを再利用しやすくする」と言うことに尽きる。

もう少し詳しく話そう。


類似した処理をまとめるため

類似した処理、もしくは全く同じ処理は、1つのブロックにまとめてしまったほうが、後々修正するときに、一つのブロックの中身を修正するだけで済むのである。

そういった観点で類似した処理はまとめたほうがよろしい。


グローバル変数を減らせるため

グローバル変数とは何か。言ってしまえば、全てのスプライトから見たり、変更できたりするデータのことである。

これはあまりよろしくない。なぜかというと、後からスクリプトを修正するときやリミックスされるときに、グローバル変数がどのスプライトのどのブロックに影響を与えているか常に把握しなければいけないからである。

できるか? 私はできない。

少なくとも、作ってる時点で把握していたとしても、3ヶ月後にそのプロジェクトを見てみれば、その複雑さは身を持って知り、

「なんでこんなにわかりづらいスクリプトを組んだんだ」

と自分を恨むことであろう。


結果として可読性が上がる

これらの理由により、類似(似たような処理)や全く同じ処理は、イベント毎に新しく組む必要はなく、ブロックを新しく作り、それにまとめてしまったほうが良いことは少しでも分かっていただけただろうか。

また、こうすることにより、3ヶ月後の自分やリミックスを試みたスクラッチャーが、やりたいことを追いやすいスクリプトができるはずである。


ではどのようにして「ブロックを作る」のか

ここはなかなか難しいところである。

他人のスクリプトを見てみたり、自分で何度もスクリプトを組まないとつかめないところかも知れない。

ただ、自分が曲がりなりにもプログラマとして5年位働いて来た勘を言語化(これもある種の「ブロックを作る」である)してみようと思う。


数値や文字列を省けば、ほぼ同じブロックで構成されているものはないか

違う動きをさせようとして、同じブロックで数値や文字列だけを変えてスクリプトを組むことがよくある。

しかし、本当に数値や文字列が変わっているだけで、ブロックの組み方が全く同じ、もしくは似ている処理は無いだろうか?


そのプロジェクトは、一つのスプライトで必要以上の仕事をしてはいないだろうか、

あるスプライトはたくさんのブロックが並んでいるのに、別のスプライトはブロックが少ない。

そんな時もスクリプトを見直す機会かも知れない。


「もし< >なら」ブロックが3重よりも重なってないか

何個にも分かれる条件分岐は、一見複雑な処理をしているかもしれないが、その末端では似たような処理をしていなかったりしていないだろうか。

それこそが「ブロックを作る」のチャンスである。


参考(にしたい)資料