Hello. I'm building an app called Dash Dot, it's a native iOS app for interval training that is a) well-designed, and b) privacy- and utility-focused. This post covers the first (approx.) six weeks in designing and building the app.
I've never made a truly native app before (I have written things in React Native before, though), nor have I ever successfully released a product to the world. Maybe this will be the time 🤷♀️
I want to #buildinpublic so this is a proto-changelog for a product that I'm hopeful will exist one day.
Cycle? I don't like the "sprint" terminology that agile practices use to describe how features are developed. Nobody sprints all the time, that's ridiculous, and building a product is a long slow burn. Also, I don't have a product to iterate on, I'm currently working forwards from "wouldn't this be a good idea". I need longer than two-week springs to make a difference. In line with Basecamp's six-week "bets" and Linear's "cycles", I want to work in cycles, as in lunar cycle or life cycle: longer (six-ish) periods of work where I focus on broader goals.
This cycle (#0) lasted seven weeks:
- Started: 2021-02-01
- Ended: 2021-03-21
What do I have right now ?
- An idea of what I want to build, how it offers value, and a route to monetisation
- MVP Features that I want to build before I release (into Test Flight), and a rough shape for the functionality I want to add on after that.
- A very messy Figma file that needs tidying up but does contain screens for a lot of the app: dashboards, timers, config pages, profile pages.
- A working swift iOS app that lets you configure a timer and do some very primitive navigation
What have I done that I'm proud of?
- Decided to make this app, don't overlook that
- Learned a whole lot about Swift and iOS development. I don't think I'd written any Swift code before 2021, and I've spent the past four years building predominately frontend web software in JS/TS, so I'm pretty proud of this.
- Visually designed and prototyped the principle workflow for creating a timer, completing it, and viewing your account
- Created code that travels the entire vertical stack (i.e. end-to-end) that allows a user to create, save, update, and delete a timer
- Toyed with JIRA and Linear for project management
What went well?
- I actually built something, I have an idea of the product and I have the first few screens that make this a little bit closer to a reality. That's a cool feeling
- Rapid low and medium fidelity UI prototypes and iteration. I didn't waste too much time wanting to get the perfect UI done before I started, so I've built with a very Spartan UI in Swift, but have worked in parallel in Figma to know what the content (if not the presentation and layout) of my screens will be.
- I'm proud to be focusing on UX and UI that actually makes sense for humans. I tried a lot of competitor/existing interval timer apps and wow are they non-intuitive. They just expect you to poke around, do things without confirming them or making clear what they're about to do, and have unclear iconography and buttons. I'm happy to be building and designing an app that takes these things seriously.
- Early validation of the idea from discussing it with friends (which isn't real validation, I know)
What didn't go well?
- UI Design != software design. Although the two relate closely, I made the mistake of tying my initial software design to the UI/UX design. Although the two should be similar, they shouldn't be identical. I made my code too strict and tightly linked to the UI implementation. I have been working to combat this in more recent code design.
- Better code design I should make more effort to design systems on paper before I start coding, not code > get stuck > design > delete & rewrite code. Obviously, you can't just plan to the exclusion of coding, but you can spend 10-15 minutes getting your ideas on paper, yeah?
- TDD. Related heavily to the above: I tried to use test-driven development (TDD) from day 0, but it made it hard to prototype and change things. Maybe if I was a better engineer I would have designed a better system from the get-go, but my style of doing things is a little more "let's see what happens if I do this". - I ended up designing and building one system, then splitting it out, dividing it, and re-naming parts which made my tests redundant and all fail, so I'm basically going to have to go back and re-write tests for everything - This may not have been the best approach - slowly refactoring code and tests in parallel would probably have been a good idea, but I decided I'd rather just go ahead and write the code instead. If this was an established app in production I would definitely have done code and tests together.
- Writing in a new language. I'm having to learn about both Swift and iOS development as I construct the app itself, so there have been several sizable re-shuffles and re-architectures
- A messy Figma File that's hard to navigate. I haven't settled on a UI/UX design, there's been a lot of iteration - which means the business components exist but the UI components are very minimalist and industrial (read: bad)
What has been most challenging?
- Learning a new language (Swift) for the development
- Learning and implementing the architectural patterns for iOS development (e.g. Model-View-View Model)
- Having to learn the entire vertical stack before building a feature: persistence, animations, layout & styling, etc. The process feels a lot more like full-stack engineering than frontend, despite thinking otherwise as I went into this.
- Shifting from the predominately functional style of building React applications to the more Object-Orientated way in Swift.
What do I do next?
In order, here are the things I want to do in the next cycle:
- Finalise the current architecture and add tests: The code that lets you create and configure a timer is functional (it walks), but I can probably do some tidying. In fact I can definitely do some tidying. I absolutely want to have tests in my code, even if TDD didn't work out this time and I've had to write code then tests, that's still preferable to writing no test.
- Solidify the design: I've got a lot of possible UIs and medium-fidelity prototypes, with various colour schemes and mental/visual metaphors in my current Figma file, I need to settle on the Colour Palette & Design Tokens so that I can build consistent UIs. I need to get rid of old ideas (I'll probably move them to some kind of 'Archive' part of the file so that I can go back to them later). This should create a consistent UI and UX across the various user journeys.
- Allow someone to complete a timer: Design the architecture and UI that would allow someone to select a timer they have made, and actually complete it
- Buy some domain names: I need to start thinking about the keywords and handles I'll be using online
- Decide on JIRA vs Linear: How to manage software development? What an ever-turning wheel
Note the lack of marketing and advertising here? I'm aware that this should start early but I don't want to do anything until I'm sure that I'll have something that I'd be happy letting someone else use.
Hopefully, Cycle #1 will last from now until the beginning of May 2021, but I also expect it could last longer. Right now it's about making ideas solid and building code - and that happens when it happens.