インターン記

CyberAgentの育成型インターン「TechDojo Go編」に参加してきました!

どうも、21卒文系エンジニアのmani(@mani_transm)です。

6月からインターンの選考やらで忙しく全く更新できてなかったのですが、つい先日CyberAgentのTech Dojo サーバーサイドGo編という育成型インターンに参加してきました。

というわけで今回はその参加レポートを書いて行きたいと思います!

 

CA TechDojo Go編に参加するまで

6月ごろから21卒向けのサマーインターンの選考が本格化して、僕自身も

mani
mani
おっしゃこの夏インターン行きまくるぞい

と息巻いていたのですが、僕が狙っていたiOS開発のインターンがほとんど3~4週間以上で、夏休みの期間的に2社以上の参加ができない状況でした。

また選考も最終面接まで残って落ちることが多く、明らかにキープされてるのが分かるくらい選考スピードが遅かったということも相まって、一番最初に参加確定を頂けた今回のインターンに参加することになりました。

ちなみに面接が終わって開口一番「合格です」と言われてビビりましたw

サーバーサイドのインターンに参加した理由

上でも書いてますが、僕自身この夏のサマーインターンはiOS開発の就業型インターンに参加するつもりでいました。

それなのになぜiOSではなくサーバーサイドのインターンに参加することにしたのか?についてですが、単純に技術領域を広げるためです。

僕自身Swiftでのネイティブアプリ開発をメインにやってきたんですが、サーバーサイドの本格的な開発経験や知識がないというのは、たとえクライアントサイドであっても致命的だということを痛感していました。

やっぱりサーバーサイドには、大部分のビジネスロジックが集約されている=クライアントサイドの「土台」になるものなので、それを分からないままクライアントサイドを開発するというのは「中の仕組みを知らないままガワだけ作る」ということになり、そのレベルではあまり良い開発はできません。

mani
mani
実際にRequest.HeaderとRequest.Bodyの違いがよく分かってませんでした(白目)

そんなこともあって、今回サマーインターンを探す中で、iOSの就業型も狙いつつサーバーサイドのインターンにもエントリーし、この「CA TechDojo」に参加させて頂けることになりました。

 

インターン期間中にやったこと

今回のインターンの内容は「GoでゲームAPIを作る」というもの。

「ソシャゲでの運用を想定した基本的なAPIを作り、認証周りの強化やNoSQL、DB処理や負荷対策など、高パフォーマンスを維持するための施策を導入していく」という実践的な内容でした。

ちなみにWeb APIではなくゲームAPIというのがミソで、WebAPIはデータの読み込みが中心で書き込みが少ないのに対し、ゲームAPIはDBの読み込みも書き込みも大量にリクエストが飛んでくるため、それを高速かつ安定して処理しなければならないという点でゲームAPIを作るという内容にしたそうな。

結果的にこれのお陰で深い部分までサーバーサイドの知識を覗けたので、この点凄く良かったですね。

1週目… GoでゲームAPIを作る

1週目はゲームAPIの基本的な機能を実装してました。

詳細は書けない(お約束)のでフワッと説明すると、「与えられたAPIの設計書を見て、要求された機能を実装する」ということをやってました。

go runすればローカルサーバーを立てられる程度のAPIが既に土台として用意されていて、それに各自で設計書の機能を実装していくという感じで、実装だけを考えればAPIの数も少なかったのですぐ終わるようなものでしたが、後々ソシャゲAPIとしての運用を考慮した設計へのリファクタリングや機能追加を考えると、脳筋でコードは書けなかったですね。そもそも脳筋で書いたらダメだけど

mani
mani
特に複数行に渡るDBへのデータ挿入は、単純にInsertをfor文で回すと遅いことは明白だったので、最初からBulk Insertで処理するようにしてました。

2週目… CleanArchitecture導入したり認証周り強化したり


参考:クリーンアーキテクチャ(The Clean Architecture翻訳)

2週目からはクリーンアーキテクチャの導入hmac認証によるメッセージ認証機能の追加などを行いました。

実際はインターン開始後3~4日程度で基本課題のAPI実装は終わっていたのですが、クリーンアーキテクチャの理解に手こずり、土日もホテルに引きこもってリファクタリングしてました(爆)

