Akatsuki Hackers Lab | 株式会社アカツキ(Akatsuki Inc.)

Akatsuki Hackers Labは株式会社アカツキが運営しています。

アカツキでサーバーサイドエンジニアを経験してみて

こんにちは!今回はサマーインターンで大規模プロジェクトにサーバーサイドとして携わらせていただきましたDopponです!8月1日〜8月23日までみっちりインターンさせていただいて、本当に多くのことを学び、たくさんの気づきがあり、アカツキの雰囲気にどっぷり浸かってきたのでアウトプットしようと思います!

1. チームの雰囲気 

これまで実は他でもインターンを長期で経験してました。なのである程度は働き方のイメージは出来ていたのですが、やっぱり誰にでも不安はある訳で、チームの仲間とちゃんとコミュニケーションを取れたりメンターさんと上手くやれるかなどは気にしていました。

しかし、実際のところそんな心配は杞憂に終わりました笑

まずメンターさんが色々配慮してくださり、自分が全力でやれる環境づくりを整えてくださったのが一番大きかったです。本当にありがとうございました。次にチームの雰囲気も良かったことが印象的です。ゲーム会社だからって事もあるからか(?)、好きなゲームの話だったり好きなアニメについて話せばだいたい通じるので、馴染むのにそう時間はかからなかったです笑

自分のサーバーサイドのメンバーはだいたい8人ぐらいで、それぞれが強みを持っている印象で良くこんな人たちを集めてチームを作りあげたなって正直に思いました。

なので本当に雰囲気も良くて、そうそう会って話を聞く事すら出来ないエンジニアのもとで一緒に働けた事が誇りに思います。

じゃあ、自分の大好きなメンターさんと一緒にランチに連れてってもらってインターン中一番美味しかったカレーの写真を載せて、どんな開発をしたのか話して行こうと思います!

f:id:dopponpon:20190823092052j:plain

 

2. 開発 

実際のインターン内容ですが、ざっくりあるゲームタイトルの友達機能の周りの改修を手伝いました。
メンターさんとお話をする中で、今後に向けて友達機能周りを充実させていくのが良さそう、と思ったのがきっかけです。

実は初日のミーティングで、色々残っているタスクなどを共有していただいてその中でこの友達機能の改善に興味が湧いたのも大きいです。実は自分と同じタイミングで同じチームに配属されたインターン生は別タスクでログの解析を行ったりと、結構やることはバラバラで自分で手をあげて選ぶって感じがありました!

こういった雰囲気はアカツキの会社説明のときに良く聞いていたので、そのまんまだなと思いました。

 

3. 今後について 

この短期間で本当に色々な経験をさせていただいて、学ぶこと、反省することが多かったです。友達機能の設計は考え所が多く、自分でも以前につまづいていた箇所だったので、今回実際にどういう設計で作られているのかを知れたのは、それだけでも大きな収穫でした。
もちろんそれだけでなく、アカツキの文化に触れられたこと、どういう風に開発に向き合い、どういうこだわりを持って進めているのかを体感できたこともとても良かったです。
また、今回のインターンで全国から集まった学生と交流することで自分の至らない点を痛感することもあり、もっと努力しなければと励みにもなりました。どこかでこのお礼ができるようになるためにも、沢山勉強してもっと力をつけようと思います!

アカツキ就業型インターン8月の部

はじめまして、この度アカツキのサマーインターンに参加させていただいたので、その参加報告をいたします。

経緯

魔法のスプレッドシートで知りました。 ゲーム制作に昔から憧れがあり、やっている内容も面白そうだったので、応募しました。 なにか未経験のものがやりたいと思い、UnityとGo(サーバ)で応募しましたが、 面接で話し合った結果railsのプロジェクトに参加することになりました。 当初は希望していたところと違っていて残念だなと思っていましたが、 経験のあるrailsで参加できて、サービスの理解や設計により注力できたかなと思います。

インターンの応募

僕の場合は コーディングテスト→人事面接→技術面接という流れで進みました。

