Under the Radar

217: Feature Regrets


00:00:00   Welcome to Under the Radar, a show about independent iOS app

00:00:03   development.

00:00:04   I'm Marco Arment.

00:00:05   And I'm David Smith.

00:00:06   Under the Radar is never longer than 30 minutes,

00:00:08   so let's get started.

00:00:10   So we are starting to enter into that pre-WWDC season.

00:00:14   I think as we are recording this,

00:00:16   we will have one more episode prior to WWDC.

00:00:21   And that's exciting.

00:00:22   That's interesting.

00:00:23   It's a time to typically, I would say,

00:00:25   sort of start winding down things

00:00:27   in terms of big new features, big new tasks, clear the decks,

00:00:30   get things ready for WWDC, and whatever

00:00:33   is going to be announced there.

00:00:35   But it also seemed like a good opportunity

00:00:37   to talk about something that sort of as my products have

00:00:41   matured and developed over time, I

00:00:43   think there is an increasing place I find myself

00:00:46   where I'm adding features that don't end up actually improving

00:00:51   my apps, that I can look back at the choices I've made

00:00:55   or the features I've implemented.

00:00:57   And there are certainly some that's like, I add a new feature,

00:00:59   I add a new capability, and it's very impactful, very important.

00:01:04   It makes people more engaged with the application,

00:01:06   makes it better, and is generally a good thing.

00:01:09   And then just as often, I feel like there

00:01:11   are features that I add, either new capabilities that Apple

00:01:16   adds to iOS that I adopt, or just features or ideas

00:01:21   that I have that I then implement that end up going

00:01:23   nowhere that I almost regret implementing

00:01:25   because I have to maintain, or are really hard to support,

00:01:27   or create confusion, and kind of leave me

00:01:32   with this weird feeling of I went through weeks of work,

00:01:35   and in the end, it would have been better for me not

00:01:37   to have done it.

00:01:38   Like, I make a change, and then the app is worse,

00:01:41   or it makes less income, or all kinds

00:01:44   of bad things that can happen.

00:01:45   And sometimes I feel like maybe I should just do nothing,

00:01:47   and just leave my apps in the App Store

00:01:49   and do nothing to them other than compatibility updates,

00:01:52   and that would actually be better.

00:01:54   And I don't think that is actually true,

00:01:56   but certainly in the moment, I've

00:01:57   had those feelings several times.

00:01:59   And I think a good place to kind of walk that through

00:02:02   is just to think about some of the updates

00:02:04   I've made to my apps that kind of fall

00:02:07   into both of those categories.

00:02:08   But before we dive into some potentially some sort of K-more

00:02:10   case study things, is this an experience that

00:02:12   resonates with you, Marco?

00:02:14   All the time.

00:02:17   This is a constant feeling for me.

00:02:20   And I think it falls into-- for me,

00:02:21   it kind of falls into two buckets.

00:02:23   One is features that I have developed,

00:02:27   or things I've put into the app, that served a purpose

00:02:30   for a time, but that time I think has passed,

00:02:33   and that I want to get rid of now,

00:02:34   but they weren't bad at the time.

00:02:36   You know, certain technological things move forward,

00:02:40   styles and user preferences move forward,

00:02:43   what features are important in a category change over time,

00:02:46   and some of them fall out of favor.

00:02:48   And so certainly there's the category of things

00:02:51   that I don't regret doing at the time,

00:02:53   but I wish I could get rid of now.

00:02:55   And then there's the category of things that were just

00:02:58   a bad idea from the start, and that I wish-- in retrospect,

00:03:02   I wish I had just never done them at all.

00:03:04   And that's a different thing, I think.

00:03:06   But certainly, in either case, the problem you have now

00:03:10   is similar, which is there's something

00:03:12   that you did in your app that you probably can't easily

00:03:15   get rid of or undo without angering

00:03:18   a whole bunch of your existing user base,

00:03:20   or rewriting a whole bunch of code, or something like that,

00:03:22   that you're kind of stuck with.

00:03:24   Yeah.

00:03:25   And I think it's such a tension, though, right?

00:03:28   This is the thing of at the moment,

00:03:30   it feels like it was a good idea,

00:03:31   but you don't really know where that's actually

00:03:33   going to go until it's actually out in the world.

00:03:38   And I think the first thing that I think of that reminds me

00:03:41   of this is early on, or in the Apple Watch period

00:03:45   with pedometer++, I made a decision

00:03:47   to implement my own step merging algorithm

