PodSearch

Under the Radar

142: Passion Projects

 

00:00:00 ◼   ► Welcome to Under the Radar, a show about independent iOS app development. I'm Marco Arment.

00:00:04 ◼   ► And I'm David Smith. Under the Radar is never longer than 30 minutes, so let's get started.

00:00:08 ◼   ► So today we are going to talk about passion projects or side projects or things that we work

00:00:16 ◼   ► on that aren't directly related to our core business or our job if you sort of work in a

00:00:22 ◼   ► more traditional environment. If you may remember a few weeks ago we talked about rest and about

00:00:28 ◼   ► taking breaks and about the benefit that that can have on you. That is sort of the passive version

00:00:34 ◼   ► of rest. In many ways passion projects or side projects are the active version of rest. This is

00:00:41 ◼   ► the you're doing something, you're not doing nothing, you're working, but you're working on

00:00:46 ◼   ► something in a very different way and with a very different purpose. And this is something that both

00:00:51 ◼   ► Marco and I worked on this summer. We had little side projects or passion projects that we worked

00:00:56 ◼   ► on and I think we both saw some benefit, learned some lessons, and it was an encouraging experience

00:01:02 ◼   ► for me. And so this is something that I wanted to bring up as a topic because I think it is something

00:01:07 ◼   ► that is very easy as you become more and more professional in your career that you may start

00:01:15 ◼   ► to do less and less. If you learned a program in an academic environment you probably spent the

00:01:21 ◼   ► first few years of your development making projects that don't go anywhere or aren't

00:01:27 ◼   ► particularly useful. Your teacher will say, "I want you to make an app that does something like

00:01:32 ◼   ► this. You need to play Tic Tac Toe or we're going to display the game of life and have it display."

00:01:42 ◼   ► You have all these toy examples. Or if you read any programming book you have these examples that

00:01:48 ◼   ► you're like, "Hey, we're going to build an inventory management system," when you're working

00:01:52 ◼   ► on how to build a web server. And you have this process where you start with a new project, you

00:01:59 ◼   ► build something, and then you put it on the shelf or throw it away. And the purpose of that, in that

00:02:05 ◼   ► context, is to learn, is to develop a new skill. But I think it is easy once we become professionals,

00:02:13 ◼   ► real pros, where we go to work or we have something that we're doing for our living, is to forget the

00:02:20 ◼   ► benefit of that experience, to forget the fact that there's a reason when you're learning something.

00:02:25 ◼   ► The best kind of learning I've ever done is through practical examples of working on a problem

00:02:30 ◼   ► and developing something from scratch. And I think a great way to continue that as a professional

00:02:40 ◼   ► is to have side projects or passion projects or things that you work on. And ideally even,

00:02:45 ◼   ► these are projects where you are intentionally putting them into a place that is tangential to

00:02:52 ◼   ► what you're working on. It's not really a passion project if I start making some other kind of

00:02:59 ◼   ► fitness tracking app. That's my business, that's what I do, so it might be useful. But really,

00:03:06 ◼   ► it's kind of like building a prototype for a potential product. I think a side project in

00:03:10 ◼   ► something is really best if it's in something tangential to what you're doing, where you might

00:03:15 ◼   ► learn some skills that you can reapply, which I think is something I'll get it to as one of the

00:03:20 ◼   ► benefits. But it is not necessarily the primary goal. Because I think really, doing this type of

00:03:25 ◼   ► work has two, maybe three great benefits. And I think the first one is you can learn new skills.

00:03:33 ◼   ► Just try a new framework, try a new language, try a new platform, try something that is different

00:03:40 ◼   ► than what you normally have to do, and you will develop the skills needed to do that in the first

00:03:45 ◼   ► place. Two, you can practice the basics. There are certain fundamental things that we can start

00:03:54 ◼   ► to take for granted, that you have to set up, that if you do file a new project, you start to use.

00:04:01 ◼   ► And it lets you get out of any kind of groove that you may be stuck in with your existing project,

00:04:08 ◼   ► especially if you just have one big app that you work on all the time. There may be a certain way

00:04:12 ◼   ► that you're just used to doing things, but if you start fresh, you may see those basic things

00:04:18 ◼   ► differently. But even there, even if you do it the same way, there's just something good about

00:04:22 ◼   ► practicing, like getting code into Xcode, that you kind of have to start from scratch and go through

00:04:28 ◼   ► that process. And that's just a good exercise, in the same way that once you know how to run,

