オプティムのエンジニアインターンに参加してきた話

オプティムの実務型バックエンドエンジニアインターンに参加してきました！

![PXL_20230802_000023002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/4cb97f9e-4b0f-ffb7-9982-9f45cfdf7e9c.jpeg)


インターンの内容を振り返りつつ、学んだことや感想などを記事にします！

# インターンシップ内容

- 2週間の実務型インターンでバックエンドエンジニアコースに参加

- 5日間リモート、5日間出社とオンライン・オフライン融合型のインターン

- インターン専用に用意された課題ではなく、アサインされたプロジェクトのチームに入って実際にリリース予定の機能の開発

- メンターさんが１人付いていただき、インターン朝会ではインターン生1人に対して数人も時間を割いてくださり、進捗管理や疑問点解消などをサポートをしてもらうことができる

- 最終日に成果発表と懇親会が開催される

# やったこと

AIによる契約書管理サービス「[OPTiM Contract](https://www.optim.co.jp/optim-contract/)」の開発チームにアサインされました。

このサービスで追加される、外部サービス連携機能のPoCを担当しました。

私の担当したバックエンド側でAPIを作成し、それをフロントエンド担当の人に呼び出してもらうという形で機能開発を行いました。

実装だけでなく設計から経験させてもらえたので本当に成長できたインターンでした！！

# 環境構築

一番最初は、貸与PCでの作業のため新しく自分で開発環境構築をしました。

最初にローカルで動かすためにbrewやyarn、goなど様々なツールをインストールしました。

またメンターの方から、おすすめのVSCODE拡張機能やターミナルが見やすくなる Oh My Zsh! やリクエストをAPIに簡単に送ることのできる Postman などを教えていただきました。

特にPostmanに関しては、最初はcurlコマンドを使用していましたが途中からPostmanに完全移行し楽をすることができたので、本当に助かりました。全人類にオススメします！！

# 設計

外部サービス連携機能を実現するために2つのAPIを作成する必要があったので、そのAPIの概要設計とタスク分解を行いました。

時間も限られていたので最初から詳細な設計をすることは諦めて、機能や大まかな流れなどを設計していきました。

また完璧な設計を行ってから実装するより、実装しながら設計を見直していくスタイルを取ることで短期間で効率的に業務を遂行することができました。

初めて実務的な設計を体験しましたが、最初から手を動かすよりも実装が楽になったので、設計のありがたみを感じました。

また設計が終わったのはインターン10日あるうちの4日目であり、実装に本格的に着手したのは5日目と遅かったのですが、時間をかけたとしても間違いなく無駄ではなく非常に勉強になりました！！

# コードリーディング

設計のために既存のコードを確認しながら進めており、設計とコードリーディングを並行に行いました。

実務の巨大コードを初めて見て最初はビビりまくりでしたが、今回のインターンで量の多いコードの読み方を学ぶことができました。

コードリーディングで大事なのは全てを理解することはせず、まず設計書を確認しながら自分のタスクに関わるようなコードを把握していき、わからなくても一旦理解を後回しにしながら読み進めていくことだと思います。

個人での学習とは違い、実務の限られた時間では、完璧に理解しようとするといつまで経ってもコーディングはできません。

コード自体が何を表しているのかわからなくても、関数名やコードに付随するコメント、設計書などから推測することはできます。

ただしプロダクトがスパゲッティコードや設計書が無い場合であればその推測も難しいので、
コメントやコードの読みやすさ、設計書が如何に重要で大切かを学ぶこともできました！

# 実装

5日目の金曜日から出社をして実装を行いました。

担当のバックエンドは開発言語にGo、フレームワークとしてEchoで開発を行いました。

Echoを使用したことが無かったのですが、割とわかりやすく個人的には使いやすいフレームワークでした。

またデータの管理に関するORMのGORMやクラウドストレージのAWS S3も使用経験が無かったのですが、メンターさんやチームメンバーに丁寧に説明をしていただき実装を進めることができました。

外部サービス連携のための認証・認可周りは、他のチームメンバーに開発していただきましたが、APIの動作確認のためにOAuthについても学びました。

ですが、開発者ツールからAuthorizationのBearerトークンを見ることを教えていただき、API動作確認のBearerトークンを含んだフロントエンドからのリクエストを簡単に作成することができました。

また実装で一番大変だったのがクリーンアーキテクチャに沿ったコーディングでした。

Webアプリでは基本的にMVCモデルを使用して実装していたので、クリーンアーキテクチャって何？状態でした。

細かい難しいことは今も理解しているわけでは無いですが、
「あまり変更することのないビジネスロジックを守るために、実装に依存せず抽象に依存させて、実装はインターフェースで行う」という依存性逆転の法則が大事！ということを意識しながらコーディングを行いました。

個人で学習・開発する時は保守性のことは気にしないので普段は後回しにしがちなアーキテクチャの部分を学ぶことができ、とても勉強になりました。

途中で外部サービスのドキュメントと実際の外部サービスAPIの挙動が違うじゃないか！と悪戦苦闘しながらも、なんとか無事に実装・動作確認まで行うことができました！

# 成果発表

最終日に成果発表を行いました。

成果発表で使用する資料作成のためにシーケンス図やフロー図のためのMermaidの書き方を教わりました。

とても簡単に使えて直感にあった書き方ができるので資料作成が捗りました！

成果発表は発表と質疑応答があり30分ほどで終わりました。

かなり緊張しましたが、終わってみれば自分の話したいことを全て話すことができたので満足感のある発表にすることができました！

# 感想

もう就業時間!?と思うことが多く1日が一瞬で終わってしまい、インターンが終わってみれば2週間に関しても本当にあっと言う間で、それほど楽しく充実したインターンでした！

懇親会ではインターン駆動開発なんて冗談も言われましたが、実際にインターン生ながら、サービスのリリース機能を実装だけでなく設計から経験させてもらい、本当に成長することのできたインターンでした！

出社した5日間は毎日チームのエンジニアや人事の方とランチに行って美味しいものを食べることができて幸せでした〜
(2日間分は撮り忘れました...)

![PXL_20230802_032921202.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/b49f3b43-7c36-62b0-1a36-2c8312dc1ec4.jpeg)
![PXL_20230803_031455867.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/24d03426-6489-f94d-1607-a68834dee90a.jpeg)
![PXL_20230804_032207696.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/f5e2d84b-014f-7b5d-a78d-8b94a1811117.jpeg)


最終日の懇親会後に撮影したものです。奥に見えるのがレインボーブリッジです。
夜景がとても綺麗！！
![PXL_20230804_131743410.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/314d4c7e-7c78-b2ae-8a40-06ffab15d613.jpeg)

# おわりに

サポートしてくださったメンターの方をはじめチームメンバーや人事の方、関わっていただいた皆様には感謝の念がつきません。

2週間とっっっても楽しかったです。本当にありがとうございました！！