アプリ開発をしていて、いちばん心が折れそうになる瞬間があります。
それは「直したはずのバグが、直っていなかった」と気づいたときです。
今日はまさにその一日でした。熊本の乗り換えアプリ「くまモビ」で、地図に描かれるバスのルートが道の上でぐるぐると輪を描いてしまう——そんな不具合と朝から晩まで向き合っていました。しかも、その輪っかは「前にも直したはず」のものだったのです。
同じように、一度直したつもりのものがぶり返してきて頭を抱えた経験のある方に、ぜひ読んでいただきたい記録です。技術の細かい話はできるだけかみ砕いて書きました。
この記事のポイント
- 「直したはず」のバグがぶり返す本当の理由がわかる
- 場当たり対応をやめて根本から直す判断のしかた
- 公式データを信じるという解決策にたどり着くまで
7分26秒でわかるまとめ動画
そもそも何が起きていたのか
くまモビは、バスや市電のルートを地図の上に線で描きます。この線が、ところどころで不自然な形になっていました。
まっすぐ進むはずの道で、いったん脇道にそれて、四角い出っ張りを作って、また元の道に戻ってくる。細長い長方形のループが、地図のあちこちにぽつぽつと現れるのです。まるで線が道に迷っているようでした。
利用者から見れば「なんだこの変な線は」で終わってしまいます。旅先で使う地図がこれでは、信頼してもらえません。どうしても直したい不具合でした。
「直した」はずだった
実は、この手のループは以前にも出ていました。水道町のあたりで似たような輪っかが出て、そのときは対策を入れて直したのです。
やり方はこうでした。ループができてしまったら、あとから「この輪っかは余計だから消そう」というプログラムを追加する。いわば、はみ出した部分をあとから消しゴムで消すやり方です。
それで水道町は直りました。直ったと思っていました。
ところが今日、春日一丁目や紺屋町、熊本駅前、北岡神社前——次から次へと、別の場所で似たような輪っかや二重線が見つかったのです。消しゴムで消したはずのものが、形を少しだけ変えて、別の場所に現れる。まるでモグラ叩きでした。
一つ叩けば、別の穴からもう一匹。閾値をいじって消しゴムの効きを強くすれば、今度は山道のカーブまで消えてしまう。実際、調整をしくじって、正しい九十九折れの道まで直線に潰してしまった瞬間もありました。あのときは血の気が引きました。
自分で気づいてしまった、場当たり対応の限界
夕方、地図とにらめっこしながら、僕はふと手を止めました。
——これ、ずっと場当たり的にやっているだけじゃないか。
認めたくない気づきでした。でも、目をそらせませんでした。
僕がやってきたのは、症状が出るたびに新しい消しゴムを足すことでした。ループを消す、ヒゲを消す、トゲを消す、また別のループを消す——フィルターが増えるたびに、新しい壊れ方が生まれる。根っこには一切手をつけず、表面だけをなでていたのです。
「直したはず」がぶり返すのは、当たり前でした。だって、原因を直していなかったのだから。
ここで僕は腹を決めました。小手先の対応をやめよう。世界中の乗り換えアプリがこの問題をどう解いているのか、根っこから調べ直そう。そう決めて、いったん手を止めたのです。
犯人は「考え方」そのものだった
調べていくうちに、僕はある仮説にたどり着きました。
そもそも、自分のやり方が根本からずれているんじゃないか——。
くまモビは、バスのルートを描くために「カーナビのような最短経路探索」を使っていました。停留所と停留所を結ぶ最短の道を、その都度コンピューターに計算させていたのです。
でも、これが間違いのもとでした。バス停の位置が、道路の反対車線側にほんの少しずれてマッチしてしまうと、コンピューターは律儀に「反対車線に行くには、次の交差点まで進んでUターンして戻るしかない」と考える。そうやって生まれたのが、あの細長いループだったのです。ループは間違いではなく、間違った前提から導かれた「正しい答え」でした。
だから、あとから消してもきりがなかった。入り口が間違っていたのですから。この一点に気づけたことが、今日いちばんの前進でした。
答えは「自分で計算しない」ことだった
では、どうするか。ここからは自分のアイデアで組み立てていきました。
たどり着いた答えはシンプルです。ルートの形は、自分で計算するものではなく、データとして持っておくもの。バス会社が「このバスはこの道を通ります」と定めた公式の経路データが存在するなら、それをそのまま描けばいい。自分で推測する必要などなかったのです。
そして熊本には、5つのバス会社が共同で公開している公式のオープンデータがありました。これを使わない手はありません。足りない部分は、世界中で使われている専用ツール(pfaedle)で一度だけ生成して補う——そんな段取りを自分で設計して、一つずつ組み上げていきました。
考え方をまるごと入れ替えたのです。「最短経路を毎回計算する」から「公式ルートをそのまま描く」へ。
そして、ループは消えた
新しい仕組みで作り直したデータで、地図を開きました。
春日一丁目。まっすぐです。紺屋町。きれいです。熊本駅前。北岡神社前。高森の山道。
全部、実際にバスが走る道のとおりに、なめらかな線が描かれていました。
もう消しゴムはいりません。ループを消すプログラムも、ヒゲを消すプログラムも、全部削除しました。コードはむしろ半分以下になりました。おかしな線を隠すのではなく、おかしな線が最初から生まれない仕組みになったのです。
丸一日かかりました。何度も「これで直ったはず」と思っては裏切られました。でも最後にたどり着いたのは、フィルターを一つ足すことではなく、考え方を根っこから変えることでした。そしてその判断を下せたのは、途中で自分の場当たり対応に気づけたからでした。
今日の学び
「直したはず」がこわいのは、直ったと思い込んで安心してしまうからです。
でも本当は、症状が消えただけで原因が残っているなら、それは「直った」ではなく「隠れた」だけ。時間が経てば、形を変えてまた出てきます。
場当たりの対応を積み重ねている自分に気づけるかどうか。そこが分かれ道でした。気づいたら、いったん手を止めて、根っこを見にいく。遠回りに見えて、それが一番の近道だったのです。
同じように「なんで直らないんだろう」と頭を抱えている方へ。その不具合、もしかしたら消しゴムで消す問題ではなく、考え方を変える問題なのかもしれません。自分の手を止めて、いちど根っこを疑ってみてください。
明日からは、気持ちよくまっすぐな線が引けそうです。
【お知らせ】くまモビのテスターを募集しています
現在くまモビは、Google Playでクローズドテスト(公開前の限定テスト)を実施しています。熊本のバス・市電・電車の乗り換え検索や、観光スポットめぐり、スタンプラリーなどを、正式公開の前にひと足早く試していただけます。今回直したルート表示も、実際の端末で見て「変な線が出ていないか」をチェックしていただけたら、とても心強いです。
「熊本の交通に興味がある」「個人開発アプリを応援したい」「新しいものを早く触ってみたい」——そんな方は、ぜひテスターとしてご参加ください。Androidスマホをお持ちの方ならどなたでも歓迎です。
参加の流れ
テスターの管理はGoogleグループ(メーリングリストのような仕組み)で行っています。次の2ステップでご参加いただけます。
① まずGoogleグループに参加
下記のリンクを開いて、グループに参加してください。
② アプリを入手
グループに参加したら、下記のリンクからアプリを入手できます。「テスターになる」に同意し、「Google Playでダウンロード」からインストールしてください。
https://play.google.com/apps/testing/com.chieandaki.kumamobi参加するときの注意事項
スムーズに参加していただくために、いくつか気をつけていただきたい点があります。
- 必ず①→②の順で進めてください。
先にグループへ参加していないと、②のリンクを開いてもアプリをインストールできません。「アイテムは見つかりませんでした」と表示された場合は、まずグループに参加できているかを確認してください。 - アカウントの一致が重要です。
グループに参加したGoogleアカウントと、スマホのGoogle Playにログインしているアカウントが同じである必要があります。スマホに複数のGoogleアカウントを入れている方は、Playストア右上のアイコンから、グループに参加したアカウントに切り替えてから②を開いてください。ここが食い違うと、やはりインストールできません。 - 参加の反映に時間がかかることがあります。
グループに参加した直後は、Google側の反映に数時間かかる場合があります。すぐにインストールできなくても、少し時間をおいてから試してみてください。
僕もここで30分くらい待たされたことがありますので、気長にお待ちください! - 開発中のアプリです。
テスト版のため、不具合や、予期しない動作が起きることがあります。動作の保証はできませんので、その点はあらかじめご了承ください。 - 感想・不具合報告は大歓迎です。
「この経路がおかしい」「この画面が使いにくい」など、気づいたことを教えていただけると、アプリがどんどん良くなります。むしろそれがテスターの醍醐味です。 - 無料でご参加いただけます。
テスト参加に費用はかかりません。
上記の①②を進めるだけで、どなたでもすぐにご参加いただけます。うまくインストールできない、手順で迷った、といった場合は、お問い合わせまたはXアカウント(@moyasea5656)までお気軽にご連絡ください。みなさんの声を聞きながら、正式公開に向けて磨き込んでいきます。どうぞよろしくお願いします。
コメント