実務未経験でエンジニア転職してから1年経過した話

## はじめに
2020年4月からエンジニアとして働き始め、早一年が経過しました:running:
色々と学びの多い一年だったので、折角の機会にこれまでの経験/知識を棚卸ししてみようと思います。
未経験で今後エンジニアを志す方には多少入社後の参考になるかもしれませんし、同じようなエンジニアの方には共感頂けるかもしれません。
息抜きにでも読んでもらえると嬉しいです:raised_hands:

##1. 転職までの経歴 :memo:
・2016年3月　私大文系卒 (理数嫌い、特にスキル無し)
・2016年4月〜　
　新卒で金融系の営業職として入社(一応東証一部上場の大手)
　給与面がそこそこ良かったこともあり、以降ずっと辞めたいと思いながら結局丸4年働く
・2019年1月　MacBookを購入、何気なく初めたProgateにハマる
・2019年夏頃　エンジニア転職を決意、TechAcademyのRailsコースを受講
・2019年冬　転職活動開始、内定(Twitter転職で声がけ頂いた1社しか面接受けず、内定出たのでそのまま入社)
・2020年4月〜　
　**都内の受託開発/SES企業に入社**(給料半分くらいになる)
　主にRailsを扱う会社


## 2. プログラミング全般
## 1) 言語：Ruby, PHP, Python, TypeScript
・1年で**4つの言語**を実務で扱いました。(これは全く予想してなかった。笑)
・ **RubyはRails、PHPはLaravel、TypeScriptはReact、Pythonは機械学習とAWS Lambda**で使用しました。
・条件分岐、繰り返し、配列処理、オブジェクト志向等々、各言語の基礎は抑えられてるかなと思います。
・レビューで**命名**に関する指摘を結構受けたので、最近は結構意識して実装してます。**分かりやすい命名、多少長くなっても役割・スコープを明確にした名前、クラスは名詞、メソッドは動詞**、とかですね。（読まな読まなと思ってる:books:[「リーダブルコード」](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)読まないと…。）
・TypeScriptを勉強したことで、**型を意識した実装**ができるようになってきました。関数型プログラミングも意識し始めるようになりました。
とはいえ最初かなり苦労してこんな記事を書いたりしました↓
[【初心者向け】TypeScript/JavaScriptで頻出する演算子(!, ?, &, =)の用法をまとめてみた](https://qiita.com/halca1992/items/4d66011ab207ef8c4079)
・個人的には今後TypeScriptをもっと勉強して強化していきたいと思ってます。

## 2) フレームワーク
### ① Ruby on Rails
・入社から半年程、RailsのPJにアサインしていました。学習塾の管理システム。
・ただ掛け持ちもあったので、本当にガッツリ触っていたのは2020年8月〜10月くらいまでですね。
　Railsのシングルアプリケーションだったので、とにかくbyebugしまくって開発してました。
・入社当初は実務のテーブル数やファイル数に圧倒され、slimには慣れず、知らないGemだらけと、かなり苦労しました。
・だんだんと業務知識がついていく事で実装もスムーズにできるようになり、**基本的なCRUD作成やDB設計(アソシエーション)、メソッド・カスタムバリデーション作成**辺りはできるようになりました。
・PJ内でカスタムされていて、scaffoldするとベースのCRUDだけでなく、slimのテンプレートまで生成されたので、素早く開発できました。が、一方で**仕組みをよく理解せずとも機能が作れてしまっていた感**は否めません。
・個人的にはActiveRecordでもっとガッツリロジック書いたり、サービスクラスにロジック切り出したり、Rspecでテスト書いたり、とかやってみたかったですね。

### ② Laravel
・2020年10月から現在まで扱っています(API)。案件としては、社内向け販売管理システム。
・それまでPHPに触れた事がなかったので、当初文法の違いに苦戦しました。
・はじめは[Laravel学習帳のチュートリアル](https://laraweb.net/crud/elementary/)をやったりしましたが、基本的には実務でぶつかりながら習得していきました。ModelやControllerの考え方はRailsとほぼ同じだったので、フレームワークとしてはそこまで違和感なく使えたと思います。
・APIサーバーが初めてだったので、リクエスト/レスポンスをかなり意識して実装するようになりました。
・バッチ処理の追加実装をした際に、**肥大化したサービスクラスを機能毎にクラス分割し、疎結合にリファクタ**できたときは嬉しかったです。
・Railsよりはわりと記述量が増えるので個人的にはRailsの方が楽だなーと感じます。
　ただ一方で、Railsやってるだけではおそらく意識できてなかった部分があったので、個人的には良かったと思ってます。
### ③ React
・正確にはライブラリですが、そこまで細分化するのも面倒なのでフレームワークの項で書かせてください。。
・これも上記同様2020年10月から現在まで扱ってます。(LaravelがAPIで、フロントがReact)
・**PJではTypeScriptで、状態管理はMobx、主にクラスコンポーネント**で書いてます。
・それまでJavaScriptもろくに書いた事がない+MVCの概念しか知らない自分としては、慣れるのにだいぶ時間がかかりました。コンポーネントとは、、というところから勉強しました。
・有名な:books:[「りあくと！」](https://oukayuka.booth.pm/)を読みましたが、正直難しかったwので、[トラハックさんのYouTube](https://youtube.com/playlist?list=PLX8Rsrpnn3IWKz6H5ZEPWBY8AKWwb9qq7)が大分助けになりました。
・API側とのつなぎ込みにSwaggerを使っており、Laravel側でリクエスト/レスポンスファイルを作成してコマンドを打つと、自動でTypeScriptの型定義ファイルができて感動しました。
・Reactに触れた事で、**フロントエンドへの興味が俄然強く**なりました。Hooksとか書きたいし、パフォーマンスとかも意識したい。今後もっと扱っていきたいと思っています。
### ④ Zend Framework
・マイナーなPHPフレームワークです。笑　今月から新たなPJで使い始めてます。某大規模アプリのバックエンドなのですが、絶賛激務中。。。
まぁベーシックなMVCフレームワークですが、今後注力してやるかというと…。

## 3) データベース関連
### MySQL
・実務では一貫してMySQLです。入社前はあまり勉強してなかったので、入社当初先輩にdump取得してもらった時は魔法のように見えました。
・基本的なクエリ作成は問題なくできるかと。
・サブクエリの組み立てとかはまだ時間がかかります。:books:[「達人に学ぶsql徹底指南書」](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6SQL%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E7%AC%AC2%E7%89%88-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-CodeZine-BOOKS/dp/4798157821)を読破したい。
・直接SQLを書かずとも、**フレームワークから発行されてるクエリを意識**するようにはなりました。チューニング関連はまだまだ勉強が必要ですが、N+1とかは気を付けてます。

## 4) インフラ関連
### ① AWS
・各PJのインフラとして、基本AWSを使用していましが、去年1年間ほぼ何も分からない状態:innocent:
・そんな中、2020年12月〜2月に**Lambda**を扱う案件に参加しました。帳票納品の自動化プロジェクトで、帳票の中身をチェックするロジックをPython書きました。
・実務でLambdaを扱った経験でAWSに興味を持ち、2021年1月から**AWS SAA**の勉強をしています。
・**主要サービス全般(EC2, VPC, S3, RDS, サーバレス)**を体系的に学べたので、AWSアレルギーは大分なくなりました。インフラエンジニアに関わらず、そもそもWebアプリやる上では知っておくべき知識だなと感じました。
・あと技術系の記事に出てくる構成図とかがスッと入ってくるようになったので、自身のアンテナも増えて良かったなと思います。

### ② Docker
・DockerはLaravel×ReactのPJで使われていたので、そこで初めて使いはじめました。
・実務だと起動・停止くらいしかしないので、自己学習でRailsとReactの開発環境をDockerで起動したりしました。他記事を参考にしながら、Dokcerfileとdocker-compose.ymlを書いて起動するくらいはできるようになりました。
・手軽にビルド、リビルドできたり、ファイルに定義するので環境統一できるのがすごく良いなと思います。
・ただ自分のMacBookはメモリ8GBなので結構重くなってつらい時があります。。次は16GB欲しい。


## 4) その他
### ① Git
・これも入社前は`git push origin master`一択だったので、当初大分苦戦しました。
・現在はlog, checkout, diff, add, commit, fetch, pull/merge, reset, cherry-pick辺りは問題なく使えています。
・個人的にはadd -p で差分見ながらaddしたり、コミットメッセージミスったときにcommit —amend -mをよく使います。
・コミットを変更内容のまとまりで残し、コミットメッセージにはfix, remove, featといったプレフィックスをつけて、綺麗にコミットを残すように意識しています。
・コード管理ツールとしては、AWS CodeCommitとGiHub:octocat:を使いました。圧倒的にGithubが使いやすいですね。笑
・実装方針・趣旨を明確にするため、**GitHub上ではまずはじめにPRを作成し、タスクの主旨/WHAT(GOAL)/HOW(実装方針)を記載**してから実装を開始するようにしています。

### ② ssh接続をはじめとしたLinxコマンド
・サーバーへのssh接続は今や当たり前に行いますが、実務未経験で入るとこの辺が一番訳分からないかもしれません。
・最初は「sshって?」「秘密鍵って？」「ホストって？」みたいな感じで何も分からなかったので、コマンド教えてもらってとりあえず接続してました。
・接続した後、サーバー内でLinuxコマンドで操作するのも、最初は慣れませんでした。とにかく黒い画面での操作全般に苦手意識がありました。
・あと業務だとほぼ必ずと言っていいほど、踏み台サーバーがあると思うのですが、その辺りも混乱する要素でした。
・sshはさすがに何度もやって慣れましたし、サーバー構成辺りは基本情報やAWSの勉強してから頭に入るようになってきました。ただサーバー操作は若干緊張しますね。Linuxコマンド全般もまだ弱い部分だと思います。

### ③ VSCode
・入社当初PJTのしきたりでAWS cloud9を使っていましたが、PJ移ってから始めてVScodeを使っていたく感動しました。定義ジャンプを知っていれば、今までのメソッド迷子地獄から逃れられたのに…と。
・TypeScriptとの相性も素敵ですし、プラグインもたくさんあって大好きです。

### ④ SpreadSheet/エクセル
・入社してしばらく機械学習案件でエクセルしか触らなかったので、Vlookとか今まで知らなかった関数を使えるようになりました。
・先輩社員がGASでゴリゴリ関数書いてる姿を見て「エンジニアっぽい〜！」と感動しましたw


## 3. 実務全般
### 要件定義、見積、実装、テスト、検証、リリースの流れ
・上記流れを一貫して経験できたので、エンジニアとしての仕事の進め方の土台はできたかなと思います。
・作業見積はまだまだ苦労しますが、CTOからのアドバイスで下記意識してやってます。
　・基本実装が終わって、ようやく **40%-50%**
　・打鍵して、バグ対応、差戻し・リファクタ・打鍵対応で、**90％**
　・リリース準備・リハ・リリース実施・リリース後監視で、**100％**
・基本自分がパッと思う2倍は時間がかかると思って見積りしてます。

## 4. 技術的に足りない部分
1年間色々経験できたなぁと思いつつ、もちろんまだまだ弱い部分がたくさんあります。
### ① テストコードの実装
・今までのPJT柄もあり、がっつりテストコードを書いてこなかったので弱い部分だと感じています。Railsでminitestちょろっろ書いたくらいなんですよね。。
### ② Linuxコマンド
・基礎的な操作(ディレクトリ移動、ファイル作成、確認等)はできますが、上述の通りあまり駆使しきれてない感じですね…。シェルスクリプトとかも。強いエンジニアはやはり駆使しているのでもっと使っていきたいです。
### ③ HTML/CSS
・経験したPJが社内向けシステムばかりだったので、優先度的にUI/UXにはあまり拘らないことが多く、結構雰囲気でやってしまってました。フロントやりたいならそもそももっと勉強しないと…。
・4月からの新案件でスマホアプリのwebviewを触るタスクがあって、そこでようやくガッツリ触りましたね。1px単位での修正とかを初めてやって新鮮でした。

## 5. 反省
色々学べた一年ですが、振り返ると「あれやればよかったなー」とか「もっとああすればよかった」と思うことは沢山ありますね。
**① 業務時間外でのインプット/アウトプットが足りなかった** :no_good:
フロントやAWSの勉強を始めてから業務外でキャッチアップするようになりましたが、それまでは業務時間外はあまり勉強してませんでした。
実務に勝るものはないですが、それをベースに個人学習・個人開発もすべきでした。業務外でキャッチアップするようになると自然に興味の幅も広がっていくし、モチベーションも上がると思いました。読みたい本もたくさんあります。
**② 結果的に多言語を扱っているが、入社後1年は一つの言語/FWをしっかり学ぶべきだった…かも** :confused:
多言語やるにしても一つをしっかり学んでからの方が、結果的に効率が良いかなと思います。スクリプト言語は、記法こそ違えど、いざやることはそこまで大差ないので…。
**③ 弊社のRailsはカスタムされていて、素早く開発できたので、自分ができるようになったと錯覚してしまっていた** :no_good:
実は仕組みを理解できていない部分が多かったですね。これに関しては、RailsのPJ離れて正解だったかもしれません。多言語やるなといった前項と矛盾するような気もしますが…笑
とりあえず動いたからOK！、ではなく、なぜ動くのかを突き詰めた方が良いと思います。その為にはやはり業務時間外にコードを触ることが大事になるかと。

## 6. エンジニア2年目の展望・目標
1年目は自分が具体的に何やりたいかとかよりも、ただ業務に慣れることに必死でした。
2年目はもう少し具体的に目標を持ちながら過ごすことができそうです。　

**①AWS SAAの資格取得** :pencil: 
現状激務で勉強ストップしてしまっていますが、本格的に勉強していたので資格は取っておきたいです。
インフラエンジニアではなくとも、**サーバーやネットワークの知識はエンジニアとして必須**だと思います。AWSは圧倒的なシェアですし、個人でも気軽にインフラを触れるので勉強しておいて損はないと感じます。
**②フロント力の強化** :art:
上述ですが、Reactに触れたことで近年のフロントエンドの隆盛を知って、俄然フロントに興味が出てきました。
弊社は社内向けシステムの方が多いので、UI/UXにあまり拘れないんですよね。個人的には何か作るからにはもっと拘りたいなーと思ってます
`React Hooks、Next.js、SSR/ISR、GraphQL、blitz.js`とかとか…フロント関連で勉強したい事が山ほどあります。
チャンスがあれば、社内でも手を挙げてフロント案件に参加したいです。
**③書籍等で体系的なインプットを増やす** :books:
実務だと学びづらい部分があったり、偏った知識となってしまうことがあるので、書籍を通してもっと幅広く体系的にインプットしていきたいと思っています。
とりあえず現状の積読達を片付けたい…。
[JavaScriptモダンプログラミング完全ガイド](https://www.amazon.co.jp/JavaScript%E3%83%A2%E3%83%80%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E5%A0%85%E7%89%A2%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AB%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%82%8B-impress-top-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4295010561)
[リファクタリング(第2版)](https://www.amazon.co.jp/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-%E7%AC%AC2%E7%89%88-%E6%97%A2%E5%AD%98%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B-OBJECT-TECHNOLOGY/dp/4274224546/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0&m=AN1VRQENFRJN5&qid=1619357790&refinements=p_6%3AAN1VRQENFRJN5&s=books&sr=1-1)
[オブジェクト指向UIデザイン](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91UI%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E2%94%80%E2%94%80%E4%BD%BF%E3%81%84%E3%82%84%E3%81%99%E3%81%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E5%8E%9F%E7%90%86-WEB-DB-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297113511/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91&m=AN1VRQENFRJN5&qid=1619357824&refinements=p_6%3AAN1VRQENFRJN5&s=books&sr=1-2)


**④アウトプットとして個人開発する** :wrench:
この一年で一番足りなかったことはアウトプットかなという反省から。やはり自分でコード書いて壁にぶつかることが一番の勉強法だと感じます。
**Rails API + Next.js + OpenAPI**とかで何か作りたいですね。AWSの学習も活かして、ドメイン取ってAWS上にデプロイ、キャッシュサーバー活用とかもやってみたいです。TerraFormもやりたい。。
やってみたいことがたくさんあります。


最後まで読んで頂きましてありがとうございました。
アドバイス等々ありましたら頂けるととても嬉しいです:pray:
色々書きましたが、**総括するとこの1年間とても充実していて、転職して良かった！**と思っています。
2年目も頑張ったなぁ〜と思えるように引き続き日々精進してまいります:muscle::muscle::muscle: