2022年度夏季オンラインインターンシップ

Posted by Naoki Kanyama on September 15, 2022 · 3 mins read

NaClの完山です。 昨年に引き続き、今年のインターンシップもオンライン開催でした。 2回目のオンライン開催ということで、 オンラインの利点と欠点が見えてきたインターンとなりました。

インターンシップ概要

昨年のインターンやRuby合宿で好評なので、今年もシューティングゲーム作成で実施する運びとなりました。 今回は当初想定していた人数から減ったため、特別にNaClの新人社員2名を加えた3チームで実施しました。

  • 参加人数: 6名 + 2名(NaCl社員)
  • 日数: 5日間
  • 内容: シューティングゲーム作成

以下のスケジュールで開催しました。

  • 1日目: 顔合わせ、簡単な説明、制作作業
  • 2日目: 制作作業
  • 3日目: まつもとさんとの対談、制作作業
  • 4日目: 制作作業
  • 5日目: 制作作業、発表会、懇親会

また今回のインターンシップも去年に倣ってdiscordを利用して開催しました。 開発の現場でも用いられるこちらのゲーム開発用のチャットですが、やはりboostをしないと通信制限などから画面共有やカメラ機能が十全に使えない事が多々ありました。 今後は要検討かなと思います。

1日目

今年はインドの学生さん2名と島根大学への留学生さん1名、島根大学の学生さん1名、松江高専の学生さん2名の 計6名の方々にご参加頂きました。
6名ということで、1チームでやるか2チームでやるか悩みましたが、ボイスチャット上で活発的な意見交換をするには5名より多い場合は難しいと判断し、2チームに分けることとしました。
加えて、NaClの若手エンジニアが2名参加できる運びとなりましたので、インターンのいい刺激になってくれればとNaClチームを混ぜての3チーム体制でインターンを進めることとなりました。

今回はインドの学生さんにご参加して頂きました。言語の壁が出来てしまうということで昨年に引き続き、松江市国際交流員のAarti Daasさん(通称ソラちゃん)にご参加いただきました。
私が英語が上手く話せないので、Aartiさんには大変お世話になりました。ありがとうございました。

さて、さっそく1日目の内容に入ります。
去年の経験を岸野さんに 2021年夏季オンラインインターンシップでまとめて頂いてますので、それを参考にまずはgithubやサンプルプログラムの簡単な説明から入ることにしました。
最初に、今のご時世ではオフでの交流会などは難しいので、顔合わせの場所(皆さんのことを知れる場所)があった方が良いということで、皆さんに質問したい内容を書いてもらってランダムで選んだそれを自己紹介してもらうというサイコロ自己紹介をアイスブレイクにしました。
ボイスチャットでは発言が混線してしまうので、テキストチャットでその盛り上がりを魅せました。

ice_break_img

voice_chat_img


その後、全員でサンプルコードが動き、DxRubyの使い方を覚えて頂くために、簡単な講義をしました。
皆さん呑み込みが早く、スムーズな滑り出しを決めれたと思います。

今回難点だったのは、やはりDiscordのユーザ数が増えたためか思った以上に動画が不安定だったことですね。
自己紹介の際も顔出しが出来ず声だけだったのは少し残念です。

gitに関しては各班にgithub proに課金している人が最低1人という異常な光景だったために、なにもすることがなかったですね…。(私も最近は良くgithubのお世話になっているので早く課金しなくては…。bitbucketは使わなくなって久しいです。)
さて、今回のインターンではNaCl瀬崎さんの発案で1日を振り返っての報告会と1日の初めに作業計画の発表を行っていただく機会を設けてみました。
これで各班もどういう風に進めてどれくらいの進捗を出しているのかをお互いに見せあう機会ができてよかったと思います。
私のやり方が良くなかったですが、ここで課題として、せっかくの交流の機会なので、話し合いを活発にできる環境づくりが必要になります。
質疑応答会になってしまって、一方通行で少し面白くなかったかなと思います。