00:04:34 ◼   ► if you want to stay fit, you can't just say, "Well, I know how to run. I've been doing it

00:04:38 ◼   ► since I was two." You have to practice it. You have to actually go through the motions if you

00:04:43 ◼   ► want to stay fit and capable with that action. So in the same way that development, you've got

00:04:49 ◼   ► to actually sit down in Xcode and put things out. And so it's just a great opportunity for that.

00:04:54 ◼   ► And then thirdly, it's just a great way to have some variety. It can be easy to get kind of stuck

00:04:59 ◼   ► into a place where you get kind of bored, or you hit a dead end creatively. And there is something

00:05:08 ◼   ► fun about solving an interesting problem. I love the best passion projects are the ones that kind

00:05:14 ◼   ► of get stuck in your head, and you start thinking about funny little solutions or creative options,

00:05:19 ◼   ► or like, "Huh, I wonder if I could do this, or I wonder if I could do that."

00:05:23 ◼   ► You have these ideas that you can then explore, and it stimulates you creatively. Like in the

00:05:28 ◼   ► way we were talking about when you take a break, sometimes just doing nothing can sort of reset your

00:05:33 ◼   ► framework and help you to be creative again. Sometimes just making something can also be

00:05:39 ◼   ► creative and a useful thing. Yeah, and you mentioned earlier that it shouldn't be something

00:05:45 ◼   ► that is tied to your primary business. This is a trap that I fall into very frequently, which is,

00:05:51 ◼   ► like, I'll make some kind of side project that actually solves a need that I have or that I

00:05:57 ◼   ► think might actually be a good market, and it's no longer a side project. Then it's just a project.

00:06:03 ◼   ► Then it's just another app I have to maintain as part of my business. There is, I think, a happy

00:06:08 ◼   ► medium, though, which is what you mentioned, which is taking something that you know how to do and

00:06:13 ◼   ► doing that on a different platform. This is kind of what I did with Forecast. Forecast is, so I

00:06:21 ◼   ► have Overcast. The podcast player Forecast is basically a podcast encoder that is directly

00:06:25 ◼   ► related to Overcast, obviously. That is audio related and actually shares some code with

00:06:31 ◼   ► Overcast for some of the processing stuff. But it was for the Mac, first of all, which is,

00:06:37 ◼   ► you know, I don't really do much on the Mac, and I really don't know much about Mac programming. So

00:06:43 ◼   ► to do not only a Mac app, but to do a non-trivial Mac app where it has multiple document windows and

00:06:49 ◼   ► everything, like that was actually a huge learning experience for me. And it was different enough

00:06:54 ◼   ► from Overcast in a lot of large ways that the small ways that it was the same, which is like

00:07:00 ◼   ► it's related in audio and stuff, I think that kind of didn't count. The downside, though, is that

00:07:06 ◼   ► I did make it a product, basically. Like, it's free, but it's still a product I have to maintain.

00:07:10 ◼   ► Like this summer, I have never seen Mojave running. I have never tried to run Forecast on Mojave.

00:07:19 ◼   ► I have no idea if it works. I assume people would have told me by now if it didn't, but I haven't

00:07:25 ◼   ► maintained that at all yet because I've been too busy with Overcast. Similarly, I have a Mac app

00:07:31 ◼   ► that's a much better side project example called Quitter. Quitter is a very simple little dumb

00:07:36 ◼   ► little menu bar app that is barely an app at all because it has almost no interface and almost no

00:07:40 ◼   ► code. But it basically allows you to set time limits and say, like, if you haven't brought this

00:07:47 ◼   ► application to the foreground in X minutes, just quit it. And it was a way for me to basically use

00:07:52 ◼   ► Twitter and stuff less. So, like, whenever it'd be in the background, it would just automatically

00:07:55 ◼   ► quit. Anyway, there's been changes to the way Apple events are allowed to be sent between apps

00:08:02 ◼   ► on Mojave. And I think Quitter might break under that, but I don't know. I haven't tried. I barely

00:08:09 ◼   ► maintain it. I haven't looked at the code for that in probably two years. But again, I've been

00:08:14 ◼   ► too busy. And so, like, part of the risk you run releasing side projects is they will at some point

00:08:22 ◼   ► require maintenance. And even if they are free and you set expectations like, hey, look, this is a

00:08:27 ◼   ► side project. I'm not going to be updating it a lot. I'm not going to take anybody's money. Like,

