見出し画像

プログラミング学習はプログラミング言語学習ではない

よく回答を書いている質問サイトでもプログラミングに関する質問があり、その辺りのネタをnoteにもたまに書いていますが、なんとなくそういう質問に感じた違和感の正体が見えてきた気がしました。
皆、プログラミングを覚えたいというよりプログラミング言語を覚えたいんだな、と。

消えない、「どの言語が良いですか」

よくある質問がどのプログラミング言語が良いですか?という質問。その辺りは、今はプログラミング入門という位置付けがないよな、という話を以前書きました。
当世プログララミング入門言語事情|woinary|note

実際、こういうことがやりたいからそれに向いているのは何言語ですか?というのなら全く問題ないです。でも、プログラミングやりたいです、どの言語が良いですか?というのが多いです。

もちろん、実際に学習するのに動かしてみるのは大切なので、プログラミング学習にあたってどれか言語を選ばなきゃいけないというのは当然です。ただ、それしか生涯使わないみたいなノリを感じてしまうことがあります。プログラミング言語を選ぶにあたり、一番いいのはどれですか?すぐに役立つのどれですか?みたいな。

例えば、料理を全くしたことがない人が学びたいとして、じゃあフランス料理が良いか、イタリア料理がいいか、やっぱり和食からか?なんて悩みますか?と。まず料理の基礎的なことを学びません?という気がします。

プログラミングも同様で、どの言語がよいか以前に、コンピュータの基礎とかプログラミングの基礎とか学ばないの?そこはどうでも良いの?と思ってしまいます。

「プログラミング学習」が混乱に拍車をかける

最近、小学校からプログラミング学習をやるとか言っていて話題になっています。先日、進学塾を経営している会社が中高生にアンケートした結果、中一の半数がプログラミング経験があるという回答だったとか。

中学1年の過半数が「プログラミングできる」 “競プロ”勢も1.7% 東進ハイスクール調べ - ITmedia NEWS

注意しないといけないのは、アンケート対象が全国統一〇〇テストを受けた人であることです。つまり、受験に関心を持っている層です。偏りがある気がすごくします。まあ、10万人くらいが対象にはなっているのでそれなりに意味があるとは思います。
このアンケートでは中高6学年に訊いていますが、低学年になる程プログラミング経験ありと回答した比率が高くなっています。作為的じゃないかと思うくらいに、綺麗に比例です。

そんな状況からか、以下のような記事までありました。
中学校でプログラミングが必修化!おすすめ言語は何?小学生から勉強すべき?|みらのび (asahi.com)

いや、いや、ちょっと待ってくださいよ。プログラミング学習を何のためにやるか分かってます?
これについては文科省がなぜ導入するのかという資料を公開しています。
小学校プログラミング教育に関する研修教材 (mext.go.jp)

なぜ小学校プログラミング教育を導入するのか
○学習指導要領改訂の背景
学習指導要領の改訂の方向性について審議した中央教育審議会の答申では、情報化やグローバル化により社会が大きく変化していくとしています。特に情報化については、人工知能 AI などの技術革新に関連して、将来、今ある仕事の半数近くが自動化されるという予測などがあります。このような急激に変化する社会では、「今、学校で教えていることが通用しなくなる」「人間の職業が AIに奪われる」という不安の声があります。
(中略)
○なぜ小学校にプログラミング教育を導入するのか
このように学習指導要領の改訂の背景として、情報技術の革新ということがありましたが、小学校プログラミング教育の導入の背景にも関連しています。なぜ小学校にプログラミング教育を導入するのでしょうか。
文部科学省の「小学校プログラミング教育の手引」ではこのように説明しています。いま私たちの周りには、家電や自動車をはじめ身の回りの多くのものにコンピュータが使われ、生活を便利で豊かにしています。それは、あたかも「魔法の箱」のようです。一方それはどのような仕組みで動いているのかわからないブラックボックスとも言えます。
子供たちがこれからの社会を生きていくためには、コンピュータをより適切に、効果的に活用していくことが求められます。「コンピュータはプログラミングで動いている」ことを理解する、つまりコンピュータの仕組みの一
端を知ることによって、コンピュータはブラックボックスでなくなり、より主体的に活用することにつながります。
また、プログラミング教育は子供たちの可能性を広げることにも繋がるものです。実際、若くして起業する人もいます。このように将来の社会で活躍できるきっかけにもつながります。

