2019/07/05
文系大学生が一人でマッチングアプリを開発、リリースしてみました。(文系ですがプログラミングはバリバリにやってました。流石に未経験からいきなりマッチングアプリは無理です)
ダンスを学びたい人とダンスを教えたい人をマッチングさせるiOSアプリです。サービス名はDancyです。名前は響きがいいので適当に決めました。
詳細はこちら
Apple Storeで #dancy と検索!!#ダンス #ダンサー #マッチングアプリ #dance #dancer pic.twitter.com/dNbJ0KILm3
— dancy -ダンスマッチングアプリ- (@dancy_matching) 2019年6月20日
元々自分はダンスをやったことはありません。クラブに行った時に少し踊る程度です。
ちょうど雑食系エンジニアサロンでつよつよなポートフォリオを沢山見て「自分もなんか作りたいな」と思っていた時、ダンサーの友達から
「ダンサーのマッチングアプリあったら面白いんじゃね? 作れる?」
と言われたのでノリで作ってみることにしました。
友達から聞いた話によると、ダンサーを目指す人は経済的に不安定だったり、アルバイトで食いつなぐ人も非常に多い世界だそうです。界隈で知名度のあるダンサーであっても月収が10万円代前半というのも珍しくないそうです。
「ダンサーがダンス一本で生活できる社会にする」
「日本でもっと広くダンスが受け入れられるようにする」
という2つの目標を掲げて事業がスタートしました。お金もないのでとりあえず私がCTOになって開発を進めました。ポシャってもポートフォリオになりますしね。
エンジニアは他にいないので自分で作るしかありませんでした。
途中で試験期間によって1週間休んでいますので、開始から1ヶ月半が経って今に至ります。当時やっていた長期インターンを辞め、毎日ファミレスにこもって開発していました。ユーザーからの反応に関しては後述します。
一応自分はエンジニアで、友達が代表兼マーケターなのですが、代表が就活で忙しいのでマーケティングにも口を出しながら動いてます。
フロントエンドはSwift(5.0)、サーバーサイドはAWSのLambdaを用いてNode.js(8.10.0)で書きました。Swift4のつもりで書いていたらいつの間にか5に設定されていました。ほとんど変わりませんけどね。
API Gateway + Lambda + DynamoDBという典型的なサーバーレスの構成です。などを用いました。
Cosmosは評価制度に使われるような星の画像を簡単に表現できるSwiftのライブラリです。下の図のように評価4.3などの中途半端な状態も表現することができます。
マイページ、レッスン一覧、トーク画面などほとんどの画面は講師と生徒で共通していますが、処理は当然分ける必要があります。正しく処理をしないとトーク画面で自分と相手の発言が入れ替わってしまうという現象が起こります。
コーディング量は倍にはなりませんが、デバッグするのが結構大変でした。三項演算子のありがたみを初めて実感しました。
課金処理にはStripeを使いました。手数料も3.6%と割安で本番環境の手続きや実装も比較的楽にできました。課金が絡む以上、絶対に失敗はできません。DynamoDBではトランザクション処理が可能なので、レッスンテーブルと講師テーブルを同時に更新するときは非常に助かりました。
Stripeの公式ドキュメントの記述通りに書くと、入力されたセキュリティコードが誤っていても成功のレスポンスが返ってくるという問題があり、その部分を書き換えるのに苦労しました。
最初に会員登録を要求すれば便利なのですが、アップルの審査やファーストインプレッションのことを考えるとログイン前に講師の一覧画面を見られる方がいいという結論に落ち着きました。
ログインしていない状態でコンテンツを見せると思わぬnilが発生するので注意が必要です。
このアプリではレッスンにかかるお金は全てアプリ上で支払い、生徒と講師の間でお金の手渡しがないように設計しています。
ここでネックとなるのがキャンセル料です。Dancyでは講師がダンスのスタジオを予約した後、生徒都合でキャンセルを行なった場合、レッスン開始48時間前以降であればキャンセル料を発生させています。
しかし48時間以上前に生徒がキャンセルしても、スタジオ代のキャンセル料を講師が払う必要があります。そこでトーク画面にスタジオ代の請求を行う画面を設け、お互いの合意の上でキャンセル料を生徒に負担してもらう仕組みを作成しました。
レッスンの状態を以下の7つに分けて保存しています。
キャンセルがなければ結構楽なんですが、キャンセルが入るだけで場合分けが面倒くさくなりますね。
男女のマッチングアプリなら勝手に会ってくれって感じですが、ダンスのマッチングはアフターフォローが必須です。
DynamoDBには予約語が多くて面倒でした。属性名が予約語の場合、DynamoDBではエラーが出ないのですが、Lambdaの実行時にエラーが出ます。
name,regionなどプロフィールで使いたかった属性名が予約語に入っていたのでやり直しに。
の2つの方法があったのですが、DynamoDBはスキーマレスなので属性名を変更して対応。その分フロントエンドを書き換える必要があって大変でした。
DynamoDBの料金体系には「オンデマンド」と「プロビジョニング」の2種類があります。
プロビジョニングでは、アプリケーションに必要と予想される 1 秒あたりの読み込みと書き込みの回数を指定します。Auto Scaling を使用すれば、指定した利用率に応じてテーブルのキャパシティーが自動的に調整されます。
反対にオンデマンドではテーブルに対して実行された読み込みと書き込みの数に応じて課金がなされます。
1秒間に何回もアクセスされることがないデバッグ段階では、オンデマンドにしておくのがベストです。自分は何も設定がわからず、プロビジョンドのオートスケールを選び、最小のRCU,WCUを40などと設定していたので、1万円近い請求を食らいました。
DynamoDBのストリームからのストリーム読み込みリクエスト250 万回までは無料枠があるので、デバッグの段階ではオンデマンドにしておくのが良いでしょう。
マッチングアプリは審査を通すのがとても大変で、20回以上リジェクトされたなんて話を聞いていました。最初はダメ元で申請したのですが、一発で通ってしまいました。
本当はなぜリジェクトされたのかをまとめるつもりだったのに...。
最初に申請したところ、以下の3つの質問をアップルからされました。
英語と日本語をの双方で回答を送ったら、審査が通っていました。ちょっと拍子抜けです。
具体的に気をつけたのは以下のことです
男女のマッチングアプリに比べれば、比較的審査は緩いのでしょう。悪質なユーザーの通報ボタンがまだないのに、審査に通ったのでビックリです。(すぐにアップデートで追加しました)
ダンサーの友達がストーリーで拡散してくれました。インスタの拡散力は素晴らしいですね。
リリースしてみると思わぬ反応が飛んでくることがあって勉強になります。マッチングアプリって普通はログアウトしないものなんですが、講師も生徒も両方やりたいとか、他の講師のプロフィール見たさにログアウトする人が沢山居て驚きました。
当初は「気になった講師がいればすぐにチャットするからお気に入り機能なんていらない」と思っていましたが、実際使ってみるとチャットするのって勇気がいるんですよね。Wantedlyで「話を聞きたい」ボタンを押すのをためらうのと同じです。要望に合わせてブックマーク機能をつけました。
また、講師にとってはどこの馬の骨ともわからない人からのメッセージは怖いもの。写真と表示名を設定しないとトークができないように修正をし、生徒のプロフィール画面を新設しました。
AWSを本格的に使うのは初めてでしたが、使ってみると何とかなるものです。通常のインプットより、アウトプットからのインプットからの方が効率が良いというのを強く実感しました。
今まではUdemyをみながら一部を写経してポートフォリオを作ることがほとんどでしたが、今回で公式ドキュメントを丁寧に読む癖がつきました。
トーク画面では双方向通信とか入れてみたかったんですが、開発コストを考えてひとまず断念しました。そのうちRealmとかも入れて検索を高速化したいと思います。
3週間ほぼ誰とも話さず家にこもって開発していると頭がおかしくなりそうでした。久しぶりに人に会った時にろくに会話ができずに困りましたね。
半年前にリリースしたアプリは
だったので、この半年でずいぶん成長したなあと感じます。
ダンスに特化したマッチングアプリは恐らく日本で初めてです。人脈の広い知り合いが、有名なダンサーをどんどん勧誘しているので、是非使ってみてください。
技術的な詳しいアウトプットについては別記事にまとめる予定です。