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