Appifyの(僕の)プロダクト開発方針

これは Appify Advent Calendar 25日目の記事です。

image

株式会社Appify Technologiesで社長兼PM(開発まで含む)をやっているゆずしおです。会社のAdvent Calendarでクリスマス担当になりました。何を書こうか迷いましたが、Appify / VIP という2つのShopifyアプリを開発している経験から固まってきた弊社の(僕の)開発方針について整理してみようと思います。

プロダクトについて

プロダクト公開前の開発期間も含めるとかれこれ2年近くShopifyのアプリを開発しています。提供しているAppify Mobile は正式リリースが2021年4月でまだ8ヶ月ほどですが、アプリ上の流通が年間20億円に到達しようとしており、ダウンロード数は累計100万ほどです。10月に正式リリースを行ったVIPでは1ヶ月で既に数千万円分のポイントが運用されています。これは20億円分の注文に相当する量です。2022年末までにはAppifyのプロダクトを経由する月間GMVを100億までもっていきたいと思っています。

Appify Mobile

Shopifyのマーチャントがモバイルアプリの提供を開始できるShopifyアプリです。マーチャントはアプリをインストールし、いくつかの初期設定を完了させるだけでShopify上の顧客/商品/コレクションをモバイルアプリに連携でき、アプリのデザインも管理画面から簡単に編集することができます。

Appify VIP

Shopifyのマーチャントがロイヤリティプログラムを展開できるShopify アプリです。ポイントプログラムや会員ランクプログラムの提供や、実店舗/オンラインストア/アプリでのポイント共通化、チャネルトークなどの外部サービスと連携したCRMが実現できます。

Appify VIP| Shopify アプリストア

新しいウィンドウで開く 外部リンクを開く 外部リンクを新しいウィンドウで開く ロイヤリティープログラムの提供をはじめる 年額$3,600。 追加料金が適用される場合があります。 効果のあるロイヤリティープログラムを提供する Appify VIPとAppify Mobileを組み合わせることでマーチャント様は「値下げをして顧客の購入を待つ」から「お客様へ自ら働きかけ売上を増やす」活動にロイヤリティープログラムを進化させることが出来ます。 ポイントプログラムをただの「値引き」にしない 顧客のポイントや会員ランクをフル活用して、適切な顧客アプローチを実現できるようにします。ロイヤル顧客に商品の先行販売や限定商品の購入機会を提供するなどの特別な権利の提供を実現しましょう。 モバイルアプリを使って相乗効果を生み出す メールだけでなく、より開封率の高いプッシュ通知やアプリからいつでも確認できるお知らせを使ってロイヤル顧客とダイレクトにコミニケーションが可能になります。もちろんプッシュ通知の配信は無料です。 このアプリについて サポート Appify VIP VIP(ヴィ・アイ・ピー)について VIPはShopifyのマーチャントがポイントプログラムや会員ランクプログラムを提供できるようにします。VIPを使って自身のブランドに適したプログラムを提供することが可能です。 ご利用方法 VIPをShopifyにインストールして管理画面からチャットにてお問い合わせください。本番ストアに公開するまでの間はVIPの全ての機能を無料で利用することができます。ストアを本番に公開する前に必要なプランを契約してください。 ポイント機能でできること ポイントプログラムの提供 会員ランク機能の提供 会員ランクでポイント獲得の条件を変更 商品タグでポイント獲得の条件を変更 決済時のポイント利用 (1ポイント1円換算) Shopify POSとの連携 OmniHub Appify Mobile Point of Sale Flow このアプリについて Appify VIP VIP(ヴィ・アイ・ピー)について VIPはShopifyのマーチャントがポイントプログラムや会員ランクプログラムを提供できるようにします。VIPを使って自身のブランドに適したプログラムを提供することが可能です。 ご利用方法 VIPをShopifyにインストールして管理画面からチャットにてお問い合わせください。本番ストアに公開するまでの間はVIPの全ての機能を無料で利用することができます。ストアを本番に公開する前に必要なプランを契約してください。 ポイント機能でできること ポイントプログラムの提供 会員ランク機能の提供 会員ランクでポイント獲得の条件を変更 商品タグでポイント獲得の条件を変更 決済時のポイント利用 (1ポイント1円換算) Shopify POSとの連携 OmniHub Appify Mobile Point of Sale Flow 1年に1回$3,600を請求 拡張機能を追加ごとに月額$200~が追加されます 年間売上に応じて料金テーブルをご用意しておりますので詳細はサービス内よりお問い合わせいただくか、こちらのメール(support@appify-inc.com)にお問い合わせください 総合評価は、アプリの現在の状態を反映しています。すべてのアプリレビューを考慮しますが、最新のレビューを優先します。 Appify VIPに類似したアプリ

