見出し画像

プログラミング初心者に必要なのは、文法でも数学でも無く、国語力じゃない?

先日プログラムを初心者の方に教えていた時に気づいたことのまとめです。
プログラムを教える立場の方、プログラミング初心者はもちろん課題を解決する立場にある方には共通する内容だと思います。

はじめに

今回はプログラム初心者の方を例にあげますが、課題解決、新しいことを学ぶという人には共通することだと思います。
「プログラム」の部分を自身に近いスキルに置き換えて読み進めてください。

導入

皆さんはこんな経験はないでしょうか?

・テキストは進められるが課題になるとできない。
・課題もできるが0からになると手が全く動かない。
・結局何をすればいいかわからない。

もっと具体的に言いましょう。

・テキストの「if文」は理解できる。
・テキストの「for文」は理解できる。
・「FizzBuzz」になると手が全く動かなくなる。

非プログラマーの方に向けて軽い解説をしますと
・「if文」は、プログラムにおける「条件分岐」です。
・「for文」は、プログラムにおける「繰り返し」です。
・「FizzBuzz」は、上記の「if文」「for文」を合わせた課題になります。

FizzBuzz
1~100の数値を順に表示して、3の倍数の時はFizzと、5の倍数の時はBuzzと、15の倍数の時はFizzBuzzと表示を変更させてください。
例)
1、2、Fizz、4、Buzz、Fizz、7、8、Fizz、Buzz、11、Fizz、13、14、FizzBuzz、16、17....100

なぜ基礎は理解できるのに基礎の掛け合わせ応用になると理解ができなくなるのでしょうか?
この問いは教える立場の私を悩ませました。
ですが生徒と話すうちに原因が見え、自分も最初は同じ沼にハマったことを思い出しました。

原因

生徒の多くは思考の整理ができてないことがわかりました。

図のような状態です。
課題の「FizzBuzz」をそのまま解決しようとするので「どこからやればいいかわからない」という状態です。
構成要素の「if文」「for文」は理解できているので今回まず大きな問題を分解します。

FizzBuzz
・1~100の数値を順に表示する。
・3の倍数の時はFizz
・5の倍数の時はBuzz
・15の倍数の時はFizzBuzz
と表示。

このように課題を言い換えて細分化しますと、

FizzBuzz
・1~100の数値を順に表示する。→ for文
・3の倍数の時はFizz → if文
・5の倍数の時はBuzz → if文
・15の倍数の時はFizzBuzz → if文
と表示。

と、自分の知識で解決できる段取りが見えるようになります。
ここが国語力が試されるところです。
これで「大丈夫かな?」と思いましたがもう1つ生徒は沼にハマりました。

更に...

その沼がこちらです。

3の倍数の時はFizz

ここでも軽く解説を加えます。
プログラムでは演算は以下の5つです。(現時点で教えたもの)

・+ :加算(5 + 2 = 7)
・- :減算(5 - 2 = 3)
・* :乗算(5 * 2 = 10)
・/ :除算(5 / 2 = 2)
・% :剰余(あまり:5 % 2 = 1)

これらを使って「3の倍数」を表現できないと言いました。
これも同じで課題をそのまま解決しようとしているからです。
ここでも国語力が役に立ちます。
「3の倍数」がどういうことかを整理して言い換えてみます。

3の倍数をxとする。
n * 3 = x (任意の整数に3をかけると3の倍数になる)
を満たすものである。(nは任意の整数)

ここまでは生徒も考えていたかもしれません。
しかし、これをプログラムに反映させるのは生徒には難しいです。
もう1段階言い換えます。

3の倍数をxとする。
n * 3 = x
を満たすものである。(nは任意の整数)
つまり、xは
x % 3 = 0 (xを3で割った時のあまりは0)
を満たすはずである。

ここまでくれば、プログラムにそのまま反映できます。

まとめ

今回はFizzBuzzという具体例をもとに話をしましたが、課題を解決するときに必要なのは、「課題を自分の理解できるところまで細分化、変換できるか」だと思います。
そのため初心者にとっては文法や数学よりも国語力が必要だと思いました。

生徒も上記の説明をするとその後はスムーズに書いていきました。
が、「パターンがインプットされるとできる」ではなく、「知っているパターンでできるところまで、未知の課題を細分化、変換できる」ということが、プログラマー初心者にとって大事なのではないかと思いました。

テキストに載っているものしかできない。
0から自分の思考を形にするのができない。
こうなると初心者にとってプログラムが機械的でとてもつまらないものになってしまうのではないかとも不安になります。

また、自分のできる範囲まで課題を落とすことができるようになると、限界が見え、「なぜ文法、数学が必要なのか」も見えるので結果として文法、数学の習得も効率的になると考えています。

長々と書いてきましたが、原理主義に偏らないように、失敗を楽しめるように、そしてプログラム、課題解決が楽しいと感じてもらえたらと思います。

※全て思いを綺麗に言語化できてないので随時更新するかもしれません。

寄付いただいたものは書籍などに使用します。 Twitter, noteフォローもお願いします。