みんからきりまで

きりみんです。

専門学校では如何に素人に対し体系的にプログラミングの基礎を教えているか(体験談)

こんにちは。
あけましておめでとうございます。

さて、新年早々プログラミング教育とエンジニア業界の闇について議論(?)が盛り上がっていますね。
この話題に関してはぼくはわりと思うところがたくさんあり、書き始めると延々と書き続けてしまいそうなんですが、今回は「プログラミングは体系的な教育方法が確立されていず殆どの人間はプログラミングに向いていない」という内容について体験談をもとに言及してみたいと思います。

人はどのようにプログラミングを学習するか

ぼくの観測範囲では、バリバリに活躍しているエンジニアはだいたい「大学で情報工学系の教育を受ける一環としてプログラミングを習得した」「文系だったけど趣味や研究などでプログラミングを独習してプログラマになった」という人が多いようです。
特に、コーディングノウハウそのものに関しては独習で学んだため、どうやって他人にプログラミングを教えればいいのかなんて分からない、という人が多いようです。

一方、ぼくは多くの人とは異なり、専門学校という実務的なプログラミングの技術を教えることを専門として学校でプログラミングを学んだというやや珍しい経歴を持っています。
ぼくは専門学校で二年制のシステムエンジニア養成学科を卒業しました。
ちなみに学校は「日本電子専門学校」という名前で、「情報システム開発科」という学科でした。

そのあたりの身の上話は専門学校を卒業した頃に書いたエントリがあるので興味があればご参照ください。(とてもなつかしいですね)

kirimin.hatenablog.com

専門学校ではどうやって全くの素人に対してプログラミングを教えているのか

本題ですが、専門学校という場所には一応「体系的にプログラミングを教える」ノウハウというものが存在すると思っています。
専門学校に入学する生徒のほとんどは素人です。それも、あまり勉学に興味がなかったりやる気がなかったりする生徒が多いです。
そんな中で、ぼくの通っていた学科では、およそ40人ほどの同級生が、一応ほぼ全員プログラマとして就職しています。(その後どうなったのかは分からないですが)

少なくとも、卒業時点で変数の概念を理解していなかったり簡単なFizzBuzz問題が分からないような生徒はいなかったんじゃなかという気がしています。
一体専門学校ではどんな教育が行われているのでしょうか。もうずいぶんと昔の話ですが、思い出を振り返ってみたいと思います。

簡単なアルゴリズムの問題集をひたすら解かされる

たしか一番最初は座学で変数や配列の説明(箱に物を入れるアレです)などをやった気がしますが、すぐに実技の授業が始まります。
プログラミング基礎の科目では、おそらく学校が手作りした簡単なアルゴリズム問題が200問くらい書かれた本を渡され、ひたすらC言語で問題を解かされます。
問題の内容は例えば、一番最初は「入力した数字が倍になって出力されるようにしろ」というものだったり、だんだん難しくなってくると「*で5段のピラミット模様が出力される関数をループを作って書きなさい」とか「今の日付から入力した数字の日数だけ引いた日付を出力せよ。うるう年にも対応しなさい」とか、たしかそんな感じだったと思います。

問題が解けたと思ったら先生に提出します。先生はコードを読み、正しければOK、バグがあったり必要のない計算が含まれていたりしたらNGとして再提出にします。
先生は質問すれば丁寧に教えてくれますが、基本的には生徒が自分で一生懸命考え、何度も何度も実行して結果が正しくなるよう試行錯誤するように教わります。
自頭の良い生徒はどんどん先に進めていきますが、最初は苦戦している生徒でもマイペースで進められることと、先生がアドバイスしてくれる環境があることで、なんとか学期の終わりまでに全員がノルマの部分まではクリア出来るように配慮されています。

この授業によって、少なくとも変数の概念を理解していなかったり、FizzBuzz問題が解けないような生徒はいなくなるのではないかなと思います。
ちなみにぼくはというと、特別問題を解くのが早かったということはなく、自分よりも自頭の良い生徒は何人もいましたが、負けず嫌いなので放課後に残って問題を進めていたりしてなんとか上位組に追いつこうとしていました。

基本情報の対策としてアルゴリズムの問題とプログラミングの問題を解かされる