00:08:31 ◼   ► just have this be out there in the world. Even then, you still kind of have some obligation,

00:08:36 ◼   ► at least the way at least a lot of people perceive you to have some obligation to keep those things

00:08:41 ◼   ► up to date with new OS releases and stuff. And so it's really hard for something to be just a

00:08:48 ◼   ► frivolous side project that never needs any additional work and never becomes kind of

00:08:52 ◼   ► business-like. - Yeah, and I think especially as soon as it becomes something that you

00:08:58 ◼   ► share with anyone else. - Yeah. - Like, that is, I think, is the, like, this precipitous point where

00:09:03 ◼   ► it changes from being a side project just as something you're doing for yourself, something

00:09:08 ◼   ► you're doing for your own education or development or for your own fun. Like, as soon as you share it

00:09:14 ◼   ► with someone else, I mean, maybe beyond, like, your spouse or your friend or your children or,

00:09:20 ◼   ► you know, a situation like that, but as soon as it becomes something that's public, it suddenly,

00:09:25 ◼   ► I think, switches and it, like, it stops being a side project and it becomes a project. It may be

00:09:30 ◼   ► a less important project, but it's, now it's a thing that you're going to have to manage

00:09:35 ◼   ► its life, its life cycle. That if it turns out Quitter doesn't work on Mojave, you're going to

00:09:39 ◼   ► have to decide and deal with the, like, "Okay, do I need to, like, announce that I'm not supporting

00:09:44 ◼   ► it anymore? Do I need to take it down? Do I, like, it's suddenly this thing." Whereas, ideally,

00:09:50 ◼   ► these projects are just things that you are doing for fun, and then when they're done, they kind of

00:09:54 ◼   ► go on a shelf. Or you use them if they're useful to you. Like, sometimes it's fun if they solve,

00:09:58 ◼   ► you know, solve a problem you have, but it's nice for it to not necessarily be something that you

00:10:03 ◼   ► make public. And I think it's good to go into these kind of things, ideally, without the

00:10:07 ◼   ► expectation that it won't go anywhere. I mean, maybe it's nice if it goes somewhere, or it can

00:10:12 ◼   ► be useful if, say, you're a younger developer and you're just trying to have some level of portfolio

00:10:19 ◼   ► to show people. I know I don't do this for, I don't, I haven't interviewed someone in years,

00:10:23 ◼   ► but I often hear from people that one of the things they like to see is, you know, "Can you

00:10:26 ◼   ► show me something that you've made?" And this may be an example of an opportunity for you to make

00:10:31 ◼   ► something that you can show, but it's still, it's, you need to be careful, I think, because the,

00:10:36 ◼   ► it's like, as you're talking through this experience you've had a few times of doing this,

00:10:40 ◼   ► it's like, it can become a trap where the thing that may have started off being a side project

00:10:46 ◼   ► for fun now becomes not necessarily a burden, but something that you have to think about in

00:10:51 ◼   ► a different way, and something that you may have to make sort of grown-up professional decisions

00:10:55 ◼   ► about, which, whereas, ideally, you're just making it for fun, and it's just using it as a,

00:11:01 ◼   ► as a benefit to yourself. -It's also, it's a lot more work to make something that is releasable

00:11:06 ◼   ► to anyone else, like, you know, when you're just making something for yourself, it can work only

00:11:11 ◼   ► on your computer, only for your needs, and that's it, like, you don't need to, to, you know, account

00:11:18 ◼   ► for certain edge cases, you don't need to do things like have a nice icon for the app, or have

00:11:24 ◼   ► any icon at all for the app, frankly, or, you know, you don't have to do things like, you know, set up

00:11:28 ◼   ► any kind of distribution, if it's not an, if it's like a Mac app, you don't have to do things like

00:11:32 ◼   ► set up a sparkle feed somewhere, and do auto-updating, and stuff like that, like,

00:11:35 ◼   ► you can just have it be a code that you, a code project that you build for yourself whenever you

00:11:40 ◼   ► need it, and that's it, like, there's no distribution overhead, there's no generalization,

00:11:45 ◼   ► there's no, like, officialness, you know, when it's out there, you know, what if you get, like,

00:11:49 ◼   ► a trademark complaint from somebody, or a copyright complaint, because you stole someone's icon,

00:11:52 ◼   ► or something, like, it's just, it's so much more work to do something that is distributable,

00:11:56 ◼   ► versus something that you literally just have to use on your own computers, and, you know, and,

