あけましておめでとうございますm(__)m
トレタのiPadアプリ開発を担当している高です。 
IMG_2690

お正月の成果物になります。

年末にこんな本を読んだら無性に作りたくなってしまいました。
ガンプラ開発者が語るニュータイプ仕事術

基本的に素組みで墨入れだけ頑張りました。
RG 1/144 ウィングガンダムゼロ 

なんとこのガンプラには熾天使(してんし)の羽(フェザー)という別売りキットがあるんですね。
ぐぬぬぬ、、商売上手ですね。買うてまうわ!
RG 1/144 ウイングガンダムゼロ EW用 拡張エフェクトユニット “セラフィムフェザー”



さて、そんなわけで今日はトレタアプリをより良くするための取り組みについて書いてみたいと思います。
 

アプリの課題

サービスを運営していくにあたってアプリの課題はたくさんあります。
  • クラッシュ
  • ユーザーの行動分析
  • 通信速度
  • 機能改善
  • 開発の高速化
  • etc...
今回はこの中で一番頭を悩ませる問題、クラッシュについてお話したいと思います。
 

クラッシュ

業務で使っていて一番困るのがアプリのクラッシュです。閲覧の時ならまだしも、予約入力中のクラッシュはあってはならないことです。店舗様がお客様からの電話を受けて予約を入力するため、店舗様はもちろんのこと一般のお客様へも迷惑がかかってしまいます。

どれだけ気をつけて実装していても絶対に起きないとは言い切れないのがiOSアプリの難しいところです。このためトレタでは万が一予約受付中にアプリがクラッシュしてしまった場合の救済措置として、予約情報の復元機能を用意しています。
IMG_0024
※予約受付中にクラッシュした場合、アプリを起動すると上記ダイアログが表示されます。

クラッシュ自体あっていはいけないことなので、正直一番活躍してほしくない機能ではあります。それでも、万が一でもお客様から受け付けた予約情報を無くしてしまってはいけないため用意させて頂いています。
 

クラッシュレポート

弊社ではクラッシュレポートの収集にHockeyAppを使用しています。
HockeyAppは元々テストアプリ配布のために使用していました。
昔はTestFlight(Apple買収前)を使用していたそうですが、一時期調子が悪いことが続いたためHockeyAppに乗り換えたという経緯があります。

最初は有名どころのCrashlyticsなんかを使おうかなと思っていたのですが、導入済みのHockeyAppで出来ることがわかったため今はHockeyAppを使用しています。
 

HockeyApp

トレタでの使い方の特徴ですが、Crash LogsのUserという欄に店舗名を出力するようにしています。
50


トレタは店舗様で使ってもらうB2Bサービスということもあって、店舗名さえ分かればお店に直接電話や訪問して詳細をヒアリングすることが出来ます。B2Cサービスだとなかなかそうはいかないですよね。こういうことが出来るのはB2Bならではだなと思います。

少し話が逸れてしまいますが、店舗様にはトレタ用にiPadを用意して頂いています。 そのため、例えば下位OSが改修の負担になりそうな場合、普通ならしばらくは頑張って対応するしかないと思います。トレタの場合は店舗様に直接OSアップデートを依頼して下位OSを無くしてしまうなんてことも出来てしまいます。もちろんコストは掛かりますので(店舗様側にも)慎重に判断しなければいけませんが、選択肢として残っているということはエンジニアからするととても心強いです。

話は戻って実装の話です。
userNameForHockeyManager:componentManager:というデリゲートメソッドがあるので、ここで店舗名を返してあげるだけです。
http://hockeyapp.net/help/sdk/ios/3.0.0/Protocols/BITHockeyManagerDelegate.html#//api/name/userNameForHockeyManager:componentManager: 
 
#pragma mark - BITHockeyManagerDelegate
- (NSString *)userNameForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager {
    return restaurant.name;
}
これだけで、先ほどのUser欄に店舗名が出力されます。


またHockeyAppのAPIを使用してSlackにデイリーでクラッシュ件数を通知するようにもしています。こちらはサーバエンジニアの沢田が作ってくれました。
39

これは全員が見れるようになっているので、、僕は非常にプレッシャーであります。はい。
 

クラッシュレポートにおけるHockeyAppへの不満

今のところ便利に使わせてもらっているHockeyAppですが、少し不満があります。検索や分析に非常に弱いんですよね。
 
例えば、下記のような見方が出来ません。
  • 昨日のクラッシュのうち、一番多い店舗を見たい
  • ◯◯店舗の昨日のクラッシュ件数を見たい
  • 一番クラッシュの多い店舗を見たい
ダッシュボードでの検索だけでなくAPIも見てみたのですが、どうも今のところこういった検索はできない様です。
 

HockeyNokogiri

これでは分析する上で不便なのでダッシュボードのクラッシュレポートをスクレイピングしてCSV化するスクリプトを書きました。

もっと分析しやすいクラッシュレポートサービスがあるかもしれないのですが、ちょうど慣れてきたところなので今のところはHockeyAppが使えるならそのまま使っていきたいなと思っています。


先ほどのクラッシュの例ですと、こんな感じで出力されます。
Device,OS,Jailbroken Device,Description Attached,User,Contact,Date,-,Description
iPad Air (Wi-Fi),8.1.2,"",x,"",,2014-12-22T16:05:34Z,,"__pthread_kill SIGABRT"
アプリのバージョンを指定してそのクラッシュレポート一覧を取得するようにしています。使い方に関してはgithubを見ていただければと思います。とりいそぎベタ書きしただけなのでコードは微妙なところがありますが要件は満たせています。時間を見つけて少しずつ改善していきたいなと思っています。プルリクなんかも歓迎します!
 

まとめ

長々と書いてきましたが、正直特別なことをやっているわけではありません。他のサービスでも同様のことは当然やっているでしょう。当たり前のことを当たり前にやる。しかしこれは思いのほか難しかったりします。

実際に僕がジョインするまではクラッシュレポート収集と分析の仕組みはありませんでした。ただそれは優先順位の問題だったと思います。僕は8月にジョインしたのですが、その頃にはトレタアプリは機能的には一段落しているところでした。なのでクラッシュレポートの仕組みを導入したりと改善に力を入れることが出来ました。

アプリやサービスの品質を高めるのは当たり前の積み重ねだと思っています。ただ、今iOSエンジニアは社内に僕一人しかいません。やりたいけれど出来ていないことがまだまだたくさんあります。


仕事始めの1/5(月)。
全体ホームルームで中村から今年の目標や計画の発表がありました。詳細は言えませんが今年はトレタにとって飛躍の年になります。正直人手が足りません。僕やトレタのサービスに対する考え方に共感できる方はぜひ一緒に働いてみませんか。

ただし、誰でも良いからとりあえず増やしたいとは思っていません。これはそのうちブログに書こうと思っていますが、僕個人としては「間違った人材を雇うよりは人が足りないほうがずっとまし」と思っています。この伝え方はとても難しくて上から目線と捉えられてしまいそうなのですが、決してそういうことではありません。やっぱり一緒に働くなら長く一緒に働きたいですからね。

ご連絡お待ちしております。


▼「トレタ」の進化を加速し、サービスの可能性を拡大するエンジニアを募集!
https://www.wantedly.com/projects/11460

↑募集職種がわかりにくいのですが、全職種少なくとも1名ずつは増やす予定でいます。