PodSearch

Developing Perspective

#40: Ship It

 

00:00:00 ◼   ► [MUSIC PLAYING]

00:00:03 ◼   ► Hello, and welcome to Developing Perspective.

00:00:05 ◼   ► Developing Perspective is a podcast discussing news of note

00:00:08 ◼   ► in Apple, iOS, and the like.

00:00:10 ◼   ► I'm your host, David Smith.

00:00:11 ◼   ► I'm an independent iOS developer based in Herndon, Virginia.

00:00:14 ◼   ► This is show number 40, and today is Tuesday, May 1.

00:00:17 ◼   ► Developing Perspective is never longer than 15 minutes,

00:00:19 ◼   ► so let's get started.

00:00:21 ◼   ► All right, today I'm going to be talking about my process

00:00:25 ◼   ► for releasing a new app.

00:00:26 ◼   ► Like I mentioned yesterday, I'm working

00:00:28 ◼   ► to audiobooks, which is one of my sort of main sort of bread and butter apps, and it's

00:00:33 ◼   ► kind of something I've been working on for a couple of months now in reality.

00:00:36 ◼   ► And so I kind of thought it would be interesting to share what that process looks like, how

00:00:41 ◼   ► I start with something that is in the store right now, you know, it's shipped, it's working,

00:00:46 ◼   ► it's making me money, and take that and sort of decide how I'm going to work on it, how

00:00:52 ◼   ► I'm going to improve it, what makes sense.

00:00:54 ◼   ► So essentially what typically happens when I launch an app is I'm going to take something,

00:01:01 ◼   ► put it in the store, you kind of say whatever, like the last version 3.0, say, and I ship

00:01:07 ◼   ► it and you kind of hope, you pray, you see what happens and you kind of see how people

00:01:13 ◼   ► like it, some people don't, some people like it, some people won't.

00:01:16 ◼   ► I've been doing this for long enough that I can't, I must say that I don't really read

00:01:20 ◼   ► my app store reviews very much anymore.

00:01:23 ◼   ► just not a lot of useful information in there very often.

00:01:27 ◼   ► I tend to base my sort of decisions on things like people who take the

00:01:31 ◼   ► effort to write me an email and do so in a sort of a non-anonymous way

00:01:35 ◼   ► that I can react to.

00:01:36 ◼   ► But you know, you kind of get into a bug fix phase where I'm like,

00:01:40 ◼   ► okay, now I'm going to add, you know, oh, some reports are a problem

00:01:44 ◼   ► here.

00:01:45 ◼   ► Oh, I shipped something that was, you know, that was silly, that was

00:01:47 ◼   ► silly, that was silly.

00:01:48 ◼   ► Kind of work my way through that process.

00:01:51 ◼   ► And then I will sort of hit a point where I'm like, "Okay, I think it's about time to

00:01:58 ◼   ► kind of do something new."

00:02:00 ◼   ► Or "I'd like to improve it."

00:02:03 ◼   ► Or you know, kind of maybe wonder if I'd do better sales if I did something else.

00:02:10 ◼   ► And so this kind of is a tricky thing to do, to sort of make that decision.

00:02:15 ◼   ► Because I want to always make sure that I'm not shipping updates just for the purpose

00:02:19 ◼   ► of shipping updates.

00:02:20 ◼   ► I think there's kind of, you can kind of get used into this cycle of like, okay, well,

00:02:24 ◼   ► you know, software that gets updates is, that's what you do.

00:02:30 ◼   ► It's like, I'm writing software, it needs an update.

00:02:31 ◼   ► I'm writing software, I need an update.

00:02:34 ◼   ► But that cycle you can also kind of end up just sort of with the Microsoft Word approach

00:02:38 ◼   ► or you, well, we're just going to throw in features.

00:02:40 ◼   ► We're throwing features, throwing features.

00:02:42 ◼   ► Whereas what I tend to do for a major update is to kind of think, okay, what are some of

00:02:48 ◼   ► the marquee features that people have talked about that they would like, or features they

00:02:54 ◼   ► don't like how they work currently, those kinds of things.

00:02:58 ◼   ► I put all that together.

00:03:00 ◼   ► And then I take those, work through from all the help desk requests we've gotten, and think

00:03:07 ◼   ► about, okay, so that's the starting point.

00:03:10 ◼   ► Here's the big features.

00:03:11 ◼   ► Here's things I'm thinking about.

00:03:14 ◼   ► And then I'm like, OK, let's draw a line, kind of branch the code and say, OK, so I

00:03:19 ◼   ► might do some bug fixes on what's in the store now, but I'm going to work on this new thing.

00:03:24 ◼   ► And this is just probably worth pointing out that this is slightly different than my process

00:03:27 ◼   ► when I'm working on an update that's motivated by Apple.

