プログラミング教育を進めるために

学力とは何か?

プログラミング教育を考えるとき、「学力」という言葉に思いを馳せざるをえません。
もちろん、知識・技能を獲得することは大切な観点ですが、学力に、知識や技能を実生活で生かすという観点を取り入れたとき、自ら問題を見出し、考え、調べ、議論しながら答えを模索し、実践していくという学びの形が重要になってきます。

プログラミングには、もともと、そのような学びの形が備わっています。

実践的な学びが重視されている今日、プログラミング教育が新しい教育の形として小学校教育の舞台に上がってきたことは、非常に自然なことです。
プログラミング教育は小学校段階のみのものではありません。児童生徒が将来に渡って身に付けることが期待されているプログラミング的思考やプログラミングを伴った実践力を確実に獲得するために、発達の段階に応じ学び、体験し続けることこそ大切なのです。

継続こそ大切

では、学校の教育活動のどこで、どのくらいプログラミングの活動を取り入れればよいのでしょうか。
1年に何回か行うだけでは、以前の活動で学んだことを忘れてしまっていて、その都度復習が要るなど、学習として非効率なのではないか。

実際にそのようなことを心配している先生方は、多いのではないでしょうか。

確かに、プログラミングのスキルには、他の学習同様、経験量が大切です。なぜなら、プログラミングは、それまでに作ったことのあるプログラミングの経験を下地にして考えていくことになるからです。
ですから、プログラミング教育を学校教育に取り入れるならば、普段から、プログラミング教育を意識した活動を行うことが必要になってきます。

では、なぜ、プログラミングは、一つの教科ではないのでしょうか。

プログラミング「で」学ぶ教育

小学校段階では、プログラミングそのもの(コーディング)を学ぶこと以上に、プログラミングで、自分の意図したとおりにコンピュータを操作することができることを経験的に知ることが大切です。プログラミングをするといった行動自体、受け身的な活動ではなく、目的意識を持って行う、頗るアクティブな活動であり、子どもたちに最も必要なのは、プログラミングという行為に情意的な必然性を持つことだからです。目的意識を持つことは、コーディングを学ぶ以上に大切なことなのです。

では、「目的意識」を持って行うプログラミング教育の活動とは、どういったものでしょうか。

元来、教育活動自体、子どもの目的意識を大切にしています。主体性は、子どもから湧き上がってくる目的意識から生まれるものだからです。そういったことを考えると、ポイントになるのは、子どもたちが、自分たちの活動の中に、いかに、コンピューターやプログラミングを使いたいと思うような学習に導くことができるか、ということになります。

イメージできますか。
子どもたちがコンピューターを使いたいと思う授業、プログラミングで解決したいと思う問題。
それが、「プログラミング『で』学ぶ」という言葉を考えるヒントになります。

「プログラミング『で』学ぶ」という言葉は当に奥深い言葉と言わざるを得ません。この言葉には、目的語が無く、この言葉に直面した教師それぞれが、このことに思いを巡らす必要があるからです。

実際にプログラミングを取り入れた活動をしてみればまず気付くのが、そこで繰り広げられるコミュニケーションの豊かさです。疑問を友だちに素直にぶつける子ども、友だちの作ったものを素直に評価してあげる子ども、お互いの考えのおもしろさに素直に笑い合う子ども。 教員感覚で見ると、プログラミング教育の最大の効果は、教室全体を温もりで包み込むような、望ましい人間関係を構築するような、生徒指導的な側面でしょう。この視点から見ると、子どもたちが、「プログラミング『で』学ぶ」のは、他の個性を認め、他を尊重し、他との違いを楽しみつつ違いからヒントを得、他と関わりながら自らの主体性を伸ばしていく意欲と態度でしょう。

なぜ、プログラミングで子どもたちのコミュニケーションが豊かになるのでしょうか。

