見出し画像

個人的プログラミング教育コラム

年明けから数日、『すべての未経験者にプログラミングを叩き込むことは可能か?』という記事がいくつかネットに上がりました。それらを読んだ上で感想や僕の考えを書いてみたいと思います。

最初に感想とか与太話を書いて、後半で自分の考えを書きます。

まずはこれ。

『お前は絶望的にプログラミングに向いてないから諦めて刺身にタンポポ乗せる仕事でもやってろ』という刺激的なタイトルが良かったのか大いに受けて、一連のプログラミング教育論の発端となりました。

数々の名言が刻まれています。是非全部読んでください。意味が分からない部分はそのままスルーしても大丈夫です。分かる部分だけ理解してください。

『そもそも人類というのはプログラミングできない可能性がある。』

『プログラミング、6年やってミットを頭にかぶってるバッターとか、鍵盤蓋の上から殴って音鳴らそうとするやつとか、まずそういうレベルのやつが大量発生するんですよ。』

『名言の引用は好きではないけど、「プログラムは思った通りには動かない。書いた通りに動く」って言葉がある。実に名言だと思う。』

『変数に名前をつけろ。関数に名前をつけろ。クラスに名前をつけろ。全てに名前をつけろ。』

『おいJava受けてる2年生、オブジェクト指向やってるか?やってるか、そうか、ははは。オブジェクト指向なんてゴミだけどな。』

『お前らは絶望的にプログラミングに向いてないから今すぐ諦めて刺身にタンポポ乗せる仕事やってろ。』

『あとどうでもいいけど私はプログラミングは小学生の頃から10年以上やってるんだけど、平均的なプログラミング初心者にだいたい1.5年ぐらいで完全に技術抜かれる。悲しい。誰か慰めて。』

最後の部分、僕も同感です。26年プログラム書いてますが僕がプログラミング始めた頃に影も形もなかったような20代とかが高度なことやってたりします。でもそれでいいんです。

自分が得意な分野で頑張って身の丈にあった生き方をすればいい。

で、僕はプログラミングは誰でも出来ると思っています。一般レベルのプログラミングやアプリ開発で才能は関係ありません。確かに天才はいるけど、凡人でも世界を変える製品は作れます。

次。

いくつか抜粋。全体は是非読んで欲しい。そんなに長くないし。

『一定レベルの教育を受けた人間に,体系的な「プログラミング」を授け,プログラミングできるようにする教科書は知る限り存在しない.』

『「わかりやすい変数名」「エラーメッセージを読む」といった慣行は,当然われわれプログラミングができる人類にとって受け入れられているマナーであるが,初心者にとっては非常に負担で苛烈なものだといえないだろうか.』

『求められるのは「道具を組合せて問題を解決しようとする能力」』

『プログラミングを教える・学ぶといったとき,かならずといってもいいほど「言語機能の学習」を行ってしまっているのも問題ではないかと思う』

僕は体系的なプログラミング教育を受けてます。商業高校の情報処理科で3年間勉強して、大学でもちょっと受けたけど高校の方がレベル高かったので、気づいた以降は一般教養の方を多く取ってました(商業高校の授業は実はすごい)。

高校の授業は当時あった『情報処理技術者試験第2種』とか『情報処理技術者試験第1種』を取らせるのが目的で、2種を取れるのは3割くらいだったか。1種を取れたのは僕だけでした(だって、1種の試験は高3の春くらいしかチャンスが無くて、実質高2の終わりだからね)。

試験内容はコンピュータ科学全般とプログラミング。符号化とかエラー訂正とかメモリとかレジスタとか通信とかビット操作とか、大事なことは大体情報処理技術者試験で学びました。

また、2種と1種とは別に全商(全国商業高等学校協会)の情報処理検定で1級を取らなくてはいけなくて、1年生の終わりに全員が合格します(たぶん全員合格した)。内容としてはそんなに高度じゃないけど1年生が取るのはなかなか難しい試験ですよ。多分、多くのプログラミング初学者は大人でも落ちます。それを16歳で全員取る。

授業では経営数学なんてもあって、行列演算で連立方程式を解くとかやってました。

あとは『電算部』という部活に入ってたのでひたすらなんか作ってました。授業よりはこっちの方がプログラムをよく書いてました。こちらは夏にあるコンテストに応募する作品を作るのが主な活動で、通産省から賞状をもらいました(当時の通産大臣は橋本龍太郎氏)。

というわけで、結構プログラミング(というか情報処理)漬けの教育を受けました。ここ1年くらいプログラムを教えるということをしてますが、高校での経験も生きてます。

