Lambdaカクテル

京都在住Webエンジニアの日記です

本当に諦めて刺身にタンポポ乗せたほうがよいのか(その1 プログラミングの勉強の順序の話)

note.mu

を読んだ.結論から先に書けや!といった旨のコメントをしてしまったが,「プログラミングを志す初心者のレベルが一定程度に達していない」という不満を表明している点については,同意する.自分も大学生であった頃に同期にプログラミングを教えた経験があるが,似た経験が多かったのである.ちょっと強く書いてしまってごめんネ.

さて,初心者である以上,プログラミングについて知らないことがあるのは当然のことであるから,著者もその旨は了解しているはずだ. それを前提として考えてもプログラミングを身に付けるための知識や態度が身に付いていない初心者の存在こそを,彼(彼女)は憂いているのではないだろうか.

この「学ぶ前提となるような知識や態度」について,上記記事の主張を見ながら,初心者が身に付けるべき知識・態度を探ってみてはどうだろう,と考え,この記事を書くに至った.俺は今正月で帰省中だが,充電器を実家に持ってくるのを忘れたので,ちょっとずつ書ける範囲で記事を上げていくことにする.

でぃすくれいまー: ちなみに私は3年目のWeb系エンジニアであり,普段はPerlでプロダクトを書いている.

初心者がプログラミングに手を出す現状は,歓迎すべき

これだけ時間をかければほとんどの人がプログラミングできるように……ならない。むしろできない人の方が多い。なんで。why。教えて。

まず,一般人にとってプログラミングという概念は,ブロックチェーンやAIよろしく一種のバズワードの様相を呈している.このことについて異論の余地はないはずだ. ゲームやインターネットで夢を抱いたド素人が,全く受け身の姿勢で手を出し,プログラミングがわかる人間を苦労させる,という状況がある. しかし俺はこの事については問題であるとは考えない.プログラミングという分野は人口ピラミッドで例えるとピラミッド型の状態にある.初心者のうちの何割かはプログラミングに手を出してすぐ死んでしまうが,そのうちの何割かが生き残り,「ある程度分かっている初心者」「中級者」「仕事でやってる」といったレベルに上昇していく. たちの悪い初心者が多量に存在する状況は,歓迎すべき状態である. レベル人口が壺型ピラミッドになったら,その業界はキツいことになりそうだ.

とはいえそれとは別に,やるならちゃんとやってよ,という気持ちになるのは当然である.プログラミング人口はそんなに多くはないのであり,大都市でもなければプログラミングができる人間を探すのは至難の業である.しかもその人間が自分よりレベルが高く,他人にプログラミングを教える余暇と能力があり,適切にポインタを指し示すことができる確率は,いかほどのものだろう.だからこそ「メッセージを読まない超初心者」と「プログラミングできるけど教えるのは苦手な人間」がマッチして互いに苦労するという悲劇が各所で生じているのではないか.

そもそも,もとよりこの分野は極めて生存バイアスが高い分野だとはいえないか.一定レベルの教育を受けた人間に,体系的な「プログラミング」を授け,プログラミングできるようにする教科書は知る限り存在しない.「コンピュータ科学」の教科書や,型システム・オブジェクト指向といった各分野に関する教科書的は承知しているが,これはあくまで「技術書の読み方」を会得している人間のためものもであり,素人を教育するためのものではないのだ. なんらかのスキルというものは,それを体系的に達成できるようになるためのプログラム・教科書が存在していれば,初心者でもある一定のレベルに到達することができる. だがプログラミングという分野は,こうした体系的な教育を行うためのプログラム・教科書が成熟していない.

したがって自然淘汰を生き抜いたエリートがプログラミングを行うことができ,また実力でもって発展させてきたという現状がある.彼らは初心者の気持ちを忘れてしまっているし,初心者は彼らがどう考えるか理解できないのだ.またこのため,プログラミングができるエリートの要求は苛烈なものになりがちである.「わかりやすい変数名」「エラーメッセージを読む」といった慣行は,当然われわれプログラミングができる人類にとって受け入れられているマナーであるが,初心者にとっては非常に負担で苛烈なものだといえないだろうか.俺は,ちょうど文明に接触したことのない人間の集団が,文明圏に入ろうとしたときの負担をイメージしている.

そこで「エリートが受け入れている文明」について考えてみたい.「プログラミングができる」とわれわれは簡単に言うが,おそらくこれは「実用的なプログラミングができる」という意味を指しているはずだ. そこで求められるのは「道具を組合せて問題を解決しようとする能力」であり「言語機能を使える」というレベルのものではないと考える.これこそがプログラミングができる人間のスキルではないか. しかしながらプログラミングを教える・学ぶといったとき,かならずといってもいいほど「言語機能の学習」を行ってしまっているのも問題ではないかと思う. 今プログラミングができている人間は,まず「うまいこと道具を組合せる能力」を醸成し,次いで「変数・配列・ファイルといったコンピュータサイエンスを理解する」に至り,「プログラミング言語機能」を学んでいるのではないかと思ったがいかがだろう.

とりとめのない事を書いてしまった.またバッテリーがなくなってきたのでいったんここまでにする.また充電したら別の記事にしてみようと思う.

→書きました

blog.3qe.us