【インターンレポート】CA Tech Dojo 〜サーバサイドGo編〜

みなさんこんにちは！学生エンジニアの[くろちゃん](https://twitter.com/TakumaKurosawa)です。

皆さん、夏休みは充実した時間を過ごすことができましたか？
私はインターンシップに全力投球をした2ヶ月間でした。この2ヶ月間はかなり自分を追い込んだ2ヶ月間だったので、しんどい事も多かったですが、その分満足のいく成長・成果が得られたと確信しています。

せっかくの良い経験だったので皆さんに学びを共有しつつ、改めてこの夏を冷静に振り返ろうと思い、この記事を書いています。

今回の記事は[株式会社サイバーエージェント](https://www.cyberagent.co.jp/)のCA Tech Dojo 〜サーバサイドGo編〜の記事になります。

その他2社の記事は下記にまとめてあります。合わせてご覧ください。

- [Fringe81 〜設計を学ぶインターン〜](#)
- [Dive into mixi 〜長期就業型インターン〜](#)

![](https://d2l930y2yx77uc.cloudfront.net/production/uploads/images/14321727/picture_pc_3e05f72942970896d35f066ad51c4e05.png)

## 参加した理由
私は普段Webフロントエンド領域を専門分野としており、Nuxt.jsやReact.jsを書いています。そのため、インターンも本選考もフロントエンドエンジニアとしてやっていこうと決めていました。

行きたいと思っていた3社のうち、Fringe81とミクシィについてはフロントエンドエンジニアとしてのインターンがすんなり決まったのですが、残るサイバーエージェントだけは日程的にもWebフロントエンドというポジションでのインターンが難しいことが判明しました。

私の中でこの夏のインターンの目的を、**自分自身の成長のため**と、**自分が選考を受ける会社を確定するため**のものだと定めていたため、下記のような理由でCA Tech Dojoに参加しようと決意しました。

- Webアプリケーション全体を理解しているエンジニアになりたい（バックエンド領域のスキルアップ）
- サイバーエージェントのカルチャーは自分にすごくマッチしていそうだけど、実際の現場はどうか知りたかった
- 今流行りのGo言語に入門したかった

## 掲げた目標
私が掲げた目標は、**「アイデアを1から『社会に通用するレベル』で形にできる力を身に付ける！」**です。
この目標を立てた理由を下記に示します。

- バックエンド領域の開発まで出来るようになってWebアプリケーション全体を通して設計・開発が出来るエンジニアになりたい。
- 『社会に通用するレベル』を達成するために下記のようなスキルを身に付けたい
    - コードに信頼性を持たせる
        - コードの綺麗さ
        - テストを通す（テストコードの実装）
        - セキュリティに強い
    - 変更に強いアプリケーションを作る
        - 設計力
        - アーキテクチャの実装

この目標を立てた背景として、1つ前のインターン（Fringe81）で設計の大切さとアーキテクチャの必要性について痛感したというのもあり、上記のような目標設定にしました。

## インターン内容
### 期間と場所
インターン期間は2週間で、サイバーエージェント本社であるAbemaTowersにて行いました。
遠方の学生には日数分＋2日分の宿泊施設を用意いただきました。渋谷から1駅という近さの場所かつ、朝食バイキング付きで最高の環境で2週間を過ごすことができました。

![f5AHpaHsSKmzDlGHg+sAJQ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/5f29d16f-83d1-cd37-7c65-fb21a694b4a4.jpeg)


期間：2019年8月19日(月) ~ 8月30日(金)

場所：[AbemaTowers 10F](https://www.google.co.jp/maps/place/%E3%82%A2%E3%83%99%E3%83%9E%E3%82%BF%E3%83%AF%E3%83%BC%E3%82%BA/@35.6623901,139.6940133,17z/data=!3m1!4b1!4m5!3m4!1s0x60188d214f5f173d:0x9a229870645f46b4!8m2!3d35.6623858!4d139.696202?hl=ja)

宿泊場所：[ホテルサーブ渋谷](https://www.google.co.jp/maps/place/%E3%83%9B%E3%83%86%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%96%E6%B8%8B%E8%B0%B7/@35.6509844,139.6846485,20.11z/data=!4m15!1m6!3m5!1s0x6018f4a90931fbf5:0x417ef46b6c294e02!2z5rGg5bC75aSn5qmL6aeF!8m2!3d35.6506294!4d139.6845797!3m7!1s0x0:0x6551cc7a9209fd4e!5m2!4m1!1i2!8m2!3d35.6510565!4d139.6848509?hl=ja)

### 事前課題について
CA Tech Dojoは育成型インターンということもあり、インターンまでの期間も各自で成長してくるというミッションが出されました。

事前課題としては、[A Tour of Go](https://go-tour-jp.appspot.com/list)を一周以上やってくるというものでした。
これまでフロントエンドの開発ばかりやってきた私にとってA Tour of Goだけではかなり不安な部分が多かったので、下記の学習も併せてインターンに臨みました。

- [Udemy - 現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発](https://www.udemy.com/go-fintech/)
- [Go言語によるWebアプリケーション開発](https://www.amazon.co.jp/Go%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-Mat-Ryer/dp/4873117526/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1LO8L7F7EQIMP&keywords=go%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8Bweb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA&qid=1569386607&s=gateway&sprefix=Go%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8BWeb%2Caps%2C237&sr=8-1)
- [Goプログラミング実践入門　標準ライブラリでゼロからWebアプリを作る impress top gearシリーズ](https://www.amazon.co.jp/Go%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B-impress-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Sheong-Chang-ebook/dp/B06XKPNVWV/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1LO8L7F7EQIMP&keywords=go%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8Bweb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA&qid=1569386607&s=gateway&sprefix=Go%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8BWeb%2Caps%2C237&sr=8-3)

### TechDojoについて
実は今回開催されたCA Tech Dojoはサイバーエージェント初の試みだったそうで、今回育成型インターンを開催することになった背景などについては新卒採用人事の[ゴッティ](https://twitter.com/masagotty)さんが[note - サイバーエージェント史上初のエンジニア育成型インターン『CA Tech Dojo』のウラガワ](https://note.mu/masagotty/n/na17fd5c8b568#xkCy1)にて超分かりやすく書いて下さっているので是非ご覧ください！

この記事では具体的にインターンでどのようなことをしたのかについて書いていこうと思います。

### 2週間でやったこと
CA Tech Dojo 〜サーバサイドGo編〜 ではGo言語を使ったWebAPIを一人で作れるようになるというのを目標に、各自課題に取り組むというものでした。

ざっくり言うと、まず初めの1週間で与えられた基礎課題に取り組み、基礎課題の実装→現場エンジニアからのレビュー通過が完了した人から各々発展課題を立て、実装するという全体像でした。

最終日にはそれぞれが取り組んだ発展課題と、2週間の成果を発表しました！成果発表を通して一緒に参加した仲間がどのようなことに取り組み、どんな学びがあったかを知ることができ2週間での学びが2倍にも3倍にもなりました。

![スクリーンショット 2019-08-30 15.12.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317034/f3a5f458-9a32-9669-43b7-8ee4d627ab0e.png)



#### 【基礎課題】
- ソーシャルゲーム用APIの作成
    - Go言語 + MySQL
        - 標準パッケージのみを使用して実装
    - Swaggerにて定義されている仕様を実装する
        - ガチャ機能の実装
        - ランキング機能の実装
        - ユーザ管理など

#### 【発展課題】
- [レイヤードアーキテクチャ](https://qiita.com/hmarf/items/7f4d39c48775c205b99b)の実装
    - 変更に強いアプリケーションにしたかった
    - 単体テストを書きたかった
    - MySQL, Redis, ORMなど色々使ってみたかった
    - ちなみに[上記のリンク](https://qiita.com/hmarf/items/7f4d39c48775c205b99b)は一緒にCA Tech Dojoに参加した方が書いた記事です！分かりやすいので是非ご覧ください！
- エラーハンドリング
- パフォーマンスチューニング
    - PProfの導入
    - ベンチマークテストの実装

## インターンの振り返り
### 良かったこと
- 日々の開発で得た新しい学びを一緒に頑張る仲間と共有できた
    - アウトプットすることで学びの相乗効果が得られた
    - 一緒に頑張る仲間がどんな事をして、どんなことで詰まっているのか、またどんな学びがあったのか知ることができた
    - 自分用にカスタマイズされたフィードバックが返ってきた
- Fringe81のインターンで学んだPDCAの回し方を実践できた
- 常に「良くするためには」という意識を持つことができた

### 今後の課題
- アーキテクチャについての知識がほぼゼロ＝作りたいアプリケーションに合わせて適切なアーキテクチャを適用できない
- エラーハンドリングについての知識がない
    - 「どのような時にどのようなエラーを返すか」という視点に加えて、ユーザの行動をどこまで網羅するかという視点も大事にする
- テストコードの実装ができるようになる
- 今回はデプロイ環境等を予め用意して頂きましたが、これを自分で構築できる技術を身に付けたい
    - Docker
    - クラウド
    - Linux etc...
- 事業毎にサーバサイドの違いを理解したい
    - ゲーム事業は更新処理が多い
    - アドテク事業はスピード命 etc...
- Devops系の技術力もつけたい
    - CircleCIなどで自動デプロイ
    - インフラのコード化 etc...

## おわりに 〜CA Tech Dojoの参加を迷われている方へ〜
最後までこの記事を読んでくださいましてありがとうございました。
この記事の結びとして、次回以降のCA Tech Dojoへの参加を検討されている方へ向けた情報を提供しようと思います。

### こんな人にCA Tech Dojoはおすすめです！
- インターン前の準備がしっかりできる人
    - インターン期間中はメンターの方からアドバイスをいただくことが可能ですが、下記のような理由からインターン前にしっかり準備しておく事をオススメします。
        - 現場エンジニア目線でのアドバイスを引き出せるように技術的な内容については調べたら分かるくらいになっておくべき
        - 質問をする時に何が分かっていなくて、どんな事を試したのかなど前提知識を共有できるようにしておいた方がフィードバックがスムーズ
        - インターン期間だけでなく、インターンに向けて頑張る期間も大事な成長の場であるから
- 新しい技術領域に挑戦したい人
- 得意な技術領域をさらに伸ばしたい人
- 2週間フルコミットできる人
    - CA Tech Dojoは自分自身のコードと思いっきり向き合う2週間です。
    - せっかくの成長の機会なので、2週間フルコミットしましょう

### CA Tech Dojo参加までにやっておきたい（準備しておきたい）事
- ある程度自走できる力を身に付けておく
    - CA Tech Dojoの選考では**その人がこれからどれくらい伸びそうか**という点が重視されます。
    - インターン期間でより大きな成長を遂げるためにもある程度の自走力は必要です。
- 事前課題だけやれば準備OKは絶対NG！
    - 今回第1回目であったため、2回目以降どのような内容になるかは分かりませんが、事前に出題される課題（今回であれば「A Tour of Go最低1周」）だけやればOKという事はないので注意が必要です！
    - インターン期間中にどのような制作物に取り組むのか、自分がインターン期間中に挑戦したい技術領域は何か整理し、その分野に関する勉強はある程度しておくようにしましょう！
- **[Tech Train](https://techbowl.co.jp/techtrain/)**を使ってレベルアップ
    - 30歳以下のエンジニアを目指す人は無料で受けられるサービスです！
    - 30分間何度でも指名したプロのエンジニアとオンライン通話で質問できます！
    - 学生エンジニアの方は使わない理由がないので、今すぐ[こちら](https://techbowl.co.jp/techtrain/)から登録しましょう！