こんにちは!vjsigsigです(`・ω・´)ゞ
2023年3月13日〜15日 の3日間で『ゼロから学ぶWebプログラミング3daysインターン 〜サーバーとかよくわからないけど、3daysインターンで戦闘システムを作ってたらエンジニアになっていた件〜』を開催しました。
毎年ご好評の5dayサーバーサイドインターンではガチャのプログラムを体験頂きました。
好評につき今回は3日間のインターンを開催し、題材をガチャ機能から一新!RPGの戦闘システムとなりました。
今回の取り組みピックアップ
開発環境はクラウドで構築
- 接続先のホストと秘密鍵を参加者に貸し出す方式としました
- この変更により、Windows側でLinux環境をエミュレートする仕組みを構築する時間を節約する事が出来ました
貸出サーバーとエディタはVSCodeでオールインワン
- SSHクライアントは VSCode の Remote – SSH プラグインを使用しました
- 改めてSSHクライアントを導入する事無く、ターミナル操作とアプリコードの改修を1つのツールで完結させる事が出来ました
実装コードはGitHubのorganizationに招待
- インフィニットループのorganizationにインターン生を招待し、実装コードの相互レビューを行いました
- 冬の1dayインターンシップでは環境構築が目標だったためコードレビューは不要でしたが、今回は戦闘プログラムを用いた業務体験のためインターン生及び講師との相互レビューが必須でした
インターンシップの全体進行
例年のインターンと同様、Slack と Zoom の両ツールを使用した講義形式のハンズオンとなりました。
Slackでは自分専用のチャンネルが存在し、相互に現在進行中の報告及びエラー内容を貼り付けてZoomと組み合わせてヘルプを行うなど、実際のゲーム開発と同様の進行を体験頂きました。
このようにスタンダードな開発スタイルを体験し、自分が就職後会社でどのように過ごすのか。ざっくりとしたイメージが出来たのでは無いかと思います。
サーバー初期構築
初期構築マニュアルをブラウザで参照しながら進めることで、サーバー構築が完成する設計としました。
貸し出したEC2インスタンスに VSCode
で接続し、コマンドラインを駆使して初期構築を進行します。
手順書の内容と講師の補足説明を聞きながら構築する事によりコピペ作業だけではなく、今自分が何を行っているのか把握しながら構築を行うことが出来ました。
構築内容ピックアップ
- timedatectlコマンド を使用したタイムゾーン設定
- UTC -> Asia/Tokyo へ変更
- yumコマンド を使用したパッケージアップデート
- Apache を使ったWebサーバー構築
- アプリ自体はDockerを使用するため、デモンストレーションのみで使用
- ブラウザからページの閲覧を確認次第、デーモンをstop
- amazon-linux-extrasコマンド を使用し、 Docker を導入
- docker-composeプラグイン も併せて導入
- usermodコマンド を使用してユーザーグループ変更
- ログインユーザーをdockerグループに所属する事でdockerコマンド実行に管理者権限を不要とする
- Git の設定
- ユーザー名やメールアドレスなどのグローバル設定
- GitHubと連携するための鍵ペアの生成と紐付け
- 実装コードの導入と初期設定
- GitHubからソースコードのclone
docker-compose
を使用したアプリケーションの立ち上げcomposer
を使用してPHP依存ライブラリを導入
アプリケーション実装: 課題を抜粋して紹介
夏インターンの際に使用したガチャシステムと同様、今回の戦闘システムでもSlim Frameworkを使用しました。
基本的なレイヤ・ディレクトリ設計は完了しており、その設計に沿って課題に沿ったロジックを作っていく形式です。
各種課題に対応するユニットテストをクリアする事を課題のクリアとしました。
数ある課題の中の一部を紹介します!
ダメージ計算処理の実装
- キャラクターが与えるダメージを一定範囲内のランダム値とする。
- 改修前は設定された攻撃力そのものが与えるダメージとしていました。一般的なRPGで多く採用されているダメージブレをこの課題で達成しました。
クリティカル処理の実装
- 一定の確率でキャラクターが与えるダメージを一定割合増加させる。
- ラッキーにより大ダメージを与えられるクリティカル処理の実装を行いました。RPGでもほぼ必須の処理ですね。
敵キャラクターが一定の体力を下回ったら回復する処理の実装
- 毎ターン敵キャラクターが自分のHPを参照し、特定の割合を下回ったら回数制限付きの回復処理をする。
- この実装により回復前に多くのダメージを与えて一気に倒すか、制限回数を枯渇させる持久戦か。など戦略の幅を広げる事が出来ました。
MPを使用する魔法攻撃の実装
- 用意している1種類の魔法攻撃を、通常攻撃より強い攻撃として実装する。
- どういう魔法効果とするか、仕様を考えて実装するという工夫を凝らした課題となりました。
- 確定クリティカル攻撃とするなど。
- 用意していた課題の中盤、そろそろ皆さんPHPに慣れてきた頃で楽しむ余裕が出てきました。
新規キャラクターの追加
- 新規でプレイヤーまたは敵側のキャラクターを追加する。追加するモンスターの性能は各自で決める事とした。
- オリジナルのキャラクター画像を作成された方もいました!
GitHubを利用した相互コードレビュー
実装したコードのレビューは講師からだけではなく、参加者同士でも積極的に行われていました。
実際の現場でも先輩・新人の区別なくコードレビューを行う事が多く、皆さん最初は緊張しながらコメントを投稿していましたが、徐々に慣れてきてお互いの意見を尊重しながらレビューが進行し、現場顔負けのとても良い雰囲気で実装を行うことが出来ました。
成果発表会
最終日はインターン生全員が、 インターンを通して身に付いたこと、苦労したこと、追加したオリジナルの要素紹介、推しVTuberの紹介(!?) のテーマで成果発表を行いました。
皆さんスライドを用いて素晴らしい発表を頂きました!一部抜粋して紹介します。
インターン生が実装したお昼ゴハン紹介
恒例のインターン生お昼ゴハン紹介
たくさんのご飯画像を頂きましたが、全ては紹介できず、抜粋して紹介させて頂きます!
最後に
3日間という短い期間でしたが、課題が一つも終わらない、全くわからず手が出ない。という参加者の方はおらず、最終日には楽しんでコーディング出来ている様子がZoom越しに伝わりました。
このインターンをキッカケにサーバーサイドの楽しさ、プログラミングの楽しさを実感し改めて興味を持って頂き、エンジニアとして会社で働くイメージが体験出来たのでは無いかと思います。
皆さんが今後エンジニアとして活躍するための一助となれた事を講師一同嬉しく思います!
今後もサーバーインターンシップは継続して開催する予定です!次回は8月の夏インターンの開催を予定しています。
今回は参加が出来なかった方は、ぜひとも次回はご応募下さい。
詳細な情報は随時、公式ツイッター にてお知らせします!
☆インフィニットループは一緒にインターンシップを盛り上げてくれるエンジニアを募集しています
採用情報は こちら 。ご応募お待ちしております!