Under the Radar

172: No News is Good News


00:00:00   Welcome to Under the Radar,

00:00:01   a show about independent iOS app development.

00:00:03   I'm Mark Arment.

00:00:04   - And I'm David Smith.

00:00:05   Under the Radar is never longer than 30 minutes,

00:00:07   so let's get started.

00:00:08   - It's kind of hard to pick a topic a lot in the summertime

00:00:12   because we're mostly just keeping our heads down working

00:00:15   or going on vacations here and there,

00:00:16   and we're just kind of plowing through things

00:00:19   we have to do for the fall releases.

00:00:22   There's not a lot going on,

00:00:23   so we kind of wanted to just take this episode

00:00:25   to basically do like a status update

00:00:27   of what we've been working on,

00:00:29   why, and then what we're kind of planning

00:00:32   for the imminent summer or imminent fall releases

00:00:36   of all these OSes and possible new hardware and everything

00:00:39   'cause we're kind of in the home stretch now.

00:00:42   The pace of betas from Apple has been steady,

00:00:47   but the pace of changes in each beta

00:00:49   has been dropping dramatically,

00:00:51   so you can tell the OS betas are stabilizing.

00:00:55   The tooling has not changed much in the last few weeks.

00:00:58   There hasn't been an Xcode release in a few weeks,

00:01:00   even a couple of betas ago,

00:01:02   and so everything seems to be coasting in for landing here.

00:01:07   Like, we're getting close.

00:01:08   The new OSes are imminent.

00:01:10   They are probably going to have some kind of event

00:01:13   and release of the new OSes

00:01:15   within about three or four weeks,

00:01:17   so we're really in the home stretch here,

00:01:19   and so we kind of wanted to just go over like

00:01:22   what have we been doing

00:01:23   and where are we in our summer progress.

00:01:26   So, Dave, what have you been doing?

00:01:29   - Yeah, so one of my big goals for,

00:01:33   like, I ended up structuring my work this summer

00:01:35   slightly different than I think I have in other years

00:01:37   where the initial betas, as they came out,

00:01:41   were pretty rough this year.

00:01:43   Like, things just seemed unsettled,

00:01:47   at least for those first few betas,

00:01:49   and so I just felt bad and tricky

00:01:52   about diving into them too much right away.

00:01:55   Like, it just didn't seem like a good fit

00:01:57   both for my schedule and the amount I'd be working as well.

00:01:59   It was just not gonna be a great idea,

00:02:02   and especially because iOS 13 drops support

00:02:06   for a number of the sort of older devices.

00:02:10   It's kind of an awkward year or two

00:02:12   to be too much all in on the new stuff,

00:02:14   and I think at this point,

00:02:15   I expect to not drop support for iOS 12

00:02:19   for at least probably, I wanna say, a year,

00:02:23   but it seemed like a year to sort of focus more

00:02:25   on, the front part of my summer would be focused

00:02:28   on just getting things in a really good place

00:02:32   rather than necessarily diving too much into the new stuff,

00:02:35   and especially 'cause I think a lot of the new things

00:02:37   and the new capabilities that I'll be working on are,

00:02:41   there'll be some new apps that I'll be working on,

00:02:43   thanks to the new space in my app catalog that I have

00:02:47   from retiring, a number of things

00:02:49   that I used to be weighing me down.

00:02:52   So that's like from earlier in the summer,

00:02:53   if you remember, we did a whole episode

00:02:55   about getting rid of things.

00:02:55   That process is ongoing and continuing to go well

00:02:59   to streamline things there.

00:03:00   And I'll be sort of writing some new things,

00:03:03   and the nice thing with new things is there's not much

00:03:06   so far that I've seen that's like,

00:03:07   you need to be there on day one

00:03:10   to really sort of take advantage of things.

00:03:12   It's okay to be a little bit more decline,

00:03:14   and I also, I think too, I'm very curious

00:03:17   to see where we go hardware-wise this fall,

00:03:21   and that may sort of inform a little bit

00:03:24   what direction I go into.

00:03:25   And so instead, I've just been working on

00:03:28   making the existing apps that I have better.

00:03:30   And the first one, that big update that I did,

00:03:32   was a big update to Pedometer++,

00:03:34   where, and I think this is very much one of those

