0:00:00Welcome to Under the Radar,
0:00:01a show about independent iOS app development.
0:00:03I'm Mark Arment.
0:00:04- And I'm David Smith.
0:00:05Under the Radar is never longer than 30 minutes,
0:00:07so let's get started.
0:00:08- It's kind of hard to pick a topic a lot in the summertime
0:00:12because we're mostly just keeping our heads down working
0:00:15or going on vacations here and there,
0:00:16and we're just kind of plowing through things
0:00:19we have to do for the fall releases.
0:00:22There's not a lot going on,
0:00:23so we kind of wanted to just take this episode
0:00:25to basically do like a status update
0:00:27of what we've been working on,
0:00:29why, and then what we're kind of planning
0:00:32for the imminent summer or imminent fall releases
0:00:36of all these OSes and possible new hardware and everything
0:00:39'cause we're kind of in the home stretch now.
0:00:42The pace of betas from Apple has been steady,
0:00:47but the pace of changes in each beta
0:00:49has been dropping dramatically,
0:00:51so you can tell the OS betas are stabilizing.
0:00:55The tooling has not changed much in the last few weeks.
0:00:58There hasn't been an Xcode release in a few weeks,
0:01:00even a couple of betas ago,
0:01:02and so everything seems to be coasting in for landing here.
0:01:07Like, we're getting close.
0:01:08The new OSes are imminent.
0:01:10They are probably going to have some kind of event
0:01:13and release of the new OSes
0:01:15within about three or four weeks,
0:01:17so we're really in the home stretch here,
0:01:19and so we kind of wanted to just go over like
0:01:22what have we been doing
0:01:23and where are we in our summer progress.
0:01:26So, Dave, what have you been doing?
0:01:29- Yeah, so one of my big goals for,
0:01:33like, I ended up structuring my work this summer
0:01:35slightly different than I think I have in other years
0:01:37where the initial betas, as they came out,
0:01:41were pretty rough this year.
0:01:43Like, things just seemed unsettled,
0:01:47at least for those first few betas,
0:01:49and so I just felt bad and tricky
0:01:52about diving into them too much right away.
0:01:55Like, it just didn't seem like a good fit
0:01:57both for my schedule and the amount I'd be working as well.
0:01:59It was just not gonna be a great idea,
0:02:02and especially because iOS 13 drops support
0:02:06for a number of the sort of older devices.
0:02:10It's kind of an awkward year or two
0:02:12to be too much all in on the new stuff,
0:02:14and I think at this point,
0:02:15I expect to not drop support for iOS 12
0:02:19for at least probably, I wanna say, a year,
0:02:23but it seemed like a year to sort of focus more
0:02:25on, the front part of my summer would be focused
0:02:28on just getting things in a really good place
0:02:32rather than necessarily diving too much into the new stuff,
0:02:35and especially 'cause I think a lot of the new things
0:02:37and the new capabilities that I'll be working on are,
0:02:41there'll be some new apps that I'll be working on,
0:02:43thanks to the new space in my app catalog that I have
0:02:47from retiring, a number of things
0:02:49that I used to be weighing me down.
0:02:52So that's like from earlier in the summer,
0:02:53if you remember, we did a whole episode
0:02:55about getting rid of things.
0:02:55That process is ongoing and continuing to go well
0:02:59to streamline things there.
0:03:00And I'll be sort of writing some new things,
0:03:03and the nice thing with new things is there's not much
0:03:06so far that I've seen that's like,
0:03:07you need to be there on day one
0:03:10to really sort of take advantage of things.
0:03:12It's okay to be a little bit more decline,
0:03:14and I also, I think too, I'm very curious
0:03:17to see where we go hardware-wise this fall,
0:03:21and that may sort of inform a little bit
0:03:24what direction I go into.
0:03:25And so instead, I've just been working on
0:03:28making the existing apps that I have better.
0:03:30And the first one, that big update that I did,
0:03:32was a big update to Pedometer++,
0:03:34where, and I think this is very much one of those
0:03:36like tech debt, niggling features,
0:03:40problems that affect .01% of users,
0:03:43but for that one, .01% of users
0:03:45are really annoying kind of bugs.
0:03:47And that was just sort of like this big update
0:03:49that had no big marquee features,
0:03:51but lots and lots of little features.
0:03:54And the most amusing part of this particular update
0:03:56is that it, for the first time ever,
0:04:00required or at least encouraged me to write unit tests,
0:04:05which, and it was shocking,
0:04:07we've talked about this many times on the show,
0:04:08that unit tests are not my favorite thing,
0:04:10but I ended up actually writing some unit tests,
0:04:13primarily because the situation that I was trying to fix
0:04:17was one of these really weird database things,
0:04:20where if a user had a particular structure of data,
0:04:24and then they did a particular operation,
0:04:26and then it merged with their Apple Watch,
0:04:28then you could end up in this sort of situation
0:04:31where you'd have some data inconsistency.
0:04:33But it was incredibly hard to actually create
0:04:36that situation where this would happen.
0:04:38And so that becomes a situation where like,
0:04:40all right, unit test is the right answer here,
0:04:42where I can very sort of consistently go through all,
0:04:45have the process of the unit test,
0:04:48create all the steps to create this problematic case,
0:04:52check that my fix is in fact working,
0:04:55and then be confident about it.
0:04:57And I wrote it, it worked great.
0:04:59Everybody speaks to that.
0:05:02And I think when you've talked about
0:05:05sort of automated testing in the past,
0:05:06it's one of those things where I feel like
0:05:08it is problematic when it becomes,
0:05:10like you become zealous about it,
0:05:13and you start, it's like everything has to be unit tested,
0:05:16and everything, your tests are just as important
0:05:18as your code.
0:05:18I find that kind of development perspective
0:05:21a very sort of inflexible and non-pragmatic view.
0:05:26But unit tests are just a, they're just other,
0:05:28like all you're doing is just writing other code
0:05:30to test your other code, and doing it
0:05:33with some of the affordances of the tooling.
0:05:35And so in that sense, the pragmatic thing is sometimes
0:05:38to just use your code that way.
0:05:40And I wrote a unit test rather than,
0:05:43the other version I could have done
0:05:44is would have had some utility method
0:05:45that I pass an argument into the app on launch,
0:05:48and it goes through and messes with the database
0:05:50in an inappropriate way to get into that situation,
0:05:54and I would run my test that way.
0:05:55But functionally, I just took that code,
0:05:58and instead of kind of the awkward place
0:06:00of putting it actually into the code itself,
0:06:03that I don't want to ship to customers necessarily,
0:06:06because I don't want to somehow, down the road,
0:06:09accidentally create this bad situation
0:06:11in a customer's database.
0:06:13It's like putting it in the unit test
0:06:14that was pragmatic, made sense, and worked fine.
0:06:17But I have now officially written my first unit test
0:06:21after doing this professionally for like a decade.
0:06:23- How do you feel?
0:06:24Do you feel like a different kind of person now?
0:06:27- I feel remarkably the same.
0:06:29- Do you feel like you want to start testing everything?
0:06:32- Just all the things.
0:06:34I can go crazy and just, I'll start testing,
0:06:37like have all that have the,
0:06:38every function I write now needs to have a precondition
0:06:42and a postcondition, I think, remember this right?
0:06:44Is that how that works?
0:06:45- Yeah.
0:06:46- Remember, wasn't there?
0:06:47This is where you started getting to,
0:06:48like back in college, I remember taking
0:06:50a software testing course, and it was this very tedious,
0:06:55kind of mathematical approach to software development,
0:07:00where you had this thing where every function
0:07:02was supposed to have a particular precondition,
0:07:04like these are the possible ranges of values for the inputs,
0:07:07and then these are the, the postcondition is the value,
0:07:09possible values for the outputs,
0:07:11and you would like structure,
0:07:12and so it's almost at a certain point,
0:07:14you're like, your code becomes this giant equation
0:07:16that has to be perfect because you've sort of proved
0:07:19at every point that the input and output is correct,
0:07:21so the total output has to be correct,
0:07:23but I've never actually found that to be useful in practice.
0:07:28So, but no, it's, I mean, you're testing it is,
0:07:30it's just code, like I think that's the thing that is,
0:07:33like the way that I view it is that
0:07:34it is a different type of code, and it is useful
0:07:38insofar as it's like sometimes you have to write code
0:07:41to test your other code and to make sure it works,
0:07:43but beyond that, it's just a tool that's nice there,
0:07:48and like, but I don't really see, you know,
0:07:49like I have a couple, so now I have a few unit tests,
0:07:52and probably before I do releases going forward,
0:07:55I'll like run my test suite once, just because like why not?
0:07:58It's, you know, it's sitting there.
0:08:01- That's kind of the point.
0:08:03- But like I don't expect it to be the kind of thing
0:08:04where like I'll do continuous integration
0:08:06and have it like running all the time
0:08:07and have an Xcode server sitting somewhere,
0:08:09like running this and like doing all that kind of stuff.
0:08:12Like that doesn't, I mean, that's just not the way I work.
0:08:16Like I don't think of, I don't think of my code that way,
0:08:19and honestly, in a weird way, like I'm not,
0:08:22there's so many aspects too, I think,
0:08:24where because I'm a solo developer, I so often,
0:08:28my code is not always in a shippable state.
0:08:32Like I'm sure there are times that I'm,
0:08:34like I'm breaking the build, and I'm doing it,
0:08:37and it's fine because I'm not affecting someone else
0:08:39when I do that.
0:08:41Like I sometimes just wanna, like,
0:08:44I mean this is years ago now, but when I used to work
0:08:46in a bigger company, like it was a big deal
0:08:48to sort of ever check in code that would break unit tests.
0:08:52And obviously you can make your own development branches,
0:08:54and like there's ways to work around this,
0:08:57but it was a big deal, and it was something
0:08:58that you had to have in your mind,
0:09:00where sometimes I will just be like checking in code,
0:09:03and it's like sometimes my commit message,
0:09:04it just like seems to kinda work.
0:09:07(laughing)
0:09:08And I'm just like, and then like two commits later,
0:09:11it's like actually that didn't work at all.
0:09:12And it's like that's okay, because I'm just having
0:09:15a little conversation with my version control
0:09:17about my process as I go, and it's much,
0:09:21like commits are lightweight and great,
0:09:23so I can just make as many of them as I want,
0:09:25and they're just little checkpoints for me
0:09:27if I wanna be like oh man, I went down
0:09:29the totally wrong path here, let me just roll back.
0:09:33And I can do that in kind of a lightweight way,
0:09:34but yeah, anyway, so I've been down the road--
0:09:37- Do you do branching much?
0:09:38- Very little branching.
0:09:41What I tend to do is I have like my actual,
0:09:45like this is the version I ship,
0:09:47and then the only time I typically branch
0:09:49is if I am going to be working on a major update
0:09:54while concurrently shipping minor bug fix updates.
0:10:01So an example will be once I got this big update out
0:10:06that has all these bug fixes for everyone,
0:10:08I will likely make a branch for iOS 13,
0:10:11and kind of work on that a little bit,
0:10:13and then sort of work down that way.
0:10:15But typically, that is the extent of what I'm doing,
0:10:18and sometimes I also, I'm sure it's a terrible thing,
0:10:22but sometimes I make those branches kind of retroactively.
0:10:26I'll go down a path and be like huh,
0:10:29I should probably make a branch of this at this point.
0:10:32But it's all these weird, it's like these tricky things
0:10:35with like code hygiene and structure where it's,
0:10:39I have much more flexibility about it
0:10:41because I'm just a single developer,
0:10:44and like in the same way that unit tests exist
0:10:47to make my life easier, you know,
0:10:49like version control largely exists to make my life easier.
0:10:52And so doing something that was more heavy-handed
0:10:55or even just like, it's just never really clicked for me
0:10:58when that's like okay, I'm gonna work on version 4.1.2.
0:11:02Let me make the 4.1.2 branch and start working on that,
0:11:05and then merge that into master and like do all that.
0:11:09I mean, I'm even the, this is the,
0:11:12it's like, I don't know, this is like Dave's confessional
0:11:13where I'm like, I've actually changed masters
0:11:16several times too.
0:11:17- Wait, you can do that?
0:11:18- Well, I just have like new master and like new new master.
0:11:21(laughing)
0:11:22- Oh no.
0:11:23Master v2 final final final v1.
0:11:26- Yep, exactly.
0:11:27I've gone down that road too.
0:11:29And like it works, like it's fine.
0:11:31And I'm sure, yes, I'm sure there's some git command
0:11:33I could actually do, but like, 'cause every now and then
0:11:36if I actually like try, and I'm sure there's some like,
0:11:38is this when I'm supposed to rebase or something?
0:11:41- I don't know what that means.
0:11:42- And rebase like hurts my head, but there's--
0:11:44- There's a whole bunch of like advanced git maneuvers
0:11:46that just break my brain and I just don't, I don't do,
0:11:49I never, I just never do any of them.
0:11:50I don't know what they mean, I'm scared to ever try them.
0:11:53- Yeah, but like this is the thing where like sometime
0:11:55I'll make a branch, I'll go down this path and like,
0:11:57and then I'll go to merge it back into master.
0:12:00And then there'll be like a big massive set
0:12:03of conflicting changes or something in the,
0:12:05and like I don't, I don't wanna like deal with that.
0:12:09Like that's just busy work that isn't actually name important
0:12:12because the name of the branch, that's the one I ship,
0:12:16being called M-A-S-T-E-R is entirely like semantic.
0:12:20Like who cares?
0:12:22And so I'll just be like, it's like now I'll just be like,
0:12:24let me just take whatever this feature branch
0:12:26that I've been working on and I'll call it new master
0:12:29or I'll call it Dave's awesome code and like,
0:12:33this is what I'm shipping now.
0:12:35- Super master. - It's fine, yeah.
0:12:36And the thing is because like the way
0:12:40that version control works, like whatever the most recently
0:12:43worked on thing is like becomes the head of the tree
0:12:45of like version control, like essentially the old master
0:12:48just like withers away and dies and I never see it again.
0:12:51And like that's fine, so.
0:12:53- Wow, yes, you really are doing it more like a tree
0:12:56'cause you know, in an actual tree,
0:12:58branches don't ever merge back into the trunk.
0:13:01- That is true.
0:13:03- So you're kind of like, you're doing it more semantically
0:13:06to the word branch in its original meaning.
0:13:10- Yeah, my branches go off and then sometimes they kind of
0:13:14go back in towards the trunk but most of the time,
0:13:15sometimes they just go off and become their own trees.
0:13:18Like those really awesome trees where like the tree,
0:13:20you know it's like basically what I'm doing is that
0:13:21you know when the tree falls down and then a new tree
0:13:25is like springs out of the trunk of the old tree,
0:13:28so you have like a tree that's horizontal
0:13:29and then another one comes up out of it vertically?
0:13:31That is my version control system.
0:13:34- That's fantastic.
0:13:35No, I mean, and I think there, and first of all,
0:13:37before I forget, I actually use branching a little closer
0:13:40to the way I think we're quote supposed to do it
0:13:44but still not to the way that a large organization
0:13:46will do it 'cause you know, I do branching where I mostly
0:13:50am doing most of my work on the master branch
0:13:52for most of the year but I will create branches
0:13:55if I'm doing like a big experiment that requires like
0:13:58what if I tear apart the UI and rearrange things
0:14:01in a really big way that I know would take a lot more work
0:14:04before it would ever become shippable?
0:14:06I'll create a branch for that that like I'm gonna change
0:14:08a whole bunch of code in a way that I probably don't want
0:14:11in the master and might never want in the master
0:14:13so I'm gonna do this experiment off to the side.
0:14:16Another way, another time I create branches
0:14:18and by the way, most of those just get abandoned
0:14:21and then another way I do them more frequently
0:14:23is whenever there is a new beta season
0:14:26so I basically, WBC Monday every year,
0:14:30I create a new branch for this year's iOS 13
0:14:34and that branch requires iOS 13 so I get all the most fun
0:14:38warnings in Xcode about everything that's deprecated
0:14:41and everything that's changed and everything,
0:14:42all these new warnings and I just slowly plow through
0:14:45and work on that branch throughout the summer
0:14:47as I get things done and it's for the same reason
0:14:50that you kind of mentioned earlier of like I want to be able
0:14:53to ship updates to the master branch if necessary
0:14:56for the old OS over the summer and this summer,
0:14:59I've been doing a lot more of that than I ever had before.
0:15:02I think almost every summer, I've issued like between zero
0:15:06and one update in the entire summer for the old OS
0:15:08because I basically stop working on that completely
0:15:11and put all my resources behind the new OS.
0:15:13This year's a little bit different.
0:15:15You mentioned this too.
0:15:16This year is that, you know, it's,
0:15:19iOS 13 not only is in a pretty rough state,
0:15:22you know, and wasn't in a pretty rough state for a while
0:15:24and might still be but also it is the first update
0:15:27in a while to drop all device compatibility
0:15:29and so a combination of those two things I think
0:15:32is gonna result in a slower than usual adoption rate
0:15:35and also there's not a lot in iOS 13
0:15:39that I really must adopt on day one.
0:15:41There's a bunch of stuff I'm excited to migrate to
0:15:43and to add and to, you know, that'll make my app better
0:15:47and I am working on a big iOS 13, you know,
0:15:50UI rearrangement and everything but it's not urgent
0:15:54and so it's not gonna come soon.
0:15:56It's not gonna come like on day one.
0:15:58I'm not gonna do the thing I usually do
0:15:59where I drop support for the old OS basically
0:16:01in the first week of the new moon coming out
0:16:04'cause it's basically not ready yet.
0:16:06I don't have time and I haven't had the chance to finish it
0:16:09and it's too big of a job.
0:16:10So instead what I've been doing is working on stuff
0:16:14in the iOS 12 branch that doesn't require 13.
0:16:16So underlying changes, code, you know,
0:16:19like under like, you know, model level changes,
0:16:21audio processing type changes,
0:16:22anything that doesn't require new APIs for 13,
0:16:26I'm doing on my master branch and then, you know,
0:16:29every few weeks like pulling it and merging it
0:16:31into my iOS 13 branch and then I have a second branch
0:16:35off of the iOS 13 one for three column view
0:16:38'cause three column view breaks everything in the app.
0:16:40So that one is like the iOS 13 build is kind of shippable.
0:16:44The three column view branch which is branched
0:16:47off the 13 branch is not at all shippable yet.
0:16:51I can't even use it on my own phone yet, it's so broken.
0:16:53Like everything is broken.
0:16:55So I have this summer been doing a heck of a lot more
0:16:58in the master branch while leaving the beta branch
0:17:02as like my side project which is totally the opposite
0:17:05of how you have usually done it.
0:17:07But I do think there's a larger lesson here
0:17:10which I'll get to in a moment.
0:17:10But first, we are brought to you this week by ZOJO.
0:17:14X-O-J-O, ZOJO.
0:17:16ZOJO is a cross platform development tool
0:17:18for creating native apps for the desktop, mobile, web
0:17:21and even Raspberry Pi.
0:17:23ZOJO currently supports Mac OS, Windows, Linux, iOS
0:17:26and Android's coming soon.
0:17:28With ZOJO, you write just one version of your app,
0:17:30say on the Mac, then you just literally check a check box
0:17:32and you have a completely native Windows version as well.
0:17:35ZOJO uses native controls so your app looks at home
0:17:38on every platform and you'll be able to build apps
0:17:4010 times faster which will save you time and money.
0:17:43ZOJO is great for everyone, from newbies
0:17:45to professional developers alike.
0:17:47It's currently used by over 300,000 developers worldwide
0:17:51from students all the way up to Fortune 500 companies.
0:17:54Go take a look at their site and you can see
0:17:56just how many companies you know use ZOJO.
0:17:59It's free to use and then licenses are required
0:18:01to build standalone apps.
0:18:03To learn more, go to ZOJO.com/Radar.
0:18:06That's X-O-J-O dot com slash radar
0:18:10and you can get 20% off any license with the code radar.
0:18:13Thank you so much to ZOJO for the support of this show
0:18:16and Relay FM.
0:18:18So I think one of the big themes that,
0:18:21covering both testing which I also use but extremely little,
0:18:24like I have a test suite for the FC model database layer
0:18:29of my app which by the way is currently broken,
0:18:31like it doesn't even build.
0:18:33- Perfect.
0:18:34- And I shipped an FC model bug in my beta tree last week
0:18:38or the week before.
0:18:39I shipped a couple of builds that had a pretty significant
0:18:41bug in FC model that caused really bad performance
0:18:45and I didn't even run the tests.
0:18:47I haven't run the tests in months which is why
0:18:49the build is broken.
0:18:50'Cause like certain things changed and the test suite
0:18:54build broke and I didn't notice.
0:18:55So I'm not a good tester and you aren't a very good
0:18:58version controller and I think this leads to a larger issue,
0:19:04or a larger I guess lesson or truth to this which is that
0:19:08many of these tools, you mentioned continuous integration,
0:19:12even version control to some degree, I do think all indies
0:19:17should be using version control but you don't need to be
0:19:19doing a lot of particularly fancy stuff with it.
0:19:21And certainly testing I think would be in this category
0:19:25as well.
0:19:27These are tools that we have in the industry that
0:19:32are kind of optional for indie developers because they're
0:19:35not really made for us.
0:19:37They isn't to say they can't help us but that they are
0:19:41really much more necessary when you have a team
0:19:46of developers.
0:19:47When you have multiple people working on the same code base,
0:19:49people at different skill levels working on different
0:19:52components, maybe, and especially as your team gets larger,
0:19:56these things become more and more necessary and more
0:19:58and more beneficial.
0:20:00But when you're just one person, a lot of these advanced
0:20:03tools don't have that much bang for the buck for you.
0:20:08And that isn't to say, again, this isn't to say you can't
0:20:10benefit at all from them.
0:20:12You very much can benefit from all these things.
0:20:14Using advanced version control stuff, using automated
0:20:17testing and test-driven development, anybody, one person,
0:20:22up to 1,000 people can benefit from this.
0:20:25However, I think the math changes of what's worth it or not
0:20:28and to what degree you need to do this.
0:20:31How deeply do you need to run these tests?
0:20:34How advanced and how diligent do you have to be with your
0:20:37use of branches and different commit styles and commit
0:20:40messages and version control?
0:20:41When you're in India, it gives you not only the freedom
0:20:47to tone some of that down, depending on your preferences
0:20:50and your needs, but also, I think you have kind of an
0:20:54obligation to question a lot of this stuff and to question
0:20:58how far you need to go with it as an indie, because you
0:21:02don't have time to do it all.
0:21:04Time is incredibly precious to indie developers.
0:21:08It is by far our most limiting resource.
0:21:10And if something's gonna cost a ton of time to improve
0:21:15your code quality by 5%, that might not be worth it.
0:21:19So you have to kind of find that balance for yourself.
0:21:21Like which of these various advanced tools are actually
0:21:23worth it for you?
0:21:24- And I think too, there's a little bit of the time,
0:21:27but I think honestly, the thing that I find more important
0:21:31is motivation and fluidity, where there are certain things
0:21:36that you could say that you should be doing because of
0:21:44software engineering or just good best practice.
0:21:48You're setting yourself up for more success in the future.
0:21:51You're putting yourself into a good position.
0:21:54Those are all true.
0:21:56But any time that my tooling or my process is getting
0:22:01in the way of my creation, that is like, I will fight that,
0:22:06I will drop that, it will hurt my motivation,
0:22:08whatever it is.
0:22:09I mean, it is something that I think is, at least for me,
0:22:12is just, it's far better for me to be excited and just
0:22:17cranking away and making stuff and getting it out and
0:22:23being thorough, but in ways that are not cumbersome, maybe.
0:22:28And so many of these aspects of tooling or around testing
0:22:32or version control or whatever, just sort of get in the way.
0:22:35And I like being lightweight with this stuff.
0:22:39And as much as there have been times that it comes back
0:22:42to bite me, it has come back to bite me way fewer times
0:22:46than you would think.
0:22:47And having done this for hundreds of different releases
0:22:52over the years, if you are, the testing that's really
0:22:55important is getting it on devices and using it and playing
0:22:59with it and making sure that you really have an understanding
0:23:03of how the app is going to work and that you put it through
0:23:06the use cases and the experience.
0:23:09And the reality is that too, that kind of testing also,
0:23:13if you put yourself in that position, is you're exposing
0:23:16yourself to different kinds of problems, more qualitative
0:23:20problems rather than just quantitative problems.
0:23:22And that's something that is also very important, to be
0:23:25like, man, when I run this on this whole device,
0:23:27it's really slow.
0:23:29I mean, in some ways, you can sort of get that from a test.
0:23:31But having a number that says, running the test on this
0:23:34device, your test suite takes 16 seconds to complete rather
0:23:38than 13 seconds to complete, that may not be nearly as
0:23:43impactful on you or as important to you.
0:23:46And so that's just something else that I keep in mind.
0:23:48And I think especially, I like kind of, I don't know, maybe
0:23:51like over the summer, everything's just kind of feels a
0:23:54little bit more loosey goosey for me.
0:23:56But it's a time of year where I enjoy just kind of trying
0:24:00things out and being much less structured.
0:24:04It kind of makes me laugh, but I feel like at the end of the
0:24:07summer, the rightmost page of my phone is full of apps that
0:24:12are just like the white icon with the little icon grid in
0:24:17it.
0:24:18Like, not even joking, I think I have probably, let's see,
0:24:23one, two, three, four, five, six, seven, eight, I have 24
0:24:27of those.
0:24:27(laughing)
0:24:28Like an entire--
0:24:30- That's awesome.
0:24:31- It's like an entire page, and a few more of apps.
0:24:35And I like this time of year where it's like, ah, I wonder,
0:24:38it's like, hey, this is a new interesting API.
0:24:40Like, let me just make an app.
0:24:42And I'm not doing version control, I'm not thinking about
0:24:44release or anything kind of structured for it.
0:24:47It's just like Xcode, file, new project, give it a go, and
0:24:52like 99% of that will just get thrown away.
0:24:55But what is also kind of surprising and kind of nice is
0:24:59more often than not, there'll be one function from that
0:25:02little experiment, that little project, that little thing I
0:25:06did once on a hot afternoon in the summer when I was feeling
0:25:09bored.
0:25:10We'll come back and it'll be useful.
0:25:13Or later in the time it'll be like, oh, I wonder, I need to
0:25:18use this API, how does it work?
0:25:21Or like, I have in my mind, oh man, that API is full of
0:25:24dragons and is going to bite my head off, and I'm not even
0:25:26going to go near it.
0:25:28It's useful, and some of that is just about being loose,
0:25:33fast and loose with the stuff that you can be, and then just
0:25:36being conscious and intentional with stuff that is probably
0:25:39best not to be.
0:25:40And I think as indies, we have to think about the entire
0:25:44business, not just the code.
0:25:47And a lot of this, I think your instinct to avoid and get
0:25:52rid of things that slow you down from experimentation is
0:25:55very good for this business because you can have the most
0:25:59battle hardened, rock hard, 100% test suite coverage, you
0:26:04can have the best app in code quality in your category, and
0:26:08then someone else can come with a really crappy one and
0:26:10take a bunch of market share from you because they can move
0:26:12faster than you, or they're doing features that you didn't
0:26:14do, or they're undercutting you on price, or whatever else.
0:26:17The market does not reward code quality beyond a certain
0:26:21level.
0:26:22We're not launching the space shuttle here, we're making
0:26:24apps for phones for the most part that aren't very important
0:26:28that no one's going to die or get hurt if our app crashes,
0:26:31or behaves slightly weirdly.
0:26:32If you're in one of those fields where that's not the case,
0:26:35please don't listen to any of this advice.
0:26:37But most of us are doing things that that level of code
0:26:42quality mostly just hinders us, and it's really hard to
0:26:47accept as a developer, there's a bug here, I know there's a
0:26:50bug here, and I have to ship this version anyway because I'm
0:26:52going to miss the deadline if I don't, or whatever.
0:26:54But again, it's about finding balance.
0:26:58You can't have massive top 100% code quality and also still
0:27:03be nimble and be making an app that has good features and is
0:27:08competitive in your category if you're one person.
0:27:10You just can't, you're only one person.
0:27:12And so you have to kind of choose areas in which to take
0:27:14shortcuts that hopefully won't impact things too badly and
0:27:18will hopefully keep you nimble and keep you competitive.
0:27:20And you have to think about the whole business holistically,
0:27:23not just the code quality itself.
0:27:27- Yeah, and I think too, there's an aspect too of making
0:27:29sure that you understand why you're doing something that
0:27:34you're doing.
0:27:35Like, there's the reasons why many organizations have robust
0:27:40processes and like sophisticated version control or build or
0:27:45continuous integration.
0:27:46The reason why they do that may be to catch problems that
0:27:50won't exist in your case.
0:27:52Like some of the continuous integration stuff is about
0:27:54making sure that merge conflicts don't mess up the builds.
0:27:57Like you're not gonna have a lot of merge conflicts if you're
0:28:00the only person working on the code.
0:28:02It's not like someone else has been working on it.
0:28:03Like these are, there's a reason why it exists and that may
0:28:06not be something that actually applies to you.
0:28:08And so like doing something blindly is never a good idea.
0:28:11So it's also like, I think just being thoughtful and saying,
0:28:14is this actually useful?
0:28:15Is this making my product better?
0:28:17Is this improving my product in a way that my customers are
0:28:19going to appreciate and enjoy?
0:28:21And is it motivating me?
0:28:22Is it keeping me excited?
0:28:24Is it keeping me moving and like doing all the things that
0:28:27are actually driving the product forward?
0:28:30And if it is, great, do it.
0:28:31Otherwise, like drop it and it's like spending that time
0:28:35enjoying the summer instead.
0:28:37- And more importantly than a lot of these factors,
0:28:40you have to consider is it worth it?
0:28:41Because all these things have costs.
0:28:42They all have costs.
0:28:44You know, you can point to any of these things and say,
0:28:46well, if you have, if you do this kind of practice or this
0:28:49kind of technique, you'll save yourself from problems X, Y,
0:28:51and Z and that's invaluable.
0:28:53But nope, it has a value and all these things have costs.
0:28:56And you have to weigh whether those costs are worth it.
0:28:59A lot of times we get so obsessed with the cool part of what
0:29:02these tools and techniques can do that we ignore the costs.
0:29:05We ignore like, wow, that took me eight hours to set up
0:29:07or something like you ignore those costs.
0:29:10But these all have costs and you could be doing other things
0:29:13with that time instead, possibly even nothing and taking a
0:29:16vacation and you have to really weigh what that's worth.
0:29:18Companies are really bad at that.
0:29:20Companies waste a lot of money on things they might not,
0:29:23they might not need because they're afraid of different
0:29:24factors and everything.
0:29:25But you as an indie have to be more conscious of time cost
0:29:30of what these things take.
0:29:31- Yeah.
0:29:32- Anyway, this, here we go proves that we can talk about
0:29:34anything for a half hour.
0:29:35Thank you so much for listening everybody and we'll talk to
0:29:38you in two weeks, hopefully with a topic that time.
0:29:41- Yeah, bye.
0:29:41Bye.
0:29:42[BLANK_AUDIO]