プログラミングできない先輩!
小学校からのプログラミング教育の義務化により、これからの若い人たちはみんなプログラミングができるようになるかもしれません。ということは、現在大学生くらいの人たちは後輩から「プログラミングができない先輩」というレッテルを貼られて馬鹿にされる、という未来が垣間見えます。これはあたかも、Windowsが普及して事務処理がPC化したときに、「ワープロのできない上司」を陰でコケにしていたのと似た構図。
「ワープロのできない上司」は10年もしたら定年でいなくなってましたが、「プログラミングができない先輩」はこれから40年近く現役。その間ずっと馬鹿にされ続けるというのはいたたまれないんじゃないかな。ま、教育を受けたからといって全員がプログラミングできる人になるとは限らないし、現状の教科書を見る限りそうなる可能性は極めて低いですけど、馬鹿にされるかもしれない当事者にとっては気が気でないと思うのです。いや、そういう焦りを感じていない人は焦りを感じた方が良いよ。
文科省のプログラミング教育
小学校からのプログラミング教育において決定的にかけている視点が、「プログラミングとは何か?」ということだと僕は思います。狭義のプログラミングとは、何らかのコンピュータ言語を用いて正常の動作するコードを作成することです。でも、コンピュータ言語なんて5年10年で流行り廃りを繰り返すもの。学校で特定のコンピュータ言語を教えることは非合理的です。小学校で一生懸命勉強した言語が大学卒業時にはゴミくずになっていたとしたら、やるせなくなりませんか?
小学校でのプログラミング教育において結構真剣に議論された事柄の一つに、多くのコンピュータ言語ではキーワードに英語(英単語)を用いるが、小学生に英語(アルファベット)はなじみがないので教えにくいというものがあります。キーワードとして日本語を用いるコンピュータ言語や、グラフィカルインターフェースでプログラミングするScratchという言語、さらに日本語化されたScratchなどが検討されました。ただ、小学生だと日本語であっても難しい漢字が使えなかったりするので、日本語化Scratchでも問題が解決しません。NHKの教育番組では漢字交じりの日本語化Scratchを使ってましたけど、どの学年向けだったんだろう?小学校での英語教育義務化に伴い、無理して日本語化しなくてもよいのでは?という機運が出てきているような気配があります。どうなるのかな?
ま、でも小学生だと「ゲーム作りたい!」とかなると思うのです。僕もそうだったけど。でもゲームを作るには果てしないプログラミングスキルが必要で、そのギャップを目の当たりにした子供たちはきっとプログラミングをあきらめるんじゃないかな。プログラミング教育の推進がプログラミング教育を阻害するという意味の分からない状況です。
言葉の問題や理想と現実のギャップの問題があるんだから、狭義のプログラミングを教えるのはよくないんじゃないか?という意見があり、文科省は「広義のプログラミング」を指導する方針にやや方向転換しました。「広義のプログラミング」とは、コンピュータ言語を直接用いなくてもプログラミングの発想が要求される問題に対して取り組む際の考え方のことを指します。例えば、レゴブロック的なものを用いてロボットの動きを制御するとか、そういうやつです。コンピュータ言語の縛りはなくなりましたが、プログラムのメタファーがしっかり残っているところ中途半端です。
プログラミングとは何か?
そもそも僕たちはプログラミングを学ぶ必要があるでしょうか?大抵の大人はプログラミングができません。でも世の中何とかなっています。だから、プログラミングスキルは必須ではない気がします。必要か不要かで言えば不要です。それでもプログラミングを学ぶことは役立ちます。
どんな作業でもよいのですが、その作業がいくつかの工程を含んでおり、その工程の順序などが正しくないと作業が失敗してしまうとき、その作業はプログラムと似た特徴を持ちます。
例えば、インスタントコーヒーを作るとしましょう。まず、湯を沸かします。その間にカップを用意し、そのカップにインスタントコーヒーの粉を入れます。お湯が沸いたらそのカップにお湯を注ぎ、お好みで砂糖やミルクを入れます。砂糖やミルクを入れる場合は、ティースプーンでかき混ぜます。砂糖やミルクを入れずにコーヒーを配膳する場合は、ティースプーンを付けます。
このとき、お湯を注いでからコーヒーを入れるとコーヒーの粉がダマになったりしておいしくありません。また、コーヒーの粉を水に溶かしてからなべにかけると風味が飛んでしまいます。砂糖やミルクを入れてかき混ぜずにお客さんに出すなんてことはまず考えられません。どの手順も正しい順番で忘れずに実施することが肝要です。このような手順の解説は一般に「マニュアル」と呼ばれます。で、その「マニュアル」は正しく「プログラム」になっています。いわゆるプログラムと異なるのは、指令の対象がコンピュータではなく人間であることです。
コーヒーの例でわかるように、複雑な作業ほど、各工程の順序や「条件分岐」が大事なります。これもプログラムの特徴と同じです。
プログラミングとは計算機が実行可能な手順書を作ることです。ということは、「マニュアルを作成する」という作業はプログラミングと類似の作業であるということです。マニュアル作成なら誰にでも機会があるように思いますので、そういう意味ではプログラミングを学ぶ意義はあるかもしれません。
プログラミング適性
プログラミングに適性のある人とない人が両方存在するというのは割とよく知られています。このことをはっきりと言ったのはプログラミング界隈のレジェンドの1人、Donald Knuth博士です。Knuth博士は「およそ50人に一人、プログラミング適性を持つ人がいる。学歴は一切関係がないようだ。」と言及しました。Knuth博士はスタンフォード大学の情報学科?の教授であり、その情報系の学生でも適性を持つのは50人に一人というのです。さらに、文系理系は問わないともいうのです。実際、プログラミングのコモディティー化が進んだ現在では、女性プログラマーは珍しくないし、なんなら主婦プログラマーなんてもたくさんいます。だからKnuth博士
恐ろしいのは、プログラミングを志すエリート集団においてすら、50人に一人というルールが見られるという点です。知性に関するセレクションを受けているのに適性者の割合は増えないのです。さらに恐ろしいことに、プログラミング適性を持つ人の能力は適性の無い人の能力の100倍以上あるということです。なので、Knuth博士は、自分の学科のミッションはプログラミング適性を持つ学生を確実にピックアップすることだ、とすら言ってます。学生を指導して育てるべき大学教授が、教育を放棄するようなことを言うのです。
ま、実際、Knuth博士の言うことは概ね正しいので、なかなか反論できません。僕の経験上も、スペシャルな人は50人に一人か、もっと少ないかもしれません。多分、ほとんどの人はプログラミング適性がほんとに高い人々と出会ったことがないと思います。僕と同じかそれ以上のプログラミング適性を持つ人は、僕以外に2人しか出会ったことがありません。その人たちは普通の人とは全く違います。二人とも社会不適合ですが、一人は周囲の人々に才能を認められ、大事にされています。もう一人は、いま、どうなっているんだろう?
特別なプログラミング適性がなくても、そこそこのプログラム(100行くらいまでのコード)は作れます。でも3人に2人は、そのレベルの適性もありません。僕の経験上、まったく適性のない人は、どれだけ指導しても全く上達しません。その理由は、「性格」に尽きます。
プログラミング適性は性格と強い相関がある
プログラミング適性のある人は、性格に共通の特徴があります。それは「自力本願」を第一に考えるということです。課題や困難があったとき、まずは自力で取り組み、可能なら自分の力で課題や困難を解決する傾向があります。
プログラミングは一種のマニュアル作りです。マニュアルは一度作ってしまえば、同じことを2度とする必要はありません。だから、他人の力を借りてプログラムを作成したとして、果たしてそのプログラムを書いた人は誰か?ということになります。それは決して自分ではありません。
プログラミングは、自分自身でプログラムを作成した経験がスキルに直結します。たくさんコードを書いてきた人ほど、プログラミングが上手なわけです。他人に頼ってプログラムを書いてもらっても、人の書いたプログラムを拾ってきてコピペしても、自分のプログラミングスキルは向上しません。だから、他人の力を頼みにする「他力本願」な人はプログラミング適性がありません。
一般に他力本願な人はコミュニケーション能力が高い傾向があります。というのも、課題解決を他人にお願いするわけですから、他人とのコミュニケーションが必須です。お願いを通すには、そのコミュニケーション能力が高くないといけません。これまでの人生で他力本願がメインだった人は、そのたびにコミュニケーション能力が磨かれ、その能力に頼るようになります。その結果、自力での問題解決能力が向上せず、自力本願な考え方が消えてしまします。
一方、自力本願がメインの人は、コミュニケーション能力が重要ではないので、コミュニケーション能力は劣っているか、せいぜい人並です。高いプログラミング適性がある人は、極端な自力本願傾向があり、コミュニケーション能力がとても低い場合があります。その結果、プログラミング適性と社会不適合性とに強い相関がみられるようです。
プログラミング適性があってもコミュニケーション能力が高い人々がごく少数います。そういう人は実は女性に多いようです。これは女性のコミュニティーの特徴に基づくと僕は思っています。
女性のコミュニティーでは課題を解決する際にちょっとした特徴があります。それは、自分のできる役割を皆が率先して立候補するという傾向です。女性は失敗を極端に嫌う傾向があります(これは幼少期からの女性教育が影響していると思います。詳細は割愛)。そのため、「簡単な作業を引き受けて、難しいことをさせられるのを避けたい」と考えているようです。その結果、自分ができる簡単な役割を早めに確保するわけです。そうすると、最後に難しい仕事が残ります。その最後に残る仕事を誰が引き受けるか、というのが問題になります。発言の順序はコミュニティーでの序列に強く依存するので、最後に残るのはコミュニティーでの序列が最低な人あるいはコミュニケーション能力が低い人になります。そういう難しい仕事は「他人ができない仕事」として残っているわけで、「自力本願」しか解決手段がありません。ということで、そういう残り物係の人は自力本願傾向が強くなり、プログラミング適性があります。手芸とかを趣味にしている主婦はプログラミング適性が高いことが多いです。
コミュニティーに優秀で頼りになるリーダーがいると、そのリーダーが最後に残る仕事を引き受けるということも多いと思われます。なので、行動派のリーダーは自力本願傾向が強くなります。その結果、プログラミング適性が高くなります。ただ、コミュニティーのリーダーなので、コミュニケーション能力も非常に高いです。おそらくこの場合のみ、コミュニケーション能力とプログラミング適性が両方高くなります。こうした人々は管理職としての能力も高く、プロジェクトマネージャーとして極めて優秀です。
音楽をやる人は、案外プログラミングができます。アルゴリズムは日本語で算譜と書くことがあり、音楽の楽譜に対応します。楽譜には「繰り返し」に関するたくさんの規則があり、これがプログラミングにおける「ループ」の概念に通じます。シンセサイザの打ち込みコードはまさしくプログラムになっていて、DTMをやるひとはそこそこプログラムが書けます。
プログラミングスキルのポジティブフィードバック
プログラミング能力(速度)は、これまで書いてきたコード量の対数に概ね比例するという感触を持っています。誰でも最初は初心者なので、プログラミング適性が高くても最初のプログラミング能力は普通です。自力本願の人は、自力解決を目指すため、サンプルプログラムを書きうつす作業でさえ、「自力で書けるか」「自分に足りないものは何か」などを確認しながら行うので、プログラミング能力の向上に寄与します。他力本願な人は単にタイプするだけなので、能力向上につながらないのです。
最初の一歩から学習効果が違っていて、それがフィードバックされます。最初は10行程度のコードが書けるだけだったのが、10行分の経験値を得て、次は11行書けるようになります。合計経験値は21行になり、次は12行書けるようになるかもしれません。
適性の無い人は、最初の10行を作ったとしても、経験値的には2行ウ分かもしれないのです。次のコードはやはり10行どまり。それを5回繰り返してようやく11行です。適性のある人は、5回も繰り返すと、合計経験値は70行くらいになっており、コード量も20行に近くなるわけです。たった5つのプログラム作成経験で、能力差が倍近いというのは、通常の学習では考えられません。
適性のある人は、あっという間にプログラミング能力を拡大させます。ちなみに僕が初めて1000行書いたのは、プログラミングを始めて1カ月位したころ。1000行書くというのは下っ端プログラマとして就職するレベルで、専門学校等ではおよそ3年かかります。当時僕は中学2年だったので、中卒でプログラマになるという進路を真剣に考慮しました。
小学校でプログラミング教育が始まって数年たちますが、おそらく適性のある子は教師の能力をはるかに超えていると思います。そういう子供たちをどのように扱うかをそろそろ真剣に考えないといけないと思うのです。日本では英才教育とか、ギフテッド教育とかなじみがないので、とても心配です。
プログラミングには数学とか理科の素養が必要です。子供はそういうのをちゃんと勉強していないので、プログラミングスキルをあんまりもてはやすべきではないと思います。プログラミングに関する専門知識はとても膨大です。順を追って身に着ける必要があり、時間がかかります。10年くらいはかかるかな~。周辺知識もたくさん必要です。だから、プログラミングを英才教育する必要はないと僕は思うのです。英才教育をするなら、プログラミングの周辺知識を教育したらよいと思います。
とにかく、数学は大事です。将来の最重要分野である人工知能では「行列」が大活躍します。ちょっと前の教育改革で行列は高校で学ばなくなりました。人工知能が注目を浴びつつある状況下でのあまりに軽率な決定に唖然としました。ということで、これからのプログラマは最低でも大学1年生レベルの数学知識が必要なのです。それを理解するための基礎となる数学ももちろん必要です。プログラミング教育とか言う前に数学の教育内容を整理すべきです。
プログラミングができない人のパターン
Knuth博士によると文系理系は関係ありません。ある種のタイプの人はプログラミングに適性がありません。それは「結果のみを求める人」「他人に頼ろうとする人」「暗記で勉強を乗り切ろうとする人」「集中力が続かない人」です。
最後の「集中力」の話は後回しで、その他の項目は基本的に根っこが同じです。課題に対して、とりあえず乗り切ることを最優先し、乗り切ったらそれで終了と考える人は要注意です。短期的な効率は高いように見えますが、同じ課題に出くわしたときには同じ苦労をすることになります。生涯にわたって一回だけの課題であればそれでよいですが、そんなことは稀です。結果のみを求める人は課題に取り組む過程で出くわす学びに価値を見出しません。他人に頼るとそもそも学びの機会はありません。暗記に頼る人は、同じ課題には対応できますが、似た課題には対応できません。学びを軽視しているのです。学びの効果は一生涯続くので、長い目で見れば学びを大事にして、結果が遅れたり余計な苦労をして学びを得る価値は十分にあります。
プログラミングでは常に学びがあり、再現がありません。プログラミングの醍醐味の一つに「最適化」があります。最適化とはコードの簡潔さ、実行の速さ、メンテナスの良さなどを求めてプログラムを改善する行為です。最適化せずともプログラムは正常に動作し、目的を達せられます。だから、結果だけを見れば最適化は無駄に見えます。でも、プログラミングでは最適化がもっとも楽しいのです。最適化には学びがあります。今まで気づかなかったことに気づいて、パズルを解く楽しさがあります。それを楽しいと思う感性がとても大事だと僕は思います。
プログラミングは組み合わせを見つけ出すパズルのような側面があります。プログラミングはレゴに例えられることも多いです。プログラミングを構成する既知の要素(例えば基本の文法事項やライブラリなど)をうまく組み合わせて望みの動作を実現することがプログラムです。各要素はレゴのピースのようなもの。レゴピースに様々な形があるようにプログラミング要素にもいろんな種類があり、組み合わせに制限があったりします。そういう制限をうまく利用して、くみ上げるのがプログラミングの醍醐味です。
そういった行為を行うには集中力が必要です。難しいパズルを解くのに膨大な時間がかかるように、プログラムを作るのには時間がかかります。訓練でその時間はどんどん短くなりますが、だれでも最初は初心者。必要な時間をたっぷりかけるためには集中力を持続させねばなりません。その大事な集中力が足りない人はプログラミングに向きません・
プログラミングスキルはこれまで書いたコード量の対数に比例する
僕の経験ではプログラミングスキルはこれまで書いたコード量の対数におおよそ比例します。「書いた」というのに「書き写した」は入りません。
プログラミングを学ぶ際は、まずサンプルコードを書き写して動作を確かめます。プログラムを動かすことを目的だと思っていると、コードに注意がいきません。だから、そこに学びはありません。コードの動作を確かめ、動作とコード内容の対応を読み解くことで学びがあります。この動作とコードの対応をちゃんと確かめるかどうかで、最初の一歩に差が出ます。プログラミング適性の無い人は課程よりも結果に興味があるので、プログラムが動作したらそれで終わりになります。だからスキルが向上しません。
次に練習としてちょっとした書き換え課題があったとします。動作とコードの対応をちゃんと理解していれば、どこをどのように書き換えればよいかは簡単にわかるような設定です。その中で学びが設定されているわけです。でも動作とコードの対応を理解していないと、どうやればよいかわからないので誰か別の人に尋ねることになります。親切な隣人はやり方を教えてくれるでしょう。そして課題をこなせるわけですが、結果にだけ興味がある人にとっては結果が出たらそれでおわりなのですから、そこから学ぶことはしません。
ここまでで書いたコードは10行程度でしょうが、適性の無い人は学びがないので、経験値を得られません。次の課題はもっとひどいことになるでしょう。そして、あきらめるのです。さて、どこに問題があったでしょう?
プログラミングスキルは経験値に正の相関があります。というか、自分で書いたコード量を経験値とするなら、プログラミングスキルは経験値のおよそ対数に比例します。これはRPGにおける経験値と能力値の関係にみられる一般的な関係です。この関係は「学習曲線」に基づきます。
Wikipediaによると、$n$個目の商品の生産コスト$C_n$は$C_n=C_1 n^{-\alpha}$であらわされます。$\alpha$はコスト弾力性と呼ばれる値です。これをプログラミングスキルに当てはめると$n$はこれまで書いたコード量(行数)、$C_n$は1行を書くのに必要な「苦労」になります。プログラミング能力は$C_n$の逆数に概ね対応します。
プログラミングスキル(レベル)は概ね作成可能なコード量の対数になります。10行程度で初心者、100行で中級、1000行で駆け出しの職業プログラマ、というのがおおむね常識的なところです。1万行だとエース級、10万行だと超級です。
10万行以上は行数ではカウントできません。タイピング能力の限界があって、10万行をタイプするのに数カ月必要なるからです。10万行になるとオリジナルなプログラミング言語(大体2~4万行)をプログラムに組み込むことができます。そうするとコードが圧縮されます。このコード圧縮によって、実質100万行相当のプログラムが作成可能になります。100万行相当というのは伝説級です。そして、おそらく1000万行相当クラスというのが存在するかもしれません(未確認)。1000万行だとOSが丸ごと作成できます。そのレベルのプログラマは神話級ですかね。
ということで、プログラミングスキルは$\log{C_n^{-1}}=\alpha \log{n}-\log{C_1}$という式が導けます。つまり、プログラミングスキルはこれまで書いたコード量(行数)の対数に比例するということがわかります。(証明終わり)
プログラミング適性のある人は、どんどん経験値(コード量)を稼ぎ、スキルアップします。最適化に取り組むのは効率の良い経験値稼ぎです。最適化が性に合うと経験値がどんどんアップするので、プログラミング能力の成長が加速度的に向上します。あっという間に差がつくわけです。
1000行程度のプログラミングスキルはプログラミングを専門に学ぶ学生が3~4年かけて身につける技術レベルです。一般の教師がこのレベルに達していることは稀です。しかし、適性のある子どもは2~3カ月でこのレベルに達する場合があります。1000行程度が書けると、まあまあのゲームなんかでも収まるので、子供は嬉々として取り組むでしょう。その先のレベルはいろいろ勉強しないとだめなので、子供にはやや難しいかな。
いずれにせよ、学校の先生が指導できるレベルなんて早々に超えてしまいます。子供は簡単に増長しますから、指導を誤ると危険です。1万行クラスに至るにはプログラミング以外の知識が重要になります。最近なら、ネットワークプロトコルとか並列処理とかAIとか。複数言語を使いこなす訓練も大事です。高卒レベルの数学は必須です。英語のドキュメントを読む能力も必須です。可能なら機械翻訳に頼る必要がないレベルまで習熟した方が良いです。そういう周辺知識の習得は小学生には無理なので、そういう知識を身につけるために勉強を頑張りなさい、と指導するしかありません。
自分で課題解決するメンタリティー
僕は職業プログラマの人たちとも仕事をした経験があります。優秀な人は自分がプログラムを書くという前提に立ち、学習に臨みます。ちょっとした数学が必要だとします。普通の人は理解があやしい部分があったとしても、全体的に理解していれば学習完了と判断します。でも優秀なプログラマはそういう「理解が怪しい部分」があると、その部分をしつこく質問します。なぜなら、その知識を用いてプログラムを作ろうとすると、一か所でもわからない部分があったらプログラムが完成しないからです。理解のレベルのが数段高度にあるのです。
プログラマとして優秀な人ほどこの傾向が強いように感じます。僕は中学生のころにプログラミングを始めたので、高校生のころにはこうしたメンタリティーにどっぷりつかっていました。特に効果があったのは物理です。原理原則を理解して組み合わせて課題を解決するという物理の哲学はプログラミングに通じるものがあります。原理原則の学習には普通の人より時間がかかりますが、理解してしまえばあとは勉強が必要ありません。特に物理では理解の深さが重要で、問題が解けるかどうかではなくて、問題を解くのに必要となる物理法則の選定、適用方法、組み合わせ、結果に対する予想など細かな部分まで理解しておくと応用が利きます。その応用は他の単元あるいは科目でも同じように利くので、指数関数的に得点が伸びます。問題のパターンを覚えるより、はるかに効率的です。
一つ一つの基本的な課題を時間をかけてじっくりと理解し、わからない部分をなくすというメンタリティーあるいは問題に対する態度は、短期的には不利なのですが、長期的には有利ということです。長期的な利益を見据えて学ぶという戦略は現在の学校教育では割を食ってしまうわけで、プログラマ向きのメンタリティーを持つ人々が割と冷遇されている理由なわけです。冷遇されているので、そういう人たちは目立たないので、実態がわからず、わけのわからない教育改革がなされているんだと思うのです。
プログラマは効率を重視します。掛け算の効果を熟知しています。効率20%アップと50%アップの2つがあったら、$20+50$の70%ではなく、$1.2\times 1.5=1.8$の80%アップになることを知っています。最初の経験を生かして2回目に20%アップ、3回目でさらに50%アップと段階的に効率アップするより、最初の課題が遅れても最初に80%アップまで効率化すると、最初の課題は時間がかかっても2回目以降は爆速になることを知っています。そして、効率化はやっつけ仕事より常に有利であることを知っています。だから、最初に時間をかけて学ぶことは無駄にはならないと知っています。そういうメンタリティーを持っているということがプログラミング適性です。そしてそういうメンタリティーはプログラミングの経験を積み重ねていく過程でさらに強化されます。
学生にプログラミングを指導する苦労
僕は研究室の学生にプログラミングを指導することがあります。必ず本人の意思を確認し、適性を見ながら指導内容を決めます。なるべくプログラミング以外の要素を多く設定し、その間にプログラミングスキルの熟成を待ちます。
プログラミング言語の文法に関する学習をなるべく少なくします。高校の時の英語の先生が変わった人で、大阪大学の英文科卒業だけど、英会話はできないと公言してました。でも、文法は自信があるとも言ってました。そして文法は大事だけど文法を知っていても英語は使えないと自身の経験とともに教えてくれました。同様にプログラミング言語も文法を勉強してもプログラムは書けません。プログラミング言語も英語と同様に言語の側面をもつので、使わなければうまくなりません。文法を学ぶというのはその言語を使うこととは違うのです。
ChatGPTは使ってもよいですが、参考にとどめるべきです。ChatGPTの出力するコードは簡単なものなら動作しますが、ちょっと複雑なものになるとすぐに誤動作します。想定している動作をしない場合に、どこがダメなのか特定する能力がないと、すぐに行き詰ります。どこがダメなのか特定するには、コードを読み解いて、動作を追う技術が必要です。読み解いた動作と想定している動作の違いを分析し、想定している動作になるようにコードを書き換えます。これは紛れもなくデバッグ作業です。プログラミングスキルが中級くらいだと、デバッグがプログラミング時間の大半を占めます。ChatGPTは100行のコードを楽々出力してくれますが、その中には複数のバグが必ず混入します。そのバグを取り除く作業は自力で100行書くよりおそらく時間がかかります。他人のコードを読み解くのは初心者にはつらい作業だからです。さて、あなたはChatGPTを使いますか?
結局のところプログラミングスキルの向上にズルはできません。AIを使っても結局は自力の勝負。時間をかけてトレーニングしないと能力の向上はありません。常に学び続ける必要があるのです。そのためには学び続けることを苦にしないメンタリティーが大事です。学びを行動原理に組み込むというのが早道だと僕は思っています。あらゆる行動・結果から学びを得るという貪欲さが大事だと思います。学ぶことは苦痛を伴います。放っておくと人は学ぶことを避けるようになります。学びに価値を認め、喜びを見つけることができる人は何事にも適性があると思います。学びに価値を認め、喜びを見つけるというのは能力ではなくて、むしろ性格の問題です。つまり、プログラミング適性は性格に依存する、ということです。QED。