00:03:36   like tech debt, niggling features,

00:03:40   problems that affect .01% of users,

00:03:43   but for that one, .01% of users

00:03:45   are really annoying kind of bugs.

00:03:47   And that was just sort of like this big update

00:03:49   that had no big marquee features,

00:03:51   but lots and lots of little features.

00:03:54   And the most amusing part of this particular update

00:03:56   is that it, for the first time ever,

00:04:00   required or at least encouraged me to write unit tests,

00:04:05   which, and it was shocking,

00:04:07   we've talked about this many times on the show,

00:04:08   that unit tests are not my favorite thing,

00:04:10   but I ended up actually writing some unit tests,

00:04:13   primarily because the situation that I was trying to fix

00:04:17   was one of these really weird database things,

00:04:20   where if a user had a particular structure of data,

00:04:24   and then they did a particular operation,

00:04:26   and then it merged with their Apple Watch,

00:04:28   then you could end up in this sort of situation

00:04:31   where you'd have some data inconsistency.

00:04:33   But it was incredibly hard to actually create

00:04:36   that situation where this would happen.

00:04:38   And so that becomes a situation where like,

00:04:40   all right, unit test is the right answer here,

00:04:42   where I can very sort of consistently go through all,

00:04:45   have the process of the unit test,

00:04:48   create all the steps to create this problematic case,

00:04:52   check that my fix is in fact working,

00:04:55   and then be confident about it.

00:04:57   And I wrote it, it worked great.

00:04:59   Everybody speaks to that.

00:05:02   And I think when you've talked about

00:05:05   sort of automated testing in the past,

00:05:06   it's one of those things where I feel like

00:05:08   it is problematic when it becomes,

00:05:10   like you become zealous about it,

00:05:13   and you start, it's like everything has to be unit tested,

00:05:16   and everything, your tests are just as important

00:05:18   as your code.

00:05:18   I find that kind of development perspective

00:05:21   a very sort of inflexible and non-pragmatic view.

00:05:26   But unit tests are just a, they're just other,

00:05:28   like all you're doing is just writing other code

00:05:30   to test your other code, and doing it

00:05:33   with some of the affordances of the tooling.

00:05:35   And so in that sense, the pragmatic thing is sometimes

00:05:38   to just use your code that way.

00:05:40   And I wrote a unit test rather than,

00:05:43   the other version I could have done

00:05:44   is would have had some utility method

00:05:45   that I pass an argument into the app on launch,

00:05:48   and it goes through and messes with the database

00:05:50   in an inappropriate way to get into that situation,

00:05:54   and I would run my test that way.

00:05:55   But functionally, I just took that code,

00:05:58   and instead of kind of the awkward place

00:06:00   of putting it actually into the code itself,

00:06:03   that I don't want to ship to customers necessarily,

00:06:06   because I don't want to somehow, down the road,

00:06:09   accidentally create this bad situation

00:06:11   in a customer's database.

00:06:13   It's like putting it in the unit test

00:06:14   that was pragmatic, made sense, and worked fine.

00:06:17   But I have now officially written my first unit test

00:06:21   after doing this professionally for like a decade.

00:06:23   - How do you feel?

00:06:24   Do you feel like a different kind of person now?

00:06:27   - I feel remarkably the same.

00:06:29   - Do you feel like you want to start testing everything?

00:06:32   - Just all the things.

00:06:34   I can go crazy and just, I'll start testing,

00:06:37   like have all that have the,

00:06:38   every function I write now needs to have a precondition

00:06:42   and a postcondition, I think, remember this right?

00:06:44   Is that how that works?

00:06:45   - Yeah.

00:06:46   - Remember, wasn't there?

00:06:47   This is where you started getting to,

00:06:48   like back in college, I remember taking

00:06:50   a software testing course, and it was this very tedious,

00:06:55   kind of mathematical approach to software development,

00:07:00   where you had this thing where every function

00:07:02   was supposed to have a particular precondition,

00:07:04   like these are the possible ranges of values for the inputs,

00:07:07   and then these are the, the postcondition is the value,

00:07:09   possible values for the outputs,

00:07:11   and you would like structure,

00:07:12   and so it's almost at a certain point,

00:07:14   you're like, your code becomes this giant equation

