Nature株式会社VPoEのid:Songmuです。当社でもエンジニアリングブログを始めることにしました。
NatureはIoTスマートリモコン製品のNature Remo1を主力製品としていますが、家庭の電力マネジメントのためのIoT製品スマートエネルギーハブNature Remo E2や、電気小売事業のNatureスマート電気3も提供しています。目指すところはクリーンエネルギー100%の世界の実現で、お客様に利便性と同時にエコであるという、気持ちの良いライフスタイルを提供したいと考えています。
先日、Nature Remoは累積販売台数30万台を越えました4が、エンジニアはハードウェアエンジニアが2名、ソフトウェアエンジニアが8名の体制です。ハードウェアも含め、技術領域が多岐にわたっているため、まだまだエンジニアを募集中です。
さて、今回は最初のエントリということで、Natureで使っているソフトウェアの技術スタックや今後の展望を軽く紹介したいと思います。これは現状の状況を踏まえて選定しているものであり、当然今後は必要に応じて変化させていくことが前提です。
クラウド
AWSをメインで使っています。Google Nestとの連携部分でCloud Functionsを使ったり、FirebaseなどGoogle系のサービスも一部利用しています。インフラの管理にはTerraform、監視にはDatadogを利用しています。
お客様も継続的に増加しており求められる信頼性も上がっています。今後サービスが拡大してく中でも安定性を維持して、より安心してお客様にサービスを利用してもらえるように継続的な改善に取り組んでいきます。数年で100万台規模を目指しているので、それにも耐えられるように、アーキテクチャ変更が必要になるかも知れません。
バックエンド
ほぼ全てGoで書いています。一部、LambdaやCloud FunctionsでNode.jsを使っています。Goは開発速度と実行速度のバランスを取りやすい優れた言語だと感じています。
アプリケーション実行環境にはAmazon ECSを使っています。フロントエンドではAWS Amplifyを利用しています。
一部、Amazon EchoやGoogle Nestとの連携のためにLambdaやCloud Functionsを使っていますが、他の部分でFaaSはあまり積極的に活用しているわけではありません。
Nature Remoのシステムは、IoTデバイス側には、リソースの制約もあるため、あまり複雑なことをさせず、代わりにバックエンド側にコアなロジックを持たせています。なので、何気にバックエンドが担う部分は大きいです。安定させながら機能追加をしていくことがチャレンジングな部分です。
データストア
Amazon Aurora MySQL, Amazon ElastiCache Redis, Amazon DynamoDBを使っています。メインのデータはMySQLに保存する方針ですが、RedisはキャッシュやPub/Sub用途、DynamoDBは時系列データのようなデータを保持するのに活用しています。
以外にも割とオーソドックスなバックエンドのスタックを活用していると思われるのではないでしょうか。
特殊な点としては、20万台を超えるNature Remoが僕たちのシステムに常時接続しているので、そこのハンドリングが難しかったり、内部的なメッセージングにRedisのPub/Subを使っている点などがあります。
モバイルアプリケーション
React Nativeを採用してTypeScriptで開発し、iOSとAndroid向けにアプリを提供しています。
React Nativeは使い物になるマルチプラットフォーム向けのフレームワークとして認知されるようになったと思うのでそれ自体の評価はしませんが、少人数チームで機能やデザインの整合を取りながら高速に開発できる点でも今のNatureにマッチしていると考えています。
実際、月に2,3回は新しいバージョンのアプリのリリースをおこなっています。
モバイルに関しては、お客様が実際に多く手に触れる部分なので、継続的に改善し続けたいと思っています。Nature Remoはデザインを評価いただくことが多いですが、継続的に変更できていることが、それの一翼を担っているとも考えています。
ただ、お客様の数も増えてきてお客様の層も変わってきているため、テクノロジーにそれほど明るくない人でも使いやすいようにUI/UXを変化・洗練させていく必要があります。そのため、今年は、大きめの変更を目論んでいます。
フロントエンド
Natureスマート電気の開発は、僕らにとって初めてのブラウザアプリケーション開発でしたが、SPAの開発には当然ReactとTypeScriptを使いました。状態管理にはRecoilを採用しました。
ここは3月にサービスを立ち上げたばかりなので、お客様の要望を聞きながら改善にとりくんでいきます。Nature Remoとインテグレートした機能にもつなげたいとも考えています。
組み込みFirmware
組み込みのFirmware開発があるところがIoTを扱っているスタートアップならではです。
現状はマイコンボード上でのC言語開発となりますが、Rustが好きで得意なエンジニアもいるため、チャンスが有ればRustを導入したいと妄想しています。
組み込みに関しては、トラブルを少なくするため、デバイス側のFirmwareは現状シンプルな作りにしています。ただし、最近は赤外線だけではなく、Mornin' PlusやQrio LockといったBLEデバイスとの連携機能を作る局面もでてきており、Firmwareに求められる複雑性も増しています。また、今後は体験の向上のため、よりエッジ側で素早く処理するために、デバイス単体でできることも増やしていく必要があるとも考えています。
機械学習
機械学習関連の機能も強めていきたいと考えています。今は、AWS GlueでParquetデータを作って内部的な分析に使ったり、バッチで定期的にスコア計算したりしているくらいですが、僕たちは多くのセンサーデータや電力データを保持しているためそれらを活用して以下のような機能につなげていきたいと考えています。
- 家電の自動制御をより賢く
- お客様の利用電力の需要予測
- 小売事業における電気の買付の最適化
- DR(Demand Response)の自動化
- 将来的な電力P2P売買サービス時のマッチング
エンジニア積極採用中です
ということで、駆け足でNatureのソフトウェアスタックを軽く紹介しました。ここにも書いたとおり、まだまだやりたいことがたくさんあるので、一緒に開発してくれる仲間を募集しています。カジュアル面談等も歓迎なのでその場合はTwitterなどで僕にお声がけくださると嬉しいです。
https://nature.global/careers/job/