体系的にプログラミングを学べる場所はあります。ただ、普通のアプリを作るのに体系的なプログラミングの知識やアルゴリズムはそんなに必要ありません。なぜならそんなに難しいもんじゃないから。

用意されているスマホの機能をブロック遊びのように組み合わせていけばアプリは作れます。アルゴリズムなんかちっとも知らなくても出来るのが今どきのアプリ開発です。

次。

未経験で開発部隊に送り込まれると普通は死にます。研修と称して2,3冊本を渡されて「これ読んで」って感じで放置されて3ヶ月くらい経つと最前線に送り込まれて、そして死にます。

『ほほ笑みデブ』と呼びながらでもブートキャンプで鍛えてくれるハートマン軍曹の方が優しいかもしれません。

その状況でどうにか生き残るには、

・運良く周りに優しい先輩がいる。
・検索でどうにかしのげる程度の内容である。
・本人の精神がメチャクチャに強い。体力もある。

という条件が必要になります。どれもなかなか無い。

僕は就職する時点でプログラムを書けたので、研修なしで最前線に送り込まれて『48時間以内に、別のオジサンが3ヶ月掛けて書いたけど動かなかったコード2,000行をどうにか動くようにしろ』みたいな超絶無茶ぶりをこなしたりしてました。2,000行書き直した僕にそのオジサンの3か月分の給料をください。

そんだけ頑張ってボーナスも昇給もほとんどなかったので2年目の夏にキレて辞めたけど契約見直しで復帰したのは別の話。

で、当時一緒に入った新卒が2名いたけど僕より先に辞めました。プログラミングは未経験で3ヶ月くらい研修を受けてたはずでしたが辞めちゃいました。理由は知らない(2人のうち片方は嫌な奴だったので会話もしなかった)。

未経験者を『ゼロからシステムを作れるようなレベルの戦士』に育てるのは、中小IT企業には難しいんです。教育のプロに任せたほうがいいと思います。

はい、次。

2年間という時間と、専門学校という環境があれば一般レベルのプログラマーとして育てるのは可能かもしれません。一番大事なのは本人の意欲だけど。

これが企業になると3か月で前線に送れないと困るわけです。僕が教えてる教室では6週間でどうにかしないとならない。だから色々工夫することになります。

あと、僕は商業高校の情報処理科出身なので、専門学校に大金払うなら公立の商業高校の方がコスパいいんじゃね?という気もします。学校にもよると思いますが公立の商業高校は安く高度な授業を受けられます(今は無料なんだっけ?)。

次。

プログラミングには間違いなくコツがあります。

それがエラーメッセージの検索だったり、デバッグ方法だったり、フレームワークの定義を読むだったりするわけですが、そういうのはある程度出来るようになってみないと分からない。何故かと言うと、実感が無いからです。

ストーブが熱いと知らなければ触っちゃう。取り返しが付く程度に痛い目に遭わせるのも必要だったりします。

で、プログラミングの楽しさも教えなきゃいけません。じゃないと続きません。大人も子供も楽しくないことは自分からやりません。どこかでプログラミングの楽しさを体験させないとダメです。

最後。

上にも書いてますが、専門学校みたいに時間があってガッツリ拘束して勉強を強要できる場所なら体系的に文法の基礎からアルゴリズムまで叩き込めます。向き不向き関係なく。

でもそういうやり方だとプログラミングを嫌いになってしまうかも知れないし、辞められる環境の場合は辞めてしまう。僕は、プログラミングやアプリ開発を楽しいと思ってもらって、好きになってもらいたいと考えています。

体系的な教育も必要ですが、必要な知識だけ教えてあとは本人の自主性も尊重して好きなようにやらせるのも大事だと思っています。

ある程度理解できるようになってプログラミングを好きになったらきちんと文法やアルゴリズムを学ぶといいです。「そうだったのか!」という発見がいくつもあり、地力が上がります。目からウロコを落とすには最低限の理解力が必要なんです。それは、最初ありません。

では、以降はコラムで。

プログラミングは本来、誰でも出来る

僕はプログラミングは誰でも出来ると思ってます。普通に生活を送れてる人なら。

だって、日々の行動はプログラミングでしょ。掃除にしたって洗濯や料理にしたって、手順を考えて場合によって行動を少し変えているはずです。

無意識かもしれないけど、カップ麺を作るのだって『手順に従ってかやくやスープを処理して沸騰したお湯を入れて3分経ったら液体スープを入れて』みたいなプログラムの実行結果です。

