プログラマーの学習方法は1つを極めるべきなのか、広く学ぶべきなのか?
プログラマーの学習方法はどうするのが一番良いのでしょうか?
ある人は1つに決めてひたすら習熟し、その後に別の技術に手を出すべきだ。と言います。
はたまたある人は1つだけを学んでいても意味がないから、幅広く学ぶべきだ。と言います。
どっちだよ!!って思いますよね。
この記事を書こうと思った最初の理由はこのツイートでした。
経験の浅いうちはあれもこれも手を出してしまいがちだけど、これを極めようと1つ決めて進むのがオススメ。どんな業種にも言える事だと思うけど。個人的にはPHP系から入って業界の事を色々知りつつ、ニ,三年後ぐらいに余裕が出てきてから次の言語やFWに手を出すくらいが丁度良いと思う。
— TomoyaShirai@SnS🚀 (@shiraponsu) 2019年4月16日
うんうん、その通りだと思います!
ですが、1つを極めた場合とあれこれ手を出した場合は何がどう違うのでしょうか?
2つの学習方法の違い
ここでは便宜上、「1つを極めた場合」を「特化型」、「広く学んだ場合」を「汎用型」と呼称することにします。
では早速、具体的にどのようなスキルマップになるのかグラフの例を見てみましょう。 各スキルの合計値はどちらも同じにしてあります。
これらのグラフを見ると、やはり特化型の方が1つのステータスに全振りできるので圧倒的に即戦力になりそうですね。 汎用型は全体が平均化してしまうので特化型の分野においては絶対に勝てそうにないです。
やはり特化型の一強に見えます。
筆者の学習方法
この流れで言うと「お前バカかよ」って言われそうですが、実のところ筆者はガチガチの汎用型です。
始めて3年後にはwebもゲームもインフラもやって、15種言語くらいはアプリ作るのに使ったし、FWもライブラリも触りまくって、結果的に広く浅くを体現してしまった……。
— なっかー (@konsent_nakka) 2019年4月17日
一つを極めておけばなぁと思ったこともあれば、これでよかったなぁと思ったこともあるので、どっちが良かったのか未だに不明 https://t.co/ksmyErCnid
やりたいことがありすぎて気がついたら汎用型になってしまった典型パターンです。 ですが、おそらく自分には汎用型の方が向いていたのだと思います。
特化型より汎用型の方が向いていた話も出てきたところで両方のメリット・デメリットを考えてみましょう。
特化型
メリット
名前の通り特化できるので極めた分野においては無類の強さを発揮します。
- この問題を得意な言語で解いてください、と言われたら特化分野を武器に戦えます。
- 仕事でも特化分野の強さを生かしてリードできるかもしれません。
- 分野が決まっているので仕事が選びやすいです。
- 一つ極めたことで、似たような他の分野も学びやすくなります。
- あれもこれもと多くの分野を学習する必要がありません。
デメリット
名前の通り特化しているので他の分野が弱いです。
- この技術でやってください、と言われてもやったことないものが多いので最初から学ぶ必要があります。
- 他の分野のことが全然分からなかったりするので、仕事でのコミュニケーションが大変です。
- 特化分野以外の仕事は選び辛いです。
- 他の技術をやると考え方の違いが大きすぎて、取り掛かりが大変だったりします。
- 初心者の3年間は一本特化で行くぞ!と決めてしまうことによって、視野が狭くなって特定分野しかできなくなる場合があります。
汎用型
メリット
特化型とは違い幅広い分野を学んでいるため視野の広さで強さを発揮します。
- いろんな分野を知っているので話せる技術の話が多いです。
- 分野にこだわらず仕事を探せます。
- 仕事をするときに自分の知っている分野が多いため、他分野の人(エンジニア以外も含め)とも簡単にコミュニケーションが取れます。
- 多くの分野に触れてきたので、新しいことでも弊害なく受け入れることができます。
- その時に応じた非常に柔軟な行動ができます
デメリット
分野ごとの力量が平均化しているので、自分の代名詞と呼べるこれぞという分野が生まれづらいです。
- 特定分野のめちゃくちゃニッチな話にはついていけません。(EB3E90が~、なんて言われてもOSの細かい話にゃついていけないよ!となるわけです。)
- この技術の経験が何年以上の人を募集する。と言われると辛い。
- 自分が何の分野の人間だったか忘れそうになります。
- 新しいことでも弊害なく受け入れすぎた結果、やりたいことが増え続けます。
- 柔軟性が高すぎて、柔軟性の低い人が何故そんなに柔軟性がないのか分からなくなったりします。
汎用型の真の力
汎用型にはまだ見ぬ真の力があります。変身を残しているのです。
汎用型には特化型に絶対負けない数があります。
これらを抽象化することが重要なのです。
浅く広くを上手くやるには、それぞれの技術を抽象化して繋げる必要があります。 上手く抽象化して技術の掛け算を発生させると、広く浅くやってるのに気が付いたら深いところまで理解していたりします。
一つの技術を突き詰めてやって行くと何度も成長の壁(学習曲線の横ばい部分)に当たり、この壁に当たっている間は辛く苦しい期間が続きます。 複数の分野を適切に並行して学習していると、成長の壁を別分野から迂回してすんなり通過することが多々あります。 これを上手く使えば成長の壁を意識することなく永遠に成長し続けることができます。
この抽象化、迂回が上手くできれば触った分野が多くなるほど情報が集積され、既存分野の底上げがされます。
グラフにするとこうなります。
ですが、この道を進むには生半可な気持ちでは難しいです。
汎用型を突き詰める場合にやること
汎用型を突き詰める場合にやること・大事にすることは大きく分けて3つあります。
1つ目に、多くの分野を学ぶということは、それだけやった内容を忘れていく可能性が高いと言うことです。
前提条件として学んだ内容を可能な限り自分の血肉として蓄える必要があります。
すでにやった内容を忘れないようにSNSやブログ、メモにアウトプットをすることは非常に重要です。
そしてやった内容をただアウトプットするのではなく、この段階で他の技術と抽象的に結びつけた自分の見解を加えることで抽象化の能力を高めることにもつながります。
2つ目に、ある分野を特化しないので、意図的に様々な分野を学び続ける必要があります。
もちろん特化型も学び続ける必要がありますが、それ以上に汎用型は学びを止めた時点で価値が下がります。
特化して鍛えた技術は古くなっても一定の需要がありますが、汎用的に鍛えた技術は古くなるとあまり価値が高くありません。
3つ目に、偏見や固定概念を持たずに新たな概念や技術をどんどん取り入れることが大事です。 自分の知らない考えを柔軟に取り入れ、ダメな考えは反面教師にし、自分を高め続けましょう。
柔軟な考えとは時に一般人が考えもしないようなところすら学びに転換できる能力も含まれていると思っています。 以下の記事は独自の発想転換で無理やり学びに繋げたエピソードを記事にしたものです。
まとめ
汎用型を突き詰めるには相当の努力と覚悟が必要だと思います。 そして何でも楽しんで学べる人でないと向いていません。
多くの人には特化型をおすすめします。 そして特化型は単純に強いです。
私自身、特化型に憧れもありますのでどちらが良い、悪いということもありません。 自分にあった道を選んでも良いんだということと、道を選ぶ際の基準を知っていただければ嬉しいです。