00:03:33 ◼   ► So like when the Retina iPad came out, I needed Retina graphics.

00:03:37 ◼   ► That update is just kind of like, I see the need, I do it, and you move on.

00:03:40 ◼   ► But for these kind of more functional updates, I then I can draw a line, say, okay, now I'm

00:03:46 ◼   ► working on whatever numbering thing I'm working on.

00:03:50 ◼   ► I'm working on version 5.0.

00:03:52 ◼   ► And just kind of branch the code and start diving into that.

00:03:56 ◼   ► And for me, the way that I kind of work that tactically, I'm not a big fan of these, or

00:04:01 ◼   ► I tend to not do things like feature branches and kind of have this very complicated sort

00:04:06 ◼   ► configuration management process internally

00:04:09 ◼   ► for a project where I'm the only person working on it

00:04:12 ◼   ► because it tends to just sort of

00:04:14 ◼   ► make... I don't tend to find a lot of value in that.

00:04:17 ◼   ► I build it if I'm doing something very experimental or when I'm doing something

00:04:21 ◼   ► that really just

00:04:23 ◼   ► really touches a lot of things and breaks stuff in

00:04:26 ◼   ► ways that would be... if I needed to undo, it would be kind of annoying to do

00:04:30 ◼   ► undo through the git process. Like for example when I recently converted audiobooks to

00:04:33 ◼   ► ARC,

00:04:34 ◼   ► I made a branch for that because it changes literally every class in the application was

00:04:38 ◼   ► changed and in a way that is not reversible easily.

00:04:42 ◼   ► So I did that in a branch, but generally I just kind of work and you just kind of start

00:04:46 ◼   ► plotting along on big features.

00:04:50 ◼   ► Maybe it's just my background, but I've found it better to get a feature working and then

00:04:56 ◼   ► make it look good than it is to spend a lot of time up front in things like Photoshop

00:05:02 ◼   ► or fireworks or even sometimes even a pen and paper, I find that I'm often even just

00:05:06 ◼   ► quicker just like, "Okay, well, I know it's kind of going to be a table view with some

00:05:10 ◼   ► stuff on it, so okay, let's make a table view and see what that looks like."

00:05:13 ◼   ► Then I can play with it.

00:05:14 ◼   ► I can throw data into it.

00:05:15 ◼   ► I can kind of mock it up in a way that is actually useful, and that's not work that

00:05:19 ◼   ► I'm going to necessarily be throwing away.

00:05:23 ◼   ► So that's kind of my process internally that I know some people like each screen mocked

00:05:27 ◼   ► up, you know, specifically in Photoshop and all this.

00:05:31 ◼   ► I tend to, it's like, all my buttons to start with are just UI round wrecked buttons.

00:05:37 ◼   ► And all my text is just Helvetica standard, and you just kind of run with that.

00:05:44 ◼   ► And then as I go, I'll work on sort of improving that, cleaning it up, fixing it.

00:05:49 ◼   ► As I'm going, I'm definitely not thinking about performance, really.

00:05:52 ◼   ► I'm not thinking about sort of file management or sort of just clean up things.

00:06:00 ◼   ► I'm not really worried about--

00:06:01 ◼   ► and back in the old days, it was like,

00:06:03 ◼   ► I wouldn't worry as much about even somehow precise

00:06:06 ◼   ► my memory management was in the days before ARC.

00:06:10 ◼   ► My goal was to make it work, to make it work quickly

00:06:12 ◼   ► so I could see if this is something

00:06:13 ◼   ► that I would actually want.

00:06:17 ◼   ► And as I'm doing that, this is especially

00:06:19 ◼   ► something relevant for a project like, say, audiobooks,

00:06:22 ◼   ► or even when I'm working on my recipe book, my other app,

00:06:25 ◼   ► where these apps have been around for years.

00:06:28 ◼   ► audiobooks is coming up on its three year anniversary of being released into the app

00:06:32 ◼   ► store which is kind of crazy for, you know, the app store's only been around for three

00:06:36 ◼   ► and a half years I think, or maybe four, or four years from the SDK launch I think. And

00:06:41 ◼   ► so it's been a long time. There's a lot of code that's kind of, some of it's been, is

00:06:46 ◼   ► probably from that initial commit, you know, way way long ago, you know, years ago. And

00:06:54 ◼   ► It's always one of those things that you kind of have to, as a developer, be constantly

00:06:58 ◼   ► sort of thinking about is you have to fight the urge to rewrite everything.

00:07:04 ◼   ► You see something and you're like, "Oh, I could do that better."

00:07:06 ◼   ► You know, say a classic example now that we've run into a lot is there's new block-based

00:07:10 ◼   ► APIs for all kinds of things, or I can write my own block-based API.

00:07:15 ◼   ► And I have to kind of always be thinking to myself, "Does doing that make the user's experience