すべての行動には手順や判断があります。それを一つずつ文章化したのがプログラムです。みんないつもやってることです。出来ないわけがない。

「プログラミングが分からない」と言ってる人が分かってないのはプログラミングではなく、『コンピュータに何が出来るか?』と『それをどう書いたらいいか?』という文法の問題です。それらが分かっていればプログラムを書いてアプリを作るのなんて大して難しくありません。

ただ記号を並べていくだけで、記号の書き方もキッチリ決まっています。言葉を並べて文章を書くのと大差ありません。

そこが難しいんだよと言われたら困るけど、それは頑張ってもらうしかない。頑張れば出来ます。日本語読めるならプログラミング言語も読み書き出来るようになります(たぶん)。

プログラムの動作は3つしかない

プログラムの動作は、逐次実行、判断、繰り返し(ジャンプ)の3つしかありません。上から下に流れて判断(if文)で分岐して繰り返し(forとかwhile)がたまにある。

アプリがどう動くかは、ボタンが押されたりしたらその部分のプログラムが呼び出されて書いてある通りに動くだけです。複雑なことはなんもない。

プログラムは書いてある通りにしか動きません。

画面が見えてアルファベットを読める人なら誰でもできます。ただ、努力は必要です。

頭の中にモデルが出来るまでは地獄

プログラミングの何が辛いのかと言うと『こう動くと思ったのに全然思ったように動かない。なにが悪いのか分からない』という状況です。僕は高校1年の最初の1週間で体験しました。自分が何を打ち込んでるのか分からない(まずは写経をやった)。

それがある日突然理解できて、あとは楽勝でした。

頭の中にプログラミングのモデルが組み上がったわけです。自分の考えとコンピュータの動作が一致したんですね。これは、おそらく多くの人でもそうだと思います。

頭の中でコンピュータの動作を予想して、その通りになればモデルが組み上がってるし、そうでないなら頭の中のモデルがおかしい(コンピュータ側が間違っていることはほとんどありません)。

とにかく書いて、読んで、コンピュータと頭の中のモデルが一致するまで耐えてください。どのくらいの時間で一致するかは個人差があるかも知れませんが、いずれ理解できます。

それまでは地獄でしょうけど。

いちばん大事なのは『目的がある事』

誰でも書けるようになると言っておいてなんですが、目的がなくプログラミングを勉強しようとしても難しいです。無目的で学ぶには知っておくべきことが多すぎるからです。

作りたいアプリやサービスがあるとか、プログラミングを習得して教える側になりたいとか、なにか目的がなければプログラミングなんかやらないほうがいいです。

目的なしのプログラミング学習なんて、無意味に穴掘って埋め戻してまた掘るようなもんですから。ただ辛いだけです。プログラミングに向き不向きがあるとしたら、唯一これ。

目的がある人は向いてます。目的がなくプログラミングを学びたいという人はツラいだけだからやめておいた方がいいと言っておきます。

高速道路はあるけど、下道を走ったことがないと良さが分からない

プログラミング学習において高速道路は確かにあります。僕がやってるのもそういうものです。短期間で未経験者にプログラミングをたたき込みます。アプリを作れるようになってもらいます。

でも、高速道路しか走ったことがない人は高速道路の良さや必要性が分からないことが多い。なので、あえて下道を走らせて非効率に時間と努力を浪費してもらう事もします。心が折れそうだなと感じたら助けますが、ヒドイ目に遭ってもらわないと高速道路のありがたみは分からないからです。

プログラミングは複雑で終わりのない世界です。最後は自分でどうにか出来ないとどうにもならない。その為には結局、下道の走り方も知らないとダメなんです。

僕がやってる教え方

門前仲町でプログラミングを教えてますが、

まずは、簡単なアプリを作って貰って、自分のiPhoneで動かしてもらいます。徐々に条件判断や計算などを教えますが、最初はアルゴリズムもやらないし文法も最低限しか教えません。

アルゴリズム(FizzBuzzから金種計算、カレンダー計算など)は全部のLessonが終わってから教えています。だって、そこまで必要ないから。文法も必要な部分しか教えません(希望があれば組み替えますが)。

TODOアプリを作るのにアルゴリズムの知識はほとんど必要ありません。そのくらい今のアプリ開発は簡単になっています。

日付の計算とかもAPIあるしソートも自動で高速にやってくれます。自分でクイックソートを実装する必要はない。そのうち必要に応じて『教養』として勉強すればいい。

最初の体験講習ではとにかくアプリを動かしてもらって、「自分のiPhoneで自分が作ったアプリが動く面白さ」を体験してもらいます。大抵、Lesson3の『テキストを読み上げる』をやると歓声が上がります。

ボタンを押したらiPhoneが文章を読み上げるだけの単純な内容ですが、間違いなくウケます。まずは楽しさと、ごく初歩的な動作原理を知ってもらうことが大事です。

楽しくないことは続けられないですからね。

iPhoneとMacがあれば途中まで無料でやれます。是非家でやってみてください。

無料の体験講座もやってます。是非いらしてください。

楽しい部分をやってもらってプログラミングにハマったくらいの段階で、しっちゃかめっちゃかになるのを分かった上でオリジナルのアプリを作ってもらい、破綻させます。大抵最初のアプリはカオスになって死にます。動かなくなったりメンテ不能になったりする。で、作り直してもらう。

そういうツライ事はある程度ハマってからじゃないとツラすぎて辞めちゃうから最初からはやらせません。でも、ヒドイ目に遭うのも必要です。じゃないと身に付かないものがあるからです。

初心者が理解しにくかったもの

教えていく中で、『え、そこ分かってなかったの?!』と驚いたことがいくつかあります。もちろん説明はしています。テキストにも説明が書いてあるしホワイトボードで解説もします。それでも理解できない人はいます。

代入が分からないらしい

まず『=』で代入と言うのが理解できないみたいです。理解できないことが理解できないのですが、そういうものみたいです。まぁ、算数的には=は代入と言うか『同じ』という意味ですから気持ちは分からないでもない。

でも数学の方程式で『X=5、Y=10のとき』とか書かれてたら、Xは5でYは10として計算するじゃないですか。それと同じです。

こういう『そういうことになってる』を素直に受け入れられる人はプログラミングに向いてます。だって『そういうことになってる』以外に理由なんて無いんだから。そこでグダグダ悩むタイプは考えるのやめてください。暗記で乗り切れ。

変数の概念についても、箱に例えたり色々あるけど、最後は『そういうことになってる』としか言いようがないので、受け入れてもらうしかありません。原則は素直に受け入れてください。理屈は考えなくていいです。

もし理屈から知りたいのならマシン語を勉強するといいです。とても時間掛かりますが、全ての理屈はマシン語にあります。

スコープが分からないらしい

"{"と"}"でくくられた範囲が一つのブロックですよ、この関数(ファンクション)の範囲はここの"{"からここの"}"ですよと説明しても、平気で{}の外側にコードを書いたりします。

『そこに書くと腹膜炎になります、ちゃんと胃袋の中に入れてください』とか言ったりしますが、平気で腹膜炎になるようなコードを書いて文法エラーになり、意味が分からないと言われたりします。よく見ろ。"{"と"}"で範囲が示されているだろう。君の眼には"{"と"}"が見えないのか?

定義した変数をそのままの名前で使える範囲はスコープの中だけですと説明しても、平気で違う関数のローカル変数を使おうとします。適用される範囲の説明も非常に伝わりにくい。

プログラムを読むときは"{"と"}"の対応に注目してください。一番大事と言って過言ではありません。

クラスの説明は理解されない

クラスの説明は最初にしてもまず伝わりません。なのでしばらくは説明しません。相当あとになって、実はね、と説明します。それでもクラスの概念は伝わりにくい。車や人間に例えて説明してもほとんど無理。

オリジナルのクラスを作らせて継承までやらせるとかは無理だし、必要性もあまり無いので大雑把な説明しかしないようにしてます。真面目に説明しても混乱を助長させるだけっぽいです。

開発効率化の機能はまず理解できない

なぜ関数を小分けにしないといけないのか、ViewControllerを巨大化させてはいけないのか、なぜオプショナル型とかいう訳わかんない機能があるのか、クラスはなぜ必要なのか?

それらはどれも『コードをカオスにしないようにしてプログラムをクラッシュから守るための機能や作法』なんですが、初心者はまず理解できません。なぜならカオスなコードがどのくらいの災厄を招くか知らないから。

なので、最初はどんなに汚いコードを書いても放置してます。それで破綻させます。破綻したら作り直させます。だいたい、アプリなんてのは3回くらい作り直してようやく完成するんですよ。初心者がいきなり最適な設計なんか出来るわけない。

心が折れないくらいにヒドイ目に遭ってもらいます。実感しない限り、キレイなコードを書こうなんて思いませんから。

