見出し画像

2020年に挑戦した技術と案件の振り返りと2021年の目標

今年はPARTYに入って2年目。4月からは数えるほどしかオフィスに行かず、自宅で仕事をしていました。

もともと仕事はオフィスでする派で家ではできないと思っていましたが、いざそうなると意外とできるもので、今ではオフィスで仕事をする方が難しい気がします。

そして嬉しいことに、こんな中でも暇になる気配は一切なく、むしろ今年は去年より忙しかったです(今も忙しく仕事が納まった気配がない)。色んな案件を任せてもらえました。新しい技術に積極的に挑戦させてもらえて、仕事をしながら成長させてもらえる土壌があるのがPARTYのいいところ。

では、今年挑戦した技術と取り組んだ案件を振り返ってみます。

Keep Distance Ruler

・ Vue.js
・ Firebase Hosting

PARTYのクリエイター、寺島さん作のソーシャルディスタンスを可視化するARのウェブページを実装しました。最初はGoogle Driveでツイート公開だったのがめちゃくちゃバズって、せっかくだからウェブサイト作って公開しようということで作りました。発案からデザイン、実装まで一週間もなかったと記憶しています。クリエイターが集まるとこういうお祭りのスピード感が尋常じゃなくていいですね。こういう時に使い勝手の良いスキルセットを持ってて良かったなぁと思います。

ただ、静的ウェブ+ちょっとしたJSで良いサイトにVue.jsを使ったのは今から思うと技術選定微妙だったなという気がしています。Vue.jsはテンプレート的に使ったのですが、今だったらGatsby.jsにするかな(フレームワークすらいらん気もするけど)。

非公開案件1

・ GCP(GCE、Storage)
・ Python(Flask)

GPUを使った画像解析処理が実行できるサーバーのGCE構築と、APIアプリケーションの開発をしました。インフラ・ミドルウェアはチョットデキルレベルの知識なので、GCEでGPU(CUDA、cuDNN)が利用できる環境を構築するのには苦労しました。当時のメモを見直したら、もう一回同じ作業ができるレベルには記録が残っていて、自分偉いなと思いました。まだ技術ブログにしてないので整理して公開したい気持ちはあります。

非公開案件2

・OpenAPI

この案件ではAPI仕様策定とドキュメント作成をしました。今まで設計と実装をどちらも自分でやることが多かったので、自分以外の実装者に向けてドキュメントを作る最適な方法を模索してたどり着いたのがOpenAPIでした。

Stoplight StudioでGUI編集、ReDocでウェブドキュメント生成、Prismでローカルモックサーバー実行ができるのが決め手でした。YAML/JSON筋力を使って定義するのは慣れるまで時間を要しそうだったので、GUI編集できるStoplight Studioにはかなり助けられました。API側の実装が完了しなくても仕様書を使ってモックサーバーが用意できるPrismもとても便利です。

OpenAPIを始めるときの資料は記事にまとめました。

またReDocを使ったドキュメント生成では、コンポーネント定義のメニューへの書き出しが手動でしか用意されていないので、それを自動で行うCLIツールを作って公開しました。頑張った(自画自賛)。

非公開案件3

・ OpenAPI
・ Kotlin(Android、Multiplatform Mobile)

仕様策定含めたテクニカルディレクションとAndroid実装を(現在進行形で)やっています。Android/iOSのNativeアプリを同時リリースするのが要件だったので、React NativeやFlutterは最初に検討しましたが、諸々の理由で見送りました。ただ、スケジュールがタイトで工数を短くできるところは短くしたかったので、つい最近アルファ移行したKotlin Multiplatform MobileでAPI通信部分とModelの実装をAndroid/iOSで共通化することを試みています。

HTTPクライアントにKtor、DIはiOSにKoin、AndroidにDagger Hiltを使い分けています。iOSはFrameworkビルド、Androidはモジュールとしての読み込みで利用する設計にしました。

今はまだ試行錯誤中なので、プロジェクトがうまく進められた暁には知見を整理して公開するつもりです。

Stadium Experiment