コーディングテストはプログラムを書いたことがある人ならまず通るような内容でした。 業務内容に比べるとかなり簡単だと思います。

面接は2回あり、その後に合否の連絡とメンターの方と何をやるか決める面談をしました。 技術面接でインフラ(クラウドですが)とかを触った経験があったので、そのあたりの話をしたような気がします。 似たようなことをやっていたのがよかったのでしょうか。

会社の雰囲気

支給されるPCは最新のMacBook Proでした。画面のサイズとキーボードの配列を選択できます。 僕は英字配列しか打てない人なので、キー配列を選べたのはうれしかったです。

あと、オフィスがきれいでした。オフィスの中にはセルフコンビニもあります。 ゲーム会社なのでゲーム好きな人が多いかなと思っていましたが、人それぞれであまりゲームをしない人も多かったです。 ただ僕はサーバサイドで採用されましたが、 フロントの方がゲーム好きの方が多いような気がします。

インターンの内容

業務以外

インターンの方は、数回分ランチの枠が用意されていて、 自分が参加しているチーム、職種以外の方と食事ができる機会があります。 ぼくはフロントエンドのエンジニアの方や、 研究開発のエンジニアの方とランチに行かせてもらいました。 そこでアカツキの働き方や、それぞれの分野の詳しい話を聞けたのでとてもいい経験になりました。

業務

10時~19時の3週間(16日間)の勤務でした。

実際の業務と同じような内容でした(と僕は感じました)。 時給の高さを考えるとこれぐらいは期待されているのかもしれません。 最初の3日間ぐらいは少し大変ですが、慣れてくると楽しいです。 自分の変更がマージされるときは嬉しいものです。

ソーシャルゲームのサーバサイドということもあり、 大規模なトラフィックが想定されています。

このような大規模なサービスに学生のうちから触れられるのはとてもいい経験だと思いました。

今回のインターンでは2、3個の新規のAPIを実装しました。 それに伴ってデータベースの新規設計も行いました。

仕様、設計が確定しているものについては実装は楽でしたが、 開発が始まってから数年経ち、機能やテーブルも多岐にわたるので、 個々の機能を理解するまでが大変でした。 なので新規機能の開発を始めるときは、既存機能の仕様、コードを確認し、 そこから新規機能の仕様を確認し、実装を始めるという感じでした。

感想

短期のインターンでは実際の業務とは違うことをやらされたりして、満足行かないことは多いと思いますが、 今回のインターンはリリースされているゲームのバックエンドの実装ということで、とてもいい経験になりました。

インターンでゲームのデバッグツール機能開発をした話

こんにちは、アカツキサマーインターンシップ2019第2期生の伊藤です。 

今回、8/1〜8/23の平日16日の間*1、株式会社アカツキでサーバサイドエンジニアとして就業してきました。

この場を借りて、インターンで何をやったのか、色々アレコレどうだったのかを振り返りたいと思います。

インターン内定まで

4月のサポーターズ逆求人イベントで、アカツキの人事さんとエンジニアの方とお話する機会がありました。

丁度ゲーム系のインターンを探していたので、イベント後早速選考を進めることにし、5月中にはインターンの内定を得ることができました。選考自体はプログラミングのWebテストと1回の面接のみで、特に対策等は行っていません。

やったこと

僕はサーバサイドのコースで応募したので、面接の段階でRubyのコースとElixirのコースを選ぶタイミングがありました。元々はゲームサーバのプロダクションコードを触りたいなと思っていたのですが、以前から気になっていたElixirにここで触れるのも巡り合わせかなと思い、Elixirのコースを選択しました。*2内容はデバッグツールの開発ということで、個人的にゲーム開発を行っている自身としても良い経験を得られそうだと感じていました。

さて、実際にインターンでやったことですが、主に以下の3つの機能実装となります。

  • デバッグツールのパーティ編成機能
  • デバッグツールのパーティメンバー能力値操作機能
  • デバッグツールのパーティメンバースキル操作機能

