2021年1月に先進技術部門に中途入社した賀来 大輔が
当社のOJTで作成した社内システムをご紹介します。
※Fusicでは、エンジニアの新入社員に対し、数か月間の教育制度を導入しています。
エンジニアとしての技術力向上や、
一人でクライアントとやり取りができるようになることを目的とし、
OJTを実施しています。
==============================
1. イントロダクション
こんにちは。
フランスから帰国後、2021年1月に36歳Web開発業務未経験で
IoTエンジニアとして入社した賀来(かく)です。
ありがたいことに、入社から3か月間は研修期間を設けていただきました。
Ruby、Ruby on Rails、JavaScript、SQL、AWSを学びながら
それらを総合して社内のIoTシステムを開発するという課題を与えられました。
参考Qiita:未経験入社3ヶ月でAWSソリューションアーキテクトアソシエイト(SAA)に合格できた内情を記します
2. 企画
2-1. 概要
Fusicのオフィスには、
“福岡県うきは市のお寺に、数百年に渡ってコンコンと湧き続けている水”という
清水湧水(株式会社清水:以下、清水様)のウォーターサーバーが設置されており、
社員はいつでも美味しい水を飲むことができます。
※清水様の清水湧水はこちら
この替えの水ボトルは、バックオフィスの社員が在庫管理や発注を行っていますが、
リモートワークの増加もあり、在庫確認が難しく
発注漏れにより、ストックが切れてしまうことが時折ありました。
そこで私の開発課題は、
「ウォーターサーバーの替えボトルの在庫管理を、IoTの力で効率化せよ!」というものでした。
Fusicの開発研修は人によってカスタマイズされていますが、
私の場合は、プログラミング部分だけでなく、その上流の企画・設計の段階から任せていただきました。
この点、我ら駆け出しエンジニアが見落としがちかもしれませんが、
サービスの開発というのはプログラミングだけではありませんよね。
・誰のどんな問題を解決するのか
・どんなシステムを作るのか
・どんなアーキテクチャを組むか
・どんな要素技術を使えばいいか
・デザイン、画面設計をどうするか
・ページの遷移をどう設計するか
・データベースをどう設計するか
上記のように、考えなくてはならないことがたくさんあります。
また今回は、水の在庫管理をしている社員という特定のユーザー(お客様)がいるため、
ヒアリングしたりソリューションを提案したりというコミュニケーションもしなくてはなりません。
2-2. アーキテクチャ
当初は、「ようそぎじゅつ?」「アーキテクチャ?」……何それ美味しいの?というレベルでしたが、
Googleで検索したり先輩のヘルプを借りたりして、下図のような設計図を描くことができました。
今回のアーキテクチャは、大きく分けて以下3つから構成されます。
・デバイスとして、市販の体重計
・AWSサービス
・Ruby on Rails
デバイス側はIoTチームの花園が担当してくれることになりました。
3. 開発&実装
3-1. 実装開始
2021年1月28日から取り掛かり始めた企画が固まり、実装に手を動かせる準備が整ったのは2月15日でした。
まずは体重計デバイスから重さのレポートを受け取り、
Slackで担当者に通知する役割を担うAWS側の実装から始めました。
簡単にアーキテクチャを説明すると、まずデバイスがAWS IoT CoreにWi-Fi経由でレポートを送信します。
このレポートはタイムスタンプ(重さ計測及び送信日時)と、ボトルの重さ(ボトルの在庫数)で構成されています。
IoT Coreはそのレポートを、DynamoDBというデータベースに格納します。
これをイベントとして、DynamoDB Streamsという機能を使い、Lambda関数を呼び起こします。
このLambda関数が、水の在庫が十分なのかを判断し、
「少ない!注文しなくては!」となるとSlackに通知を送ります。
3-2. テスト
このAWSの実装の時点でうまくできているかテストがしたいですよね。
しかし、この時点では、まだ体重計デバイスは完成していなかったので、実機を使ってテストをすることができません。
しかし、mockmockがあれば大丈夫!(CMみたいになってしまいますが自社プロダクトです!)
mockmockがデバイスに成り代わってAWS IoT Coreにバーチャルデータを送信してテストをすることができます。
このテストで実際にSlackに通知がきたときには、とても感動しました!(エンジニアリングってこういうエクスタシーがたまらないですよね!)
3-2. Railsアプリ実装
2月22日。
ユーザーが実際に触るインターフェースとしてのアプリ作成をRuby on Railsで開始しました。
今までは清水様に電話で注文していましたが、
EメールやLINEでの注文にも対応しているとのことだったため、
今回はEメールで注文できるようにしました。
そして、私はこのアプリにキャラクター性を持たせました。
アプリ名を「ストック番長」と名付け(ストックを見守る人→ストック番→ストック番長)、
アプリ全体であたかも番長がストックを管理しているかのような設定にし、
ユーザーのインターフェースになるような仕込みを随所に盛り込みました。
例えば、ログインページには「見ねえ顔だな……」
フラッシュメッセージは「うまく登録できたみたいだぜ……」など、ワイルドな言葉遣い。
(ログイン後の画面)
おそるおそる入れた遊び心に対して、ネガティブな反応を一切せず、
逆におもしろがってくれるのがFusic!(懐深め!)
Railsチュートリアルなどで学んだバックエンドの基礎を実践する機会になったり
AWSやSlackとの連携、メールの送信、Docker本番環境のデプロイも経験できたりと
幅広い実装経験ができました。
4. ぎりぎりのリリース
当初、私の研修は3月末に終了する計画でした。
なんとしてもこの目標を達成したかった私は、3月中旬にリリースするという余裕を持った開発スケジュールを立て、
なんと珍しく、ほぼその予定通りに完成に近づけることができました。
しかし、そうは問屋が卸さないのがこの世の常。
リリースに向けて95%は実装完了しているのに、あと5%を埋めるのに苦戦しました。
(Amazonでポチった体重計をIoTデバイスに改造する魔術師、花園)
特にデバイス側の実装は、Webアプリとは違う難しさがありました。
ロボット競技の国際大会を経験しているほどの花園でも、バグと戦い続けることを強いられました。
あれよあれよという間に、最終日前日の3月30日。
締切りの2日前も、デバイスのテストが失敗に終わりました……。
これだけ全力でやってもダメだったか……
私は諦める心の準備をしかけました。
そして、最終日の3月31日。
メンターの岡嵜もわざわざこのためにオフィスに出社してくれて、総力戦でなんとかリリースに漕ぎ着けました。
5. 最後に
企画からリリースまで、先輩方の力を借りながらも、自分の手で作り上げたIoTサービス。
リリース後も改善を加えたり、いじったりできて、とても楽しいです。
IoTチームでは、メンターの岡嵜、岡部をはじめ先輩方が、
私の主体性や裁量を尊重してくれつつ、本当に程よい距離でサポートしてくれました。
社内発表会でも他のチームの方々が楽しんでくれて、
とても幸せな時間でした(緊張していて、発表終了後は胃痛がありましたが笑)。
4月1日からは、無事に実際の開発に参加させていただいております。