・ Unity(C#)

今年最も挑戦的だった案件です。SNS的な要素とゲーム演出的な要素を併せ持つアプリ要件だったので、大部分をNative(Swift/Kotlin)実装し、演出が必要な部分はUnityで実装してUnity as a LibraryとしてNativeから呼び出す形にしました。

UnityもC#も初挑戦で、Unity as a Libraryを採用してUnityを演出装置(View)として扱う設計と、3D以外の実装をやって無事にリリースまでできたのは、今考えるとよくできたなと思います。

新しいプロジェクトを始めるときは、とにかく設計に時間をかけることが多いです。そこで学んだ言語やプラットフォームに依らない設計概念、デザインパターンはアプリケーションエンジニアをやる上で非常に重要と改めて感じました。

Unity as a Libraryをプロダクトに組み込んだ事例は英語圏含めてもあまりないようなので、今回採用した設計も整理して公開したいです。

VARP(kZm “VIRTUAL DISTORTION”、RADWIMPS “SHIN SEKAI”)

・ Firebase(Firestore)
・ GCP(Functions、Storage)
・ Python(Flask)
・ UE4(C++、Blueprint)

個人的に今年最も心に残った案件です。VARPというヴァーチャルパークシステムで、アーティストの方々のヴァーチャルライブアプリを制作させていただきました。

この案件ではバックエンドの仕組み作りと、それに接続するためのUE4のプラグインを実装しました。自分はゲーマーで、Unreal Engineの存在は以前から知っていましたが、メジャーゲームが作られるようなプラットフォームが、誰でも開発可能なものとして存在していることを初めて知って驚きました。

バックエンドの仕組みはVARPのベースにもなっているFUJIROCK FESTIVAL’19のヴァーチャルフェスアプリで作った仕組みを汎用的に使えるように改良したものです。ざっくり説明すると、Firestoreに保存した情報を更新したら、Functionsを通してJSONをStorageに書き出しています。UE4からはStorageのJSONを読み込んでゲーム内に反映します。StorageにJSONファイルを置く方法にすることで、アクセス数が読めない状況でも低予算、高負荷耐性にできています。

それよりも何よりも難しかったのはUE4のプラグイン実装でした。UE4(というか、ゲームプラットフォーム)初めて、C++初めてで右も左も分からない状態からの実装にはヒリヒリしました。プログラミング始めた頃の何もわからん体験を久々に思い出しました。でも新しいことを始めるのはいくつになっても楽しいですね。

と、こんな感じで本当に色々やらせてもらえたな、、という感じです。来年もこの勢いで挑戦をしていきたいです。

2021年の目標

・ 個人制作アプリ(Android/iOS)のリリース
・ UE4(3DCG)のモック実装

個人制作アプリ(Android/iOS)のリリース

今、アプリエンジニアとして仕事に直結しやすいWeb、Android、バックエンドの技術知識と実装スキルは持てているつもりですが、iOSに対しては圧倒的に足りてないのを痛感しています。

また意外と穴場なのがストアリリースまわりの経験と知識です。自分で実装はしてもストアリリースまではしなかったり、仕事でもリリースまで担当することは少ないはずです。ですが人数の限られたチームではストアリリース経験者はとても貴重です。特に継続的にリリース/アップデートを行なっている人はなかなかいません。

そういったところから、自分の価値をより高めるためにiOSアプリの開発と自分で管理しているストアリリースしたアプリを持つことは重要と考え、来年早々の目標にしました。

UE4(3DCG)のモック実装

これは半分趣味です。とはいえ、今後よりリッチな体験ができるアプリが求められるのは必然で、それに対する解は、現状ではゲームエンジンでの実装スキルだと思っています。スマホアプリはもちろん、VR/MRゴーグル向けアプリの開発需要は(まだ数年先かもしれないけど)より増えて行くはず。そこでUE4あるいは3DCGの実装スキルは持っていて損はないはずです。

ベースとなるAndroid/iOSの知識を持っていてかつそれに乗っかるUE4の実装スキルを持ち合わせると、かなり市場価値が上がるのではと思います。なので、UE4の実装スキル習得はiOSの次に重要視していて、2021年の二つ目の目標にしました。

(これまで目標のたてかたがめちゃくちゃ下手くそだったんですが、今回は良い目標を定められたのではと思っています。最近目標とは何かについて腹落ちしたところなので、この辺も整理して公開したい。)

というところで長々と書いてしまいました。目標は書いた以上、達成に向けて頑張ります。来年もよろしくお願いします!


いただいたサポートは個人制作に使わせていただきます!