ITに関係ないことをして生活している人がソフトウェアエンジニアになるために

## はじめに
私はエンジニアになって大体5年ほど経ちます。小さな会社からキャリアをスタートし、外資大企業に所属したこともありますが、今はまた都内の小さな会社に転職してゴリゴリプログラムを書いています。

普段はバックエンドのJava、PHP、Node.js等を書いて、まれにフロントエンドのHtmlやJavascript(VueやjQuery)も書くというような生活をしています。コロナの影響もあってエンジニアになりたいという人も昨今は増えているようなのでこの5年を振り返ってこれからこの業界に入りたい人へのヒントになるようなことを書いてみようと思います。**2015 - 2020年に都内で開発者として働いて得た個人的な経験から語っているもの**なので、普遍的事実ではおそらくありません。またエンジニアというのも運用系ではなく開発系のエンジニアを想定しています。

なお実際にエンジニアになれなくてもクレームは受け付けていません。

## 前提
なんとなく華やかなイメージのあるIT系エンジニアですが、まず前提として、システム開発をごりごりするようなエンジニアは、達成感はあっても、別にホワイトな仕事ではないと思います。むしろブラックです。もちろんホワイトな会社・仕事もありましたが、全部がそうだというわけではありません。激務・長時間勤務・責任重大で給与が高い、もしくは激務でもないし責任もないけど給与が安い、あるいは激務・長時間勤務・責任重大で給与が安いのどれかということがほとんどです。残業代もほとんどの会社・現場で月○○時間以上残業しないとでないという契約になっています。

技術、特にプログラミングが好きな人でないと厳しいと思いますが、逆に技術が好きな人には楽しい仕事かも知れません。

新しい技術は基本的に自分から学ぶもので、誰か先生がいて新しい技術の使い方をみっちり教えてくれることはありません。そもそもドキュメントの日本語版がネットにも本屋にもない、ネットの英語ドキュメントしかないということもよくあります。それを乗り越えて勉強したとしても、特にWeb系は入れ替わりが激しいのでせっかく学んだ知識が5年〜10年で陳腐化してしまうこともしばしばあります（例えばjQueryは最近VueやReactに置き換わられつつある）。つまり、自分から学ぶという姿勢はとても大切になります。また、この意味で私はプログラミングスクールには（高いらしいですし）ちょっと否定的です。

### エンジニア
エンジニアにも色々あります。

- SE --- システムエンジニアのことです。基本的には数人〜十数人くらいのPGを率いて開発を進めていく人です。プログラミング知識ゼロの顧客からどんなシステムを作りたいかを聞きだし、顧客の要求から仕様を決定し、大まかな設計を行います。ウォーターフォール開発でいわゆる上流工程をする人です。技術があったほうがいいですが、なくても要件定義能力とプロジェクト遂行能力があれば務まります。
- PG --- プログラマーのことです。基本的にSEの決定した仕様通りにシステムを作り上げる人です。外部から安く連れてくることもあります。

ただ、最近はアジャイル開発やDevOpsという考え方も広まっており、プロジェクトによってはPGが要件定義に参加することもあります。技術があって、なおかつSE的な仕事ができる人の評価が高く、給与も高いという印象があります。いずれの仕事をやるにしても技術はあったほうがいいです。技術的知識がゼロのリーダーはエンジニアから敬遠されます。

### （就活時を除けば）学歴はあまり重要でない
基本的に学歴は就活時を除けばあまり重要ではありません。学歴がなくても仕事ができる人はどんどん評価が高まります。逆に東大卒でもなにもできない、テストもなにもできないという人は居場所がないと思います。（あまり関係ないけど日本と違い欧米は経験に加えて学歴も重要視されます）
なお、学歴があったほうが選択肢が広くなるという意味で良いのは当然なので、学生さんはいい大学にいけるように頑張りましょう。

### "社員"と"SES"
エンジニアの形態にも色々有り、いわゆるSESという顧客の会社に常駐するタイプの開発者もいます。待遇はよくないことがほとんどです。テストをしてテスト結果をエクセルに書くようなことを延々やらされるなどの技術のつかないことをやることもあります。（新卒等の経験のない人はまずテスターをやらされたりします。ただし最近のアジャイルプロジェクトだとそもそも単体テストを自動化している場合も多いですが）

しかし、会社にもよるかもしれませんが、待遇が良くない分、若ければSES会社に入社するのはたいして難しくありません。また、（もちろん開発ができることは大前提で）開発をどうしてもやりたいという意思を会社に伝えれば割と通ります。SESは待遇が悪い分、なるのも難しくないのですがSES開発はなるべく避けましょう。特にアウトソーシング系は絶対おすすめしません。

SESエンジニアでいる限り待遇は全く良くなりませんしアウトソーシング系はSES以外の道がないからです。