00:03:50   between the phone and the watch.

00:03:52   And so I do something that is a bit more, in quotes,

00:03:56   "intelligent" about doing that merge, where I try and detect

00:04:00   which device is more accurately representing your motion

00:04:04   at any given time, and use that number rather than the number

00:04:07   that you see in health, which is based on Apple's--

00:04:13   their merging algorithm is much more abstract and weird.

00:04:17   And based on a user preference that most users don't know,

00:04:19   they've actually set a preference for.

00:04:22   But it means that this feature that I thought at the time

00:04:25   was really cool ended up causing just-- it's

00:04:29   been a huge pain, because everyone-- my step count

00:04:32   doesn't match the help app, or doesn't

00:04:34   the account match other apps?

00:04:36   And I can say, well, mine is better.

00:04:39   But it's also-- then it's been this-- every week,

00:04:42   there are people who ask why the numbers are different,

00:04:44   why it's still-- why are the numbers not the same?

00:04:46   And as the Apple Watch adoption has gone up,

00:04:49   it has become increasingly a thing.

00:04:50   And I look at that feature, and I'm like, I like that it's

00:04:55   there, but I also don't think it actually was impactful.

00:04:57   And I think the lesson I kind of learned there is I

00:05:00   don't think I fully considered my app in the broader

00:05:03   context of the device, and how people use it,

00:05:06   and how people might-- that irrespective of whether I think

00:05:10   my number is more accurate or better,

00:05:13   it's not actually what people want.

00:05:15   They want a number that feels consistent

00:05:17   and feels true.

00:05:19   And as soon as there's any difference,

00:05:21   that creates doubt.

00:05:22   And that lack of that doubt in the validity of my numbers

00:05:26   then actually causes more problems.

00:05:29   Because that's what people actually want,

00:05:30   to have a reliable step count, not that it's necessarily

00:05:33   a better step count.

00:05:35   That's just an example of a feature

00:05:36   that's like, I thought the time was super cool,

00:05:38   but now I kind of wish I could change,

00:05:39   but I can't really change it very easily.

00:05:41   Because if I change it, then it'll

00:05:43   cause problems with people with old data,

00:05:46   or who had previous streaks, or things like that

00:05:48   that I just don't feel I can get away from now.

00:05:52   I kind of have things going from small and recent

00:05:54   to big and old here.

00:05:57   So my smallest and most recent regret

00:06:00   is that the app currently, in the last version of Overcast,

00:06:05   I changed the way streaming works.

00:06:07   For all of time since I've had streaming-- which

00:06:10   I'll get to in a little while-- but for all time

00:06:12   that I've had streaming, the way streaming playback has worked

00:06:15   in Overcast is a stream is more technically,

00:06:18   correctly labeled as a progressive download.

00:06:21   It doesn't just stream it and then leave nothing on disk.

00:06:25   It just starts the download and plays it as it completes.

00:06:28   And so the result after you've streamed an episode

00:06:31   before the current version was that it just

00:06:34   became a downloaded episode.

00:06:35   And ever since I've introduced this,

00:06:37   I've had people write in confused by this saying,

00:06:40   why is my phone filling up?

00:06:41   I have it on streaming mode.

00:06:44   And so people expect streaming mode to not use disk space.

00:06:49   Well, so in the last version of Overcast,

00:06:51   I changed that behavior finally to be

00:06:54   what I thought people wanted all this time,

00:06:56   because they kept telling me they wanted that, which

00:06:58   is to have streaming mode only maintain the current episode

00:07:02   as a download.

00:07:03   And then as soon as you played a different episode in streaming

00:07:05   mode, it would delete that other one,

00:07:07   and you would download this new one

00:07:09   and replace it on disk, basically.

00:07:11   So you'd only ever have one episode on disk at once

00:07:13   of that setting.

00:07:15   Yeah, it turns out people hate that, too.

00:07:19   I keep hearing from them.

00:07:20   And so now I'm stuck at this terrible place where it's OK.

00:07:23   Well, I can revert it back to the old way, which I know

00:07:27   will anger certain people.

00:07:29   I can keep it this current way, which I know

00:07:31   will anger certain people.

00:07:32   Or I can add a preference, which sucks.

00:07:37   Which will anger everybody.

00:07:38   Right, which makes everything more complicated.

00:07:41   And I have to add one more thing to the download screen, which

00:07:46   I have to design that download screen very-- the download

00:07:48   settings screen, rather, very carefully,

00:07:50   because people often misunderstand it.

00:07:52   And I do want to put--

00:07:53   I need to add a little more language to it,

00:07:54   I think, to clarify, but not like anyone

00:07:56   reads the text in your app.

00:07:58   So I just have this terrible place that I'm in now,

00:08:03   because I dare to change the streaming mode when,

00:08:05   in reality, streaming in general is one of the things

00:08:10   that I kind of regret adding to my app.

00:08:12   And I know a lot of people use it.

00:08:15   I actually do keep metrics on what download mode people use.

00:08:18   So I know a good portion of the user base uses streaming mode.

00:08:21   And I also know that even for people like me who use download

00:08:24   mode, it is nice to be able to start something playing

00:08:27   immediately that I haven't fully downloaded yet.

00:08:30   And I remember back in the early, early days of Overcast

00:08:33   before I added streaming.

00:08:34   The first few versions didn't support streaming.

00:08:35   They were download only.

00:08:37   And I remember back to those days

00:08:39   how it was kind of annoying when I would be recommended

00:08:42   a new show.

00:08:43   I'd go download something, and I'd

00:08:44   have to wait for that first episode

00:08:45   to download all the way before I could play it.

00:08:47   That was annoying.

00:08:49   But at the same time, I kind of wish

00:08:51   I could get rid of streaming altogether.

00:08:54   And don't worry, everyone.

00:08:56   I'm not doing this.

00:08:56   But it would make things so much simpler in so many ways.

00:09:00   It would get rid of so many weird edge conditions of,

00:09:02   well, I'm trying to offer this feature, but I can't do it--

00:09:06   like clip sharing, for instance, I can't do

00:09:08   in the current implementation.

00:09:09   I can't do clip sharing if it's not fully downloaded.

00:09:13   And right now, there's actually a bug

00:09:15   that if you use the streaming mode now in this new version,

00:09:17   it never considers episodes fully downloaded.

00:09:19   And so you just can't use clip sharing.

00:09:22   So I've got to fix that.

00:09:23   But that's a bug, not intentional.

00:09:25   But lots of things in the app would be a lot simpler

00:09:28   if I could get rid of that.

00:09:29   If I could get rid of streaming entirely,

00:09:31   it would make so much easier in the sense

00:09:35   that I could make a lot of assumptions in the code

00:09:37   that I can't make now.

00:09:38   And there was a lot of special cases

00:09:39   I wouldn't have to accommodate anymore for, like, well,

00:09:42   if the episode is downloaded from here to the end,

00:09:45   but the area before the playhead is not downloaded,

00:09:49   there's all sorts of strange conditions

00:09:51   that streaming can bring up that I would rather not

00:09:54   have to deal with.

00:09:55   But in reality, I do.

00:09:57   But at the end of the day, I suppose

00:10:00   this is what we get paid for.

00:10:01   It's like dealing with these difficult, tricky, hairy

00:10:05   problems is why people use our apps.

00:10:09   These problems tend to provide utility to people.

00:10:11   And so I guess we have to deal with it.

00:10:13   But I really wish I didn't have to.

00:10:17   And I think it's a tough thing, because it always

00:10:21   feels like you were doing the right thing at the time.

00:10:24   And then it's like, oh, this is going to be great.

00:10:26   I'm going to alleviate all these people who've

00:10:29   been complaining for so long.

00:10:30   And then you make a change.

00:10:33   And then it's like, for some people, it's worse.

00:10:35   Because they liked the old way.

00:10:37   And because they certainly didn't

00:10:38   feel like they had to tell you that they liked the old way,

00:10:40   because they liked it.

00:10:41   And so the app did exactly what they expected.

00:10:44   And so you're changing it in a way that feels-- superficially

00:10:48   should make the app better, but is actually making any change

00:10:52   whatsoever you make to an app, essentially,

00:10:54   will make it worse for someone and better for someone else.

00:10:57   And so that tension is just so harsh,

00:10:59   because you're kind of stuck.

00:11:03   And I think, too, it's like so many times,

00:11:05   I feel like these kind of things I've run into

00:11:08   are also when I adopt a feature that

00:11:13   is sort of the new hotness for an OS, or something new

00:11:16   has come out.

00:11:17   And then I adopt it.

00:11:18   And then I regret adopting it, because it turns out

00:11:21   that feature didn't really go anywhere, or is more annoying,

00:11:24   or complicated, or creates other problems.

00:11:26   And it's like, I have two of those with a pedometer

00:11:28   that I can think of, where it's like, hey, I sort of have

