30歳からのプログラミング

30歳無職から独学でプログラミングを開始した人間の記録。

技術選定の観点や技術の優劣について

技術選定を行う前にまず、どのような開発組織にしたいのか、どのように事業を進めていきたいのか、そこを整理しないと上手くいかない。
そんなことを最近考えていたので、ブログに書いておく。自分は書くことで思考を整理していくので。

この記事では、「技術選定」そのものについて書いていく。
そのため、個別のライブラリの良し悪しを判断する手法などについては扱わない。もっと抽象度の高い、どのような考え方や態度で技術選定に臨むべきか、というようなことを書いていく。

また、作りたいものを作れるか、仕様を満たせるか、セキュリティ上の問題はないか、などの当然の前提は省く。
そういった「最低条件」を満たした技術が複数あったときにどうやって選ぶのか、という意味での「技術選定」を扱う。

お互いの「納得感」のためにもまずは軸を明確にする

技術選定について考えたり誰かと議論したりする際には、「自分たちは今、どういう観点を基準にして技術を選ぼうとしているのか」を明確にすることが大事だと思う。
そうしないと、思考が迷走したり、議論が噛み合わなかったりする。

社内にノウハウが蓄積されていることを理由に技術Aを推している開発者がいる一方で、今後の人員の増加のためにBを推している別の開発者がいるとする。
このときに議論すべきなのは、「ABのどちらが適切か」ということではなく、「自分たちはどういう観点で技術を選ぶのか」ということだと思う。そこの認識を合わせる前に具体的な技術の話をしても、上手くいかない。
既存の開発者と相性のよい技術を選ぶのか、それとも、人員を増やすために採用活動に有利な技術を選ぶのか。どちらの観点をどの程度優先するのか。ここの擦り合わせを行っておかないと、議論は平行線を辿る。一人で技術選定を行う場合も、どういう観点で判断すべきなのか自覚的であったほうがいい。
転職活動においてまずは「企業選びの軸」を決めるように、技術選定においてもまずは軸を明確にしないといけない。
特に複数人で技術選定を行う場合は、納得感を醸成するためにもしっかりと考え方について合意を取っておいたほうがいい。絶対的な答えが存在しない中で、自分たちは相対的に何を重視して何を妥協するのか。また、妥協するにしても、譲れない最低ラインをどこに引くのか。こういったことを明確にしないまま技術選定を行ってしまうと、納得感は生まれにくく、不満が残りかねない。

最終的には事業戦略や組織戦略の話になる

技術選定の観点は、先程の例の他にも様々なものが存在する。
短期的な生産性を重視したいのか、時間を掛けてでも堅牢なシステムを作りたいのか。安定性のために十分に枯れている技術を使いたいのか、開発者のモチベーションや技術的な優位性のために最先端の技術を積極的に取り入れていきたいのか。
様々な観点があり得るし、どの観点を重視すべきなのかは、状況によって変わる。つまり、「どのような観点で技術を選ぶのか」についても、前段の議論に依存する。ここでいう「前段の議論」とは、事業や組織に対する基本的な考え方や戦略のことである。

とにかくスケールさせて時価総額を高めることや上場することを目指している組織と、人を増やすことに慎重で少数精鋭のまま経営していくことを意図している組織とでは、当然、技術の選び方にも違いが出てくる。
事業内容によっても違う。可能な限り長く運営していくことを意図しているウェブサービスの開発と、納品や出荷をすれば終わりというプロダクトの開発とでは、技術の選び方はかなり変わってくるだろう。前者では常にメンテナンス性を意識することになるが、後者は必ずしもそうではない。少なくとも優先度は変わってくる。
また、既に売上を稼いでいる主力サービスなのか、それとも実験的なプロダクトなのか、といったように、プロジェクトの立ち位置によっても変わってくる。

まとめると、まず事業や組織の戦略について整理する。そして、その戦略を実現するためにはどのような観点で技術を選ぶべきなのか、考える。そしてその観点に従って、具体的な技術選定を適宜行っていくことになる。