プログラミングを体験してみると良く分かることですが、プログラミングは、元来、表現活動であり、人それぞれの考え方を反映することができるものです。そこには、正解というものはなく、あるとすれば、自らの意図のとおりの動きが実現できているかという内省的なものしかありません。
ですから、子どもたちは「正解を言わなければならない」「他と違う意見ではいけない」などという強迫的な考えから解き放たれ、自由に考え、交流することができるのです。それが、子どもたちの豊かなコミュニケーションの原動力になっているのです。

 そして、子どもたちはプログラミングを通して、他との違いを楽しみ、他の考えを自分に生かすということを学ぶのです。

次に、論理性について考えてみましょう。プログラミングは、論理性とつなげて考えられることがよくあります。なぜ、プログラミングは論理的思考の育成に役立つのでしょうか。

論理性は、筋道を立てて考えることが第一歩です。すべてに因果関係をつけ、因と果の間を理由という架け橋でつなげていきます。そこには、妥協は許されず、曖昧さは、論理の破綻の原因となります。

プログラミングは、目的を達成するために、何が必要で、それにどのような動きを設定するかを、一つ一つ積み上げていく作業です。 動きを与える場合も、起こり得るすべての想定に対して対応を与えなければなりません。これは、先程述べた論理性の説明と考え方が頗る似ています。ですから、プログラミングが論理的に考える訓練の一つになると考えられるのです。

 しかし、実の所、プログラミングが論理的思考力を養うに適している理由が他にもあります。

それは、「デバッグ」という行動にあります。デバッグとは、プログラムの誤りを修正するという意味ですが、プログラミングの他の学習活動に比しての最大の特徴は、プログラミングをすれば必ず実行をし、意図した動きをしなければ必ず修正する、という所にあります。意図した動きにならなければ、その原因がどこにあるかを考えなければなりません。どの部分が原因かということが分かれば、それをどのような想定のもとで、どのように修正しなければならないかを考えなければなりません。

そのようなデバッグの経験が、子どもたちに物事の因果関係を見通す習慣を身に付けさせる一因となるとともに、他とコミュニケーションを取るときも、必要な場合には、曖昧さを避け理路整然とした表現をする態度に繋がっていくのです。

ただし、今まで述べてきた、プログラミング教育の生徒指導面や論理性についての効果は、プログラミング自体が持っている特徴によるものでした。では、子どもたちの目線から見た時の、プログラミング教育への期待はどうでしょうか。

あなたはどのように学びたいですか?

子どもは困ったことがあるとき、大人を頼ります。なぜなら、大人は豊かな経験をもとに、子どもたちを庇護し導いてくれることを子どもたちが経験的に知っているからです。しかし、探求心、好奇心は、元来、子どもたちも大人に勝るとも劣らないものです。

学習において、子どもたちが大人に頼り切らず、自分が、その溢れる探求心や好奇心に従って進めていこうという感覚が生まれたとき、真にアクティブな学びが生まれるのです。

探求心や好奇心をもとに、プログラミングによってコンピュータの能力を引き出し、表現したいものを表現し、知りたいものを知るという活動をするとき、子どもたちは、プログラミングで、新たな知、真に身になる知を学ぶのです。プログラミングを通して、自分で考える習慣、必要なことを自分で学ぶという態度を身に付けるのです。

例えば、素数を学んだとします。素数の定義から子どもたちは 2, 3, 5, 7, 11, 13, 17, 19 などが素数であることは、すぐ理解するでしょう。また、2以外の、一の位が 0, 2, 4, 6, 8 の整数は、2で割り切れるから素数でないなどという、所謂判定の方法についても考えるでしょう。しかし、見た目簡単な数、例えば、111, 1111, 11111 を考えるとき、これが素数か否かを手計算で考えることが難しいことに気付くはずです。しかし、子どもたちも当然答えが知りたいはずです。このように、「知りたいと心から願う気持ち」が子どもたちの学びをアクティブなものにするのです。

素数自体の定義は簡単です。割り切る数があるかないかだけですから。コンピューターに判定させる場合も、定義に従ってプログラムするなら、当然、プログラムはそんなに長くなることはありません。それを、子どもたちが協力して完成させ、実際に答えを出したとき、子どもたちは、達成感とともに、コンピューターのマシンパワーのすばらしさを実感するはずです。この経験が、子どもたちのプログラミング意欲を更に増していくことに疑う余地はありません。