00:11:31   an iMessage App Store app thing that, as far as I know,

00:11:35   no one ever uses.

00:11:36   But it's still in there.

00:11:38   And I guess I could just pull it out.

00:11:40   But honestly, there's a part of it

00:11:41   that's like, I don't even know how to remove features

00:11:43   like that, because it's like a build target.

00:11:45   And there's all kinds of files.

00:11:46   And getting rid of it is just as scary

00:11:49   as keeping it in in some ways.

00:11:51   Or I think of, I implemented the Siri support for pedometer,

00:11:55   where you can start a workout by talking to Siri.

00:11:58   And that was based on just general feedback.

00:12:03   I don't think anyone's ever used it or knows it exists.

00:12:06   But it's all kinds of weird things

00:12:07   that you have to do and manage, and has caused kinds of problems

00:12:11   with my Apple Watch app as a result,

00:12:13   because it's this weird way that you have to be able to launch

00:12:15   the app into a workout, rather than launching it

00:12:18   to its normal home screen.

00:12:19   And that changes a bunch of things.

00:12:21   And it's so hard to predict, obviously,

00:12:24   the features that are going to be worth implementing.

00:12:27   And it's like, when I think of in a couple weeks,

00:12:29   we're going to get a whole new set of features or capabilities.

00:12:31   And I look at them, and I'm sure there's

00:12:33   going to be things that I'm like, oh, that's really cool.

00:12:35   That's really exciting.

00:12:36   I want to do that.

00:12:36   But probably half of those, at least,

00:12:40   aren't really going to go anywhere.

00:12:41   And then half of them will.

00:12:43   And obviously, sometimes it's really

00:12:44   paid off to be implementing the new hotness.

00:12:47   It was very important for me that I fully

00:12:49   embraced widgets this year.

00:12:51   But I don't know how to differentiate between iMessage

00:12:54   App Store and widgets.

00:12:56   I don't think I have enough insight into the world

00:12:59   to convert to the future to know that.

00:13:02   Well, there are certain things that we don't

00:13:04   regret adding to our apps.

00:13:05   And one of those is probably Revenue Cat,

00:13:08   this episode of "Under the Radar."

00:13:09   Absolutely.

00:13:10   Can confirm.

00:13:11   We were brought to you this week by Revenue Cat.

00:13:14   Trying to build your own in-app purchase stuff

00:13:16   is really a pain, especially when

00:13:18   it comes to subscriptions and validation and all that stuff.

00:13:21   Using Revenue Cat to power your app's in-app purchases

00:13:24   solves for edge cases you don't even know you have.

00:13:26   And protects from outages your team hasn't seen yet.

00:13:28   Plus, it saves you time on future maintenance--

00:13:31   because our topic this week-- and future features released

00:13:34   by the app stores.

00:13:36   Revenue Cat empowers your product and marketing teams

00:13:38   with clean and reliable IAP data so they can make better

00:13:42   decisions to help your app grow.

00:13:44   Revenue Cat handles all the headaches

00:13:45   of building in-app purchase infrastructure

00:13:47   so you can get back to building your app.

00:13:49   With support for iOS, Mac OS, Android, and Stripe,

00:13:53   Revenue Cat makes it easy to verify subscription status

00:13:55   across multiple platforms with the tools

00:13:57   you need to quickly set up and manage any in-app purchase

00:13:59   model from a simple to-do list app

00:14:01   to complex cross-platform subscriptions.

00:14:04   I can tell you, I've built these things without Revenue Cat,

00:14:07   and it is not fun.

00:14:08   So to have them take care of this for you,

00:14:10   that's a good thing.

00:14:11   They have SDKs for iOS, iPad OS, watchOS, Android, React Native,

00:14:15   Flutter, Cordova, Unity, and Mac OS Catalyst.

00:14:19   And Revenue Cat has a free tier for side projects.

00:14:22   It's free until you ship, even for the biggest apps.

00:14:25   So you can spend time building your app, not a giant, messy

00:14:29   subscription back end.

00:14:30   So relieve all of your subscription worries

00:14:33   by going to RevenueCat.com to get started for free.

00:14:37   That's RevenueCat.com to get started for free.

00:14:40   Thank you so much to Revenue Cat for saving Dave

00:14:43   a bunch of time in his apps and for sponsoring our show.

00:14:47   So I think a different category of these kind of like regret

00:14:52   at-- like feature regrets that we've built in

00:14:55   is kind of code level larger things.

00:14:58   So for me, it's like every time I've