現場のニーズに応えられる技術か

このように、「現場のニーズ」から、どの技術を選ぶべきなのかが決まってくる。具体的な状況を想定しない「技術選定」は存在し得ないと思う。この記事では事業における技術選定を扱っているが、個人開発や OSS の現場でも、やはり何からのニーズがある。「仕事で使っていない技術に触りたい」というのも、立派なニーズだ。そこから、「仕事ではいつも React を触っているから Elm をやってみるか」などの技術選定が行われる。
まずはニーズがあって、じゃあそれに最もよく応えてくれる技術はどれか、という論の運び方になる。

そこから分かるのは「最強の技術」などはないということだ。
いついかなる時も選ぶべき「決定版」のような技術など存在しない。
守備範囲が広くて多くのケースに応えられるから採用されやすい技術、というものはあるかもしれないが、それでも、常にその技術が正しいというわけではない。
そしてこのことは、技術に対して単純に優劣をつけることは難しい、ということも意味する。ある特定の観点や尺度において優劣をつけることは出来るかもしれないが、別の観点を持ち込めば結果はまた変わってくる。

長期にわたって広い人気を獲得している技術は、他の技術よりも優れているから人気を獲得したわけではなく、多くの現場のニーズに上手く応えられたから人気を得たのではないだろうか。
もちろん、人気というのは色んな要因で決まるから、そう単純な話ではないが。
それでもやはり、一時的なブームではなく安定的な人気を得るためには、多くの現場のニーズに応えていることが必要条件になると思う。逆に言えば、技術的に高度であったり、先進的なことをしていたりすることは、人気を得る上ではあまり関係ない。
そう考えると、ある技術が人気なのは、それが「優れているから」ではなく、多くの現場のニーズに応えているからに過ぎない。そのため、人気のある技術だからといって、自分たちの現場のニーズに上手く応えてくれるとは限らない。人気という意味では後塵を拝しているような技術のほうが、自分たちの状況に上手くハマる可能性は十分にある。

ライブラリの盛衰

そして、「最適な技術」は時間の経過によって変化していく。
なぜなら、現場のニーズは変化していくから。創業期と拡大期では、事業の戦略や進め方は変わってくる。市場の変化によってビジネスモデルそのものが変わることもあるかもしれない。
同様に、技術の立ち位置も変化していく。より便利な後発の技術が出てくるかもしれないし、利用事例が増えることで「実務に耐えられる」と見做されて採用されやすくなることもあるだろう。

定期的に「XXX(任意のライブラリやフレームワークなど)はオワコン」のような言説が出回る。大半は読む価値のないものだが、中には(表現はともかく)鋭い指摘をしているものもある。
それまでは「多数派のニーズ」に上手く応えておりそれゆえに人気のあった技術が、変化した「多数派のニーズ」に上手く応えられなかったとき、あるいはもっと上手く応える別の技術が出てきたときに、「衰退」が始まるのかもしれない。個人的にはそんな風に思う。

とはいえ、それはあくまでも「人気」の話であり、「優劣」ではない。
もちろん「人気」も重要な尺度ではある。「開発者のモチベーション」「開発者の集めやすさ」「エコシステムの充実性」などの理由で「人気」の技術を選ぶことは十分にあり得る。だがそれは、尺度のひとつに過ぎない。
それ以外の尺度を重視している組織にとっては、「衰退」した技術が上手くマッチすることもあり得る。

プログラミングを勉強するために 30 代半ばの 2 年間を無職として過ごした話

2019 年の夏に前職を辞め、そのまま無職として過ごし今年の 10 月にようやく再就職して働き始めた。
何か事情があって働けなかったわけではなく、プログラミングの能力を伸ばすために敢えて就職しなかった。

自分にとってそれなりに重要な期間だったと思うので、記録を残しておく。

予め断っておくが、何か「すごいこと」を成し遂げたわけではない。「すごくないプログラマ」が少しでもすごくなりたくて勉強していた話に過ぎない。
「すごいプログラマ」が「すごいこと」をした話を読みたければ、以下の記事などがよいと思う。

