学びたい技術と学んでいる技術、そして必要な技術

51になりました。現役プログラマ続けてます。
皆に試練の1年。そんな中大変ありがたいことに俺自身は仕事が切れず、ガリガリコードを書き続けた1年でした。元々外でもコード書けるようにメインマシンをMBPにしていたので、在宅勤務になっても困らず。また一昨年から取り組んでいたFlutterによって「うまい、安い、早い(しっかり品質保ってiOS/Android同時開発しても予算抑えて短納期ですお客様!)」という提案・実績を積めたのも大きかった。1年前に比べていただく案件の傾向は変わったけど総量は減るどころか増加気味の日々です。
エンジニアと呼ばれる業種の中でも、ネットとマシンさえあれば仕事できるプログラマは在宅勤務に向いているのは確かで、「今すぐプログラミング覚えてプログラマに転職しよう」なんて話題も増え続けている。
俺自身は今後もプログラマでいるつもりだけど、それでもプログラマって皆が憧れるような仕事なのか?とか、プログラミングって金出せば学べるものなのか?とか、最近の風潮に対しては色々感じることはある。が、それらは置いておいて先に考えなければいけないことは、「なにが出来るプログラマになりたいのか?」だと思うのだ。プログラマに必要な技術はとにかく膨大だ。

プログラミングを行うための技術を挙げようとすると、「プログラミング言語」「アルゴリズム」「OS」「フレームワーク」「規約」「ネットワーク」「データベース」「CPU」「描画」「音声」…大きな分類で挙げてもきりがない。そしてそれぞれすべて世界が広い。なにせ完全に理解したと自慢するのは許されてもチョットデキルなんて言えるのは作った本人ぐらい。これは冗談ではあるが知れば知るほど納得する冗談。さらに技術はすべて日々広がり続けている。分厚い広辞苑でも最初から1ページずつ読んでいけばいつかは全ページ読み終わる日が来るが、爆速で進化し続けるプログラミング技術をすべて知る日が来ることはない。だからまず考えなければならないのは自分が学ぶ分野、方向を可能な限り絞ることだ。

プログラミングスクールや独学、なんでもいいけどプログラミングを学んでいるとして、学び終えれば自分の思い通りになんでもコードが書けるようになるし、様々な企業が雇ってくれるだろう、と期待しているだろう。しかしその期待は「自分が学んでいる技術」と「自分が学びたい技術」と「仕事で必要な技術」がすべて同じ範囲であった場合のみ叶うもので、実際には下の図の通りそれぞれが大きくずれた範囲となる。

自分が今学んでいるプログラミング技術の範囲を赤エリアとする。学んだだけ赤エリアは広がるが限られた時間で無限に広げることは出来ない。職業プログラマになりたいとすれば必要な技術範囲は青エリアであるが、このエリアはとにかく広すぎて全体像すら掴めない。「Webプログラミング」「アプリ開発」ぐらい限定してもやっぱり広いままだろう。学んで会得した技術と仕事で必要な技術を合わせてみた時に、その重なり具合が狭ければやっぱり仕事の役には立たない。
広大な青エリアに対して自分が広げられる赤エリアはとにかく狭いので、貴重な赤エリアを出来る限り青にエリアに合わせる努力が必要だ。そのためには青エリアの中から自分が食い込みやすい範囲を絞り、そこだけに集中して取り組むことで早く赤と青のエリアを重ねていく。最初に書いた「なにが出来るプログラマになりたいのか?」とは「自分が食い込みやすい範囲を絞る」ことに繋がる。何ヶ月後にどんな案件の開発をしたいのか、それぐらい具体的なイメージを掴んでやっと効率の良いプログラミング学習を行える。
プログラマも含めて技術者というのはやはり技術に対して思い入れがあって、せっかく学んで使うのであれば正しい、美しい、本質である、未来を感じる、そんな技術を相手にしたいものだ。上図ではそれを緑エリアとしていて、緑と赤がずれていても、あるいは緑と青がずれていてもプログラマは理想と現実の狭間でストレスを感じやすい。このストレスとどう向き合うかは人それぞれなので割愛するが、重要なことは今自分が学んでいる、あるいは会得している技術と、自分が学びたいと思っている理想的な技術との差、赤エリアと緑エリアの違いを理解できないと、今後のプログラミング学習がすべて次の案件のための最低限の予習に成り下がる。ある要件を満たすコードを書けってだけでも書き方は千差万別。直近の案件ではググって見つけたコードを真似するのが精一杯だったとしても、本来は別の書き方があったはずだとか、いや別のプログラミング言語ならこんなに楽に書けたよねとか、コード書きながらでも自分に問い直していくことで赤エリアを少しずつ緑エリアに合わせて広げていく。広げれば広げるほど、仕事に対するアプローチも広がる。仕事を捕まえやすくなるし評価も良くなる。いまコードを書いていてストレスをまったく感じないとすれば、きっと次にコード書くときも自分は進化していない。

プログラマは誰でも名乗れるとしても、それで仕事を得るつもりなら学び続けなければならないし、学ぶ方向をきっちり見定めなければならない。でなければプログラマとして食っていくことも、食い続けることも出来ない。