一年間のインターン生活の振り返り

# 概要
インターンを初めてもうすぐで1年になるので、僕のインターン生活を振り返ろうかなと思います。


# インターンを始めた動機
知り合いの先輩にインターンを勧められたため、先輩同様Wantedlyに登録しインターン先を探しました。


# インターンを始めた頃の技術レベル
## できたこと / やっていたこと
- Djangoを用いた友人とのアプリ開発
- AtCoder茶色 (Python)
- CTFを少し
- KotlinでAndroidアプリを１つ作成
- Unityでゲームを１つ作成
- 機械学習を少し
- [Wantedlyのプロフィール](https://www.wantedly.com/id/manato_kato) に記載してある内容の2021/04までの実績

## できなかったこと / 知らなかったこと
- Git/GitHubの使い方はままならない
- Djangoを深く理解しているわけではなく、なんとなくで調べながら書いていた。
- Linuxコマンドはほぼ使ったことがない
- Dockerなどは知らない
- フロントはやったことがない

⇒ はっきりいって、**エンジニアとして働けるほどの技術はありません**でした。


# インターンの応募~選考
とりあえず、どこかの会社でインターンをしたいという気持ちが強かったため、自分の知っている技術を技術スタックして記載している会社に対して手当り次第に応募しました。（友人2人と一緒にインターンを探し始めたのですが、負けず嫌いの性格のため、誰よりも早くインターン先を決めたいという気持ちがありました笑）
8社応募した中から3社から返信が来たので、全て面談をさせていただきました。(lightmarks, lightblue, XXX社)
- lightmarks: 面談 → 合格 
- lightblue: 全体説明会 → 数理テスト → 合格 → 1dayインターン → 合格
- XXX社: 全体説明会 （条件が合わなかったため面談には進まず）

２社同時に面談が進み、ほぼ同時に決まったため、最初から掛け持ちで始めました。(←バカ)


# インターン初期
## 振り返り
### 簡単なタスクなのに終わらず焦る
join当初は優先度の低めな簡単なタスクをアサインしていただいていました。しかし、分からないことが多くなかなか完了できませんでした。簡単なタスクであるという認識はしているため、余計に焦りが出ました。

### 大規模ソースコードを始めて読む
個人開発しか経験したことがなかったため、大規模なコードに圧倒されました。ドキュメントはありましたが、知らない技術が多く、ディレクトリ構成、モデル間のリレーション、システム構成、etc... など様々なものが把握できませんでした。

### gitがわからない
gitは個人開発のときに、GUIアプリ(SourceTree)を用いて使用したことのみありました。コマンドラインからの操作の経験はほぼなく、各コマンドの意味もあまり理解できていませんでした。そのため、rebaseなどをする理由もあまりわからず、コンフリクトが起きたときは死亡していました。

<details>
<summary>激やばエピソード</summary>
「gitわかってない」とか言ってるけど、よくある「強いエンジニアが弱々ですって嘘をつくノリ」と同じでしょと思うかもしれません。
違います。僕は当初、かなりのやらかしをしていました。

タスクを行うときには、トピックブランチを作成して開発をしPRを出すということは知っていたため、そのように行っていました。一定の期間が経ったときに、タスクを終えてPRを投げると、PR画面にコンフリクトしているという表示が出るのです。調べるとpullして、rebaseするかmergeしようと書かれていました。「Pull?? そんなような言葉あったな...」と思いました。そうです、**一度もpullをせず、cloneしたときのメインブランチからずっとトピックブランチを切っていた**のです。ありえませんね。（「それまでは、コンフリクトしていなかったから大丈夫では？」と思う方が、もしかするといるかも知れませんが、最新のverで開発・検証しないと良くないですよね。**コードベースではコンフリクトしていなくても、実際動かしてみると動かないなどの問題が発生するかもしれません**。）
</details>

### docker知らない
dockerは一度も触ったことがありませんでした。概念も知りません。なんなら、Linuxの使用経験もほぼありません。
ただ、環境構築の手順が社内のドキュメントに記載されていたのでなんとかなりました。そう思ったのも束の間、開発環境でのエラーが起きます。なんのエラーなのか、なぜ起きているのかがなかなか掴めずスタックしてばかりでした。

### フロントエンド苦手
分かりませんでしたし、嫌いでした。
今も無理です。（ほんの少しは書けますが）

## 反省
### 詰まっていることを言い出せなかった
わからないことや出来ないこと、詰まっていることなどをなかなか言い出せませんでした。これは、社風の問題ではなく個人の問題です。「こんなことも自分は出来なかったのか」と落ち込み、「なぜ出来ないんだ？」といらだち、「簡単な問題で詰まっていることを知られたら恥ずかしい」と思っていました。
⇒ 「最初なんだから仕方ない」と割り切ろう。**一定時間[^1]調べても解決しなければ、恥ずかしいなどとは思わず、しっかり質問をするようにしましょう。** 大抵のエンジニアは「こんなことで詰まっているのか」みたいな卑しい感情は抱かずに、「こうするとよいよ。ココらへんを調べてみると良いよ。〇〇を学ぶといいね！」などと優しく教えてくれます。なぜなら、彼らもその道を経験しているから。（ほとんどのエンジニアは何も出来ない初心者の時代を経験しています。ごく稀に、なんでも出来てしまう天才がいますが、恐れずに質問してみましょう。）

[^1]:一定時間はレベルに応じて適切な時間が異なります。15min ruleといい、15分考えても解決できなかったら相談するという手法をとっている企業もあります。初心者は1時間くらいが目安なのかなと個人的には考えています。

### すぐにStackOverFlowで解決しようとしていた
はじめのうちは、エラーが出るとイライラして、なんとかして早く解決したいと思いました。そこで、エラー文を貼り付けググって、StackOverFlowを適当に見て、なんとなくで解決していました。本質を理解しようとしていなかったのです。（なぜエラーが起きたのか。なぜそのような対処法を行うとエラーが解消するのか。）このやり方では、少しは成長するかもしれませんが、大きな成長は掴めないことにしばらくして気が付きました。

⇒ まずは、エラー文をしっかり読むことから始めました。英語で書かれていたため当初は読むことすらしていなかったのですが、いざ読んでみると案外重要なことが結構書かれていました。それでもわからない場合はググって、出てきたStackOverFlowなどをしっかりと読みます。当初は英語が苦手だったので、コードブロックのところのみを読んでいたのですが、それではなぜ起きたのかやどうして解消できるのかなどのエラーの重要な部分が理解できずに、再発させたときにすぐに対処できません。そのため、回答者の英語を原文でしっかり読むように習慣づけました。その中で理解できていないなと思った部分や、これってなぜだろうと引っかかった部分は追加でその場[^2]で調べるようにしています。

[^2]: お金をもらってタスクをこなしているため、業務時間外で後から調べようと考える人もいるかもしれませんが、私はその場で調べるタイプです。「後でやろうは馬鹿野郎」という言葉が自分には刺さっていて、私は後回しにしたことの大半は消化されずに忘れていってしまうのでその場でやります。

### 諦めずに続けられた
最初は自分のスキルの低さに絶望しました。そして、学業が忙しくなったりした際には、インターンをやめようと思うときもありました。しかし、「やると決めたことはやりきる」というモットーを思い出し、なんとか諦めずに続けることができました。この自分の粘り強さは我ながら評価したいです。

# インターン後半
## 振り返り
### 要領よく仕事をこなせた
タスクを自分で分解し、適切な粒度にしてから取りかかれた。

### 自分の領域でないタスクに対して「出来ない」と言えた
フロントエンドが苦手なため、どうしても実装できない機能は割り切って他の方にアサインしていただくようにしました。

### timesチャンネルを活用できた
Slackでコミュニケーションをとっており、各自が自分用のチャンネルを作成して社内twitterのようなものを運用することが認められていました。ここで、詰まっていることや気づいたこと、自社サービスに取り入れられそうな技術の共有や個人の話題などを発信することによって、他の社員さん(主にCTO)から様々な学びを得られたり、交流を広げたりすることができました。

### 様々な改善案を提示できた
開発環境の改善や機能追加などに関して、デベロッパー目線とユーザー目線の両側面からサービス全体がより良くなるように自分なりの提案ができました。

### 自信を持ってタスクに取り組めた
インターンを通して徐々に自分に自信を持てるようになりました。自信を持ってコードを書いたほうが良いコードが書けると感じています。

## 反省
### 実装方針の切り替えをスムーズにできなかった
あるタスクに関して、実装方針を固めて実装をゴリゴリしていた際に、どうしても自分のスキルでは解決できないエラーにあたってしまいました。そこで、CTOにHELPを求めたところ、実装方針ごと見直してこのようにしたらいいのではないかというアドバイスを頂きました。しかし、長い時間をエラー解消にかけており、どうしてもやりきりたいという気持ちが抑えられず、そのアドバイスを受けた後も少しエラー解消を続けてしまいました。結局、エラーは解消できずにアドバイスどおりの実装をしました。今考えると、私がもともと立てた実装方針よりもアドバイス頂いた実装方針のほうが計算量的にもよいものでした。自己満足を優先してエラー解消に長い時間を割いてしまったことは大きな反省です。割り切る気持ちと冷静さを大切にしていきたいです。

### 要件を完全に理解せずに実装に取り掛かってしまった
タスクの要件やそのタスクが作成された背景などを完全に理解しないままで実装に取り掛かってしまったことがありました。そのため、タスクの実装方針を誤り時間を無駄にしてしまいました。改めて、タスクの十分な理解の大事さが分かったため、それからは、実装に取り掛かる前に疑問点や不安点がある場合は時間をかけてでも議論をして解消するようにしています。

# 感想
この1年でインターンを通してものすごく成長できました。自分で実感できてしまうほど成長しています。未経験の私を採用してくれたインターン先とインターンで私を成長させてくれたメンバーの方々には感謝しかありません。

# インターンのすすめ
「自分のレベルのスキルではインターン先に迷惑をかけてしまう」などと考えてインターンを始めることを躊躇している人もいると思います。私の例を引き合いに出して、「未経験でも大丈夫！」ということはできませんが（インターンを始めた頃はかなり心身削られたため）、インターンは確実に成長につながるため強くおすすめしたいです。とりあえず、wantedlyなどのサービスに登録して、いろいろな会社の話を聞いて、自分のスキルでもとってくれる会社を探すと良いと思います。そして、自分のスキルでも採用してくれる会社が見つかればぜひ挑戦してみましょう！！