KLab Server Side Camp 第2回 に参加してきました。
初投稿です。
はじめに
タイトルにあるとおり、KLab株式会社さんが開催する KLab Server Side Camp 第2回 (3/10~3/16)に参加してきました。いい機会だと思ったのでこれを題材に記事[1]を書いてみます。
KLab株式会社とは
主にスマートフォン用ゲームを配信されている企業です。最近はスマホゲーム以外にも、PCゲームやコンシューマゲーム開発も行っているようです。
漫画やアニメをゲームにして配信していますね。KLab Server Side Campとは
KLab Server Side Camp(クラブサーバサイドキャンプ)は、サーバサイド特化型の技術系インターンです。
本イベントの為にオリジナルで自社開発したスマホ向けゲーム(音ゲー)を題材に、そのゲームアプリの中でサーバサイドの技術がどのように使われているかを、講義形式で進めつつ実際に課題にも取り組み手を動かしてもらいながら経験を積むことができるサーバサイド特化型のインターンです。
Python開発経験やGithub使用経験等は応募時に必要なスキルとなりますが、ゲーム開発経験の有無は問いません。
むしろ、今まで研究活動や趣味でPythonを使ってきたけれど、それが企業でどのように活かせるのかまだ想像しきれない学部生や院生の皆さん等にぜひおすすめしたいインターンです。
※尚、今回の為にオリジナルで開発したスマホ向けゲーム(音ゲー)は、社内のエンジニアさんはもちろん
クリエイティブ職の皆さんに、イラスト、UI、アートディレクション等をお願いして制作したものです。
参加される方にはぜひゲームそのものも楽しんでもらえればと思います!
公式のページから引用。
一言で表すなら、"バックエンドについての講義を受け、その知識を使って配布される音ゲーのAPIを実装しよう。"というインターンです。
インターンに参加した経緯
2022冬(春?)のインターンを"魔法のスプレッドシート"で探してたら、このインターンを見つけました。自分が中学生の時にKLabの音ゲー[2]をしていたことを思い出し、懐かしく思いながら内容や要件を眺めていると、自分はバックエンドの開発経験はほぼなかったのですが、要件は満たしていることに気づき、とりあえずエントリーしちゃえ!といった感じで申し込みました。
それから、ES・面接を経て選考に通りました。(1社しかインターン申し込んでなかったから参加できてよかった...)
インターンの内容
0日目
インターンが始まる前日に運営さんからプレゼントが届きました。
各参加者に対して特別に作られたネームプレートをいただきました。デザインが良い!!
食べきれない量のお菓子を見るのは幸せですね。
1日目
そんなこんなでインターン初日を迎えます。
10:30~ということもあり余裕の起床チャレンジ成功。
午前中はゆる〜く自己紹介をしてから、環境構築に入りました。このインターンでは CodeSpaces を利用して開発を行うのでそのセッティングを行います。
CodeSpacesというのは、GitHubが提供しているVisual Studio Code環境です。
- ブラウザからでも、ローカルのVSCodeからでも利用できる。
- クラウド上の仮想環境で動いていて、各種パッケージ等を主導でインストールする必要がない。
- クラウドVMのコア数を選べる。
といった特徴があります。
KLab Server Side Campでは参加者間のOSの差異等を吸収することを1つの目的にCodeSpacesを採用しているようです。
そして、主役となる音ゲーの体験タイム!
圧倒的クオリティよ...。(インターンそっちのけでフルコン目指したいところでしたが、ぎりぎり踏みとどまりました。)
ここで、一度お昼休憩を挟みます。
初日に限った話ではないですが、適宜休憩時間を確保してくださったのがありがたかったですねー。
休憩後はSQLやSQLAlchemyCoreに関する講義を受け、実習を行いました。
実習は、IPythonやmysqlといったインラクティブシェルを利用するので初めてSQLに触れる人も取り組みやすいようになっています。
私は、SQLの文法は既に学んでいたのですが、実際に書いてみようとすると手が止まったり、文法ミスでうまく実行されなかったりしたので、やはり頭だけで理解するのではなく手を動かすのは大切だなと感じました。
2日目~3日目
2日目からはいよいよ本題のRoom API開発に入ります。
上で紹介した音ゲーは、配布された段階では1人でプレイする機能しか実装されていません。そこで、マルチプレイができるようにAPIを実装しよう。というのが本インターンの課題となってきます。
例えば、下の画像で"ルーム検索"というボタンを押すと、他のユーザがマルチプレイ用に立てた部屋の一覧が画面に表示される仕組みとなっていますが、ここの処理を自分で書こうというわけです。
インターン生はAPIの機能内容や要件定義を参照しながら、およそ10個ほどのAPI実装を行います。
機能については最低限の説明しかなく、要件定義もリクエストとレスポンスの内容および型、加えて備考程度の情報しか与えられないので、初めはとっかかりに苦労しました。しかし、既に実装されていたAPIを参考にしながら、ああでもないこうでもないとトライアンドエラーを繰り返すうちにだんだんと慣れていき、3日目終了時には一通り実装を終えることができました。
ちなみにAPI構築はFastAPIというWebフレームワークを利用しています。
また、Pydanticというライブラリが統合されているので、データのバリデーションとシリアライゼーションが可能といった強みがあります。"Pythonは動的型付けだから悪だ!!"といった主張を散見しますが、Pydanticのようなライブラリを使えば型に厳しいコードを書けることを知りました。
さらに/docs
にアクセスすることでSwagger UIが利用できます。Swagger UIはAPIの仕様がまとまったドキュメントをHTMLベースで返し、Webページで見やすくしてくれるツールです。しかも、ブラウザ上からAPIを叩くこともできます。これが非常に便利だった...テストはほとんどSwagger UIで完結させれましたね。
また、APIの実装と並行でDBのスキーマも自分で考えて組み立てる必要がでてきます。
私は、ゲームをプレイするユーザが立てた部屋の管理と、各部屋に参加するユーザの管理を行うテーブルの設計に加えて、データベースの正規化に取り組みました。正規化は冗長性が減るしメリットしかないだろー。と半ば脳死で行ったのですが、後に控える最終日のフィードバックで自分の考えの浅さを思い知ることとなります。
4日目
4日目はエラーハンドリングとリファクタリングを行ったあとに、開発したAPIを使って他の参加者さんと一緒にマルチプレイのテストをしていました。Slackにマルチプレイ専用のチャンネルが作られていたので、チャンネル内でコミュニケーションをとりながらお互いのサーバーを行き来していた感じです。ぶっちゃけ、この時間が一番楽しかった!! 一人で黙々と行う作業もいいですが、やっぱり誰かと一緒に課題を解決するためにわちゃわちゃやる時間は最高ですね。
中には、運営が意図していないバグを見つけて、さらに爆速でその対策まで実装してしまう強者もいました。(ほんとすげー。)
5日目
最終日です。
夕方から成果発表があるのでそれまでは発表のためのスライドを作っていました。
そして、最後の締めくくりとなる成果発表。
なんと、メインメンターの方から自分の書いたコードに対するフィードバックをいただけました。こんな機会はなかなかないと思い、全集中で聞かせてもらいました。(古い)
DBの正規化についてコメントを頂いたのですが、正規化は冗長性がなくなるといったメリットがある反面、データを参照する際にテーブルの結合処理の数が多くなってパフォーマンスが落ちるといったデメリットもあるそうです。今回の案件であれば、テーブルの更新クエリより参照クエリのほうが多かったので、無理に正規化する必要はなかったなと感じました。
成果物
まとめ
文章にまとめるということを久しくしていなかったので、ここまで書き上げるのに1日以上要してしまいました...(文才の無さも痛感。)
記事にすることで改めてインターンを振り返ると、非常に充実した5日間だったなと感じます。
技術的な知見が深まるだけでなく、コロナ禍でのリモートワークの様子など働き方についても色々知れるのはインターンシップならではの良さですね。
働き方といえば...
朝礼や懇親会ではメンターさんはカメラをONにしてミーティングに出席されていたのですが、そのカメラに家で飼われているペットが映ってるのを見て、自分も将来犬か猫を膝に乗せながら働くぞ。と謎の決意を固めました。
最後に
この記事を見て KLab Server Side Camp に興味を持ってくださったそこのあなた!
なんと、2022年の夏に同内容で第3回が開催されます!
詳細は以下のKLab技術広報アカウントのツイートから見れます。気になった方は是非エントリーを検討してみてください!
ちなみに、実際に参加した身からの意見としては、
- Git, GitHubが使える
- Pythonでのコーディング経験(Webアプリケーション開発に限らない)
- DBの基本的な理解
- 開発意欲 (←これが一番大事)
この4点を持ち合わせていれば、学びある充実したインターンにできると思います。
参加するかどうか迷うくらいなら、思い切って申し込んでみるのがいいかと!
Discussion