7: Building New Features
00:00:00
◼
►
Welcome to Under the Radar, a show about independent iOS development.
00:00:03
◼
►
I'm Marco Arment.
00:00:05
◼
►
And I'm David Smith.
00:00:06
◼
►
Under the Radar is never longer than 30 minutes, so let's get started.
00:00:10
◼
►
So today what we wanted to kind of unpack is the process that we go through when we're
00:00:17
◼
►
building a feature out in an app.
00:00:19
◼
►
It's not like the whole app itself, like starting from, I have this vague idea for something
00:00:23
◼
►
and now let's go to Xcode and start a new project.
00:00:26
◼
►
But as a product, as an app develops and gets better over time, you're going to inevitably
00:00:33
◼
►
have these little like, huh, here's this feature I have, here's this thing that I want to do,
00:00:38
◼
►
and I want to add it in.
00:00:41
◼
►
And the way in which you go about that is something that requires a different kind of
00:00:46
◼
►
level of concern or planfulness than just starting from scratch.
00:00:49
◼
►
Because obviously, A, you're smooshing it into an existing piece of code, and also just
00:00:54
◼
►
the constraints around what you're doing are different.
00:00:58
◼
►
And recently I ran into something where I thought it was an interesting kind of progression
00:01:00
◼
►
that I found that I was going through.
00:01:02
◼
►
When I was adding a feature to sleep++, which is my Apple Watch sleep tracker, basically
00:01:07
◼
►
I wanted to be able to record your night's activity and you end up with a graph of how
00:01:12
◼
►
well you slept.
00:01:13
◼
►
And people asked, a feature I got many, many times was like, "I want to be able to trim
00:01:16
◼
►
the night at the end of..."
00:01:17
◼
►
It says, "If I wake up in the morning and I don't stop it right when I wake up," I wanted
00:01:21
◼
►
to say, actually, I woke up at this time.
00:01:24
◼
►
Seems a very reasonable feature.
00:01:26
◼
►
The thing that I found as interesting
00:01:27
◼
►
as I went through the process of building this out--
00:01:29
◼
►
and so now it's basically a part of the app--
00:01:32
◼
►
is I tend to go kind of--
00:01:34
◼
►
I start off with, like, huh, that's an interesting idea.
00:01:37
◼
►
How would I build that?
00:01:38
◼
►
And then I tend to work a little--
00:01:41
◼
►
it's like from the bottom up and the top
00:01:43
◼
►
down when I'm working on a feature like this, which
00:01:45
◼
►
it seemed kind of funny.
00:01:47
◼
►
I started the data level and start being like,
00:01:48
◼
►
what data would I need to record?
00:01:50
◼
►
How would I record that?
00:01:51
◼
►
what migrations do I need to do in my database, what changes will I have to make there?
00:01:54
◼
►
And I start building the basic structure for that on the bottom.
00:01:58
◼
►
And then I start on the top down in a really simplistic way.
00:02:01
◼
►
I start off with what's the UI going to look like, but I don't actually build that UI.
00:02:05
◼
►
I just take whatever stock control I can find, like I think in this case I took a UI slider,
00:02:10
◼
►
threw it into Interface Builder, hooked it up to that, applied a transform to it because
00:02:15
◼
►
I needed it to slide vertically, so I just rotated it by 90 degrees, and that was my
00:02:20
◼
►
basic control. Eventually I ended up replacing that with a whole custom UI and all kinds
00:02:24
◼
►
of things like that. But starting in that sort of top-down, as simple as I can on the
00:02:29
◼
►
UI side, and then as robust as I can on the bottom side, is something that seems to work
00:02:34
◼
►
for me. And it's an approach though that I found that if I can't end up with something
00:02:40
◼
►
that I can use and can start playing with quickly, that's why sort of the top-down
00:02:43
◼
►
is important from like just really basic simple UI, I really struggle with actually getting
00:02:48
◼
►
anything's done.
00:02:50
◼
►
Do you have a similar experience?
00:02:52
◼
►
- For me, any feature that I want to build,
00:02:57
◼
►
I always just build it as quickly as I can
00:03:00
◼
►
and start using it myself.
00:03:01
◼
►
My process, we talked a little bit about betas
00:03:04
◼
►
in previous episodes and everything,
00:03:06
◼
►
my process for testing out features is really,
00:03:10
◼
►
I just test them out myself for as long as I can
00:03:12
◼
►
before I show them to anybody else at all.
00:03:15
◼
►
Before I even send them to beta testers usually.
00:03:17
◼
►
Overcast, I mentioned last in last episode, I mentioned that that voice boost started
00:03:23
◼
►
out as as having different levels. It was not just an on or an off switch. It actually
00:03:27
◼
►
had multiple modes. And I lived with that for months before I showed anybody else before
00:03:34
◼
►
the beta started and everything. And I really I did a similar thing. I mean, like, you know,
00:03:39
◼
►
my UI for controlling these things is mostly just stock UI kit. I very rarely make custom
00:03:44
◼
►
controls or when I do they're usually pretty lightweight subclasses of the built in buttons
00:03:50
◼
►
and labels and slider and stuff like that. Or they might just be a slight wrapper with
00:03:57
◼
►
one of those as a subview and a few other labels here and there. But for the most part
00:04:03
◼
►
I'm using mostly stock stuff because you can get really really far with stock components
00:04:09
◼
►
in UIKit especially with all the custom appearance stuff that they've added in the last few OS
00:04:13
◼
►
Really, I have found very little reason to really build out tons of custom control stuff
00:04:20
◼
►
and I've instead focused on just skinning UIKit well.
00:04:24
◼
►
And so when I built these features, I mean, Voice Boost as I mentioned, it used to have
00:04:30
◼
►
four levels.
00:04:31
◼
►
It used to be off, reduce, enhance, and boost.
00:04:36
◼
►
And I was about to launch with this.
00:04:38
◼
►
I really thought this was going to be what I launched with.
00:04:40
◼
►
And I had rationales for all of them.
00:04:43
◼
►
So the reduce mode would actually cut off, it was actually a high pass and a low pass
00:04:48
◼
►
filter, it would actually cut off big chunks of the top and bottom end for podcasts that
00:04:53
◼
►
were produced with flaws, with either way too much bass or sometimes, sometimes podcasts
00:04:59
◼
►
would have like very high pitched noise and so I thought a reduce mode would actually
00:05:06
◼
►
And then the volume boosting modes, I actually had two.
00:05:10
◼
►
I had enhance and boost.
00:05:12
◼
►
And it was just two different degrees of the same thing, really, of the EQ and the compression,
00:05:17
◼
►
and with boost being a much more aggressive compression setting.
00:05:20
◼
►
What I found in the beta was people were very confused by this because it just labeled dynamics.
00:05:25
◼
►
Reduce off enhance boost.
00:05:26
◼
►
It's like, okay, what does dynamics mean?
00:05:29
◼
►
You know, it's just somebody who is not an audio engineer.
00:05:32
◼
►
Is that referring to motion?
00:05:33
◼
►
Like, it was a very confusing thing.
00:05:36
◼
►
People were confused as to why they would ever want
00:05:38
◼
►
to reduce the dynamics of something.
00:05:40
◼
►
And between enhance and boost, well what does that mean?
00:05:43
◼
►
Is this like enhance like CSI,
00:05:45
◼
►
where you're uncovering detail
00:05:46
◼
►
that is magically there somehow?
00:05:48
◼
►
You know, and it doesn't really communicate
00:05:50
◼
►
that enhance and boost are basically
00:05:51
◼
►
two different dynamics of the same thing.
00:05:54
◼
►
It was a very confusing feature.
00:05:57
◼
►
And I didn't, you know, I mentioned last time,
00:05:59
◼
►
I didn't see the confusing aspect of it because I made it.
00:06:02
◼
►
And so I knew what it was.
00:06:04
◼
►
I didn't have to explain to myself what it was.
00:06:07
◼
►
My testers started seeing this and seeing
00:06:09
◼
►
that it was probably not ideal.
00:06:12
◼
►
One day during testing, I just mocked up
00:06:14
◼
►
a quick little thing where I realized
00:06:16
◼
►
that I was just leaving it in Boost most of the time
00:06:18
◼
►
because after trying the other options here and there
00:06:20
◼
►
during development, I discovered that Boost
00:06:23
◼
►
was just the best one.
00:06:25
◼
►
And that's the way I wanted to leave almost everything.
00:06:27
◼
►
I almost never wanted any of the other options.
00:06:30
◼
►
So that's when I decided, you know what,
00:06:31
◼
►
I'll solve two problems.
00:06:32
◼
►
I'll solve the intuitiveness problem
00:06:35
◼
►
and the UI understandability problem
00:06:38
◼
►
with what this feature actually is.
00:06:40
◼
►
And I don't actually want these other modes.
00:06:44
◼
►
In practice, I find out this isn't that important,
00:06:46
◼
►
so I'll cut those features.
00:06:47
◼
►
I'll make it one button.
00:06:48
◼
►
It's either boost on or off,
00:06:50
◼
►
and I call it voice boost,
00:06:51
◼
►
mostly because it was being next to smart speed,
00:06:53
◼
►
so it needed two words
00:06:55
◼
►
'cause it would look weird if it only had one.
00:06:57
◼
►
This is how I make feature decisions.
00:06:59
◼
►
- Important. - Yeah, yeah.
00:07:01
◼
►
And that's how that feature came to be.
00:07:03
◼
►
And I'll see if I can put a link in the show notes.
00:07:06
◼
►
I always take screenshots along the way
00:07:09
◼
►
of designing the app.
00:07:10
◼
►
And so I have this whole history of how the app looked
00:07:13
◼
►
in various stages of development
00:07:15
◼
►
and while prototyping various features.
00:07:17
◼
►
And so I actually have a screenshot of it
00:07:18
◼
►
with these four features
00:07:19
◼
►
and I'll show you the effects pane with this
00:07:21
◼
►
and then you can see how the one I went with
00:07:24
◼
►
with just the two big buttons was so much simpler.
00:07:27
◼
►
That's a very long-winded way of saying
00:07:30
◼
►
that I kind of evolve features as much as I can,
00:07:34
◼
►
both using it myself and then showing beta testers
00:07:37
◼
►
before they ever get to the public.
00:07:40
◼
►
And I think it's very important,
00:07:42
◼
►
not only to have that process when adding features,
00:07:46
◼
►
but also to really consider, like,
00:07:49
◼
►
you know, if I had released this
00:07:51
◼
►
the way I originally had it
00:07:52
◼
►
with these four different options,
00:07:54
◼
►
and then later decided what I decided during the beta
00:07:56
◼
►
that, you know, this actually should really
00:07:57
◼
►
just be one thing,
00:07:59
◼
►
then that's a feature removal to a lot of people
00:08:01
◼
►
who use the other ones.
00:08:02
◼
►
And you gotta go into that very carefully.
00:08:06
◼
►
And I'm not one to avoid feature removals.
00:08:09
◼
►
I have often angered people by removing features,
00:08:13
◼
►
but it is a lot harder to remove features politically
00:08:17
◼
►
after you've already shipped them to people.
00:08:18
◼
►
So I think one thing to also consider is like,
00:08:21
◼
►
how do you remove a feature from an app?
00:08:23
◼
►
And how do you decide when to do that?
00:08:27
◼
►
When is the right time to do that?
00:08:29
◼
►
and how do you manage user expectations
00:08:32
◼
►
and user feelings about that?
00:08:34
◼
►
- Yeah, and I think it also speaks a little bit to
00:08:36
◼
►
one of the, something that you have to get used to is
00:08:40
◼
►
that you are inevitably going to build features
00:08:42
◼
►
that won't ship, that you're gonna build stuff
00:08:46
◼
►
that ultimately just doesn't work out,
00:08:49
◼
►
and I think there's a certain amount of just like
00:08:52
◼
►
distancing yourself from your work enough
00:08:54
◼
►
that you can look at it, like I've really definitely
00:08:56
◼
►
gone down this path where I'm thinking,
00:08:57
◼
►
hey, this would be an awesome new feature.
00:08:59
◼
►
And especially this is dangerous
00:09:01
◼
►
when it's a really interesting technical problem.
00:09:04
◼
►
It's like I think I have this really cool solution
00:09:05
◼
►
to a problem.
00:09:07
◼
►
I go down the path and I start adding all these features
00:09:10
◼
►
and it's like building it all out.
00:09:11
◼
►
And you get to the end and you're just like,
00:09:13
◼
►
it's a really interesting solution to a problem
00:09:15
◼
►
that people don't actually have.
00:09:17
◼
►
Or it makes the gap really harder to understand
00:09:20
◼
►
or more complicated or less intuitive.
00:09:23
◼
►
And at the end being able to say like,
00:09:25
◼
►
you know, I just need to throw this away.
00:09:27
◼
►
like that's a dead end, that is just not gonna go anywhere.
00:09:32
◼
►
And having done that now so many times
00:09:35
◼
►
where I'll create this branch, go down it,
00:09:38
◼
►
and then end up deciding that this is actually
00:09:39
◼
►
not gonna work, I'm just gonna throw it away,
00:09:42
◼
►
is definitely an encouragement and a reminder
00:09:44
◼
►
to not spend too much time on things,
00:09:46
◼
►
in terms of trying to quickly get to a point
00:09:49
◼
►
that you can really evaluate how useful something is.
00:09:53
◼
►
Because there's so many things that in my head
00:09:55
◼
►
sounds like they'll be really cool and really fun, and when you implement them, they aren't
00:10:01
◼
►
actually as useful as you think.
00:10:02
◼
►
Or the more good and bad situation is when you'll show it to somebody, and you'll give
00:10:08
◼
►
them something to react to, and their response is like, "Huh, that's interesting.
00:10:13
◼
►
Why doesn't it just do this?"
00:10:15
◼
►
And it's sort of like there's this clarifying simplification that you're just not seeing
00:10:20
◼
►
because you're deep down in the weeds of the coolness of the feature or on this particular
00:10:27
◼
►
track, and it turns out a much better solution is, in this case, with voice boost.
00:10:33
◼
►
The dynamics and things, I think, these are really interesting options that you could
00:10:38
◼
►
kind of go down, but at the end, really what people want is to make it louder so they can
00:10:43
◼
►
hear voices clearer.
00:10:45
◼
►
And so you just need on and off, and that's probably good enough.
00:10:49
◼
►
and you have to be willing to say like,
00:10:50
◼
►
you know all the other stuff that I was doing,
00:10:52
◼
►
like the really sophisticated dynamic stuff,
00:10:55
◼
►
it's like, okay, maybe I just don't ship that
00:10:57
◼
►
because it's just gonna make it more confusing
00:10:59
◼
►
rather than actually better for most people.
00:11:02
◼
►
- Right, 'cause it was exactly the kind of thing
00:11:04
◼
►
where it was technically interesting,
00:11:06
◼
►
it was technically impressive,
00:11:08
◼
►
not a lot of podcast apps have enhanced dynamics
00:11:11
◼
►
and EQ controls and everything,
00:11:13
◼
►
so it was like a cool thing to do
00:11:16
◼
►
if I would have shipped that
00:11:17
◼
►
because it was kind of like showing off my audio engine
00:11:20
◼
►
and my audio manipulation skills, I guess.
00:11:23
◼
►
But in reality, that was really just showing off
00:11:26
◼
►
for my benefit and it was not like,
00:11:29
◼
►
it was actually, it would be making the app worse
00:11:32
◼
►
to ship it that way because it was more confusing,
00:11:34
◼
►
because as you said, like not a lot of people
00:11:36
◼
►
really had that problem very often.
00:11:38
◼
►
Not even I had the problem often enough
00:11:40
◼
►
to use my own feature very much.
00:11:42
◼
►
So it really does take a lot of editing
00:11:45
◼
►
And I feel like there's a good balance to be struck here
00:11:48
◼
►
between, like the way I do it, I move pretty slowly.
00:11:52
◼
►
And like, you know, with streaming, like I was,
00:11:55
◼
►
I had streaming working to varying degrees of work,
00:11:59
◼
►
probably three months before I shipped it,
00:12:02
◼
►
but I wanted that very long testing period
00:12:04
◼
►
because I wanted to be very conservative with it
00:12:05
◼
►
and to have a lot of time just using it on my own phone
00:12:08
◼
►
before I even gave it to testers, let alone to the public.
00:12:11
◼
►
And on the other side, the other extreme of this,
00:12:15
◼
►
of the feature deployment speed here,
00:12:18
◼
►
is the continuous release paradigm,
00:12:22
◼
►
where you just ship something out there
00:12:24
◼
►
as quickly as you possibly can,
00:12:25
◼
►
as soon as you have the idea for it,
00:12:27
◼
►
and see if it takes, maybe do some A/B testing,
00:12:29
◼
►
or see what people's reactions are.
00:12:31
◼
►
I feel like the better balance
00:12:33
◼
►
is somewhere in the middle of those things.
00:12:34
◼
►
I feel like I move too slowly the way I do things,
00:12:37
◼
►
but something like that,
00:12:38
◼
►
where you're constantly adding or moving things,
00:12:41
◼
►
First of all, it makes it harder to remove things.
00:12:43
◼
►
And second of all, I think you increase
00:12:47
◼
►
the annoyance rate of your users,
00:12:50
◼
►
like when you do things, like when Twitter
00:12:52
◼
►
rolls out a new feature and it goes out
00:12:53
◼
►
to a random subset of people first.
00:12:55
◼
►
And everyone else hears about it,
00:12:57
◼
►
and like, wait, why don't I have this?
00:12:58
◼
►
Or why is my timeline all of a sudden different?
00:13:00
◼
►
Or why does this not work the way I expect it to
00:13:03
◼
►
and everyone else's works fine?
00:13:04
◼
►
These two extremes of how often you ship things,
00:13:07
◼
►
how much testing you do internally
00:13:10
◼
►
versus just shipping to the public
00:13:11
◼
►
and seeing what they think first.
00:13:13
◼
►
There is a healthy balance to be struck
00:13:14
◼
►
between those two extremes.
00:13:16
◼
►
I haven't struck it, but I think I would rather be,
00:13:19
◼
►
if I'm gonna be unbalanced in that way,
00:13:22
◼
►
I think I'd rather be unbalanced in the direction that I am,
00:13:24
◼
►
which is on the side of being too conservative and too slow,
00:13:28
◼
►
because ultimately I want my app to always have a reputation
00:13:31
◼
►
of being carefully considered.
00:13:34
◼
►
- Yeah, and I think, honestly, that the App Store itself
00:13:38
◼
►
structured such that you can't do continuous release in a functional way, because your
00:13:45
◼
►
app always has to go through app review, which can take a non-deterministic amount of time,
00:13:51
◼
►
at least about a week. And you have to be able to—you can only ship things to the
00:13:55
◼
►
store that you can live with for at least a week, probably, which, depending on the
00:14:02
◼
►
kind of change that you're rolling out and the significance of it, or if there's a
00:14:06
◼
►
problem with it.
00:14:08
◼
►
You have to have a certain amount of conservatism to make sure that you're not putting something
00:14:11
◼
►
out there that is going to be very problematic for your product that if for a week it's horribly
00:14:17
◼
►
broken or really confusing, you can't just change that.
00:14:22
◼
►
Continuous deployment and things works great for an app, like a web app or something that
00:14:25
◼
►
you can change in real time.
00:14:28
◼
►
Or if you're in the Google Play Store, for example, you can do something like that a
00:14:31
◼
►
lot more there because you can roll out updates more quickly.
00:14:35
◼
►
But in general, it's definitely something that you have to be thoughtful about and understand
00:14:39
◼
►
that it's going to -- this is going to go out, and you have no control over necessarily
00:14:44
◼
►
when someone's going to be able to change.
00:14:47
◼
►
And so, I mean, you can certainly go down the crazy roads where you have AB testing
00:14:51
◼
►
built into your app and it has multiple code paths and things, but that just seems like
00:14:55
◼
►
a nightmare to me.
00:14:57
◼
►
But it's definitely something that I think I'm more on the release things quicker approach.
00:15:03
◼
►
I tend to bite off nice small things, focus on them, get them working, and then put it
00:15:13
◼
►
In general, I think that seems to work for me, and I think mostly it's something that
00:15:16
◼
►
even is just an attention span thing.
00:15:18
◼
►
I really struggle to...
00:15:19
◼
►
When I hear you talking about working on features for months, that is really intimidating to
00:15:25
◼
►
me because I think I would lose interest.
00:15:29
◼
►
I get something working, all the crazy edge cases are harder for me to have the discipline
00:15:34
◼
►
to track down, and so I tend to just focus and simplify the problem down to a point that,
00:15:38
◼
►
"Oh, look, all the edge cases seem to have sort of fallen off as best I can," which
00:15:43
◼
►
is a different kind of approach, but I found kind of works for me.
00:15:47
◼
►
Well, I mean, honestly, that's probably the more healthy approach, is to ship something
00:15:51
◼
►
that is smaller but complete and ship that faster, rather than wait until you have something
00:15:59
◼
►
that is complete but is big and sprawling,
00:16:02
◼
►
and then that takes six months.
00:16:05
◼
►
I think your approach there is probably the healthier one.
00:16:08
◼
►
- Yeah, but it requires, I guess,
00:16:10
◼
►
and some of it too, maybe,
00:16:12
◼
►
it's the interesting thing of trying to decide,
00:16:15
◼
►
I'm just interested in a direction
00:16:16
◼
►
to shift the conversation to,
00:16:17
◼
►
is how we decide what features to add,
00:16:21
◼
►
I think is a really,
00:16:22
◼
►
it's a very complicated set of variables
00:16:26
◼
►
that I find that I'm balancing for these days,
00:16:28
◼
►
where on the one hand you have the desire to make something good, to ship a good product,
00:16:34
◼
►
to ship software that's useful, that people like, you have the constraint that you're
00:16:39
◼
►
trying to optimize for around business model and business plan, like will adding this feature
00:16:45
◼
►
increase the number of people who are using my app or paying for my app or in some way
00:16:51
◼
►
contributing to the bottom line of my business, is this feature something that's going to
00:16:55
◼
►
motivate me and make me interested. And trying to balance the tension between those is, I
00:17:01
◼
►
think, definitely more art than science. Because at least I haven't found a good way to really
00:17:08
◼
►
know that other than just like, "This feels right." Every now and then I'll get asked by people,
00:17:13
◼
►
like, "How do I plan releases? Do I sit down?" It's not like I want to do some kind of waterfall
00:17:19
◼
►
think, but do I have a big release plan like you probably need to have if you were trying
00:17:24
◼
►
to apply a team of developers onto something? And it's like, I tend to just sit down and
00:17:29
◼
►
look at my apps and be like, "What could be made better? What would I enjoy building?"
00:17:34
◼
►
And then think about, "Huh, I suppose that might make people like the app more," and
00:17:37
◼
►
then go with it. But then also, more often than not, I'll look at an app and be like,
00:17:42
◼
►
"The app's kind of done. Maybe I should just leave it and move on to the next app." And
00:17:47
◼
►
I guess that's why I end up with so many apps, but trying to decide what feature is worth
00:17:51
◼
►
actually doing is really hard.
00:17:54
◼
►
Deciding when an app is basically done or doesn't need massive attention for at least
00:17:59
◼
►
a little while, that is a skill that I think iOS developers need.
00:18:04
◼
►
And many of us, myself included, often don't do it right or don't have that skill, because
00:18:10
◼
►
the economics of iOS are such that you really do have a much better chance of success if
00:18:16
◼
►
if you have multiple apps and the additional value
00:18:20
◼
►
that you will get, sales-wise or money-wise,
00:18:23
◼
►
the additional value you will get out of doing
00:18:26
◼
►
a big feature update to an existing app
00:18:29
◼
►
might not be worth the effort that it will require
00:18:32
◼
►
to be put into that to do.
00:18:34
◼
►
And a lot of people want the model of just having one app
00:18:39
◼
►
that they work on forever, well not forever,
00:18:42
◼
►
but one app that they pour tons of time into
00:18:44
◼
►
polishing everything up and being able to live off
00:18:47
◼
►
just that one app.
00:18:48
◼
►
And that is very rare to actually have that
00:18:52
◼
►
in the app store and to be successful at that.
00:18:55
◼
►
Not because Apple is keeping us all down or anything,
00:18:59
◼
►
but because in most cases, most apps,
00:19:04
◼
►
you hit a wall of diminishing returns where like,
00:19:07
◼
►
most people's needs are satisfied by it,
00:19:11
◼
►
who will find it and who will want it
00:19:13
◼
►
and who will pay for it.
00:19:14
◼
►
most people's need to get satisfied pretty early on
00:19:16
◼
►
in development and then you're just kinda like
00:19:18
◼
►
adding stuff just really for your benefit,
00:19:21
◼
►
trying to make the app better to boost sales
00:19:24
◼
►
or to get more press at some point
00:19:25
◼
►
or to get upgrade revenue maybe.
00:19:28
◼
►
Whereas the customers really aren't
00:19:31
◼
►
in great need of those things.
00:19:32
◼
►
And the best example of that kind of thing
00:19:33
◼
►
is Microsoft Office.
00:19:34
◼
►
And you see like over time,
00:19:36
◼
►
all the challenges Microsoft faced over the last 20 years
00:19:40
◼
►
of just trying to get people to buy Office upgrades.
00:19:44
◼
►
And when everyone's sitting around saying,
00:19:46
◼
►
you know what, Microsoft Word's been working fine for me,
00:19:48
◼
►
I don't really need anything else,
00:19:50
◼
►
please don't add anything else,
00:19:52
◼
►
'cause every time I upgrade,
00:19:53
◼
►
I pay this large amount of money,
00:19:54
◼
►
and then everything gets slower,
00:19:56
◼
►
and some things are different,
00:19:57
◼
►
and I have to retrain myself or my staff.
00:19:59
◼
►
And so you have customers who are actually asking you,
00:20:01
◼
►
please don't upgrade this.
00:20:03
◼
►
So I feel like if you take lessons
00:20:05
◼
►
from the industry in the past,
00:20:07
◼
►
you can kind of see, a lot of times,
00:20:10
◼
►
given limited resources and limited time that you have
00:20:12
◼
►
as an individual or as a small company,
00:20:15
◼
►
doing an upgrade to a product for the sake of upgrading it
00:20:19
◼
►
is not necessarily the best use of your time.
00:20:20
◼
►
And you, David, you have, I think,
00:20:23
◼
►
a very good sense of that.
00:20:25
◼
►
Possibly even an overly aggressive sense of that,
00:20:27
◼
►
but I think it serves you very well in that
00:20:30
◼
►
you don't seem to pour a lot of effort
00:20:32
◼
►
into massive upgrades to apps
00:20:35
◼
►
that don't necessarily warrant them,
00:20:36
◼
►
and you are very happy to try new apps
00:20:38
◼
►
way more often than most people I know.
00:20:41
◼
►
- Yeah, and I think some of it is coming from understanding
00:20:44
◼
►
that I remember a few years ago,
00:20:47
◼
►
I had the realization that the way we version number
00:20:52
◼
►
our apps is sort of, in some ways, somewhat,
00:20:57
◼
►
it's kind of arbitrary that we tend to do this concept
00:21:01
◼
►
of a major update, and then you have minor updates,
00:21:04
◼
►
and then you have bug-fic updates,
00:21:05
◼
►
like you have 2.1.6 or something, and it's coming from a world where you made your money
00:21:13
◼
►
only on major updates.
00:21:16
◼
►
And so you had to kind of create this sense of you put out a major update to get a bunch
00:21:22
◼
►
of money, and then you do minor updates in many ways to build goodwill, and bug fix updates
00:21:28
◼
►
just to fix things, but you do these minor updates to build goodwill with your customers.
00:21:33
◼
►
They have this feeling of like, they bought this basic thing, and then hey, they got this
00:21:38
◼
►
other stuff for free.
00:21:39
◼
►
Like they got all these minor updates, these other improvements for free.
00:21:42
◼
►
And then you come around and it's like, alright, now it's time to shake the money tree again,
00:21:47
◼
►
and so here's version 2.
00:21:50
◼
►
And now it's like, alright, now all that goodwill I had, I'm kind of cashing it in and saying,
00:21:55
◼
►
please give me some money again.
00:21:57
◼
►
And you have to have some kind of feature or some kind of thing that you're able to
00:22:01
◼
►
to point to and say, "This is why you should pay me money now." But in the App Store, and
00:22:06
◼
►
at least in the way the App Store economics work, that isn't actually the reality anymore.
00:22:11
◼
►
That it isn't a situation where most of my apps don't make any substantial—like, when
00:22:17
◼
►
I do a major update, I see a little bump, maybe, in revenue, but overall it's really
00:22:23
◼
►
just about sustaining and maintaining a level of revenue in the long run. And that changes
00:22:29
◼
►
a lot that mentality that like the version numbers of my apps are in some ways kind of
00:22:32
◼
►
arbitrary like they're almost more just marketing things like if I'm trying to get the attention
00:22:36
◼
►
of the press then I may call it a bigger number but I could also just call it version one
00:22:41
◼
►
version two version three version four and it would be just as descriptive as far as
00:22:45
◼
►
my customers are concerned.
00:22:48
◼
►
Yeah I find the same thing with you know with paid apps especially where like you know if
00:22:52
◼
►
If you, the massive version number change is really good for press but in sales, the
00:23:00
◼
►
sales can result from that press, you get a little sales bump sometimes but I've always
00:23:04
◼
►
found that whenever I've done major updates to apps, this is going all the way back to
00:23:09
◼
►
Instapaper certainly Overcast, whenever I've done like significant feature updates or major
00:23:13
◼
►
like X.0 updates, there is a bump but it's a pretty small bump in sales and every major
00:23:21
◼
►
version bump is smaller than the one that came before it.
00:23:26
◼
►
So I think you're right, it really is about maintenance.
00:23:29
◼
►
You are keeping the app up to date, you are keeping it competitive in a competitive field,
00:23:35
◼
►
you are keeping users interested, but I don't think any of those things require major X.O
00:23:42
◼
►
updates really ever necessarily.
00:23:46
◼
►
You can add moderate scale features over time as they come and achieve most of that same
00:23:51
◼
►
We are sponsored this week by Imageix. Imageix.com/utr for under the radar. Imageix is basically
00:24:00
◼
►
an image CDN that they serve your images but you can do operations on them. So you can
00:24:06
◼
►
resize them, you can translate their formats, you can scale and crop and twist and change
00:24:13
◼
►
the colors and do everything that you can add annotations to them. The number of operations
00:24:18
◼
►
you can do on these images simply by adding URL parameters and signing the URLs is incredible.
00:24:26
◼
►
I mean, you can resize them to any dimension of course, you can crop, you can letterbox,
00:24:31
◼
►
any kind of resizing needs you have they can do it. But you can also, as I said, you can
00:24:34
◼
►
do things like blur filters, you can do all sorts of special effects, you can adjust the
00:24:39
◼
►
colors, the toning, you can really do quite a bit with ImageX. I use it myself for Overcast
00:24:46
◼
►
and I've been very impressed with it.
00:24:48
◼
►
It is very, very fast.
00:24:50
◼
►
Overall, I would say ImageX is really worth looking at
00:24:54
◼
►
if you need image manipulation either for your app
00:24:57
◼
►
where you're pulling images off the web,
00:24:59
◼
►
you need to do something with them into an app,
00:25:01
◼
►
or for web pages, it's especially nice for web pages
00:25:05
◼
►
because you can do things like serve responsive images,
00:25:07
◼
►
serve different resolutions to different browsers.
00:25:09
◼
►
There are lots of libraries,
00:25:11
◼
►
if you want to use client libraries,
00:25:13
◼
►
they have lots of those including one for Swift
00:25:15
◼
►
called Iris, which is from the developers over at Hodinkee.
00:25:18
◼
►
And if you look at, Hodinkee is a watch website,
00:25:21
◼
►
like a watch enthusiast website,
00:25:23
◼
►
and they have beautiful imagery all over the site,
00:25:27
◼
►
and that's all powered by ImageX,
00:25:28
◼
►
so you can see a great example
00:25:29
◼
►
of all the things it can do there.
00:25:30
◼
►
Anyway, check it out today.
00:25:32
◼
►
ImageX.com, that's I-M-G-I-X.com/UTR.
00:25:36
◼
►
Thanks a lot to ImageX for sponsoring our show.
00:25:39
◼
►
- All right, and Hank, in closing down this,
00:25:42
◼
►
one thing that I was trying to think through
00:25:44
◼
►
is the concrete example of the best kind of features to add to an app.
00:25:51
◼
►
And the thought that came to mind is something that they'll talk about in video gaming,
00:25:56
◼
►
when you're doing, like, they'll be doing a patch or an update to an app, or to the
00:26:01
◼
►
game, and they'll call them "quality of life improvements," which are changes that
00:26:05
◼
►
don't change the fundamental nature of your app, or of the game in this case, but are
00:26:10
◼
►
things that make using it better.
00:26:13
◼
►
Like it's just a quality of life thing.
00:26:14
◼
►
It makes doing this operation that used to be kind of annoying or complicated or awkward
00:26:20
◼
►
simple or more straightforward.
00:26:22
◼
►
And like that kind of quality of life update, when I'm looking at an app that I have and
00:26:26
◼
►
I'm trying to think of what are features I need to add, the first thing that I always
00:26:30
◼
►
try and think through and I think is a great place to start is like are there any quality
00:26:33
◼
►
of life improvements I can do?
00:26:35
◼
►
Is there some operation right now that is common and frequent but awkward and annoying?
00:26:40
◼
►
And if I can find anything like that, that is by far the low-hanging fruit that I need
00:26:44
◼
►
to make sure that I'm taking care of before I worry too much about inventing new problems
00:26:51
◼
►
Like, are there existing problems that I have that the app solves, but solves in a way that
00:26:56
◼
►
I can make better?
00:26:58
◼
►
And if I do that, that's where I think you get the most bang for your buck.
00:27:01
◼
►
And that's where building features out and doing these little improvements that you can
00:27:05
◼
►
you can ultimately, you can over time make your app
00:27:09
◼
►
just more, better and better without making it
00:27:11
◼
►
more and more complicated, or more and more sprawling.
00:27:16
◼
►
- All right, thanks a lot for listening this week.
00:27:18
◼
►
Please recommend us on Overcast if you get a chance,
00:27:20
◼
►
help spread the show, tell a friend,
00:27:22
◼
►
we'd love to get more listeners to the show.
00:27:25
◼
►
And if you wanna support our network and us at Relay FM,
00:27:28
◼
►
Relay FM just launched memberships recently,
00:27:31
◼
►
so you can pay money optionally to any Relay FM show
00:27:35
◼
►
or to all of Relay FM shows.
00:27:37
◼
►
If you wanna just give like a nice
00:27:38
◼
►
basically monthly donation to us.
00:27:40
◼
►
We'd appreciate that if you feel like it,
00:27:41
◼
►
if not, no big deal.
00:27:42
◼
►
Thanks a lot to Imageous for sponsoring.
00:27:44
◼
►
And yeah, thank you all for listening,
00:27:46
◼
►
and we'll talk to you next week.