Appify VIP| Shopify アプリストア

Appifyの(僕の)プロダクトの開発方針

話を戻ってプロダクト開発の方針についてです。以下の3つになります。それぞれの方針についてWhyを書いていきたいと思います。

  • ソースコードを健全に維持しながら、早く作る
  • 無理やり実現することを避け、時には待つ選択肢も選ぶ
  • 長期的にプロダクトの提供価値を最大化できるように取り組む

ソースコードを健全に維持しながら、早く作る

どの企業でもそうだと思いますが新しいプロダクトや機能を 顧客に早く提供すること は価値があることです。でも僕は、そのサイクルを 高速かつ並列で実行できる体制・環境 にはもっと価値があると考えています。

顧客に早く届ける時に1番ネックになるのは開発速度です。では、どうすれば開発速度をあげれるのでしょうか?パッと思いつくのはエンジニアの数を増やすことです。しかし (直感に反するかもしれませんが) 開発チームを倍にしても開発速度は倍にはなりません。大抵の場合1.5倍にもならないでしょう。そして開発速度は人員を増やせば増やすほど低下していきます。

現在(2021年12月)、Appifyの開発チームはフルタイムが6人と業務委託が約15人の計20名ほどで、PM/デザインは僕が一人ですべて対応しています。今年の5月からの半年間でメンバーが17名増え、規模は小さいですが6倍になりました。しかし、チームを拡大しても (コードレビューが停滞することはありますが) 開発速度は逆にどんどん早くなっている と思います。これを継続的に実現するために取り組んでいることが「コードを健全に維持する」ことなのです。

※ この規模まで3人で耐えたのは特殊だと思うので全然おすすめではありません。現に過労だったのも間違いないです。

image

そもそも僕は開発速度が落ちていく原因の大半を以下の2つが占めていると考えています。

  1. コーディングルールに一貫性がない
  2. 負債が新たな負債を生み出し続ける

チーム開発の場合、エンジニアにとってコードを読み、全体を理解するコストはコードを書くコストよりも遥かに大きくなります。コーディングルールが統一されていないことで、特定の実装を理解するためにより多くの時間を要することになります。そして負債はこれをさらに悪化させます。1 + 1 = 3 という間違った前提をもとにたくさんの計算を繰り広げると、それ以降で行う全ての計算結果にズレが生じます。ソースコードの負債も同じです。そしてそれらの負債を根本的に解決するコストを許容できなくなる所まで来ると、部分的に解決しようとし始めます。これが複雑度をさらに上げてしまい、他のエンジニアからさらに多くの時間を奪ってしまう悪循環に陥ります。

ソースコードに一貫性を持たせるためにもっとも重要なのは アーキテクチャー(設計) の存在です。アーキテクチャーの本質は、何を・どこに・どう実装するのか のルールを用意できることだと僕は考えています。Appifyではクライアントとサーバーで統一されたアーキテクチャーが存在しており、ほとんどの機能はデータ設計さえ適切にできれば実質コピペで実装が可能です。またクライアントサイド(Web / iOS / Android)は一定の文法さえ理解していれば、プラットフォームを跨いでも実装が可能なレベルで統一されています。結果としてものすごい速さで開発を進めることができています。

image

話が長くなりましたが、「コードを健全に維持する」というのは、このアーキテクチャーに正しく従ってコードを書くということです。Appifyではどれだけ急いでいても、緊急のタスクだったとしても、これに反する実装は(可能な限り)レビューで弾きます。外れてしまった実装にはリファクタリングを必ず行うように心がけています。

無駄な時間に思えるかもしれませんが、ここに時間をちゃんと割くことで結果としてチーム全体の開発速度が早くなり、機能を顧客に提供するまでの時間もはやくなるのです。

