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: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: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: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
◼
►
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: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
◼
►
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:14
◼
►
[BLANK_AUDIO]