ベトナムの片田舎でマイクロサービスなアプリを個人開発した話
個人開発 Advent Calendar 2018、23日目担当ミトログといいます。よろしくおねがいします。
のっけからいきなり他記事の参照で恐縮ですが、とても良い記事だとおもうので成功事例としてこちらをまずよんだほうがいいかも。
僕も自分の作ったプロダクトで食っていきたいと思い、結構な時間を使ってまずは作ってみたんですが全く使われないものを作ってしまいました..。 今回は、
- なぜ失敗してしまったのか
- 東南アジア圏の田舎はものすごく集中開発に向いている
- 開発面で使ったツールたち
という話をしたいと思います。だいぶ他のadvent記事からずれてますが気にしない。
あんた誰
その前に少し自己紹介。
ベトナムタイ沖縄を中心に東南アジアに生息するアプリ開発者(だけど最近はtypescript書くことが増えてる)。直近はベトナムで有機農業プロジェクト参画後2年のブランクからIT業復帰。ベトナム生活での苦労から通訳アプリを開発 http://jelly-talk.com 今は週3程でお仕事しつつ、東南アジアを中心に素敵なサービスとカルチャーを作るべく準備中。
個人開発したもの
海外(ベトナム)で困った時に、気軽に通訳者にオンラインでコールができ、通訳してもらえるアプリです(初回15分無料!!)。*1
全部自分1人で作ったわけはなく、多くのデザインや通訳者集めなどは相棒に頼み、ロゴやコール音、イラストなどは随時信頼できる友人やdribbleで探したりして集めました。 構想からリリースまではなんだかんだ半年かかっちゃいました。快く協力してくれたみんな*2には本当に感謝です。
なぜ作ったか
まず自分がほしかったからです。ベトナムのど田舎で農業プロジェクトをしていて、いつも現地ベトナム人とのコミュニケーションに困っていました。その場に通訳者はおらず、込み入ったことを話そうとすると、google翻訳もお手上げ状態でした。
そんな中いつも遠隔にいる通訳者に電話して通訳を依頼していました。それがとても助かっていました。でも、彼ら/彼女らにきちんと時間単位で報酬を渡せていない罪悪感もあり、どうにかできないかと相棒と一緒に考えて作ったのがこのアプリでした。
現状とどうして失敗したか
現状
DL数は、2018年3月のリリースから2018年12月時点で700程度。1000もいってません。 利用者は、たまにいたずら電話がかかる程度で、ほぼゼロ。*3
元々ベトナム語-日本語にしか対応していないのでそもそもの母数が少なく、ベトナムの各種メディアさんにも載せてもらったのですが、インプレッションこそあれど、無料でも利用する方は(こちらからテストを依頼した方以外は)ほとんどいませんでした。
毎月、約1.5万円の維持費だけが虚しく口座から引き落とされているという状況です。悲しい!
なぜ失敗したか
一言ではなかなかあわらしづらいところもありますが、自分が毎日使いたい/改善したいと思えるほど課題を感じていなかった ということが一番大きいかなと思います。
"言葉の壁" という課題は今の時代確実にあります。しかし、僕自身がそれにぶち当たる機会がとても少なくなってしまった...。ベトナムの田舎に住んでいる時は結構使う機会がありましたが、ハノイに移ってからは週に1回使う機会があればいい程度でした。最近はベトナムだけではなくタイや日本にいることもあり、課題が発生する機会が更に減ってしまいました。そうなると、いくら「こうした方がいい、こうだったらな」と考えてはいても、続ける意義を感じられなくなってしまいます。冒頭の記事でも、
同じ問題を抱えた人は一定数います。そこを心配する必要はありません。ただ、ニッチ製品は人々に見つかるまでに時間がかかります。Inkdropは最初の正式リリースから成長し始めるまでに一年かかりました。以下のStripeの売上レポートでその様子を見ることが出来ます
via 思いついたら、さっさと作れ!
と言っています。リリースからコツコツ続けて約2年で400万超え、奮い立ちますね。
もし自分のサービスで食っていきたいと考えている方は、ぜひとも自分が毎日感じるレベルの課題を見つけることです。そして、自分のなかでベストだと思う解決策を自分のペースで試していけばいいのではと思います。そして、それが自分にとって刺さる課題なら続けられるはずです。続けられれば上記のようにニッチでも刺さる人たちは少しづつ増えてくると思います。
制作に打ち込める環境が、そこにはある
プロダクトの是非は置いておいて、モノを集中して作る環境として、東南アジア圏の特に田舎はおすすめです。なぜかというと、
- 生活コストが圧倒的に安い!にもかかわらず満足度は高め
- 日本特有のストレスから開放される
- 割り込みが少ない
- 自然が多め
という理由が個人的には大きいです。僕(と相棒)は、農業プロジェクトをしていた都合上、ハノイから南へ60km下ったハナム省という片田舎でプロジェクトが終わってもそのままそこで個人開発やお仕事をしていました。地図でいうとこんなとこです。皆さんのグーグルマップ上では、おそらくピン1つたっていないことでしょう。
全然イメージわかないとおもうので、動画と写真で少しご紹介します:
上記の3F部分が我々の城だったとこです。
どうでしょうか、少しイメージ湧いたでしょうか?
街自体が小さいのでカフェの店員や市場、食堂などの地元の人らとすぐ顔なじみになるのも醍醐味です。ここでは、日本みたいに無駄な気を使う必要はありません。エスカレーターも右(または左)に寄る必要はないですし、カフェで思いっきり子供を遊ばせても誰も文句はいいません。なんて言えばいいかわからないですが、日本よりも皆自分の欲望に忠実に生きていて、日本がいかにルールベースな社会かを思い知らされます。最初は、そんな無茶な!と思うかもしれませんが、生活していると徐々に、人々のその自然体な秩序の保ち方が心地よくなってくるのを感じるはずです。
また、日本にいると避けられない物理的な接触を完全に断てるので、残りはインターネットでのコミュニケーション(slackやfacebook、LINE、Chatwork等)が接触ポイントになりますが、それも非同期なのでコントロールしやすいです。
現地では当然ながら日本語は通じないですし、英語もホテル以外はほとんど通じないので、カフェで作業していても隣の女子高生の会話に気を取られることはありません。
こういった理由から、作業に集中しやすい環境が整うというわけです。
もっと写真を見てみたいという稀有な方がいましたら、JellyTalkの公式Instagramにあげてるものの多くは実はフーリー市で撮ったものです。
リモート通訳アプリ【JellyTalk】🇯🇵🇻🇳 (@jellytalk.app) • Instagram photos and videos
生活費について
月の生活費はこんな感じでした:
- 家賃15,000円/月 (2名分)
- 水道: 安すぎて覚えてない
- 電気: 夏はエアコンほぼ常時つけて3 ~ 4,000円/月 (2名分)
- インターネット光回線: 2,000円/月
- SIM代 2,000円/月
- 定食: 250円/食
- 作業用カフェのコーヒー 100 ~ 200円/杯
- 焼き肉 & 鍋食べ放題*4: 1,000 ~ 2,000円/食
- 都会遠征して日本食食う 2,500円/回
※ 2名で住んでいたので、一部2名分の値段になっています
仮に上記金額で1名分で考えて、
- 毎日1食は定食を食い
- 2日に1回カフェへいき
- 週に1回焼き肉&鍋食い放題へいき
- 月に1回都会遠征する
とすると、生活費は月額約3.5万円/人になります。多少変動あったとしても月に5万あればかなり満足度は高くなるのではないでしょうか。今回たまたまですが、3階建ての一軒家を別の日本人家族とシェアして、3F部分を1フロア(2部屋+バス・トイレ)まるっと安く借りられたので、家賃を圧縮できてだいぶ助かりました。
こんな感じで生活コストが異常に低いので、少ないお金でも結構生きていけます。これなら凄腕プログラマでなくとも、少ない仕事量で必要最低限は稼げて、残りの時間で個人プロダクトに集中できる環境が作れます。
注意点とマイナス点
ただこのような生活をするには、制約事項も当然ながらあります。例えばこんな事が挙げられます:
- どの国も大抵、年間半年以上滞在する場合は所得税の支払い義務が発生したりする*5
- ガチの田舎だとほとんど英語通じないし知り合いがいないと物件を探すのが辛い
- 突然の断水や停電やネット断はたまにある
- ローカル飯に飽きる (日本食材/調味料をたんまり買い込んでおくことおすすめします)
- ベトナムの場合、共産国なので夜22時になるとほぼすべてのお店が閉まる
- 日本であるような勉強会や社交場には全く参加できないので、情報収集や刺激を得るのが困難
- 作業に詰まった時、オンラインで相談できる人がいないと問題解決までが長くなりがち
具体的にオススメの場所
と、注意点を書いてておもったんですが、ベトナムの片田舎の事例は難易度だいぶ高めですね(笑)。 難易度低めでオススメできる場所は僕の観測範囲だと、タイ、チェンマイの特に乾季(11~3月頃)時です。
以下2015年に書いた記事ですが、貼っておきます。
田舎...というわけではないですが、大都市でもなく、インフラも充実していて気候も良く、程よいバランスです。 もし僕が会社なんかもってたらここにリモートオフィス作りたいくらいです。
作ったもののシステム的な話
巷にある便利なツールをたくさん使って、パッチワークのように組み合わせたアプリで、いわゆるマイクロサービス的な構成になるかと思います。
機能
大体こういうことができますという機能一覧です
共通
- ウォークスルー
- facebookとemailでのログイン/ログアウト
- push通知受信
- VoIPで音声/ビデオ通話ができる
- クレジットカード登録/編集
- プロフィールの編集
- 履歴表示
- カスタマーサポート
- (ユーザ/通訳)モード切り替え
- 各種設定
ユーザモード
- 通訳一覧/詳細表示
- 履歴表示
- お気に入り登録/一覧表示
通訳モード
- 月稼働実績表示
- 銀行口座登録
- 通訳プロフィール登録
使ったツール
アプリで使っているライブラリ群
相当数つかってます(笑)。みなさん、ほんといつもありがとうございます。
Firebase
使っているのはFlameプラン ($25/月)で、使っている機能は
- Authentication
- Database (Firestore)
- Storage
- Functions
- Crashlystics
- Analytics
- Cloud Messaging
- Remote Config
です。全体的に直感的に扱えましたし、とても楽しく実装できました。 特にすごいなと思ったのが、ユーザのonline/offlineステートをリアルタイムに監視/表示してあげる機能は、これの通りにやってすぐできたのでびっくりしました。
Cloud Firestore でプレゼンスを構築する | Firebase
このアプリの場合、通訳者には報酬の払い出し、ユーザには請求をするため、集計する必要があります。そのスクリプト自体はcloud functionsで書いて、定期実行には、gcpのappengine cronを使いました。無駄に作り込んでますね。
The Firebase Blog: How to Schedule (Cron) Jobs with Cloud Functions for Firebase
あと、Firebase関連の情報は、@_monoさんや、@1amageek さんがとても参考になりました。あとアプリを作って後に気づいたのですが、日本のfirebase user group slackチャンネルもあるので参加しておくと第一線の方々に質問できたり、最新の情報が取得できておすすめです。
Twillio
使っていた機能は、Programmable Video です。僕は20$ごとチャージして使う形にしていました。ただ全然使われていないので実質ゼロ円です。悲しい。
ドキュメントが英語ではありますが割と充実していて、この辺を見ながら進めていた覚えがあります。
GitHub - twilio/video-quickstart-swift: Twilio Video Quickstart for iOS with Swift
詰まったときもこんな感じでgithubでissueをたてるとすぐに回答くれて、懇切丁寧に対応いただけたのでとても助かりました。
Stripe
クレカ決済にしていたので、stripeを使いました。他にも決済サービスありますが、世界的に使われていて、ドキュメントもしっかりしているのでstripeにしました。このアプリはCtoCモデルで、双方に支払い/請求が発生するため、当初はConnectを使いたいと思っていましたが、ベトナムが対応していなかったため見送って、以下のドキュメントに沿って普通に実装しました。できあいのUIがあったので比較的楽に実装できました。開発サーバと本番の切り替えもきちんと想定されていて、実装はしやすかった印象です。
iOS Integration | Stripe Payments
pm2
twilioを使うのに、APIサーバを立てる必要があったのと、アプリのpush通知でも必要だったので、pm2でnodeサーバを管理してます。元々expressでAPIを書いていて、expressのサイトでpm2が紹介されていたので使いました。本番/開発の切り替えやロギングなどをやってもらっています。
あと、CPUのコア数に応じてnodejsのインスタンスを増やすクラスタモードにも対応していたので、採用しました。 PM2 - Cluster Mode
AWS
上記APIサーバはAWSのVPCで囲ったec2上に置いています。 無駄に本番/ステージング/開発の3つ用意しました。 サービスが使われてからにしようと思って、ロードバランサーは使っていません。アラートだけ出して、必要に応じて手動でスケールアップ/ダウンしようと思っていました。
バックアップや監視周り
CloudWatch Eventsを使ってバックアップを取り、 CloudWatch Eventsで毎日EBSスナップショットを自動取得する | DevelopersIO
こんな感じでlambdaで指定期間を過ぎたスナップショットを削除しています。 AMI削除時にスナップショットも自動で削除するCloudWatch Events | DevelopersIO
firebaseの方のバックアップは、開発当時は公式になかったのでnode-firestore-backup-restoreをつかっていましたが、正式に発表されたので、今後はそちらを使えばいいかなと思います。@_monoさんの記事を貼っておきます。
Zendesk
問い合わせ窓口として使おうと思っていたんですが、全然使われてないので宝のもちぐされ状態です..。月々4,000円くらいかかっています。 iOS SDKも用意されていて、それを使うと簡単にチャットで問い合わせ画面ができるので便利でした(微妙にNavigationbarにtableviewが潜り込むバグはありましたが)。
Introduction - Chat SDK for iOS - Zendesk Developer Portal
さいごに
今、ソフトウェアエンジニアは日本では売り手市場で特に困ることはないですが、今後10~20年で考えるとどうでしょうか。不安な方も多いのではないでしょうか。毎年戦時下レベルで減り続ける人口*6、G7の中でずっと最下位の賃金水準と生産性*7、一方で増えていく若い世代の負担...。今のうちにと海外に目を向けるエンジニアも少なくないと思います。
ただ海外となった時、いきなり米国や欧州となるとお金や言語面でハードルが高いと感じることが多いのではないでしょうか。その点、東南アジアの国々は物理的にも文化的にも日本と近く難易度は低いと個人的には感じます。また、就労ビザなども米国と比べると取りやすく、経済的にも今後日本にとって更に重要性がましてくる地域なので、起業志向なエンジニアにはチャンスが多いのではないかと思います。
さいごに、もし海外に出たいとか、日本が生きづらいとか感じているソフトウェアエンジニアがいましたら、フツーのエンジニアでもこんなふうに東南アジアで働きながら個人開発で挑戦することもできるのねっていう一事例として、参考にしてもらえたら幸いです。
もし一歩踏み出したいが、何かきっかけや情報がほしい方がいましたらDMください。