エンジニア2年目がこれまでの成長曲線をまとめてみる

エンジニア転職してはや2年が経ちましたが、最近自分が独学でプログラミングを勉強していた時と比べて考え方や感じ方が変わってきたと思ったので、特にどういった部分が変わって、どういった成長をしたのかについてまとめてみたいと思います。

### 前提となる私のこれまでのバックグラウンド
- プログラミングを独学で2年やって、Webエンジニア転職
- 技術スタックはReact、Java(Spring Boot)
- 普段はフルスタックエンジニア
- 転職前のプログラミング実務経験はSQLを書くお仕事と、簡単なJavaプログラムの改修程度
- Oracle Master Bronze, Java Silver資格

### この1.5年までで具体的にどんなPJをやってきたのか
- 新規サービス立ち上げに伴うフロントエンドの実装(React, Redux Toolkit) & バッチ(Python) & API開発(Kotlin/Spring Boot)
- StorybookのPOC
- 既存システムの追加機能開発・バグ修正(Java, Python, PHP)

です。
こうやって書くと色々な言語やってそうに見えますが、まともに書けるのはJavascript, Java, Kotlinだけです。

## 具体的に身についたと感じる点
ここからがメインの話になります。

### 1. 設計力
前職までは一応上流工程をメインにやるSESにいたのですが、私自身はまともにプログラムの設計書を書いたこともなかったし、プログラミングも対してやっていませんでした。
なので、設計がプログラミングをする上でどれぐらい大事なのかも全くわかっていなかったし、設計書はプログラムの取扱説明書(取扱説明書、だとどうプログラムが振る舞うのかをプログラムが書かれた後にわかりやすく自分以外に説明する説明書的な感覚だった)ぐらいに思っていました。

また、入社してすぐは既存の仕様書がないプログラムのバグ修正をしたり、一部機能追加によってプログラムを書き換える程度のことをしていたので、元々ない設計書をプログラムを見て書き直すなんていうこともなく、やってきていました。

まともに設計書を書くようになったのは、新規サービス立ち上げの時が初でした。
最初はUMLの書き方すら怪しくて、APIを読んでいるのにエラーレスポンス時の挙動も書いていなかったし、ある程度流れが分かれば良いんだよね？というスタンスでいました。
が、チームリードにプログラムに実装する予定のものは全部書け、むしろここにないものをコードに入れるな、という指摘を受けて、1から10まで書くようにしたところ、これまで適当でいいや、と思っていた部分のアラが出るわでるわ、という感じで自分の設計力を叩き直されました。

今では設計書を書くうえで学んだ、特に以下のようなことを意識してやることで、自分のプログラミング力が上がったと感じます。

・早く返す（バリデーションやロールの確認などを一番上でやる）
・ゼロトラスト（DBから返ってきた値や、APIのレスポンスが必ずあるものとして設計しない。なかった時のことを考慮して例外や分岐を入れること）

### 2. テスト力
お恥ずかしながら、前職ではテストコードというものを実務で書いたことがありませんでしたし、そもそも何をテストすれば良いのか、何をやればテストになるのか、モックってなんやねん、というレベルでした。

テスト駆動開発についても、エンジニアとして働き始めてから知ったレベルです。
というか、一応前職でPMOとして働いていた際にテストの書き方についてはいくつか本を読んだのですが、手法としてはなんとなく知っているがそれをコードとしてどう実際にテストで書けば良いのかは全く分かっていませんでした。

基本的に今の会社では、バックエンドはカバレッジが100でないとマージできないようになっています。(遥か昔から存在しているコードについてはぶっちゃけ100ではないのですが)
最近はフロントエンド側もコードカバレッジを100にする動きがあり、フロントエンドのテストの書き方についても学ぶ機会がありました。

正直テスト駆動開発のやり方ではプログラミングがまだ出来ていないのですが、自分で設計・実装したプログラムについては何をどうやればテストになるのか、どういったテストを書けば良いのかは、考えながらプログラミングすることができるようになりました。

### 3. Linux力
こちらも転職前はせいぜいちょっとしたshellを書いたり、viコマンドでテキストを編集出来たりしただけで、私めっちゃ出来るじゃん！と思っていた節がありました。

ただ、転職して大量のログファイルから該当のエラーが起きている箇所を検索したり、動いているプロセスを探したり、他人が最近打ったコマンド履歴を見たり、ということを頻繁にやらなくてはならなくて、そもそも何ができればこういったコマンドが打てるのかすら分からなかったため、とりあえずトラブルシューティングの社内Wikiのやり方をそのままコピペで打ち込んでいました。

流石にやばいと思ったので、LPICの勉強をしました。結局LPICの範囲が1-10まで何も分からなかったのと、途中からただの暗記ゲーに思えてしまったので、根本的なLinuxの勉強に切り替えましたが、このLPICの勉強をすることで、基本的なLinuxのコマンドを網羅的に把握することが出来て、大変勉強になりました。