00:07:16   that has to be perfect because you've sort of proved

00:07:19   at every point that the input and output is correct,

00:07:21   so the total output has to be correct,

00:07:23   but I've never actually found that to be useful in practice.

00:07:28   So, but no, it's, I mean, you're testing it is,

00:07:30   it's just code, like I think that's the thing that is,

00:07:33   like the way that I view it is that

00:07:34   it is a different type of code, and it is useful

00:07:38   insofar as it's like sometimes you have to write code

00:07:41   to test your other code and to make sure it works,

00:07:43   but beyond that, it's just a tool that's nice there,

00:07:48   and like, but I don't really see, you know,

00:07:49   like I have a couple, so now I have a few unit tests,

00:07:52   and probably before I do releases going forward,

00:07:55   I'll like run my test suite once, just because like why not?

00:07:58   It's, you know, it's sitting there.

00:08:01   - That's kind of the point.

00:08:03   - But like I don't expect it to be the kind of thing

00:08:04   where like I'll do continuous integration

00:08:06   and have it like running all the time

00:08:07   and have an Xcode server sitting somewhere,

00:08:09   like running this and like doing all that kind of stuff.

00:08:12   Like that doesn't, I mean, that's just not the way I work.

00:08:16   Like I don't think of, I don't think of my code that way,

00:08:19   and honestly, in a weird way, like I'm not,

00:08:22   there's so many aspects too, I think,

00:08:24   where because I'm a solo developer, I so often,

00:08:28   my code is not always in a shippable state.

00:08:32   Like I'm sure there are times that I'm,

00:08:34   like I'm breaking the build, and I'm doing it,

00:08:37   and it's fine because I'm not affecting someone else

00:08:39   when I do that.

00:08:41   Like I sometimes just wanna, like,

00:08:44   I mean this is years ago now, but when I used to work

00:08:46   in a bigger company, like it was a big deal

00:08:48   to sort of ever check in code that would break unit tests.

00:08:52   And obviously you can make your own development branches,

00:08:54   and like there's ways to work around this,

00:08:57   but it was a big deal, and it was something

00:08:58   that you had to have in your mind,

00:09:00   where sometimes I will just be like checking in code,

00:09:03   and it's like sometimes my commit message,

00:09:04   it just like seems to kinda work.

00:09:07   (laughing)

00:09:08   And I'm just like, and then like two commits later,

00:09:11   it's like actually that didn't work at all.

00:09:12   And it's like that's okay, because I'm just having

00:09:15   a little conversation with my version control

00:09:17   about my process as I go, and it's much,

00:09:21   like commits are lightweight and great,

00:09:23   so I can just make as many of them as I want,

00:09:25   and they're just little checkpoints for me

00:09:27   if I wanna be like oh man, I went down

00:09:29   the totally wrong path here, let me just roll back.

00:09:33   And I can do that in kind of a lightweight way,

00:09:34   but yeah, anyway, so I've been down the road--

00:09:37   - Do you do branching much?

00:09:38   - Very little branching.

00:09:41   What I tend to do is I have like my actual,

00:09:45   like this is the version I ship,

00:09:47   and then the only time I typically branch

00:09:49   is if I am going to be working on a major update

00:09:54   while concurrently shipping minor bug fix updates.

00:10:01   So an example will be once I got this big update out

00:10:06   that has all these bug fixes for everyone,

00:10:08   I will likely make a branch for iOS 13,

00:10:11   and kind of work on that a little bit,

00:10:13   and then sort of work down that way.

00:10:15   But typically, that is the extent of what I'm doing,

00:10:18   and sometimes I also, I'm sure it's a terrible thing,

00:10:22   but sometimes I make those branches kind of retroactively.

00:10:26   I'll go down a path and be like huh,

00:10:29   I should probably make a branch of this at this point.

00:10:32   But it's all these weird, it's like these tricky things

00:10:35   with like code hygiene and structure where it's,

00:10:39   I have much more flexibility about it

00:10:41   because I'm just a single developer,

00:10:44   and like in the same way that unit tests exist

00:10:47   to make my life easier, you know,

00:10:49   like version control largely exists to make my life easier.

00:10:52   And so doing something that was more heavy-handed

00:10:55   or even just like, it's just never really clicked for me

