見出し画像

CA Tech Dojo(Go編)に参加してきた

2021年2月15日(月)~2021年3月05日(金)までの3週間で,サイバーエージェントさんの「CA Tech Dojo 3weeks サーバーサイド向け育成型インターンシップ ONLINE」というインターンに参加してきました!

自分の備忘録・アウトプットの一環として振り返りをしていきます.

自分も参加前に過去の参加者の方のブログを見てかなり参考にさせてもらったので,(今後も同じ形のインターンがあるかは分かりませんが)これから参加する人の参考になれば幸いです...!

CA Tech Dojo とは

CA Tech Dojoとは,株式会社サイバーエージェントさんが開催する育成型のインターンです.  他にも就業型のCA Tech Jobやハッカソン形式のCA Tech Challengeなど様々なインターンがあるようです👀

自分が参加したサーバーサイド(Go編)は,与えられた基礎課題に沿ったAPIを,実際の現場でエンジニアとして活躍するメンターさんからコードレビューして頂いたり,質問しながら実装することで,サーバー構築やデータベースを参照したAPI実装などについて学ぶことができるというものでした.(Androidアプリ(Kotlin編)も時期によってはあるようです👀)

今回は学生の参加者が16名で4人ずつの4チームに分かれて各チーム3名ずつメンターさんが付いてくれる贅沢な構成でした🤤
チームと言ってもチーム開発ではなく,開発自体は個人個人で進めていく形でした.

特典として,優秀者にはプロトスプリントリーグ(CA Tech Challengeの1つ)という別インターンシップにサーバーサイド担当として案内して頂けるとのことでした🔥

画像2

参加した経緯

私は大学3年の終わりごろにプログラミングを始めて,個人開発ではRuby On RailsやGo,アルバイトでPHPやJavaScript, Swiftを触っていました.
ですが,どれも浅く知っているだけの中途半端な状態でした.色々触っていく中でロジックを書くのが好きだなと思い,サーバーサイドのエンジニアになりたいと思うようになったものの,自分のスキルの浅さから胸を張ってサーバーサイドエンジニア志望と言えるようなスキルは持ち合わせていませんでした.

こういった背景で,サーバーサイドのスキルを1から磨きたいと思い,1期生や2期生として参加していた知り合いから参加者のレベルの高さやインターンとしての完成度の高さを聞いていたので,成長の絶好の機会だと思い,12月中旬に参加申し込みをしました.(参加が決まった時は声を出して喜びました🤗)

技術的な参加理由以外には,サイバーエージェントがどういう会社でどんな人がどういう雰囲気で働いているか肌で感じてみたいという会社への興味もありました👀

まとめると,このインターンに参加した目的は,
1.サーバーサイドエンジニア志望と胸を張って言えるようになる(機能実装+αを考えられるようになる)
2. サイバーエージェントという会社がどういう会社なのか(雰囲気とか)を知る
という2つです.

スクリーンショット 2021-03-18 17.42.29

目標設定

この参加目的を達成するために,インターン参加前に技術的な目標と技術以外の目標を設定しました.

技術的な目標
1.質の高いコードを書く
2.パフォーマンスを意識した実装をする

質の高いコードというとかなり抽象的ですが,以下のようなことを意識して実装をしようと考えていました.
・各層の責務を自分の中で明確にする
・他人が見ても分かりやすいコードを書く
・テストコードの実装
これらは個人で開発するとなると,自分は特に疎かになりがちなのですが,チームで開発したり,コードの保守性や品質を担保するためには重要だと思い,特にサーバーサイドエンジニア志望なのにテストコードを書いたことがないのはどう考えてもヤバいなと思い,ここは自分の中でMUSTでした.

また,パフォーマンスにも気を遣って実装をしたいなと思っていて,動くものがローカルでできても,それを本番環境で動かそうとした時に動かなかったり,動いてもユーザビリティ(速度)が悪いと元も子もないですよね...自分は今までまともにパフォーマンスチューニングをしたことがなかったので,実際の現場ではどういう流れでチューニングをしているのか知るとともに,自分も入門したいなと思っていました.

技術以外の目標
1.他の参加者から刺激をもらう
2.CAで働いている人の雰囲気を掴む

技術以外では自分以外の参加者が普段どういうことをやっていて,どういう物を創っているのかなど,交流しながら刺激をもらったり,せっかくCAの社員さんとお話ができる機会なのでどういう風に働いているのか,どういう人がいるのかを知りたいなと思っていました.

スクリーンショット 2021-03-18 17.42.43

事前準備

事前準備は自分が設定した技術的な目標を達成するためになるべく事前にインプットしておこうと思い,以下のことをやりました.