以上を実装する背景は、テスト環境において、様々なレベルの敵とのバトルのデバッグや、特定のゲーム進行状況を再現しづらいという点を解消するというものでした。デバッグはプログラムに詳しくない方々も行うので、簡単な操作で複雑な状況を再現出来ることが必要不可欠でした。

今回担当したタイトルでは、ゲームロジックがサーバに寄った設計になっているため、デバッグツールはWebアプリケーションとして実装されています。技術的には、WebアプリケーションフレームワークとしてPhoenix、UIフレームワークとしてVue.jsが採用されています。

詰まったこと

初めて触れる言語ということもあり、Elixir周りで躓くことが多々ありました。また、Vue.jsに慣れていないためVue.jsの気持ちに沿ったデータ構造設計が行えず、最終的にリファクタリング作業をすることで無駄に工数を増やしてしまうということがありました。

以下でざっくり振り返ります。

Elixirの詰まりポイント

Elixirは動的型付けではありますが、Typespecという型表記法やDialyzerという静的型解析ツールがあり、比較的型に対する意識が高い言語です。

また、Elixirはトラディショナルなオブジェクト指向言語とは異なり、クラスという概念はありません。*3さらに継承も無いため、それぞれ独立した構造体、リストやマップなどによってデータを表現することになります。この辺はなんとなくGo言語に近い雰囲気を感じます。

なるほどプリミティブと構造体で上手いことデータ構造を表現して、Dialyzerを用いれば静的型付け言語と同じような気持ちでコードを書けそうだ、というのが最初の感想でした。

ここで問題となったのが、DialyzerはStructural Subtypingでは無さそう(=Nominal Subtyping)ということでした。Nominal Subtypingとは型名だけでデータ構造を特定するような型システムのことで、C言語やJavaなどほとんどの言語ではこちらが採用されているようです。対となるStructural Subtypingは、ある型のデータ構造を含む、より大きなデータ構造があった場合に、大きい方を小さい方の型としても扱うことが出来るような型システムです。こちらはML系言語(OCamlとか)などで採用されているようです。

Elixirのような継承を許さない構造体を扱う言語の静的型解析にはStructural Subtypingを期待してしまうのですが、どうやら違うようです。なので、基本的に複数の構造体の結合はMapとして表現するしかない、ということが起きます。そもそもMap.mergeしているのだからMapになるだろうと言われればそれまでですが。厳密にやりたいなら、その複数の構造体の結合を新たな構造体として定義する必要があります。

静的型解析が要らないというのであればこれは問題ですら無いのですが*4、新たに巨大なコードベースに立ち向かうには型という案内図があった方が都合が良いです。その案内図(型定義)が大雑把(map)過ぎて、案内図の機能を果たしていないというのが今回の問題でした。*5

素人の感想ですが、Ectoを使っているとやりがちな問題なのかな?と思いました。

なぜこのようなことになっているのか詳しく理由を聞くと、途中からDialyzerを導入したプロジェクトなので現状仕方なくそうしているということでした。問題意識はあるようですので、今後改善されて行くのだろうなと思います。

Vue.jsの詰まりポイント

Vue.jsはリアクティブにデータバインディングしてくれるイマドキなフロントエンドフレームワークなのですが、どこまでならリアクティブにバインディングしてくれるのかを理解していないと辛いことになります(なりました)。特に変なデータ更新の仕方をするとハマりがちなことかと思います。

Vue.jsはdataで定義したフィールドは追跡してくれるのですが、新たに追加されたフィールドは基本的に面倒を見てくれません。内部的にはクラスのsetterを利用しているため、テンプレートの方で指定しているフィールドがなければそのsetterは生成されないようです。*6

結論として、データはsetterが引かれるような更新の仕方をするべきでした。

感想

田舎の大学に通っているため、3週間とはいえ東京で生きていけるか不安でしたが、意外となんとかなりました。まあ、人ごみと暑さにはなかなか慣れませんが…