00:15:01   built some kind of big, hairy, custom UI code,

00:15:05   I've usually regretted it because at the time I build it--

00:15:08   and we've talked a little bit about this before-- at the time

00:15:11   that we build it, I often think, well, OK, I

00:15:13   can achieve 80% of what I want.

00:15:15   But I really want that last 20%.

00:15:17   And to do that, I have to do custom UI stuff.

00:15:19   I have to either do a little bit of hacking around

00:15:22   with UITableViewCell, or maybe I have

00:15:24   to make my own custom transition between view controllers,

00:15:27   or something like that.

00:15:28   There's some kind of weird UI hack

00:15:30   that it would look really great.

00:15:32   Or to achieve the thing I want to achieve,

00:15:34   I'm going to have to go past the vanilla UI kit adjustments

00:15:37   and go a little bit hacky or a little bit deeper.

00:15:40   And whenever I have done this, I have always

00:15:44   regretted it afterwards.

00:15:46   Now, I don't regret it at the time.

00:15:48   As I'm doing it, I'm thinking, well, this

00:15:50   is kind of hairy and gross.

00:15:51   But I'm achieving something here.

00:15:53   And it's worth the outcome I'm achieving.

00:15:55   And then when it first gets done and you first

00:15:57   see that cool UI thing or that custom transition or whatever,

00:16:00   you're like, wow, my app is awesome.

00:16:02   I am awesome.

00:16:03   This is great.

00:16:05   But then a year later, when you want

00:16:08   to go change something about it, that's when you regret it.

00:16:12   That's when you're like, oh, no.

00:16:15   This is where I am in Overcast right now.

00:16:17   The Overcast UI, there's a reason

00:16:18   why I haven't changed the UI that much in the last year.

00:16:21   Because I feel kind of paralyzed under the weight of all

00:16:26   of the custom UI stuff I've done in the past.

00:16:30   And one of the things I wanted to do

00:16:32   was, I guess in the Now Playing screen,

00:16:34   I wanted to replace the whole swipey card

00:16:37   thing with the three different screens in the Now Playing

00:16:39   screen.

00:16:39   I wanted to replace that with the iOS 13 slide-up modal style.

00:16:44   And the reason I hadn't done that yet

00:16:45   is because I didn't require iOS 13 until a month ago.

00:16:50   So now I can actually do that.

00:16:52   But there's stuff like that where that whole card

00:16:55   screen I feel paralyzed by.

00:16:57   I mentioned table view cells, my whole playlist and list views.

00:17:00   Those are all just technical debt paralysis

00:17:04   all over the place there.

00:17:05   There's so much code there.

00:17:07   And I don't want to work on it.

00:17:08   Part of this is compounded by the fact

00:17:10   that I am transitioning to Swift with most of what I write now.

00:17:13   And all of that's Objective-C. And so the last thing

00:17:16   I want to do in my Swift adolescence

00:17:19   here is spend a whole bunch of time

00:17:21   working on Objective-C code.

00:17:23   So what I probably should do is rewrite it.

00:17:25   Except that's usually a terrible idea.

00:17:27   And if I'm going to rewrite it, should I rewrite it in SwiftUI?

00:17:30   It's a little early for that.

00:17:32   That would become easier if I could require iOS 14.

00:17:34   But then the WWDC is coming up, and I should probably

00:17:37   wait for that.

00:17:37   And there's all these mental blocks

00:17:40   I have that I have this kind of huge swamp of very complicated

00:17:45   UI code that I want to either significantly refactor

00:17:50   and rework or replace.

00:17:52   But that's such a big job.

00:17:54   It's kind of weighing on me.

00:17:55   Whereas I have to keep telling myself,

00:17:57   if somebody were to make a brand new app today,

00:18:00   like a brand new podcast app comes out,

00:18:02   they don't worry about all the baggage.

00:18:03   They just do whatever they can with the new stuff.

00:18:05   And they plow right past all this stuff.

00:18:08   Yeah, no, that feeling is the worst.

00:18:10   Where it's this sense of like, there is so much code in--

00:18:17   you would imagine Penometer++'s main screen.

00:18:19   It's super simple.

00:18:20   It is a bar graph.

00:18:22   There is so much sort of custom and sort

00:18:27   of like customized code in there that it's like,

00:18:30   I've thought about just rewriting it several times.

00:18:32   But it's like, I go in and look at it, and it's just like,

00:18:35   I don't know where I would even start.

00:18:38   There are so many assumptions and things.