00:12:01 ◼   ► like, this is why, like, I have, I have lots of little scripts, and, and even a couple of apps

00:12:07 ◼   ► that I have built for myself that I've never distributed, and it's just, because it's just not

00:12:12 ◼   ► worth it, and we'll talk about that in a minute, in more detail, but, like, there are some that are

00:12:16 ◼   ► tools that I use, like my, my track aligning utility, everyone keeps asking me to release

00:12:20 ◼   ► the track aligning utility for, for podcast double-enders, there's a reason I haven't,

00:12:24 ◼   ► it's a command line app that works about 85% of the time, it's fine for me, but it's not really

00:12:31 ◼   ► distributable, and it's not good, it's not good enough for that, and it would just create problems,

00:12:36 ◼   ► and, and things I had to work on, meanwhile, I haven't had to look at the code in something,

00:12:39 ◼   ► like, five years, and I haven't worked on it at all in that time, and it's been totally fine,

00:12:44 ◼   ► it just keeps working as a tool for me, and that's it, like, forecast, I used something like two

00:12:50 ◼   ► years before I distributed it to anybody else, or publicly, at least, because that, again, it was,

00:12:55 ◼   ► like, it was a tool that I wanted, I built it myself, but I didn't, I didn't have the time or

00:13:00 ◼   ► the will to, to go through everything it took to make it public, and that's, you know, and there's

00:13:06 ◼   ► lots of apps, like, like, maybe my ad blocker, I probably should have done that, but didn't,

00:13:11 ◼   ► there's, you know, certain things that, like, I shouldn't have released, but, you know, it's,

00:13:16 ◼   ► all these things have been learning processes, and so, the one that I think we're about to talk

00:13:19 ◼   ► about is, I made an app this summer called Town Painter, and my idea for this summer was, I, I

00:13:27 ◼   ► vacation in this town that has this nice little grid of walkable streets, and I loved walking my

00:13:33 ◼   ► dog, and so, I wanted to be able to basically walk the entire town, walk every street in town,

00:13:40 ◼   ► and just draw on a map where I have walked, so I know which ones I haven't gotten to yet,

00:13:44 ◼   ► and, because I wanted to walk every single block in town, and so, it was, and I also, you know,

00:13:50 ◼   ► I wanted to learn Swift a little bit better, because I really had barely used Swift,

00:13:54 ◼   ► there's lots of, there's lots of APIs that are involved in making that kind of app

00:14:00 ◼   ► that I wouldn't have had a chance to play with in Overcast for many good reasons,

00:14:04 ◼   ► things like location APIs, the workout and health kit storage API, because I stored everything in

00:14:09 ◼   ► health kit, I was working out data, map kit, and drawing on the maps, like all these things,

00:14:14 ◼   ► I really had never, I never had a reason to use those in like my main app, or any app,

00:14:19 ◼   ► any other app I made, so it was a good learning experience for all that, and I made this great

00:14:24 ◼   ► app, and I even, I drew the icon myself, and I think it turned out pretty good, it went through

00:14:29 ◼   ► a few iterations, so I kind of learned a little bit better icon design, which normally I don't

00:14:33 ◼   ► do myself, I, you know, the name, which actually, I believe you came up with the name, right?

00:14:38 ◼   ► - Maybe, I don't remember.

00:14:39 ◼   ► - I think, you at least came up with the name Paint the Town, and I think I turned it back into

00:14:44 ◼   ► Town Painter, but yeah, it was, so, like, it was a nice collaboration between me and you,

00:14:50 ◼   ► and it was overall really a very nice project, and I'll come back to that in a second, but first,

00:14:58 ◼   ► let's talk about our sponsor. We are brought to you this week by Zojo. Zojo is a cross-platform

00:15:04 ◼   ► development tool for creating native apps for desktop, mobile, web, even the Raspberry Pi.

00:15:09 ◼   ► Zojo currently supports macOS, Windows, Linux, iOS, and Android is coming soon. With Zojo,

00:15:15 ◼   ► you write just one version of your app, say, on the Mac, and then you can literally check a

00:15:19 ◼   ► checkbox and have a completely native Windows version as well. Zojo uses native controls,

00:15:25 ◼   ► so your app looks at home on every platform. You'll be able to build apps 10 times faster,

00:15:30 ◼   ► which will save you time and money. Zojo is great for everyone, from newbies to professional

00:15:35 ◼   ► developers. It's currently used by over 300,000 developers worldwide, from students to Fortune 500

