まーぼうの書きたいことをたらたらと

研究したりゲームしたり作ったりの日記

株式会社アカツキにインターンしに行っていました

こんにちは、まーぼうです。

株式会社アカツキで3月中インターンに行かせてもらったのですが、そこでの活動や感想をブログ記事にしようということになりました。という事で、今回はインターン参加記となります。

どんな活動をした?

とあるゲームタイトルのクライアントチームに配属しました。事前の面談で「ゲームのバトルパートのデバッグメニューをリファクタリングする」というテーマがおおかた決まっていたので、4週間,19日かけて改修をする事になりました。

1〜6日目:調査と設計

初日は環境構築、2日目まで作業は食い込みました。

環境構築が終わったら、デバッグメニューの調査をはじめました。

  • どんな機能があるのか
  • どんな実装がされているのか
  • ライブラリや既存コードのどんな機能を使っているのか

を調べてみました。イメージとしてはこんな感じのメニュー画面になっていました。項目はもっとたくさんあり、スクロールする事ができます。

f:id:mabo168general:20190329115158p:plain

色々見てみたところ、機能面でも実装面でも問題があるのがわかりました。とくに実装面の問題が深刻で、

  • デバッグ機能を追加するのに複数箇所でコードを追加する必要がある。
  • 作る事ができるデバッグ機能のUIが複数種類存在するが、それが1つのクラスにまとまってしまっていて可読性などが低い。

というのがありました。作り直した方が早い事が分かったので、やる事がリファクタリングというより、作り直しになりました。

  • 1箇所にコードを追加するだけでデバッグ機能を増やす事ができる
  • デバッグ機能のUIの実装は分離して編集・拡張しやすくする

この2つを意識して設計をしました。この時に

  • 関数オブジェクトを使えばUIとデバッグ機能の処理を分離できる
  • PlantUMLというツールを使えばコーディング感覚でクラス図を書く事ができる

という知見を得ました。特にPlantUMLにはだいぶ助けられました。

cpp-learning.com

www.eureka-moments-blog.com

7〜18日目:実装

頑張って実装していました。今まで複数人で開発する経験が少なく、githubのpull requestの機能を使う機会も少なかったので、苦戦をしていました。

初めてのpull requestでは大量の指摘(100個overした)をもらって落ち込んだり、既存のコードが全然理解できず思ったようにプログラムが動かなくてヘコんだり、とある機能を作ろうとしたらこっちの仕様把握ミスなどで2回も作り直しをする事になってしょぼくれたりしました。最終日が近づくにつれてメンタルが多少強くなった気がします。付き合ってくださったメンターさんに感謝です。

最終的に、完全にはリファクタリングは終わりませんでしたが、ベースとなる部分は完成しました。仮のデバッグメニューを作ってメンターさんに触ってもらった時に良い感じの触り心地だと言ってもらえた時は嬉しかったです。

19日目:成果発表・最終出社日手続き

インターン全体の成果発表をプレゼン形式で発表しました。最終日は手続きが多いので大変ですね......

学んだこと

大きく分けて3つの事が印象に残っています。

プログラミングに対する姿勢の変化

今までは「動けばOK、自分が後から思い出せるような書き方をしておけば良い」というような考え方が強かったです。今回のインターンを通して、

という事をたくさん経験しました。人のコードを理解するのは書いた人の想像以上に難しいですし、問題のあるプログラムを製品に混入させない等、様々な理由からレビューをする事は必須であるので自分のソースコードを読んでもらうのは避けて通れない事を実感しました。そのため、

  • 「書く技術」と同じくらい「読む技術」が大事
  • 他の人が読みやすいコードを書く事がチーム全体の時間の節約に繋がる
  • 設計に時間をかけ、可能であればレビュー相手と設計について相談できると早い段階でより良いコードを作るためのヒントを得られる

という視点を得ることができました。

技術的な知見の習得

今回のインターンでは関数オブジェクトを用いてコーディングする事が多かったです。普段しないようなコーディングの仕方でしたが、なぜ今まで使ってこなかったのか後悔するレベルで強力な機能だと感じました。例えば「ボタンを押すと何かが起きる」というようなものを作る際、UIとボタンを押した時の処理をまとめたクラスを作っていたので、同じUIだけれども処理が異なるクラスを継承を用いて大量に作っていたのですが、UIだけクラス化して処理の部分は関数オブジェクトとして渡す、とした方がスマートだし分かりやすいなと感じました。普段のゲームで使っているC++でも、ラムダ式やstd::function<>といった機能がある事も調べて分かったので、今度から使っていきたいなと思いました。

あと、変数や関数名のを命名する時の語彙が増えました。関数オブジェクトにonHogeという名前につけたり、見た目を表す変数に対してhogeSurfaceという変数名にしたりとかです。

メンタル的な面

実装の面でよく実感しましたが、自分の性質として

  • 寝れば直るけれども、仕事で失敗すると相当ヘコむ
  • 集中して考えられるのは良いが、ドツボにハマると意地になって戻ってこれなくなる
  • イデアを思いついた時にあまり検討せずに「これで行こう!」となる時がある(そして手戻りが発生する)

といったものがあると思いました。仕事中にこういう状態になってしまって進みが遅くなってしまった事があったので、予めなってしまいそうな心理状態の傾向を知っておいて、リカバリーするための手を打つのが大切だなと感じました。考えた対策としては、

  • 1時間に1回は飲み物を取りに行くなどして、気分転換のための休憩を取る。
  • 30分経って分からない事は相談しに行く、そのために「何時までに分からなかったら相談しに行こう」という事を決めてから調査を始める。
  • 思いついたアイデアはすぐに相談しに行く。

という習慣を付ける事です。ただいきなり習慣づけるのは困難なのはよく分かっているので、こういう行為が誘発されやすいように、

  • いつも飲み物をコップで用意して、作業中に飲む。
  • 作業を始める時間をメモする、作業日誌に作業に使った時間とともにまとめておく。
  • 小さいことでも頻繁に相談しに行く。

こういう行動を意識的に取るようになりました。

感想・まとめ

長期間、週5フルタイムでエンジニアとして就業するという貴重な経験ができたので、今までのやり方では知り得なかった視点や知識、また自分のメンタルの傾向を知る事ができました。今後働く上で大事な経験ができたんじゃないかなと思います。4週間忙しくて大変でしたが、その分多くの学びを得られて楽しかったです。

インターンとして受け入れてくださったアカツキさん、また真摯に向き合ってくださったメンターやチームの先輩方に感謝します。

今回の記事は以上です。ここまで読んでくださりありがとうございました。