00:18:40   And many of them are like features and little details.

00:18:43   And some of those details I've sort of semi-documented

00:18:46   or kept track of as I've gone.

00:18:47   But there are so many little things

00:18:48   that I've added over the years to make it better

00:18:50   that if I went back and rewrote it,

00:18:51   there's a good chance I would miss.

00:18:53   And then I feel like I was making the app worse.

00:18:54   I know one of the little things is I make it so that a bar

00:18:59   never touches the goal.

00:19:01   So if you imagine your step goal is 10,000,

00:19:03   there's a little line.

00:19:04   This indicates 10,000 steps.

00:19:06   And the bar that grows up never actually touches it

00:19:09   unless you actually have met your goal.

00:19:11   So if you have 9,999 steps, typically you would imagine

00:19:16   that it would, sort of from a rounding perspective,

00:19:19   it would actually eventually touch,

00:19:20   even though it hadn't actually reached the goal,

00:19:21   but just from the way that pixels work.

00:19:24   But I always put like a two pixel boundary

00:19:26   between your bar and your graph

00:19:29   until you've actually met your goal,

00:19:31   which is just one of those little like sounds.

00:19:33   It's like a cool little feature,

00:19:34   and I think it makes sense,

00:19:36   because what's important for many people

00:19:37   is that they've hit their goal.

00:19:38   And it's like those kind of details,

00:19:41   every time I sort of start to go into that code,

00:19:43   I'm like, I built so many little features and tweaks

00:19:46   and things like that into this

00:19:47   that I would never find them all.

00:19:49   - Yeah.

00:19:50   - And then inevitably I'm gonna annoy someone

00:19:52   who is reliant on that or enjoyed it

00:19:54   or wished it was better.

00:19:55   And it's almost like I'm going back in time,

00:19:58   like making the app worse,

00:20:00   and then sort of like trying to go forward.

00:20:03   And in a way that doesn't benefit anyone except for me,

00:20:06   in many ways, like I've thought about here.

00:20:07   It's a relatively easy screen.

00:20:09   I could certainly remake this in SwiftUI

00:20:12   or in something that's a bit more straightforward

00:20:15   or performant or like many different reasons potentially

00:20:18   that mostly would benefit me,

00:20:19   but like I'm not very, at this point,

00:20:22   I'm never gonna touch it.

00:20:23   And it's funny now when I go and I've been spending

00:20:26   so much time in SwiftUI and Swift,

00:20:28   and Pedometer++ is almost written entirely in Objective-C.

00:20:31   I'm at the point now where I look at Objective-C

00:20:33   and I'm like, "I don't even know what this is."

00:20:34   And if there's a new feature or a new thing I need to adopt

00:20:38   and address in iOS 15, it's gonna be tough.

00:20:41   Like I remember with iOS 14 stuff with the fullscreen modal

00:20:48   or like the non-fullscreen modal,

00:20:49   and it changed the way that like view did appear

00:20:52   and view did disappear, sort of dynamics changed,

00:20:55   and it caused so many problems and issues for me.

00:20:58   And part of it's because it's this very kind of like,

00:21:02   there's assumptions and things that I've built into the app

00:21:05   that now I have to deal with.

00:21:07   And so like there's certainly,

00:21:08   I feel like there's in some ways a turning into

00:21:10   just a discussion about technical debt,

00:21:13   but it's like many of it does just come down to this.

00:21:16   It's hard, anytime you add something to an app,

00:21:19   it becomes like just a weight

00:21:21   that you have to carry around with you forever.

00:21:24   And I think it's increasingly becoming something

00:21:26   that I'm feeling more circumspect about as a result.

00:21:29   That's like, do I want to,

00:21:31   is this feature worth carrying around,

00:21:33   like hanging on my neck for the next five years?

00:21:37   And if it isn't, like my bar becomes much higher for like,

00:21:39   is this actually worth doing or not?

00:21:42   - Yeah, but see that,

00:21:45   I feel like what we should be telling ourselves here,

00:21:48   whether or not we can actually do it,

00:21:49   but what we should be telling ourselves here is,

00:21:52   be bold and don't be afraid to change your mind,

00:21:54   and if something's bad, take it out.

00:21:56   And I would love to do that, and sometimes I do,

00:22:00   but there are real costs to that in terms of like,

00:22:04   you anger people so much when you take something out.

00:22:07   Like, I still get one-star reviews.

00:22:11   Like, there are like certain people

00:22:12   who are mad that I changed something

00:22:14   or took something out like five years ago