00:15:41 ◼   ► companies. Go take a look at their site, and you'll see just how many companies you know use

00:15:45 ◼   ► Zojo. Zojo's free to use, and licenses are required to build standalone applications,

00:15:50 ◼   ► and you can see more for yourself at Zojo.com/radar. That's X-O-J-O dot com slash radar.

00:15:56 ◼   ► To find out more, and listeners of this show can get 20% off any license with the code radar.

00:16:02 ◼   ► Once again, Zojo.com X-O-J-O dot com slash radar, and code radar to get 20% off any license. Thank

00:16:08 ◼   ► you so much to Zojo for the support of this show and Relay FM.

00:16:11 ◼   ► So I had this wonderful Town Painter app, and honestly, I really enjoyed the process of building

00:16:18 ◼   ► it. It didn't take very long. I spent probably a week on it, maybe two at most, but I probably

00:16:24 ◼   ► wasn't that long, probably about a week. And it really did teach me a lot more about building in

00:16:29 ◼   ► Swift. And that, I think, was the biggest value to me, besides actually getting to use it all summer,

00:16:35 ◼   ► which I did, and it worked great. And I did indeed paint the entire town, and it didn't take me all

00:16:40 ◼   ► summer, it took me June, so that was even better. But at some point, I realized, like, first, I was

00:16:49 ◼   ► kind of making it to be somewhat releasable. That's why it has a nice icon, I gave it a name,

00:16:54 ◼   ► I gave it, like, you know, it's a pretty decent interface, it isn't hard-coded to anything of mine,

00:17:01 ◼   ► you know, it's pretty generalizable. But I decided while making it, like, you know, I've gotten a lot

00:17:07 ◼   ► of value out of just making this. I got a lot of Swift knowledge, I got to play with these new

00:17:12 ◼   ► APIs that I don't normally get to play with, I have become a better developer, I got to even

00:17:17 ◼   ► experiment with icon design, I got to become a better developer by making this app. And what

00:17:23 ◼   ► am I going to do, sell it, you know, or put it on the store? How many downloads is that really going

00:17:28 ◼   ► to get? And then I have an app that I have to maintain when there's, like, a new iPhone release

00:17:33 ◼   ► and stuff, and I don't have time. So, basically, I made the app, I walked the entire town, and by

00:17:41 ◼   ► July, it was done. And so I thought, okay, that app is done. Like, I got what I wanted out of it,

00:17:48 ◼   ► I drew my map, I'm going to do the same thing next summer, I'm going to have the same, you know,

00:17:53 ◼   ► rebuild the code, fix any obvious problems on the new phone, which there probably won't be,

00:17:57 ◼   ► and then I'll just start using it again next summer, and that'll be it. And that's, I think

00:18:01 ◼   ► that's enough for that app for me. Like, I don't think it would ever get enough usage, like, as

00:18:06 ◼   ► soon as I started making it, I started hearing people saying, like, you know, you can just do

00:18:09 ◼   ► this with, you know, all these different fitness apps that already do this. It's like, there's,

00:18:14 ◼   ► like, pretty much every major fitness app, like, you know, Strava and Runkeeper, and even your app,

00:18:18 ◼   ► even Workouts++, all support features that are very similar to this, if not this exact same

00:18:22 ◼   ► thing. And so it's like, you know, I really don't need to distribute this, I really don't need for

00:18:27 ◼   ► this to be a product, and I don't have time for it to be a product, I need to focus on Overcast,

00:18:31 ◼   ► and, you know, all these Mac apps I keep neglecting. So, like, I decided, you know,

00:18:37 ◼   ► that was it. And when I got my new iPhone X, I even deleted the app off my phone, I'm like,

00:18:41 ◼   ► well, I'm done until next summer, like, I don't even need the app to be taking up a spot on my

00:18:44 ◼   ► home screen anymore. And I'm very happy with that just being it. Like, it was a great learning

00:18:50 ◼   ► experience, it was useful for me for a month, it'll be useful to me next summer for another month,

00:18:55 ◼   ► and that's it. Yeah. And I think there is something, like, delightful about that, like,

00:19:00 ◼   ► that it's, you make, you made something, served a purpose, it was fun, you learned something,

00:19:05 ◼   ► and it doesn't have to be more than that. Like, it's, there's something just, I don't know,

00:19:10 ◼   ► there's something almost beautiful about just making something for its purpose, and then its