弊社の開発環境の詳細は別途 CTOのそな太 氏が記事にする予定なのでお楽しみを。

無理やり実現することを避け、時には待つ選択肢も選ぶ

これはShopify APIを使って開発している経験からも影響を受けているのですが、新しい機能を実装しようとした際に どう頑張ってもすごく複雑な実装になってしまう 機能には赤信号を出しています。まずは外部ツールを活用して複雑度を下げれないかを検討し、無理な場合はそのツールがどう変わると実現可能になるのかを考えます。そしてその変更が起こりうるものなのかを予想します。

少し話は外れますが、優秀なエンジニアはサービスやAPIの全貌を俯瞰的に捉えた時に、特定の箇所が明らかに不自然に感じることがあります。他の場所や仕組みとの一貫性がないのです。Shopifyという大規模なサービスの中で、大規模な基盤を開発しているエンジニアは間違いなく優秀です。優秀なエンジニアのアウトプットには一貫性があります。だから、僕たちがそれを(正しく)使って感じる設計や仕様での不満/不足はその基盤のエンジニアもそう感じている可能性が高いと思います。

現に弊社CTOのそな太氏もなかなかな確率で基盤やAPIの進化を的中させています。

image

出典:集英社 キングダム コミック16巻

だから、サービス提供側のチームが優秀なエンジニアで構成されている場合、この「不自然な箇所」を「開発中である」と捉え、将来的に改善・リファクタリングが行われると僕は判断するようになりました。エンジニアとして方法をハックして実現したくなる気持ちはありますが、この感情を押し殺しています。

実例として、Shopify連携を公開したころからほとんどのマーチャントから機能要望としてあがっているものに「Appifyの販売チャネルに商品を公開する日時を設定できるようにしてほしい」という物がありました。Shopifyは商品管理とその商品を販売チャネルに公開する管理が別々の機能で実現されています。唯一Shopifyが提供しているオンラインストアの販売チャネルだけが既に商品のスケジュール公開機能をもっています。

image

この機能がないことでマーチャントのオペレーションに負担がかかっているのは明確でした。これを解決することでマーチャントが受ける恩恵も大きく、この機能が入ればすぐに導入したいというマーチャントも存在しています。しかし、1年近く経った今でもAppifyとしてこの機能を提供していません。

理由は、オンラインストアだけで商品のスケジュール公開ができる仕様は不自然で、Shopifyがこの機能を他の販売チャネルでも利用できるように対応するのが自然だからです。

結果としてこの機能はShopifyがベータ版の提供を開始し、まもなくAppifyでも利用可能になります。

とはいえ、1年も待つのであれば先に作って後で置き換えればいいのでは?という意見はあると思います。この意見は僕も正解であると思ってます。が、Appifyはモバイルアプリを作成するツールです。アプリの特性として、過去のアプリを使うユーザーも存在し続けるため互換性のサポートは欠かせません。その背景がある中で2種類の機能をサポートし続ける選択は3つ目の方針「長期的にプロダクトの提供価値を最大化できるように取り組む」に反すると判断しました。マーチャントに提供できる今の価値よりもサービスが抱えるであろう将来の負債を残さない選択肢を取りました。

※ もちろん、それまでサービスが存続できなければ意味ないじゃん!という意見はあると思いますが、Appifyはすでに特定の機能だけが理由でサービスが死んでしまうフェーズではないと思っています。

Appifyではこのような判断をShopifyのAPIに対してではなく、GCP(Google Cloud Platform)やAppifyの仕様、機能提供の順番に対しても行っています。これによりサービスを(機能的にも実装的にも)最大限シンプルに保ちながら、ソースコード上の負債も減らし、マーチャントが欲しているものを安定供給できるようにしています。

長期的にプロダクト価値を最大化する

時間がなかったのでまた書きます...

最後に

この方針はあくまで今のAppifyのステージだから通用している可能性があり、来年には変わっている可能性があります。来年は開発チームを倍に拡大する予定なので、一緒に働いたことがある方々にDMを送らせていただきます。何卒

ちなみにこういうのを会社のバリューに落とし込んでそろそろ決めないとなって思ってるんですけど、どうすればいいんですかね?とりあえずワイマツさんに相談しよう。2022年も張り切っていきますね

最後にVirgil Ablohから得た1番の学びを載せておきます。

image