00:22:17   who will leave a one-star review

00:22:18   on every single update I make.

00:22:21   That's ridiculous.

00:22:23   But that's what happens.

00:22:26   And it's something that you have to either

00:22:30   bow to that pressure and accommodate everybody somehow,

00:22:33   which is probably impossible,

00:22:34   and then results in optionitis in your app

00:22:36   where you, oh, make everything a preference.

00:22:39   Or you have to be willing to be bold

00:22:42   and anger a bunch of people

00:22:43   and get a bunch of one-star reviews

00:22:45   and a bunch of angry emails and tweets,

00:22:46   and just be ready for like,

00:22:49   well, maybe I will just make up for that

00:22:53   with five-star things instead,

00:22:54   and maybe I will be able to take the criticism

00:22:57   and just ignore it because there's so many other people

00:22:59   who like it, or maybe I should do this

00:23:01   'cause I'm confident enough to make it,

00:23:02   you know, that it'll make it better.

00:23:04   But that's a really hard thing to do,

00:23:06   especially like when you don't know

00:23:08   how something's gonna go.

00:23:09   Like, you know, one of the decisions I wanna make is like,

00:23:12   as I am, you know, hopefully doing a UI redesign soon

00:23:16   if I can get over myself,

00:23:18   one of the things I wanna tackle is,

00:23:21   do I still want to have a custom font in the app?

00:23:24   I switched the default to the system font to San Francisco

00:23:28   a few months back, and almost no one noticed.

00:23:32   And the very few people who did notice said,

00:23:35   oh, I like the redesign. (laughs)

00:23:38   Even though they're just switching the default.

00:23:39   But I know like, you know, there are certain people,

00:23:43   like a lot of my friends love the custom font.

00:23:45   And a lot of them have told me like,

00:23:47   yeah, you know, do what you want,

00:23:49   but I think I will like it less with San Francisco,

00:23:52   or it loses its personality, whatever.

00:23:53   Like, I've heard that a lot from people I respect.

00:23:55   And so it makes it really hard for me to say,

00:23:57   well, I should really drop that.

00:23:59   But I drop, like I've been using the system font

00:24:01   on my copy of the app for over a year.

00:24:04   And I like it better.

00:24:05   And now like whenever I go test my custom font,

00:24:08   it looks old to me.

00:24:10   So I should probably just drop the custom font already,

00:24:13   'cause that would make all of my, you know,

00:24:15   my future work with Swift UI,

00:24:17   and as I redesign a lot of these screens,

00:24:18   like to only have to make it accommodate one font

00:24:21   and only test with one font would make it so much easier.

00:24:25   But I know I would lose a lot of people with that.

00:24:28   And I kind of feel,

00:24:30   well, maybe I wouldn't lose a lot of people with that.

00:24:32   I would hear from a lot of people about that.

00:24:35   And I wouldn't be able to discount them all

00:24:37   as like, you know, raging idiots,

00:24:38   because a lot of them are my friends.

00:24:40   And, or people I respect, or you know,

00:24:42   people who I know have good opinions and good taste.

00:24:46   And I really don't wanna have to go through that.

00:24:48   But I also really wanna get rid of the custom font,

00:24:51   because it would make my job a lot easier.

00:24:53   And so I don't know, it's a tough,

00:24:55   how do you balance that kind of thing?

00:24:57   - Oh man, the reality is of course is like you can't.

00:25:01   Like I think you just have to,

00:25:03   it feels very much like making the least worst decision,

00:25:07   rather than necessarily there being an obvious best.

00:25:10   That, which is not great,

00:25:13   but that's the reality of the work that we're doing,

00:25:15   is it's cool where everything that we put into the app

00:25:20   creates an expectation in our customer.

00:25:22   And the, hopefully the nature of our apps

00:25:25   is that they have a wide and varied audience

00:25:28   that is big enough that everyone's,

00:25:31   everyone has a different, you know,

00:25:32   like any particular feature or detail or nuance of the app,

00:25:36   there's a chance that it's someone's most favorite thing

00:25:39   about your app.

00:25:40   That it is the thing that draws them to it,

00:25:42   it is the reason they use it.

00:25:44   And there are certainly gonna be some features

00:25:46   that are gonna be, you know,

00:25:48   lots of people's favorite feature,

00:25:50   and then there's gonna be these little details

00:25:52   or these little nuances or whatever it is,

00:25:54   and that's gonna be someone's favorite feature.

00:25:56   And so every time you add one,

