コーディングを学ぶこと、それはあなたが考えるよりも大変です

要約:全ての根拠が示しているのは、「プログラミングには高い適性を要求されますが、適性を持った人間はわずかしかいない」ということです。最近の流行の短期でコーディングを学べるコースは、デマカセを売り付け、プロのプログラマのスキル不足解消に何ら力になってないのです。

これはイギリスからの観点での記事です。私はこの事象について、とりわけソフトウェア開発者の社会的地位に関しては、他の地域決してこの通りではないと思っています。

メディアが共通して取り上げるテーマは、スキルのあるプログラマの不足です(”プログラマ”も”コーダ”も”ソフトウェア開発者”も、ここでは全て同じものを意図し、区別せずに使用しています)。このコーディング技術のギャップには解決の糸口が見えない心配が多くあります。要は”明日の高品質な仕事”を担う候補者を生み出すことに失敗しているということです。例えば、The Telegraphのこの記事を参照してください。

学術会議の見通しではICTの労働人口が2030年までに39%まで増大するとしています。O2の2013年度の報告では、今から2017年まで、デジタル技術を持った労働者の需要を満たすには、さらに74万5,000人ほどの技術者が必要になるだろうとされています。

さらに昨年行われたCity & Guildsの調査によると、ITやデジタル、情報サービス分野の雇用主の4分の3が、自分たちの業界は技術ギャップに直面していると述べているという一方で、調査を受けた47%の雇用主がビジネスのニーズと教育システムがマッチしていないと述べていることが明らかになりました。

大半の解説者はこの問題を、適切なトレーニングの不足とみなしています。教育機関からは十分なプログラマが育っていません。例えばThe Guardianで労働党のYvette Cooper上院議員は以下のように述べています。

鉱山労働者の子息、令嬢は皆、コーディングを学ぶべきである。イギリスの創意工夫の結果として発明されたWWWによって私たちは非常に大きな利点を得ている。また英語を話す。にもかかわらず、次世代のテクノロジ改革の中心たるべき国として何を行っているであろうか。大学教育とともに、コーディングを学べる大学を設置し、技術的かつ職業訓練をかねた教育を推進していくべきであろう。

メディアで一般的に信じられているのが、コーディングの学習を始めるには高い壁があるということです。以下はこの迷信を顕著に表すthe Guardianに掲載されていた記事です

21世紀には必須のスキルであるにもかかわらず、トレーニングを受ける余裕がある裕福な家の人間であるか、あるいは幸いにも高水準の教育を施す学校に入れた場合でもない限り、コーディングを学ぶ障壁は高いままなのです。

「学習を始めるためには高い障壁があること、敷居の低いトレーニングが不足しているということは、裕福な家庭と教養のあるエリートだけが高給の仕事に就きやすいということを意味する」というコンセンサスがあるようです。現在は与えられていない教育やトレーニングが受けやすいものになりさえすれば、プログラミングが適切なキャリアになり得るたくさんの人々がいる、ということを含意しています。

これを受けて、プログラミングを学生に奨励する一連の構想があります。イギリス政府は2014年に” Year of Code “キャンペーンを開始しました。

year-of-code

“今年はコーディングを始めよう、あなたが思うより簡単です”というメッセージです。実際にYear of Codeキャンペーンの総監督であるLottie Dexter氏は、Newsnight のインタビューで”スキルは1日で習得できる”と言っています。Code.orgは”コンピュータサイエンス教育の参加拡大に尽力する非営利団体”で、団体のWebサイトでは”Code.orgはコーディングが難しいという難しいという思い込みを覆すお手伝いをします。”とうたっています。

hour-of-code
訳注:イギリスの8,198,056人がHOUR of CODEを試しています。
誰でも学べます。

しかし、本当にコーディングを学んで高給の仕事に就くことはそれほど簡単なのでしょうか? 誰でもコードを学ぶことができるというのは本当でしょうか? 道行く人々を連れてきて、短期の授業を受けさせ、プロのプログラマを育てるというのは可能なのでしょうか。

もっと伝統的な格式のある教育はどうでしょうか? 大学でプログラマのトレーニングを受けるというのはどうなのでしょうか?

スキル不足が問題なら、コンピュータサイエンス専攻の卒業生には高い就職率が望めるはずです。しかしながら、実際は違うようです。The Higher Education Statistics Agencyは、「コンピュータサイエンス専攻の卒業生は”全卒業生の中でも最も就職率が低いという、いただけない栄誉”を得た」と伝えています。これはどういうことでしょう。いろいろと聞いたところによれば、学生が持っているスキルと雇用主が学生に期待するスキルの間にギャップがあるようです。あるいははっきり言ってしまえば、3年間のコンピュータサイエンスの教育だけではコーディングはできるようになりません。匿名の大学講師の書いた記事のコメントには、いくつか興味深い洞察がなされています。