00:10:58   when that's like okay, I'm gonna work on version 4.1.2.

00:11:02   Let me make the 4.1.2 branch and start working on that,

00:11:05   and then merge that into master and like do all that.

00:11:09   I mean, I'm even the, this is the,

00:11:12   it's like, I don't know, this is like Dave's confessional

00:11:13   where I'm like, I've actually changed masters

00:11:16   several times too.

00:11:17   - Wait, you can do that?

00:11:18   - Well, I just have like new master and like new new master.

00:11:21   (laughing)

00:11:22   - Oh no.

00:11:23   Master v2 final final final v1.

00:11:26   - Yep, exactly.

00:11:27   I've gone down that road too.

00:11:29   And like it works, like it's fine.

00:11:31   And I'm sure, yes, I'm sure there's some git command

00:11:33   I could actually do, but like, 'cause every now and then

00:11:36   if I actually like try, and I'm sure there's some like,

00:11:38   is this when I'm supposed to rebase or something?

00:11:41   - I don't know what that means.

00:11:42   - And rebase like hurts my head, but there's--

00:11:44   - There's a whole bunch of like advanced git maneuvers

00:11:46   that just break my brain and I just don't, I don't do,

00:11:49   I never, I just never do any of them.

00:11:50   I don't know what they mean, I'm scared to ever try them.

00:11:53   - Yeah, but like this is the thing where like sometime

00:11:55   I'll make a branch, I'll go down this path and like,

00:11:57   and then I'll go to merge it back into master.

00:12:00   And then there'll be like a big massive set

00:12:03   of conflicting changes or something in the,

00:12:05   and like I don't, I don't wanna like deal with that.

00:12:09   Like that's just busy work that isn't actually name important

00:12:12   because the name of the branch, that's the one I ship,

00:12:16   being called M-A-S-T-E-R is entirely like semantic.

00:12:20   Like who cares?

00:12:22   And so I'll just be like, it's like now I'll just be like,

00:12:24   let me just take whatever this feature branch

00:12:26   that I've been working on and I'll call it new master

00:12:29   or I'll call it Dave's awesome code and like,

00:12:33   this is what I'm shipping now.

00:12:35   - Super master. - It's fine, yeah.

00:12:36   And the thing is because like the way

00:12:40   that version control works, like whatever the most recently

00:12:43   worked on thing is like becomes the head of the tree

00:12:45   of like version control, like essentially the old master

00:12:48   just like withers away and dies and I never see it again.

00:12:51   And like that's fine, so.

00:12:53   - Wow, yes, you really are doing it more like a tree

00:12:56   'cause you know, in an actual tree,

00:12:58   branches don't ever merge back into the trunk.

00:13:01   - That is true.

00:13:03   - So you're kind of like, you're doing it more semantically

00:13:06   to the word branch in its original meaning.

00:13:10   - Yeah, my branches go off and then sometimes they kind of

00:13:14   go back in towards the trunk but most of the time,

00:13:15   sometimes they just go off and become their own trees.

00:13:18   Like those really awesome trees where like the tree,

00:13:20   you know it's like basically what I'm doing is that

00:13:21   you know when the tree falls down and then a new tree

00:13:25   is like springs out of the trunk of the old tree,

00:13:28   so you have like a tree that's horizontal

00:13:29   and then another one comes up out of it vertically?

00:13:31   That is my version control system.

00:13:34   - That's fantastic.

00:13:35   No, I mean, and I think there, and first of all,

00:13:37   before I forget, I actually use branching a little closer

00:13:40   to the way I think we're quote supposed to do it

00:13:44   but still not to the way that a large organization

00:13:46   will do it 'cause you know, I do branching where I mostly

00:13:50   am doing most of my work on the master branch

00:13:52   for most of the year but I will create branches

00:13:55   if I'm doing like a big experiment that requires like

00:13:58   what if I tear apart the UI and rearrange things

00:14:01   in a really big way that I know would take a lot more work

00:14:04   before it would ever become shippable?

00:14:06   I'll create a branch for that that like I'm gonna change

00:14:08   a whole bunch of code in a way that I probably don't want

00:14:11   in the master and might never want in the master

00:14:13   so I'm gonna do this experiment off to the side.

00:14:16   Another way, another time I create branches