さらにSESを定年まで続けられるかで言えば続けられない印象です。IT、特にWeb系の歴史がまだ浅い、生まれたばかりなのもあるでしょうが、私は40, 50代のSESは見たことがありません。

SESは顧客との契約が終わる度に次の顧客を探して契約を結ぶ必要があります。つまり、契約が終わるたびに次の顧客の書類選考を突破し、（本来違法だと思うのですが）さらに顧客との事前面談も突破しなければなりません。40, 50になればここを突破できなくなっていくのは想像に難くありません。次の常駐先が見つからないとどうなるかというと、優秀なら社内のプロジェクトに参加するか、それができなければ解雇を打診されます。正社員を次の常駐先が見つからないなんて理由でクビにするのは本来違法なので法廷で争うみたいな話になってきます。

小さい会社はSESを他社に派遣することしかやっていないことが多く有ります。中規模〜大規模の会社になると、よそから依頼されたシステムを作ったり（受託案件）、自社でなにかソフトを開発する（自社開発）こともあります。これにSESでなく"社員"として参加することがありますが、待遇はこちらのほうがいいことがほとんどです。さらに自分で仕事を取れるとか、能力が高いので自分一人で何でも出来ちゃうような人はフリーランスとして働くことも有りますが、バックエンド・フロントエンドのプログラミングできる+要件定義やプロジェクト進行・リーダーできる+英語ペラペラくらいのスペックがないと華やかなフリーランスににはなれないと思います。

## ソフトウェアエンジニアになるために
### 1. まずはなにかおもしろいものを作ろう
前置きが長くなりました。私がおすすめしたいのは、まずなにか作ってみるということです。私が初めて作ったのはJavaで書いたアンドロイドアプリで、英語学習用のクイズアプリでした。ウェブ系ではたしか（誰も使ってくれませんでしたが）PHPで掲示板を作ったのが初めてだったと思います。

実際にやってみないと、サーバーがどうとかSQLの書き方がこうあるべきとか言われてもピンとこないと思います。まずは実際に作ることで慣れていくのがいいでしょう。また、作ったものを誰かに使ってもらい、フィードバックをもらうといいでしょう。そうするとエンジニアの仕事がどういうものなのかなんとなく解ると思います。

