PodSearch

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]