他にも、自分の描いた絵を動くようにしておもしろい作品を作りたい、調べ学習で知りえたことをクイズ形式のゲームにして皆で楽しみたい、など、プログラミングを知ることによって、子どもたちの表現意欲の幅を広げることができます。

このような、子どもたちから湧き上がってくる探求心、表現意欲こそ、真にこれから必要とされている学力の基礎となるものなのです。

子どもたちをプログラミングに導くために

では、子どもたちをプログラミングに導くためには、教師として何をすればいいのでしょうか。

まずは、子どもの発達の段階に応じた適切なプログラミング言語を選定することと、そのプログラミング言語の特徴を捉え、それで何ができるかを知ることです。「できる」ということを知ることが、子どもたちにとって最大のヒントとなり、最高の勇気付けになるからです。

現在、小学校からのプログラミング教育が可能になった背景には、小学生でも簡単にプログラミング体験ができる「ビジュアルプログラミング言語」が開発されたことがあります。代表的なビジュアルプログラミング言語に「Scratch(スクラッチ)」と「Viscuit(ビスケット)」があります。(参考ページ:「Scratch」 「Viscuit」

MIT(マサチューセッツ工科大学)メディアラボが開発したScratch は現在最もよく使われている教育用プログラミング環境と言えます。使う命令は、すべてブロックで表現されており、それをドラッグアンドドロップして組み合わせていくだけでプログラムが出来上がります。プログラムの基本的な構造である「反復構造」「条件分岐」もブロックで表現されているので、本格的なプログラミングも、遊びながら感覚的に組み上げることができます。また、画面上のキャラクターを動かす命令もブロックとして用意されているので、動く絵本やプレゼンテーション用のスライドなど、実際には高度なプログラムを必要とする表現も簡単にできます(参考ページ:「Scratchでプレゼン作成」)。ちなみにですが、プログラミングに慣れてくれば、先程例に挙げていた、素数判定のプログラムやクイズゲームなども簡単に作れます。

NTTコミュニケーション科学基礎研究所の原田康徳さんが開発したViscuitにいたっては、ブロックすら使いません。絵を描いて部品とし、それを「めがね」というしくみを使ってずらしたり、向きを変えたりして、動きをプログラムするだけで、楽しいアニメーションが作れます。プログラミングの仕組みが簡単なだけに、できることも限られますが、幼児でもプログラミング体験ができるのが、最大の強みと言えるでしょう。

そして、教師としてまず行わなければならないのは、当然ですが、これらを使って、何ができるかを知ることです。また、もし、今まであなたにプログラミング体験がなかったとしたら、実際に使ってみることで、プログラミングがどういうことかを知ることです。

プログラミング的思考とは

プログラミング的思考は、教科の言葉で言えば、「見方や考え方」に当たるものです。ですから、適切な指導をしていれば、知識・技能を身に付ける過程で自然に身に付かなければならないものと言えるでしょう。つまり、適切なプログラミングに関する知識や技能を指導する中で、言い換えれば、プログラミングの経験を通してプログラムの働きやよさへの気付きを促すとともに主体的にプログラミングを活用していこうという意欲を高める指導の中で、プログラミング的思考は育まれ、それを用いて、子どもたちは、思考し判断し表現をしていくことになるのです。つまり、観点としてプログラミング的思考が十分身に付いているかということが、問われるのです。

ここで、プログラミング的思考について見てみましょう。文部科学省によると、プログラミング的思考は次のように定義されています。

自分が意図する一連の活動を実現するために、どのような動きの組合せが必要であり、一つ一つの動きに対応した記号を、どのように組み合わせたらいいのか、記号の組合せをどのように改善していけば、より意図した活動に近づくのか、といったことを論理的に考えていく力

 これを 5つのステップに分けてみましょう。

  1. 自分が意図する一連の活動を実現するために、
  2. どのような動きの組合せが必要であり、
  3. 一つ一つの動きに対応した記号を、
  4. どのように組み合わせたらいいのか、
  5. 記号の組合せをどのように改善していけば、より意図した活動に近づくのか、
    といったことを論理的に考えていく力

これはプログラミングするときの手順をよく表しています。

「1.自分が意図する一連の活動を実現するために」は、問題の明確化の段階を
「2.どのような動きの組合せが必要であり」は、アルゴリズムの考察を
「3.一つ一つの動きに対応した記号を」は、コンピューターが理解又は計算、評価できるような命令や表現に置き換えることを
「4.どのように組み合わせたらいいのか」は、それぞれの命令をどのようなフローで制御するのかを
「5.記号の組合せをどのように改善していけば、より意図した活動に近づくのか」は、所謂デバッグやプログラムの効率化を表しています。そして、それらを見通しを持ち、また、振り返りながら考察していくということです。

問題の明確化には、問題の本質を見通し、問題を一般化したり抽象化したりする中でアルゴリズムを考えるもととすることを含みます。ここで、アルゴリズムは、問題を解決するための手順又は手続きを明確に表現したものを表します。

一般的には、アルゴリズムを考え、実行、検証した時点で問題解決ということになるのでしょうが、アルゴリズムの考察の後に、「一つ一つの動きに対応した記号をどのように組み合わせたらいいのか」と続き、アルゴリズムといった手順の明確化で終わらないのが、プログラミングの特徴又はパズル的なおもしろさと言えるでしょう。

 プログラミングの経験がおありの先生方は思い当たることが多々あると思いますが、人間には単純な動きでも、コンピューターにプログラミングでその動きを再現しようとすると、事がそう単純には終わらない場合がほとんどです。

例えば、机の上にカードが 2枚あるとしましょう。この 2枚のカードの位置を入れ替えて置くことを考えましょう。当然、人間には簡単なことですよね。もし、他の人に頼むときも、単に「この 2枚のカードの位置を入れ替えて」と伝えれば、たやすく実行してくれると思います。

しかし、このような簡単なことでも、プログラミングしてコンピューターに実行させるとき、事はそう単純ではありません。いかなるプログラミング言語でも、できる命令や判定は頗る限定的であり、その制約の中で、意図に則した動きを実現するための表現や命令の組合せを工夫しなければならないからです。

例えば、カードを取ったり移動させたりするなどの操作するときに使えるものがピンセット1本だけであり、カードを置ける場所が限定されている上、その場所に置けるカードも1枚だけだとすればどうでしょう。もし、カードを置ける場所が2か所だけだと、もうカードの位置を入れ替えることはできませんよね。カードを置ける場所を予め3か所用意しておかなければなりません。

実は、多くのプログラミング言語には、このように、人間なら簡単に行えるような行動に対しても簡単には実行できないような限定的な制約があり、2枚のカードの位置を逆にしたい場合でも、単純に「2枚のカードを入れ替えて」という命令一つでの入れ替えはできず、複数の命令を組み合わせて実行することが必要になります。当然難しいわけではありませんが、このように、コンピューターの特性や、使用しているプログラミング言語において何が命令として用意されているのかを知っておくことが必要ですし、実行したことが命令として用意されていないときにどのように回避していくかは、ある程度の見通しと経験を要します。

このような事情があり、プログラミング的思考の定義がアルゴリズム、つまり、問題解決の手順の考察で終わっていないのです。

自分が考えた手順をコンピューターが実行できるような形に書き換えることを面倒と思うか、パズル的なおもしろさがあると捉えるかは人それぞれかも知れませんが、少なくとも、子どもたちが、よく言われているように、コンピューターが魔法の箱ではなく、プログラミングにより人間が意図をもって動作させているものだということを理解し、プログラミングの役割に気付くことを重視するという観点から見ると、必要な表現でしょう。また、実際、考えたことをプログラムに表現して、実行し、デバッグを繰り返しながらより意図に近いものにしていくという作業は、前述したように、楽しいものになりますので、そういった経験をとおして、プログラミングによって思い通りの動きをコンピューターにさせることができることを理解し、プログラミングの役割やよさに気付くために、教育的にも有効であると言えます。

プログラミング的思考は自然に身に付く

今までの考察で述べたように、プログラミング的思考は、問題を分解、抽象化、一般化しながらアルゴリズムを考え、それをコンピュータにプログラミングできるような形で表現するという2段階のステップを必要とする思考です。非常に、論理的でありパズル的な面白さがあると思いませんか。また、プログラムの結果も、実行すればすぐに確かめられますので、そういったプログラムの性質により、子どもたちは、プログラミングにのめり込んでいくのです。

だから、適切なプログラミング教育により、プログラミング的思考が自然に身に付くのです。そして、プログラミングのよさや楽しさに気付いた子どもは、自分で学び、自分で可能性を広げていくはずです。もし、避けなければならないプログラミング教育があるとすれば、子どもの自由な発想や望ましい試行錯誤の経験を阻害するような教え込みの授業スタイルを取るときでしょう。

ただし、子どもたちの発達の段階には十分留意しなくてはなりません。

プログラミングが未体験の子どもたちに、いきなりプログラミング技術の基礎である、フローチャートにおける「順次構造」「反復構造」「条件分岐」などを教え込んだとしても、それは実感を伴ったプログラミング教育にはなりづらいはずです。何と言っても、プログラミング的思考の第一歩は、問題解決の具体的な手順を表現するアルゴリズムを考えることだからです。そこには、子どもたちが解決したいと心から思う身近な問題設定が必要であり、アルゴリズムを考える際にも、子どもたちに身近な具体物や半具体物を用いて、シミュレーションしながら考察を深める必要があります。発達の段階が進むに従って抽象的な思考ができるようになるとは思いますが、手を動かして自分で考える、友だちと意見を交換するといった経験は必ず必要なはずです。

そこで有効になってくるのが、「アンプラグドコンピューティング」という考え方です。

「アンプラグドコンピューティング」という考え方

アンプラグドコンピューティングとは、乱暴な言い方をすると「コンピューターを使わないコンピューター教育」ということですが、これは、情報の科学的な理解を促すときによく用いられる手法です。

ただし、誤解がないように注意するとすれば、アンプラグドコンピューティングでプログラミング教育を行う際、本来それが必要ないような簡単な場面を想定してフローチャートを書かせるだけでは、本来のプログラミング教育の目的を完うすることはできません。もちろん、フローチャートを書くこと自体は、表現手法として意味がありますし、プログラミング初学者なら、必ずフローチャートを書く経験は必要だと思います。しかし、本来のアンプラグドコンピューティングの目的は、目で見るのが難しいコンピューターの仕組みやプログラム上の処理を、模型やカードを使って子どもたちが操作をしながら、納得をもって理解を深めていくことにあります。当然、与えられた又は考えた問題に対して、解決のためのアルゴリズムを考える際にも有効です。

例えば、先程例に挙げた「2枚のカードの位置を入れ替える」課題は、コンピュータの処理の特徴の理解に役立つでしょうし、他にも、「数が書かれた複数枚のカードを小さい順に並べなおす」課題は、アルゴリズムを考える経験として意味あるものになるでしょう。こうした、自らの手を使って行うような実際の経験があればこそ、子どもたちのプログラミング的思考が真に身になるものとなっていくのです。

ただし、前述したビジュアルプログラミング言語、特にViscuitは、もともとアンプラグドコンピューティング的な要素を色濃く持っています。ですから、幼児から使えるプログラミング言語なのです。

(アンプラグドコンピューティングについては、こちらもご覧ください。)

大切なのは、プログラミングでコンピュータを操作できるという感覚、実感

ここまで、プログラミング教育を進めていく上での考え方をお話ししてきましたが、小学校段階のプログラミング教育で大切なのは、プログラミングでコンピューターに思い通りの動きをさせることができるようになるということを実感することに尽きます。実感は、教師であろうとも決して子どもたちに教え込むことはできません。子どもたちの内から湧き上がってくる好奇心、学習意欲がなければ、そういった実感はあり得ないのです。

 私たち教師にとって必要な態度があるとすれば、子どもたちの精神の自由性を阻害せず、望ましい個性を生かしながら、温かい雰囲気の中で、プログラミングを楽しみ、よさを理解するような支援、勇気付けでしょう。

今後、私たち教師が真に適切なプログラミング教育を行い、子どもたちがその手に豊かな未来を手にすることを願ってやみません。