具体的には[VirtualboxとVagrant](https://noteoneverything.blogspot.com/2017/07/contents-1.html)もしくはDockerで仮想マシンやコンテナを作成し、そのローカル環境でなにか作ってみるのがいいと思います。最初はいきなりDockerよりVirtualboxやVagrantを使うのがいいでしょう。Vagrantはあなたのパソコン内（ローカル環境）に仮想的な別のマシン（大抵はLinux）を作成するもので、このマシンをサーバー化し、このサーバーにPHP等をアップロードして動作確認しながらウェブアプリを作成できます。この仮想マシンへはあなたのPCのブラウザやコンソールからアクセスが可能です（あくまで開発のためのものなので逆に環境外からは見えない）。

Dockerはこれをさらに簡単かつ軽い環境にしたものです。Docker composeを使えばチーム内での環境の共有も簡単にできます。基本的には同じことをしますが、Dockerは開発でも本番でも使うことができ、共有や変更などの管理が容易です。Virtual box, Vagrantは本番と同じ環境をローカル環境に作るために使用し、基本的に開発環境でしか使いません。じゃあ最初からDockerを使えばよくない？と思うかもしれないですが、いきなりDockerからはじめるとDockerfileやDocker composeの抽象的な記述の理解が難しいのではと思います。

#### 開発にあたって
PHPでウェブ系の開発をするならLaravel, JavaならSpring boot、PythonならDjango等のフレームワークは必ず使いましょう。フレームワークはウェブ開発では必須です。

フロントはVueかjQueryを使ってなにか動的な演出ができるといいでしょう。Reactでもいいですが難易度があがります。HTMLはCSS(Bootstrap, Tailwindを使うと良い)、アイコンはfont-awesomeを使って多少凝ったデザインにするといいと思います。

言語はJava, Go, Pythonあたりがいいでしょう。案件数でいうとPHPも多いのですが、新規プロジェクトの言語の候補とPHPがあがることは最近は徐々に少なくなってきていると感じます。Rustも近年注目されていますが、ある程度Rustを使った経験があるならともかく、学習コストが高いのでビギナーがいきなりRustからはじめるのはやめたほうがいいでしょう。

### 2. ポートフォリオを作ろう
ポートフォリオとはなにかというと、作品集です。私はいままでこんなアプリを作ったんですよ、というのが見せられると自分のエンジニアとしてのレベルをアピールしやすいと思います。作品を作っても肝心のコードを見せないのでは意味がないのでGithubに書いたコードを公開してしまうのがいいと思います。1.で実際になにか作ってみようといいましたが、それを数個つくってポートフォリオにしましょう。
Github系のサービスは実際の開発でも使用されるのでそれに慣れておくという意味でもいいと思います。

開発に行く場合、そもそも開発ができないと仕事ができませんし、かといって業務には納期があるのでみんな自分の仕事に精一杯で丁寧に教えてくれないことがほとんどなので、個人的にいくつか実際にウェブアプリを開発して慣れておくといいと思います。

DockerであればDockerfileから簡単に起動して実際の動きを見ることができます。Dockerfile/Docker-composeを使ってある程度自動化しておくとよいでしょう。Vagrant/Virtualboxの場合は環境まるごと渡そうとすると数GBになってしまうので、Ansibleを使って環境セットアップを自動化するといいでしょう。つまりAnsibleのファイルだけなら小さいファイルですから、これだけ渡して自動的にアプリが動くまでの環境設定をやっちゃうということですね。Ansibleによる自動化の知識自体もアピールできます。

もしくは、きちんとしたアプリであるという自信があるのであれば、実際にサーバーにあげてしまうのもいいかもしれません（セキュアなアプリでない場合は危険ですので実際にあげる前によく考えてください）。そうするとURLをブラウザから叩けば見ることができますね。ポートフォリオを作っても、簡単に実際の動きが見れるような工夫をしてあげないと、採用の担当者も忙しいので斜め読みするだけか、そもそも見てくれないと思います。

また、たとえ実際に動いたとしても、コードが汚いと意味がないと個人的に思います。（汚いコードは大抵バグだらけなので）

### 3. 基本情報技術者試験を受けよう
ポートフォリオの作成に加えて、基本情報技術者試験に合格しておくといいでしょう。技術者が教養として知っているべき問題が出題されます。

この資格を持っていることで、少なくとも全く適正なしではないこと、最低限の知識は持っていることがアピールできます。資格を取得するとそれに応じて給与をあげてくれる会社は多くありますが、基本情報技術者は大抵そのような取ると給与があがる資格のうちのひとつです。余裕があればオラクルのブロンズ（Oracleというデータベースの試験）とかLPIC（Linuxの試験）も挑戦するといいかもしれません。

ポートフォリオがあって、資格もあれば、少なくとも大ハズレ人材ではないことがアピールできるので採用してもらえる可能性は上がると思います。（ただし資格を持っている人＝開発ができる人、ではないので急激に人気者になるわけではない）

### 4. （オプショナル）アウトプットしよう
よく言われることですが1-3で得た知見をアウトプットするといいでしょう。アウトプットすると忘れなくなりますし、文章化することで正しい理解を促進できます。間違った理解に対してフィードバックをもらって理解を正すこともできます。

### 5. （オプショナル）英語を勉強する
IT系の知識は基本的に英語で書かれたものが最新です。ありがたいことにその知識の多くはネットで無料公開されています。英語が読めると、その知識に無料でアクセスできます。これだけでだいぶ有利になります。

また、ある程度大きい会社だとインド系、中国系等の海外のエンジニアと話す機会が頻繁にあります。英語が使えるとこのような場面で非常に有利です。通訳や翻訳アプリを介さないで会話・コミュニケーションが取れれば、コミュニケーションのコストが下がりますし、こちらの言っていること・向こうの言っていることが伝わっていないというミスコミュニケーションによるトラブルの頻度を劇的に下げられます。

そういう海外のエンジニアが多い会社では英語が話せるというアピールは面接でもかなり効果的です。

### その他
Windowsオフィス系のソフトはよく使います。特にエクセルは多用するので多少は使い方を理解しておくといいでしょう。

なお、ソースコードの管理にはGit, ドキュメントの管理にはSVNやまれにNASが使われます。理解しておくと後々役立ちます。

### 給与
これはITだけに限った話ではないですが、例えば額面月32万の仕事があったとします。まあまあの月給のように聞こえますが、2021年現在、税金・厚生年金などはかなり高いので、この額面だと手取りは25万弱ほどになってしまいます。手取りを計算してくれるサイトもあるので試してみてください。

またボーナスはでるのか、過去にどれだけでたのか、でるなら何ヶ月分でるのかも重要です。そしてその手取りとボーナスでやっていけそうかその仕事につく前に事前に考えてみるといいでしょう。場合によっては実家で暮らす等の対応が必要になるでしょう。

### 実際に応募してみる
上記1,2,3,4,5を行えば、年齢と経験にもよりますがたぶんどこかしら採用してくれると思います。
SESの募集なのか、自社開発なのか、SEの仕事なのか、PGの仕事なのか、BtoCなのかBtoBなのか、色々吟味しつつ応募してみるといいと思います。エンジニアになれなくてもクレームは受け付けていません。