RAKUDOは募集などでも書いていますように、現在
- Webブラウザ
- デスクトップ
- スマートフォン
- Oculus Quest 2
- Google Glass Enterprise Edition 2
- HoloLens 2
- M5Stack
など、さまざまなデバイスで動くアプリを開発しています。それはAR/VRを主力にした開発を追求した結果必然的にそうなってしまいました。AR/VRが生きる場所を探すためにB2BとB2Cのどちらにも挑戦したことも、色々なデバイスが必要になった理由です。
Rakudoは現在、より良いAR/VR体験を提供するために、社内でCGデザイナーを抱えて開発しているために、プログラマーは会社の作業者の半分強ほどです。この人数でこれだけのデバイスのアプリを開発するのは、実際なかなか大変だ、というのが実際やってみた立場での感想です。
というのも、上記のデバイス上で動かすためには、
- TypeScript(ブラウザとスマートフォン。ReactとReact Nativeを使用)
- Python(サーバー。FastAPIを使用)
- Kotlin(Google Glass)
- C#(Oculus QuestとHoloLens。Unityを使用)
- C++(M5Stack)
などさまざまなプログラミング言語でプログラムを書く必要があります(実際には、React Nativeのnative componentを使うために、Kotlin/JavaやSwift/Objective-Cも書いている)。
もしかしたら、近い将来WebAssemblyのためにRustや、分散処理のためにElixir/Erlangを使うことになるかもしれないと戦々恐々していたりします。
幸い多言語開発に強いメンバーがいるために成り立っていますが、それでもこれらの間で共通の処理を何回も書かなくてはいけないとなると、開発効率が大きく落ちてしまいます。
そこで、まずOpenAPIを導入して、さまざまなデバイスの中心であるサーバーのREST API周りのコードを自動生成することにしました。
これによって、さまざまなデバイスからサーバーにアクセスするコードを手で書く必要がなくなります。これがあるおかげで、サーバーでAPIを変更したときに、クライアント側で対応に困ることがなくなりました。(これがなかったら開発時ですら怖くてAPIが触れなかったかもしれません)。
ただ、OpenAPIの生成するコードの質はさまざまな点について疑問符もついて回りました。
そこで我々は現在自前で簡単なコード生成システムを作成し、OpenAPIに足りない機能を補ったり、OpenAPIで生成したコードを修正したりしています。
またコード生成以外にも、Pythonのデコレータを使って、似たようなクラスやドキュメントを自動生成したり、TypeScriptの型レベルプログラミングを使って、値のチェックを強制したりなど、さまざまなメタプログラミングを使って、重複した処理を共通化しています。
当初はさまざまなスキルレベルのプログラマーがいる中で、あまり高度な処理を使うのもいかがなものかという意見もあったものの、そんなことは言ってられないとどんどん取り入れられるようになりました。
そこで、社内での勉強会でもメタプログラミング関連の話題が取り入れられるようになり、社内資料の充実化が図られています。
いつかそれを本にしたいな、と個人的に考えています。乞うご期待。
こうやって社内で知見を共有共有していったおかげで今はどんどん開発効率が上がってます。でも、そうしたら今度はUI/UXのデザインの部分がボトルネックになり始めました。
どこかにマルチデバイスの世界を一緒に冒険してくれるUI/UXデザイナーさんはいませんか?これを読んでるそこのあなたとか……