予防線を張ったところで、本題に入る。

背景や動機

プログラミングの勉強をするために前職を辞めたわけではなく、退職の理由は別にある。
そのため、転職をするかしばらく無職として過ごすのかの二択だったので、後者を選んだ。

今の自分が転職活動しても満足の行く成果は得られないだろうなと思っていた。プログラミングを始めたのが遅かったためスキル不足は否めず、転職市場で評価されるような華々しい経歴も持っていない。
実際、試しに使ってみた転職ドラフトでも、魅力を感じるオファーはもらえなかった。

この、「プログラミングを始めるのが遅かった」「プログラマとしてのスキルが低い」という自己評価や劣等感が、根底にある。
とにかくこれをどうにかしたいという切迫感があった。
このままだと「スキルが低い -> スキル不足でも出来る仕事しか得られない -> 成長できず相変わらずスキルが低い」という悪循環に陥るように思えたので、何とかここでこのループを断ち切りたかった。
スタートの遅さをカバーするために、集中的に勉強して一気にショートカットしたかった。プログラミングを始めたのが 30 歳である以上、悠長に構えてのんびりやっているわけにはいかない。

概ね上記のようなモチベーションで無職生活に突入したが、無職になること自体には何の抵抗もなく、何か思い切った決断をした感覚もなかった。
そもそも最初にプログラマとして就職する前も、一年間無職として過ごしてプログラミングを勉強していた。新卒で入った信用金庫を辞めたあとも何もせずフラフラしていた。10 代のときは高校を中退して引きこもりをやっていた。
社会からドロップアウトするのは自分にとって「いつものこと」であり、今更どうでもよかった。

実際にどんな風に過ごしたか

フリーランスとして短期の仕事を請けて生活費を稼ぐ、というようなことも一切せず、本当に無職として過ごしていた。
それまでの仕事が高給だったわけではないが、酒もタバコもギャンブルもしないしインターネット以外にこれといった趣味もないので、貯金はあった。
普通の人が車などを買うように、数百万円で無職生活を買った、という感覚。

具体的に何か作りたいものや習得したいスキルがあったわけではなく、「技術力を上げたい」という漠然としたモチベーションだったので、とにかく興味のあること、知りたいことを学んでいった。
学んだことの全てをブログでアウトプットしているわけではもちろんないが、このブログの記事一覧を見ることで、いつ頃に何をしていたのかは概ね分かるはず。

基本的には、いわゆるフロントエンドと呼ばれる領域を中心にやっていた。これには理由があって、就職活動を意識した結果、こうなった。
ずっと無職を続けていくことは望んでいないし、そもそも不可能。どこかで就職することになる。だから、就職活動がこの無職生活の「出口」になる。そのため就職活動はどうしても意識せざるを得ない。より具体的には、就職活動で評価されるかどうかを意識することになる。
その結果、フロントエンドが中心になった。自分の場合、フロントエンドしか実務経験がない。だから例えばバックエンドに投資した場合、「バックエンドについては最新の知識を持っているし自信もあるが、実務経験はフロントエンドしかない」という中途半端な人材になってしまう。これではアピールしにくいし、「自分がどういうプログラマなのか」がぼやけてしまう。コンピュータサイエンスにも興味はあったが、ちょっと学んだくらいでは評価されないだろうなと考え、時間を割く勇気を持てなかった。
後述するが、この読みは当たっていたと思う。

やってみてどうだったか

「急激な成長」というのは実現できなかった。2 年はあくまでも 2 年であり、その分の成長しかできない。
とはいえ、ある程度の成果は得られたので、後悔は全くしていない。

