ソフトウェアエンジニアにとって仕事を通じて成長するのが一番早いと言われるけど、プログラミング未経験者にとって開発関連の仕事を獲得するのがほぼ不可能だと思う。

 

やはりある程度の知識やスキルを身につけ、自分なりのポートフォリオを持った以上仕事を見つけることが可能になるでしょう。

 

ここで、プログラミング未経験者にとって、ある程度の知識やスキルを身につけるため、一般的に二つの選択肢がある。一つは独学だ。私も最初はその道を選んだが、なかなか容易ではない。決して独学はだめというつもりはないけど、時間と効率のバランスから考えば、独学は一番良い方法と言えないと僕が思っている。

 

なぜかというと、一番重要な問題は、独学のリソースは非システムマチクだ。どのトッピクは、どのぐらいまで把握する必要か?また、ある知識点を完全に理解するため、その前提として不可欠なコンセップトなどは、独学者にとって知るはずがないものだ。

 

では、二番めの方法は、プログラミングbootcampに参加することだ。普通の場合、カリキュラムも体系化していて、プロジェクトに通じて実務経験も多少積んでることが可能だ。しかし、目的によるbootcampを選択する必要がある。そうしないと、大きな金と時間がルースしてしまう。

 

もし、ただの仕事を見つけるためなら、適当なbootcampを選んで、未経験者が1ヶ月あるいは3ヶ月を通って、ソフトウェアエンジニアの仕事が見つけることが可能だ。少なくとも、こう宣伝するbootcampは結構ある。

 

しかし、プログラミングを勉強するの目的は、ただの仕事を獲得ではなく、プロのエンジニアになりたい、何十年のもプロのエンジニアとして活躍するキャリアを目指している人にとって、そういうbootcampはあんまり役に立たないでしょう。

 

なぜなら、それらのbootcampに教えられたのは、フレームワークが中心で、一見は実務に近いや生産力が短時間に飛躍などメリットがあるが、実は致命的なミスは起こした。未経験者にとって、学習するべきなのは、ソルーション(フレームワーク)ではなく、その問題を学習すべきである。単なるソルーションを学んで、そのソルーションを解決する問題はしっかり理解しないなら、もし問題が少し変わって、既存のソルーションをうまく解決できない場合は結構ある。パーフェクトなソルーションは存在しないから、エンジニアとして問題を解決する際、用いたソルーションのトレードオフをしっかり把握した以上、その問題を望む通りに解決できると言える。

 

では、ウェブ開発において、プロのエンジニアになりたいあるいは何十年も活躍続けるキャリアが欲しいプログラミング未経験者にとって、ruby on rails,jquery、bootstapなどを最初から勉強せず、何を中心で勉強すべきか?

 

僕の答えは、変わらないものを勉強すべきだ。フレームワークが変わる。新しい技術はどんどん出る。ですが、ウェブ開発の基礎はあまり変わらない。プログラミング基礎、関係型データベース、httpプロトコルなどはあんまり変わらない。フレームワークがレベル高い抽象だ。そのしたの基礎になるものをしっかり分からないなら、フレームワークを精通することがもちろん不可能だと思う。

 

続きの話は僕の学習軌跡になるものだ。プログラミングの勉強を一年間を経ったので、ここで記録する。

 

新卒で就活する際、文系の僕がウェブサービスを作りたいと決めて、内定先を辞退して、ウェブ開発を一心に勉強することになった。

 

ウェブ開発(web application develop)と言えば、主な分野はフロントエンドとバックエンドになる。調べてみると、難易度がバックエンドの方が高い、バックエンドをクリアならフロントエンドもそこまで困難なことではないと考え、まずバックエンドから学習することが決定した。さらにバックエンドを分解し、その中でやはりプログラミング言語が大事だとわかり、MITとHarvardのオーペンコースを独学の教材として選定し、pythonとC言語をある程度触れることができました。この段階と言えば、まさにその学習のハニータイムと言えるでしょう。豊富な教材、新しい知識やスキルを身につける実感だ楽しくてたまらない。特に挫折もあったが、stackoverflowがあるおかけで、よくあった問題をほぼうまく解決した。これで2ヶ月経過した。

 