正直「コンピュータがプログラミングで動いている」という表現はとても違和感がありますが、まあそこは目を瞑り、プログラミングは目的ではなく、コンピュータの仕組みを理解する手段の一つに過ぎません。それなのに「プログラミング学習」と銘打ってしまったがために、どうもプログラミングをしないといけない、という捉え方をされてしまっているようです。

プログラミングが嫌いになる?

と言うのも質問サイトで見かけたのですが、一部の教育に熱心な親が子供にプログラミングを身につけさせないと将来に関わるという強迫観念に迫られている風潮があるのだとか。それが本当かわかりませんし、程度問題もあるでしょうが、本当だとしたらやはりネーミングは大切だな、と。

わかりやすいと思って「プログラミング教育」とか「プログラミング学習」とか名づけしたのでしょうが、そこから思惑が外れて変な方向に進んでしまっているような気がします。

数学(算数)が嫌い、とか、歴史が嫌い、とかいう子供は一定数いて、その原因が学校でのお勉強だったりすることはよくありますが、コンピュータの仕組みを学ぶはずのプログラミング学習で、コンピュータについて学ばずにプログラミングだけ学んで嫌いになる子供が増えないことを祈ります。
実際、自分も学校の歴史の授業とか年表覚えるだけでつまらないと思っていましたが、歴史シミュレーションゲームとか大河ドラマで戦国時代とかに触れて、歴史って面白いじゃんと思ったものです。

なぜ、プログラミング言語を学ぶのがいけないのか

さて、プログラミングを学ぶのにはプログラミング言語を知らないといけないのだから、プログラミングを学ぶ=プログラミング言語を学ぶ、ではないのかというご意見はあるかと思います。
それは正しいですが、半分です。

プログラミングを学ぶという目的の手段として、例えばEXCELのVBAを学ぶ、というのが頭の中で明確になっているのであれば構いません。ただ、それがいつしかVBAを学ぶのが目的化していませんか?と、いうのが確認して欲しいところです。
最初からExcelでデータを扱ったりしたいのでVBAを学びます、というのであればそれでも構いません。でも、今学びたいのはプログラミングですよね。

全てを学ぼうとしない

プログラミングを学ぶのに言語から学ぼうとする人がよくやるのは、その言語の全てを一度に理解しようとすることです。もう少し言うと、その言語で提供されているすべての機能を活用するために、全部覚えようとします。全部の機能を覚えないといけないとか、全部の機能を使わないともったいないとか思うのでしょうか。

まあ公式・非公式のチュートリアルとかマニュアルも、その言語の機能を紹介しているので、当然のようにすべての機能を順を追って説明しようとします。それはその言語のためのものなのですから当然です。
そして、学ぼうとしている人は馬鹿正直にそれを頭から最後まで理解しようとします。で、あまりにたくさんの機能があるので、挫折します。で、〇〇言語は難しい、わかりにくいと文句を言い始めます。

いや、そりゃそうですよ。コンピュータが生まれてから一体どのくらいの年月が経ったと思います?その間、いわゆる「秒進分歩」でコンピュータは進化してきました。それに合わせてプログラミング言語も時代時代の要求に合わせて進化してきました。
自分が40年前に出会ったN88-BASICと30年前に出会ったC言語やC++言語、そして今時のRustとかSwiftとかを比べたら、考え方も提供される機能も様変わりしています。プログラミングの概念も進化しています。それをコンピュータの基礎も学ばずに、いきなり全部覚えようとしたって消化不良になるだけです。

それだけ今時のプログラミング言語はプログラミングするのに最低限必要なもの以外の+α部分が多いのです。それらによってプログラムが綺麗にサクッとかけたりするので非常に便利なのですが、最初から全部使う必要もないし、使わなくてもプログラミングはできます。全部理解して使いこなせるのであれば活用すべきですが、一度に覚えきれないなら後回しで構いません。

基礎は大事

今、プログラミングをやろうとしている人たちが、どれだけ「構造化プログラミング」を理解しているのでしょう。プログラムの三大構造とか理解しているのでしょうか。
プログラミング学習のWebサイトとかいくつか見て、自分も活用させていただきました。自分はプログラミングを知っているので、あとはその言語でどういう機能が用意されているのか、どういう書き方をすれば良いのかが分かれば良いので重宝しています。
が、逆に言うと、そういう基礎のところに触れたサイトは見たことありません。いきなり、”Hello,World!”みたいなものを出力して、文字が出ました、ぱちぱちです。今時のプログラミング言語は意識しないでも構造化プログラミングができるようになっています。が、そのために構造化プログラミングはなんぞやという部分が忘れられてしまったようです。