00:07:22 ◼   ► better. And does doing that, how likely am I to get it right? How likely am I to actually

00:07:28 ◼   ► correctly replace, if I'm taking, if I'm not adding functionality, if I'm just trying to

00:07:35 ◼   ► take something that works, you know, something that takes input A and has output B, and I'm

00:07:40 ◼   ► just going to change the middle, what's the likelihood that I'm going to give it input

00:07:43 ◼   ► A and then it's going to give me C back? And more often than not, all the weird edge cases,

00:07:50 ◼   ► all the things that you've kind of dealt with are hard to recreate.

00:07:54 ◼   ► And often this is something that I know I've seen myself do dozens of times, is you have

00:08:00 ◼   ► the bigger problem of you say a given function that you're thinking of rewriting, that you're

00:08:06 ◼   ► thinking, "Oh, I could make that better.

00:08:07 ◼   ► Oh, I could make it faster.

00:08:08 ◼   ► Oh, I could use this hot new thing and it'll be awesome."

00:08:16 ◼   ► function has some built-in latent, some built-in assumptions inside of it and if

00:08:21 ◼   ► you rewrite it you'll often rewrite it in perhaps improving it to the ideal and

00:08:27 ◼   ► what you'll end up doing then is that ends up breaking a whole bunch of other

00:08:32 ◼   ► things that were assuming that it was slightly broken that you've coded around

00:08:36 ◼   ► these problems and this isn't a novel concept that I'm talking about but it's

00:08:40 ◼   ► something that as a software engineer you have to be think cognizant of that

00:08:44 ◼   ► that you have to keep in mind that your code is likely not perfect, and beyond that, your

00:08:50 ◼   ► code is actually probably kind of broken, in some way at least.

00:08:55 ◼   ► And you have to be careful about ripping it out and changing it too much, because you

00:09:00 ◼   ► may actually be making it worse, or you may be creating this whole can of worms for yourself

00:09:05 ◼   ► down the road.

00:09:06 ◼   ► And then related to that is just something that I always try and think about as I'm like,

00:09:10 ◼   ► when I see something that I'd love to fix that, oh, I'd like to change that, is, you

00:09:14 ◼   ► that will the user notice that I did this and if the user won't notice I

00:09:20 ◼   ► almost never do it and unless it makes my life as a developer much better and

00:09:27 ◼   ► much simpler so then you know an example of a lot of these things is you'll often

00:09:32 ◼   ► kind of rewrite something refactor it because you can because you oh I could

00:09:38 ◼   ► make it cleaner code I could make it better code I always get now I try and

00:09:43 ◼   ► shy away from that because if it works now, I should just run with that. If it doesn't

00:09:48 ◼   ► work, okay, well then I'm fixing it and the user will notice. And then the only exception

00:09:52 ◼   ► are those areas where it really makes my life better. So it's like recently I converted

00:09:56 ◼   ► audiobooks to ARK. And ARK makes my life easier, makes it simpler, means that I'm not doing

00:10:03 ◼   ► a lot of this sort of bookkeeping grunt work in my coding, I'm focusing on sort of higher

00:10:08 ◼   ► level features. And so for me, that's kind of my rule of thumb. And then I kind of work

00:10:15 ◼   ► from there, once I've got these big features, you kind of get into this polish phase. And

00:10:20 ◼   ► I kind of like to think about this kind of like a lathe, which is, if you're not familiar

00:10:24 ◼   ► with this, a tool for carpentry and metalwork, where you take a big hunk of wood, put it

00:10:29 ◼   ► on a thing and it spins it. And then you can take a tool and just run it across the lathe.

00:10:35 ◼   ► And you kind of have, you know, you may start off with a big chisel, like a big honking

00:10:41 ◼   ► piece of metal that you run across the wood, and you're just letting huge chunks fly.

00:10:46 ◼   ► And this is kind of that big feature phase.

00:10:48 ◼   ► You're just getting it working.

00:10:49 ◼   ► You're getting the rough shape of what you want.

00:10:52 ◼   ► And then, okay, so now you're past that, so now you're going to go in there with kind

00:10:55 ◼   ► of a fine pick.

00:10:56 ◼   ► And you're going to be cleaning up these little details.

00:10:58 ◼   ► You're going to be making sure, this is where you're like, okay, I'll make the buttons look

00:11:02 ◼   ► nice.

00:11:03 ◼   ► you know, tweaks and performance things.

00:11:06 ◼   ► Oh, I'll make sure, you know, deal with some of these edge cases.

00:11:10 ◼   ► And then you get into the fun part.

00:11:11 ◼   ► But also perhaps the most dangerous part is the polish phase.

00:11:14 ◼   ► So this is you've got your sandpaper out and you're running it along what you're trying

