今回KLab Server Side Camp(第3回)に参加させていただいたので、記録としてブログに残しておきたいと思い書いております。
KLab Server Side Campとは
https://klab-hr.snar.jp/jobboard/detail.aspx?id=Or4L6WIHlTIより
KLab Server Side Camp(クラブサーバサイドキャンプ)は、サーバサイド特化型の技術系インターンです。 本イベントの為にオリジナルで自社開発したスマホ向けゲーム(音ゲー)を題材に、そのゲームアプリの中でサーバサイドの技術がどのように使われているかを、講義形式で進めつつ実際に課題にも取り組み手を動かしてもらいながら経験を積むことができるサーバサイド特化型のインターンです。 Python開発経験やGithub使用経験等は応募時に必要なスキルとなりますが、ゲーム開発経験の有無は問いません。 むしろ、今まで研究活動や趣味でPythonを使ってきたけれど、それが企業でどのように活かせるのかまだ想像しきれない学部生や院生の皆さん等にぜひおすすめしたいインターンです。
キャンプの内容
今回の第3回は9月1日〜9月7日の平日5日間でオンライン開催され、次のような内容で進んでいきました。
1日目
午前中は自己紹介から始まり、その後Slackの使い方や開発環境のセットアップを行いました。開発環境のセットアップは音ゲーの起動、リポジトリやGitHub Codespacesのセットアップなどがありました。GitHub CodespacesはGitHubが提供しているリモートエディタです。開発を始めるにあたってPythonやその他パッケージ、MySQLなどを用意する必要がありますが、Codespacesには開発環境もついてくるので以下のリンク先のように.devcontainer/
以下を作成するとCodespacesを立ち上げるだけで環境も構築されます。
今回.devcontainer/
を事前に用意してくださっていたので、開発環境の構築はとても容易に完了することが出来ました。
https://github.com/matac42/gameserver/tree/main/.devcontainer
午後は講義で、データベース(SQL文の書き方)PythonでSQLを実行するためのSQLAlchemy ORMについて勉強をしました。講義の各項目の最後には実習を行い実際にSQLを実行したり、Pythonでモデルの実装を書いてみたりしました。
今回SQLAlchemyでは、ORMの機能を使用するのではなく、以下のコードのようにSQLをそのまま書く形で実装していきました。私が今まで使用したことがあるフレームワークにRuby on Railsが挙げられますが、そこではSQLをそのまま書くことは少なかったため今回のSQLをそのまま書く実装はとても勉強になりました。
result = conn.execute(
text(
"SELECT `is_host` FROM `room_member` \
WHERE `room_id`=:room_id AND `user_id`=:user_id"
),
dict(room_id=room_id, user_id=user_id),
)
2日目
この日は1日中講義と実習で、FastAPIとpydanticによるスキーマの記述を勉強しました。 ここまででデータベースの作成からFastAPIによるAPIの基本的な作り方を学び、ここから実際に音ゲーで使用するAPIの作成に進んでいきました。作成したのは以下のように音ゲーのマルチプレイに必要なAPIで、5日目の午前中には完成することを目指してコーディングしていきました。
- /room/create — 部屋の作成
- /room/list — 部屋の一覧
- /room/join — 入室
- /room/wait — 待ち
- /room/start — ゲーム開始
- /room/end — 結果をサーバーに送信する
- /room/result — 結果を表示する
- /room/leave — 途中退出する
私は普段からPythonでWEBアプリケーションを作成している訳ではないので、この日はコードをどんどん書いていくというよりもSQLAlchemy、pydanticの使い方を手探りで勉強することがメインになりました。つまずいた時にはSlackで質問するとすぐにメンターさんからの返信が来る体制になっており、他の参加者さんの質問とそれに対する返信も見ることが出来たのでとても助かりました。
3日目
この日はデータベースのインデックスやトランザクションについての講義を受け、その後コーディングの続きをする形でした。
4日目
この日もコーディングの続きをしましたが、おおよそすべてのAPIがとりあえず動くところまで実装できていました。そのため実際に音ゲーと繋いでみて、複数人でアクセスし実際にマルチプレイができるかどうか確かめることをしました。Slackに# play
チャンネルが用意されていて、そこに参加者同士が集まってみんなでhuddleでわいわいする感じでデバッグプレイをする形でした。このようにみんなでわいわいマルチプレイのデバッグをする体験はしたことがなかったのでとても楽しかったです。
私の場合デバッグでルームの検索がうまくいかなかったり、ルームが削除されず増え続けるバグが見つかりその後修正作業を行いました。一人でプレイして確かめた時とは違ったバグが見つかり、実際のプレイに近い形でデバッグを行うのは大事だなぁとかリリースして大量のアクセスがあったらまた違うバグが出てくるんだろうなぁみたいなことを考えたりしました。
5日目
この日の午前中はコーディングをする最後の機会で、PRにもらったコメントの部分や、リファクタリング、手をつけていなかったindexやトランザクション、ロックの処理を書いてみるなどしていました。私の場合はロックの処理を最後まで書ききることはできませんでしたが、それはキャンプ終了後の課題としました。しかしながら、この時点でマルチプレイにより見つけたバグは修正済みでAPIの動作自体は完成していたので目標は達成したかなという感じでした。
午後は成果発表会があり、参加者それぞれが取り組んだ内容を5分程度で発表しました。その際、それぞれメンターの方からレビューを頂きました。コードの良い点や改善点を指摘していただいたのですが、自分のレビューだけでなく他の参加者さんへのレビューも含めて、今後の自分の課題につながるとても参考になるものでした。
全課程終了後、懇親会がありメンターの方々への質問や雑談などをしました。普段の業務、開発の話を聞くことが出来ました。また、今回使用した音ゲーに関する話やネットワークスイッチの話まですることが出来ました。まさかサーバーサイドキャンプで物理インフラの話までできるとは思っていませんでした。フロントエンド、バックエンド、インフラにわたる広い範囲で雑談が行われた楽しい懇親会でした。
本キャンプで得られたもの
本キャンプでは自分の今後の課題
をたくさん得ることが出来ました。ざっと並べると以下のような感じです。(メモを貼り付けただけなので雑です)
- コード分離の仕方
- コメントの書き方
- テストを書こう
- SQLのインデント デデント…?
- インデックスをもう少し貼る
- 見れるルーム一覧を制限する(これ以上見せてもしょうがないよね…?みたいな視点)
- コミットの統計を見るの面白い
- docstring swaggerUIのコメントを活用する
- 大規模になるとどうなるか考える
- コーディング時のこだわりポイント
- デバッグの時にmysqlでshowするのをMakefileで(デバッグのサイクルを高めるための工夫)
- N+1の観点
- join inc?を使ってみる
- +αの目標(参加者さんでこれを持って取り組んでいる人が多かった)
- かっこいい個人用スライド作りたい
- ゴミ掃除のバッチ処理
- リザルトへの強制遷移
- 論理削除、物理削除に関する考察
- 淡々としたコード
- 古いレコードを参照してしまうのを再現してみたい
普段は情報システムの管理に傾倒している自分ですが、上記はそれに当てはめることができるものも多いです。一つずつ取り組んでいきたいと思います。
また、今回社員さんや参加者さんにはいろいろな方がいて、その方達とのつながりを得ることが出来て本当によかったと思います。今回関わりのあった皆様、ありがとうございました!
告知
このキャンプで得られるものはたくさんあると思います。WEB開発に興味がある方は参加することをおすすめします!以下は次回のキャンプの告知です。
<ウィンターインターン、エントリー受付中>
■「KLab Server Side Camp」(第4回)
https://klab-hr.snar.jp/jobboard/detail.aspx?id=MxhYoTHEWuM
日程:12/26(月)・27(火)・28(水)・1/5(木)・6(金)※平日5日間
第1次応募締切:10/3(月)23:59まで
- オリジナルの音ゲーを題材とした「サーバサイド」開発体験インターン
- メンターは自社エンジニアのPyhtnonコアコミッターが務めます
#KLabServerSideCamp
#サーバサイドキャンプ
成果物
最後に今回使用したリポジトリと成果発表のスライドを載せておきます。