こんにちは!
seiです!
- エンジニアとして成長が実感できない
- よわよわエンジニアでつらい
- エンジニアとして成長するために何をすべきか知りたい!
今回はそんな方に向けて記事を書きます!
この記事の信頼性
僕は4年目エンジニアです。(実務は2年ほど)
有難いことに社内では勉強会を開いてほしいと頼まれたり、技術的な支援をしてほしいと頼まれたりすることが多いです。
周りからは「できるエンジニア」としてみてもらっている感じがします(白目)
システムエンジニアとしての成長を感じた瞬間7選
システムエンジニアとして何をすれば成長できるのかってすごく難しいですよね。なので、まずは僕がシステムエンジニアとして成長を感じた瞬間を紹介します!
APIのインターフェースを実装できるようになったとき
僕は会社に入るまではフロントエンドとバックエンドが一体になったアプリしか作ったことがありませんでした。しかし入社してからはフルスタックエンジニアとして業務を行っており、フロントエンドとバックエンドを別々にコーディングする必要がありました。
その際に非常につまずいたのがフロントエンドとバックエンドのデータのやりとりです。どのデータ型で送信するのかとか、何番のポートを開けて通信するのか等を理解したときにとても成長を感じました。
自分ひとりでアプリを作れる実感を感じました。
HTTPプロトコルよりも低位のレイヤーについて知識を得たとき
HTTPプロトコルを理解するだけでなく、ネットワークのより深いレイヤーについて学んだときも、自分の成長を感じました。
OSI参照モデルについて学習し、TCPやIPがどのような通信なのかを理解しました。
通信の仕組みが分かるとデプロイのやり方なども想像がつきやすいです。
Dockerなどのコンテナ技術について理解したとき
業務では開発環境をそろえるために仮想マシンを使うと思いますが、近年のコンテナ技術の発達により、Dockerfileで環境をそろえる場面も増えてきました。
コンテナ技術はPCの中にPCを作成するような技術です。しかもメモリやCPUのリソース消費が仮想マシンよりめっちゃ少ないので感動しました(´;ω;`)
自分のPC内で3層アーキテクチャを作成して遊んだり、チーム開発用のDockerfileを作成したりしたときに成長を感じました。
今まで学んだ通信関係の事も活きてきてますね。
クラウドによるインフラ構築を理解したとき
AWSによるインフラの構築を学習するために、AWSの資格を取りました。(cloud practitioner)
必要な分だけのリソースをリアルタイムに近い間隔で利用できるのでとても便利だと思いました。
耐障害性について学び、実際のシステムだと障害が起こっても大丈夫な仕組みを構築する必要があると学んだ時に成長を実感しました。
自分のPCのみで作業しているとなかなか意識できない部分ですよね。
.vscodeファイルでデバッグ環境を整えるようになったとき
今まではconsole.logとか標準出力にデバッグする方法しか用いていませんでした。しかし、VSCodeでデバッグ環境を整える方法を学んだ時にデバッグの生産性が爆上がりして成長を感じました。
launch.jsonをいじったり、ブレイクポイントを貼ったりしてvueのデバッグをvscode上で行う事が出来たときに成長を実感しました。
APIの規格に種類があることを知ったとき
エンドポイント、Path。当時ははRESTful APIの規格しか使ってこなかったので、RESTful APIが唯一のAPIの通信規格だと思っていました。
GraphQLやgRPCなど、API設計の異なるアプローチについて学んだときに、自分の視野が広がり成長を実感しました。
勉強会を開いてほしいと依頼されたとき
当時就職していた会社のPMに「勉強会を開いてほしい」と言われたときに自分の成長を実感しました。自分のこれまでの技術的な知見が、社内に共有するだけの価値があると認められた瞬間ですよね。
エンジニアとして短期間で成長できた理由
僕は新卒で入社した会社をたった一年で転職して年収を150万円上げることができました。
前の会社でも新しい会社でも技術力に関して高い評価をいただいています。
僕がこのように短期間でエンジニアとして成長できた理由は以下です。
- 移動時間も学習に充てた
- 業務で知らないツールや少しでも疑問に思ったことは完璧に調べた
- 自分に足りない分野から学習した
移動時間も学習に充てた
会社までの移動時間は電車で片道30分でしたが、この時間はすべて学習に充てていました。具体的にはバックエンドの設計思想(SOLID)や、ヒープ領域、スタック領域などコーディングしなくても良い知識を学んでいました。
業務で知らないツールや少しでも疑問に思ったことを完璧に調べた
正直ここが一番他のエンジニアと差がついたところかなと思います。皆さんも業務でフレームワーク等使用していると思いますが、すべてのディレクトリのすべてのファイルについて何の役割があるか把握していました。
あとは朝礼等で分からない単語があったときは、すべてメモして後程調べていました。(ステージングやレグレッションテスト等)
なんとなくで仕事をしている悪い例として、以下のような体験があります。
当時僕はあるプロジェクトにPMと半年ほど一緒に参画していました。
PMはプログラミングの経験がほとんどなかったようですが、僕より半年ほど前に参画してコーディングについてはすこしできるようになっていました。
自社の人に「フロントエンドのフレームワークは何を使っているのか」と聞かれる機会がありました。この質問に、PMはJavaScriptと答えていました。ほんとはnuxtを使っていましたが…
このようになんとなくで仕事をしていると、どうしてこのシステム構造になっているのかやどうしてこのフレームワークを使っているのかが分からないため、プロジェクトの目的とずれてしまう可能性があります。
このPMに関してはフレームワークの概念を理解してないのがまず問題ですが、すべてのファイルについて疑問に思って調べていれば、きちんと答えられたはずです。
多分コーディングする際も、「他のファイルの書き方を真似すればいいや」とか「仕組みが分からないけど、なんとなく動くからいいや」とか、「書き方の意味が分からないけど真似しとこう」と考えてしまっていたのではないかと思います。
ここまでひどくはなくても、自分が参画しているプロジェクトのすべてのファイルの役割を把握している人は少ないように思います。
疑問に思うアンテナを細かく張っていくことが大事だと思います。
自分に足りない分野から学習した
当時の自分に足りない分野から学習していました。
フロントエンド、バックエンドが終わったら、コンテナやインフラ系、それが終わったらAWSでのインフラ構築を学んでいました。
それからドメイン駆動設計や設計思想、コーディングルール等「開発、保守のしやすさ」に観点をおいて学習をしました。
これが自分が好きな分野(例えばアルゴリズム)から勉強していたら、ここまで短期間で成長はできなかったと思います。
まとめ
今回は、エンジニアとして成長を感じた瞬間を紹介しました!
エンジニアとして成長を実感できる時って、やっぱり今まで業務で分からないことが分かるようになったときかなと思います。日々少しでも分からなかったところをチクチクつぶしていけば、きっと成長を実感できる日が来ると思います。
ここから下は余談なので、気になる人だけ見てください。
まだまだ実務経験としては浅いエンジニアですが、最近は保守がしやすいようにコーディングすることの重要性を感じています。
今参画しているプロジェクトは、途中でコーディングする人がガラッと変わったみたいで、とてもぐちゃぐちゃです。書き方が所々で違っています。
コメントもほぼないので、処理を理解するのにとても時間がかかります。複雑な処理は「この処理が何をしているか」を簡単にでも良いので記載していこうと強く思っています。
また、バックエンドはlambdaでほぼ完結しているのですが、lambdaからlambdaを呼んだり、dynamodb更新契機にlambdaを呼んだりしていて処理が追いづらいです。(仕様書等の資料もない)
lambdaは処理が分かりづらくなるので禁止されているプロジェクトもあると聞いたので、使わないという選択肢もあるんじゃないかと思います。
今新しいクラウドに移行しようとしているので引き続き頑張ろうと思います!