ぼくの通っていた学科では、「入学した年の秋に基本情報に合格し、在学中に応用情報に合格する」というのを一応目標に掲げていたので、座学の授業は基本的に情報処理技術者試験のカリキュラムに沿って行われます。
情報数学からソフトウェアやハードウェアの知識、データベースやネットワーク、SQLまで幅広く教わります。

その中でも、基本情報技術者試験の午後問題には「アルゴリズム問題」という擬似言語によるプログラミングの穴埋めと、言語を選択しての「プログラミング問題」という大きな問題が出題されます。

その対策として、アルゴリズムとプログラミングの過去問をたくさん解かされます。
この問題は実務経験がない素人にはなかなかにむずかしいものなのですが、先生が丁寧に考え方を教えてくれます。
ぼくはこちらもあまり理解が早い方ではなかったのですが、授業のあとに先生に質問しに行くと、先生が根気よく紙に書かれたコードを上から順番に説明してくれたのを今でも憶えています。

JavaPHPでのウェブサービスの実装方法などを教わる

1年次の後半からはJavaPHPについて座学で教わりはじめ、一通り言語仕様を教わると2年次くらいからは実際に簡単なECサイトの構築をJavaPHPで実装する授業が始まります。
正直に言うと、当時の自分は授業に完全にはついていけておらず、直書きのPHPはともかく、Javaサーブレットを使ったWebサービスの実装やオブジェクト指向の考え方などは在学中はあまり理解出来ていませんでした。
しかし、一応Javaの言語仕様やざっくりとしたプログラミングのデバッグ方法などは覚えることが出来ました。

結局何が言いたいのか

言いたいことはいくつかあります。
一つは、専門学校という場所には完璧ではないが一応素人にプログラミングを体系的に教えるためのノウハウが存在しているということ。

二つ目は、簡単なアルゴリズムの問題集を解かせるという教育方法は、コーディングの基礎やデバッグのノウハウを身をもって学ぶために有用であると思うので、もっと一般向けにもそのような問題集が販売されてもいいのではないだろうか、ということ。

三つ目は、ぼくは専門学校時代はあまり成績が良い方ではなく(テストで0点を取ったことすらある)、本格的にプログラミングの魅力に目覚めて様々な設計思想やアーキテクチャを覚えていったのは二年間学校で教わったのち実際に実務でAndroidのアプリを作ったりするようになってからだということです。
それだけプログラミングというのは本質的に難しい部分があり、もちろん数ヶ月の独習であっさりと業界に乗り込んでくるような天才肌もたくさんいますが、一方で、たとえブラック企業の数ヶ月の雑な研修によってすぐに仕事が出来るようになれなかったり、先輩から一度「ちゃんとエラーメッセージ読めば分かるだろ!」と言われてもデバッグの勘が身につかなかったとしても、決してプログラミングの才能が絶望的にないとは言い切れないと思うのです。

プログラミングを始めたばかりの最初の飲み込みが遅くても、「パソコンは好きだけどプログラミングの面白さはイマイチ分からない」と思っていても、何かのきっかけでプログラミングの面白さを知ることで劇的に成長する可能性もあると思います。
もちろん、1億総プログラマーになるのが良いなんて思わないですし、向いてる人もいれば向いていない人、そもそも興味がない人、やる必要がない人もたくさんいるでしょう。
しかし、プログラマーにあこがれているけど自分にはどうせ才能がないだろうと思っている人には、ぼくのような例もあるという雑な励ましをしたいと思い、このようなエントリを書くに至りました。

なお、ぼくは専門学校に入る直前までは工場で刺身にたんぽぽを載せるのに類似した仕事をしていましたが、あれはとてもキツく大変でかなり根性がなければ続けられない仕事なので、誰でも出来る仕事代表のように言うのはよくないのではないかなと思います。

追記 専門学校の質について

なお、専門学校がすべて上記のような教育を施してくれるというわけではないらしく、同じ学校でも別の学科の卒業生は全然真面目に授業をやった記憶がないと言っていたり、他の専門学校でもそのような話を聞いたりするので、専門学校に入ることを検討している人は学校と学科をよく選びましょう。選び方は...分かりません。どうするのがいいんでしょう。。。