早いもので、4月から新卒でWEB系のプログラマーになって、早半年が過ぎようとしています。
この半年の間に開発者として成長できたか?と聞かれると自信を持って首を縦に振れるは怪しいですが、大体以下の点では変化がありました。
①に関して、入社時点での私のTech StackはフロントエンドがAngularで、バックエンドがRuby on Railsという感じで、両者とも良くわかっていないけどなんとなく書けるという感じでした。
入社してからも仕事ではフロントエンドでAngularを書く機会が多かったものの、それと並行して個人開発でGatsby(本ブログ)、NextJs、React NativeなどReactベースの技術に触れ、今ではすっかりReactの虜になってしまいました。
Angularは、リアクティブプログラミングやストリームという概念が本当に難しくて、イベントハンドリングや非同期処理を全てObservableとして扱うのが正直よく分からんです。
Reactならhooksを使うことで変更が動的にDOMに反映されますし、また、Angular独特のライフサイクルのngOnInit
もngOnChanges
もngOnDestory
も、Reactなら全てuseEffect
で代用できます。
ngOnChanges
であればdependency list(以下deps)
に依存変数を与えれば良いですし、ngOnDestory
ならクリーンアップ関数を入れればいいです。
あとAngularはただでさえフレームワーク独特の記法が多いのにそれに加えてRxJs
で提供されるオペレーターもすごく多くて、毎回ググりながら開発せざるを得なく、それが結構ストレスでした。
この辺の話題はこの記事の本題ではないのでこの辺りにして、次に②ですが、CSS力は自分で言うのもなんですが正直めちゃくちゃ伸びました。
複雑なアニメーションなどは作れませんが、Figmaを頂いてそれと同じ見た目を作れ、ということであれば今は問題なく作れます。
あとは単純に私の能力というよりは、styled components
での開発体験が良すぎて、CSSを書くことが苦ではなくなったというのがあります。
余談にはなりますが、私は元々バックエンド志望でWEB開発をスタートし、フロントエンドはやりたくないとさえ思っていましたが、その理由はCSSを書きたくなかったからです。
それを考えれば、今私がCSSを得意分野に挙げているのはなかなか感慨深いものがあります。
最後に③ですが、前述の通り私は元々バックエンド開発者志望で、開発歴自体はもバックエンドの方がフロントエンドよりも少しだけ長いです。
初めにDjango
というPython製のバックエンドフレームワークでポートフォリオを作り、その後長期インターン採用で自社サ系企業に潜り込んだ後は専らRuby on Rails
を書いていました。
とは言え、いまだにORM頼りで生のSQLは書けないですし、DBの設計なんてできないですし、アーキテクチャとかは何もわかりません。
それでも見様見真似でなんとなくは書けているのかな〜?と思っていたのですが、業務委託で弊社に入られたRuby on Railsがすごくお強い方にボロクソに言われ、自分はバックエンドを何も分かっていないと悟りました。
また開発を続けていく過程で、(Rubyとの対比で)NULL安全や型推論を兼ね備えたTypeScriptという言語を触れば触るほど好きになり、加えて「自分は動くもの・目に見えるものを作るものが好き」ということに気づき、自分の主戦場はフロントエンドなんだという確固たる信念(?)ができました。
そんなこんなで入社から半年経った駆け出しプログラマーのぼくですが、これからどの領域をどの程度勉強していこうかと結構悩んでいます。
ぼくの最終的な目標は、個人開発で作ったアプリやWEBサービスから得た収益で生活をすることです。
昔はFANGやGAFAなどの呼称で呼ばれるBig Tech Companiesに憧れていた時期もありましたが、私がプログラミングをする理由は「モノづくりが好き」だからで、自分で良いと思ったサービスを自分の手を動かして作り上げ、それが結果としてユーザーの方々の生活を豊かにすることができればこれ以上ないほど幸せだろうと気付いてからは、上記企業への憧れは消えました。
自分がプログラミングをする目的を考えると、上記企業に入るためにLeetCode
などであまり興味のないアルゴリズムやデータ構造の学習に多大な労力を割くのはあまり本質的でないと自分の中で結論付けました。
私を含め多くのフロントエンド開発者が厚い信頼を寄せるDeveloperで、あのRedux
の開発者でもあるDan Abramov先生は、自身の記事であるThings I Don’t Know as of 2018という記事で、以下のように述べていました。
Algorithms. The most you’ll get out of me is bubble sort and maybe quicksort on a good day. I can probably do simple graph traversing tasks if they’re tied to a particular practical problem. I understand the O(n) notation but my understanding isn’t much deeper than “don’t put loops inside loops”.
簡単に訳すと、「アルゴリズムはオーダー記法とかバブルソートくらいしか分からんぜ!」みたいなことを言っているのですが、それでも彼はRedux
というモダンフロントエンドのスタンダードとなる状態管理ライブラリをつくり、そしてそれは世界中で使われています。
また、他にも有名な話でHomebrewの開発者であるMax Howell氏が二分木という基礎的なデータ構造を知らないという理由でGoogleを落とされましたが、確かに彼はCSの基礎的な部分の知識は欠けていたかもしれませんが、それでもHomebrewという超素晴らしいライブラリを作り上げ、それは現在多くの開発者に使われています。
FANGに入るために日々アルゴリズムやデータ構造の学習を続ける方々は多くいらっしゃり、その行為自体は凄いと思いますが、それよりも私もDan氏やMax氏のようにアルゴリズムの知識が乏しくても現実の問題を解決するライブラリを作り上げる彼らのような開発者に憧れます。
勿論今は勤務先の会社に色々と返さなければならない恩もありますし、何より今の会社で作っているプロダクトがすごく好きなので今すぐ会社員を辞めるつもりはありませんが、ゆくゆくは個人開発者として独立できれば良いな〜と考えています。
それを前提に、問題となるのは「どの分野」を「どの程度」伸ばしていくか、ということです。
1人でプロダクトを回して行こうとするとあらゆる分野に気を配らなければならないのに対し人生というのは有限なので、当然どこかで取捨選択しなければなりません。さもなくば先に寿命が尽きます。
そこで大雑把に2021年第四四半期から2022年第三四半期までの1年間で伸ばしたい能力をここで列挙してみようと思います。
勿論ここで述べるものは変動の余地がありますし、あくまで目安程度のものです。
これは完全に余談ですが、ぼくの夢はUIデザイナーの方と結婚して、奥様が作ったデザインを元にぼくが開発したサービスで生計を立てることです。
もしこの夢が本当に現実で叶ってしまったとするとUI設計の勉強をすることは完全に手持ち無沙汰になってしまう感が否めませんが、現実でこの夢が叶う保証もないので、使いやすいサービスを作り上げるためにはUI設計の知識をつけることは大切です。
先日個人開発でMuscle Note(マッスルノート)というiOSアプリをリリースしたのですが、その際に最も悩んだのがUI設計でした。
とことんまで使いやすいインターフェイスを作りあげようと個人的には頑張ったつもりでしたが、まだまだ改善の余地はあると思っています。
マッスルノートの開発を終えた後に本職のUIデザイナーの方にオブジェクト指向UIデザインという本を勧められて読んでみたのですが目から鱗の内容で、もっと良いアプリをつくれるようになると確信を得たので、この分野は伸ばしておいて損はないと思います。
理想としては、自分でFigmaが触れるようになると、個人開発の質がグッとあがりそうな気がしています。
ただ、現在会社員という組織の中で役割が分担された環境においてはUI設計の知識は実務で殆ど役に立たないだろうという気はしています。
こちらの分野も、企業という組織の中で下っ端プログラマーのぼくの立場ではなかなか包括的に考えることが少ない分野ではありますが、個人でソフトウェアを作ることを生業としていく上では必須と言えるでしょう。
安全で、速く、再利用・変更しやすいソフトウェア開発手法を知っているかいないかでは、今後の開発の質に大きく差が出てくるだろうという気がしており、早めに知識として持っておきたい分野です。
ソフトウェアアーキテクチャやデザインパターンなどはある程度ちゃんとした企業のシニアディベロッパーやCTOクラスの方々は当然把握されている分野かと思いますし、オブジェクト指向、コード作法、テスト技法などは実務との関連性も強そうなので、毎日少しずつ勉強していこうと思います。
DB、本当に1mmも分かっていません(泣)
一応業務ではバックエンドも書きますが、先述の通り生SQLなんか書いたことないですし、DBアクセスの速度とか殆ど気にしたこともありません。
N+1問題とかも概念としては知っていますが、それを実務で考慮できるレベルまで消化できているかと言われるとそんなことはなく、そもそも書いたRubyのコードでどのようなSQLが発行されるのかわかっていないので、改善のしようがありません。
フロントエンドは好きだしワクワクするので割と業務外の時間で技術のキャッチアップをしたりしますが、バックエンドはなかなか自分の時間を割いてまでキャッチアップしようとは思えません。
ですが、ゆくゆくは個人開発者としてプロダクトの全てを自分で担っていくことを考えると、DBの知識は先述した2つの分野よりもある意味では急務かもしれません。
かつては個人開発のモバイルアプリはSwiftUIで作ろうかと考えていた時期がありましたが、やめました。
ネイティブモジュールをふんだんに使ったアプリやリッチなアニメーションが必要なアプリでは必要性を感じつつも、個人開発のために普段実務で使っていない(=知見が足りない)技術を使って開発をするのはメリットよりもリスクの方が方が大きいと言う結論に至りました。
Reactを使えば、WEBとモバイル、ひいてはデスクトップなど全てのプラットフォームのアプリがほぼ同じ書き方で書くことができます。
寿命という限られた時間制限の中でのトレードオフを考えると、私としてはReact一択です。
既に業務や個人開発でReactはある程度触っていますが、やはりまだまだ本来の可能性を引き出せずにいると思うので、今後もっと知見を増やしていきたいです。
ぼくがプログラミングを始めたのは大学3年生になってからで、ソフトウェア開発に至っては大学4年生の夏から始めました。
一応副専攻?のような形で数理科学を学びましたが、大学での専攻自体はソフトウェア開発とは全く関係のない学部でした。
やり直せるならCS系の学部かデザイン系の学部(多摩美の情デなど)に進学したかったと思うこともたまにありますが、当時の自分の置かれた状況や心情の変化を振り返ると大学3年生のあの時期にプログラミングに出会ったからこそここまでハマったんだろうなという気もしています。
故に、失った時間を嘆いている暇はありません。
開発者として成長できるよう、上記にあげた分野の優先度を高めに、これからも引き続き勉強して行こうと思います。