PodSearch

Under the Radar

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 ◼   ► to build

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 ◼   ► development

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 ◼   ► one button

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 ◼   ► head

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:18 ◼   ► off

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:21 ◼   ► that way

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:35 ◼   ► to

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:30 ◼   ► better

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:48 ◼   ► apps but

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