プログラミング未経験のメンバーとチームを組み、数年かけて iOS アプリ「Macbeth」をリリースした話

こんにちは、Xi です。普段は iOS 開発をメインでしながら、Unity を用いたゲーム開発もしています。今回は iOS 開発を題材にしたチーム開発寄りの話になります。

## 伝えたいこと
- プログラミング未経験のメンバーには、プログラミング言語を体系的に学ぶ機会を作ってあげると良い
- モブプロなどを通して、エンジニアマインドを伝えると良い。実装やデバッグ過程を見せることで、飛躍的に伸びる可能性がある
- 進捗が無かったとしても、定期的に話す機会を作るだけで、長期的な開発は続けられる
- 序盤ほど適切なタスク割り振りは重要になる。雑に振ってしまうと、タスクの難しさでモチベーションが落ちてしまう
- 全てを自分がやろうとしないこと。適度な分担によって、心が軽くなり、一体感を持って開発を進められる

皆さんも、仲の良い友人を巻き込んで、iOS アプリを作りましょう！💪

## 事の発端
大学の授業でのソフトウェア開発がきっかけで、リバーシに似た独自のルールを持ったゲームを思いつきました。このルールは、従来のリバーシにはない斬新なもので、何か形にしたいと常々考えていました。その頃、偶然にも私の周りにプログラミングに興味がある友人が 2 人いました。そこで、私はこのルールを基にした iOS アプリの開発を提案しました。私の提案を聞いた友人たちは、このアイデアに乗ってくれて、MacBook Air も購入してくれました。これが、我々のアプリ開発の始まりです！

## アプリの紹介
「Macbeth」では、伝統的なリバーシゲームに対して、異なるルールを適用し、新しいゲーム体験を作りました。このゲームでは、プレイヤーは従来のリバーシの戦術に囚われず、斬新な戦術を駆使して戦うことになります。新しいルールにより、プレイヤーは一から必勝法を考える楽しさを味わうことができます。現在は、オフライン対戦と CPU 対戦のみですが、将来的にはオンライン対戦も実装したいと思っています。

皆さんも、良ければプレイして、フィードバックをください！その声が、今後の開発のモチベーションを高めてくれます😂 本記事の投稿時点では、150 ほどのインストール数ですが、まだまだ広まっていったら嬉しいなと思っています。

https://apps.apple.com/jp/app/macbeth-%E3%83%9E%E3%82%AF%E3%83%99%E3%82%B9/id1576508504

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402114/8b4ca9b0-881b-fee1-b572-e22de9908b30.gif" width="300"> 

## リリースまでの流れ
ここからは、時系列に沿って、やってきたことを紹介する方が、話が入ってきやすいかなと思ったので、そのように紹介していきます。

### ゼロからのスタート
私たちの開発は、まずメンバー全員が Xcode と GitHub（Git）の基本的な使い方を学ぶことから始まりました。私は iOS エンジニアとして活動しているので、十分な知識を持っていますが、友人 2 人はそうではありません。初期のコミュニケーションは全員が慣れ親しんでいる Line で行われ、週に 1 回の定例会議を設けました。この会議では、今週やったことと次週やることを共有するようにしました。**進捗の有無を問わないようにしたことで、継続的に集まれるチームになったと思います。** また、同期的に話さないと伝わらない技術的な内容や、全員で話し合わないと決めるのが難しいデザインについても話し合うことができました。

### まずは私がチームをリード
唯一のエンジニアである私は、チームを引っ張る必要があります。最適限必要な Macbeth の実装を短期集中で仕上げました。その実装に各メンバーが追加実装をしてもらう形です。他のメンバーは、プログラミングの「プ」の字も分からない状態だったので、私が持っている書籍を渡し、プログラミングの基礎を固めてもらいながら、非常に簡単な実装を通話をしながら完成させる、といった流れでした。定例会議の準備や司会なども、すべて私が担っていました。

