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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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