将来なりたいエンジニア像は？

<h1>私について</h1>
・文系
・プログラミング経験1年
・サマーハッカソン優勝
・大手IT企業を目指して就活中

<h1>どうして書くの？</h1>
就活で一番聞かれる質問はこれです。２〜3年後、5年後、その先、現時点でエンジニア・プログラマとしてどのようなキャリア（仕事）を目指していきたいか、しっかりと目標を持って仕事に向き合っているかを確認する質問です。この質問を制し、就活のためにも自分のためにも良いキャリア選択ができるように、この場をかりてアウトプットしました。

<h1>エンジニアのキャリアって？</h1>
①スペシャリスト
一つの分野の専門家で狭く深くタイプ。

②フルスタック思考のエンジニア
ひとりでシステムを構築、運用までできるエンジニアで広く浅くタイプ。

③CTO等エンジニアとしての道
技術的な部分の割合が少なく、プロジェクトや組織のマネジメント業務を中心にする。

④上流SE,コンサルタント
お客様のビジネス要件を理解し、それを最適なシステム要件に落とし込むSEやビジネスモデル自体を提案する。

僕は、③のエンジニアになりたいです。

<h1>どうして③になりたいのか？</h1>
<h3>自分に優れた能力がないから</h3>
僕は勉強もスポーツも、多分全てが普通。特別これが得意といったことはないです。そんな僕が、大きなことを成し遂げるには、優秀な人の力を借り協力する必要があると考えます。

<h3>他者を動機付けさせるのが好き</h3>
大学の3年間、私は組織を率いる経験が多かったです。自分が関与したことで、その人が目標に達成できたり、自己表現がうまくなったりする姿をみて、とても嬉しかったです。それは、一人では感じることのできない達成感ややりがいがあり、**達成感 = 協力した人数✖目標の大きさ**であると学びました。それ以来、どうやったら他者をより動機づけられるかを考え、言葉の伝え方や他者の期待を把握する方法を勉強しています。

<h3>意志決定の機会が増える</h3>
組織での立ち位置が上がれば、組織の誰よりも事業について知る必要があります。この責任とプレッシャーが怠け者の僕にやる気を与え、より早く成長させてくれると考えます。

<h1>今から私がすべきこと</h1>
<h3>他者の職種や役職について理解する</h3>
良いリーダーとは、他者の職種や役職についての十分の理解がある人だと考えます。表面的な理解では、他者の仕事にかかる時間やコストを正しく把握できず、ミスコミュニケーションを起こす原因となってしまう。

<h3>バックエンドエンジニアなる</h3>
バックエンドエンジニアの仕事は、事業の継続性・信頼性を保つために最も重大な役割を果たしていると考えます。さらにサービースのリリースにはスピード感を求められ、クオリティーとのバランスを保つ最も難しい仕事の一つだと考えます。**独学では学べない現場ならでは**の膨大なデータの効率的な参照方法、快適なレスポンスの返しかたのノウハウを身につけたいと考えます。


<h1>なんの勉強をしていくべきなのか？</h1>
[@poly_soft](https://qiita.com/poly_soft/items/fb649573c19b7a5c0227)さんのバックエンドエンジニアがすべきことを参照

<h3>テスト</h3>
 **①Mock**
>Mockとは、簡単に言うとテストにするためにつくられたオブジェクトです。テストしたいところを、Mockにさしかえ、Mockの動作内容を定義することで、望むテスト条件を容易に作ることができます。

以前LINE Developersで開発する際にmockサーバーを立てたことがあります。
毎回変更内容をデプロイするのが面倒だったので、下記のファイルを実行させテストさせました。

```javascript
axios
  .post("http://localhost:3000/webhook", body, {
    headers: {
      "Content-Type": "application/json",
      "X-Line-Signature": signature,
    },
  })
```

**②外部サービスでテスト(AWS LocalStack など)**
>LocalStackとは、クラウドアプリケーションを開発するための使いやすいテスト/モッキングフレームワークを提供するツールです。イメージとしては、ローカルに擬似的なAWS環境を作ってくれて、料金など気にせずにテストや動作確認を可能にしてくれます。


<h3>RDBMS</h3>
firebaseをはじめNoSQLの各種サービスが非常に便理でつかいやすく、乱用してきました。しかしながら、現場ではRDBが9割以上らしく、基本的な管理方法やコマンドに関しては必ず知っておく必要があると思います。
下記は[kirohi.com](https://kirohi.com/sql_4_languages)さんのサイトを参照

**①データの操作を支持するDML・TCL**
DML(Data Manipulation Language)とは、データの格納や取り出し、更新、削除などの命令の総称です。SELECT, INSERT, UPDATE など

**②トランザクション制御言語・TCL**
TCL(Transaction Control Language)とは、トランザクションの開始や終了の命令の総称です。COMMIT, ROLLBACK など

**③データ定義言語・DDL**
DDL(Data Definition Language)とは、テーブルなどの作成や削除、各種設定など命令の総称です。CREATE, ALTERなど

**④データ制御言語・DCL**
DCL(Data Control Language)とは、DMLやDDLの利用に関する許可や禁止を設定する命令の総称です。GRANT, REVOKEなど

現在は、正規化とSQLをより短くかき、効率的なレスポンスができるように書くことを意識し、開発しています。

>正規化とは、テーブルをできるだけ分解し重複をなくすこと。それにより、データの追加・更新・削除などに伴うデータの不整合や喪失が起きるのを防ぎ、メンテナンスの効率を高めることができます。


<h3>Docker</h3>
[satoshi sobue](https://qiita.com/SatoshiSobue/items/a612ebbb3a9242c09db5)を参照しました。

<h4>Dockerとは？</h4>
コンテナ仮想化技術を簡単に扱えるようにしたソフトウェアです。

<h4>Docker誕生までの背景</h4>
**複数のサーバーを構成**
問題点：サーバーのPCの数だけ、環境構築や設定アップデートの必要があり管理が非常に面倒
↓
**仮想サーバーの誕生**
仮想化とは、ソフトウェアによって複数のハードウェアを統合し、自由なスペックでハードウェアを再現する技術。
問題点：目的のプログラムとは関係のないサービスなども多数動作することになるので、立ち上げにかかる時間が長く、リソースも無駄に多く必要になる。
↓
**Dockerの誕生**
コンテナ仮想化技術により、必要なプログラムだけを必要なときに実行することができ時間と無駄リソースを削減。

<h4>Dockerまとめ</h4>
・１台のPC上で簡単かつ安全に独立したサーバーを複数動かすことができる。
・アプリケーションのバージョン管理が楽になる

<h4>Dockerの動かし方</h4>
>
・Dockerfileを書いて
・docker buildコマンドでDockerイメージをビルドして
・そのイメージを何らかのリポジトリ(DockerHub等)にdocker pushして
・そのイメージを何らかのVM上にdocker pullして
・そのイメージをdocker runしてコンテナを実行して
・そのコンテナの特定のポートに外部からアクセスする/