Under the Radar

Under the Radar 7: Building New Features


  welcome to under the radar a show about

  independent iOS development I'm Marco

  Arment and I'm David Smith under the

  radar is never longer than 30 minutes so

  let's get started so today what we

  wanted to kind of unpack is the process

  that we go through when we're building a

  feature out in an app it's not like the

  whole app itself like starting from I

  have this you know have this vague idea

  for something and now let's go like go

  to Xcode and start a new project but as

  you know as a product as an app

  developed and gets better over time

  you're going to inevitably have these

  little like huh here's this feature I

  have here's this thing that I want to do

  and I want to you know to add it in and

  the way in which you go about that is

  something that is requires a different

  kind of level of concern or planned

  fulness then you're just starting from

  scratch because obviously you're

  smashing it into an existing piece bit

  of code and also just the constraints

  around what you're doing are different

  and recently I ran into something where

  I thought it was an interesting kind of

  progression that I found that I was

  going through I mean I was adding a

  feature to sleep plus plus which is my

  Apple watch sleep tracker basically I

  wanted to be able to you record your

  night's activity and you end up with

  like a graph of how well you slept and

  people asked feature I got many many

  times like I want to be able to trim the

  night at the end of the at the end of

  you know it says if I wake up in the

  morning and I don't stop it right when I

  wake up I wanted to say actually I woke

  up at this time seems a very reasonable

  feature the thing that I found was

  interesting is I went through the

  process of building this out and so it's

  like now it's basically a part of the

  app is I tend to go kind of I start off

  with like huh that's an interesting idea

  how would I build that and then I kind

  of I tend to work a little bit like from

  the bottom up and the top down when I'm

  working on a feature like this which is

  seemed kind of funny like I started the

  data level and start being like what

  data would I need to record how would I

  record that what migrations do I need to

  do in my database what changes will I

  have to make there and I start building

  the basic structure for that on the

  bottom and then I start on the top top

  down in a really simplistic way like I

  start off with what's the UI going to

  look like but I don't actually build

  that UI I just take whatever stock

  control I can find like I think in this

  case I took a UI slider threw it into

  interface builder

  that up to that apply to transform to it

  cuz I needed it to slide vertically so I

  just like rotated it by 90 degrees and

  that was my basic control eventually I

  ended up replacing that with a whole

  custom UI and all kinds of things like

  that but starting in that sort of top

  down as simple as I can on the UI side

  and then as robust as I can on the

  bottom side is something that it seems

  to work for me and it's an approach

  though that I found that if like if I

  don't if I can't end up with something

  that I can use and can start playing

  with quickly that's why I sort of the

  top down is important from like just

  really basic simple UI I really struggle

  with actually getting things done did

  you have a similar experience for me it

  like any any feature that I that I want

  to build

  I always just build it as quickly as I

  can and start using it myself and you

  know my process or like we talked a

  little bit about betas in previous

  episodes and everything my process for

  forward testing out features is really I

  just test them out myself for as long as

  I can before I show them to anybody else

  at all before I even said into beta

  testers usually like you know an

  overcast I mentioned last in last

  episode I mentioned that that voice

  boost started out as as having different

  levels it was not just an honour and off

  switch it actually had multiple modes

  and I lived with that for months before

  I showed anybody else before the beta

  started and everything and and I really

  I did a similar thing I mean like you

  know my UI for controlling these things

  is mostly just stock UI kit I very

  rarely make custom controls or what I do

  they're usually pretty lightweight

  subclasses of the built-in buttons and

  labels and sliders and stuff like that

  or I you know they might just be like a

  slight wrapper with like with one of

  those as a subview and then and and you

  know like a few of the labels here and

  there but for the most part I'm using

  mostly stock stuff because you can get

  really really far with stock components

  in a UI kit especially with all the all

  the custom appearance stuff that they've

  added in the last few OS versions really

  I have found very little reason to to

  really build out tons of custom control

  stuff and and I've instead focused on

  like just skinning UI kit well and so

  yeah and so when I when I build these

  features I mean

  voice boost as I mentioned it used to be

  it used to have four levels

  it used to be off reduce enhance and

  boost and I went I was about to launch

  with this I really thought this was

  gonna be what I launched with and I had

  rationales for all of them

  so the reduce mode would actually cut

  off it was actually a high-pass and

  low-pass filter it would actually cut

  off big chunks of the top and bottom end

  for podcasts that were produced with

  flaws with either way too much bass or

  sometimes sometimes a lot of sometimes

  podcasts would have like very high

  pitched noise and so I thought a reduced

  move would actually be useful and then

  and in the the volume boosting modes I

  actually had to I had enhance and boost

  and it was just two different degrees of

  the same thing really of the the EQ and

  the compression and with boost being a

  much more aggressive compression setting

  what I found in the beta was people were

  very confused by this because it just

  labeled dynamics reduce off enhanced

  boost like okay what does dynamics mean

  you know somebody who is not an audio

  engineer is that referring to motion

  like what it was it was a very confusing

  thing people were confused as to why

  they would ever want to reduce the

  dynamics of something and between

  enhance and boost well what does that

  mean is this like enhanced like CSI

  where you're uncovering detail that is

  magically there somehow you know and it

  doesn't really communicate that

  enhancing booster basically two

  different dynamics of the same thing it

  was a very confusing feature and I

  didn't you know I mentioned last time I

  didn't see the confusing aspect of it

  because I made it and so I knew what it

  was I didn't have to explain to myself

  what it was my tester started started

  seeing this and seeing that it was

  probably you know not ideal one day

  during testing I I just mocked up a

  quick little thing where I realized that

  I was just leaving it in boost most of

  the time because after trying to there

  options here and there during


  I discovered that boost was just the

  best one and that's the way I wanted to

  leave almost everything like I almost

  never wanted any of the other options so

  that's when I decided you know what I'll

  solve two problems I'll solve the the

  intuitiveness problem and and the UI

  understandability problem with what this

  feature actually is

  and you know I don't actually want these

  other modes you know in practice I find

  out this isn't that important so I'll

  cut I'll cut those features I'll make it

  one button

  it's either boost on or off and I call

  it voice boost mostly because it wasn't

  being next to smart speed so it needed

  two words because it would look weird if

  it only had one this is how I make

  future decisions important yeah yeah and

  and and that's how that feature came to

  be and I'll see if I can put a link in

  the show notes of I always take

  screenshots along the way of designing

  the app and so I had this whole history

  of like how the app looked in various

  stages of development and who all

  prototyping various features and so I

  actually have a screen shot of it with

  these four features and I'll show you

  the effects pane with this and then you

  can you can see like how the one I went

  with with just the two big buttons was

  so much simpler that's a lot of very

  long-winded way of saying that I I kind

  of evolve features as much as I can both

  using it myself and then showing beta

  testers before I before they ever get to

  the public and I think it's very

  important not only to to have that

  process when adding features but also to

  really consider like you know if I had

  if I had released this the way I

  originally I originally had it with

  these four different options and then

  later decided what I decided are in the

  data that you know this actually she

  don't really just be one thing then

  that's a feature removal to a lot of

  people who use the other ones and then

  and you got to go into that very

  carefully and I'm not one to avoid

  feature removals

  I have often angered people by removing

  features but it is it is a lot harder to

  remove features politically after you've

  already shipped them to people so I

  think one thing to also consider is like

  how do you remove a feature from an app

  and how do you how does that how do you

  decide when to do that when is the right

  time to do that and and how do you

  manage user expectations and user

  feelings about that

  yeah and I think it also speaks a little

  bit to one of the something that you

  have to get you're used to is that you

  are inevitably going to build features

  that won't ship that you're gonna build

  stuff that ultimately just doesn't work

  out and I think there's a certain amount

  of just like distancing yourself from

  your work enough that you can

  look at it like I feel definitely gone

  on this path where I'm thinking hey this

  is hey this would be an awesome new

  feature and especially this is dangerous

  when it's a really interesting technical

  problem mmm like I think I have this

  really cool solution to a problem I'd go

  down this go down the path and I started

  adding though these features and it's

  like building it all out

  and you get to the end and you're just

  like it's a really interesting salute to

  a solution to a problem that people

  don't actually have or it makes the gap

  really harder to understand or more

  complicated or less intuitive and at the

  end being able to say like you know I

  just need to throw this away like that

  was that's a dead end

  like that is just not gonna go anywhere

  and in like having done that now so many

  times where I'll create this you know

  create this branch go down it and then

  end up deciding that this is actually

  not gonna work I'm just gonna throw it

  away is definitely an encouragement and

  a reminder to not spend too much time on

  things to in terms of trying to quickly

  get to a point that you can really

  evaluate how useful something is because

  it's there's so many things that in my


  sound like they'll be really cool and

  really fun and when you implement them

  like don't really aren't actually as

  useful as you think or the the more like

  good and bad situation is when you'll

  show it to somebody and like they'll

  you're sure you'll give them something

  to react to and their response is like

  huh that's interesting why doesn't it

  just do this and they make it sort of

  like there's this like that clarifying

  simplification that you're just not

  seeing because you're deep down in the

  weeds of the coolness of the feature or

  what like in this petit on this

  particular track and it turns out a much

  better solution is it's like in this

  case with with voice boosts it's like

  you're the dynamics and things I think

  are it's like it's really these are

  really interesting and optioned

  interesting options that you could kind

  of go down but at the end it's like

  really what people want is to make it

  louder so they can hear voices clearer

  and so you just need on and off and

  that's probably but good enough and you

  have to be willing to say like you know

  all the other stuff that I was doing

  like the really sophisticated dynamic

  stuff with like okay

  maybe I just don't ship that because

  it's just gonna make it more confusing

  rather than actually better for most

  people right because that was it was

  exactly the kind of thing where like it

  was technically interesting it was

  technically impressive you know not

  a lot of podcast apps have enhanced

  dynamics and and EQ controls and

  everything so it was it was like a cool

  thing to do if I would have shipped that

  because I it was kind of like showing


  my audio engine and my audio

  manipulation skills I guess but in

  reality that was really just showing off

  for my benefit and and it wasn't hot

  like it was actually me it would be

  making the app worse to ship it that way

  because it was more confusing because as

  you said like not a lot of people really

  had that problem very often not even I

  had the problem often enough to use my

  own feature very much so it's it really

  does take a lot of editing and I feel

  like there's there's a good balance to

  be struck here between but the way I do

  it I move pretty slowly and like you

  know with streaming like I was I had

  streaming working to to varying degrees

  of work probably three months before I

  shipped it but I wanted that very long

  testing period because I wanted to be

  very conservative with it they have a

  lot of time just using it on my own

  phone before I even gave it to testers

  let alone to the public and at the on

  the other side the other extreme of this

  of like the the feature deployment speed

  here is kind of like they get the kind

  of like continuous release paradigm

  where you just kind of ship something

  out there as quickly as you possibly can

  as soon as you have the idea for it and

  see if it takes maybe do some a be

  testing or you know see what people's

  reactions are I feel like the the the

  better balance is somewhere in the

  middle of those things I feel like I

  move too slowly the way I do things but

  something like that where you're

  constantly adding or moving things it

  makes it first of all it makes it harder

  to remove things but and second of all I

  think I think you you increase the the

  annoyance rate of your users like when

  you do things like when Twitter rolls

  out a new feature and it goes out to a

  random subset of people first and

  everyone else hears about it like wait

  why don't I have this or why is my

  timeline all of a sudden different or

  you know why does this not work the way

  I expected to and everyone else's works

  fine these two extremes of like when how

  often you ship things how how much

  testing you do internally versus just

  ship into the public and seeing what

  they think first there is a healthy

  balance to be struck between those two

  extremes I haven't started but III think

  I would rather be on the if unbalance in

  that way

  I think I'd rather be unbalanced in the

  direction that I am which is on the on

  the side of being too conservative and

  too slow because ultimately I want my

  app to always have a reputation of being

  carefully considered yeah and I think

  honestly that the app store itself is

  structured such that you can't do

  continuous release in a in a functional

  way because your app it always has to go

  through a preview which can take a

  non-deterministic amount of time at

  least about a week and you have to be

  able to you can only ship things to the

  store that you can live with for at

  least a week probably which depending on

  which were the kind of change that

  you're rolling out and the significance

  of it or like if there's a problem with

  it if you have to have a certain amount

  of conservatism to make sure that you're

  not putting something out there that is

  going to be very problematic for your

  product that if for a week it's horribly

  broken or really confusing like you

  can't just change that you know could

  like continuous deployment and things

  works great for an app like a web app or

  something that you can change in real

  time or in many earth-like if you're in

  the Google Play Store for example you

  can do something like that a lot more

  there because you can bro out updates

  more quickly but in general it's

  definitely something that you have to be

  thoughtful about and understand that

  it's going to like this is going to go

  out and you have no control over

  necessarily when someone's going to be

  able to change and so I mean you can

  certainly go down the crazy roads where

  you Bill have like a be testing built

  into your app and it has multiple code

  paths and things but that just seems

  like a nightmare to me but it's

  definitely something that I think I'm

  more on the release things quicker

  approach that like I tend to bite off

  nice small things focus on them get them

  like working and then put it out there

  and in general I think that seems to

  work for me and I think mostly of

  something that even it's just an

  attention span thing look I really

  struggle to like when I hear you talked

  about working on features for months

  like that is really intimidating to me

  because I think I would lose interest

  and once I got it so like once I get

  something working all the crazy edge

  cases are harder for me to have the

  discipline to track down and so I tend


  just focus and simplify the problem down

  to a point vet oh look all the edge

  cases seem to have sort of fallen off as

  best I can which is a different kind of

  approach but I found kind of works for

  me well I mean that's honestly that's

  probably the more healthy approach is

  you know to ship something that is that

  is smaller but complete and chip that

  faster rather than wait until you have

  something that is complete but is big

  and sprawling and that there then and

  then that takes six months you know like

  that yeah I think your approach there's

  probably the healthier one yeah but it

  requires I guess some of it too and

  maybe is its it's the interesting thing

  of trying to decide a most interesting

  direction to ship the conversation to is

  how do you tell me how we decide what

  features to add I think is it really

  interest it's like it's a very

  complicated set of variables that I find

  that I'm balancing for these days where

  on the one hand you have the desire to

  make something good to ship a good

  product to ship software that's useful

  that people like you have the constraint

  and that you're trying to optimize for

  around like business model and business

  plan like well adding this feature

  increase the number of people who are

  using my app or paying for my app or in

  some way contributing to the bottom line

  in my business is this feature something

  that's going to motivate me and make me

  interested and trying to balance the

  sort of attention between those is I

  think more definitely more art than

  science because there's not at least at

  least I haven't found a good way to

  really know that other than just like

  this feels right like every now and then

  I'll get asked by people you know like

  how do I plan releases like how do I

  said do I sit down like not like I

  wanted to do like some kind of waterfall

  think but do I have like a big release

  plan like you would you probably need to

  have if you were trying to apply a team

  of developers onto something and it's

  like I tend to just sit down and look at

  my apps and be like what could be made


  what would I enjoy building well that

  and then think about huh I suppose that

  might make people like the app more and

  then go with it but then you're also

  more often than not I'll look at an app

  and be like the apps kind of done like

  maybe I should just leave it and work on

  you know move on to the next step and I

  guess that's why I end up with so many

  apps but

  like trying to decide what features

  worth actually doing is really hard

  deciding when an app is is basically

  done or doesn't need massive attention

  for at least a little while that is a

  skill that that I think iOS developers

  need and many of us myself included

  often don't do it right or don't have

  that skill because the economics of iOS

  are such that you really do have a much

  better chance of success if you have

  multiple apps and the the additional

  value that you will get sales wise or

  money wise the additional value you will

  get out of doing a big feature update to

  an existing app might not be worth the

  effort that it will require to be put

  into that to do and a lot of a lot of

  people want the the the model of just

  having one app that they work on forever

  well not forever but the you know one

  app that they pour tons of time into

  polishing everything up and and being

  able to live off just that one app and

  that is that is very rare to actually

  have that in the App Store and and to be

  successful at that not because you know

  Apple is is keeping us all down or

  anything but because in most cases most

  apps you hit you hit a wall of

  diminishing returns where like the most

  people's needs are satisfied by it who

  will find it and who will want it and

  who will pay for most people's need to

  get satisfied pretty early on in

  development and then you're just kind of

  like adding stuff just really for your

  benefit trying to make the app better to

  boost sales or to get more press at some

  point or get it to get upgrade revenue

  maybe at whereas the customers really

  aren't in great need of those things and

  the best example of that kind of thing

  is Microsoft Office and you see like

  over time all the all the challenges

  Microsoft faced over the last 20 years

  of like just trying to get people to buy

  office upgrades and and when everyone's

  sitting around saying you know what

  Microsoft Wars been working fine for me

  I don't really need anything else

  please don't add anything else you know

  because every time I upgrade I paid this

  large amount of money and then

  everything gets slower and some things

  are different and I have to retrain

  myself or my staff and so you have like

  customers who are actually kind of

  asking you please don't upgrade this

  so I feel like you know if you take

  lessons from from the industry in the

  past you can kind of see like a lot of

  times a given limited resources and

  limited time that you have as an

  individual or as a small company doing

  an upgrade to to a product for the sake

  of upgrading it is not necessarily the

  best use of your time and and you David

  you know you have I think a very good

  sense of that possibly even an overly

  aggressive sense of that but I think

  it's sir very well in that you don't

  seem to pour a lot of effort into into

  massive upgrades to apps that don't

  necessarily warrant them and you are

  very happy to try new apps way more

  often than most people I know yeah and I

  think some of it is coming from

  understanding that I remember I refuse

  ago I hadn't the insert the realization

  that the way we version number our apps

  that is sort of in some ways somewhat

  our art like it's kind of arbitrary that

  we tend to do this this concept of like

  a major a major update and then in there

  you have minor updates and then you have

  bug pickups updates like you have like

  two point one point six or something and

  it's coming from a world where you made

  your money only on major updates and so

  you had to kind of create this sense of

  you put out a major update to get a

  bunch of money and then you do minor

  updates in many ways to build goodwill

  and bug fix updates just to fix things

  but like you do these minor update

  updates to build goodwill with your

  customers they have this feeling of like

  they bought like this basic thing and

  then hey they got this other stuff for

  free like they got all these these minor

  updates these other improvements for

  free and then you come around just like

  all right now it's time to shake that

  treat the money tree again and down will

  answer like here's version two and you

  kind of you know it's like now it's like

  all right now all that goodwill I had

  I'm kind of cashing it in and saying

  please you know please give me give me

  some money again and you have to have

  some kind of feature or some kind of

  thing that you're able to point to and

  say like this is why you should pay me

  money now but in the App Store and at

  least in a lot of way the way the App

  Store economics work that isn't actually

  the reality anymore that it isn't a

  situation where like most of my apps

  don't make any

  like when I do a major update I see a

  little bump maybe in revenue but overall

  it's really just about sustaining and

  maintaining a level of revenue in the

  long run and that changes a lot that

  mentality that like the version numbers

  of my apps are in some ways kind of

  arbitrary like they're almost more just

  marketing things like if I'm trying to

  get a the attention of the press then I

  may call it a bigger number but I could

  also just call it version 1 version 2

  version 3 version 4 and it would be just

  as descriptive as far as my customers

  are concerned yeah I find the same thing

  with you know with paid apps especially

  where like you know if you that the

  massive version number change is really

  good for press but it in sales you know

  the sales can result from that press you

  get a little sales bump sometimes but

  I've always found that whenever I've

  done major updates to to apps this is go

  all the way back to Instapaper or

  certainly overcast

  whenever I've done like significant

  feature updates or major like you know

  x2 updates there is a bump but it's a

  pretty small bump in sales and it's and

  every every major version bump is

  smaller than the one that came before it

  yeah and you know so you really are I

  think you're right it really is about

  maintenance like you are you are keeping

  the app up-to-date you are keeping it

  competitive in a competitive field you

  are keeping users interested but I don't

  I don't think any of those things

  require major X dot o updates really

  ever necessarily you know you can you

  can you can add like moderate scale

  features over time as they come and and

  achieve most that same goal respond to

  this week by image X image XCOM /u tr4

  under the radar image X is basically an

  image CDN that they serve your images

  but you can do operations on them so you

  can resize them you can trend you can

  translate their formats you can you know

  scale and crop and and twist and change

  the colors and do everything that you

  can add annotations to them the number

  of operations you can do on these images

  simply by adding URL parameters and

  signing the URLs is incredible I mean

  the you can you can resize them to any

  dimension of course you can you can crop

  you can letter

  any kind of resizing needs you have they

  can do it but you can also edit you can

  do things like blur filters you can do

  all sorts of special effect you can

  adjust the colors the toning you can

  really do quite a bit with image X I use

  it myself for overcast and I I have I've

  been very impressed with it it is very

  very fast overall I would say image X is

  really worth looking at if you if you

  need image manipulation either for your

  app where you're serving you know pull

  images off the web you need to do

  something with them into an app or for

  web pages it's especially nice for web

  pages because you can you can do things

  like surf responsive images serve

  different resolutions to different

  browsers there's there are lots of

  libraries if you want to to use client

  libraries they have lots of those

  including one for Swift called iris

  which is from the developers over at ho

  dinky I feel like if you look at ho

  dinky is a watch

  website like a watch enthusiast website

  and and they have beautiful imagery all

  over the site and that's all powered by

  image X so you can see a great example

  of all the things that can do there

  anyway check it out today image Dick's

  calm this IMG I XCOM slash utr thanks a

  lot to image X for sponsoring our show

  all right and I think enclosing down

  this one thing that I was trying to

  think through is like the concrete

  example of the best kind of features to

  add to an app and there's the thought

  that came to mind is something that

  they'll talk about in video gaming what

  you're doing like the be doing a patch

  or an update to an app and our to the

  game and they'll call them quality of

  life improvements which are changes that

  don't change the fundamental nature of

  your app it R of the game in this case

  but are things that make using it better

  like it's just a quality of life thing

  it makes doing this operation that used

  to be kind of annoying or complicated or

  awkward simple or more straightforward

  and like that kind of quality of life

  update when I'm looking at an app that I

  have and I'm trying to think of what it

  features I need to add the first thing

  that I always try and think through and

  I think it's a great place to start

  it's like are there any quality of life

  improvements I can do is there some

  operation right now that is common and

  frequent but awkward and annoying and if

  I can find anything like that like that

  is by far the low-hanging fruit

  that I need to make sure that I'm taken

  care of before I worry up too much about

  inventing new problems to solve

  like is there are there existing

  problems that I have that the app solves

  but solves in a way that I could be make

  better and if I do that that's where I

  think you get the most bang for your

  buck and that's where building features

  out and doing these little improvements

  that you can ultimately like you can you

  can over time make your app just more

  better and better without making it more

  and more complicated or more and more

  sprawling alright thanks a lot for

  listening this week please recommend us

  an overcast if you get a chance help

  spread the show tell a friend we'd love

  to get more listeners to the show and if

  you want to support our network and us

  at relay FM I relay of have just

  launched memberships recently you can

  you can pay money optionally to any

  relay FM show or to all really FM shows

  if you want to just give like a nice

  basically a monthly donation to us we

  appreciate that if you feel like it if

  not no big deal

  thanks a lot to image for sponsoring and

  yeah thank you all for listening and

  we'll talk to you next week bye