ナイナイ自慢しても仕方ないのですが、実際、自分がプログラミングを覚えた頃は手元にコンピュータなんぞありませんでした。本で見て、実際に書いてみて、数少ないパソコンが使える機会に試してみて学びました。マンガで家庭にピアノがないので鍵盤を書いた紙で練習するシーンてのがあったりしますが、あれと同じようなものです。
それは不便ではありましたが、自然と学びと実践のフェイズが物理的に分かれざるえなくて、それはそれである意味効率が良かったようにも思います。
コンピュータが数少なくて貴重だった時代には、実際にコンピュータで動かす時点ではすべて完璧な状態であることが求められており、実行したらエラーが出ましたは「お前向いてないから辞めろ」と今ならパワハラとされるようなレベルで怒られても不思議はない世界でした。それが良いとは思わないし、今はそういう時代ではないのでバンバンエラーを出して覚えれば良いとは思いますが、それと基礎をおろそかにするのは別問題です。

プログラミング言語ではなくプログラミングを学ぶ方法

では、プログラミングを学ぶにはどうしたらいいか。

プログラミング言語は一つではない

大前提としてプログラミング言語は一つではないと言うことです。
何を当然なことと思うかもしれません。例えば、今時の日本人で和食しか食べないという人は少ないと思いますし、ラーメンしか食べないという人も少ないでしょう。
プログラミング言語もどれかひとつ覚えれば良いというものではなく、用途に合わせた言語があり、それを使い分けるのは当然ということを理解してください。
1つ覚えれば何にでも活用できますなんていうプログラミング言語はありません。今覚えようとしているのは、プログラミングを学ぶにあたって最初に選んだだけのプログラミング言語に過ぎません。合わないと思えば別の言語を選べば良いし、すべての機能を覚えて使いこなす義理も必要性もありません。
世に存在する和食をすべて食べ尽くしてからじゃないとフランス料理を食べてはいけない、なんてことはありませんが、それと同じです。

基礎を学ぼう

その上で、基礎を学んでください。基礎も学ばないうちから応用機能もすべて覚えられるほど、今時のプログラミング言語は簡単ではないです。
将来職業としてプログラミングをしようと思っているのであれば、情報処理技術者試験の初級アドミニストレータとかITパスポート試験の内容くらいは勉強してください。別に資格を取るのが目的ではないので取らなくて良いです。資格を取ったところでそれで優遇されることもまずありません。

別に今のところ職業として考えていないのであれば、以下だけ覚えてください。
マンガやアニメに出てくるロボットやAIのように、コンピュータは融通が効かない石頭で、事細かに伝えてあげないと動かないし、一切忖度もしません。子供にお使いを頼むのに「カレーの材料を買ってきて」と言っても子供は困るでしょう。ちゃんと「カレールー(具体的な製品名)、じゃがいも○個、にんじん○本、玉ねぎ○個、…」と具体的なものを伝えなければなりません。作り方の説明が「材料をすべて適切に切って、鍋に入れて、煮込んでください」だけだと困りますよね。
自分のやりたいことを子供や相手に分かるような言葉で、具体的な細かい内容に分解して伝えることが重要です。それをコンピュータに対してするのがプログラミングです。

これだけ覚えれば十分

実際にプログラミング言語を学ぶ際には以下を覚えれば当座は十分です。それ以上のことは、慣れてからにしてください。

  • 何かを入力したり、出力したりする方法(何かが入ってその結果何かが出ないとつまらないので)

  • 変数とは何か

  • 条件分岐(if)とかループといった制御構造

  • 加減乗除といった数値計算

  • 文字列の連結とか置き換え、検索といった文字列操作

これができれば当座は大抵のことができるはずです。それ以上のプログラミングを便利にする機能とかは後回しで構いません。上記を覚えた後で、以下に進むのがおすすめです。

  • 関数、サブルーチン、クロージャといった各種モジュール化の考え方

  • エラーが起きた時の対処法

まとめ

毎度長文で申し訳ないですが、今のプログラミング学習について、ちょっと愚痴ってしまいました。プログラミングを学ぶにあたっては、以下を忘れないで取り組んでいただければ幸いです。

  • その言語の全部の機能を知らなくても良い

  • その言語が生涯唯一のプログラミング言語ではない

  • プログラミングはあくまで手段に過ぎず、目的ではない

  • プログラミングできれば便利なこともあるが、できないと困ることもない

  • プログラミングは子供にお使いをたのむようなもの。モヤッとしたやりたいことを現実の手段に分解して組み立てることが重要。

拙い記事でございますが、サポートしてもよいよという方はよろしくお願いします。著者のやる気アップにつながります。