PodSearch

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]