NOT A HOTEL へ入社して1年と3ヶ月くらい経った。2022-12-01に入社。Slack を検索すると業務委託で携わっていた期間を含めて2年以上になるらしい。
スタートアップならではの速度に加え、驚きとワクワクの連続だった1年と少しを振り返ってみる。
※退職ブログではない
入社前
フリーランスとして何社か業務委託として開発に参加をしていた。
NOT A HOTEL は @wa_kinchan のツイートを見て、ここのソフトウェア開発はどんなことしているんだろうと興味を持って、採用サイト経由で業務委託開発に参加した。
スタートアップならではで、与えられたタスクの実装に必要な機能ができていなくて、タスクを進められないカオスな状況だった。予定になかったタスクをこなし、ビジネスルールが分かっていない中、雰囲気で機能を実装したものもいくつかあった。もちろん細かい修正は発生した。
そんなこんなでタスクをこなしていると CTO の @okbtks から「青島の NOT A HOTEL へ遊びに来ませんか?」とお誘いをもらった。
1回目は台風直撃でキャンセル
2回目は風邪(多分コロナ)でキャンセル
ついに前日入りで参加!
スマートホームチームが NOT A HOTEL AOSHIMA の管理棟で楽しそうに会話をしながら開発している様子を見て、やりたかったのはこれだよこれ!となって入社するかーとなった。(実際はお誘い頂いていた、もう一社と悩んでいた)
チャット機能
NOT A HOTEL のハウスを所有しているお客様のことを「オーナー」とし、所有していないお客様のことを「ゲスト」と呼んでいる。NOT A HOTEL アプリにはオーナーへ昇格すると表示される専用のチャットルームがあり、これが私が携わっていた機能の初のリリースだった。
この頃は業務委託として携わっていたこともあり、青島の開業でみんなが慌ただしくしているのを外から観測していた。チャットには Zendesk が提供しているメッセージングプラットフォームの Sunshine Conversations を利用していて、当時は聞いたこともないサービスと、その暗黙的な仕様を含めた仕組みのキャッチアップに苦労したことを覚えている。
これがおそらく2022年11~12月くらいのこと。
AI コンシェルジュ
@okbtks が公開している note 「AI コンシェルジュ機能をリリースしました(NOT A HOTEL)」を読むと2023年の3月頃にリリースをしている。営業時間外でもチャットの中に AI が登場してハンドリングしてくれる機能である。
この AI 技術には GPT-3.5 と LangChain, Dialogflow CX を利用していた。GPT-3 を利用して開発していたら GPT-3.5 Turbo がリリースされてかなりタイミングが良かったことを覚えている。
最初は Dialogflow CX のみを利用してリリースする予定だった。チャット上で予約の変更を行えるように設計されていたため、予約種別やステータスも考慮する必要からフローもかなり複雑になっていた。Zendesk と Sunshine Conversations, Dialogflow CX 間の Webhook 祭りになっており、予約ごとで、チャットのメッセージがどうシステム間で伝搬されていくのかを覚えるのに苦労した。
そうして2023年の12月か2024年の1月になって、よしリリースするぞ!となっていたところ、あるミーティングにて CEO の @shinji_hamauzu から「GPT-3 を使ってチャットボット開発しようよ!」と話が出て、当時はまだみんなやってないこともあり、面白そうだしやってみよう!となってリリースが延期になった。
1月から3月の間は触ったことのない Python と GPT-3, GPT-3.5 について学びながら開発をしていた。もちろん AI に関する技術は触ったことがなかった。エラーの数は凄いし、返答に5分かかるし苦労が多い開発だったが、NOT A HOTEL の開発に携わって初めてとても楽しい思いで進められた。
その時の苦労話は以下のスライドにまとめている。
この出来事から1年経ち、ベータ期間を終了して2024年2月に賢くなったAIコンシェルジュをリリースした。現在は Python をやめて、Cloudflare Workers (TypeScript) スタック[1]で開発を進めている。前述した複雑なフローもやめた。
もちろんこれで終わりではなく、現在も改善を続けている。
AIコンシェルジュ「Kevin」がさらにスマートになりました
Helpstaff
AI コンシェルジュと同時並行で開発したのが Helpstaff だった。この話の前に簡単に NOT A HOTEL のサービスについて知る必要がある。
- ハイエンドな別荘を1棟まるごとか、または複数のオーナーと共有する形で購入することができる
- 自宅や別荘のように資産として保有できる
- 所有している間は自宅や別荘として利用し、利用しない期間はホテルとして貸し出すことが可能
つまり NOT A HOTEL というサービスはホテルとして運用されるため NOT A HOTEL だけでなく NOT A HOTEL MANAGEMENT という実際にホテル運用を行う会社もある。ここで働いているメンバーが主に、お客様への要望に応え快適な滞在を提供している。
12月に入社したので、同じタイミングで入社した同期と NOT A HOTEL 青島へ行って NOT A HOTEL MANAGEMENT のメンバー(以下運営メンバー)が何をしているのか見学しに行った。
当時の会社の状況は、サービス運用開始したてということもあり、マニュアルや運用フローなどを試行錯誤しながら構築している状況だった。しかし、那須での開業が視野に入っていることから運営メンバーとしては再現性のあるオペレーションやフローを構築したいと考えていた。
この時 PC から利用できる PMS と呼ばれるホテル運用システムは実現できていたが、運営メンバーの殆どが常に動いている状態なため、座って PC を開く余裕もない状況だった。
再現性のあるオペレーションの実現には、ソフトウェアの利用が必要になってくるが、ソフトウェアチームもサービス運営に必須な機能の実装で手がいっぱいになっていた。見学した私達は、まだタスクがアサインされていない状況だったこともあり、一緒に同行していた @fumifumi__8 と動きながらでも利用できるスマホ向け PMS の開発をしよう!となった。以下の note に記述されている。
思い入れのある機能は、Helpstaff の無限スクロールカレンダー。上下無限にスクロールして、過去未来の予定を確認できるカレンダーである。
PC 版の PMS では fullcalendar が利用されていたことから、同じコンポーネントを利用して開発しようとしていた。しかし、上下無限にスクロールできるカレンダーを実現できるコンポーネントが fullcalendar を含め OSS で見つからなかったため、仕方なく自作することにした。
設計の方針としてはシンプルで、2つの同じサイズのテーブル要素を重ねることにした。一つは日付と枠線を描画するため。もう一つはイベントとなる帯を描画するため。イベントとなる帯の部分は inset
を計算して描画した。
ある一定のスクロールをしたら、ある一定の期間分のイベント一覧を取得する必要がある。これには Intersection Observer API を利用した。
このアプリケーションは2023年12月まで開発をしていて、落ち着いてきたことから別の方へバトンパスをした。
神ツール
NOT A HOTEL に滞在するとルームサービスとして、ソフトドリンクや食事、お酒などの商品を注文できる。これらの注文は宿泊費用へ追加の請求となる。この請求を行うためには PMS に商品名とアイテムコード、税込金額を入力する必要があった。
商品情報はマスターデータとしてスプレッドシートで管理されており、運営チームはそこから商品を検索して入力していた。
ミスもできない、探すのも大変といった感じの厳しい業務を少しでも緩和できたらと、CTO がスプレッドシートから抽出して、PMS へ自動入力できるようにするブックマークレットを開発した。それが「神ツール」と呼ばれていた。
このツールを起動すると、商品コードを入力できるようになっていて、入力すると該当の情報を PMS 入力フォームへ入力してくれる優れものだった。
ツールの運用はスプレッドシートのデータからアイテム情報を抽出して JavaScript の辞書へ変換して、ブックマークレットを作成し配布するのを定期的に行っていた。JavaScript へ変換するスクリプトを書いてたのだが、スプシ上のデータ構造もよく壊れていたので、それに合わせてスクリプトも修正したいた。この作業は割と大変だったこともあり、CTO から自ら希望して引き継いだ。
現在は PMS でマスターデータも管理されるようになったので、神ツールという概念はなくなった。
Cloudflare の導入
DDoS 対策について検討していたので、Cloudflare を導入すると無料で全て解決してくれると説きながら導入した。
開発環境、ステージング環境の認証にも Cloudflare Zero Trust を導入してすぐに実現できた。IP 制限を掻い潜るために VPN 的な使い方もした。
他にも取得したドメインの管理や https://notahotel.com の静的アセットの配信にも利用している。[2]さらにちょっとした汎用アプリケーションやプロキシを構築するのに Cloudflare Workers も利用している。
アイディアソン
CTO と雑談をしていて、ハッカソンやりたい!から始まったアイディアソン。元々はハッカソンをやる気満々だったが、全社参加できる形だといいかも!と HR の @mamiracle__ からアイディアをもらい変更した。
アイディアソンでは司会進行しながら CTO と2人でこっそりハッカソンをし、Slack で動く ChatGPT のボットも開発してリリースまでした。現在もソフトウェアチームだけでなく、セールスや建築、運営メンバーを含めて全社で広く利用されている。
この後ちゃんとハッカソンも開催された。この時の主催は僕ではなく多分 CTO/CXO だったはず。どれもとても楽しかった。
社外アウトプット
普段は沖縄に住んでいて、そこからリモートワークをしているが、登壇するために東京、京都、福岡、広島へ沢山移動した。
登壇10回、技術記事11本といった感じ。記事や登壇のほとんどは Cloudlfare Workers についてだったこともあり「NOT A HOTEL は Cloudflare Workers で Hono を使ってサービスを開発している」と認知をしてもらえるようになった。...はず?[3]
前提として、アウトプットは会社のためにやってるわけではない。
例えばアプリケーションの運用を他の方と進める際に、結局似たようなアウトプットを行わないといけないため、それならばついでに外にも出そうといった気持ちでやっている。こうするとアウトプットする理由づけにもなるし、なるべく自分が考えている最新の状態をチームにも共有できて便利。
利用しているウェブフレームワークの Hono へのコントリビュートや Cloudflare Workers の AI Gateway のバグの対応も中の人と進められたことは良い経験になったと思う。[4]
感想
リアルワールドにある「何か」と「ソフトウェア」を掛け合わせたような開発をしたく NOT A HOTEL に入社をしたが、振り返ってみると、期待とは違ったよくありがちなウェブアプリケーションを開発していた。だけど結果として、とても楽しかった。
楽しかった理由に Cloudflare Workers の進化や ChatGPT などの登場によるアプリケーション開発のブレイクスルーが発生したことで、これまでと違った開発をできたことが大きかったと思う。これらの技術を利用できる環境に居れたことは非常にラッキーだったと思う。
他にも在籍している素晴らしいメンバーとも全く面識が無かったこともあって、縁ができて非常に良かったとも思う。
全員リモートということもあって、メンバーがそれぞれ住んでる地域に行った時は合流してランチも行った。逆も然りで 2nd CEO の @McRALE が沖縄に出張へ来た時に連絡をもらって、ご飯を食べに行ったりした。他の人からはまだないので絶賛待機中。
役割が違っても、みんなプロダクトを良くしていこうと真剣に考えていて、負けずに頑張ろうと気持ちになった。今年度も引き続き、無理をしない程度に頑張っていきたい。