00:25:58   you create a new opportunity, I suppose,

00:26:00   for someone else to find a new favorite.

00:26:03   But then you also then have, you know,

00:26:05   carry it along with that becomes the risk

00:26:08   that it's someone's favorite feature.

00:26:09   And if you take it away from them,

00:26:11   it feels much worse than if you had never given it to them

00:26:13   in the first place and they never knew that it was there.

00:26:17   And it's just hard.

00:26:18   I'm like, this is the paralysis that I certainly feel,

00:26:20   and sometimes I think,

00:26:22   as I've been sort of slightly introspective

00:26:23   about it recently, I think this is part of why I like,

00:26:26   one of the many reasons why I like making new apps

00:26:29   is to, it sort of lets me avoid the question

00:26:33   of what should I change, when instead it's like,

00:26:35   if I'm making something new, everything's new,

00:26:37   there's no expectations, I can just make it.

00:26:39   But if I'm going back and changing something,

00:26:42   it's much harder.

00:26:43   And I've made the wrong choice many times,

00:26:45   where, and sometimes I have taken features out

00:26:47   and then had to re-add them back in,

00:26:48   or I take them out and there's a consequence

00:26:51   in terms of engagement or interest in the app,

00:26:54   or whatever it is, and it's like,

00:26:56   that tension is just so hard.

00:26:57   And so, I think in the end, it's like,

00:26:59   I think about going into another round of new iOS,

00:27:02   new watchOS, et cetera, this year.

00:27:04   It's like, I think I am increasingly,

00:27:05   as I've gotten more experienced with this,

00:27:08   I have much more of a feeling of,

00:27:11   if it doesn't really make the core of the experience better,

00:27:14   I'm gonna be very cautious about adding a feature to an app,

00:27:18   because it's creating all these problems

00:27:20   that we're having to sort of wrestle with now,

00:27:23   that we have to, I don't think,

00:27:25   I think I would often discount those.

00:27:27   And while sometimes it'll be kind of small

00:27:29   and a bit of a joke, like,

00:27:30   ah, the iMessage App Store didn't go anywhere,

00:27:33   but sometimes it's real features or real problems

00:27:35   or things that you're just like,

00:27:36   you're gonna be wrestling with streaming

00:27:38   and I'll be dealing with Apple Watch merging

00:27:40   for probably till the end of time, hopefully.

00:27:42   It's just, these are the problems that don't go away.

00:27:45   - Right, well, 'cause a lot of that

00:27:47   is just inherent complexity of what the market demands.

00:27:50   I regret ever having done a watch app.

00:27:52   I spent so much time on watch apps,

00:27:56   and I've rewritten it four times,

00:27:59   'cause it always needed it,

00:28:01   and I regret so much about having poured so much time

00:28:04   into Apple Watch development.

00:28:05   But that's also what my market demands.

00:28:08   People expect podcast apps to have watch apps,

00:28:12   and so I kinda have to do it.

00:28:14   The hard part is knowing ahead of time,

00:28:15   like whether what you're pouring all your time into

00:28:18   is something that you need to do

00:28:20   or something that seems like you might need to do it,

00:28:22   but then after you do it, no one uses it.

00:28:25   - Yeah.

00:28:25   And that's just the reality, I suppose, right?

00:28:28   Like, I think in some ways, I wish this was one

00:28:30   of those episodes where there was like an answer,

00:28:31   and I think the answer is more,

00:28:33   this is something that's important to be aware of,

00:28:36   that this is when you're factoring,

00:28:37   when you're deciding what to do,

00:28:39   when you're going through and doing planning,

00:28:40   when a new version of iOS comes out,

00:28:42   and you're going through and being like,

00:28:44   what should I do, kind of coming up

00:28:46   with your plan for the summer.

00:28:47   It's like one of the features that you need,

00:28:49   it's like you need to imagine yourself

00:28:51   three years in the future dealing with this feature,

00:28:53   and if it isn't something that excites you,

00:28:54   if it isn't like, oh my goodness,

00:28:56   this is gonna be amazing, then maybe not.

00:28:59   Like, maybe be thoughtful, maybe hold back,

00:29:00   maybe be a bit more timid,

00:29:03   and save yourself the future pain.

00:29:05   - Stay away from custom UI.

00:29:07   - It's not worth it.

00:29:08   - It's not worth it.

00:29:09   - Thank you everybody for listening,

00:29:10   and we will talk to you in two weeks.

00:29:13   - Bye.

00:29:14   [BLANK_AUDIO]