00:11:17 ◼   ► to create.

00:11:18 ◼   ► You're just trying to get rid of all the rough edges, all these little things that may annoy

00:11:24 ◼   ► your user, may make them, or just adds that sort of richness to the experience that shows

00:11:30 ◼   ► that you actually are paying attention to what they want.

00:11:32 ◼   ► I say this is dangerous because this is the phase that I find a lot of independence gets stuck in

00:11:37 ◼   ► Where they'll never actually ship or it'll take hugely more time than they actually need to ship

00:11:44 ◼   ► Because they constantly have that thought of "Oh, what if I did X? Oh, what if I did Y? I could make it better

00:11:52 ◼   ► I could do this, I could do that" and you're starting to get beyond actually polishing something into

00:11:58 ◼   ► You know you're pulling out your chisel again, and you're actually hacking away at something

00:12:03 ◼   ► That was almost ready to ship now if what you had to start with was not good well

00:12:07 ◼   ► Then you need to fix it, but if what you're doing is just creating new features and doing these things

00:12:13 ◼   ► You have to be so careful of that

00:12:15 ◼   ► I just think that I've seen so many times in you know my friends and other independents

00:12:19 ◼   ► Or you'll kind of get stuck and you'll be like oh, man. This is almost ready. Oh, man. This is almost ready

00:12:24 ◼   ► I'm going to ship it soon." And then six months later you don't. And it's often because you're

00:12:29 ◼   ► kind of, instead of polishing, you're still kind of polishing with one hand and you've

00:12:36 ◼   ► got a chisel in the other and you're kind of still hacking away on it. And so then you

00:12:39 ◼   ► start breaking things and things start not working exactly how you'd like. So you just

00:12:43 ◼   ► kind of have to draw a line at some point and say, "All I'm going to do is tweak things.

00:12:47 ◼   ► All I'm going to do is polish things." And you hit a point that you're like, "Okay, I've

00:12:51 ◼   ► I got my release candidate.

00:12:52 ◼   ► I recently hit that, I think last Wednesday or so, I hit my release candidate.

00:12:57 ◼   ► And so now I'm not working on any sort of really new stuff.

00:13:01 ◼   ► I'm just trying to polish and tweak the experience, do bug fix testing,

00:13:05 ◼   ► make sure that it actually works, make sure that, and this is where you start,

00:13:09 ◼   ► I have whatever, 40 different devices, not 40, I have a dozen different devices.

00:13:13 ◼   ► All kinds of different software configurations, things.

00:13:16 ◼   ► I have, luckily I was able to recently drop my support for 3.0, so

00:13:20 ◼   ► to, you know, I have an iPad and I can put iPod touches on three various flavors of three

00:13:25 ◼   ► that I don't need to use anymore. And I can, you know, just sit there and I'll run it on

00:13:29 ◼   ► my iPhone 4S, an iPhone 4, an iPhone 3GS, which is all I need to do, I think, and I

00:13:35 ◼   ► think a 3G. Make sure it works on there. I'll put it on an iPad, put it on an iPad 2, put

00:13:41 ◼   ► it on an iPad 3, just kind of play with it and make sure that it works across the way.

00:13:45 ◼   ► Install the old version, do a bunch of stuff, install the new version, make sure that it

00:13:49 ◼   ► updates correctly and then recently I've added iCloud support so then you're doing

00:13:53 ◼   ► kind of even this other level of testing where I'm going back and forth

00:13:57 ◼   ► and then you ship it. And I think it's an important thing to celebrate that shipping.

00:14:02 ◼   ► It's something that a lot of developers actually never get to or

00:14:05 ◼   ► it's a thing that

00:14:07 ◼   ► and if you don't relish that, if you don't

00:14:08 ◼   ► when you sell it, it's like yeah man I did it and you know take your wife out for a nice dinner

00:14:12 ◼   ► or get a beer or whatever, whatever you like

00:14:15 ◼   ► and celebrate the fact that you know you shipped

00:14:18 ◼   ► That's a big deal.

00:14:19 ◼   ► Alright, so that's today's show.

00:14:21 ◼   ► Hope you enjoyed it.

00:14:22 ◼   ► If you have any questions, comments, concerns, as always, hit me up on Twitter.

00:14:25 ◼   ► I'm @_davidsmith.

00:14:28 ◼   ► Underscore D-A-V-I-D S-M-I-T-H.

00:14:31 ◼   ► Otherwise, follow me on Twitter if you like what I say.

00:14:33 ◼   ► If you like the show, as always, please tell a friend.

00:14:35 ◼   ► Tell two, tell three.

00:14:36 ◼   ► It's the best thing you can do if you like it and want me to keep recording.

00:14:40 ◼   ► Alright, otherwise, happy coding and I'll talk to you later.

00:14:43 ◼   ► Bye.