Moffの採用しているソフトウェア技術についてまとめてみた

# TL;DR

会社の技術紹介記事がないと思ったので、描いてみた。

# 背景

Moff AdventCalendar第１週終盤は弊社のソフトウェア技術周りで使っている技術を紹介したいと思います。
# MoffBand
http://www.moff.mobi/
当社の製品、MoffBandです。加速度センサ、ジャイロセンサ、BLuetooth(Bluetooth Low Energy)搭載の小型デバイスです。コイン電池で最大２０時間の継続利用ができます。当社のいくつかのアプリ利用時に接続して使います。

# アプリケーション
## ネイティブアプリ
### Unity
ゲーム要素とアプリ上の3Dレンダリングをする要素を考慮して、Unityを採用しています。
UnityからiOSもしくはAndroidアプリをビルドしてリリースをしています。
センサーデータを用いてリアルタイムにセンサーから発せられたデータを元に何かを描画することもあるため
ReactiveXを活用することが多いです。

### iOS
MoffBandを接続するためのSDKをiOSのプロジェクトにして用意をしております。
こちらもUnity同様、RxSwiftで一部センサーデータを受け渡すメソッドを実現しています。
また、iOSだけで開発したネイティブアプリもあり、MoffBandを使わないようなアプリでシンプルなものを要求される場合はiOSだけで完結させています。

## Webアプリ

### React.js

ネイティブアプリとセットのサービスとして、帳票やユーザーのデータ閲覧のための機能はWebで実現しています。当初はVue.jsを活用していた時代がありましたが、現行は全てのプロダクトではReact.jsを用いて実装しています。一番最初のプロダクトのリリース当初はReact.js周りのドキュメントが充実していたこともあり、以降もRaect.jsを使ったプロダクトで培ってきたノウハウで新規でもReact系列でのSPA開発を進めています。

#### Redux
上記の通り、当初はReduxによる状態管理でWebクライアントを実装しました。Redux-Router, Redux-Formを多用しています。

#### Redux-Saga
プロダクション環境で作ってきたSPAをメンテナンスしていくと、次第にReduxによる処理の記載量が膨大になることが技術的に課題になってきました。記載量もそうですが、単純に設計が読み取りづらくなったのもあります。以降の新規プロダクトにはRedux-Sagaでそこの部分は解消しつつあります。

### TestCafe
機能が複雑になったり、増えてきたこともあり、少人数で運営するには少して厳しくなってきたので、テストコードを徐々に増やしていきました。E2Eテストも複雑な要件が増えてきたので、これを解消するためにTestCafeでそれを対処しています。以降E2Eでの確認工数は爆下がりしているので、Jestでの単体テストと合わせて実装することで開発効率を向上させることができました。

# バックエンド/DevOps
## AWS
### Serverless
ヘルスケア事業での最初のサービスでインフラを構成するためにServerless(Cognito+API Gateway+Lambda+DynamoDB)での最小構成で実装しました。もともとAWSで直に設定してβ版をオープンした後、CloudFormationでテンプレ化し、リリースして１年程度すぎたあたりでServerless Frameworkへの換装を行いました。以降バックエンドでの改修・リリース管理はServerless Frameworkによるコード管理になるので、改修管理が比較的楽になりました。

### Kinesis
センサーデータを直に保存する場合はKinesis系統の技術で対処しています。
リアルタイムにデータが欲しいケースであればKinesis Data Streamを使い、遅延してもいいケースであればKinesis Firehoseを使います。

### Athena
ログデータや、センサーデータにアクセスするために大量のデータをロードする必要があるので、Athenaで対処しています。例えばKinesis経由して溜まってきたS3上のデータを解析するためのダッシュボードを考える場合などで活用しています。

### DataPipeLine
Serverless構成のデータベースのバックアップを取るためにS3でするためにDataPipeLineで保存しています。DynamoDB Backupがリリースされて以降も特に手は入れていませんが、ゆくゆくはそちらも起動してことを想定しています。

### StepFunction

Advent Calendar4日目の記事でも描きましたが、バッチ処理でDynamoDBからデータをCSVに整形する部分をバッチ処理できるようにしています。体系的な処理を書いて何かする分には非常に有効かと思います。後々のAdvent CalendarでもStep Functionの活用事例がでてくるのでそちらも参考になれればと思います。

## CircleCI
ヘルスケア事業での最初のリリース時には導入しませんでしたが、Serverless Frameworkへの以降を機にテストを徹底させるため、導入を決めました。本当はCodeBuildでもできる内容ではあるのですが、料金でも一定額で維持できること（ちなみに今は従量課金版もありますが）を優先してそうしました。
現行では、ほとんどのインフラ系リポジトリ対してはCircleCIが必ず動くようになっております。
また、E2EテストもCircleCI上で実行できるようにしており、SPAに関してはテストの自動化を実現できました。（ちなみにテストのカバー率はまだまだこれからですが、量産するだけの状態ではあります。）

 
# その他
## Amazon Connect

Advent Calendar2日目の記事でも紹介していますが、コールセンターを設立するために活用しています。
あまりエンジニアリング要素が他の技術に比べて決して多くはないですが、この令和の時代でも対面を大切にする業界においては、今後も活用していく流れになるかと思います。

# 分析業務

## Google BigQuery
DynamoDBから抽出したデータのimport先としてGoogle BigQueryを活用しています。Athenaでもいいのかもしれませんが、料金的にはいまだにこれで無料でやり続けているのでしばらくはこれを使うことを想定しています。~~でもそろそろAthenaかもなあ。~~

## Pandas/Numpy/Scipy/Jupyter Notebook
ヘルスケア事業として提供しているサービスはBtoBtoCのサービスではないかと考えています。例えば病院であれば、その患者さんに利用してもらって初めてデータとして有効活用できるます。よって、toBのクライアント、そのクライアント先で使われている利用者（toC）の利用状況をみることはサービス改善を行う上では非常に重要です。一時的な分析はエンジニアリングの知見を持っている人たちにとってはコーディングで解決する方が効率的なので、PandasをメインにJupyter Notebookを使ってデータの可視化作業と前処理したデータ提供を行なっています。分析定例も実施しており、その場でJupyter Notebookを参考までに共有するようにしています。

## Tableau

Google BigQueryから定常的に観測するようなデータはTableauでデータシートを作ってしまい、定期的にSlackにてダッシュボードを配信しています。これで重要なKPIをウォッチしています。

# まとめ・展望

* 弊社の開発で採用している技術を紹介しました。
* 特色もいくつかピックアップしました。興味あったらぜひコンタクトください。

次の土曜日は開発の運用に関して共有します。ありがとうございました。