遠方(岩手)からの参加だったのでマンスリーマンションを用意して頂きましたが、結構快適でした。洗濯機・冷蔵庫・電子レンジ・IH以外ほとんど何も無いので、ある程度日用品調達は必要でしたが、真下にコンビニがあったので特に困ることも無く。アカツキのある目黒まで電車で2駅なので、通勤もそれほど苦ではありませんでした。

業務内容はメンターさんが事前にきっちりタスク化してくださっていたので、ほとんどやるだけと言う感じでした。個人的には、もう少し他の社員さんとも絡みたかったなという感想です。

全体を通して満足感のあるインターンだったと感じています。

*1:途中、学会で抜けたので実際は14日間

*2:実はRubyもまともに触ったことは無いが、関数型言語の側面が強いElixirの方が興味が強かった

*3:その代わりプロトコルという機能でオブジェクト指向の特徴の1つであるポリモルフィズムを実現している

*4:実装上は問題無い

*5:一言で言うとGoの埋め込み型が欲しい

*6:動的に生やす方法はある

インターンでクライアントエンジニアを体験しました

はじめまして。ハチナイのクライアントエンジニアインターンとしてお世話になりました、AxIと申します。
今回15日ほどハチナイの開発としてお邪魔させていただきました。
僕はゲーム開発は初めてだったのですが今回のインターンで、自分で改善点を見つけて、ある程度実装するところまで経験させていただきました。

目次

インターン開始前

一週間前に説明をいただき、UnityとGitの復習を行いました。

インターン開始

まずは改善点の探索ということで、仕様書を20時間ほど読み、仕様書で与えたいユーザー体験と僕が自分でプレイして経験した体験のどこにギャップがあるのかを考えました。また、1ユーザーとして不便なところやわかりにくいところを考えリストアップしました。
それらの改善点を抜粋し、開発チーム内の様々な職種の方のまえで発表とディスカッションを行い、理にかなっている物の中でインターンという短い時間の中で可能な改善点を選定しました。

課題決定

取り組む課題は、デレストのカード詳細のユーザーフレンドリーな確認方法の実装としました。
従来、デレストオーダー編成時、サポート選択時にはアクションカードの効果を三つ以下の小さなアイコンで理解しなければならなく、特に初心者にとっては難しい環境でした。(対象カードを所持しているキャラアイコンを長押しすると、選手詳細から説明文をみることが可能)
そのため、それらの画面で軽いアクションで確認できる機能は、初期ユーザーのデレストへのハードルを下げる、中長期ユーザーのオーダー編成時の煩雑さを下げるという点でメリットが期待されました。

実装

あまり触れたことのないUnityの2D周り(3Dは経験あり)、Git、ゲーム開発という環境で不安でしたが、社員さんの優しいサポートの元、牛歩ではありましたが実装を進めました。
インターン中にすべてのコード理解は不可能と感じたため、まだ見ぬ他の機能を阻害しないように基本的に現状の機能内に似た機能を探し、その実装方法を真似て実装するというカメレオン的なコーディングを意識しました。

初期想定ではカードタップ時にポップアップ表示、ポップアップ表示時にポップアップ以外タップでポップアップ消去という機能でしたが、実際に実機で触れてみたところ、ポップアップ消去動作が煩雑であったため、カードに触れている間のみポップアップを表示という機能に変更しました。
このように実機でなんどもビルドし、ユーザーの邪魔にならないポップアップの表示方法を検討しました。

f:id:AxI:20190628174437p:plain
実装結果
実装の詳細は成果発表の時に使ったスライドの抜粋として、末尾に添付しておきます。

インターンを終えて

反省点

迷惑をかけたくないという感情が強すぎ、自分でできる可能性があるところはとことん遠慮がちになってしまい逆に迷惑をかけてしまったように感じました。
配慮と遠慮の区別をつけられるよう今後精進したいです。

良かった点

