本記事はAWS Startup Community Advent Calendar 2021の20日目です。
ポエム、というかいろんなことを赤裸々に語ろうと思います。が、一回とめどなく書いたらとても文章が長くなったのでかいつまんで書き直しました。もし内容的に興味がある部分があったらTwitterのDMとかそういうので聞いていただければと思います。
はじめに
タイトルには半年とありますが、正確には2021年6月より株式会社Singular Perturbationsというスタートアップにジョインしています。弊社は「いつ、どこで、未来の犯罪がおきるか」を予測するシステムとその結果を用いたSaaSを提供しています。
会社としては2021年11月に初の資金調達をしたまだシードラウンドの会社です。
犯罪予測システム開発のSingular Perturbations、シードラウンドで総額1億円の資金調達を実施|株式会社Singular Perturbationsのプレスリリース
なぜ入社したか
さて、僕自身の話を最初に少しすると前職は外資のクラウドベンダー、前々職は国内SIerで働いていました。
ここらへんの話は以前にイベント登壇したときの資料に簡単に書いています。
なぜ入社したかという点についてもこのスライドに書いているんですが概ね以下のような理由です。
- 開発者、マネージャーというのを2度ほど繰り返したことで、次は何かというのをこの数年考えていた
- 社会課題の解決に自分のこれまでの知見で貢献したかった
- 自分のキャリアを振り返った時に経営観点での経験が足りないと感じていた
- そんなわけで次にやるなら自ら起業か、事業会社の責任者的なポジション
- 自分がいいなと思える事業じゃないと嫌なので積極的な転職活動はしていなかった
そんななかで今の代表から連絡をもらったのがきっかけです。1番最初に連絡をもらったのはもう1年以上前で何度も色々と会話しました。
上であげたことが満たされているのはもちろん、実現しようとしていることに加えて自分の娘の将来とか考えたときに少しでもいい世界を残せたらと思いジョインすることを決めました。
僕はこの会社に取締役CTOという立場でジョインしたのですが、この時点でフルタイムのメンバーは社長だけでした。
また、弊社は研究サイドがとても強力なのですが基本的にはパートタイムだったり副業として手伝ってくれている人たちです。みな社長と関係の深い方々で名もある方々なのですが詳細はあまり言えません。
そして、エンジニアサイドはそれまではインターン1名と開発会社に委託する形で開発されていました。このインターンの人はとても優秀だったのですが、今年からM1ということであまり時間を割けなくなっている状況でした。
当時フルタイムが社長しかおらず、調達前という状況に飛び込むのは珍しい、勇気があると周りの人にはよく言われました。
でも、僕個人としては「リスクはあってもデメリットはない」と思ったのです。
そうは言うものの、2人目の子どもが生まれようというときにそういう選択をしようとする僕を何一つ咎めることなく応援してくれた妻には感謝しかありません。
何をしてきたか
さて、そんな感じでジョインしたのですがここからはやってきたことをざっとお伝えします。といってももちろん僕1人がやったわけではないです。全てのdirectionは僕がしているものの、実際に手を動かして開発する人としては業務委託で手伝ってくれてる人にめっちゃ助けてもらってます。
バックエンドAPIの作り直し
これは実は正式にジョインする前にこっそり手伝った成果なのですが、犯罪予測結果を元にした警備ルートを算出するAPIというのがありまして、これのバージョン1をとある開発会社に委託していたのですが、いろんな事情により作り直すという状況になっていました。ルーティングのアルゴリズム自体はリサーチャーが開発したのでこれをAPIとして動かす部分とその基盤をまるっと作り直しました。
これはPython、FastAPI、Uvicorn、AWS Fargateとかで作りました。
脱EXPO
弊社のモバイルアプリはReact Nativeで作られているのですが(これは僕が入った時点でそうだった)、Expoを使って開発されていました。Expo自体が悪いわけではないのですが各ネイティブOSを抽象化するような形でReact Nativeがいてさらにその上にExpoがいるということでとても便利な反面、デバイスのAPI周りのサポートは少し遅い印象があります。事実我々はAndroid版でとあるGPS関連の機能で課題を抱えていたのですが、最新のAndroid SDKバージョンだと解決しているのにExpoのサポートがまだで見通しも立たないという状況に立たされました。
そこで脱Expo、俗に言うExpo Ejectをすることにしました。Eject自体はすんなりと行ったのですが、利用していたExpo由来のライブラリのいくつかはまだ残っている状況です。これらは少しずつ減らしています。
Jestの導入
さて、この件に関しては実は過去にこっそり発表しています。簡単に言うとテストが一切なかったんですね。そこでテストの実装とともにテストを動かすための環境を作っていくということをしようとしたのですがこれがすんなりいかずなかなかに苦労させられました。
ことの成り行きはこの資料を見てもらえばいいとして、結局無事に導入できて現在はReact Testing Libraryと組み合わせて使っています。ちなみにReact Testing LibraryとはKent C. Dodds氏によるライブラリで有名なAirbnb製のEnzymeを追い越す勢いで人気が出ています。Enzymeも検討したんですがRTLを使うことにしました。
react-native-background-geolocationへの移行
これもモバイルアプリの話です。弊社のアプリではGPSによる位置情報のトラッキングの機能があるのですが、これをバックグラウンドで動かそうとしたときにAndroidではいろいろと面倒なことがおきます。iOSでは起きません。
AndroidではバックグラウンドでのGPSによる位置情報へのアクセスというのが厳しく制限されています。その結果、バックグラウンドなのにforegroundで動かす必要があるというちょっとよくわからない状況になります。これがReact Nativeだとさらにやっかいだったりします。具体的にはバックグラウンドに行ってる間の位置情報が正しく取得できていなかったり、アプリがバックグラウンドにしてしばらくすると落ちてしまったりとまあかなり細々とした問題が多くて大変でした。
それまで使っていた expo-location
ではうまくいかず、公式とも言えるreact-native-geolocation
でもうまく行かず。行きついたのがreact-native-background-geolocation
。
おそらくReact NativeでバックグラウンドでGPSを扱うライブラリってこの3種類しかないんじゃなかろうか。そしてこの最後に選んだやつはAndroidで利用する場合は有料。だがしかし、これで我々のやりたいことは解決した。この件は業務委託で手伝ってくれてるOさんがめっちゃ頑張ってくれた。感謝。
デザインリニューアル
僕がジョインした当時はv2というバージョンだったんだけど入社翌月の7月に商用リリースが控えていた。一方でアプリはUXとかUIの問題を抱えていた。そこで僕は最低限のデザインガイドに沿うのと、バラバラの形だった各コンポーネントを揃える、全く足りていなかった細かい諸々(ライセンス表記のページとか問い合わせとか)を追加すべくデザインの見直しを決断する。
残り2週間しかなかったけど、なんとか間に合わせることができてv3として無事にリリース。これもOさんが頑張ってくれた。
Webアプリケーションの開発
管理者向けのWebアプリケーションの開発にも着手した。当初は2ヶ月くらいで最初のバージョンを作ってだそうとしていたんだけど、割とすんなり出来上がったもののユーザーストーリの深堀りとかが甘く少し停滞。その後、紆余曲折あって最近開発が再開し、ユーザインタビューの結果大きく方向修正をしているところ。
これもあと1ヶ月ちょっとで今度こそベータ版が出せると思う。
なお、これはReact、Next.js、TypeScript、Storybookな感じで作られてるんだけど、礎となるものを作ったのはSさん。彼は自分のプロダクトをリリースすべく旅立っていって今は新しい人に入ってもらってる。ちなみにこの方オンボーディングが早くてとても助かってる。開発を途切れさせることなく進められた。
国際化対応
これは夏頃に急遽持ち上がった話。とはいえ、弊社のサービスは当初から海外を主戦場として考えていたこともあっていつかはやることにはなっていた。が、とある海外の組織の人にデモしたり、PoCするかもって話になってあわてて対応。
当初モバイル側から検討をはじめて、react-intl (Format.js)
, react-i18next
, react-native-localize
あたりを簡単に比較検討したのだけれども既存メンバーのこれまでの経験とかも参考にしつつreact-intl
を採用した。
これはWeb側も同様でどちらもreact-intl
を採用しているんだけど、Web側は試験的にMessage Extractionもやっている。
ビルド自動化
これはExpoをEjectしたタイミングで実施。というのもデプロイ周りがExpoはとても楽なんだけどEjectしたことで自分でちゃんとやる必要が出てきた。React Nativeのビルドって普通にやる場合はXCodeとAndroid Studio使ってやるんだけどそれもなんだか面倒だなと感じたのでBitrise
を導入。
今はBitriseでdevelopment
ブランチとmaster
ブランチに更新があったら自動でビルドが走るようになっている。今はIssueの対応でfeature branchを切ってdevelopmentにプルリクって方式を取ってるのでマージされるたびにビルドが走っている状況。なのでいつでも最新のapkとipaを用意できて実機へのテストインストールやTestFlight使った配布、実際の申請なんかが簡単にできるようになった。
なお、CIに関しては今はGitLabのCI/CDを使ってる。
モニタリング環境の導入
そもそも監視とかそういったものは行われていなかったので最低限のものを導入。
これは2つの話があって、まずインフラ的な部分のモニタリングをCloudWatchでやっていたんだけどやはり使い勝手はいいとは言えないのでNew Relicを導入。導入にあたってNew Relicにいる元同僚に真面目に紹介してもらったんだけどNew Relicいいよね。単なるモニタリングツールというより人が見るモニタリングの一歩先へって感じで。でもまだ全然使いこなせてない。
そしてモバイルのクラッシュレポートとしてFirebaseのCrashlyticsと比較検討した結果、Sentryを導入。導入はしたもののこちらもまだ活用できているとは言えない。なお、WebアプリのほうはNew Relic Browserを仕込んでいる。
採用
そして採用である。これも2種類あって、業務委託で手伝ってくれる人を探すのと正社員を探すのと。
結構な数のカジュアル面談や面接をしてきたのだがなかなか厳しい。前職でも結構な数の採用面接とかやってきたけれど今の会社のほうが採用の観点ではとても難しさを感じている。
理由は大きく3つ
- 会社の認知度の問題
- 報酬面
- シードラウンドという状況
まず1つ目であるが、そもそも無数にあるスタートアップの一つにしか過ぎない弊社のことを知っている人なんてそうそういない。さらにこれまで弊社はあまり対外的なPRというのをしてこなかったのもありググってもあまり情報がない。これに関しては僕が入ってからなるだけプレスリリースを打っていこうという方針にして最低月1記事を目標にやっている。そして多くの記事の下書きを書くのも僕だ。
次に2つ目。やはりシードのスタートアップでは出せる金額に限界がある。もちろん大量に採用しているわけでもない。ランウェイ半年とかならそれも可能なのかもしれないが。また、スタートアップに行きたいと思う世のエンジニア(に限らないが)たちも一言で「スタートアップ」というけどその会社がどのラウンドにいるかで資金力も何もかも全然違う。だからシリーズDとかのレイターにいるスタートアップで報酬面を比較されると正直厳しいところはある。そうはいってもこのラウンドのスタートアップにしては出しているほうだとは思う。もっと低くなるかと思っていたという言葉も2,3いただいている。その人たちは結局別の理由で入社にはいたらなかったが。
そして、最後。やはりこのラウンドの会社に入るのは勇気がいるのだろう。それはまあそうかも知れない。その分夢もあるけどね。個人的には大企業にいる人は一度冒険しておくとキャリア形成の観点ではプラスになるとは思っている。その企業が成功するかどうかは関係なく、だ。もちろん成功しているほうがいいし、弊社も成功することを目標に突っ走ってはいるのだけれど。ぶっちゃけ、それなりの人は仮にうまくいかなくてもどこかしら次の職見つけられると思うのでチャンスがあればチャレンジしておくといいと思うよ。上のほうでも言ったとおり「リスクはあってもデメリットはない」から。
最近ではエンジニア採用はMeetyのカジュアル面談を活用していて、そこからのヒット率が高い状況。というわけで貼っておきます。
なお、現在は事業開発とかバックオフィスの人を絶賛募集しておりますので興味を持った人、話を聞いてみたいと思った人などはぜひカジュアル面談からいかがでしょうか。お待ちしています。
Analyticsの導入
とにもかくにもまずは計測からってことでGoogle Analyticsを導入。
対象はリリース済みのモバイルアプリとコーポレートサイト。これ自体はそんな大した話ではないんだけど、モバイルに関しては少しだけ罠が。
React NativeでFirebaseを使ってるんだけど、SDKがなぜかReact Native FirebaseではなくFirebase SDKを使っていて。理由については当時の選定理由を記憶している人が誰もいないということでわからないんだけど、Firebase SDKだとReact NativeでAnalyticsを仕込むことができない。
というわけで検証した上でAnalyticsのみReact Native Firebaseを使うことに。つまり併用している。今のところ問題なく動いてます。将来的には全部寄せたい。
開発プロセス作り
僕が関与した当時は研究者ばかりでソフトウェア開発の経験があるものがおらず、開発自体も開発会社に委託していたこともあり定まったプロセスというものが存在していなかった。
そこで開発会社に委託することをまずやめてフリーランスの人への業務委託に切り替え、そしてひとまず最低限のブランチ戦略とバックログ管理、スプリントの設定ならびに朝会の実施あたりをやってます。
ポイント見積もりとかはやってません。ちゃんとしたスクラムを導入することも考えたものの今の人数感とフェーズだとそれをやるのはあまり得策ではないなと考えてやってません。レトロスペクティブなミーティングとかも今はまだやってないです。つまりなんちゃってスクラム開発ですね。もう少し人が増えたらやりたい。
MapBoxの検証
これはまだ検証だけです。今までReact Native Mapsを利用して地図表現をしてきているのですが、これは実際にはGoogle MapもしくはApple Mapsで表示されます。
これまでそれで特に問題なかったのですが、地図デザインの観点と利用規約の観点からMapBoxへと移行することを検討しています。利用規約の観点というのはスクリーンショットをWeb等に掲載できないことと、ナビゲーション機能の実装が許されていないことです。
というわけで既存のアプリをMapBoxに切り替えて表示してみて色々試したのですがひとまず表示は問題ないです。ただ、2点課題があってそれが本格導入まで至っていない理由です。
1つはMapBoxの公式SDKがReact Native向けはないことです。ただこちらは公式でもOSS版を案内していますのでこちらを使えばいいかとも思っています。
もう一つはシミュレータ/エミュレータで動かすとなぜかめちゃくちゃ重いんです。ただ、これがちゃんとビルドして実機で動かすとそうでもない。この点をもう少しクリアにしたいなーと思っているうちに他のことに忙殺されました。
ただ、MapBoxへの切り替え自体は決定です。これはWebもですね。
最近着手したこと、やりたいこと、悩み
そんなこんなでいくつかやってきたのですが最近はこんなことに着手をしています。これもまた僕だけではなくいろんな人に手伝ってもらってます。が、どれもやりたかったことにようやく着手できているとも言えます。
UXとUIの見直し
これはもう言葉通りなんですが、ユーザ体験を全体的に見直すべく11月から新たにUXデザイナー2名を迎えてスタートしています。話を聞くだけでなるほどなーと思うことも多々あるのですが、モバイルとWebそれぞれの現状のフローを可視化しつつ機能の見直しや導線、表現の見直しみたいなことを始めています。あと、ユーザーインタビューも。
月次データ更新処理の自動化
犯罪予測をするためにはインプットとなるデータをいろんなところから取ってきて、前処理をした上で予測処理をして、後処理をして〜みたいなことをするんですがこれがこれまではなんと手元のラップトップで手動で動いていました。月に一回僕が自分のMacで実行していた感じですね。ただ、ここって弊社の事業の根幹でもあることからスケーラブルかつ堅い仕組みを整えたいと常々思っていたのですがこれまでは僕以外はフロントエンドのエンジニアしかいなかったこともあり、後回しにしてきました。それが12月から新たに超優秀なサーバーサイドエンジニアが社員として入ったので彼に早速やってもらってます。彼は社員第一号でPh.Dです。最近はいつもソースコードしか見てなかったので、久しぶりにアーキテクチャのディスカッションとかしたのですが楽しいもんです。これがひとまず完成した暁には月次と言わずもっと短い頻度で動かせるようになります。
研究成果をどう実用化するか
最近の一番のテーマはこれです。弊社には研究サイドとエンジニアサイドがあるんですが、僕が統括しているのはエンジニアサイドです。で、研究サイドで初期開発が行われるものもあって、それらは弊社では基礎技術とも基幹技術とも言えるようなものたちです。先にあげた犯罪予測システムなんかがそれにあたります。が、やはり研究者の書くコードは研究者の書くコードであって、プロダクションに持っていくことがあまり想定されていないことが多いのも事実です。スケーラビリティやメンテナンス性、あとは秘伝のタレ状態で構築されている手元の環境以外でも動くこと、何度でも簡単に再現できることとかですね。もちろん全部が全部そうだとは言わないですが、このあたりが足りていないことが多いのでそれらをどう持っていくべきなのか研究者に負担かけず、かといってエンジニアサイドにも負担になりすぎないような良いプロセスはどういったものなのか、というのを考えています。Twitter等で聞くと書き直すしかないという意見も多く、そうなのかーと思いつつも人的リソース的にも厳しいしいい落とし所がないかと日々考えています。
海外展開
以前にプレスリリースを出したのですがJICA (独立行政法人国際協力機構)の民間連携事業の一貫として採択されています。
記事中には明記していないですが、これがブラジルをターゲットにしているものでして最近はそっち方面の話も徐々に進んでいます。といっても技術的な話が具体化してくるのはもうちょっと先の話ですが。
そしてそれ以外にもお陰様でいろいろとお話があり、同時並行的に進行中です。
まとめ
そんなわけで1年前とは状況が大きく変わったけれど、日々楽しく過ごしています。