長期インターンでゼロから開発、サービスインまで体験した話

# 1. はじめに
こんにちは！[MYJLab Advent Calendar 2023](https://qiita.com/advent-calendar/2023/myjlab "タイトル") 16日目を担当する4年の後藤です。

昨日は田中君の「[ショート動画の台本生成を自動化する](https://qiita.com/yoshiki495/items/d4838a2c54caf6c59292 "タイトル")」でした。AIをフル活用してショート動画作成を自動化していて、私もYouTuberになろうかと真剣に考えています。卒業旅行に向けて、とにかくお金が必要です。

今回は、私が3年夏から現在まで働いているインターンでの経験についてお話ししようと思います！かなり長くなってしまったので、流し読み程度で読んでいただけたらと思います！

# 2. どんな会社で働いているか
医療IT系のベンチャー企業で働いています。自社サービスの開発や受託開発が主な事業で、私は受託開発の案件にプログラマーとして参加しています。

社員数は30名程度で、半数以上がエンジニアで構成されています。基本は在宅勤務で、私のいるチームではバーチャルオフィスとして、[MetaLife](https://metalife.co.jp/remote-work/?gad_source=1&gclid=Cj0KCQiA7OqrBhD9ARIsAK3UXh3pgf0VNs2L-hohDKLGGYOzd4P5j0VshUmdiRaPOuRN1JKdd0ymWTQaAlS2EALw_wcB) を使ったりもしてます。(RPGみたいでかなりオススメです、無料で使えるプランもあります！)

# 3. 何を作ったのか

### 概要
[フルスクラッチ](https://www.cloudec.jp/ecnews/full-scratch/)でとある医療系会社の業務用システムを開発しました。新しくシステムを作ったわけではなく、既存システムの置き換えという形でした。

納品物は、業務管理用システムが2つと、お客さんの顧客が利用するWEBサイトの計3つでした。機能は、顧客管理やメール送信、CSV入出力機能、印刷機能など本当に色々あります。あまり馴染みのない業界のシステムだったので、作る過程で色々知ることができて新鮮でした。

### 使用技術
使用言語はバックエンドもフロントエンドも全てTypeScriptでした。フレームワークは、[React](https://ja.legacy.reactjs.org/)、[Next.js](https://nextjs.org/)、[NestJS](https://nestjs.com/)等を利用しました。ちなみに、私はReact触ったことあります！というアピールのみでこのインターンに採用されたので、React以外に関しては全てこのインターンで学びました。

# 3. 経験した開発の流れ
開発手法は(おそらく?)[ウォーターフォール](https://circleci.com/ja/blog/what-is-waterfall/)でした。ちなみに、要件定義・設計のフェーズには一切関わっていないので、ここで話すのは実装・テスト・導入フェーズの話になります。本当はこの3つに分けて説明したいのですが、実業務では結構ごっちゃになってしまっていたので、初期、中期、後期、サービスインに分けてお話ししたいと思います。

### 初期
実装は最初3人のチームで始まりました。正社員のリーダーが1人と、僕を含む2名のインターンという、本当にこれで大丈夫なのか？？というチームで開発が始まりました。一応、チームに配属される前にやった研修ではもう1人のインターンの子と軽くアプリケーションを開発したのですが、不安でいっぱいでした。

最初はバックエンド(NestJS)から作成を始めました。上司の指示に従って、ひたすらファイルを作成したり、コードをコピペして少し書き換えるという作業をしてました。実際はNestJSの構成ファイルや大量の[API](https://data.wingarc.com/what-is-api-16084)の[エンドポイント](https://www.cloudflare.com/ja-jp/learning/security/api/what-is-api-endpoint/)を作成していたのですが、当時は訳もわからずやってました。(笑)

ただ、流石に作業していくうちにAPIとはどういうものかだんだんと理解していきました。ロジック(情報を取ってくる、作成する等)を作成し始めるとさらにAPIへの理解が深まって、この段階でかなり成長できたかなと思います。

今思えばこのチームで良かったかなと思います。人数が少ないのでわからないことは聞きやすく、同じインターン生がいたことで適度にライバル視して切磋琢磨できたかなと思います。

無事にこのフェーズで最低限のAPIが完成して、仕様書を作成して軽くテストも行いました。

### 中期
中期ではフロントエンドを作成、と思いきや、私がAPIを作っている間に弊社のつよつよエンジニアがフロントエンドの大部分を作成してくれていました。なので、まずはフロントエンドとバックエンドの繋ぎ込みから始まりました。

しかし、これが結構難しかったです。フロントエンド(React)のコードのレベルが高すぎて、最初は全く理解することができませんでした。なので、繋ぎ込みを行うどころではなく、コードの読解にかなりの時間を費やしました。これが本当にいい経験で、優秀な人のコードを見ることで、いかに自分が今までイマイチなコードを書いていたか知ることができました。

コードの理解と繋ぎ込みが進んできた頃、またさらに問題が発生しました。お客さんから後出しで大量の要望が来てしまい、今あるシステムの大幅改修はもちろん、あろうことか納入するシステムが1つ増えてしまいました。それに伴って、フロントエンドの実装も本格的に行うようになっていきました。

流石に3名ではリソース不足なので、このタイミングでフリーランスの方2名と、他チームから1名をメンバーに追加することになりました。特に、フリーランスの方が技術的にも人間的にもとても素晴らしい方で、いろいろな事を教えてもらいました。特に印象に残っているのが振り返りの手法で、「[KPT(ケプト)](https://meetsmore.com/product-services/talent-management/media/93642#:~:text=%E3%80%8CKPT(%E3%82%B1%E3%83%97%E3%83%88)%E3%80%8D%E3%81%A8,%E6%96%BD%E7%AD%96%E3%83%BB%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%B0%8E%E3%81%8D%E5%87%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)」というものを教えてもらいました。KPTを行うことで、チームの課題が見える化されて、対応策を実行することができ、開発がかなり効率化されたと思います。

長くなりそうなのでで省略しますが、いろいろなことがありつつ、どうにか追加の要望も反映したシステムを作り上げることができました！

### 後期
後期では主にシステムの最終調整と、サービスインへの準備を行いました。

最終調整では主に検索系機能のパフォーマンス向上を行いました。具体的にはSQLの実行速度を上げる方法等をひたすら模索してました。

サービスインへの準備では、主に移行用プログラムの作成を行いました。既存システムのデータを新しいシステムに移行するプログラムで、移行対象と移行先の定義がとても大変でたくさんお客さんと話し合うことになりました。

### サービスイン
サービスインは実際にお客さんの元(地方)に行って行われました。ただ、私は論文執筆が忙しくて行けませんでした(泣)。移行プログラムは正常に動作して、大きな問題なくサービスインに成功しました！

# 4. 経験から得られたもの
今回の経験で得られたものは主に3つあります！

### 1. 技術力
フロントエンド、バックエンド、データベース、インフラ(軽く)の技術力を身につけることができました。広く浅くという感じですが、一通り経験できたのは本当に良かったと思います。おかけで、卒研の制作がかなりスムーズに進みました。逆に、今回の経験が無かったら今のテーマは扱えなかったと思います。

### 2. チーム開発力
インターンでなければ、チーム開発を経験できなかったと思います。Gitでのブランチ管理や、読みやすいコードの書き方を学ぶことができました。また、チーム開発のリードの仕方も、リードされる側として学ぶことができました。いつか私も開発リードがしてみたいです！

### 3. お金
普通の大学生に比べたらかなり時給が良いと思います。在宅勤務で通勤時間が一切かからないことで、長い時間働くこともできました。実際、基本的には1回の出勤で8時間働いています。それでも学校や遊びの時間は取れたので、仕事とそれ以外のバランスは結構良かったです。


# 5. おわりに
ここまで読んでいただき、ありがとうございます！
かなり長くなってしまいましたが、以上が私のインターンでの経験になります！
思い出として、この場に残すことができて良かったです！