00:14:18   and by the way, most of those just get abandoned

00:14:21   and then another way I do them more frequently

00:14:23   is whenever there is a new beta season

00:14:26   so I basically, WBC Monday every year,

00:14:30   I create a new branch for this year's iOS 13

00:14:34   and that branch requires iOS 13 so I get all the most fun

00:14:38   warnings in Xcode about everything that's deprecated

00:14:41   and everything that's changed and everything,

00:14:42   all these new warnings and I just slowly plow through

00:14:45   and work on that branch throughout the summer

00:14:47   as I get things done and it's for the same reason

00:14:50   that you kind of mentioned earlier of like I want to be able

00:14:53   to ship updates to the master branch if necessary

00:14:56   for the old OS over the summer and this summer,

00:14:59   I've been doing a lot more of that than I ever had before.

00:15:02   I think almost every summer, I've issued like between zero

00:15:06   and one update in the entire summer for the old OS

00:15:08   because I basically stop working on that completely

00:15:11   and put all my resources behind the new OS.

00:15:13   This year's a little bit different.

00:15:15   You mentioned this too.

00:15:16   This year is that, you know, it's,

00:15:19   iOS 13 not only is in a pretty rough state,

00:15:22   you know, and wasn't in a pretty rough state for a while

00:15:24   and might still be but also it is the first update

00:15:27   in a while to drop all device compatibility

00:15:29   and so a combination of those two things I think

00:15:32   is gonna result in a slower than usual adoption rate

00:15:35   and also there's not a lot in iOS 13

00:15:39   that I really must adopt on day one.

00:15:41   There's a bunch of stuff I'm excited to migrate to

00:15:43   and to add and to, you know, that'll make my app better

00:15:47   and I am working on a big iOS 13, you know,

00:15:50   UI rearrangement and everything but it's not urgent

00:15:54   and so it's not gonna come soon.

00:15:56   It's not gonna come like on day one.

00:15:58   I'm not gonna do the thing I usually do

00:15:59   where I drop support for the old OS basically

00:16:01   in the first week of the new moon coming out

00:16:04   'cause it's basically not ready yet.

00:16:06   I don't have time and I haven't had the chance to finish it

00:16:09   and it's too big of a job.

00:16:10   So instead what I've been doing is working on stuff

00:16:14   in the iOS 12 branch that doesn't require 13.

00:16:16   So underlying changes, code, you know,

00:16:19   like under like, you know, model level changes,

00:16:21   audio processing type changes,

00:16:22   anything that doesn't require new APIs for 13,

00:16:26   I'm doing on my master branch and then, you know,

00:16:29   every few weeks like pulling it and merging it

00:16:31   into my iOS 13 branch and then I have a second branch

00:16:35   off of the iOS 13 one for three column view

00:16:38   'cause three column view breaks everything in the app.

00:16:40   So that one is like the iOS 13 build is kind of shippable.

00:16:44   The three column view branch which is branched

00:16:47   off the 13 branch is not at all shippable yet.

00:16:51   I can't even use it on my own phone yet, it's so broken.

00:16:53   Like everything is broken.

00:16:55   So I have this summer been doing a heck of a lot more

00:16:58   in the master branch while leaving the beta branch

00:17:02   as like my side project which is totally the opposite

00:17:05   of how you have usually done it.

00:17:07   But I do think there's a larger lesson here

00:17:10   which I'll get to in a moment.

00:17:10   But first, we are brought to you this week by ZOJO.

00:17:14   X-O-J-O, ZOJO.

00:17:16   ZOJO is a cross platform development tool

00:17:18   for creating native apps for the desktop, mobile, web

00:17:21   and even Raspberry Pi.

00:17:23   ZOJO currently supports Mac OS, Windows, Linux, iOS

00:17:26   and Android's coming soon.

00:17:28   With ZOJO, you write just one version of your app,

00:17:30   say on the Mac, then you just literally check a check box

00:17:32   and you have a completely native Windows version as well.

00:17:35   ZOJO uses native controls so your app looks at home

00:17:38   on every platform and you'll be able to build apps

00:17:40   10 times faster which will save you time and money.

00:17:43   ZOJO is great for everyone, from newbies

00:17:45   to professional developers alike.

00:17:47   It's currently used by over 300,000 developers worldwide