オンラインの強みを生かして、多面的な展開(同時視聴)やアーカイブ化を進めていければ、考察が広がって面白そうですね。(余談ですが)

一日目から、かなり順調に進みました。
最後に、気になるチーム分けですが、

  • チーム1
  • インドの方2名 + 留学生
  • チーム2
  • 島大生1名 + 高専生2名
  • チーム3
  • NaCl若手2名 でした。

2日目

さて、2日目に入ります。
この日になると各班、特色が強く出ました。

まずチーム1ですが、この班は多くのサービスを使って製品開発をするレベルでの実装をし始めました。
Notionで仕様決定とタスク分解、各種仕様やデザインについてのフィードバックを書き出して進めていました。
デザインはFigmaで設計していました。
このチームは、プロレベルで開発できるインドの方2名とIT分野は初心者な留学生の構成でしたが、結果として、 インドの方が留学生の方にプログラミングや開発の仕方を教えながら進めるとともにお互いの意見を尊重しているという感じで、疑似的に職場体験をしているようなチームでした。
言語の壁は顕著で、Aartiさんにサポートに入って頂いたり、テキストチャットをベースに話しながら、記録を残しつつ学習していく形でした。
私もNaClのトアさんと仕事をしますが、トアさんは日本語がベテランなので、今まで言語の壁を仕事中に感じたことがありませんでした。
言語の壁がある開発現場などがあった場合はこういった形になるのか。と私自身がすごく勉強になるチームでした。ちなみに、インドの方々はgithubはproユーザでした。(課金しなくては…。)

次にチーム2です。チーム1ほど顕著ではなく、平均的ではありますが、優秀な人たちの集まりという印象です。
皆さんフレンドリーにボイスチャットで話しながら進めていく形で、この日はconflict問題にぶつかっていました。
その結果、作業方針を変えて、マップを分けての開発を行おうという話になったようです。
そうすれば、それぞれのマップでその人の特徴が出る上に、別ファイルでの開発なので、共用ライブラリ以外の編集で衝突は起きず、開発時間を短縮できるというナイスアイディアでした。
今回は残念ながら5日間しか取れないので、時間削減して如何にいいものを作るかという発想に至れるのはとても勉強になります。 conflictを効率的に解消するためにbranchを分け、PullRequestを作成してもレビューに時間はかかり、conflict修正に時間はかかるものです。それを機能の品質を担保しつつ、時間短縮する方法に気づいているのはとてもいい学びだと思います。
そして驚いたのが、複数人で画面共有しながら、コーディングを進めていたところでしょうか。全員が同じような修正をするところがあり、共有で使うライブラリの開発がありますが、その段階で、ペアプログラミングをするのは効率的だと思いました。
仕様も人によって欲しい機能は変わりますし、無駄に悩んで、時間を使うことは減ります。
そして、発言が活発になれば、全員にとっていい刺激になります。
こういったことを自発的に行えるのは優秀なチームだと思います。

そして我らがチーム3ですが、
NaCl 石原さんはDxRubyで数々ゲームを作成されてるので、お手の物といった形でした。
NaCl 鈴木さんと協力して、かわいいゲームを作っている形です。
こちらから具体的なお願いをし損ねてしまって申し訳なかったですが、お手本になって頂きたいという発言から、意図をくみ取って頂き、Team3用のチャンネルで活発的に進捗を報告いただいてました。
Githubを使ったIssueで管理するなどを実際に見てもらいながら他の班にマネできるようにということで、分かりやすく進めてもらえたと思います。

こうして恐ろしく順調に2日目が終了しました。
私の出番はいつ来るのだろうか…。というほどの優秀さでした。

3日目

さあ折り返しとなりまして、3日目に突入しました。
各班2日間でかなり順調に進んでおり、木曜日には完成出来そうという感じが見て取れました。 各チーム追加要素を実装計画に入れてきた感じです。

