タオルケット体操

サツバツいんたーねっとでゲームとかガジェットのレビューとかをします

「プログラミング教育が難しい」いくつかの要因

Sponsored link

最近の波には乗り遅れたけど、これは定期的に議論が発生するトピックスな割にあまり整理して話してるものが見当たらないので僕なりの観点からまとめる。

なおこの記事では

  • 学校教育
  • 未経験者を雇う企業の新人研修
  • 社員の平均レベルをあげたいイケイケ企業

などの領域を包括的に扱いたいので抽象的な段階に終始しようとおもう。

0. そもそも人には向き不向きがある問題

いきなりこれ書いちゃう?

「教育」という概念には、「人間の能力はそれぞれみんな同等で教えればできるようになりますよ」という思想(タテマエ)が根底に存在している。
でも悲しいかな、そんなことないんだなぁ悲しいなぁ。

そして教育にかけられるコストには限りがあり、仕上げる納期がある。つまり「マンツーマンで個人の理解度に合わせた進行」、「理解するまで徹底的に教える」というやり方には限度がある。
なので大まかなグループ分けをして一緒くたに教えることになる。そしてそうするとある程度の集団が落ちこぼれてしまうのを許容するか、あるいは誰も落ちこぼれないように教育のレベルを下げまくるという選択肢が発生することになり、どう転んでも悲しい気持ちになる。つらいね。

現代における学校の教育はまさに勉強のための勉強*1なので後者の選択肢を選んでも問題ないのだが、プログラミング教育は限りなく実践のために行うとされているので使い物にならないレベルの100点満点マンを量産しても全く意味がない。

タイトルに「プログラミング教育が難しい」といれたが、このディレンマはそもそも教育という概念がそもそも抱えているもので、ありとあらゆる科目においてこれを解決しているものはない。
諸外国についての知見はないが、日本の教育は基本的に後者に倒しているので、義務教育を終了するまで誰も一度も文章の書き方を習わない、簡単な英語の挨拶もこなせない、三角関数の使い道を知らない、水素水をありがたがる、株式会社の仕組みも知らない……といった現状があるのだ。

1. 人にものを教えるのは特殊技能

教員免許にどれほどの意味があるのかは知らないが、そういった制度が存在するしないに関わらず人にものを教えるのが特殊技能だということに異論がある人はいないだろう。
教育には特定領域の専門知識だけではなく、教育という技能そのものが必要になるということだ。
そして0でも述べたように教育は領域を問わず、それそのものが難しいのである。デッドロックじゃん? そもそもその人物の専門技能をはかること、それそのものがすでに難しい。資格が実用的な価値を持っていない現状がそれを物語っている。

また専門知識をもっており、人にものを教える技術に長けている人でも、教えることに対するモチベーションがない可能性が高い。
なぜか。専門知識、特にプログラミングのような実用領域の知識は定期的にアップデートしないとあっという間に陳腐化する。そしてそこまでの域に到達できる人は知的好奇心が高いので自分を高めることに喜びを感じて、他人のために多くの時間を割けないからだ。また日本のように、教育に投資しない国の場合は賃金の問題も発生する。

講師をするのはとても大変なことだ。学校じゃなくてもいいが、3年間フルタイムで講師をやり続けたら現役のエンジニアに大きく遅れをとってしまう可能性が高いだろう。技術に喜びを見出す人間がその恐怖に打ち勝つのは難しい。

2. 技能の習得には実践が不可欠

筋トレに例えよう。
効率的な筋トレのやり方、正しい筋肉の付け方、食事、生活習慣……を教えることは可能だ。そして知識を問う問題を出して習得度合いを測ることも可能だ。

しかし筋肉そのものは得た知識を実践しなければ身につかない。また筋トレにはコツがあるため、知識は正しくとも動かし方が間違っていると変なところに筋肉がつく可能性だってある。

プログラミングも同じで、どんなに正しい知識を伝授して、そして生徒が真面目にそれを覚えたとしてもそれが身につくかどうかはわからない。
何かを教えて、それを自分で実践する人間は100人の中に1人いれば良いほうで、基本的に誰もそんなことはしない。

*2

教育というのが受け持てるのはどうしても知識外部から対象へ与えるところまでで、それ以上をやるには洗脳や監禁、拷問などの奥の手が必要になってしまう。