上述した劣等感をだいぶ払拭できた。「自分はプログラマとしてものすごく劣っているのではないか」という根拠のない不安があったのだが、事実の積み重ねによってそれを克服できた。
確かに知らないことも多いが、それはただ単に今まで触れたことがないからであって、気にする必要はない。他のプログラマに比べて思考力や理解力が特段劣っているわけではない。そう思えるようになった。
「何も分からない」と感じる技術に取り組み、「記事やドキュメントを読んでも全く理解できない -> 糸口が掴めてきた -> 思考が整理されてきた -> 自分の中にメンタルモデルを構築できた」という一連の経験を得る。これを何度も繰り返すことで、自分の能力に対する自信が育っていった。

その一方で難しかったなと感じることもあり、そもそも独学では学ぶことが難しいスキルについては、どうしようもなかった。
例えばチーム開発については、その定義からして一人ではどうにもならない。他にも、運用やリリース周りの知識についても学習の難しさを感じた。一人での開発しかしないから、ただでさえ低かった Git 力も落ちたと思う。
それから、ベタな話だが、モチベーションの管理も難しかった。時間が豊富にある分、危機感が薄れてしまった。また、「勉強のための勉強」のようになってしまうとやる気が出ないので具体的な課題を設定したほうがいいのだが、適切な課題を設定するためには最低限の知識が必要になる。そのためどうしても、新しいことを学ぶ時は「つまらない勉強」をするフェーズを経ないといけない。この時期のやる気の保ち方が難しかった。

就職活動

2 つの時期に分けることができる。今年の 2 月くらいにあるキッカケがあって何となく始めてみて、思うような結果が出なかったのですぐに止めた。その後、そろそろ就職しないとお金が持たないなとなって、夏くらいから本格的に職探しをしていた。
友人やエージェント等に紹介してもらうことはなく、自分でネット上で探して応募していた。

就職活動は結局は相性、タイミング、運だと思うから、振り返りが難しい。しかも通り一遍のフィードバックしか得られないから、自分の主観的な感想にならざるを得ない。

全体的な感想としては、厳しかった。売り手市場だとは全く感じなかった。自分の年齢もあるのかもしれない。
この方とは状況が全く違うけど、年齢が上がれば上がるほど厳しくなっていくという傾向は、やはりあるのかもしれない。

2 年間独学したことに対する反応も、芳しくなかった。あまり評価されなかった。
現場の開発者レベルではそんなに反応は悪くなく、このブログについてもかなりポジティブな反応をもらうことが多くて、話が噛み合うと感じることも多かった。実際に選考の通過率も悪くなかった。
問題はそのあとで、非開発者にとってはブログとかどうでもよく、「年齢のわりに実務経験が少なすぎるし、直近 2 年間無職という得体の知れない人間」という感じだったのかもしれない。採否は複合的な要因で決まると思うが、少なくとも独学してきたことが評価されているような感覚はなかった。ただのビギナーとして扱われているような印象を抱いた。非開発者にスキルを理解してもらうためには、著名なテック企業で働いた経験、学位、世界的に使われている OSS、あたりが必要なのかもしれない。自分はどれも持っていなかった。

それから、実務経験が少ないと、話すネタがなくて困ることになる。現場の開発者の反応は悪くなかったと書いたが、あくまでもそれはそれであり、選考で求められるのは基本的には実務におけるエピソードである。

「働かずに一定の期間プログラミングを勉強すること」に関心がある人のために正直に書くと、短期的な転職市場での評価を考えるならば、働かずに独学するのは悪手だと思う。「独学」の内容にもよるが、よほど突出した成果を出さないと厳しい。もちろん人によってバックグラウンドというか前提条件が違いすぎるから、何とも言えないんだけれども。
自分は場合はそもそも経歴が滅茶苦茶だから、独学がどうという話ではないのかもしれない。書類選考が通らないことも多かった。信用金庫での外回りの仕事、ベンチャー企業でのバックオフィス、そして 30 歳過ぎてからのプログラマへの転身。さらに直近 2 年間は無職……。こうやって書いていると本当に滅茶苦茶だし、警戒されるのも無理ないのかもしれない。
ポジティブに捉えれば、珍しい経歴だから印象に残りやすいというのはあると思うが。