応用課題の最初にクリーンアーキテクチャを導入した理由としては、

  • APIの全体的な設計を理解できる
  • 後の機能追加が楽になる
  • DBの変更やフレームワークの導入が楽になる
  • iOS開発にも共通している(私情)

というのが主な理由。

実際にクリーンアーキテクチャを導入した後、ORMapperとしてGormを導入しましたが、めちゃめちゃ導入が楽で感動しました。

Infrastructure層で定義しているDBの振る舞いをGorm仕様に変更してやるだけで、内部のUsecase層で定義しているビジネスロジックをいじる必要が全くないと理解できた時は「クリーンアーキテクチャすげええええええ」ってなりました。

iOS開発のデザインパターンでもクリーンアーキテクチャが使われることがあるので、今回クリーンアーキテクチャの設計方法と恩恵を肌で感じ取れたのは本当にデカいなと思います。

最終的な成果

最終的には今回のインターンで以下のことをやりました。

  • クリーンアーキテクチャの導入
  • hmac/sha256によるメッセージ改竄検出機能
  • GormでのORマッピング
  • ID+Passwordの基本認証追加
  • xerrorsパッケージでのエラーハンドリング

などなど。細かいものは割愛してますが、大体上5つです。

また、成果発表用に今回作ったAPIのクライアントサイドとしてサンプルのiOSアプリを簡単に作ったりもしました。

クライアントサイドまで作ってるインターン生は僕以外いなかったので、最後の表彰で何かしら受賞はするだろうと思っていましたが、結果受賞ならず…。(表彰の選考は技術力だけでなく成長度合いや周囲を巻き込んで取り組む姿勢なども見ていたようでした)

しかしメンターさんとの最終面談や懇親会で聞いてみると、「技術力は満場一致で1位」という評価をして頂けていたようです!

mani
mani
周りが情報系&高学歴が並ぶ中でそういった評価をして頂けたのは、文系&地方私大で技術力で勝負するしかない自分にとっては最高に嬉しかったですね…!

 

育成型インターンに参加してみた感想

正直なところ参加前は「就業型インターンにも参加して実務的な経験を積みたかったなぁ」と思っていました(爆)

が、想像以上に得たものが多く就業型インターン以上に成長させてもらったなと思っています。

特に今回の「Tech Dojo」は、育成型インターンとはいえ講義形式ではなく「与えられた課題に対してどう解決するか」という課題解決的な形式だったので、

解決策をググったり自分で考えた上で、施策が有効かどうかをメンターさんに聞いて意見を擦り合わせながら開発していく」というやり方が取れたのが就業型と同等に成長できた理由かなと思います。

いわゆる自走する力というやつですね。

mani
mani
「環境は与えてやるけどその中で成長できるかはお前の行動次第だよ」と言われてるのを雰囲気で感じ取ってました(笑)

実際にクリーンアーキテクチャの導入は、自分でQiitaの記事やGitHubに上がってるサンプルアプリを読み込みながら実装していて、メンターさんには具体的に「クリーンアーキテクチャのここ教えてください」というような質問は一切しなかったです。

答えは全部記事に書いてありましたし、わからないまま聞いても混乱を招くだけだと思っていたので。

最終的にはメンターさんにコードレビューを送った時、「綺麗にクリーンアーキテクチャ実装できてて良いと思います!」とお褒めの言葉を頂くことができました!

さらに別の方からは「逆に教えてください!」とまで評価して頂けたので、自走する力は今回のインターンではっきりと身についたなと思います。

 

まとめ

というわけで長々と書きましたが、今回のインターンは圧倒的に成長できたし多くのものを学ばせてもらった、満足な2週間でした。

今回TechDojoの運営に関わってくださった人事・社員の方々・同期のみんな、2週間お世話になりました!本当にありがとうございました!
PS. CATechJOBめっちゃ行きたいので頑張ります

 

おまけ

インターン期間中の食事は朝はホテル、昼はお弁当だったりランチだったりで2食負担していただきました。

有給インターンではないので当然お給料はありませんでしたが、2食負担+宿泊・交通費負担は非常にありがたかったです。

人事・社員の方とランチ