・文法の総復習(ポインタとinterfaceはガッツリ目に)
・redisを触ってみる(キャッシュとして使うため)
・ログ出力してみる(過去の参加者の方がログ出力やSlackへのalertを実装していて「すげえ!」ってなったので興味本位で)
・DDDの本を読んでみる
・自分でモックを作って簡単なテストを書いてみる

後から振り返ってみると,文法の総復習とテスト以外は実際に実装することもなくただの勉強になってしまいました...

ただ,文法の総復習は特にやってよかったなと思っています.
実際にインターンが開始してコードレビューを受けたときに,なぜ構造体はポインタにしてからスライスにした方が良いのか,interfaceってどうやって使うんだっけっていう時に記憶がクリアでした.

その他にやることは各々がこのインターンでどんなことをやりたいかによってインプットするのが個人的には良いと思います😎

スクリーンショット 2021-03-18 17.50.05

3週間でやったこと

基礎課題
前述したように与えられた基礎課題を1週目〜2週目の中盤までで実装しました.この基礎課題が絶妙な課題で,機能実装しかできない自分には非常に学びのある題材でした.トランザクションや排他制御など機能+αで考えることが多々ありました.聞くところによると,前回の2020年8月開催の時よりもパワーアップしているそうです👀

・存在確認は空構造体を使ったマップでやる
・構造体はポインタにしてからスライスにする
・スライスやマップは予め容量が分かっている時は容量指定して初期化する
などなど1人で開発していると中々気が付けないメモリの節約の仕方など,メンターさんからありがたいレビューをたくさん頂きながら基礎課題を進めていきました.

他には,modelにロジックを書かないとなるとFat Handlerになるなと思い,各層の責務を明確にして, 後々テストをしやすくするためにservice層を導入して開発を進めました.

周りの人だと速い人で1週目で基礎課題を終えている人もいましたが,自分にとっては基礎課題の時点で相当な学びがあったので焦らず丁寧に進めていました.

応用課題

2週目の中盤から応用課題に入り,まずはじめに元々目標の1つにしていたテストを実装することにしました.基礎課題の時点でservice層を導入していたため,責務がある程度整理されていてテストが書ける状態でした.

実際に書いてみてテストコードを走らせてみると,handlerで「あ,ここreturnしてないじゃん!」ってところがあったりして,書いた甲斐がありました👀  自分の書いたロジックが期待された通りに動くことを担保するという意味でもテストコードって大事だなぁと思いました.適宜メンターさんにレビューして頂いて,自分は単体テストと統合テスト(E2E)を実装しました.テストについての詳しい内容は別の記事を書こうと思います✍️

目標のもう1つだったパフォーマンスを意識した実装では,基礎課題で実装したある機能のアルゴリズムを線形探索や二分探索に変えてみて実際にベンチマークで計測するなどしてみました.自分は「そりゃあ二分探索の方が速いだろう」と脳死で思っていましたが,実際に測ってみると元々のデータ数120個だと二分探索の方が遅くて,360個で同じくらい,1200個だと1.5倍くらい速くなるという計測結果でした👀  色々なことに共通することかもしれませんが,沢山の方法がある中で実際に検証してみて(トライアンドエラーで)方法を決定するのが大事なんだなと思いました. 『推測するな 計測せよ』

発展課題全体に共通することだと,基礎課題でレビューして頂いたメモリの節約などGoの書き方を意識して丁寧に書くよう意識しました.またPRも大きすぎると自分も修正が大変ですし,レビューしてくださるメンターさんもレビューが大変なので細かい粒度(1機能の1つの層)でPRを送るように意識しました.(多分結構大事)

他の参加者の方が発展課題として取り組んでいたのは以下のような感じだったと思います.
アーキテクチャの導入(レイヤードアーキテクチャ・クリーンアーキテクチャ),Redisでマスターデータを管理,gRPCの導入,zapでログ出力,PrometheusやGrafanaでログの監視とSlackへの通知,GitHub Actionsで自動テスト,Vegetaで負荷計測,パケット解析,wireの導入,アプリケーションをdocker上へ,ORMの導入...etc
発表を聞いていて単純に「すげぇぇぇえ」ってなりました😌

自分としてもRedisでのマスターデータの管理などは目標としていたパフォーマンスの話に繋がるので是非やりたかったのですが,時間が足りなかったです...
細かく丁寧にレビューしてくださり,時には時間(メンタータイム)外もZoomで質問に答えてくださったメンターの方々に大感謝です🙇‍♂️

スクリーンショット 2021-03-08 20.19.45


