『基礎から学ぶ 組込みRust』執筆に寄せて〜Nature RemoへのRust導入の展望〜

Nature株式会社ファームウェアエンジニアの中林 (id:tomo-wait-for-it-yuki) です。 本記事では、拙著『基礎から学ぶ 組込みRust』1がC&R研究所様より出版されたので、書籍の紹介やNatureのファームウェア開発にRustを使っていきたい、ということを書きます。 本を書きましたエントリは個人ブログで書いている2ので、それとは少し違った観点から話をしたいと思います。

『基礎から学ぶ 組込みRust』の紹介

2021年5月現在、Rustはすでにマイナーの域を超えたと言って差し支えない状況でしょう。一方、組込みRustはまだまだマイナーな分野です。『基礎から学ぶ 組込みRust』出版をtwitterやブログで告知した際も、「Rustって組込みできたんだ?」という反応が少なくありませんでした。

マイナー扱いから脱するための施策として、認知度を上げ、入門を手厚くする、というのが王道だと思っています。Rustの入門ドキュメントは素晴らしい書籍がたくさん出ています。組込みRustのドキュメントもRust Embedded devices Working Groupが良いドキュメントを用意してくれています。しかし、Rustと組込みRustとの両方を1冊でカバーしている書籍は、これまでありませんでした。ここでなら私も貢献できそうだと感じ、ちょうどよいタイミングで執筆のお声がけをいただいたこともあり、Rustの文法もカバーした組込みRustの入門書を執筆することにしました (このあたりは先日のShinjuku.rs #153のLT4もご参照ください) 。

『基礎から学ぶ 組込みRust』はRustの文法や組込みの基礎から、マイコンモジュール『Wio Terminal』搭載のデバイスを制御するプログラムを作成する内容です (Rustも組込みも未経験だと、少ししんどいかもしれません) 。ボタンとLED/GPIO 、シリアル通信/UART 、タイマ/割り込み、ブザー/PWM 、光センサ/ADC 、加速度センサ/I2C 、LCD/SPI と組込み開発で頻繁に利用する要素のカバー率は高くなっています。 回路図やデータシートの参照方法から始まり、Rustの抽象化されたAPIをどう扱うかまで解説を書いています。書籍内のサンプルをWio Terminalで動かすだけでなく、その先、自身でWio Terminalにデバイスを追加したり、Wio Terminal以外のデバイスで組込みRustをお試しいただける内容になっていると自負しています。

組込みRustにかける思い

少し話が前後しますが、そもそも私が組込みRustに入れ込んで活動している理由について、少し説明します。 現在、組込み開発ではC/C++が圧倒的なシェアを占めています。C/C++を使うことの是非もあると思いますが、私にとってはそれほど重要ではありません。Cで全てを明示的にハンドリングするのが良いと思う人も居れば、C++の強力なテンプレートメタプログラミングを好む人も居るでしょう。組織としてはC/C++に熟練したプログラマに存分に力を発揮してもらって良いプロダクトを作ることを望むと思います。

その一方で、イケてるRustで組込み開発したい人が増えています。私もその1人です。ではRustの何が組込み開発でイケているのでしょう?書籍では、性能、信頼性、生産性を兼ね備える数少ないプログラミング言語であることを理由として挙げています (詳しくは書籍を読んでみてください!) 。せっかくなので、書かなかったことを書きましょう。

それは「Rustでプログラミングするのが楽しいから」です。確かにコンパイル通すのが難しい時があったり、適当に書いて動かすのが難しい時があったりします。ただ、それは本当はプログラム書くってことは、そういう設計について考えることだよね、って気がします。

オライリーから出版されている『プログラミングRust』5 (通称カニ本) の参照について書いてある章に、私の好きな1文があります。

Rustの本質は、プログラムを理解する苦労を、未来から現在に移すことにある。
プログラミングRust p.120 より

つまり、Rustでプログラムを作る、ということは、コンパイルを通す前に良い設計を考えなければならないのだ、ということを言っています (実際はRust的にはイケてないコードや安全なちょっとダメなコード書いてしまったりするのですが、まあ安全性が担保される設計にはしないといけないので許して欲しい) 。

Nature Remoがそうであるように、今や組込み機器のファームウェアもインターネット経由でアップデートできる時代ではありますが、それでも他のソフトウェアよりはアップデートするのが難しいことに変わりはありません。そのような組込み機器の開発に使うプログラミング言語だからこそ、コンパイル前に良い設計を考えなければいけないRustが適している、と思いませんか?思いますね。思いましょう。

Rustが組込み開発におけるC/C++に次ぐ第3の選択肢になる世界を作っていくのは、人生を費やすに値する挑戦だと確信しています。

Nature RemoへのRust導入の展望

Nature Remoのファームウェアは現在C言語で書かれています。しかし、チャンスがあればRust導入へのチャレンジを積極的に行いたいと考えています。プロダクトでの採用事例は、有無を言わさぬ説得力があります。その際、スクラッチからRustで書き直しました!みたいなことができるとセンセーショナルなのですが、もう少し地味なチャレンジを狙っています (結果が地味という意味で、必ずしも技術的にそちらの方が簡単、という意味ではないです)

まず第一に、Nature Remoのファームウェアは良い感じに書かれており、あえて全てをスクラッチから書き直す必要性はあまり感じていません。元々がC言語なので性能上の問題は存在しませんし、メモリリークバッファオーバーランもおおよそ潰してあるので安全性の面でも全面的に書き直すほどのモチベーションはありません。 そのため、全面的に書き直すよりは、使えるものはそのまま使いつつ、新規開発する部分や現時点でどうしても書き換えたいところだけをRustで書くのが理にかなっています。

また、プロダクトのファームウェアをスクラッチからRustで書くことができるのは極々一部で、C/C++の資産を使いたい、というのが大半だと考えています。そのため、C/C++の資産がある中で、小さくRustを導入するケースを作る、というのが、わたしよし、Natureよし、世間よしの三方よしな気がしています。

Rustが組込み開発で当たり前に選択肢になる世界、を目指して、今後もコツコツできることを積み重ねて行きます。 開設したエンジニアリングブログの第2弾で会社で採用していない技術を紹介させてもらえているように、Natureはそのようなチャレンジを応援してくれる会社です。

エンジニア積極採用中です

Natureでは一緒に開発してくれる仲間を募集しています。カジュアル面談等も歓迎なのでその場合はTwitterなどでお声がけくださると嬉しいです。

https://nature.global/careers/job/

Nature Remoやその関連サービスで使われている技術と今後の展望

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 EchoGoogle 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で開発し、iOSAndroid向けにアプリを提供しています。

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/

Appendix

eh-career.com