エンジニアとして活躍したい学生が社会人になる前1年でやっておいた方がいいこと

# はじめに
[【Mentor Ver.】TechTrain Advent Calendar 2019](https://qiita.com/advent-calendar/2019/techtrain-mentor) 11日目のエントリとして書いています

# 概要
現在エンジニア選考等で就活をしているもしくは内定をもらっている学生に社会人になるまでの期間に何をすると良いのか。というのを新卒時代から採用に関わらせていただきたくさんの学生を見てきた観点から書いていきたいと思います。（あくまで個人の主観です)

# どのステップにいるか？
まず、あなたがどのステップにいるかでするべきことは変わってきます。
（コードを書いたことがない人はステップ外です。本当にエンジニアになりたいならまずがむしゃらにでもいいので手を動かしてみましょう。）

**エンジニアになりたいと思っているが、まだコードを練習程度しか書いたことがない人**
 -> [STEP1から](#step1)
**自分で何か小さくてもアプリやサービスなどを一つ以上作ったことがある人**
 -> [STEP2から](#step2)
**アプリやサービスを複数作ったことがあり、設計を行ったことがある人**
 -> [STEP3から](#step3)
**受託などの個人開発以外のアプリ・サービスを作ったことがあり、共同開発をしたことがある人**
 -> [STEP5から](#step5)

## STEP1
まず、何より<font color="OrangeRed">自分が作りたいものを一つ考えて作りきってみましょう。</font>
プログラミングは手を動かしてみるのが一番上達への近道です。

**「あ、プログラミングを学びたい。だから入門の本を読もう」**
これは学習意欲があり素晴らしいことなのですが、こんな風に勉強を始めるとたいていどこかでモチベーションが続かず飽きてしまいます。また実際にどういうケースで使うのかがわからないところが多々あり、結局コードは書けないままになってしまいます。
例えるなら英語の勉強みたいなものですね。どれだけ勉強しても実際の会話でどのように実用されているか学ばないと話せないままです。

**「あれが作りたいな。だからこの言語を学びながら作ってみよう」**
これができると強いです。<font color="OrangeRed">自分が作りたいものがあり、それに対して学びながら試行錯誤して作ってみる。</font>
これをしている間は楽しくて時間も忘れてしまいますし力もしっかりつきます。

## STEP2
個人でアプリやサービスを作れたなら今度は<font color="OrangeRed">コードの設計</font>を意識してみましょう。

個人で自由に開発をしていると、最初はとにかく動くものを作ってしまいます。
それはいいのですが、ある程度コードを書くことに慣れてきたらそれだけではいけません。
あなたが新しい機能を実装しようとした時に2000行あるファイルにコードを追加しようとすると大変ですよね？
<font color="OrangeRed">しっかりと設計すること</font>は将来の自分、または共同開発者のためにとても重要なことです。

社会人になるとほとんどの人がチームで開発するなどして複数人で同じプロダクトを開発することになります。
たとえ個人で開発するとしても、将来的にあなたがいなくなったら運用できなくなるような実装なら大変ですよね？

設計を学ぶことはエンジニアとして働くための重要な一歩です。

## STEP3
コードの設計をすることができ、個人でアプリやサービスも作ったことがある人は<font color="OrangeRed">複数人で共同開発</font>をしましょう。

先ほども述べましたが、社会人になるとほとんどの人がチームで開発するなどして複数人で同じプロダクトを開発することになります。
学生時代から共同開発をしていると色々なことに気づくでしょう。例えば

- コード設計の大切さ
- バージョン管理の大切さ
- コミュニケーションの大切さ
- 自分の専門領域以外の理解の大切さ
etc...

共同開発をする時のコード設計の大切さは一つ前に書きました。
ここで一番伝えたいのは<font color="OrangeRed">バージョン管理の大切さ</font>です。
複数人で開発を行っているとどうしても同じファイルを編集するような場面に遭遇します。
その時にだれかが編集を終わるまで別の人が編集できないと大変ですよね。
開発速度も下がってしまいますし、何か起こった時にどこの修正でそれが起きたのかがわからなくなったりします。
そんな時バージョン管理をしていれば安心ですね！

バージョン管理の説明はここではしないですが、つまり<font color="OrangeRed">gitを使えるようになりましょう</font>ということです。
またgitのホスティングサービスで一番有名なGitHubを使えるようになっていれば、一旦は大丈夫です。

## STEP4
ここまでできていれば十分社会に出ても通用すると思うのですが、さらによくをいうと<font color="OrangeRed">企業案件を受けてみましょう。</font>
今まで作ってきた個人的なアプリやサービスと規模が違うので、意識するところが変わるのに気づくでしょう。

個人的に感じる大きな違いは<font color="OrangeRed">「安全性・保守性」</font>の観点です。
個人的なアプリやサービスの場合、エラーハンドリングや例外処理などをないがしろにしがちです。
しかし企業案件規模になるとユーザ数が違います。50回に1度程度しか出ないバグでも、ユーザ数が10万人いれば2000人に発生するバグになり得ます。
このような<font color="OrangeRed">「安全性・保守性」に対する意識を養う</font>ためにも企業案件を経験しておくことはエンジニアとしての成長につながります。
具体的には、

- 最初にコードの設計をする
- 例外処理を書く
- テストコードを書く

部分を意識するといいでしょう。

## STEP5
ここはむしろプラスの部分なので、余裕がある人はしてもいいかもねぐらいのステップです。
STEP4までしっかりできていれば十分社会人になってもすぐエンジニアとして戦力になり活躍できます。

追加するとするならば、<font color="OrangeRed">できる限りたくさんの知識に触れましょう。</font>

- 色々な設計（MVC,MVVM,MVP,FLUX,REDUX,Clean Architecture,RIBs etc...)
- ライブラリやSDK、その実装
- 専門領域外の言語の学習
- 専門領域外の知識・サービス（ネイティブならサーバ側のGCP、AWSなどの知識。サーバならApp Storeの申請フロー etc...)
- 今界隈で流行っているもののキャッチアップ（著名人などをフォローしたりすると良い）

などがあげられます。

# 終わりに
今回は学生が社会人になる前にやっておくと良いことを書きました。
これを書いたのは、よく学生と面談している時に「今のうちにやっといた方がいいことってなんですか？」という質問が僕の所感では多く感じたからです。
この質問の答えは上記でも述べたように現状どの程度できるかによって変わってくるので今回はそれぞれの場合にわけて書き起こしてみました。
今同じ疑問を持っている人の参考になれば幸いです。

僕から伝えたいのは、<font color="OrangeRed">上記のパターンに当てはまる人で、もし就職活動中や内定後で今の自分の力に不安を感じていても大丈夫！</font>ということです。
一年しっかりと意識をもってとりくめば社会人になる頃には実力は全然変わります。
何をしたらいいのかわからなくて不安だったという人は是非とも今日から取り組んでみてください。