### SwiftUI の導入
初めてプログラミングを学ぶ人にとって、UI 構築は非常に難しいものでした。そのため、UIKit を一切使わずに、すべて SwiftUI で実装することに決めました。この時はまだ iOS 13 だったので、とてもチャレンジングでしたが、今では採用して本当に良かったと思っています。各メンバーも SwiftUI であれば、なんとなく何が起こるかが分かると言っていました（優秀ですね😂）。とはいえ、SwiftUI でも様々な障壁はありました。当時は UIKit に関する情報が圧倒的に多かったため、SwiftUI に関する情報を探し出すのは一苦労でした。関連する書籍の購入や、複雑性の高い UI を避けることなどを通して、これらの課題をなんとか乗り越えていきました。

### メンバーの増員
私たち 3 人でアプリ開発を始めたという話は、友人間では少し話題になりました。その中で、この開発に関わりたいという別の友人も現れました。実際のところ、デザインに難航していたり、CPU を実装する人がいなかったりと、課題は多くあったので、デザインと CPU 実装に興味がある友人を巻き込んで、チームメンバーが 5 人になりました（なぜ都合よく、そのような友人がいたのかは、私も分かりません😂）。

### コミュニケーションツールの改善
この時点で、開発期間は半年を超えていました。さらに、チームの人数が増えたこともあり、Line を中心としたコミュニケーションに限界が来ていました（プライベートと区別しづらい、ログを長期的な視点で残しづらい、PC で扱いづらい、...）。そのため、私たちは Line から Slack（非同期的なコミュニケーション）、Discord（同期的なコミュニケーション）、Scrapbox（定例会の資料や、開発 Tips などのログ管理）へとコミュニケーションツールを変更しました。これにより、効率的に情報を共有し、開発の進行をスムーズにすることができました。**最初からこれらのツールを一気に導入してしまうと、ツールを使いこなすことにも労力がかかってしまっていたと思うので、最初は Line を利用し、徐々にツールを移行していったのは、良い判断だったかなと思います。**

### 体系的に学ぶ
プログラミング未経験のメンバーも、簡単な機能実装を比較的スムーズにこなせるようになってきました。**しかしながら、プログラミングを体系的に学んでいないため、少し機能仕様が変わるだけで、実装が困難になってしまう実態がありました。** そのため、Swift を中心にプログラミングの基礎を固めることにも注力しました。定例会議の時間の延長で、月に二回程度 Swift の勉強会をしました。勉強会の内容は、Swift の書籍の章立てを参考に作りました。チームメンバーで担当者をローテーションして、勉強会までに事前に内容を分かりやすくまとめてくるという形式です。勉強会の時間では、担当者が内容の説明をメインで行い、適宜私が補足やコメントをして、プログラミングの基本的な知識を体系的に学んでいきました。

![スクリーンショット 2024-04-07 17.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402114/28979754-1895-53e6-e9c7-f27c4a961096.png)

元々仲の良いメンバーで集まったこともあって、面白おかしく勉強会を進めることができました。また、メンバーの学ぶ意欲が強かったことにも助けられました。自身の仕事がある中で、初めての分野について勉強して、人に伝わるようにまとめてきてくれているわけですからね。

![スクリーンショット 2024-04-07 17.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402114/df55ebc5-200f-5b68-8f54-da80ec1190ff.png)

### CPU 実装
プロジェクトの後半には、CPU 実装に興味を持っていた友人との CPU 開発が中心になりました。最初は強化学習を軸にした CPU 実装をしていました。Python と CoreML を使用し、色々と検証を重ねましたが、我々の技術不足もあり、十分な強さを確認することができませんでした。その後は、より基本的な戦略であるミニマックス法を利用して、CPU 実装に挑戦しました。この CPU は一定の強さを確認できた上に、実装もシンプルであったため、最終的には、このロジックを用いた CPU をリリースアプリに利用しました。将来的には、再度強化学習を軸にした CPU 実装にリベンジしたいと思っています。また、CPU 実装の際には、友人が Python のデバッグに苦労していたので、私もサポートに入りながら、バグを解消していきました。この開発を通して、「基本的な文法は理解したので、簡単なコードは書けるようになった」、「pythonによる自動化を積極的に行うようになった」と言ってくれて、私は非常に満足です☺️

