PodSearch

Under the Radar

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:05 ◼   ► be useful.

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:11 ◼   ► out there.

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:50 ◼   ► to solve.

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.

00:27:48 ◼   ► - Bye.

00:27:49 ◼   ► [