こんにちは、私は都内のその辺で仕事をしているWebフロントエンドエンジニアです。
先日、自分の社会人生活における転職だったり立ち回りについて話した以下のnoteを公開しました。
https://note.com/shin_k_2281/n/nd26dfe7e6ae8
このnoteでは主に転職活動だったり、考えていたことやモチベーションに関する話をしており、あまり技術に関する話はしませんでした。
ふと、2024年の目標、自分のこの先のキャリア、学びたいことなどなどについて考えている中で、逆に今自分ができないことってなんだろう?と思いました。 今回はWebエンジニア3年目のいわゆるジュニアレベルと呼ばれるくらいの人が「できないこと」について棚卸ししていきたいなと思います。
Backend開発
タスクをこなす中で必要に応じてバックエンドの開発を行うことがあります。しかしどれも中途半端で、どんな状況にも対応可能なフルスタック力はかなり低いと感じています。
経験としてバックエンド開発ではJava, C#, Go, Ruby on Railsなどを触ってきましたがどれもスキルとしてしっかり身についている実感はありません。
特にN+1だったりパフォーマンスを意識した設計、クリーンアーキテクチャやDDDに関する専門知識がかなり乏しい状態です。またJavaScript, TypeScriptをよく触りますが、Node.js固有の話も中々苦手だったりします。
今の会社ではバックエンドにRubyをメインに採用していますが、過去触れてきたJava, C#, Goはほとんど忘れてしまいました。
データベース / SQL
これも最低限しか持っていません、この仕様に基づいてDB設計をやれと言われたら一般的な駆け出しエンジニアと同じくらいのER図は書けそうかなと思います。
DB設計とは何か、重要なポイントはなにか、と言うのもよくわからずインデックスをいい感じに貼るとよさそうだとか、正規化/非正規化とか色々あるみたいですが、あんまりわかりません。
SQLについても、業務でBigQueryを扱っていてたまに書くことがあるのですがスムーズに書けなくてもどかしい毎日を送っています。
Infrastructure, cloud nativeに関する技術
DevOpsエンジニアに求められるようなスキルも混じっているかもしれませんが、AWSやGCP、Terraform、DockerやKubernetesなどといった技術にも非常に苦手意識があります。
雰囲気で近くにあるファイルを参考にDockerファイルやmanifestファイルを書いたりしたことがありますが、それが具体的に何をしているか説明することは難しいです。
Native App開発全般
iOS, Androidともに全く触れたことがない領域になります。 私はReactを得意としていますがReact Nativeも触ったことがありません。Flutterも。
ただしユーザーに近い領域でプロダクトに貢献していきたい意向が強いので、興味としては他に比べて高いです。
機械学習, AI
一番わかりません。全くの手付かずで仕組みや概念もほとんど知りません。
Pythonもfizzbazzを書くことすらままなりません...
CI/CD
基本的にはGithub ActionsやCircle CIのような技術だったり、ソフトウェアのデプロイ周りに関する知識をさしていますが、あまり自信がありません。
これも見よう見まねでそばにあるファイルだったりサンプルコードを真似て書くことが精一杯です。
ソフトウェアテスト設計
ソフトウェアテスト全般について、最適なアプローチを理解していません。一応専門用語だったりテストピラミッドといった推奨されるベストプラクティスに関する知識のインデックスはある状態です。
フロントエンドに限った話で言っても、Vitestへのキャッチアップもできていないし、そもそもJestやtesting-libraryといった有名なライブラリに関しても雰囲気でしかキャッチアップできていないといった雰囲気です。
アルゴリズム / 競プロ
いわゆるソート手法やO(n*2)みたいなやつ、雰囲気では理解してますが毎回意識できているかというと微妙です。競プロも自信がありません。そもそも脳内で高速で計算をしてコードを素早く書くことに苦手意識があります。
paizaで言ったらA問題も解けないのではないかと思ってます。
セキュリティ
一応基本情報技術者試験は持っていて、どのような用語も「ある程度聞いたことがあってなんとなく説明できるかも」くらいの認識です。
ここは正直フロントエンドエンジニアとしても知識が無いことに危機感を感じています。とくに認証認可に関わる部分だったりは頻出して上がる議題だったりするので、地道に勉強していきたいなと思いました。
高度なFrontend開発
フロントエンドエンジニアですが、苦手とする領域がたくさんあります。
https://roadmap.sh/frontend このあたりを見ながら書いています。
TypeScriptへの深い理解
いわゆる型パズルをシュッとできたり、最新バージョンの構文を使いこなしたり、あらゆる演算子、修飾子について説明できたりといった自信がありません。
とくに型パズルについては何度かtype-challengesをやったりしていますが何せライブラリ開発などを行わなかったりするので、conditional typesだったりmapped typesなどの挙動を毎回忘れてしまいます。
ビルド周りのツールへの理解
Webpack, esbuild, babel, swc, Rollup, Parcel ...etc などの技術を意識しています。
この辺りは本当に苦手で、自分がフロントエンドエンジニアになったのもcreate react appが流通していた頃で、そこまでこの辺りの技術を開発者が意識せずとも開発を行える環境で生まれたという背景もあると思います。
こんどのweb speed hackathon 2024に出てみたいなと思うのですが、この辺りの理解なしには挑めないと感じているのでかなり優先度が高いです。
PWA
長く個人でも仕事でも触れていなく、ほとんど忘れてしまった技術です。説明しろと言われても少し怪しいかもしれないレベルです。
HTML / CSS / JavaScript / ECMAScript の仕様に関する理解
W3C等の発行するこれらのWeb技術の仕様への理解はフロントエンドエンジニアとしてかなり浅めだと思います。
簡単な関数、プロパティでも仕事で使う時は毎回調べています。
React Server Components
最低限の概念だったり思想や各種フレームワークにおける実装などについては追えているつもりですが、しっかり手を動かしてコードを書くに至ったことはないです...
やらなきゃやらなきゃと思いつつ、例えばNext.jsのApp Routerがstableになってから一体何ヶ月経ったでしょうか、ここは本当にそろそろキャッチアップしないとまずいなと思っているので優先度は非常に高いです。
React, Next.js 以外のフロントエンドエコシステム
つまりVue, Angular, Svelte, Vite, Remix, Astro, Deno, Bun ...etcとフロントエンドエンジニアとしての対応力がほぼおReact, Next.jsのみ となかなか狭いです。
ここに関してはまず最近SPAモードが搭載されたRemixであったり、静的なアプリケーション開発に最適なAstroだったりを触ってみたいなという印象です。
最後に
正直やっぱり自分はフルスタックじゃなくフロントエンドとデザインに寄っていきたいんだな〜と最近感じてます。
が、フロントエンドエンジニアである前に、ソフトウェアエンジニアとしての当たり前品質を満たすため、ある程度は幅広い領域に渡ってやりたいことを実現できる対応力というのは必要であることも感じています。
あせらず少しずつやっていきたいなと思います。