00:19:14 ◼   ► purpose is, it's lived out, and then you can move on. And, like, you learn something, and what you're

00:19:18 ◼   ► taking with you forward isn't some kind of project or some thing that you have to maintain, but you're

00:19:23 ◼   ► just taking the knowledge and the learning that if you need to work with location APIs, or mapping

00:19:28 ◼   ► APIs, or health kit APIs, or Swift in general, it's now something that you have experience with,

00:19:36 ◼   ► that you just wouldn't have had otherwise, and you had to solve some interesting problems. Like,

00:19:40 ◼   ► I helped you a little bit on some parts of this, because obviously health and fitness related stuff

00:19:45 ◼   ► is something that I worked on, and I get to, you know, I dug around a little bit in what you're

00:19:49 ◼   ► doing, and it's like, you know, it's your having to solve problems at a different level than,

00:19:53 ◼   ► you know, sort of than anything you're going to have to deal with in Overcast. And I think,

00:19:58 ◼   ► you know, as simple as a project like this is, and this is something that I think is probably a more

00:20:01 ◼   ► interesting point, is that ostensibly what you did is a very simple application. You know,

00:20:07 ◼   ► what you did, it's as you walk around, track my location, and plot it on a map, and overlay past

00:20:14 ◼   ► walks on the same map. Like, that is ostensibly what the app does. There's a lot of, however,

00:20:19 ◼   ► really interesting problems you have to solve, and things that come up. And as an example, there is,

00:20:23 ◼   ► I had a little teeny part of this app that I, we were talking about it, and the question became,

00:20:30 ◼   ► "How would you know when you're done?" And the, we just talked a little bit about it,

00:20:35 ◼   ► but I couldn't get that question out of my head. For like, like days, I kept being like,

00:20:39 ◼   ► "How could you work out when you're done?" Because that's, it's like, ostensibly, it's a little bit

00:20:45 ◼   ► simple, but it's actually kind of a tricky problem, because you're dealing with just

00:20:48 ◼   ► raw location data, and are you gonna, you know, how do you know when you've actually covered every

00:20:53 ◼   ► street segment? And I ended up, just because I couldn't not stop, I couldn't stop thinking about

00:20:58 ◼   ► it, I ended up solving that problem. And it's like, I ended up going to like raw OpenStreetMap

00:21:03 ◼   ► data for the island that you're walking on. - Right, because Apple Maps doesn't even give

00:21:07 ◼   ► you the street data. Like, you just tell it, render these things in this geometry, you know,

00:21:12 ◼   ► in the world, but you can't read street data for Apple Maps. So you had to actually go to

00:21:18 ◼   ► OpenStreetMap, download the map for where I was, you know, bound it off like with where I could,

00:21:23 ◼   ► where I could walk. - And like doing this all like in raw, like I just got an XML dump from

00:21:28 ◼   ► OpenStreetMap, and it's like, I had to learn how to parse that. What does that actually mean? Like,

00:21:33 ◼   ► what are the different features that are actually useful? Because obviously it's not that, like,

00:21:37 ◼   ► it'll tell me all kinds of things, like where the sea, where the ocean is, what like, I don't need

00:21:42 ◼   ► to worry about that segment, I need to worry about the roads. What is an actual road versus a path?

00:21:47 ◼   ► Like, do paths count? - Right, and once you have a feature that's like, tells you how complete it is,

00:21:53 ◼   ► then you have basically like infinite feature creeps. And it's like, well, you could maybe,

00:21:58 ◼   ► you know, build an incentive system to like try to keep the ratio high, you know, have old ones fall

00:22:03 ◼   ► off the end of like, have like a sliding window, so you can say, in the last 30 days, how much have

00:22:07 ◼   ► I done? Am I at 95%, am I at 99%? Then you have to realize, oh, as you said, some of these are not

00:22:13 ◼   ► actually streets, some of the data is wrong, or some of them are not actually reachable,

00:22:16 ◼   ► you can't actually walk there, or there's like, you know, there's a house in the way,

00:22:20 ◼   ► or it's a private road, you aren't allowed actually on it, and so you have to have some way to mark

00:22:24 ◼   ► certain road segments as unreachable. And it's like, there's like infinite potential feature

00:22:29 ◼   ► creep for something like this, and it's so tempting, maybe you could notify the user with

00:22:34 ◼   ► prompts if they haven't walked that day. Like, there's infinite amount of potential feature