00:17:51   from students all the way up to Fortune 500 companies.

00:17:54   Go take a look at their site and you can see

00:17:56   just how many companies you know use ZOJO.

00:17:59   It's free to use and then licenses are required

00:18:01   to build standalone apps.

00:18:03   To learn more, go to ZOJO.com/Radar.

00:18:06   That's X-O-J-O dot com slash radar

00:18:10   and you can get 20% off any license with the code radar.

00:18:13   Thank you so much to ZOJO for the support of this show

00:18:16   and Relay FM.

00:18:18   So I think one of the big themes that,

00:18:21   covering both testing which I also use but extremely little,

00:18:24   like I have a test suite for the FC model database layer

00:18:29   of my app which by the way is currently broken,

00:18:31   like it doesn't even build.

00:18:33   - Perfect.

00:18:34   - And I shipped an FC model bug in my beta tree last week

00:18:38   or the week before.

00:18:39   I shipped a couple of builds that had a pretty significant

00:18:41   bug in FC model that caused really bad performance

00:18:45   and I didn't even run the tests.

00:18:47   I haven't run the tests in months which is why

00:18:49   the build is broken.

00:18:50   'Cause like certain things changed and the test suite

00:18:54   build broke and I didn't notice.

00:18:55   So I'm not a good tester and you aren't a very good

00:18:58   version controller and I think this leads to a larger issue,

00:19:04   or a larger I guess lesson or truth to this which is that

00:19:08   many of these tools, you mentioned continuous integration,

00:19:12   even version control to some degree, I do think all indies

00:19:17   should be using version control but you don't need to be

00:19:19   doing a lot of particularly fancy stuff with it.

00:19:21   And certainly testing I think would be in this category

00:19:25   as well.

00:19:27   These are tools that we have in the industry that

00:19:32   are kind of optional for indie developers because they're

00:19:35   not really made for us.

00:19:37   They isn't to say they can't help us but that they are

00:19:41   really much more necessary when you have a team

00:19:46   of developers.

00:19:47   When you have multiple people working on the same code base,

00:19:49   people at different skill levels working on different

00:19:52   components, maybe, and especially as your team gets larger,

00:19:56   these things become more and more necessary and more

00:19:58   and more beneficial.

00:20:00   But when you're just one person, a lot of these advanced

00:20:03   tools don't have that much bang for the buck for you.

00:20:08   And that isn't to say, again, this isn't to say you can't

00:20:10   benefit at all from them.

00:20:12   You very much can benefit from all these things.

00:20:14   Using advanced version control stuff, using automated

00:20:17   testing and test-driven development, anybody, one person,

00:20:22   up to 1,000 people can benefit from this.

00:20:25   However, I think the math changes of what's worth it or not

00:20:28   and to what degree you need to do this.

00:20:31   How deeply do you need to run these tests?

00:20:34   How advanced and how diligent do you have to be with your

00:20:37   use of branches and different commit styles and commit

00:20:40   messages and version control?

00:20:41   When you're in India, it gives you not only the freedom

00:20:47   to tone some of that down, depending on your preferences

00:20:50   and your needs, but also, I think you have kind of an

00:20:54   obligation to question a lot of this stuff and to question

00:20:58   how far you need to go with it as an indie, because you

00:21:02   don't have time to do it all.

00:21:04   Time is incredibly precious to indie developers.

00:21:08   It is by far our most limiting resource.

00:21:10   And if something's gonna cost a ton of time to improve

00:21:15   your code quality by 5%, that might not be worth it.

00:21:19   So you have to kind of find that balance for yourself.

00:21:21   Like which of these various advanced tools are actually

00:21:23   worth it for you?

00:21:24   - And I think too, there's a little bit of the time,

00:21:27   but I think honestly, the thing that I find more important

00:21:31   is motivation and fluidity, where there are certain things

00:21:36   that you could say that you should be doing because of

00:21:44   software engineering or just good best practice.

00:21:48   You're setting yourself up for more success in the future.

00:21:51   You're putting yourself into a good position.

00:21:54   Those are all true.

00:21:56   But any time that my tooling or my process is getting

00:22:01   in the way of my creation, that is like, I will fight that,

00:22:06   I will drop that, it will hurt my motivation,

