- 正規教育は効率的に熟練度を伝えるには有用だが、予期しない問題を解決するための直感を育てるには限界がある
- **目的ある反復的な試行錯誤(アルゴリズム)**は、実戦での失敗と修正の過程を通じて、熟練度を最も大きく高める要素である
- 実例では、Linus Torvalds、Margaret Hamilton などさまざまな人物が失敗を経験し、それを乗り越えることで卓越した能力を身につけた
- メンタリングは重要な促進要因だが、自己主導の実験と直接の経験こそが最終的な成長の核心である
- ぶつかって壊しながら自分で問題を解決する目標志向の実験が、本当の実力向上の土台である
最高のソフトウェアエンジニアを生み出す力: 目的ある試行錯誤
教室という神話
- 正規教育は価値ある知識の伝達には向いているが、スケールに合わせて最適化されたプロセスである
- 複雑な実務経験をうまく精製した手順に落とし込み、1学期以内で完了できる形で伝える
- この過程で実務に必要な基礎的な熟練は身につけられるが、予想外の危機で問題を直感的に解決する力を構築するには限界がある
- とりわけ深夜3時に実サービスで問題が発生したとき、教室で学んだレシピだけでは解決に不十分である
自らぶつかりながら学ぶ本当の成長
模範的な事例
- Linus Torvaldsは MINIX をリライトしながら Linux を作った
- Margaret Hamiltonは Apollo プロジェクトでリアルタイムにコードの問題を直接修正しながら、現代的な信頼性の概念を切り開いた
- 数多くのオープンソースメンテナーたちも、自分のノートPCを自ら壊しては直しながら成長してきた
- 彼らはまず順番通りの講義を受けたわけではなく、失敗とそれに伴う実際の影響を通じて深い実力を得た
なぜ試行錯誤はレシピに勝るのか
- フィードバックループが即時である。ログからクラッシュを分析する過程は、クイズよりもはるかに速い習得をもたらす
- エッジケースは実環境で自然に現れ、教材では想像できないユースケースに出会う
- 苦労して解決した問題は記憶に深く残る。筋肉記憶として定着する
- 既存のガイドがないとき、創造力が爆発的に発揮される
メンターシップの再評価: 補完剤であって代替ではない
- 良いメンターはフィードバックを素早く返し、視野を広げてくれるが、最終的に実験と経験の主体は自分自身である
- コードレビューは実験結果を共有することで価値を持つが、直接の経験を置き換えるものではない
自己主導の実験習慣を育てる
- 自分を少し不安にさせるようなサイドプロジェクトに挑戦する
- すべてを計測し、失敗時に分析可能なデータを確保する
- フレームワークを使わない、あるいは48時間以内に完成させるといった制約条件を設け、創造的な問題解決力を養う
- コードを公開して外部からの検証を受ける
- 週単位で振り返りを整理し、失敗の原因と学んだことを記録する
まとめ
- メンターシップ、講座、ブログなどは触媒の役割を果たすが、本当の実力は現場で激しくぶつかる過程の中で積み上がる
- 最高のエンジニアは、自由で目的ある試行錯誤を繰り返すことで、実質的な問題解決と成長を実現する
- その過程で得た経験が、未来の自分にとって最大の資産になる
1件のコメント
Hacker Newsの意見
私自身は独学の開発者として、キャリアの大半を大企業でCS専攻の同僚たちと一緒に過ごしてきた。
私の経験では、独学の開発者は十分に賢ければ、最終的には与えられた問題を解決する。
CS専攻者は、まったく未知の領域では最初から試そうとすらしないことが多い(もちろん性格によるばらつきはあるが、体感では85%くらい)。
高い不確実性を前にすると前に進めなくなる。
結局、CS専攻者は大企業の環境によりよく適応し、置き換え可能な歯車のようにパターン通りに働く。
独学の開発者は常に革新し、非効率な反復を減らす方向で働き、そうした独創的な姿勢が周囲を不安にさせる。
だが、こうした独学の人たちのほうがはるかに優れた結果を出す。
ほとんどの開発者は、優れたコードそのものよりも、雇用の維持や不安の軽減を重視しているように見える。
正規の教育を受けたエンジニアにも、新しい問題を積極的に解こうとする人は多い。
これは独学か正規教育かの問題というより、好奇心、勤勉さ、創造性、知性といった気質の問題だ。
独学者は成功するためにそうした特性を必ず備えていなければならないので、その集団でより強く見えるのかもしれない。
正規教育を受けたエンジニアがそうした特性まで持っていれば、どちらの集団よりも優れていることが多い。
おそらく一番大きいのは性格の違いだと思う。
私のような独学の開発者は、誠実さを武器にしていた。
「大局観」を技術的によく見通せていたわけではないが、その代わりチームで一番多く成果物を出そうと努めた。
いくつものプロトタイプを数日で3つも作って実地テストした。
CS専攻の同僚たちはホワイトボードで一度設計し、実際のコードも一度だけ書いていた。
同じ作業に両方のやり方が試されたわけではないので、どちらの結果がよいかは言いにくい。
私の頭の中では、自分のやり方のほうが「実地検証」された方法だと感じている。
CS流のやり方が理想的に見なされていたのは確かだ。
ただ、CS専攻エンジニアたちのメンタリングのおかげで多くを学べたとも思う。
業界経験を10年ほど積めば、出発点がどうであれ結局は似てきて、「正解」への勘も近づいてくる。
たぶん私も少し美化や一般化をしているので、他の人が返信で補ってくれるとありがたい。
それは認める。
ほとんどのCSカリキュラムは実務からかなり離れているので、学位が実力の即時的な指標ではない。
ただ、CS卒業者の85%が未知の問題を解けないというのには到底同意できない。
CSの学位に美点があるとすれば、工学トラックに高い知的能力を要求するとんでもなく難しい科目群が含まれていることだ。
それだけ多くの科目を突破できる人が、実務開発では何もできないとは考えにくい。
本当に難しい開発分野に行くと、むしろかなりの割合がCSの上級学位を持つ人たちだと思う。
ソフトウェアに対する深い関心があればこうした特性は生まれるようで、その中にはCS専攻者も多い。
私の経験では、独学者は自然に選別される。
つまり、未知の問題も解けない独学者は、そもそも採用すらされない。
正規教育出身者は平均的かそれ以上ではあるが、圧倒的というわけではない。
すべてを自力で把握し、大学教育による検証まで受けた人は、本当に強力な実務力を見せる。
要点は学び方ではなく「情熱」だと思う。
動機が弱ければ、どんな学習方法でも限界は明らかだ。
このテーマには数値的に議論しにくい側面もある。
正規教育は、基盤となる概念群(数学、ハードウェア、OS、コンパイラなど)をしっかり固められる。
独学は目標志向なので、基礎を見落とすこともあるかもしれない。
何を知らないのかすら分からないとき、きちんとしたメンター(教授、優れた本)がいれば大幅に時間を短縮できる。
私を含む多くのエンジニアは、正規・非正規の両方の学習を経験している。
情熱があれば、自分で作り続けるようになり、正規の学習以外にもあれこれ実験する。
本当に優れたエンジニアを分けるのは、教育の形式ではなく、明確な情熱だ。
LinusやMargaretのような例も、結局はものすごい学究心の持ち主だった。
私も独学のプログラマとして強く同意する。
80年代の8ビットコンピュータの時代から独学で学び、大学にも行っていない。
19歳で最初の正規のプログラミング職に就いたときには、すでに9年間プログラミングしていた。
たいていの人が大学を卒業する頃、私はすでに15年近くコードを書いていた。
そういう情熱と推進力は無視しにくいと思う。
今でも40年近く、同じような気持ちでソフトウェアを楽しんでいる。
作ること自体が楽しく、今も論文を読み、業界の流れを追い、なお大量にコードを書いている。
ただ、独学者には基礎がないと決めつける見方は少し残念だ。
実際には、多くの独学者が学問的な部分も十分に面白がって掘り下げている――どの分野かにもよるが。
深く勉強する時間は足りないことがあるにせよ、何十年も経験を積めば、学校に行っただけの人より基礎が厚くなることも多い。
採用も解雇もかなりやってきたが、独学者のほうが優れた結果を出すことが多かった。
結局のところ、「やってきた」時間がずっと長い――情熱が最終的に学習量を押し上げる。
「何を知らないのか分からないとき、誰かが効率よく導いてくれるのは大きな助けになる」という部分には本当に共感する。
私は正規教育と非正規教育の中間くらいのケースだ。
高度な離散数学や線形代数は履修しておらず、そのため背景知識がかなり不足している。
どんなキーワードで検索すればいいのかすら分からない。
本当に、誰かの指導が必要な分野もある。
30代後半でベクトル数学のプログラムを検証してくれるチューターを見つけるのも本当に大変だった。
情熱は独学を前に進めるが、教室環境では誰かが常にレールを敷いてくれるので、相対的にはそこまで必要ないのかもしれない。
また、「目的志向」の独学者もいれば、システムそのものの原理を理解することを目標にする独学者もいる。
誰かに強制的に水辺まで連れて行かれたとしても、自分で水辺まで行った経験がないわけではない。
独学者は全員、少なくとも一度は自力で水辺まで行ったことがある人たちだ、というのが一貫した違いだと思う。
私は正規教育と独学のハイブリッドだ。
大学の授業はたくさん受けたが、試験でうまくやって学位を取ることはできなかった。
それでも残りを独学で身につけられたのは、授業で土台を築けたからだ。
大学の授業は本当に素晴らしいと思う。
何も知らなかった頃なら、CのソケットAPI、bashプロジェクト、分散システム、データ構造、アルゴリズムのようなものを絶対に一人では掘らなかったはずだ。
実際、独学者やブートキャンプ卒業者をたくさん面接してきたが、彼らは自分が慣れている領域だけを掘るか、学問的な質問にはあっさり崩れる傾向がある。
一方で、大学でちゃんとコードを書いてこなかった人は実力がかなり低く、大学在学中であっても以前に学んだことをすっかり忘れてしまう。
大学に行く前にある程度コードを書いておくのが最良の組み合わせだと思う。
自分でぶつかって苦労した経験があるからこそ、大学の講義で紹介される理論的でエレガントな解法を本当に自分のものにできる。
RAIIのような概念も、メモリ管理ミスで痛い目に遭ったことが多いほど深く腹落ちする。
ブートキャンプ卒業者と独学者は分けて考えるべきだ。
ブートキャンプにも有能な人はいるかもしれないが、私の知る人たちは、自分で学べずに大学や別分野へ行こうとしていたところ、より安い代替手段としてブートキャンプを選んだケースが多かった。
昔はブートキャンプなどなかったし、オンライン講座や伝統的な学習法も避けていた。
私は何かすごいものを作りたくて、教材通りにやり直すよりも、独立して問題を解くほうがずっとわくわくした。
子どもの頃にCを独学したのも、既存の資料やコードではできないことがあり、どうしてもすごい結果が欲しくて、フォーラムを漁り、文書を読み、試行錯誤で手に入れるしかなかったからだ。
学び方そのものよりも、学びたいという強い欲求のほうが重要だと思う。
大学へ行く前から、私はすでにCやソケットAPIに習熟し、ソフトウェア納品の経験もあった。
高校時代にC64向けのゲームを売ってお金を稼いでいた友人もいた。
私たちは二人とも、新卒より実戦的なコーディング力でははるかに先を行っていた。
私に足りなかったのは、微積分、線形代数、離散数学などの理論面で、データ構造やアルゴリズムでもところどころ知らないことがあった。
CSプログラムはそうした穴を埋めてくれたが、コーディング力そのものを上げてくれたわけではない。
プログラミング関連の科目はまったく難しくなく、私が苦しんだのはむしろ数学と理論科目だった。
CSプログラムは私をよりバランスの取れたエンジニアにはしてくれたが、より良い開発者にしてくれたわけではない。
昔の大学時代、CS学科の雰囲気は、今よく語られる大学の利点とは正反対だった。
私もそのため大学でCS専攻を選ばなかったし(今は米国のテック企業でシニア開発者をしている)、当時のCSは最高成績層だけを集める名門大学だったにもかかわらず、失敗率、失業率、教授陣の空気のすべてが最悪だった。
もちろん大学から多くを得た人もいるが、現実が常にそうとは限らない。
実務で会った多くのCS卒業生は、コミュニケーション、ビジネス理解、仕事の優先順位付けにかなり苦労していた。
コードだけは書けることも多いが(それすら大したレベルでないこともある)、大学のCS課程ひとつで実務に完全対応できている例はむしろまれだ。
むしろ大学の講義スタイルこそ、「コンフォートゾーン」にとどまる代表例だと思う。
大学の授業へのアクセスや学費そのものが、社会的・経済的な階級問題でもあることは認めるべきだ。
そして独学でも、ソケットAPIやbashプロジェクトなどを十分にやってきた人はいる。
ちなみに独学者とブートキャンプ出身者はまったく別のタイプだ。
私は与えられた状況(オーディション型の面接など)では崩れるかもしれないが、一人でいるときには実際の問題をうまく解決できる。
少し老害っぽく聞こえるかもしれないが、私も昔の大学が本当に良かった世代だ。
コンパイラ、toy OS、GPSインターフェースなどを作っていた。
数年前、別の学校で教授として招かれて教えてみたが、とても失望した。
カリキュラムが、今どきのブートキャンプを数年物に引き延ばし、関係の薄い科目を上乗せしたように感じられた。
基礎はほとんどなく、アルゴリズムの授業を除けば、全部Reactや地元スタートアップで人気のあるフレームワーク中心だった。
(編集: 実際にカリキュラムを見ると、ビジネス、経営、人文、化学、環境、起業、eスポーツの授業まであった。)
自分の教育不足を自分で受け入れる過程に、かなりの労力を注いでいるようにも見える。
優れた独学者もいるし、賢くない学位保持者もいるが、自分自身の経験から言えば、CS学位があったほうが自分の道にはより役立っただろうと思う。
CSは本質的にコーディングだけではなく、ME(機械工学)のように職業ごとに期待や役割が異なる。
機械工学の人たちも、車のオイル漏れやタイヤのパンクのような細かな問題は整備士のほうがずっとうまく直す。
だからといって、工学の学位を軽視するわけではない。
私も最初は製造現場で実際に手を汚し、技術者たちが直せないものまで解決していたが、それは個人的な好みと好奇心によるものだった。
独学者が高い成果を出すのは、そもそも独学者になるほどの動機、情熱、自己主導性を持った人たちだからだ。
結局、好奇心、集中力、規律があれば、正規か非正規かに関係なく平均以上になる。
生存者バイアスも働いている――実際には、独学して現場で生き残った事例だけが目に入る。
逆に、うまくいかなかった独学者たちは、きちんとした指導を受けていればもっと良かったのかもしれない。
私はCS教育も数学教育も楽しんだが、枠組みとしてはむしろ自己学習のほうが自分に合っていたと感じるタイプだ。
「しばしば」という言葉は、単に曖昧さを包み隠す表現にすぎない。
私はソフトウェア開発者であり、大学のCS講師でもある。
本当に成功するエンジニアの共通点は、結局のところ「関心」と「情熱」だ。
独学者は当然その分野への関心が強いので、動機が最初から検証済みの集団でもある。
学位保持者のほうはより混在している――純粋に学位だけを狙った人もいて、理論用語だけ知っていて実力の見分けがつきにくくなる。
独学者とは本質的に、既存の仕組みから外れてまで自分で学ぶだけの強い動機と関心を持つ人だ。
知識はボード上の円だと考えればよい。
https://matt.might.net/articles/phd-school-in-pictures/
大学で学ぶ円は驚くほど狭く、しかもだいたい同じカリキュラムだ。
たとえばdmcアルゴリズム(最強クラスの圧縮アルゴリズムに使われるもの)を教える時間はない。
その代わり、誰もが汎用的なカリキュラムばかり繰り返す。
だが、その円の外側まで進んだ人たちもいる。
そういう人たちこそ業界最高のプログラマで、論文でしか見ないような希少アルゴリズムまで自力で知っていて、並外れた実力を見せる。
独学者も同じで、皆が学ぶ共通の円から外れた知識のギャップを持つことがあるからこそ、しばしば自己動機と謙虚さから出発する。
だが彼らの知識の円は、情熱によって有機的に積み上げられたものだ。
この情熱こそが、エンジニアの成果を示す最良のシグナルだと思う。
言い換えると、「何を独力で学ぶべきかを自分で判断し、実際に学ぶ能力をすでに示している人は、そうした力が求められる仕事で卓越する」ということだ。
Torvaldsは1991年にLinuxの最初のバージョンを公開した時点では、CS教育をほとんどまだ受けていなかった。
私も共感する。
私たちも学部課程で、68KアセンブリでマルチプロセスOSを自分で書く課題があった。
こうした経験のおかげで、Linuxカーネルの構造や動作原理にも入りやすかった。
カーネルが何かすら知らなければ、始めることすらできなかっただろうから。
最近、私は未経験の数値解析の問題(疎LUソルバの作成)を独学しようとしている。
いちばん役立った資料は、自分で実装したり既存のソルバのコードを分解したりすることではなく、その内容を扱っていた講義ノートだった。
講義全体を見ることで、自分が知らなかった関連概念まで分かるようになった。
他の分野でも同様で、大学の講義資料が最高品質であることは多かった。
大学の授業は不要だという主張なら、最良の資料が大学の資料であることを説明しにくい。
実際に作ってみることが一番力になるという主張もあるが、大学のプロジェクト自体が常に「実際に構築すること」を評価に積極的に組み込んでいる。
完全に同意する。
深い技術書も素晴らしいが、どんな姿勢で向き合うかによって得られる価値はまったく変わる。
単に理論だけ学んで実際の応用がまったくなければ、興味は薄れ、すぐに全部忘れてしまう。
だが、実際の必要性や関連する作業と結びついた理論を学べば、たちまち必要な実務知識に変わる。
初期に独学で十分な経験を積んだ人が大学に入り、情熱を保ち続けられるなら、短期間で驚くほどのことを成し遂げられる。
結論として、理論はもちろん重要だ。
ただ、まず何かを作ってみてから理論を学ぶと、本当のインサイトが何かをより明確に把握できる。