00:22:39 ◼   ► creep on this that could just make this project balloon in scope and time, and that's extra true

00:22:45 ◼   ► if you do release it, 'cause then the public is asking for these features, or you're competing

00:22:48 ◼   ► with somebody, like, it's extra true with that, but like, even as a personal project, the temptation

00:22:53 ◼   ► for feature creep is very strong, and I had to resist a lot of that. - Yeah, and like, in the end,

00:22:58 ◼   ► like, the app does exactly what it says, and like, my little part of it that calculates your percent,

00:23:02 ◼   ► it's like, it just does the best job it can, and I feel good about having solved that problem,

00:23:06 ◼   ► that I could finally put it out of my head, and it maybe doesn't solve it perfectly, maybe it solves

00:23:11 ◼   ► it like halfway, or it gives a reasonable estimate of what percentage of the roads you've worked on,

00:23:15 ◼   ► but I learned something. I learned how OpenStreetMap data works, I learned how to do some kind of cool

00:23:20 ◼   ► segmentation stuff with that, and then I moved on, and like, I haven't looked at that code since,

00:23:25 ◼   ► I don't expect to ever look at that code ever again, but I learned something from it, and you

00:23:29 ◼   ► know, that was the goal. - Well, and you know, at some, some day in the future, some of this might

00:23:33 ◼   ► prove useful to you. Like, you helped me out very much by this, by giving me a block of your code

00:23:38 ◼   ► that reads the work I did at a health kit and plots it on a map, which is great, because that saved me

00:23:43 ◼   ► a ton of time, and then at some point, I decided to tackle the unnecessary problem for the scope of

00:23:49 ◼   ► this, of, you know, there's a lot of points in this data, I should smooth out those points so it

00:23:53 ◼   ► renders faster, and there's fewer points, you know, to manage on the screen, so I did some research

00:23:59 ◼   ► for a day where I should have been doing anything else, and learned like algorithms for reducing the

00:24:04 ◼   ► number of points with like the least disturbance to the shape of the data, and I figured that out,

00:24:09 ◼   ► I implemented it, and then at some point, you had a need for that, and so I gave that back to you,

00:24:13 ◼   ► and so we kind of helped each other out with this, and you know, all, you know, sharing techniques

00:24:18 ◼   ► and code samples that solve problems that we mostly don't have, but are kind of nice to get

00:24:26 ◼   ► solved sometimes anyway, and that's kind of, you know, that's kind of what this whole episode's

00:24:29 ◼   ► about, like just doing stuff that you might not need to do, but that's intellectually satisfying,

00:24:36 ◼   ► and might prove valuable to you in other ways later. Yeah, exactly, like, and I think, so another

00:24:42 ◼   ► example just quickly that I wanted to talk about is this summer when we were traveling in Europe,

00:24:47 ◼   ► I built another app just for myself. You? Which, yeah, well, which is funny, you say that as though

00:24:53 ◼   ► it's like I build all these apps, the last time I launched publicly an application was two years ago.

00:24:57 ◼   ► Yeah, that's fair. I'm actually not that prolific anymore, but I've made a bunch of apps, but I just

00:25:02 ◼   ► don't really, I've learned the lesson and stopped releasing them. Like our Tesla app that we made

00:25:07 ◼   ► together. Yeah, exactly, we made an app for managing our cars. Yeah, because the built-in

00:25:10 ◼   ► app wasn't very good, and we, so we made our own Tesla app that, like, you know, there's limitations

00:25:14 ◼   ► of it, like if you want to log out, you have to crash the app. It's fine. It's fine. It works for

00:25:21 ◼   ► us. Yeah, exactly. Anyway, so when I was in England, my son loves departure boards at train

00:25:29 ◼   ► stations. Like this is just, he just absolutely loves them. Like watching all the trains come in

00:25:34 ◼   ► and working out which platform which train goes to, and if you've ever been to a British train

00:25:38 ◼   ► station, they have these just massive walls with departure boards on them, and he just loved them.

00:25:43 ◼   ► And it became this thing that over the summer, I was like, "Well, would you like to make your

00:25:48 ◼   ► own departure boards? Like, should we, you know, let's design an app together. Let's make our own

00:25:52 ◼   ► departure board." And he just thought this was the funnest thing ever. And, you know, we sat down

00:25:57 ◼   ► with a piece of, you know, like paper and pencil, and we drew out what the app would do. And then we

00:26:01 ◼   ► sat down and kind of, he's not quite at the level where he's learning to code a little bit, but he