00:22:08   whatever it is.

00:22:09   I mean, it is something that I think is, at least for me,

00:22:12   is just, it's far better for me to be excited and just

00:22:17   cranking away and making stuff and getting it out and

00:22:23   being thorough, but in ways that are not cumbersome, maybe.

00:22:28   And so many of these aspects of tooling or around testing

00:22:32   or version control or whatever, just sort of get in the way.

00:22:35   And I like being lightweight with this stuff.

00:22:39   And as much as there have been times that it comes back

00:22:42   to bite me, it has come back to bite me way fewer times

00:22:46   than you would think.

00:22:47   And having done this for hundreds of different releases

00:22:52   over the years, if you are, the testing that's really

00:22:55   important is getting it on devices and using it and playing

00:22:59   with it and making sure that you really have an understanding

00:23:03   of how the app is going to work and that you put it through

00:23:06   the use cases and the experience.

00:23:09   And the reality is that too, that kind of testing also,

00:23:13   if you put yourself in that position, is you're exposing

00:23:16   yourself to different kinds of problems, more qualitative

00:23:20   problems rather than just quantitative problems.

00:23:22   And that's something that is also very important, to be

00:23:25   like, man, when I run this on this whole device,

00:23:27   it's really slow.

00:23:29   I mean, in some ways, you can sort of get that from a test.

00:23:31   But having a number that says, running the test on this

00:23:34   device, your test suite takes 16 seconds to complete rather

00:23:38   than 13 seconds to complete, that may not be nearly as

00:23:43   impactful on you or as important to you.

00:23:46   And so that's just something else that I keep in mind.

00:23:48   And I think especially, I like kind of, I don't know, maybe

00:23:51   like over the summer, everything's just kind of feels a

00:23:54   little bit more loosey goosey for me.

00:23:56   But it's a time of year where I enjoy just kind of trying

00:24:00   things out and being much less structured.

00:24:04   It kind of makes me laugh, but I feel like at the end of the

00:24:07   summer, the rightmost page of my phone is full of apps that

00:24:12   are just like the white icon with the little icon grid in

00:24:17   it.

00:24:18   Like, not even joking, I think I have probably, let's see,

00:24:23   one, two, three, four, five, six, seven, eight, I have 24

00:24:27   of those.

00:24:27   (laughing)

00:24:28   Like an entire--

00:24:30   - That's awesome.

00:24:31   - It's like an entire page, and a few more of apps.

00:24:35   And I like this time of year where it's like, ah, I wonder,

00:24:38   it's like, hey, this is a new interesting API.

00:24:40   Like, let me just make an app.

00:24:42   And I'm not doing version control, I'm not thinking about

00:24:44   release or anything kind of structured for it.

00:24:47   It's just like Xcode, file, new project, give it a go, and

00:24:52   like 99% of that will just get thrown away.

00:24:55   But what is also kind of surprising and kind of nice is

00:24:59   more often than not, there'll be one function from that

00:25:02   little experiment, that little project, that little thing I

00:25:06   did once on a hot afternoon in the summer when I was feeling

00:25:09   bored.

00:25:10   We'll come back and it'll be useful.

00:25:13   Or later in the time it'll be like, oh, I wonder, I need to

00:25:18   use this API, how does it work?

00:25:21   Or like, I have in my mind, oh man, that API is full of

00:25:24   dragons and is going to bite my head off, and I'm not even

00:25:26   going to go near it.

00:25:28   It's useful, and some of that is just about being loose,

00:25:33   fast and loose with the stuff that you can be, and then just

00:25:36   being conscious and intentional with stuff that is probably

00:25:39   best not to be.

00:25:40   And I think as indies, we have to think about the entire

00:25:44   business, not just the code.

00:25:47   And a lot of this, I think your instinct to avoid and get

00:25:52   rid of things that slow you down from experimentation is

00:25:55   very good for this business because you can have the most

00:25:59   battle hardened, rock hard, 100% test suite coverage, you

00:26:04   can have the best app in code quality in your category, and

00:26:08   then someone else can come with a really crappy one and

00:26:10   take a bunch of market share from you because they can move

00:26:12   faster than you, or they're doing features that you didn't

00:26:14   do, or they're undercutting you on price, or whatever else.

