今回は、私が思うプログラマーとエンジニアの違いの話をしていこうと思います。

プログラミングは誰でも習得出来て、エンジニアになれるか

まずは、そもそも誰でもエンジニアになれるのかという問いを投げてみます。この答えはNOです。何故なら、プログラミングは習得出来ても、エンジニアになれるとは限らないからです。

元々私は新卒でエンジニアになりました。エンジニアになる前も独学でプログラミングはやっており、プログラミングで独自アルゴリズムを実装したり、マッチングアプリのようなものもアルバイトで開発していたので、どんな仕事もこなせる自信がありました。しかしいざエンジニアとして現場に入ると、そのスキルは未経験同然で、全くエンジニアとしては役立たない素人でした。プログラミングでpaizaランクB問題以上のレベルも解ける自信はあったのですが、複雑な実装が出来ても、エンジニアには到底なれないという壁にぶち当たったのです。
そこで、具体的に立ちはだかった壁を3つ紹介していきます。

1:タスクの細分化をするスキル

 自分に振られたタスクを細分化する事が出来ないとエンジニアとしてタスクをこなせません。この細分化をしないと、間違った方向性で実装してしまい、出戻りになるという事が起きます。こうなってしまうと時間の大幅なロスが生まれ、エンジニアとしてもダメ認定されるので、そうならないための要件を細かく仕様に落とし込む力が重要です。しかし、この細分化も、いきなり素人が粒度の大きい案件をこなそうとすると難しいです。なので、最初は、タスクをいかに細分化して振ってくれてるリーダーが上司についているかが重要になります。逆に言うと、難しい仕事をいきなりこなす人は、成長出来ない傾向にあると言えます。小さなタスクを最初にこなせずいきなり大きなタスクを与えられても、キャパオーバーになって、そのタスクはこなせなくなるのです。私自身は、途中から細かく指示を出してくれる上司に巡り会えたおかげで、業務フローや、タスクのこなし方に慣れていけました。慣れた状態であれば、粒度の大きなタスクが来ても、より細かく分けれるようになるので、そのようにして力を身につけていくのが大事です。

2:煩雑なソースコードを回避するスキル

 煩雑なソースコードのプロジェクトにいきなり入るのはなるべく避ける事をオススメします。エンジニアになりたての人がそういった現場で作業をすると、膨大な時間を浪費してしまう上、その書き方が正しいと思ってしまい汚い書き方が定着してしまうので、キャリアを大幅に無駄にする可能性が高いです。プログラミングはシンプルに実装すれば大体のプロジェクトは機能するので、妙に複雑な実装をされてるものは、どれも冗長なソースコードの可能性が高いです。なので、綺麗なソースコードで書かれているプロジェクトに携われるかも、成長として重要な要素の一つになります。また、自分が書いたソースをレビューして、ソースの設計やバグチェックまで、しっかり見れる人がいるかどうかが重要です。
 コードを綺麗に書く重要さのもう一つの理由としては、別の人あるいは自分が次の機能回収で同じコードを見直した時に理解がしやすく、回収もすぐに終わるからです。一つ一つのタスクの無駄を避けるためにも、なるべく綺麗なソースコードを担保し続ける事は大変重要です。迷路のようなソースコードを読んでいると言う感覚があれば、思い切ってその現場から離れる行動を取る事もオススメします。もしくは既にエンジニアの方であれば、すでにより綺麗になるコードが思い付けば、適度にそれらを改善するリファクタリングを行いながら実務をこなしていき、コードを徐々に綺麗にするようにする事を強くオススメします。

3:コミュニケーション力がない

 これが出来ないと、正直エンジニアになるのは難しいです。このコミュニケーション力は、要件を的確に把握もしくは提案し、手戻りをなくすために重要です。エンジニアにはコミュニケーション能力は不要と思うかもしれませんが、そんなことはなく、むしろ一番重要とも言えます。

コミュニケーション能力について

一般的に、コミュニケーション能力というと、人と雑談する力だったり、場を仕切るファシリテーション能力などが思い浮かぶかもしれません。もちろんそういったスキルも、更に上のマネージャークラスになる上ではある程度必要になってきますが、エンジニアのコミュニケーション能力は少し違います。

 エンジニアのコミュニケーション能力とは、すなわち確認する力です。この確認をいかに的確になタイミングで、的確な言葉で行えるかが、プロジェクトのタスクを円滑に進める上で重要になってきます。そしてこの確認に必要な内容こそが、1つ目に紹介したのタスク細分化とも被ってくるのです。「多分こうだろう〜」と思って実装を進めるのではなく、しっかりと上司に確認するというプロセスが、必要不可欠です。とはいえ、確認をただし続ければ良いかというとそうではなく、自分で判断出来る事は、わざわざ確認せずに進めていく必要があるというのが、この確認の難しいところです。これをするには、ある程度の仮説検証能力も求められます。この仮説を立てて検証をする力がない方は、エンジニアになるのは難しいと言っても過言ではないでしょう。なのでいつも、質問をする際は、解決したい問題、具体的なバグの状況、やった事は明確にするようにメンティーに指示をしています。この過程すら面倒くさがってやらずに全部教えてもらいたがる人は、エンジニアになれないと断言出来ます。

 この確認する力ですが、コミュニケーションにおける仕様確認以外にも、動作確認のテスト時や、何か重大な局面(本番デプロイ時、インフラの設定時など)での実行前の確認においても大変重要で、普段から何度もくまなく見直せる慎重さというのも、エンジニアにおいては重要なスキルになります。

まとめ

いかがだったでしょうか?

この中で予想通りのものや、意外だと感じたものもありましたでしょうか?
エンジニアになる上で、ただ一概にプログラミングスキルがあれば良い訳ではないのはお分りいただけたと思います。

これらを最初から身に付けておくのは難しく、現場で実践を積む事でしか身につかないのです。

エンジニアを目指す人も、もしくはすでにエンジニアの人でも、これらの能力は日々身につけ続けるものだと思っています。

私のコミュニティプランでは、こういった壁を越えられるように、チーム開発を通してエンジニアの実務経験が身につく行いもやっています。

よろしければぜひご覧ください。
https://menta.work/plan/330/9484

最後に、ここまで読んで頂き誠にありがとうございました!