「魚を与えるのではなく、釣りのやり方を教えなさい」というのはその通りだが、やり方だけ知っていれば魚が釣れたら世話はない。適切な道具、餌、時期、場所の知識を揃え、対象の水場で発揮するにはかなりの試行錯誤が必要になるのだ。釣りのやり方を教えても100人70人は脱落するだろう、そして世の中には適材適所ということばがあり、それは自然なことなのだ。

3. コストの問題

上にあげた諸問題を解決して、人に任意の技能を身につけさせる理想のやり方が存在するかもしれない。
しかし既存のテクノロジーや手法では、あまりにコストがかかりすぎてしまう。

習得のプロセスで一番重要なのは試行錯誤なのだが、日本の教育はそこに罰を与えるようにできているため、まずそこの矯正から始めねばならず、ますますコストがかかってしまう。

4. 対象が幅広く、しかも日進月歩

先までの項はプログラミング教育特有というよりは、教育そのものが抱える問題だったがこれは違う。

ここでいう日進月歩は「JavaScriptのフレームワークが新しいのですぎてこまるよねー」とか「ディープラーニングの論文がたくさんでてきてー」そういう先端の領域を指しているわけではない。
よりよい学習のためのスタートラインが変わる、という話だ。なので多少は時間的余裕があるが、とかく教育というものは時間がかかるので無視できない領域でもある。

プログラミング教育のための言語はCやLISP, MLが基本だった時代からJavaに移り(僕が尊敬するプログラマーのJoel Spolskyがそこに言及していたこともあった)、今の主流はPythonやJavaScriptだと認識している。
何年か経てばまた新しい選択肢が現れるだろう。

どの言語が優良か、という議論にはまっっっっっったく意味がないのでここでは言及しない。
しかし確かなのは、C言語しか選択肢のなかった時代は黎明期で終了しており、カリキュラム作成以前、言語選びという最初の一歩ですでに各機関の教育目的に応じた選択を行える知見が要求されているということだ。

システムそのものを教えたいのであればC言語はまだ選択肢に入るだろうし、計算機科学(であってる?)を学ぶならLISPは最適だとおもう。ソフトウェア工学ならPythonやJavaScriptのほうが適しているだろうし、機械学習領域はまずPythonが安牌だ。

何が言いたいかというと、プログラミングそのものを扱うアカデミック領域を例外として、プログラミングそのものはただの手段でありながらも、「プログラミング教育」というものに求められる領域が多様化しすぎているのだ。
これら全てを網羅するのは非効率的であるというのを超えて不可能だし、これらに共通する基礎部分は適正のある人間にとってはあまりに簡単すぎるために教える意味がない

まとめ

教育ってのはそもそも不自然なことをしている、到達できない理想みたいなもんなので各自がそれぞれの事情に応じてカスタマイズした形で実装しないといけない。
そこを履き違えてしまうと教える側も教わる側も不幸になっちゃうんじゃないかなと。それこそ「たぶん向いてないから別の道を探した方がいいよ」「別の場所で学んだほうがいいよ」というアドバイスが親切である、ということは当然ありえる。現実を無視して教育放棄だと弾劾するのはあまりに無責任だろう。

最初の一歩を助けるのか、すでに基礎を修めた人間をソルジャーとして仕上げるのか、ソルジャーとしてすでに場数を踏んだ人間に基礎を仕込むのか……。色々なケースがあって色々なやり方がある。
教えなくても勝手に勉強して成長する人間もいる。そういった奴の手を取り足をとって教えるのは逆に成長を阻害する危険だってある。
個々のケースについてはまた気が向いたら別の記事で言及するかもしれない。

とにかく教育ってのは実現不可能(あるいは定義が曖昧すぎ)な概念なので、固執しすぎると誰も幸せにならない。と、そういう問題定義をしたかったかんじです。
議論の余地がある内容だとおもうので続きはwebで

ちなみに「技術はあくまで手段だからね」みたいな中身のないレトリックでドヤる人間には「そもそも人生が手段ですからね」とカウンターを返してやるといいとおもいます。

こちらからはそんなところです。

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで

*1:本当は違うのだが、とうの教育機関が役割を認識していない

*2:「体力測定でみればいいじゃん?」という向きもいるだろうが、世の中にはキン肉族や範馬一族のようにナチュラルボーン筋肉みたいな存在があり、定量的な効果の測定が難しい。そうすると教育手法へのフィードバックを返すことができなくなってしまう。なお学校の体育はナチュラルボーンキン肉を測定しているだけなので「教育」ではないことに留意してくれよな。