毎年同じだ。コンピュータサイエンス(CS)の学生のうち、コーディングを仕事にする人に持っていてほしい能力を持っているのは、たかだか3分の1だ。そのうちの3分の1はプログラミングが非常に下手で、すでに数週間以上かけて学んだはずだと聞くと(学位取得まで道のりの半分ほどにいるということは忘れておこう)人々は驚くほどだ。もしも、彼らが恥ずかしくない程度のプログラミングのスキルを持っているかどうか実際にテストしてみたら、かなりの割合で落第するだろう。この国では学生を落第させるのは悪いことだと考えられているので、彼らが本当のスキルを身につけていないとしても、なんとかして救済する方法を見つけるのだ。

他の調査でも、同様の結果が出ています。どんなプログラミングのコースでも、コードを書ける人とそうでない人が“2峰性”の分布になります。

特に、大部分の人はプログラミングを習得できません。大学のコンピュータサイエンス学部に入学してくる学生の30~60%は、プログラミングの最初のコースで落第します。

ここでは、学位レベルのコンピュータコースについて話していることを思い出してください。彼らは、大学でコンピュータサイエンスを学ぶべく入学を許可された学生です。ある程度は、自分で選択したはずです。もしもプログラミングコースの落第率が、学部学生の中でそれほど大きいなら、一般的な人、つまり”コーディングを学ぶ”短期コースが引きつけようとしている人たちの中ではさらに大きいはずです。この問題を、反対の側面から見てみましょう。成功しているプロフェッショナルなソフトウェア開発者に、どのようにコーディングを学んだのか尋ねてみましょう。彼らは皆、高額なコーディング専門の学校出身だと期待するかもしれません。しかし、そうではないようです。ここにあるのは、Stack Overflow が行った、開発者に関する調査の2015年の結果です。これは世界的な調査だということを頭に置いてください。でも、この結果はイギリスにとっても有用でしょう。

SO-dev-survey

独学 41.8%
コンピュータサイエンス(あるいは関連した分野)の学士 37.7%
オンザジョブトレーニング 36.7%
コンピュータサイエンス(あるいは関連した分野)の修士 18.4%
オンラインのクラス 17.8%
コンピュータサイエンス(あるいは関連した分野)の大学の科目を履修 16.7%
業界の認可プログラム 6.1%
その他 4.3%
集中的なコーディングの”ブートキャンプ”あるいは夜間学校 3.5%
コンピュータサイエンス(あるいは関連した分野)の博士 2.2%
メンターシッププログラム 1.0%

コンピュータサイエンス、あるいは関連した分野の学位を持っている人は3分の1ほどにとどまり、最も大きなグループである42%近くが独学でした。私はこの問題について、小規模で科学的根拠のない独自の調査を行いました。毎月.NETの開発者とブライトンでミーティングをする際に聞いてみたところ、独学派が多数であるという結果がより顕著に出ました。また面白半分に、Twitterでも投票を行いました。

mh-self-taught-twitter-pol
訳:
あなたは独学のプログラマですか?

76%の人が、独学だと答えています。さらに興味深いのは、この投票についたコメントです。典型的なのは、次のようなものです。

self-taught-tweet
注釈
僕はCSの学位を持っていますが、それでも95%は独学です。少なくとも、自分が使っている分野に関しては。

CSの学位を持っているプログラマでさえ、大部分は独学だと主張しています。他の人は、答えるのが難しい質問だと不満を漏らしています。というのも、この業界の変化の率を考えれば、学習をやめることはないからです。ですから、ある時点では正式なトレーニングを受けたとしても、それだけで職業上の成功を得ることはできないのです。どんな正式なコースも、プログラマのキャリアを定義する、継続的な学びの小さな1要素にすぎません。

私たちは、非常に奇妙な、そして予想もしなかった状況に置かれました。プログラマのための正式な教育はあまりうまく機能していないようで、プログラマとして成功している人の大半は独学だというのです。職業上の成功につながるような教育が必要でない人もいて、彼らは皆、利用したい人は誰でも利用できるオンライン上にあるリソースの広大な海から、自分の仕事を学べる能力を持っているようです。その一方で、何年も正式なトレーニングを積んだとしても、コーディングを学ぶことができない人もいるようです。

