2014年1月18日土曜日

ユビレジを支える技術


年末にユビレジさんのところでちょっと仕事のお手伝いをさせていただいたので、その時の内容をご紹介させていただきます。

■ユビレジって何?

iPadをキャッシュレジスタに変えてしまうサービスです。会計からレシートの印刷までやってくれます。最近飲食店などでレジがなくiPadだけが置いてあるお店などを散見するかと思いますが、アレがそうです。一般的なキャッシュレジスタ+店舗システムよりもはるかに安価で導入でき、しかも使いやすいというのがウリです。

開発者的に言うと、Scalaモヒカン@kmizuさんやiOSモヒカン@k_katsumiさんなどが在籍されていまして、エンジニアのレベルが高いです。

■開発スタイル

少人数のため、厳密なウォーターフォール管理やアジャイル/スクラムなどは無く、チケット/Issueベースの開発になっています。githubをフル活用します。すべてPull Request(以下PR)ベースで開発され、すべてのPRについてレビュー/CI完備です。forkして修正してPRを投げると自動的にJenkinsがテストを回し、githubのPRページに問題なし/問題ありのコメントを投げるところまで自動化されています。正直半端ないです。

完全に裁量労働になっているため、エンジニア勢は猛烈に朝が遅いです。全員が揃うのが普通に昼過ぎだったりします。朝が弱い人でも安心です。

社内コミュニケーションのためにHipChatを使用しています。使用したのは初めてだったのですが、SkypeやIRCよりも以下の様な点で非常に使いやすく魅力的でした。もし機会があれば私もHipChatを導入したいです。

  • IRCと異なり、自分がいない間の過去ログがきちんと残る。
  • Skypeと異なり、APIが公開されているためbotが作りやすい。Jenkinsやgithubとの連携もらくらく。
  • SkypeやIRCと異なり、モバイルアプリの出来が非常に良い。
  • ただし、SkypeやIRCに比べて外部のお客さんを誘うときにちょっと抵抗があるかも。

■サーバサイド

Railsです。私が余りRailsに詳しくないのと殆ど触ってないのでどうすごいのかよくわからなかったのですが、確かRails 3.X系を使用していて、ちょうど4にアップグレードする作業を進めていたかと思います。コードは全PRがレビューされているだけあってものすごい綺麗です。

先述の通りCucumberテスト完備です。
ドキュメントもAPIを外部公開しているので (http://ubiregiinc.github.io/ubiregi-api/) ある程度揃っていますが、完備と言うまでではありません。必要に応じてコードを読めスタイルです。私も結構読みました。というわけでクライアントサイドのエンジニアの方でもある程度以上サーバサイドを理解している必要があります。

フロントエンドまわりの技術については私が係る箇所がなかったためよくわかりませんでした。すみません(´・_・`)

インフラはHerokuを使用してます。デプロイもgithubから一発という仕組みになっています。

■クライアントサイド

ユビレジは現在iPadでのみサービスを展開されているので必然的にクライアントはiOSでiPad向けのみとなっています。ここだけ聞くとiOS/Android両対応だのハンドセット/タブレット両対応だのが必要ないため簡単そうに思えますが、そんなことは全くありません。お客さんがお金を払ってサービスを導入するB2Bアプリで、かつレジという会計を扱うアプリであるため並大抵の無料B2Cアプリとは比較にならないレベルで不具合が許されません。さらに注文を取るハンディ機などの外部アプリ連携、レシートプリンタなどの外部ハードウェア連携、サーバとの会計情報同期、iOS 5&初代iPad対応などが要求され、会計回数も大規模なお店だとそれなりの件数に達するためCore Dataもパフォーマンス最適化が必要になるなど、実はそれなりに難易度が高いです。iOS 7にiPadでのみ発生する問題が多いのも逆風ですね。

まずModel層について、データストアはCore Data+自作の薄いラッパです。MagicalRecordはちょっと複雑で大規模すぎるため導入していないとのことです。通信周りは普通にAFNetworking (1.X系)を使用。2.X系は今後iOS 5を切ってから導入する流れになるのではないかなとのことです。

View層についてはほぼすべてStoryboard/xib化されていますし、Segueもバリバリ使います。シンプルなUIが多いため派手派手なUIライブラリはほとんど使用していませんが、広い画面を有効に使う必要があるiPadアプリならではとして、Container View Controllerの概念をよく使うことになっています。

ちょっと変わっているのが、ビジネス用途で使うためSingle App Modeを有効にしてユーザーがホームボタンを押してもユビレジアプリから外に出られないように設定するのですが、この設定を有効にした時にモーダルなView Controllerを出すと問題が生じる場合があるのでワークアラウンドを導入していたりなどします。こういう問題は普通のB2Cアプリを作っているとほぼ気づかないので大変です。

それからユビレジ特有の問題としてハードウェア連携周りが挙げられます。このへんはは完全に自作です。Raspberry Piを使った自社ハードウェアとWiFi経由でデータをやりとりする仕組みになっています。普通のプロダクトではこういう開発が出来る場所は殆どないので貴重な体験になりました。

サーバサイドにもありますが、クライアントサイドにもfrankを利用した受け入れテストがある程度用意されていて、こちらもPR時に自動的に走るという仕組みになっています。ただしちょうど私が参加したのが次のアプリの大改修に備えていた時期だったため、テストの整備が追いついていない感じでした。

■まとめ

非常に短い期間だったのですが、エンジニアが一度は夢見る理想的な環境みたいなのをある程度実現されているのが素晴らしいと思いました。もちろん完璧というわけではなく今後も維持改善が必要なところがありますが、このような理想環境を一度体験してみたいというエンジニアの方には非常に魅力的な場所だと思います。

現在ユビレジさんはエンジニアの方を募集されているそうなので、興味を持たれた方は一度オフィスまで遊びに行ってみてはいかがでしょうか?