MITとHarvardのコースが終わった後、優秀なエンジニアになるためコンピューターサイエンスの理論知識が不可欠だと考え、続きは情報系の必須科目に勉強を着手始めた。離散数学を始め、論理回路、データ構造とアルゴリズム、コンピューターアキーテクチャー、オプレーティングシステムも結構力に入れた。この段階では正直というと、死ぬほど辛いだ。情報系の理論の世界に入ると、文系の僕にとってはまさに地獄のような状況だ。

 

しかし、F1のレーサーのように、車をうまく運転するため、車の性能やエンジンなどの知識が不可欠だと信じで、諦めずに3ヶ月で一通り目を通った。

 

この時点で既にプログラミングを勉強してから半年に近いになる。PythonやC言語である程度のonline judgement問題をクリアすることだできた。情報系知識もある程度有している。これから本格的にウェブ開発の学習を始めようと思い、ruby on rails tutorialを勉強始めた。この本を通じてミニバージョンのツィーターが完成できるが、コードは完全にコペーペーのものだ。もちろん、このweb applicationもほぼ理解しておらず、新しい機能を追加しようとしてもできない。このことに気づいたのは、web developにおいて要する知識の範囲は非常に広いのことだ。バックエンドにおいてさらいにダータベース、オブジェクト指向、SQLなどの領域がある。これらの学習リソースはプログラミング基礎と違って、体系化したコースはあんまりなかった。どの知識が必要、どのぐらい理解が必要なのか全然分からない。この段階はいわば迷う時期でした。

 

解決策としてbootcampを参加することに決めた。IT bootcampを選択する際、トッピク分割、カリキュラムの設計はもちろん重要だが、一番大切なのは、そのbootcampの教育哲学だと思う。

 

そこで、あるオンラインブートキャンプに惹かれた。

 

特徴としては主な三つがある。

 

一つは、完全把握に基づき学習することだ。つまり、あるトッピクを完全に把握する以上、次のトッピクに進むことができる。なぜこういう当たり前のことが大切だというと、もしトッピクA,B両方の習得度が80%とする、トッピクABの学習度が64%になってしまうだ。伝統的な教育システムと違って、学習のペースはスゲジュール通りではない。全ての人は学校にこういう経験があると思う:昨日の数学知識がまだ完全に理解していないのに、今日は先生が次のトッピクに進んでしまう。伝統的な教育システムと違って、このbootcampでは、例えばプログラミング基礎を完全に把握しないなら、オベジェクト指向のトピックへ進めないだ。このことを実現するため、審査という仕組みがある。つまり、学習ステージことに審査がある。紙面のテストとSKYPEやCLOUD9を利用して問題を回答しながらコーディングする必要から、コーディング能力だけでなく、コミュニケーション能力も不可欠だ。また、ここのインストラクターはシリコンバレー出身で、英語の会話力もトレーニングできる。

 

二つの特徴は、基礎重視、変わらないものを中心に教えられた。ruby on railsのことを勉強するために、最低でも600時間の前置コースを完了する条件がある(もちろん審査がる)。その中で、プログラミング基礎、オベジェクト指向、SQL、HTTPなどの知識を中心に、体系的に教えられる。

 

三つの特徴は、大量な練習と繰り返す学習哲学だ。音楽家のように、完璧な演出するため、一般人が想像も尽きない練習時間を費やした。プログラミングの習得も似たようなものだ。また、あるトッピクに対して、ただ一回だけ学習するではなく、なんども復習する必要がある。なぜかというと、長期的な記憶形成には、重複しか方法がない。

このbootcampでは、明らかに不向きな人がいる。それは、短時間で仕事を獲得したい人だ。プログラミング未経験者の場合、1日学習時間が10時間とすると、全てのコースを完成するため約半年が必要だ。通常の場合、卒業するため一年間以上の時間がかかる。

 

僕は10月に参加し、今日までも半年になった。毎日の学習時間は平均6時間ぐらい、まだカリキュラムの半分に達しないが、基礎だけはしっかり勉強したという実感がある。ruby言語、SQL、HTTP、HTML、CSSなどに費やしたの何百時間が絶対に無駄ではないと信じている。

 

未経験の学習者にとって、これはThe Slow Path To Proficiency.