導入
はじめまして。フューチャーのインターンシップに参加していた中山です。
私が参加したインターンシップであるEngineer Campの経験を話します。
インターン参加前の状況
インターンで経験したいと思っていたこと
今回のインターン参加前、自分が経験したいと考えていたことは以下の通りです。
- サーバサイドのプログラミングを経験する
- インフラ周りの設定、環境構築、設計などを学ぶ
- チーム開発の流れを経験する
自分の技術スタック
また、今回のインターンに参加する前の自分の技術スタックは以下でした。
- フロント:React
- サーバ:Go, Node.js, Ruby
- DB:MySQL, SQLite3
- OS:Mac OS, Linux
- その他言語:c++, Python, Scala
C++, Node.js, Rubyは授業や趣味で少し触れたことがある程度、インフラ周りは名前しか分からないという感じでした。
情報系の学生で、IT系のアルバイトやインターンなどに参加したことが無い学生の典型的なスキルセットだったと思います。
参加したインターン
上記のような希望を持っていた私は、Engineer Campの中から「(3)IoTプラットフォームバックエンド開発🏭」を選択しました。
このインターンの特徴は募集ページには以下のように書かれており、IoTのバックエンド周りを実装することです。
フューチャー夏のインターン2020。リモート開催予定です
実際に稼働している、ミッションクリティカル(高い信頼性が求められるシステム)のバックエンドシステムを開発します。フューチャーでは貴重な広域・大規模な接続数(数十万規模)であり、多くの課題が山積みなので一緒に解決に導きましょう。
未来報にもインターン記事があるので、興味がある方は確認ください。
インターン参加までの流れ
正直に話すと、私は就業型のインターンで給料のもらえるアルバイトを色々と探していたため、フューチャーはサポーターズのイベントで見た時にとりあえず応募してみようという思いでした。
おそらくほとんどの人が最初に思うように、私もフューチャーのインターンの受け入れ先の種類の多さに驚きました。10種類もある受け入れ先の中から、技術的な応募条件と自分のスキルセットが合うものを探し、今回参加した(3)IoTプラットフォームバックエンド開発🏭を選択しました。
インターン合格までに受けた面接は、コーディング試験+オンライン面接1回のみでした。オンライン面接では、実際に参加したプロジェクトの現役開発メンバーの方2名が面接官となり、開発経験、技術スタック、そもそもなんで今回応募したのか、今まででの開発で大変だったことエピソードなど定番の質問を受けました。
一方で、コーディング試験の手応えはあまりなく、今年のインターンはコロナの影響もあり全国的にオンライン開催となり、学生側が気軽に応募しやすい関係から、倍率が上がるという話が噂されていたことに加え、就業型で給料のもらえるインターンは人気が高いと思っていたため、あまり受かるとは思っていませんでした。
蓋を開けてみると、結果は合格、話を聞くと作業用のPCまで貸与、さらに最新モデルのMacBook Proという素晴らしい環境を用意していただいたので非常にうれしかったです。
インターンに参加してみて
まず前提として、今年はコロナの影響もあり、インターン自体が完全オンライン開催でした。プロジェクトのメンバーの方達も基本的に全員在宅ワークという形であり、Google Meet, Slackなどを利用して活発に連絡をやりとりしている状況でした。
インターンでやったこと
実際のインターンでは、まず初日に環境構築から始まります。
インターン参加学生には全員フューチャーから作業用PCが与えられ、このセットアップから行います。環境構築のはじめにやることは、インターン中は常にVPNを利用してフューチャーのプライベートネットワークにつないでいるため、プロキシ周りの設定になります。プロキシの設定後、プロジェクトで利用しているGoやDockerなど必要な物をインストールします。環境構築完了後は既存のテストを走らせ、通れば作業開始です!
環境構築後、インターン中に実際にやったことは以下のようなタスクです。
- Swaggerを用いてAPIの設計
- APIのエンドポイントに対応したハンドラの作成
- テスト
- DB操作系の実装
- Goを使ってCSV,Excelファイルの処理
- 少しだけDB設計
採用技術
今回参加したプロジェクトは以下のような技術を採用していました。
- フロントエンド: Vue.js
- バックエンド:Go、Swagger
- DB: DynamoDB
- インフラ:AWS、Terraform
- その他:GitHub, CircleCI, draw.io, Slack, etc.
このうち、バックエンドを中心に開発しました。
インターン中の1日
ここでは3週間のインターン中どのような1日を過ごしていたかまとめました。
10:00~ 朝会に参加👪
参加したプロジェクトは毎日午前10時から30分ほどで前日の進捗と、当日の予定をスプレッドシートに記入、報告するミーティングがあり、それに参加していました。
10:30~ 作業開始🏭
任されたタスクの作業をはじめます。
基本的に、GitHubのIssueページ、リポジトリ内のドキュメントを読みながら実装を進めます。
実装用件などで分からないところがあれば、メンターさんにSlackで質問しながら進めます。
12:30~ 昼休憩☕
基本的にお昼は12:00~13:00ですが、リモートワークで家で作業ということもあり、こっそりと12時半まで作業してから1時間休むことで、13時を過ぎてもまだ休んでいていいという優越感にひたるライフハックです。
毎週月曜日はインターンに参加している他の学生とランチ会がありました。
13:30~ 作業再開🏭
作業に詰まっていると、メンターさんとGoogle Meetを用いて1on1で相談をしたりすることもありました。
参加したプロジェクトではSlackのチャンネル内に作業スレを立て、自分の現在行っている作業を書き連ねることで、自分の仕事状況を見える化する試みが行われていました。別途私は日記をつけて、作業ログを残していましたが、作業の途中で前日どのように実装したかなどを振り返るのにも便利でした。
また、今回のインターンでは数回フューチャーの各部門のトップの方が30分時間を取ってくださり、それぞれ働き方のマインドや事業の紹介などいろいろなことを講義してくれる日がありました。
19:00~ 作業終了📄
インターンの振り返りを日報に書き、その日働いた分の勤務報告を記入しPCを落としてその日のインターンは終了です。
インターンから学んだこと
インターン自体からは非常に多くのことを学びましたが、振り返って思いつく内容は以下のような内容です。
- Swaggerが便利!
- swagger generateでRequest/Response系の自動生成されるコードがたくさん!
- TDT(Table Driven Test)が便利!
- テストケースの増減のしやすさ
- テストコードの可読性の高さ
- Go言語書きやすい!
- 型がある安心感とスライスなどの柔軟な記述性
- プロキシ周りの設定は大変。
- Docker for Macのプロキシ設定箇所どこ・・・
- Docker内のgoはなぜ大文字のHTTP_PROXYしか受け取れないのか・・・
- チーム開発におけるREADMEなどによる開発手法・設計・データ構造の定義などの明文化の大切さ
やはり開発現場に入って初めて気付けることは多く、便利な新しい技術に出会えるのはもちろん、途中参加者のキャッチアップのための充実したドキュメントの大切さなど多くのものを学びました。
特に、インターン参加前にGoでサーバサイドのコードを記述していた際には、ginを利用しており、Response, Request共に構造体を何度も書き、bindの記述を書いていましたが、swaggerでそれらのコードが自動生成されるのを見ると感動しました。
インターンを振り返ってみて
自分のコードがマージされたときは最高の気分!!Slackでも祝ってもらえます。
インターンを全体的に振り返ると以下のようなことを思いました。
- 参加前にインターンで学びたいことは概ね達成
- サーバサイドプログラミングの体験
- Gitを用いたチーム開発の経験
- 実際の業務に参加し、キャッチアップしながら開発を経験
- 改めてITエンジニアの大変さを知る
- プロジェクトの連携企業との連携の大変さ
- 納期の遅れ
- プロキシの設定が非常に大変。。
- 日を跨いだタスクの持ち越しは精神的に辛い。
- レポートや卒論に追われているときに似た感覚
- インターン自体はタスクも面白く、楽しかった
個人的な都合で当初の4週間から3週間に期間が縮まった影響もあり、インフラ周りにまで手を出せなかったのは残念でしたが、Swaggerという新しいフレームワークを学べたり、様々な質問をする中でAPI設計の思想など今回のようなインターンで直接現場の方に熱心に教えていただかなければ中々知ることができないことを学べたのが大きかったと思います。
一方で、与えられるタスクには実装のために必要な資料や背景情報が足りていない場合もあり、そういった場合には質問を重ねる必要があるため、Slackなどで積極的にコミュニケーションを取る必要があるように感じられました。そのため、プログラミング力だけでなく、ある程度自主的に考え、動く力を求められるインターンでもあったと感じました。
そうした環境だったからこそ、与えられるタスクのIssueの要件そのままに実装するのではなく、今回の実装が何を解決するためのものなのかを考え、時に問題の内容を抽象化、具体化するなどの訓練を積むことができたのではないかと思います。
単純にプログラミング能力を鍛えるだけでなく、働き方自体を学ぶことができるインターンであったと思います。
今後に向けて
今回学んだ
- Gitを利用したチーム開発の流れ
- Swaggerの便利さ
などを今後の就活、アルバイト、趣味、研究などに生かしていきたいと思います!
結び
自分の都合により、本来4週間のインターンを3週間に削ってもらい参加する形となりましたが、様々なタスクを経験させて頂いたり、インターン期間中に色々サポートを頂いたりしました。
受け入れ先のプロジェクトのみなさん、フューチャーのHRのみなさんありがとうございました。