プログラミング学習の通過儀礼
プログラミング学習とはそもそも何なのか
プログラミング初学者やITに関わる人が最初に知るべきこととして、プログラミングとは「あなたが問題を解決するのに用いたい手段を、あなたが思っているようにコンピュータに入力すること」ではない。
実際には、プログラミング学習はコンピュータに可能な(非常に限定された)処理セットを学ぶことであり、その応用の先に当初のゴールが含まれるかは、プログラミングを学んでその特性を学ばないと、判断すらできない。
例えば、手段 A によってゴール X を達成したいとしよう。非プログラマ/プログラミング初学者の発想は、よほど目の付け所がいいのではない限り、次のいずれかに分類される。
- A には同じゴール X を解決する簡易な代替手段 B があり筋が悪い。 A で実現するほどの価値がない
- A は現状の人類の既存のソフトウェアの応用では実現できない。あるいは非常に困難。無理に実現したとしても不安定(いわゆる「一応可能です」)
- A はこの宇宙の物理法則下では実現できない (特に計算オーダーや光速度に起因)
まず自分の発想が 1 かどうかを判断できないといけない。経験を積むほど問題の認識方法そのものを用意して、代替手段を選択できるようになる。
2 は長時間取り組んだり、場合によって会社を作ったりする必要があるが、そもそも実現する価値があるか?という判断がセットになる。大抵はないか、あるとしても人類最高の英知の集団が必要になったりする。本当にそれをやる価値があるのか。
3 はどうあがいても無理だが、ゴール X をちょっとずらすことで 1 や 2 に変化したりする。
プログラミング学習のイニシエーションとして、この技術制約を、必ず、受け入れる過程がある。これができない人は、プログラミング学習が始まらない。
プログラミングは「与えられた問題をコンピュータの視点で再定義し、再定義された問題空間を分割し、分割された対象に対して個別にプログラムを書いて解決していくこと」であり、いわゆるプログラミング学習は、手段を学ぶことで認識の視点を得ることである。対象を正しく認識・言語化せずに、プログラミングで解決することはできない。
先に、よほど目の付け所がいいのでない限り、但し書きを添えたが、これには本当に注意が必要で、特に経験が足りない人ほど自分は目の付け所がいいと思い込んでいたり、自分の発想は他にない新しいもの、と思ってるフシが多く、その無駄な自信を捨てる/叩き折る必要がある。自分もそうだった。
何がいいたかったかというと、巷ではプログラミング学習は作りたいものがあると学習が早いと言われており(要出典)、その最初に設定したゴールを情熱を持って実現することがある種の美学として語られている気がするのだが(要出典)、目的志向が強い人ほど最初のゴールが困難なときに詰む可能性が高い。プログラミングで可能なことが、プログラミングを学んでいない人間の直感に反することが多い以上、ゴールの困難さは事前に知ることができない。
自分も最初は作りたいものがあった気がするが、あくまで最初のきっかけにした上で、時折振り返って現時点での自分の能力と突き合わせて実現可否を考えつつ、「そんな時期もあったね」と振り返るぐらいでいいと思う。
夢のない話だが、自分が作りたかったものをよくよく探してみると他の誰かが別のアプローチで実装していて、それが使われず廃れていたりする。あなたが思いついた最初の(大切な)アイデアは、それが流行っていない真っ当な理由とセットになって、ネット上に転がっているものだ。
というのを 未経験者がプログラミングを学びたいと思った時に最初に読む記事 を読みながらふと思った。
Discussion