### 他の人に触ってもらったりして、改善サイクルを回す
ここまでで 2 年ほどの開発期間が過ぎていて、「Macbeth」に必要な最低限の機能開発が終わりました（毎週進捗を出せていたわけではないので、スローペースではあります）。ここからは Xcode Cloud を利用して（ちょうど、この頃に Xcode Cloud が発表された）、自動で TestFlight にバイナリが上がるようにし、外部テストを用いて様々な人にアプリを遊んでもらいました。その中で必要だと判断した機能や、修正した方が良い不具合を対応していきました。結果として、この期間が非常にダラダラと続いてしまいました。どこまでのクオリティになればリリースして良いのか、リリースするための諸準備にはどのようなことが必要なのか、などもあり、2 年くらいはこの期間が続きました😂 私がガッと進めてしまえれば良かったのですが、他の開発で忙しかったこともあり、少し時間を取れていなかったことも原因です。

### やっとリリース！
このような軌跡を経て、2024 年の頭にやっとリリースできました！長い道のりでしたが、少し肩の荷も下り、非常に満足感に溢れていました。その後は、インストール数やアクティブ率を注視しながら、アプリを [Appliv](https://app-liv.jp/5349772) に掲載してもらったり、各個人の SNS で紹介したりと、宣伝を行いました。開発は一旦終結していますが、オンライン実装や CPU 改善など、挑戦したいことはまだ残っているので、これからも開発をできたら良いなと思っています。

## 終わりに
我々の経験談を見て、プログラミング経験がないメンバーとも、何かアプリを作ってみたいな、と思っていただけたら幸いです。最後に、リリース後のメンバーに聞いた生の声を残しておきます

### 始める前の状態
- プログラミングやったことない
- 当然、開発に携わったこともない
- もちろん Swift も SwiftUI も Xcode も知らない
- GitHub 知らない
- Slack、Discord、Scrapbox 知らない
- デザインについても分からない
- その他もろもろ分からない

### 終わった後の状態
- 基本的な文法は理解したので、簡単なコードは書ける
- ネットワーク通信や外部ライブラリが絡むような複雑なコードは書けない
- 上記 2 つの間くらいの難易度のコードは、調べれば何とかなるレベル。検索して出てきたコードをあまり理解せずコピペしてことは、未だに全然ある
- UIKit は分からない
- 力技 / 冗長な書き方はまだやりがち
- GitHub を操作はできるが、使いこなせてはいない気がする。0 からの設定などは出来ないと思う
- Slack などのコミュニケーションツールはそこそこ使える
- ユーザビリティーを意識したデザインを考えられるようになった
- AppStore にアプリを掲載する方法はあまり分かっていない（自学したので若干分かるかもくらい）
- VBA でエクセルのマクロを組むなど、他のプログラミング言語の理解がすぐできるようになった
- python による自動化を積極的に行うようになった
- 強化学習の実装においても、時間はかかるが可能にはなった

### 開発の諸々の感想
- 参考書および定例会での勉強会で基礎的な文法は習得できたが、実際にコードを繰り返し書かないと身につかない
- class と struct の違いはうろ覚え、プロトコルやデリゲートはもっとうろ覚え、ジェネリクスは記憶の彼方。勉強会自体は楽しかった
- 勉強会は自分が行うことで、より理解が深まった
- 毎週の定例会で基本的に進捗を出せていた。バグが直って、うまく動いた時の脳汁が継続の源
- 定例会は組織で真剣に行っている感があり、新鮮だった
- ネットワーク通信などの難しい部分は、他のメンバーに全任せだったので、次回があるなら頑張りたい（Macbeth のオンライン実装は結構敷居が高そう・・・ちょっとしたオンライン機能の実装からやりたい）
- UIKit も使えるようになりたい
- Andoroid の実装方法も知りたい
- 駒をひっくり返すアニメーションを実装するのが難しかった
- 出来上がったデザインを SwiftUI で実装して形にするのが楽しかった
- 自分が作成した CPU が、自分でも勝てないことに感動した