00:26:17   The market does not reward code quality beyond a certain

00:26:21   level.

00:26:22   We're not launching the space shuttle here, we're making

00:26:24   apps for phones for the most part that aren't very important

00:26:28   that no one's going to die or get hurt if our app crashes,

00:26:31   or behaves slightly weirdly.

00:26:32   If you're in one of those fields where that's not the case,

00:26:35   please don't listen to any of this advice.

00:26:37   But most of us are doing things that that level of code

00:26:42   quality mostly just hinders us, and it's really hard to

00:26:47   accept as a developer, there's a bug here, I know there's a

00:26:50   bug here, and I have to ship this version anyway because I'm

00:26:52   going to miss the deadline if I don't, or whatever.

00:26:54   But again, it's about finding balance.

00:26:58   You can't have massive top 100% code quality and also still

00:27:03   be nimble and be making an app that has good features and is

00:27:08   competitive in your category if you're one person.

00:27:10   You just can't, you're only one person.

00:27:12   And so you have to kind of choose areas in which to take

00:27:14   shortcuts that hopefully won't impact things too badly and

00:27:18   will hopefully keep you nimble and keep you competitive.

00:27:20   And you have to think about the whole business holistically,

00:27:23   not just the code quality itself.

00:27:27   - Yeah, and I think too, there's an aspect too of making

00:27:29   sure that you understand why you're doing something that

00:27:34   you're doing.

00:27:35   Like, there's the reasons why many organizations have robust

00:27:40   processes and like sophisticated version control or build or

00:27:45   continuous integration.

00:27:46   The reason why they do that may be to catch problems that

00:27:50   won't exist in your case.

00:27:52   Like some of the continuous integration stuff is about

00:27:54   making sure that merge conflicts don't mess up the builds.

00:27:57   Like you're not gonna have a lot of merge conflicts if you're

00:28:00   the only person working on the code.

00:28:02   It's not like someone else has been working on it.

00:28:03   Like these are, there's a reason why it exists and that may

00:28:06   not be something that actually applies to you.

00:28:08   And so like doing something blindly is never a good idea.

00:28:11   So it's also like, I think just being thoughtful and saying,

00:28:14   is this actually useful?

00:28:15   Is this making my product better?

00:28:17   Is this improving my product in a way that my customers are

00:28:19   going to appreciate and enjoy?

00:28:21   And is it motivating me?

00:28:22   Is it keeping me excited?

00:28:24   Is it keeping me moving and like doing all the things that

00:28:27   are actually driving the product forward?

00:28:30   And if it is, great, do it.

00:28:31   Otherwise, like drop it and it's like spending that time

00:28:35   enjoying the summer instead.

00:28:37   - And more importantly than a lot of these factors,

00:28:40   you have to consider is it worth it?

00:28:41   Because all these things have costs.

00:28:42   They all have costs.

00:28:44   You know, you can point to any of these things and say,

00:28:46   well, if you have, if you do this kind of practice or this

00:28:49   kind of technique, you'll save yourself from problems X, Y,

00:28:51   and Z and that's invaluable.

00:28:53   But nope, it has a value and all these things have costs.

00:28:56   And you have to weigh whether those costs are worth it.

00:28:59   A lot of times we get so obsessed with the cool part of what

00:29:02   these tools and techniques can do that we ignore the costs.

00:29:05   We ignore like, wow, that took me eight hours to set up

00:29:07   or something like you ignore those costs.

00:29:10   But these all have costs and you could be doing other things

00:29:13   with that time instead, possibly even nothing and taking a

00:29:16   vacation and you have to really weigh what that's worth.

00:29:18   Companies are really bad at that.

00:29:20   Companies waste a lot of money on things they might not,

00:29:23   they might not need because they're afraid of different

00:29:24   factors and everything.

00:29:25   But you as an indie have to be more conscious of time cost

00:29:30   of what these things take.

00:29:31   - Yeah.

00:29:32   - Anyway, this, here we go proves that we can talk about

00:29:34   anything for a half hour.

00:29:35   Thank you so much for listening everybody and we'll talk to

00:29:38   you in two weeks, hopefully with a topic that time.

00:29:41   - Yeah, bye.

00:29:41   Bye.

00:29:42   [BLANK_AUDIO]