この日は Rubyの生みの親 まつもとゆきひろ氏(通称 Matz) による質問会がビックイベントです。
去年はコードを見てもらったのがとても好評だったとのことで、今回もそういう感じかなと想定でしたが、
今年は質問の質と数がとても良く、時間いっぱい(少しオーバーしながらも) Matzのお話をしっかり聞ける回でした。
コードを見てもらうよりもMatzのことをたくさん知れるとても良い会だったと私は思います。
特にインドの方々は質問を複数回されるほど楽しみにされていたようで、良い会になって何よりでした。
私の「ディスプレイは何枚がベストですか」というしょうもない質問で時間を使ったのが申し訳ないです。
個人的に質問の中で面白かったと思ったのは、
「Crystalについてどう思うか」と「今までで一番大変だったこと」です。
今まで一番大変だったことという質問は一見して普通の質問ですが、だからこそ回答が興味深い内容となったのではないかなと思います。
先日TwitterでRuby会議の時の質問で一番嬉しかったことを質問したら子供が生まれた時と答えていたというものを見ましたが、定番の質問に対する回答は結構面白いのかもしれないなと思いました。
結構面白質問が多くて、もっと時間を取りたかったなと思いましたが、インターン参加した方々にはぜひRuby会議やRWC等に参加してもらえればありがたいです。

長くなりましたが、Discordは調子が悪いので、GoogleMeetで行ったMatz質問会の写真です。

matz1_img

matz2_img

4日目

さて、舞台も大詰めです。
5日目は午後から発表会となるので、一日は資料作りと発表会となることでしょう。
実質、最後の実装日となります。開発計画は3日目の時点で大体出来る感じが見えていたので、 とても順調に、後は追加機能の実装がメインといった感じでした。

この日は特にもくもく会をしている感じはありましたが、午後からチーム2に動きが見られまして、 ゲーム名やゲームの遷移画面、音楽について話し合っていたのでしょう。活発的な議論が見られました。

この日は特に質問に答えるタイミングがなかったですね。

5日目

最終発表日となりました。
Team1, Team2, Team3 それぞれが5日間で作り上げた(とは思えない)ハイクオリティなものを見せて頂きました。
Team1は何でも全て自作の絵・音楽・ストーリーらしく、3キャラ、3タンクから選択可能で、2種類のゲームを楽しめるようになっていました。正直、インディーズゲームとして出しても良いレベルです。
DxRubyでwavを流すと途中でゲームが落ちるという問題に最終日悩んでいました。
vAudioのruby用ラッパーを作られている方がおられたので、これを使ってどうかと提案しましたが、再生に使用する音源をグローバル変数でloadするだけで解決できたみたいでよかったです。

以下は、Team1の発表画面です。
Team1のインドのお二人はインドから参加されていましたが、白板を使ってブレインストーミングをされていたみたいです。

team1_img1

team1_img2


次に、Team2です。
彼らは東方などに代表される所謂、弾幕シューティングのジャンルに挑戦しました。
弾幕シューティングなので、画面ごとに、弾の飛び方や難易度を変えるようにしたようです。
インターン序盤にビームを飛ばしたいと言っており、味方用のビームと敵のビームを元は同じClassを使って、どうにか飛ぶ方向などを工夫しようとしていました。
最終的には味方用のビームと敵のビームは違うClassで定義するようにしたみたいです。(継承などもしない形になったみたいです。)
敵のビームは各画面ごとにフォルダを分けて管理しているみたいですね。
質疑応答の部分ではコードに関する説明や助言があったり、「フリー素材はパブリックドメインで探すといい」といった助言を得られました。
Team2は各自の知識を持ち寄って色々なことを模索し、協力して乗り越える形のチームでした。なかなか口を出すタイミングが難しいので、積極的に質問できる雰囲気作りが課題になります。
全員を巻き込んだPull Requestsレビューとか入れるのも面白いかもしれませんね。
次回開催ではPullRequestを積極的に作ってもらうのもありかもです。

そんなTeam2の発表風景と資料・ゲーム画面です。
完成度が高いゲームでした。この短い日数で3人で作った場合はもう少しバグや機能不足が見られてもおかしくないですが、とても優秀でした。