仕様書を読んで改善点をプレゼンし、仕様書を書いて実装して、実機で動かして、使ってみて使ってもらって、改善して。と一連の流れを体験できたのは、ゲーム業界未経験の僕にとってかなり価値のあるものだったと思います。
また、問題提起や発表、コーディングは好評をいただけました。
問題提起や発表は学問や研究と繋がる面が多々あったので、普段頑張っていることが社会に出ても役に立つ実感ができてとても嬉しかったです。
コーディングも実務は未経験でしたが、実装をしていく中で授業や研究で学んできたことがしっかり役に立ってる感が味わえ、今後卒業に向けた研究へのモチベーションにもつながりました。

タイミングが良かった

アカツキの9周年祭、ハチナイ の2周年祭がインターン中にあり、インターン生ながら参加させていただきました。

f:id:AxI:20190628173036j:plain
かわいいケーキ
インターン生だろうが関係なく受け入れていただいた面や、ハチナイのお祝いに他の部署の人たちが御祝品もって突入してくる雰囲気はとても暖かでした。

成果発表の時に使ったスライドの抜粋

f:id:ytfkbc:20190729115421p:plainf:id:ytfkbc:20190729115700p:plainf:id:ytfkbc:20190729115718p:plainf:id:ytfkbc:20190729115726p:plainf:id:ytfkbc:20190729115736p:plainf:id:ytfkbc:20190729115745p:plainf:id:ytfkbc:20190729115754p:plainf:id:ytfkbc:20190729115803p:plainf:id:ytfkbc:20190729115830p:plainf:id:ytfkbc:20190729115839p:plainf:id:ytfkbc:20190729115922p:plainf:id:ytfkbc:20190729115930p:plainf:id:ytfkbc:20190729115940p:plainf:id:ytfkbc:20190729115951p:plainf:id:ytfkbc:20190729115959p:plainf:id:ytfkbc:20190729120007p:plainf:id:ytfkbc:20190729120018p:plainf:id:ytfkbc:20190729120027p:plainf:id:ytfkbc:20190729120038p:plainf:id:ytfkbc:20190729120048p:plainf:id:ytfkbc:20190729120059p:plainf:id:ytfkbc:20190729120120p:plainf:id:ytfkbc:20190729120130p:plainf:id:ytfkbc:20190729120139p:plainf:id:ytfkbc:20190729120153p:plainf:id:ytfkbc:20190729120203p:plainf:id:ytfkbc:20190729120238p:plainf:id:ytfkbc:20190729120250p:plainf:id:ytfkbc:20190729120301p:plainf:id:ytfkbc:20190729120329p:plainf:id:ytfkbc:20190729120340p:plainf:id:ytfkbc:20190729120353p:plainf:id:ytfkbc:20190729120407p:plainf:id:ytfkbc:20190729120419p:plain

Akatsuki Summer Internship 2019-7

はじめまして、イチノセです。

この度、株式会社アカツキにて「八月のシンデレラナイン」の部署にて3週間就業型インターンをさせていただきました。ここで何を学び、何を見たのか語っていきます。

 

経緯

2018年12月、私はインターンを探していました。将来の就職のために行くに越したことはないと思いネットで探していました。探している中、普段からお世話になっている教員の方から「アカツキで新しいイベントをやるから行ってみては?」と勧められ、そちらの会社ではお世話になった先輩が就職した会社であるということもあり、アカツキのイベントに参加することにしました。

 

「Akatsuki Geek Live」と呼ばれるそのイベントは、LT(Lightning Talks)と呼ばれるプレゼンテーションを企業と学生から数名ずつ募り登壇するイベント(以下LT会)でした。第1回目は2月にあり私は聴衆側でしたが、エンジニアの集う会ということもあり、面白い話を多く聞きました。何度かLT会にお邪魔させていただいてると夏に3週間就業型インターンシップがあると聞きました。

 

こちらでは参加期日が3種あり、7〜9月の頭の平日からそれぞれ3週間ありました。3週間という長いインターンであり、参加したら他の会社のインターンを受けることができないと思った私は学校と話をつけて7月の頭から3週間インターンに参加することにしました。

 

目標

