未経験で新規サービスのバックエンドエンジニアとして2年間働いた所感

# 概要
社内で新規toC向けサービス立ち上げのバックエンドエンジニアとして、未経験でアサインして働きだして2年が経ちました。

先日社内のメイン事業部(SI系)の人向けに、2年間新事業のエンジニアとしてどういうことを成し遂げてきたかという成果発表を行いました。

その時は「**サービスに組み込んでいる技術**」の話をメインとして取り上げたのですが、
「じゃあ自分はエンジニアとしてどんな成長ができたのか」という観点ではまとめていなかったので、今回ポエム的ですが「**自身のエンジニアとしての成長**」という視点から述べていこうと思います。

対象読者：未経験でこれからWebエンジニアとして会社で働く人。エンジニア２年目くらいの人

# 自己紹介
- 現年齢：28

- 新規事業アサイン前の仕事
   - 高校卒業後、6年間非ITの仕事をこなす
   - 現会社へ入社し、SI部門で１年だけ端末の運用保守を担当（Win端末のキッティングやテストなど）
 
- 現在の仕事
   - 社内新規サービスのWeb+iOSアプリ開発のバックエンド担当
   - 使用技術：AWS、Docker、PHP(Laravel）、JavaScript
 

# 新規事業部にアサインされる前
現会社に入社してまもなく新規事業の業務内容を知った時、「自分のやりたいことはこれや！」とひらめきました。

ただし、私はSI部門の担当として入社が決まっていたので、上司へ配置転換をお願いしても簡単にYESの返事はいただけませんでした。そこで

- 資格取得（基本・応用・JavaSilver・LPIC1など）
- 毎月１回上司を飲みに誘って交渉（もちろんコロナ前です）
- その時の仕事を一生懸命こなす

これらを約１年間続け、ようやく承認をいただけました。
この時の努力の方向性がエンジニアとして正しかったのかはわかりませんが、とにかく「**熱意**」が認められたのだと思っています。

# 新規事業部へアサイン直後 - 3ヶ月　〜右も左もわからんかった〜
2020年4月のアサイン直後の状況は、新規サービスの開発をアウトソーシング２名（AWS+Laravel担当1名、iOSアプリ担当１名）の方に委託し、プロジェクトを社内の若手の先輩社員１人が回している３人体制の状況でした。

つまり、Webアプリ自体は社内のエンジニアで作っている人が１人もいなかったんですね。
そのため、まずはアウトソーシングのエンジニアの方から色々話を聞きながら、自分でも開発環境を構築するところからのスタートとなりました。

とはいえ、アプリの開発経験はまるで皆無だったので、まずはWebアプリの設計書や構成図などをGithubのIssue上でチェックし、AWS 、、、Docker、、Laravel、、といったように単語の意味を調べることからはじめました。

また、2ヶ月後にもう一人新入社員が同じプロジェクトに入る予定だったため、iOSアプリはその子にまかせてしまい、自分はAWSとLaravelを担当することになり、学習をスタートしました。

AWS、Laravel、Dockerの概要について一通りネットで調べた後は、LaravelのUdemyハンズオンをやりました。

https://www.udemy.com/course/phpbeginnertolaravel/

こちらを終えた後、アウトソーシングのエンジニアの方にお願いし、ローカルでの開発環境構築の手順をまとめていただいて、実際に会社端末にDockerによる環境構築を行いました。

また、社内にはアドバイザーとしてプロフェッショナルなWebエンジニアの方もいましたので、少しずつその方にも相談や質問などをしました。


もうひとりの新人は、iOSアプリの書籍を参考にミニアプリをたくさん作っていましたね。
そんなこんなで最初の２ヶ月は過ぎ去っていったと思います。

**しかし、2ヶ月たった2020年6月、急遽メイン開発担当のアウトソーシングのエンジニア２名の脱退が決まってしまいました...。**

# 新規事業部へアサインされて半年間　〜怒涛の引き継ぎ期間と正しいかも分からない新機能開発〜
メインで開発担当されていたエンジニア2名の方が急遽、1ヶ月後に脱退されることになりました。
そのため、まだほとんどアプリケーションの仕様や設計が分からないまま1ヶ月間でアプリを引き継ぐことになりました。

その期間やったことは

- **膨大な質問を開発担当エンジニアにGithubで投げかける**
- **超簡単なバグ修正を1個か2個自力で修正し、レビュー・反映してもらう。**

でした。また、Web会議で時間を頂きながら、丁寧に質問に回答していただく、といった機会も設けさせて頂いたりしました。

とにかくエンジニアの方が脱退されるまでにできるだけ多くのことを吸収しなければ、という使命感で毎日やっていたと思います。

この期間は結構つらったですが、今思うといい経験をさせてもらったと思います。

メイン担当のエンジニアの方々が抜けられた後は、私ともうひとりの新人でそのアプリを引き継ぎ、不具合修正や新機能追加を行いました。

ただし、この間に関しても「この修正の仕方でいいのか？」「こんなコーディングの方法でいいのか？」と、疑問や不安が常につきまといました。というか今でもありますね笑

ただ、そんな時は社内のプロフェッショナルエンジニアに相談し、都度疑問を解消していきました。

# アサインから１年後　〜AWS環境とアプリケーションの怒涛のリプレイス作業〜
１年も立つと仕事にも慣れてきて、日々の機能追加や不具合修正も淡々とこなせるようになってきました。

2020年11月頃には、**アプリをα版としてリリースして、実際にお客さんにアプリを使っていただきました。**

当時かなり不安だったことを覚えています。実際開発時に見えなかった不具合がそこで多く出ていました。そこでテストの重要性を学びました。

さらに、今後アプリケーションをスケールさせていくにあたって、根本的にアプリケーションの基盤から作り直す必要があるとわかりました。
そこでAWSとアプリケーションの再設計を1人だけで行うことになりました。


AWSについては、当時資格を2つ取っていて（CLFとSAA）、この経験がAWS再設計・構築に大きく役立ちました。実際にAWSに関しては

- **EC2, RDS, Cognitoのみ**

という最小限のサービスしか使っていなかったエコな構成から

- **ECS Fargate, Aurora, S3, Route53, ACM, ElastiCache, ALB, AutoScaling, SystemsManagerパラメータストア, PrivateLink etc..**

といった、わりかしリッチといえるような構成を一人で設計して、実際に構築することができました。

また、Dockerに関しては、NginxとLaravelコンテナが一つにまとめられて動いている状態だったので、これを2つに分割して構築するということを実施しました。

1番苦労したのが**EC2からFargateへの移行**です。コンテナの基礎がわかっていなかったので、かなり大変でした。

しかしながら一番やってよかったといえるのもFargate化だと思います。なんせ運用がかなり楽になったので！

このあたりについては、私のZennアカウントに作業記録を残しています（とっちらかっていますが・・・）

https://zenn.dev/shivashi?tab=scraps

Laravelについては、不要な機能やコードを削ぎ落とすリファクタリングを実施しました。

また、iOSアプリとのデータ連携用APIについて、CognitoのIDトークンを利用して「**認可付きAPI**」として進化させました。

iOSアプリについても、もうひとりの開発担当エンジニアがかなり頑張ってくれて、UI/UXを劇的に改善したり、API連携をより上手にできるようにしたりしてくれています。

アプリのデザインについては、当時からPOである先輩社員が兼任で新たに担当してくれて、かなりよくなりました。

こういった感じで、アプリを１から作り直す経験を通してエンジニアとして飛躍的な成長ができたと思います。

# 現在
今までの経験によって、エンジニアとしてなんとか「現在の仕事」もこなせていますが、足りない部分もたくさんあります。

また、今作っているアプリはこれから正式にローンチされるのですが、現時点でまだ本格運用はされておらず、これからとなります。

# エンジニアとして成長できた部分
- **AWSやLaravelを利用してスケーラブルなWebアプリケーション環境を一人で開発できるようになった**

- **Githubを活用し、アジャイルによる開発運用ができるようになった**

- **エンジニアとして自走できるようになった**

- **わずかだがQiitaなどでアウトプットできるようになった**

やっぱり1からWebアプリを開発できるようになったことは大きな自信になっています。

# まだ未熟だと思う部分
- **フロントエンド領域の技術不足**
  これまで手掛けているWebアプリはLaravelによるモノリシックな設計です。
  これは今後フロントをReactなどに置き換え、Laravelを完全なAPIサーバーに再構築していくことが課題だと思っています。
    - 完璧なフルスタックエンジニアを目指すわけではありませんが、社内のプロフェッショナルエンジニアからは
      「**バックエンドやるにしても、フロントエンドにしても、どちらもある程度経験してないともう片方を設計するの難しいよね！**」と言われ、**その通りだな！**と思いながらフロントエンドの勉強サボっています！　いずれは両方ある程度できるようになりたいです。

- **CI/CDのスキル・ノウハウがない**
  直近マストで頑張っていきたいことの1つです。
  Cloud FormationかTrraFormによるIaCにも今後力を入れて行こうと思っています。

- **正解だと言える設計やコーディングができない・分からない**
  勉強不足です。エンジニアとしてもっと頑張りたい所存です。

- **アウトプットの品質**
  Qiitaなどで日々アウトプットすることを心がけていますが、あまりLGTMももらえていないため。
  もっと良質なアウトプットができるよう頑張っていこうと思います。

- **チーム開発のノウハウが無い**
  これは現在までそういう機会がなかったので仕方ないのですが、今後新たな開発者が参入する時に課題として直面しそうです。


# 未経験でエンジニアになってよかったか？
大変よかったです。一歩を踏み出した自分と今の会社に感謝です。
この2年つらいことが多かったですが、それを上回って楽しい時間が多かったと思います。

ただ、これが新規サービス立ち上げの案件ではなく、しっかりとしたWeb系の会社で教育サポートも充実した職場だったとしたら、もっと遠回りせず技術や知識を習得できたかも、と考える時があります。

しかし、未経験でいきなり新規サービスを立ち上げる案件に入ることはなかなかないと思うので、それも含めて本当にいい経験を積めていると思います。

また、モチベーションの変化も最近起きています。

初期衝動の段階では、とにかくWebエンジニアとしてたくさん成長して稼いでやる！みたいな感じでしたが、最近だと

「**これからこのサービスを自分たちの手で大きくして盛り上げていく**」

といった気持ちが今のモチベーションになっている気がします。

# おわりに
まとまりない文章になりましたが、これからもWebエンジニアを名乗れるように日々精進したいと思います！