はじめに
先日CyberAgentが主催するGo Collegeというイベントに参加してきました。とても素晴らしいイベントだったので参加を考えている方の参考になればと思い、この記事を書きました。この記事では、Go Collegeの参加体験に加えて、最終課題で取り組んだ内容もあわせて紹介します。
Go Collegeとは
約1ヶ月かけてGo言語の基礎を学習し、最終日程の4日間でアウトプットとして課題の制作を行うインターンです。
- 開催期間:2026/2/14~2026/3/19
- 実施場所:Abema Towers, Zoom
応募理由
もともと、CyberAgentに興味があり、Go言語で自走できる力を身に着けたいと思い応募しました。
面接で聞かれたこと
うろ覚えですがこんなことを質問されました
- 志望理由
- チーム開発経験と自身の役割
- イベントで結成したチームだったのでイベントの概要とチーム構成など深堀り
- チーム開発の経験をこのインターンでどう活かせるか
- 人に影響を与えた経験
- 最後まで諦めなかった経験
- そこから何が得られたか、自身の価値観がどう変わったか
基礎講座
DAY1はオフライン開催でチームやメンターとの顔合わせや環境セットアップ、Go言語の基礎を学びました。他にもチームメンバーやメンターとの交流の時間が設けられていました。
DAY2~DAY5はオンライン開催で以下の内容を学びました。
- DAY2:Docker、フレームワーク(echo, gin)
- DAY3:Database(mysql)、ORM
- DAY4:パフォーマンスチューニング、単体テスト
- DAY5:Redis
オンライン期間中は講義を受けながらチーム内slackで情報共有したり、作業時間に談笑しながら楽しくGoを学ぶことができました。
課題(ゲームAPI作成)
DAY6~DAY9では基礎講座の内容を基に課題の作成に取り組みます。フロントエンドのアプリ、API仕様書、バックエンドのテンプレートが用意されていて、仕様書通りにバックエンドを開発していくという内容でした。
課題には基礎要件と応用要件があり、基礎要件ではゲームを動作させるために最低限必要なAPIの作成、応用要件では学生独自が目標を設定しアーキテクチャ改善、パフォーマンス改善、品質保証などを行いました。
期間中の取り組み
DAY1ではまず各個人で最終発表のときに成し遂げたい目標などを設定します。僕は最終的な目標として以下の内容を設定しました。
- 最終発表にこだわりを持てるようにする
- 毎日Goを触る
これらの目標を達成するための取り組みについて書いていきます。
オンライン期間の過ごし方
まず、1,2を達成するためにチーム内でmini-ecサイトを作ったり学んだことをアウトプットする機会を作れないか相談しました。チームメイト全員が快く受け入れてくれたので毎週1回取り組んだ内容を発表する環境を作ることができました。mini-ecサイトではフロントとAPI仕様書を定義してそれに対してバックエンドを1から作成するという最終課題に近い形で実施しました。また、チーム内だけでなくチーム外の方とも交流したいと考えプチ技術交流会やオフライン期間前の対面での交流会を企画したりしました。
他にも週1でメンターとの面談やメンター以外の社員さんとの面談の機会があり徐々にCyberAgentに対する理解を深めていけたと考えています。
オフライン期間の過ごし方
お昼ご飯はチームメンバーや社員さんと一緒にご飯を食べに行きました。お食事しながら会社のことや就活のことについてお聞きすることができました。他にも稼働が終わった後にチームのみんなと食事に行ったりもしました。とにかくオフライン期間は毎日楽しかったです。
発展課題
カバレッジ指標に感じた課題
以前アウトプット一貫でテストカバレッジをCIに導入する記事を書きました。
そのテストの挙動を確認したとき境界に対してテストを実施していないにも関わらずカバレッジが100%になっていました。
- ランクを返却する関数(
internal/score/score.go)
func GetRank(score int) (Rank, error) {
if score < 0 || score > 100 {
return "", errors.New("invalid score")
}
if score >= 90 {
return RankA, nil
} else if score >= 60 {
return RankB, nil
} else {
return RankC, nil
}
}
- 実施テスト
{name: "rank A", score: 100, expected: RankA},
{name: "rank B", score: 60, expected: RankB},
{name: "rank C", score: 50, expected: RankC},
{name: "invalid score", score: -1, wantErr: true},
- カバレッジ
github.com/Mtsubasa/go-test-coverage/internal/score 0.003s coverage: 100.0% of statements
テストを作るのならば境界値分析を行い境界に対して厳密に値を複数設定してテストを行うべきと感じたので、100%という結果はとても不可解に感じました。そこで、境界に対してテストを実装できているか調べるツールを作ろうと考えました。
境界値分析とは
境界付近で仕様とのずれが発生しやすいので、境界の値を重点的にテストを分析する手法です。先ほどのscore.goの例でいうと-1,0,1,59,60,61,89,90,91,99,100,101がテストケースに含まれているとよいという考えです。
ast構文木との出会い
今回ツールを作るにあたって初めてgo/astというパッケージを知りました。astとはソースコードの構文構造を木構造で表現したものです。今回は以下のツールを利用してコードを作成しました。
テスト解析ツールを作った
おおまかな処理フローを解説します。
1. テストコードからテスト値を拾う
2. 本体コードから境界値を拾う
3. 1と2を照合して足りない条件をレポート
詳しい実装内容は別記事で解説します。実際のツールは以下のリポジトリで確認できます。
完成度
簡単な実装しか検証できませんが境界に対してテストが行われているか検証するツールを作ることができました。
- リポジトリにある動作例
package example
type Rarity string
const (
RaritySSR Rarity = "SSR"
RaritySR Rarity = "SR"
RarityR Rarity = "R"
)
func GetRarity(rate float64) Rarity {
if rate < 0.05 {
return RaritySSR
}
if rate < 0.17 {
return RaritySR
}
return RarityR
}
package example_test
import (
"boundary/example"
"testing"
)
func TestGetRarity(t *testing.T) {
tests := []struct {
name string
rate float64
expected example.Rarity
wantErr bool
}{
{name: "over SSR boundary", rate: 0.04, expected: example.RaritySSR},
//{name: "SR", rate: 0.05, expected: example.RaritySR},
{name: "under SR boundary", rate: 0.06, expected: example.RaritySR},
{name: "SR", rate: 0.16, expected: example.RaritySR},
//{name: "under R boundary", rate: 0.17, expected: example.RarityR},
//{name: "over R boundary", rate: 0.18, expected: example.RarityR},
//{name: "R", rate: 0.99, expected: example.RarityR},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := example.GetRarity(tt.rate)
if got != tt.expected {
t.Errorf("GetRarity(%f) = %v, expected %v", tt.rate, got, tt.expected)
}
})
}
}
go-boundary-checker\example\example.go:15:12: GetRarity: boundary value 0.05 is not tested
go-boundary-checker\example\example.go:18:12: GetRarity: boundary value 0.17 is not tested
go-boundary-checker\example\example.go:18:12: GetRarity: no test value greater than 0.17
インターン振り返り
目標の達成度
- 最終発表にこだわりを持てるようにする:期間中疑問に感じた部分に対してこだわりを持って取り組めたと思います
- 毎日Goを触る:1日だけ触ることはできませんでしたが、Goを自走できるくらいまで上達することができたと思います
最優秀賞をいただけた
インターン期間中の頑張りや最終発表での成果もあり見事Go College内で最優秀賞をいただくことができました!!チームメンバーの1人もベストエンジニアリング賞をいただいていました![]()
![]()
エンジニア仲間ができた
インターン中、積極的にコミュニケーションを取ることを意識して頑張った結果たくさんの方と仲良くなることができました。チームメンバーとコンテストに出る約束をしたり別チームの方とイベントに参加する約束もできました![]()
CyberAgentについて理解が深まった
社員さんとの交流や食事会、面談を通して若手でも挑戦しやすい環境だと感じました。また、今回Go Collegeのメンターの方々は人を育てようとする姿勢が非常に印象的でした。面談のたびに前向きなフィードバックをいただけたのが印象に残っています。そういった人を育てる文化を大事にしている会社だと感じました。
同世代との交流
同年代のエンジニアの考えや技術に対する向き合い方がとても刺激になりました。特に、単純に納得するのではなく、なんでこうなってるんだろうという常に探求心を持って取り組んでいる姿勢が印象に残っています。僕もこれから技術を身に着けていく中でなぜという問いを常に持ち続けたいと思いました。
これからGo Collegeに参加する人にむけて
Go初心者でもOK
僕も実際にインターン先で触ったことがあるくらいで0から書ける状態ではありませんでした。基礎講座や期間中の取り組みで基本的な記述ができるようになりました。
アウトプットする
課題でツールを作ろうという考えに至れたのが、記事を書いたことがきっかけでした。自分で調べて書くうちに理解の助けになるだけでなく、実装の内部に興味が湧くきっかけにもなります。Go Collegeへの参加前でも、参加中でもいいのでアウトプットしてみてください
積極的に動くことの大切さ
テストツール作るにあたって他チームの構文解析に強い方に自分の作りたいツールについて相談してみると、「おもしろい!できると思うよ」と言ってくれたおかげで踏み切ることができました。この方は全体で開催した交流会やプチ技術交流会で仲良くなりました。チーム内の交流も大事ですが、他チームに関わりを広げてみると選択肢が広がると思います。ベストエンジニアリング賞を取ったチームメンバーはメンターにdocsのテンプレートをいただいてそれを基にチーム開発を意識した開発を行っていました。その姿勢が結果にもつながっていたのだと思います。
最後に
最高のイベントでした。Go Collegeに参加できて本当に良かったです。
今回の経験を通じて、疑問に思ったことを形にするおもしろさを改めて実感しました。今回作成したツールも定期的にアップデートしていきたいと考えています。
また、ここまで楽しく充実した経験にできたのはチームメンバーや他チームのメンバー、メンターの方々のおかげです。本当にありがとうございました。