### 4. 発言すること
はい、プログラミングは全く関係ありません（笑）
ただ転職するまでの私は、信頼する上司や仲の良い客先の人には結構ズバズバとモノを言っていたのですが、会議や客先での説明の場で手を挙げて発言することはほぼありませんでした。こうした公的な場で自分の分からないことを積極的に聞いたり、自分の意見を言って相手に批判されたり、却下されたらどうしようという怖がりな性格が出てしまっていました。ただ、前職にいたときは自分よりも発言しない同僚もたくさんいたので、特にそれで何も思わなかったし、それがどういうことなのか全く理解していませんでした。

最近現職でもPMの仕事を任されるようになって実感したのですが、本当に発言しない人って会議に出ている意味がないというか、いない人のような存在になってしまいます。
現職は上司がかなり心理的安全性を担保してくれていることもあって、会議などの場でちょっと場違いなことを言ったとしても誰も批判しないことが分かっていることもありますが、発言することに対して自分の中での重要性が上がりました。

例えばちょっとしたことでも意見を言ってみたり発言してみることで、相手も気がつくことがあるし、そして自分にも気づきがあるんですよね。自分がなんとなく発言してみたことが採用されたり、または自分の考えが間違っていたことが分かったりします。

最近のモットーはとりあえず失敗してみて、そこから学べばいい、というモノです。
かのエジソンも、99%の失敗があったから、それらの試行ややり方が間違っていたということに気がつけましたが、結局失敗してみないと何も学ぶことがありません。

それにこうした失敗は若いうちにバンバンしておいた方が成長速度も速いと思います。つい隣の芝生が青く見えてしまうので、失敗したくないという心理的ハードルが上がってしまうのですが、頑張って下げるように意識しています。

### 5. インポスターシンドローム
正直なところ、インポスターシンドロームというものをエンジニアになってから初めて体験しました。
こういうのも気が引けますが、割とこれまでいた職場や学校では自分が出来るという自信がありましたし、それなりに周りからも認められていたため、失敗体験がなかったというわけではありませんでしたが、初めてまともに劣等感を長期間味わい、メンタルがとても辛かったです。

インポスターシンドロームについては別の記事で書いたので、宣伝にはなりますが気になる方はそちらをお読みください（笑）

ただ、このインポスターシンドロームを経験することで学んだ良いことの一つに、ダニングクルーガー効果があります。ダニングクルーガー効果は、能力や知識がない人に限って自尊心が高いのに比べて、知識がある人や能力がある人は自分能力を卑下しやすいということです。
つまり、ちゃんと勉強している人は自分が分かっていないことを分かっている、ということです。
インポスターシンドロームになっている人は、ちゃんと成長している、頑張っているということだと思っています。
むしろこれを感じることに自信を持っていいと思います。そして、さらに成長しましょう！

### 6. より仕組みについて知りたくなったこと
エンジニア2年目になって実感したのは、Linuxについてもそうですが、インフラや低レイヤ、基礎的なCSの知識がいかに大事かということです。
これまでは、CSの知識なんて別にわざわざ大学で学ばなくても基礎情報・応用情報の勉強をすれば独学で出来るじゃん、無駄無駄！と思っていましたし、純粋関数のような仕組みについてもなんとなくは知っているけど別にわざわざ勉強する必要はないと思っていました。

ただ、うまく言えないのですが、プログラミングに真剣に取り組めば取り組むほど、こう言ったことをもっとちゃんと知りたくなる自分がいて、今年やっと重い腰をあげてUniversity of the PeopleのCSに申し込みました。（３年前からなんとなく考えてはいたのですが、やっとです）

昔は半ばバカにしていたことにこんなに興味を持つ自分がいたことにびっくりしています。

#### 7. 最後に
正直なところ、プログラミングがこんなに好きになるとは思っていませんでした。
リアルな話がつい最近まで、自分がいかにプログラミングが出来ないかということにものすごく劣等感、インポスターシンドロームを感じていて、プログラミングは向いていないんじゃないか、趣味でやっていた方が良いんじゃないかと思っていたぐらいです。（そして血迷ったように機械学習に手を出して、一瞬で我に帰りました）

ただ、２年もプログラミングがあまり関係ない仕事をしながら独学でプログラミングを習得して、さらにエンジニア転職して、土日や業後にも勉強している自分を振り返ると、やっぱり自分はプログラミング自体は好きなんだなと感じました。

仕事でプログラミングをこれからもしていきたいか、（どうも人にはPMの方が向いていると思われることも多いようなので）は別の話になりますが、学生時代は独学・自習するのも結構苦手な方だったので、これだけ続いたことにびっくりしています。

これからもプログラミングと長く付き合って行けたら良いなと思います。