First things first. Let’s start with Why?
Why? During shelter-at-home, I have found it too easy to turn a 20-minute trip into a 1-hr wandering in Wal*Mart because my brain is starting to crave away time. So, I made this tool to help ourselves better manage time.
How? Once installed, it automatically starts a timer as you leave your home wifi network (you don’t need to manually launch the app or press any buttons).
What? Every 15 minutes*, it will remind you using a notification with an unique beep. Once you return home, it will record the trip time so you can see daily/weekly trends.
Extra? I have chosen not to use GPS location** or have a login system, so your data remains private and anonymous.
The Development Process under this unique situation
One of the most important decision was picking a scope that is useful, easy to understand and can be built very quickly. The clock was ticking and it was the first time I tried to build something from zero to AppStore in a week.
It’s a pretty ambitious goal, but it’s worth a shot. So, I went to work, spending every hour outside of my day job on the app, making quick decisions and hope that I won’t run into showstoppers I can’t overcome.
What have I learned?
- Purpose-driven work + short delivery target + going solo is a potent combination for software engineers. It’s extra fun to work in this setting.
- This experience was very different from normal development work where we can spend more time on research and execute with an overall picture more or less in the head. A chaotic, invent-as-you-go mentality is also a valid strategy and can lead to useful outcomes. The tried-test-and-true methodology is just one way to get things done, but shouldn’t be the only strategy in my toolbox.
- App Store reviewers may throw you new types of curveballs, no matter how many times you have gone through the process. Don’t be discouraged.
a) Google Play said it had a major backlog and would take 7+ days to review submissions, instead of the normal 1 day turnaround. Ouch! I just coded my hearts out, got stuff working in record time to help the public. Now, I needed to put it in the freezer for 7 days and hope for the best? (Pro tip: Tweet to Google Play account publicly. It may work for you too.)
b) Three days after their initial approval, Google sent me a shocking email to tell me they have delisted my app because they don’t allow apps tied to the pandemic! I ended up creating a new submission with a new app name and crafted wordings carefully in the app description and got lucky the 2nd time. Phew! (Moral of the story — Don’t give up: eventually you will figure it out. There is no short-cut. The language you use matters.)
c) iOS AppStore reviews, which were historically slower than Google Play, gave me numerous pleasant surprises. During the pandemic, they stepped up to offer ultra-fast feedback (within 1–2 hrs!) and offered useful details when my builds crashed (yeah, this tends to happen when doing things too quickly :-)) — Pro tip: Don’t get discouraged if the Beta reviewers reject you. They are handled by different people. It’s still possible to get approved for your production release.
On the technical side, there were a few unexpected lessons too.
- How to get iOS to auto-launch my app when the user leave home? One of my core design point is that the Away Timer should be started without any user touches (i.e. no need to manually launch the app or keep it in background.) iOS has very handy Location APIs called startMonitoringVisits and startMonitoringSignificantLocationChanges. Check them out. These monitors stick around even after reboots.
- Users love wallpapers. It’s an easy-to-implement feature if your UI canvas has lots of space. It adds a personal feel (in my case, a family picture that encourages me to stay safe while going outdoors.) and good for developers (your app becomes more sticky.)
- For components that require careful state management (e.g. camera, lists with real-time updates, audio/video streaming), work backwards (i.e. start with a working sample and adjust it.) For example: Listing live data from a Firestore collection is still too hard for mere mortals like me. It doesn’t matter if you have mastered RecyclerViews and Firestore basics. Getting both to work together reliably, handing state transitions properly is not trivial. iOS is a little less daunting, but you will not regret starting from sample codes and work backwards.