開発以外のイベント

開発以外にも運営の方が色々な企画をしてくださり,サイバーエージェントについて知る機会や他の参加者と交流する機会がありました.

・学生チームランチ・カフェタイム(チーム内の学生同士の交流会)
・社員×学生チームランチ(チーム内の学生×メンターさんのランチ会)
・シャッフルカフェタイム(チーム外の学生同士の交流会)
・夕会(メンターさんへの1日の進捗報告会)
・メンタータイム(メンターさんへの質問時間)
・金曜面談(メンターさんとの1週間の振り返り面談)
・前回Dojo生LT会
・社員LT会
・中堅社員によるパネルディスカッション
・若手社員によるパネルディスカッション
・懇親会&打ち上げとバーチャル社内見学

運営の方々のおかげでサイバーエージェントについて知る機会が数多くあり,学生内での交流も活発にできたと思います.ありがとうございました🙇‍♂️

学べたことと今後の課題

技術的なこと
技術的な知識がこの3週間でかなり広がったと感じています.同じ時間・同じ期間に同じ題材でチームメンバーやチーム外の参加者の方と取り組めたからこそ,同じ題材ではあっても各々が別の発展課題に取り組んでいて,それを日報や発表で知ることで知見が何倍にも広がりました.

自分が目標としていたテストコードも実装ができましたし,メモリを節約する書き方もすごく身に付いたと思います.パフォーマンスに関する話も実際に自分で計測することが重要なんだと身を持って知ることができました.ただ,Redisでのマスターデータ管理や負荷計測など正直パフォーマンスに関することはやれなかったことが多いので今後のTODOですね...

あと自分が着手できなかったこととして,特にログのファイル出力・監視については,障害対応の際などにも必須で業務で実際にやることなそうなので今後必ず実装したいなと思います.アーキテクチャやgRPCは自分にはまだ早いなとは思いつつ,単純な興味があるので知識として勉強してみたいなと思います✍️

技術以外のこと
今回は開発の題材がゲームAPIだったということもあり,更新処理(ユーザーからの書き込み)が多く,高トラフィックを捌くなどゲーム事業ならではのAPI開発の面白さを理解できました.メディアだと書き込みよりも読み込みが比較的多く,同じ画像や動画でも事業によっては全然扱い方が違うということが分かりました.今後はサービスや会社を見るときにこの事業のサーバーサイドの特性ってなんだろうって少しでも意識して考えられたらなと思います.👀

また,最終面談でメンターさんに言ってもらった「実装が丁寧でコードが綺麗だし,PRも粒度が細かくてレビューする人のことが考えられている」という言葉が個人的にすごく嬉しかったです🤗  自分としても周りがハイスピードで実装進めていって焦る気持ちもある中,丁寧に焦らず綺麗なコードを書こうと意識していましたし,前述したようにPRも1機能の1つの層で出して粒度が細かくなるよう気を遣っていたのでそういう点を見てくださっていたのが嬉しかったです.今回のインターンはあくまで個人開発ですけど,レビュワーがいたりチーム開発だったりする時には非常に重要なことだと思うので今後も大切にしていきたいです!

画像6

最後に

最後になりますが,同じチームメンバー,メンターさん,運営の方々,3週間本当にありがとうございました!🙇‍♂️

自分で言うのもなんですが,自分のチームは特別仲良かったのではないかと思います🤗 開発を開始してから毎日10:30~19:00でDiscordを繋ぎながら開発をして,困ったことは画面共有して相談したり,昼はわざわざZoomに移動してカメラオンで談笑したり,今後も関わっていきたいなと思える最高のメンバーでした!(最終週は朝方まで繋いでましたね🔥)

チームメンバー外の方も優秀で最終発表はレベルの高さに驚きでした👀
もくもく会だったりLT会だったり主体的に企画もしてくれて凄い人ばかりでした...

メンターさんや運営の方々も凄く人が良くて,上手くは言えないですが,きっと仕事が楽しいんだろうなぁと接していて肌で感じました.( というか仕事や会社が好きじゃなかったらあんなに自分たちを気遣ってくださったりバックアップできないはず)ああいう育成のカルチャーは耳にはしていても実際に体感してみないと実感できないことなのですごく良い体験をさせてもらったなと思っています👀  最高の雰囲気でした🔥

技術的なこと以外にも色々な学びがあるインターンで本当に参加して良かったです...!この記事を読んで「このインターン参加したい!」「へ〜そんなことやってたんだ」って思ってくれたり,これから参加する人の参考になれば嬉しいです...!

これからも頑張ります💪🔥


この記事が気に入ったらサポートをしてみませんか?