00:26:05 ◼   ► isn't really at that point where he's able to code code, but, you know, he, we designed it together.

00:26:10 ◼   ► I sat down and we worked on, you know, what it should look like together. And we had that part,

00:26:15 ◼   ► and that was a really fun experience for us to work together. And then I worked on the,

00:26:20 ◼   ► like the ugly parts of the app that he would have no interest in dealing with, and I had barely

00:26:24 ◼   ► any interest in, because like getting the actual data, you have to get from a SOAP API.

00:26:28 ◼   ► Oh, God.

00:26:29 ◼   ► If you've ever worked with SOAP is like the most, like just mind-bending API to work with.

00:26:35 ◼   ► But I learned how to do that. I've never done that before. Now, if that ever comes up in the future,

00:26:40 ◼   ► if I ever have to deal with a weird API, like I have this tool in my back pocket for how to do it,

00:26:45 ◼   ► I worked out a way to do that. I actually have like a caching proxy that takes in the SOAP data

00:26:50 ◼   ► and turns it into JSON. So I didn't have to make our actual app very complicated. Like,

00:26:55 ◼   ► I had all this fun experience. And it turned into, like, I solved some interesting problems. I had a

00:27:01 ◼   ► deal, I wrote it in Swift, just like you did with Town Painter, where it's like, I got to experience

00:27:06 ◼   ► a bunch of new APIs in Swift. And like, the reality is this app does what like, you know,

00:27:12 ◼   ► 60%, 70% of apps on the App Store do, which is takes in some JSON data, parses it, manages it,

00:27:18 ◼   ► and displays it to the user. And I got an experience of doing that. And in the process,

00:27:22 ◼   ► I got to spend some really great quality time with my son doing something that he really enjoys and

00:27:26 ◼   ► that we used in practical ways. Like during our trip, which was kind of even like doubly fun,

00:27:32 ◼   ► which he thought was great, but we're like, running late to catch a train, and we need to know what

00:27:36 ◼   ► platform our train's going to be at. And I could bring up my UK Departure Sport app. And you know,

00:27:41 ◼   ► he could, he knew exactly how to make it work. And he could find out which platform it is. And

00:27:44 ◼   ► he could feel like a hero for saying like, you know, we need to get to platform six by

00:27:47 ◼   ► 2.2.47. Like, that's really fun. And I learned something, you know, we had a nice experience,

00:27:54 ◼   ► and it became something that like, I don't expect to use that ever really again. I guess whenever

00:27:58 ◼   ► I'm in England, I might use it again. But I don't care. Like, I didn't have to worry about like,

00:28:04 ◼   ► API pricing rules and things where like, it's like all these things that if I released it,

00:28:09 ◼   ► and suddenly it's like a thing, I have to manage the cost of that. Whereas for personal use, it's

00:28:14 ◼   ► like, I'd never hit my limit of like 1000 API requests a day. Like, that was never a problem

00:28:19 ◼   ► for me. And if I did, and I spent, you know, spent six cents in API charges, it's not a big deal.

00:28:24 ◼   ► But I learned something, I had a fun experience with my son, I have this little like fun memory

00:28:28 ◼   ► now. And I can move on. And I learned something from it. And I think it just reinforced this thing

00:28:34 ◼   ► in my mind that I think every year, I should be working on a project like this every year,

00:28:39 ◼   ► every six months, whatever it is, I should have something that I make for fun that I learned

00:28:44 ◼   ► something from, and then I can just put on a shelf and intentionally try and put it on that shelf,

00:28:48 ◼   ► then unless it turns out to like, be this radically awesome thing that you just can't

00:28:52 ◼   ► hold to hold on to, and you have to share with the world that you just put down, and you're okay with

00:28:57 ◼   ► that. And I think going into that, that mindset just dramatically helps your ability to get what

00:29:03 ◼   ► you want out of it without having to be fearful to start or sad going forward.

00:29:09 ◼   ► Jared Ranerel Yeah, that is a balance and a lesson that

00:29:13 ◼   ► has taken me a long time to learn. I'm not sure I fully learned it yet. But having done it, having

00:29:18 ◼   ► successfully done that with Town Painter feels really good. And I'm really, I hope that I am

00:29:24 ◼   ► better with that in the future. Well, thanks for listening, everybody. And we'll talk to you next

00:29:28 ◼   ► week.

00:29:28 ◼   ► Bye.

00:29:30 ◼   ► [