00:00:00 ◼ ► Welcome to Under the Radar, a show about independent iOS app development. I'm Marco Arment.
00:00:05 ◼ ► And I'm David Smith. Under the Radar is usually not longer than 30 minutes, so let's get started.
00:00:10 ◼ ► So, I am getting to a place that is very exciting in the development life and life cycle of this big version 5 update of Perimeter++.
00:00:36 ◼ ► essentially once I got my sort of new update, you know, iOS 16 updates out, this is all
00:00:42 ◼ ► I've been working on this big focus. It started off as like, oh, I'll just adopt live activities.
00:01:30 ◼ ► amazing. I knew this day would have to come at some point because my old version was just
00:01:37 ◼ ► I know how you feel. At least I know the old part of how you feel. I haven't yet gotten
00:02:02 ◼ ► Well, I think it's the reality of something like this is that it is, you know, it is never
00:02:08 ◼ ► going to be an easy thing to take an existing app that has lots of functionality and lots
00:02:14 ◼ ► of things and rewrite them into something new. But the end result of it has been really
00:02:20 ◼ ► positive and it's been really cool. And specifically, and the thing that I think is useful potentially
00:02:26 ◼ ► to unpack on this episode today is, generally speaking, when I want to tackle something
00:02:32 ◼ ► like this, if you imagine—I mean, it isn't just a rewrite. There's all kinds of new features.
00:02:44 ◼ ► And if you conceptually were to imagine working on this big update, there's this big pantheon
00:03:01 ◼ ► And when you start working, you start breaking this down into smaller and smaller tabs.
00:03:16 ◼ ► And it took a lot longer because I kept adding things to the list where I'd be like, "Oh,
00:03:19 ◼ ► you know, I'll just leave the settings screen in Objective-C, that's fine. I'll just leave
00:03:24 ◼ ► that there." And then I reached the point that it's like, "Oh, I wanted to improve dynamic
00:03:32 ◼ ► but it would be trivial in SwiftUI. So instead, I'm just going to rewrite the entire thing
00:03:36 ◼ ► SwiftUI. And like, that's the, so the to do list has continued to extend. But thankfully,
00:03:42 ◼ ► you reach a point where the instead of, you know, the to do list reach has reached its maximum point
00:03:46 ◼ ► and then starts to condense back on itself. And you start to feel like the end is close,
00:03:55 ◼ ► sort of interesting thing, cognitively, is I reached a point where I noticed that there were
00:04:02 ◼ ► one or two sort of tasks left on my to do list that I'd kept putting off. Like, I knew I was
00:04:10 ◼ ► putting them off, I knew that I should be working on these things, I knew that I should be doing
00:04:14 ◼ ► this. But I kept putting them off, putting them off, and they're just like, you know, just find
00:04:18 ◼ ► something else to do. Sometimes it's busy work, sometimes it's actual work. But I kept putting
00:04:22 ◼ ► these these particular tasks off. And specifically in the pedometer, it was this sense that I built
00:04:29 ◼ ► all of this really, I think, nice workout modes and live activities and this mapping stuff for
00:04:36 ◼ ► the watch and for the iPhone. And I built a lot of it in prototype apps or separate apps or in,
00:04:41 ◼ ► you know, things that worked, but only in certain circumstances. And what I needed to do is kind of
00:04:46 ◼ ► do this big integration step where I take all of these desperate parts and actually sort of actually
00:04:52 ◼ ► tie them all together so that it works in an app. And I kept putting that off. And I think
00:04:58 ◼ ► I was having a conversation with a friend about this, about kind of like why I was having this
00:05:01 ◼ ► feeling of stuck. And he said, like, "Well, what you need to do is, you know, it's like,
00:05:05 ◼ ► you need to get yourself into a situation where you can work on that. And you can tackle this
00:05:09 ◼ ► big project. And, you know, essentially, what I need to do is go into gradation, which is a
00:05:13 ◼ ► concept or a term that if you're a listener of the Cortex podcast, which I'm sure you are,
00:05:18 ◼ ► if you listen to this, if you know, if you have good taste, good enough taste to listen to Under
00:05:21 ◼ ► the Radar, I'm sure you have good enough taste to listen to Cortex. But in the Cortex podcast,
00:05:26 ◼ ► CGP grade talks about going on these gradations, which are like work retreats, opportunities
00:05:32 ◼ ► to go somewhere separate to do for the purposes of work. And not necessarily like a work trip
00:05:43 ◼ ► a traditional kind of work trip, but a trip that is typically just entirely by yourself,
00:05:53 ◼ ► a shift in mindset rather than necessarily activity. Like, you know, you're still working,
00:05:59 ◼ ► you're doing your main thing, but you're going somewhere for the purpose of working and kind of
00:06:04 ◼ ► allowing your brain to get into a different place. And for me, I was finding what I really needed and
00:06:12 ◼ ► why this was the right solution to the problem that I was facing is in order for me to tackle
00:06:17 ◼ ► this task, I knew and like, you know, at least some part deep down inside of me knew that what
00:06:35 ◼ ► are working on an engine and need to fix something deep inside of it in an internal combustion
00:06:40 ◼ ► car. And so they have to completely disassemble everything, fix the thing, and then put the
00:06:50 ◼ ► being able to, in an orderly fashion, lay out engine parts on the floor of a garage. Instead,
00:06:57 ◼ ► I was going to have to lay out all the parts in my brain and hold them in my working set and keep them
00:07:04 ◼ ► there for however long it took to put this all back together. And that's what I needed. That was
00:07:11 ◼ ► the difference that I was putting it off because in a normal day, like a normal eight-hour day,
00:07:16 ◼ ► I didn't have enough time to accomplish the task. Like the thing was probably, you know,
00:07:21 ◼ ► it ended up being maybe about 20 hours of work. And so what I needed is to take a, to change my
00:07:28 ◼ ► mindset such that I could, you know, I'm no new interruptions are coming into my brain.
00:07:32 ◼ ► No new responsibilities, no anything. It's just all work. Like my brain is just 100% supporting
00:07:39 ◼ ► and focused on this work task until it is complete. And so I did that I went essentially,
00:07:54 ◼ ► And I love my, you know, I have my studio display and my desk that I like and my chair that I like,
00:07:59 ◼ ► and the logistics of transitioning somewhere else was just getting too complicated. But instead,
00:08:09 ◼ ► I had a conversation with my family and said, "I'm going to go on a business trip, essentially."
00:08:19 ◼ ► Yes. I'm just going to go to my office, and I'm not going to interact with anyone else for the
00:08:26 ◼ ► next two and a half days, basically, is what it ended up looking like. I might be downstairs to
00:08:32 ◼ ► get some food. You might see me around, go into the bathroom or whatever, but I'm not here. Just
00:08:37 ◼ ► pretend that I don't exist. It's not rude. We're both on board with this. We all had an understanding
00:08:50 ◼ ► emergency level urgent, if it can wait, then it will wait until I come back in terms of
00:08:55 ◼ ► until my worker fee is finished. And my wife was super supportive of this, my kids were
00:09:05 ◼ ► working. And other than I slept maybe six hours in the night and I did an hour of exercise
00:09:11 ◼ ► to kind of keep myself going mentally and drank a tremendous amount of Diet Coke and coffee. But
00:09:16 ◼ ► like, it was, I mean, it's, which I will say, this is not a sustainable thing. Don't view this as
00:09:21 ◼ ► like, "Oh, anytime, you know, I should be doing one of these, like, you know, once a month." It's
00:09:26 ◼ ► like, no, this is like a once a year, like, break glass, pull lever kind of scenario because you are,
00:09:32 ◼ ► it is brutal on your brain. Like, don't think that this is just like an easy thing to do. But if you,
00:09:38 ◼ ► you know, in the right circumstances with the right preparation, super powerful. So I can
00:09:44 ◼ ► recommend the Graycation. It got me over the hump, like I was able to essentially take the app
00:09:48 ◼ ► completely apart, put it back together with the workout and mapping modes integrated inside of it.
00:09:52 ◼ ► And like, it got me past that point where suddenly, rather than having this big barrier that I kept
00:09:59 ◼ ► having at the bottom of my to-do list, like I moved that out, had the remaining few tasks to
00:10:17 ◼ ► possibly doing one of these soon myself, although I'm not quite ready for it yet. But this
00:10:36 ◼ ► And I keep having all of these different things I want to do, or interruptions from just life,
00:10:42 ◼ ► you know, or whatever it is, or I'm task switching, you know, well, I'm coding, and I'm also recording
00:10:52 ◼ ► And so it's so hard to get large blocks of uninterrupted time when you want to do a lot,
00:12:06 ◼ ► always found very challenging in indie life. I have always had a very hard time balancing
00:14:28 ◼ ► that sort of towards what you're saying is, I think the, like, you know, the best positive
00:14:34 ◼ ► sense, like the peer pressure of it, of like, I am, this time is having a cost, like in so far as
00:14:41 ◼ ► like, I'm not seeing, you know, my kids and my wife who I love, and I'm not doing other things
00:14:46 ◼ ► that I might otherwise do. And, you know, I'm putting extra burdens on my wife to have more
00:14:51 ◼ ► responsibilities inside the home as a result of this. Like, it made the time feel precious and
00:14:58 ◼ ► pressured in a good way that I felt much more motivated. And I think, specifically what you're
00:15:05 ◼ ► saying, I think so often I have a tendency of, if I run into something that is difficult, like
00:15:11 ◼ ► something that is hard work, it is easy in those moments to bounce off of it onto something
00:15:26 ◼ ► apps or going for a walk or getting a snack or whatever it is. It can look lots of different
00:15:40 ◼ ► hard work. And so I have to be careful with it in terms of making sure that I don't let it just
00:15:47 ◼ ► sort of always try and avoid things because eventually you have to face up to the task or
00:15:52 ◼ ► the thing that is difficult and is hard. And I found in this situation, this approach really
00:15:57 ◼ ► meant that it was some of the most challenging and nuanced programming I've had to do in a while
00:16:09 ◼ ► "I'm just going to keep going until it's done." There is no alternative to that. There's no like,
00:16:25 ◼ ► straight through. I used the strategies of take a shower, go for a walk to think about it."
00:16:30 ◼ ► There's lots of things that you do if you get stuck on a part. There's a difference between
00:16:45 ◼ ► you know it's going to be cognitively unpleasant. And so I think that pressure that it created
00:16:50 ◼ ► was definitely something that was very powerful in pushing me through the things that I would
00:17:57 ◼ ► content will be available for your audience and it'll be available for others to discover
00:18:05 ◼ ► being consumed so you can learn more about your audience with data on impressions, clicks
00:18:10 ◼ ► on the content, duration spent reading, pages viewed and more. Issue helps creators, marketers,
00:18:16 ◼ ► designers and really anyone who wants to make content that stands out. Get started with
00:18:20 ◼ ► Issue today for free or sign up for an annual premium account and get 50% off when you go
00:18:53 ◼ ► So I think the other thing that kind of seemed worth talking about, so I've gone on this
00:19:11 ◼ ► But just like two hours before we started recording, I put up a sign in my office right
00:19:29 ◼ ► And I'm going to explain why that's so important for me, because why it's so exciting when
00:19:50 ◼ ► want to do for ways that I could extend this for ways that I could make the app better. And that
00:19:56 ◼ ► list of ideas is functionally unlimited. Like, the more I work on something, the more ideas I have,
00:20:10 ◼ ► constrain myself to some point having to actually ship this app, take it, you know, out of my eye,
00:20:15 ◼ ► out of my head, out of my Xcode and put it into the world, like, I'll never get there, that list
00:20:20 ◼ ► will grow indefinitely and it will be like, you know, like I'm just never going to get there.
00:20:25 ◼ ► And so I have found that I've, what I have to do is at some point I have to draw a line in the sand
00:20:29 ◼ ► and say, this is it. No more new features. The app is good enough for version whatever it is. In this
00:20:35 ◼ ► case, version 5.0 of Pedometer++ is good to go. It's ready. I can take this app, it has enough
00:20:41 ◼ ► features, these features are great. Any ideas or things I have that are beyond this are going into
00:20:46 ◼ ► to the next version. And that doesn't mean that it's done. And I think this was the key
00:20:52 ◼ ► insight that I had a few years ago about why, you know, having up this sign and having this
00:21:01 ◼ ► means that all of the features it's going to contain are done. But now I enter a different
00:21:06 ◼ ► phase rather than the development phase where I'm creating new things and adding things.
00:21:15 ◼ ► I'm going to continuously just use the app in different modes, try it on different devices,
00:21:39 ◼ ► this gives me a time, like it's probably going to be about the next three or four weeks,
00:21:43 ◼ ► I would guess, of just this endlessly polishing. And it's like, in woodworking, you imagine
00:21:49 ◼ ► you start with the big, rough sandpaper, and eventually you're getting down to this super
00:21:56 ◼ ► fine, very gentle sandpaper. You're almost polishing it with just linen at the end, where
00:22:01 ◼ ► it's so soft, but it means that you can just get that absolute smoothest surface possible.
00:22:05 ◼ ► That's the mindset that I want to get into now. And that kind of work is different than
00:22:10 ◼ ► the initial work where I'm just sitting there with chisels and hammers bashing away at things.
00:22:16 ◼ ► And so anyway, it's an important part in this process of saying, "No more new features.
00:22:21 ◼ ► Put up a sign." I do physically have to put up a sign under my monitor, because if I don't,
00:22:26 ◼ ► I will cheat and tell myself, "Oh no, this isn't a new feature. This is just like a variant
00:22:38 ◼ ► said to yourself, "No more new features. If it isn't a polish, if it isn't a fix, it shouldn't
00:22:43 ◼ ► be being worked on right now." And so that's where I am, and it's something that I've found
00:22:49 ◼ ► is dramatically increased the quality of my apps, because taking the time now where I'm
00:22:56 ◼ ► intentionally just going to be polishing means that things are actually polished, rather
00:23:00 ◼ ► than it being this awkward thing where I would find, especially on the summer work between
00:23:20 ◼ ► a sign that says no more new features, and just spent a week or two just polishing things,
00:23:39 ◼ ► Like I've given myself enough time and enough opportunity to really get in there and find
00:23:44 ◼ ► all the issues, find where the little gremlins deep in my code with weird modes are and can
00:23:50 ◼ ► fix them rather than finding out that they're in there when a customer runs into them for
00:25:22 ◼ ► I'm running into and the issues that I'm having, you know, it's sort of the change in sort of
00:25:28 ◼ ► qualitatively, if not necessarily quantitatively, like there's a different kind of issue. If I'm
00:25:34 ◼ ► spending my time working on like, tiny alignment issues where like, huh, you know, this button is
00:25:39 ◼ ► actually two pixels off where it should be. And I'm going in there with x scope, like measuring
00:25:44 ◼ ► stuff and like doing those kinds of things. You know, I think there's a certain amount of just
00:25:51 ◼ ► experience that goes into it. And this is where I think, you know, your method is likely not as
00:25:55 ◼ ► problematic as superficially it might appear, because it's being done by someone who's been
00:26:02 ◼ ► doing this for, you know, over a decade. And you have a sense of what's going to come back to bite
00:26:08 ◼ ► you and what isn't, and you're not, you know, you're less likely to ship something when it's
00:26:12 ◼ ► not in that state. And I think for me, it's, you know, how do I know it's ready is that sense of,
00:26:18 ◼ ► has it been in this process of polishing for long enough now are the kind of issues or the
00:26:22 ◼ ► feedbacks I'm getting changed sort of from this, you know, big issues, big problems. You know,
00:26:29 ◼ ► the kind of thing that back when I used to have a jobby job, whatever, 14 years ago, they would
00:26:33 ◼ ► talk about is like the show stopping bugs or like it is like level one bugs and level two bugs and
00:26:38 ◼ ► all these kind of things like you get to a point where none of your bugs are these like
00:26:46 ◼ ► they would prevent the user from using one of the main features of the app. You know, it's like,
00:26:50 ◼ ► if you don't have any of those anymore, if you've tried it in enough situations that you're confident
00:26:55 ◼ ► that, you know, any data migration or data changes are going to be successful, like, just reach this
00:27:01 ◼ ► point of comfort. And then like, huh, yeah, no, I think today's the day. And then I will have the
00:27:07 ◼ ► same kind of like, there's a slight whimsy whimsicalness to it of just like, yeah, today's
00:27:11 ◼ ► the day it goes to the App Store. But I think it's, it's more it's like, I need to give myself
00:27:30 ◼ ► Yeah, that makes sense. That makes sense. And part of it, I think, is kind of alleviated by,
00:28:55 ◼ ► that I just wanted to reinforce is it is also a way of disciplining myself around finding
00:29:01 ◼ ► the point where it's enough features. Like this feature has enough things going on, it'll
00:29:07 ◼ ► be enough. It's enough talking about it. It's actually a good thing to hold back some features
00:29:15 ◼ ► this is enough. And it has these, you know, I could just ship at that point. But the quality
00:29:21 ◼ ► benefit of waiting a couple of weeks is certainly there. But more important for me is this means