2年目くらいのエンジニアに向けた "プロのエンジニアとは？" 心がけ編

# はじめに
「エンジニアって何勉強すればいいですか？」「どの言語がいいですか？」「ソフトウェアの開発の方法とか教えてください」などなど新人さんに聞かれることが多くなってきました。 わたしもかれこれ十数年？数十年？エンジニア続けてきたので。

いつもその場で行き当たりばったりで話すので... ここらで一度まとめてみようと。

１年目だとすべてが初めてなので闇雲にガムシャラに頑張れるとは思うのですが２年目くらいになると「あれ？これでいいの？」と思うことが多くなってきます。 ここにまとめる内容はその「あれ？これでいいの？」のAnswerとして書きました。 １年目の新人には少し難しいかもしれないのでタイトルは"2年目くらい"としてます。 新人でも大学などでインターンなどやってきた方には別にこの内容話しても良いかもしれないですが、真っさらの新人に話してもあまり現実味もってくれないかもしれません...

# プロのエンジニアとは？

## **プロとは？**

本質的には「仕事をしてお金をもらう」のが **プロ** です。
スキルの高い低いは関係なくお金をもらって働いているのが "**プロ**" でもらっていないのが "**アマ**" です。

ただ、お金をもらって仕事するプロフェッショナルの社会的な責任・行動規範として（または、Fireされず、お金をもらい続けてご飯を食べ続けるため）**自身の専門性を磨き続けてそれを実践していく**必要があります。 結果としてわれわれプロは高い専門性と実行力を必然的に持ちます。

※ 決してスキルが高いからプロになるわけじゃないというところが大きなポイントです。プロを続けるためには高いスキルが必要になるのです。


## **エンジニアとは？**

エンジニアリングを実践するのがエンジニアです。

では、**エンジニアリング** とは何か。 エンジニアリングじゃないものは何か？ です。

### **エンジニアリング vs. サイエンス**

サイエンスとは理学です。 ある現象があったときに「なぜそれが起きたのか？」を追い求めることです。 真実を追求することに価値があります。 極論、真実を追求するためには金も時間もいとめをつけません。 大事なのは「真実」です。 それがサイエンスであり理学です。

エンジニアリングとは工学です。 ある現象があったときに「それを使って何かできないか？」「それを使って何かを実現する」ことです。 何かを実現することに価値があります。 真実はわからなくてもその何かを有効活用できればよいです。 有効活用するためには、早く、安く、できることが大事です。 効率や効果が大事です。 1億円かかって100円の利益しかでないようなモノは許されません。 56億7千万年かかってわかる真実も受け入れがたいです。 早く・安く・うまい のが大事です。

> 注釈：ここの説明は厳密な学問的な意味と齟齬があるのですが、それこそ、われわれはエンジニアなのです。厳密的な齟齬よりも効果・効率を重視します！

### **あらためてエンジニアとは？**

さまざまな道具や知識（コンピュータ、数学、国語、化学など）を駆使して、世の中の役に立つ何かを**実現**するのが**エンジニア**の仕事です。

真実を闇雲に追い求めるのはエンジニアではないです。それは**学者**です。
役に立たない・効率的ではない・ただ技術力を高めるのもエンジニアではないです。 それは**スペシャリスト**です。 バランスよく成果、または、効果を出せるのがエンジニアです。

現在において（Qiita読者を想定した場合）一般的には、コンピュータを利用して何かを実現することが多いです。
つまり、コンピュータを使って何か世の中の役に立つものを効率的に作りだすのがエンジニアです。

## **どこまで何を知っていればいいか？**

理学とは違うと言いましたがもちろん真実を知っていることは大事です。 では何をどこまで知っていれば良いでしょうか？

結論は「十分なだけ知っていれば良い」なのですが少し詳しく。

### **例えばプログラミングについて**

コンピュータに何をしてもらうためにはコンピュータがわかる言葉を使ってコンピュータに お願いしなければいけないです。 コンピュータがわかる言葉とは、つまり、プログラムです。