こちらのインターンでは何をテーマにするかを初めに自分で決めるところからスタートします。テーマを決めたらメンターの方と話し合ってテーマに対する目標、そのための道筋を一緒に考えました。

選べる道が多い中で「データ管理、効率化をより深掘りしていく」ことを目標にしました。私はワークフローエンジニア(データの管理、効率化を図るエンジニア。エディタやパラメータ管理、処理軽減など)を目指しており今までの制作の中ではそちらの処理に関わる機会が多くありました。今回のインターンではそちらの実力を伸ばそうと考えたのです。

 

インターン課題1

目標を決めた後はタスク管理ツールを閲覧して、どのタスクが目標に沿っているか確認して課題を決めていきました。候補はいくつか挙げられた中で、デザイナーからのタスクに「デバッグ機能としてキャラクタのシーン画像を追加した際の表示範囲、座標をどのスマートフォン検証端末からでも確認できるようにしてほしい」とありました。データの管理に沿うということで今回はこちらの作業を行うことにしました。

初めはすぐに作業を開始するのではなく会社のコードを読むところから始まりました。会社の方で参考になる処理があれば使用できるからです。コードを読んで3日ほどで作業に取り掛かり始めました。コードを読んだりメンターの方と話して知ったのですが、IOSに合わせて画像サイズを合わせた後、画像の表示可能範囲、必須表示範囲からIOSに合わせた表示範囲を計算して描画してくれるオブジェクトがすでにあるそうなのでそちらを利用しながら作業しました。

そちらを加えた後は画像の情報を取得する手段について考えました。画像の表示位置を変更したい、表示範囲を変更したい、画像自身を移動させたいなど後々で変更もできるようにしようと思い、画像の表示範囲、座標をUIで表示し変更ができるようにしてデザイナー側からも楽に変更ができるようにしました。さらに画像自身をスライドして表示中心座標を感覚で変更できるようにしました。

こちらのゲームではキャラクタの画像を閲覧する方法として、パラメータ確認の時にも閲覧できるようになっています。そちらの挙動も確認できるようにしたほうがいいということを話し合って挙動を追加しました。そしてこれらUIの表示を消すフルスクリーン機能、読み込みの処理の多重化など測りました。

 今回の制作では、使いやすくわかりやすい機能を目指して開発できたのでいい経験になりました。

 

インターン課題2

次の課題は「対戦時のキャラクタ表示を上記で使用したオブジェクトを使用して表示する」ことすることでした。表示方法が「背景、半透明の黒、キャラクタ」の順で後ろから表示します。こちらではSSR未満の場合には背景はデフォルトの背景画像、SSR以上ならばキャラクタの背景画像を表示させていました。しかし、私がオブジェクトを追加してこの処理を真似て表示させようとすると背景と画像で表示範囲が合いませんでした。そちらの原因を調べていると背景とキャラクタの継承先が違く描画手段が違っていました。ならばと、背景抜きをするシェーダーを背景を薄暗くするシェーダーに書き換えて完成させようとしたのですがその途中で作業は中断してしまいました。なぜならば、今回のインターンの期日が来てしまったからです。

今回のインターンで一番悔やむことと言えば最後まで作業をやり抜けなかったことです。余裕を持って全ての作業を完成できなかったことが大変残念です。

 

総評

上記で書かなかったこと以外では、「Git」「アセットバンドル」について関われたこと、チーム制作を学校で行っていた身として会社の制作は経験として得られたこともデータ管理関係として深く理解が得られたと思います。課題2は完成までには至りませんでしたが、現場の作業を1つでも多く行い、最高でした!上記にある課題1を完成に至るまでの過程でのデータの取得、配置、効率化を考察してきたことと、課題2での失敗からのコード読解で処理の理解を深めることができたからです。

過程を理解して簡略化することにより、全ての作業効率をあげることができるのをここまでのインターン活動で深く知ることができました。今回の活動と今後行うインターン活動、普段の作業から成長した自分を9月にあるゲームジャムで証明していきたいと思います。

www.slideshare.net

 

成果報告資料(slideshareには代理で登録しています)