これは、この記事の冒頭での議論に疑問を投げかけます。もし現在のプロフェッショナルなソフトウェア開発者の大半が独学で学んだのなら、障壁など存在するのでしょうか? インターネットに接続できる人なら誰でも、適性があればコーディングを学べるはずです。

この根拠は、非常に明白な結論を示しています。2種類の人間がいるのです。プログラミングをそれほど苦痛に感じず、楽しんで学ぶことができる人、そしてどんなに素晴らしい教え方でも学べない人です。Yvette Cooperや”Year of code”あるいは”Hour of code”を支持する人は、見て見ぬフリをしています。プログラミングには非常に高い適性が求められるということを認めたくないのです。”誰でも学べる”ようなものではなく、簡単でもなく、でも適性のある人にとってはまあ簡単なものです。厳しい事実として、ほとんどの人は、高い基準に達するのは不可能だということに気付くのです。

もし、プログラミングに高いレベルの適性が求められると認めれば、”コードを学ぼう”という動きを取り巻く誇大広告を他の職業(高い適性が要求される、より確立された職業)と比べるのも楽しいものです。「プログラマ」や「コーディング」を「医師」や「エンジニア」、「建築家」、「数学者」に置き換えてみましょう。

* 数学は1日で習得できます。
* 今年は外科手術を始めよう。あなたが思うより、簡単です
* skyscraper.orgは、建築は難しいという謎を解くための手助けをします。
* 鉱山労働者の子息、令嬢は皆、弁護士になるための勉強をすべきである。

私の友人、Andrew Cherryは、これを上手くまとめています。

free-training-ac
訳:
どんな業界/職業が、余暇を犠牲にしてまで、その分野に参入したいと思っている人向けに無料の/オープン形式のトレーニングを提供してるの? 興味がある。

答え:ただ1つ、ソフトウェア開発のみです。医師になりたい人は、医学部に7年間通うしかありません。

その適性を受け入れるのは、プログラミングのキャリアで成功するためには重要なことで、私たちは”不足の”問題に異なる角度からアプローチできます。才能のある人に、高い適性が求められる他の分野ではなく、プログラミングを選択するように説得できるか聞き出すこともできます。問題は、このような人はキャリアパスにおいてかなりの選択肢があるということです。そしてこれから説明するように、プログラミングにはいくつものネガティブな社会的、職業上の性質があり、そのために彼らはこれを選択しなくなるのです。

ソフトウェア開発は、とても魅力的な職業であることは間違いありません。高給で流動性が高い職業で、常に新しいことに挑戦するタイプの仕事であり、やりがいがあります。ただ、イメージ的に問題があります。私はそのことを、1990年代に初めて経験しました。当時私は社会科学の学士課程にいて(そうです、私は独学タイプのプログラマの1人です)、私たち文科系の学生は、学内で、コンピュータサイエンスの学生を見下していました。彼らはキャンパスの中でも一番格好の悪い学生で、多くは、服装のセンスのない男子学生でした。哀れみと嫌悪感を抜きで彼らのことを考えることはありませんでした。学士課程の終わり頃、私は同じく社会科学を学んでいたガールフレンドに、プログラミングの職業を選択するかもしれないと話しました。彼女は、「まあ、なんてムダなことをするの。どうしてプログラミングなんかしたいの? 」と叫んだのです。イギリスにおいて、中流階級の人々が集まっている場で、いきなり次のように尋ねたとします。例えば、薬剤関係、法曹関係、建築家、あるいは会計士のような職業と、ソフトウェア開発の仕事を比較してもらうのです。きっと人々は、ソフトウェア開発の社会的ステータスは低いと評価するでしょう。ビジネスにおいてでさえ、少なくとも、より伝統的なビジネスにおいて、ソフトウェア開発は低級な仕事で、若手や、中間管理職としての能力が劣る人にお似合いの、比較的単調で平凡な職業と見なされているのです。あいにくなことに、”コーディングを学ぶのは簡単です”とうたっているコースは全て、ソフトウェア開発はまともな職業ではないという認識を助長しているだけなのです。

ソフトウェア開発に関しては他にも問題はあります。前述した、入門の障壁が低いということの裏返しにあたることです。つまり、プロフェッショナルになるための十分に確立された入門の道筋が無いということです。試しに、Googleで”医者になる方法”とか”弁護士になる方法”と検索してみてください。

how-to-become-a-doctor
訳:
医者になる方法
ソース:アメリカ労働統計局(BLS);求人(2015年8月)
1. ステップ1:学士号を取得する。
2. ステップ2:医学大学院進学適性テストを受ける。
3. ステップ3:医学部に入学する。
4. ステップ4:研修医を修了する。
5. ステップ5:医師免許を取得する。