> まだまだコンピュータは、自然言語（日本語などの話し言葉）は理解してくれないです... たぶんいつまでたっても理解してくれないです...もし自然言語を理解できる未来が来るならそれは、コンピュータの発達ではなく「自然言語 or 人間の進化」の結果だと思います。なぜならば(略

コンピュータを使って何かをするためにはプログラミングが必須です。 なのでエンジニアはプログラミングが必要です。

#### **どの言語がいいか？**

良く出る議題です。 趣味でやるなら何でも良いと思います。 ただプロの世界のエンジニアリングでは効率が重視されます。 なので効率で考えてください。

今までずっと Java をやってたなら慣れ親しんだ Java で良いのではないでしょうか？ ただ今後 Javascript が流行りそうなので今のうちにやっておいたほうが将来につながるというので一念発起 Javascript に切り替えるのも良いです。 長い目でトータル的に見たら効率的です。

AI系の業務をするために Python がライブラリがそろっていて便利そうなのであれば Java → Python へのチェンジコストを考えてもトータルの効率を考えて Python にするという考え方もあります。

会社の標準が Ruby で本当は golang 使いたいけど会社を説得するためのコストが大きすぎるというのであれば我慢して Ruby というのもありです。

C言語 無理。 swift とか使わせてもらえないとモチベーション上がらなくてやる気が起きない。 C++？ もちろん無理。 だからswiftを使う。 モチベーションによる効率の変動は当然あるのでそういう考えもありです。 会社相手にその理屈が通じるかは知りませんが…… その場合は説得のコストを考えて C/C++ 使ってください。 

どの言語がよいか？ という曖昧な問いではなく今現在においてどの言語がより効率的か？ と考えることをオススメします。

### **コンピュータの仕組みはどのくらい知ってる方がいい？**

例えば、ネットワークの仕組み。 HTTP知ってますよね？ TCP/IP知ってますよね？ ではIPヘッダの構造しってますか？ LANケーブルの規格知ってますか？ LANケーブル内の電気信号はわかりますか？

コンピュータの仕組みを知っていることは大事です。とても大事です。 なぜなら知っている方がより効率的にものが作れる可能性が高いからです。

HTTPという言葉・表層だけを知っている人よりもプロトコルの中身を知っている人の方が何か問題が起きた時の対応が早いです。 少しこったWebサイトを作ろうという時にもプロトコルの中身を知っている人の方が最初から実現不可能な無茶な設計をしないですみます。 結果としてかなり効率よくものができあがります。

最近はAI系でこの現象が起きています。
 「AIでチャットボット作りたい」と思うのは良いですがAIの仕組みを知らずに「作りましょう！作りましょう！」 とか言ってしまうとあとでイタイ目にあいます。 要件をみなおしたりせっかく盛り上がった関係者に説明しなおしたりとめんどくさいことが多くなって、開発効率は極端に下がります...

では、AI → 機械学習 → ニューラルネットワーク についてどこまで知っていればよいでしょうか？ 時間とお金が無限にあればすべて知っているのが良いと思いますが時間もお金も有限です。 今現在で言えば Azureとかのクラウドを使うことでかなり品質の高い機械学習が実現できます。機械学習のアルゴリズムの難しい数式をしらなくても、十分に「利用可能」です。

> もちろんアルゴリズム知っていた方がよいです... けど... 本当にみんながみんな知ってる必要はないですよね

つまりは、プロとして自分がやっていくうえで「十分なだけ知っていればいい」のです。

### **何をもって十分といいますか？**

けーす　ばい　けーす　です。

なのですが大きな指針として。

- まわりの人と嘘をつかないで話せるだけの知識をもっている。
- まわりの人より得意／より深く知っている分野を２つ以上もつ。

のあたりが参考になると思います。
ネットワーク専門の会社ならまわりのネットワークが得意な人たちと話せるだけの知識はもちましょう。 その際にはわからないことは「わからない」「後で調べます」と言えるだけの知識を持ちましょう。 嘘をついてしまうのは問題です。

「わからないと言う」「わからないということを共有した上で意見を言う」「わからないことを黙ってる」は作業遅延程度なので許せますが、「うそを言う」は出戻りがおきてまわりに迷惑かけて信頼も落ちるのでやめたいです。

# さいごに

エンジニアとしてこまかなテクニック的なものはたくさんありますが、プロのエンジニアとしてまず知っておいてほしいことはこんなところです。

> これらの説明はどこかに書いてあったことではないので...この独断と偏見に誰か共感してくれると嬉しいです