小学生のプログラミング教育のニュースを見たときに思ったことです。
ある題材をいかに最短かつ効率よくゴールに導くのかを考えるに、プログラミングを経験していると有利に働くことはあります。
しかし、プログラミング的思考は共通していても、プログラミングのアプローチは千差万別だと思います。
例えばaとbを掛け算して結果を求めるようなものを作るとするなら、まずその道筋を考える必要があります。
「何から始め、どのように進めて完成を目指すか。」
その言葉を図にするなら、きっとこのようになると思います。
そして、前述、変数aとbを掛け算して答えを求めるのであれば、
「変数aとbが掛け算するために、どのように進めれば、正しい答えを導くことができるのか?」
具体的に、変数aを6、変数bを7としたうえで、掛け算して答えを変数rに返るとし、
これをコードにするなら、ほとんどの方は
a = 6;
b = 7;
r = (a * b);
とすると思います。
しかし、全ての方が同じ道筋を通るとは限りません。
ある人は
r = multi(6, 7);
multi (a, b) {
return (a * b);
}
さらに別の人は
a = 6;
b = 7;
r = 0;
for (c = a; c<0 ; c--) {
r = r + b;
}
とする人もいるかもしれません。
確かに言えることは、筋道を通って完成して正しい答えを導くことができますが、コードの内容は明らかに違います。
プログラミング的思考は、筋道(理論)をコードにすることはできますが、
プログラミングは実際、効率的なコードが求められたり、条件や制約などでさまざまなアプローチを求められる場合があります。
上に示すコードの1番目のコードは再利用はできませんが、2番のコードなら再利用を考慮して書かれたものと読み取れ、
3番目は非効率ではあるものの、個性的で、関数を通している点においても、再利用の可能性を考えたのかもしれないと思います。
効率的なコードを書くためにはプログラマの知識と技術の量に影響しますが、上記のような1つの題材に対して、
さまざまなアプローチを行えるプログラマはあまり多くないのかもしれません。
効率的なコードはひらめきや天賦の才能によって降ってくることもあるかもしれませんが、
試行錯誤した結果で生み出されたり、先人の創意工夫によって受け継がれるものであれば、
そこには大きな時間的費用が費やされていることは間違いありません。
これまでを図にするなら、きっとこのようになります。
つまり、ゴールにたどり着くには、時間的費用がかかり、それは効率的コードを書くための必要経費でもあるのですが、
それによって、精度の高い(的確に解決できる)結果を生み出すことができるということなのだと思います。
ただし、この図には明らかな誤解があり、勘のいい方にはわかると思います。
プログラムには時としてエラーが発生するのですが、多くは想定を超えた条件に対して答えを導こうとした場合だと思います。
とすれば、時間費用を費やして効率的なコードを書いても、エラーが発生するような精度では、
ゴールに辿り着いていないので、上図で説明する理論は破綻します。
プログラマを志すのであれば、理論はもちろんですが、きっと、さまざまなコードレビューを経験し、
幅広いアプローチが行えるための理論、知識、技術を得ることの方が重要かもしれません。