一般に広く認識されているプロの資格には、しっかりと確立された一連のステップがあります。このステップを全て修了すれば、プロの一員として認められるのです。医者の資格を得るのは簡単だと言っているのではありませんが、その方法にはほとんど疑問の余地はありません。それでは次に、Googleで”ソフトウェア開発者になる方法”と検索してみましょう。すると、例えばこのような検索結果が得られます。”プログラミング言語を学ぶ”とか”オープンソースのプロジェクトにコントリビュートする”とか”地元のプログラミンググループに参加する”など、あいまいでありきたりな内容ばかりです。明確なキャリアパスは無く、いつプロになれるのか、なったとしたら将来、給料の高い仕事を得られるのかといったことについて、何の保証もありません。

Yes, I made this up, but it makes the point. :)
訳:
“ソフトウェア開発者になる方法”
自力で頑張りましょう。幸運を祈ります。

では次に、学校で良い成績を収め、高い知性を求められる課題を比較的簡単にこなすような高い適性を持った人材に対して、ある選択肢を与えてみます。最初の選択肢としては、例えば、薬剤関連の職業などはどうでしょう。あらかじめ明確に示されたステップをこなし、厳しい基準の試験を順調にパスし、最後には地位が高くて高給の仕事を手に入れるのです。そしてもう1つの選択肢はこんな職業です。学校ではなく独学しますが、それが正確に何なのかは分かりません。下働きのような地位の低い仕事に就き、ただひたすら、より多くのことを学びます。何とかそれをこなして徐々に出世します。それでも将来的に高給が得られる保証はありません。その上、世間の誰もが、必死に取り組んでいるあなたを社会の底辺にいる人だと考えるのです。あなたならどちらの職業を選択しますか?

ソフトウェア開発は、既存のプロフェッショナルな職業の例にならい、高い壁を乗り越えなければ業界に入れないような、プロとしての資格を確立できるでしょうか? 現在、ある試みがなされています。英国コンピュータ協会(BCS)は、”公認のIT機関”を自称し、プロの資格と基準の確立を目指しています。問題は、ソフトウェア業界に全く相手にされていないということです。たとえソフトウェア業界に、この専門職団体の存在を真剣に受け入れてもらえたとしても、プロの資格があるかどうかをどうやってテストしますか? 試験には何を出題しますか? プログラミングには確立された方式などほとんどありませんし、主流になりそうなものが現れても、驚異的に速い変化のペースによって、それはすぐに土台から壊されてしまいます。オブジェクト指向プログラミングの例を挙げましょう。2000年代には、オブジェクト指向プログラミングは、企業向けプログラミングにおける基盤的技術の地位を確立したと思われていました。しかし今では、私を含めて多くの人が、この潮流は20年間に渡って本流から逸れていたものであり、そのほとんどが間違いだったと考えています。プログラミングの標準や資格は、現行の方式とともに、どれだけ速く最新のものに置き換わっていくのでしょうか。現状は、それでも速さが足りないと思います。

しかし、本稿での私の主な論点は、プログラミングは高い適性が求められ、一握りの人だけが成功の域に達することができる類のものである、という言論を確立することでした。もしプロの資格認証の主眼が、コーディングできない人を除外することならば、テストの内容が流行遅れであることや、業界の最新の方式と無関係であることは問題でしょうか? 暫定的な認証制度では、LISPで、ある程度本格的なプログラムを完成させることが含まれるでしょうか? プログラマにとってガラス玉演戯のようなものでしょうか? ポイントは、対象者がコーディングできるかどうかという点になるでしょう。現在の流行が何なのかということは、後で学べます。それでも依然として残る問題は、この認証制度を業界にどのように認めさせるかということです。

そうした試みの一方で、私たちはデマカセを伝えるのをやめるべきです。プログラミングは簡単ではなく、難しいものです。将来、高給を得られる仕事に就けるレベルのコーディングを、たったの数週間で学ぶことなど絶対にできません。どんなに訓練を受けようが、ほとんどの人が、コーディングを習得することが全くできません。コーディングの速習コースをいくら作っても、技術不足の現状や、技術が低くて給料も低いという問題、失業といった問題に対して何の解決にもならないのではないかと思います。コーディングには人工的な壁があるというふりをするのをやめて、本当の壁は、生まれ持った才能であるということを受け入れましょう。その代わりに、ソフトウェア業界の社会的地位の向上を目指しましょう。いずれにせよ、この動きはゆっくりと始まっていると思います。そして、才能ある若者が、他のプロフェッショナルな職業と比べてもソフトウェア開発が有望な選択肢だと真剣に考えられるように、働きかけていきましょう。