team2_img1

team2_img2

最後に我らがTeam3です。
このチームはNaCl2人組チームです。
お二人ともデザインセンスが良いので、とても出来栄えのいいものでした。
カメラから出る光の線の表現とか面白いですし、部屋の中を逃げ回る猫を撮影して、 SNSにあげるというゲーム設定も素敵でした。
開発過程など、良きお手本になれたかなと思います。
もう少し他のチームとの交流の時間を設けるべきでしたので、そういう時間をスケジュールに組み込みたいですね。
次回開催はそういった点も工夫してみるといいかもしれません。(このスケジュール取りが一番難しそうですが。)

team3_img1



さて、そんなこんなで皆さんの発表会は終わりました。
とても優秀な方々で今回の難易度設定は明らかに間違っていました。
今後もこのレベルの方々が来られることを考えて、事前のスキルチェックを出来る環境かもしくは途中で難易度を上げられる環境を用意できればいいなと思いました。
それと、そういったことをスムーズにできる用に積極的にコミュニケーションを取れる環境づくりが大切ですね。
作業状況をずっと監視するのは難しいですし(さすがに息苦しい)、何か工夫したいですね。
一番簡単にできるのはやはり、PRレビュー会でしょうか。

この後、交流会として、Team3のお二方や会社についての質問時間を設けました。
30分ほどの短い時間ではありましたが、最後に質問会が出来たのは良かったです。

今後もこういう時間を差し込まなければいけませんね。
結構急に決まったものだったので、お二人には大変な思いをさせました。
来年はあらかじめスケジュールを用意しておかないとかもしれません。

参加者の声(抜粋)

  • 私はプログラミングに対して、完全な素人なので、ゲーム開発中に、色々な問題が出てきました。その時、完山さん、岸野さんは私の質問を素早く回答してくれました。Aarti Daasさんは色々通訳してくれました。メンバーはコードの方色々手伝ってくれました。私はとても感謝しています。

  • 私は今回のインターンシップに参加して様々なことを学ぶことが出来ました。DXRubyでは前使った時とは別の文を知ることができ、githubは初めて利用したので教わること全てが初めて学ぶものでした。

  • 自分にとって初めての共同開発経験だったので、それ故想定外のことがたくさんありましたがそれを経験できてよかったです

本インターンから見えた課題

本インターンで一番問題となったのはコミュニケーションロスです。
最初の想定としてはRuby合宿と同様に、質問がたくさん飛んでくるであろうと思っていました。
そのため、質問待機場所でずっとメンターが待機し、質問があったらすぐに飛んでいく予定で、また話している内容を聞きに回るようにする想定でしたが、想定よりもはるかに優秀な方々が来たので、質問が来なかったですね。
そして、基本的には黙々と作業を進めながら、困ったことがあったらメンバー同士で話し合うというスタイルでやっていたので、下手に入ると作業の邪魔になりそうで、なかなか割り込めなかったです。
これはボイスチャットとして、Discordがあまりにも効率的に作られ過ぎているのが問題でした。
必要な時だけ話せるという機能なので、作業に集中しているかどうかが一目でわかるわけでもなく、気軽に話しづらい状況を作っていたのかなと思いました。
また、気軽に話せるタイミング・交流会をスケジュールに組み込んであげればよかったです。
全員を巻き込んだPRレビューとかいいですよね。特に今回はTeam3が特設であったので、大きな修正のマージ前に開くように促せば面白そうでしたね。
せっかくGithubでやっているので、色々な意見を集めたり、なぜこういう風に実装するのかを話し合えれば、勉強になったと思います。

また、インターンの難易度や満足度が気になる所です。
何か要望があれば事前に集めたり、題材決定するときも満足できるものを事前に調査できれば良いなと思いました。

検討項目

  • ボイスチャットツール
  • スケジュール
  • 参加者の要望などを事前に集めること
  • インターンの題材決定