ある程習得した人には『リーダブルコード』を渡して読んでもらいます。これも、ある程度ヒドイ目に遭ってもらってからでないと命名の重要性なんか分からないからです。最初は適当な名前でやらせた方がいい。長い名前は打ち込むだけでウンザリしてやる気が無くなります。

リーダブルコードを読んで理解できるようになって、過去のコードを読んでもらうとダメなところがたくさん見つかります。それを自分で直すのも勉強です。

開発手法は教えない

テスト駆動開発だとかアジャイルだとかは、教えても混乱するだけなので教えません。言葉と概念だけは説明しますが、実際にはやりません。開発効率を上げるための手法なんかは最初に教えてもありがたみが分からないので「なんでこんな余計な事をさせられてるんだろう?」としか感じません。

そういうのはヒドイ目に遭ってからで十分です。

どこからプログラムがスタートするのか分からないらしい

PlayGroundなら上から実行されるので分かりやすいですが、アプリになるとどこから実行されるのかよく分からないと言われます。つまり、フレームワークの動作が分からない。

例えば画面が表示されるときにどの部分が動くのか分からない(もちろん説明はしてる)。これも上に書いた通り『そういうことになってる系』の話です。挙動はフレームワークごとに違うので、ルールを知ってもらうしかありません。単純に知識の問題ですから、覚えてください。頭を使わないでいいです。覚えてください。

動かない時になにから手を付けたらいいのか分からないらしい

まずは、どう動かないのか調べること。動作が繋がってないのかデータが繋がってないのか、経路を調べます。

ボタンを押したときに期待した動作にならないなら、ボタンを押したら呼ばれるはずの関数にブレイクポイントを入れてみる。それすら呼ばれてないならアクションの接続がおかしい。呼ばれてるけど動作がおかしいのなら先に進めて、必要なら変数の中身を確認する。

期待した動作にならない場合は必ず動作やデータの状態が期待とズレています。それを探すのが第一歩です。まずは観察してください。あるいは、プログラムを徹底的に読んでください。読みながら動作をトレースしてください。

エラーメッセージが出るタイプの場合は、まずはエラーメッセージで検索。大抵は答えがどこかに書いてあります。

目的を持って書き続けるしかない

えー、結局、上にも書いてますが目的なしにプログラミングを勉強しようとしたって無理です。絶対に目的が必要。目的が無ければ、理屈として一時的に理解できても速攻で忘れます。身になりません。時間の無駄。

プログラミングに向いてるかどうか、向き不向きがあるとしたら、目的の有無です。目的がある人は強い。

目的を持ってプログラミングを勉強してください。そうすればいつか何かを作れます。プログラムを書き続けて読み続けて、辞めない。プログラミングを習得したいなら、時間をぶっこんで何かをひたすら作り続けるしかありません。

宣伝っぽくなっちゃいますが、うちに来ればプログラミングの楽しさは体験できますよ。

いらっしゃい。

作りたいものがないなら資格取るのもいいかも?

どうしても作りたいものがないなら資格取得を目指して勉強するのもいいかもしれません。僕が取った2種とか1種はもう無いけど、基本情報技術者とか応用情報技術者という名前になって引き継がれています。

プログラミング教育最大の問題

プログラミング教育には大きな問題があって、それは、

『人に教えられるレベルの人は受託の仕事でもした方がよほど楽だし儲かる』ということ。プログラミング教育はお金にならないんですよ。だって、そのレベルの人が仕事を受けたら月に100万円じゃ安いくらいですから。

受講生から月に10万円もらって10人教える負担と比べたら、1人月100万円の受託業務をした方が効率がいいです。10人にみっちり教えるのは多分無理。とても大変です。プログラミング教育は抱えてる問題がみんな違い、最終的には個別指導になるのでとても手間が掛かります。

10万円の月謝を払う人も少ないでしょう。現実的には3万円程度でしょうか?だったら34人に教えないといけません。無理無理。受託やった方が楽。

だから、もし教育をする側になるのであれば、高度な技術を持った人でなくても教えられるようにしなきゃいけない。それは現状、なかなか難しいんですよね。プログラミング教育はそんなに簡単じゃない。

市場原理でやるにはハードルが高い商売だと思います。それこそバイトの学生メンターに大量の自習受講生を捌かせるみたいな事しないと経済的には成り立たないでしょうね。その教育品質は???

あるいは現役エンジニアがボランティアでやるか。うちは現状、これです。僕が無給で教えてます。

わぁい、サポート、あかりサポートだい好きー。