余談だが、ここらへんのルールを守れていない企業があって辟易とした。

応募者の適性・能力に関係のない事柄について、応募用紙に記入させたり、面接で質問することなどによって把握しないようにすることが重要です。これらの事項は採用基準としないつもりでも、把握すれば結果としてどうしても採否決定に影響を与えることになってしまい、就職差別につながるおそれがあります

止めましょう。

現在

10 月から株式会社HERPで働いている。
BtoB の SaaS を提供している会社で、「採用」が対象領域。選考を受けた会社のなかにも、弊社サービスを使っている会社が複数あった。

入社した理由はいくつかあるが、組織に柔軟さがあって硬直化していなさそうだから、というのが大きかった。
プロジェクトを成功させるためには技術力だけでは不十分で、開発プロセスが上手く機能していないと破綻するんだと、前職で思い知らされた。そして、開発プロセスのさらに土台にある企業文化が健全でないと、開発プロセスを変えようとしても上手く行かないのだということも、思い知らされた。また、透明性が低い環境は精神衛生に悪いのだと学習した。

そういうことを考えながら就職活動をしていたタイミングで、以下の記事を読んだ。

note.com

LeSS やスクラムそのものではなく、自社の開発プロセスの問題を認識し、それに対してアクションを起こしていることに興味を持った。そういうことができる組織は健全だと思うし、ソフトウェアエンジニアがスクラムマスターになったのも面白かった。
話を聞いてみるとフラットな印象を受けたし、疑問や違和感を持ったときに発言でき、それをひとつの意見として尊重されるような雰囲気を感じた。

Haskell をプロダクトで使っているというのも面白そうだった。JavaScript や TypeScript 以外の言語についても実務経験を積みたいと思っていたが、どうせなら JS/TS とは毛色の違う言語をやって自分の幅を広げたいと考えており、Haskell はちょうどよかった。
そして単に Haskell が魅力的、というだけでなく、いい意味で思想や意見の強い開発者が多そうだった。

まだ入社して日が浅いが、今のところ上記の印象通りの会社だった。
頭のいい人が多いというか、言語化能力が高い人ばかりで、ロジカルにやり取りができる。そのため、自分の意見を表明することに躊躇いが生まれない。
オンボーディングもしっかりしており、今まで様々な会社(100 年以上の歴史を持つ「伝統的な」企業や、設立 1 年未満のベンチャー企業など)を転々としてきたが、一番力を入れていた。

最後に、個人的な話。
既に述べた通り自分は 30 歳からプログラミングを始めたことに強い切迫感や劣等感を持っていて、それをエネルギーにしてここまでやってきた。始めたのが遅いことを言い訳にしたくないというか、10 代の頃からプログラミングをやってきた人たちには負けたくない、追いつきたい、という気持ちをモチベーションにしてきた。具体的な誰かというわけではなく、「有名大学に通いながらメルカリ、はてな、サイバーエージェントあたりでインターンして、卒業後はメガベンチャーや勢いのあるスタートアップに就職」みたいな人たちに追いつきたいと、一人で猛っていた。
入社して知ったのだが、HERP の開発陣はそんな人ばかりだった。はてなインターン経験者何人いるんだよ。だから、もういいかなと思った。技術力はまだ遠く及ばないけど、同僚になったから、そういう意味では「肩を並べた」と言える。コンプレックスのおかげでここまでやってこれたけど、今後はもっと前向きで健全なモチベーションを見つけて、それでやっていこうかなと思っている。

We are Hiring!

そんな株式会社HERPは、シリーズBの資金調達も終え、積極採用中です。

careers.herp.co.jp culture.herp.co.jp

特にフロントエンドは、特設サイトを用意するくらいリソースが足りていません。

frontend-engineer-recruiting.herp.co.jp

興味のある方はぜひ上記の各種サイトを覗いてみてください。

Twitter で相互フォローになっている方は、私に DM を送って頂いても構いません。

よろしくお願いします。