私は今ウミトロン株式会社で、水産養殖に使うIoTデバイス、およびそれを用いたサービスの開発をしています。
IoT デバイスのプログラミングに Go を採用しているのですが、そういった例はあまり多くないということで、理由について書いてみます。自分は IoT の開発は今の会社が初めてなので比較が色々と難しいのですが、Raspberry Pi の使用例の記事によくある Python や Node を使っているようなケースとの比較と、あとは C / C++ 等のコンパイル言語に比べた時の Go の特徴が生きてくる理由の紹介になります。
サービスについて
デプロイがいつでもできるわけではない
水産養殖に使うIoTデバイスということで、デバイスを海で動かしています。ネットワークは無線ですし、電力はソーラー。デバイスを使うのも充電も昼間のみなので日が沈んだらスリープ状態にしますし、そもそも主電源をユーザーが切る可能性もあるので、我々サービス提供側が必ず操作できるとは限りません。
シングルバイナリにしたい
プログラムをシングルバイナリにできると、VM や、ネイティブコンパイルが必要なライブラリなどの実行環境をデバイス側にもたなくていいので、実行環境のメンテナンスコストが小さくなりデプロイ時に考えることが減ります
信頼性が上がる選択をしたい
IoT デバイスは、台数が規模に対して多くなりがちですし、デプロイが失敗したときのロールバックの対応コストが高いので、デプロイのコストがウェブサーバへと比べて高くなりがちです。
そこで、コンパイル時にエラーが発見できる、コンパイル言語を使う方が有利になります。また、Go であれば C++ と比べてメモリ管理のような複雑な問題を抱える心配も減ります。
I/O 速度が異なるデータへのアクセスが多い
プロダクトとして提供しているデバイスでは複数のセンサーが繋がっていたりログを収集しているので、複数のデータにアクセスしており、HTTP のほか、GPS、BLE、I2C などのそれぞれ I/O 速度が異なります。
Go は goroutine を使った並行処理が標準の方法として使えるので、I/O 待ちが発生する処理がたくさんあっても比較的簡単に扱うことができます。
開発について
クロスコンパイルを簡単に使いたい
Raspberry Pi を使うときは CPU が Arm なので、Macで開発するにはクロスコンパイルが必要です。Go は Arm のクロスコンパイルを標準でサポートしてるので、 go build
コマンド実行時に環境変数で指定するだけです。
習得難易度が低い言語にしたい
まだ会社の人数が少ない中で、Ruby や Python などのサーバアプリケーションの開発もするエンジニアがデバイスプログラムの開発もしています。
個人的な意見ですが、一応やったことのある C も C++ に比べ Go が一番 LL に近い感じがあって圧倒的に簡単でした。すぐ動くし。