PodSearch

Under the Radar

250: From Left Field to the Home Stretch

 

00:00:00   Welcome to Under the Radar, a show about independent iOS app development.

00:00:04   I'm Marco Arment.

00:00:05   And I'm David Smith.

00:00:06   Under the Radar is usually not longer than 30 minutes, so let's get started.

00:00:09   We are in the home stretch about to hit the release of iOS 16 and the iPhone 14 series,

00:00:17   which is probably happening a week from now, next Wednesday.

00:00:22   So this is like the busiest.

00:00:26   I was explaining to my son at breakfast this morning why my Minecraft time today is going

00:00:30   to be a little bit reduced than normal, because we basically have two busy seasons as iOS

00:00:36   developers, early June and mid-September, which is now early September this year.

00:00:42   And this is the other one, explaining why, explaining what OS stood for.

00:00:48   That was a fun one.

00:00:50   So this is the home stretch, and this is one of the first times in a few years that I'm

00:00:56   actually feeling it myself, because for the last few years I've been so mired in technical

00:01:04   debt and honestly motivation issues a lot of those times that I wasn't able to even

00:01:11   come close to having iOSX features shipping on the day that iOSX ships.

00:01:18   I wasn't even anywhere near that, and it would usually take me six months before I

00:01:22   would actually have something for the new OS that was ready.

00:01:26   And this year I was assuming I was going to be in that same bucket, I guess.

00:01:33   That's the term, right?

00:01:35   And what happened instead was, I believe after last week's show, you remarked to me that

00:01:43   I should probably just do the lock screen widgets, because since I already had other

00:01:48   widgets set up, it would take me a very short time.

00:01:52   I believe you said like a day.

00:01:54   And it ended up taking me to get the initial lock screen widgets going 45 minutes.

00:02:00   And that included redrawing my icon to be a certain style that would work well in those

00:02:06   icons.

00:02:07   That's good to hear.

00:02:08   Thank you.

00:02:09   Yeah, you were right about that, turns out.

00:02:10   You are sometimes right about things.

00:02:12   It rarely happens, but I'll take it when it happens.

00:02:16   I think your hit rate's pretty good.

00:02:18   But anyway, so that turned out easy.

00:02:21   And then some of my users were requesting, "Hey, can we customize what they do?"

00:02:25   Or, "Can we..."

00:02:27   A few people requested that I have lock screen widgets that launch particular playlists.

00:02:34   And that seems like an obviously great idea, because I already have SF symbols configured

00:02:40   per playlist, and those render really nicely in those little circles.

00:02:44   So, seems like a great idea.

00:02:46   Of course, why don't I do that?

00:02:48   That requires a configuration intent.

00:02:50   Oh, no.

00:02:52   That requires touching intent handling code.

00:02:55   And then I saw, oh, there's a new app intents framework with iOS 16.

00:03:00   And that is awesome, because all the previous ways to do intents are terrible, and have

00:03:06   caused me so much time loss and headaches, bang on my head against the walls, fighting

00:03:11   the tools, which is always the worst feeling.

00:03:14   And the problem is I can't use those pre-iOS 16, and I can't use those for widget

00:03:20   configuration yet, as far as I can tell.

00:03:22   So, I started diving into my old intent handling code, which was largely Objective-C

00:03:28   based, or it was like a mixed Objective-C and Swift environment for that.

00:03:32   And it had to deal with the auto-generation and all these bugs and Xcode that are around that.

00:03:37   And so, what started out as very simple, just lock screen widgets that would launch

00:03:42   Overcast, or that would just show basically what my single, my small widget currently

00:03:48   shows, which is whatever is the most recent or newest episode that came in or was played,

00:03:54   just show that and tapping on it resumes it or plays it.

00:03:56   That's it.

00:03:58   That was part of the 45-minute initial implementation.

00:04:00   It was super easy and quick, and I'm super happy I did it.

00:04:03   But then trying to get configuration so I could do custom playlist circles, that took

00:04:08   me like three days, and it's still not done.

00:04:10   Because once that all happened, everything was breaking in my build, and all sorts of

00:04:14   things were breaking.

00:04:15   And then I thought, oh, why don't I take this opportunity, while this stuff is breaking,

00:04:19   to also modernize the watch targets, because I had the old two-extension system.

00:04:24   I could move it into a single extension with the new architecture, with SwiftUI

00:04:28   lifecycle. Let me try that.

00:04:30   That took three days, and it's still not done.

00:04:33   So now I took on too much, too late in the cycle, so I can ship my lock screen widgets

00:04:40   in a simpler state on day one.

00:04:43   But I tried to do more, and it blew up my face.

00:04:46   But this is, and this is probably against your recommendation of when to add new features

00:04:54   and when to stop adding new features in the beta cycle.

00:04:57   Yes, no, this is definitely something that I have struggled with a lot in terms of deciding

00:05:05   when in the cycle is okay to sort of add new features, whereas is there a point at which

00:05:10   you have to stop.

00:05:11   And so I have a little tradition for myself where usually it's about two or three weeks

00:05:15   out of when I expect the event to is going to be, I'll make a little sign-up that says

00:05:20   no more new features, and I put it up in my office right under my monitor.

00:05:24   And at that point on, I try and hold myself to not adding any more new features.

00:05:28   I can do bug fixes, I can do performance enhancements, and then things.

00:05:31   And if I'm completely honest, I will still add a few features here and there.

00:05:34   But it feels like I can change a little bit my mentality around what I'm going to tackle.

00:05:40   Like I don't tackle any, like your second one, or if like modernizing the watch target,

00:05:44   it's like, like, nope, that is absolutely not going to make it in.

00:05:47   Yeah, that was a terrible idea.

00:05:49   It's like, you know, like this year, I think I did this a week and a half ago was sort

00:05:53   of my line, and since then I've added a few features, if I'm being completely honest,

00:05:57   but they all tend to be these things where they're very atomic, like if they happen,

00:06:03   they happen, if they don't, they don't.

00:06:05   They tend to be things that I need to be able to implement in less than a few hours.

00:06:09   They tend to be just sort of like enhancements and tweaks, and you know, ooh, I've had a

00:06:13   few options for this or that.

00:06:14   And it's like, I did a couple of those this cycle, but I definitely, like, it's an approach

00:06:19   that I strongly recommend as you get closer to just sort of like really dive in.

00:06:25   And I think the main reason I think it's important is what's always been fascinating

00:06:29   to me.

00:06:30   So like this week, like the last three days, all I've done is performance testing and

00:06:35   bug fixing.

00:06:36   And it's kind of funny, like every day I finish work, like usually for me it's around

00:06:39   five o'clock, I'll wrap up work, and I'll be like, wow, man, I had a great day, I fixed

00:06:44   all these bugs.

00:06:45   I mean, it's like Widgetsmith is basically ready to go.

00:06:47   Like it's perfect.

00:06:48   I can't find any more bugs.

00:06:50   And I think they have that slightly smug feeling all evening in the morning, and then I'll

00:06:54   sit down and start testing again, and I always find more bugs.

00:06:57   And it's one of those funny feelings of it's like, but there were no bugs yesterday.

00:07:02   Like how are there new bugs?

00:07:03   But if I didn't give myself this space and this time to be able to really try these things

00:07:09   out and think of, you know, like try it on different devices, try it in different configurations,

00:07:13   go in and it's like I had one thing that was slightly terrifying this week was I installed

00:07:17   version one of Widgetsmith from two years ago and did a bunch of configuration and then

00:07:22   installed the latest version to make sure that I'm doing kind of like data migration

00:07:25   and compatibility correctly.

00:07:27   But I got to say, like running, you know, a two year old version of your app is just

00:07:30   the strangest feeling where you're like, oh, this is so creaky, all these weird issues

00:07:34   and things and all these things, essentially all of the learnings that you've had over

00:07:38   the past two years, like unmanifested in front of you.

00:07:41   And it was like, how did this app, how was this app ever popular?

00:07:43   How did anyone ever like this?

00:07:44   This app was awful and terrible.

00:07:46   So that was a fun experience.

00:07:48   But I do believe to think that as you get closer, the closer you get, the more you need

00:07:52   to just not touch it and make, you know, sort of understand that version, you know, like

00:07:57   the point one release afterwards is going to be there.

00:08:01   You'll have an opportunity to add these things.

00:08:03   But yeah, the week before the Apple event is not the time.

00:08:07   I'm just I'm hoping to get like a couple of good things out there by then.

00:08:12   It's going to be.

00:08:13   I really like right now it's like my project file is basically like, you know, on the floor

00:08:18   in pieces.

00:08:20   It's like I can I can build it, but a lot of things don't work yet.

00:08:27   The watch app is a disaster.

00:08:29   I have no time to test.

00:08:30   Like I should probably just like, you know, use a previous commit branch off of that and

00:08:34   just, you know, ship that as well.

00:08:36   Like, I don't you know, I want to try to get this nice.

00:08:39   And that's that's the problem.

00:08:40   It's so easy to be like, oh, just one more thing.

00:08:43   Oh, one more thing.

00:08:45   And yeah.

00:08:46   And then then I'll be for, you know, your project files on the floor in pieces.

00:08:50   And it takes you a week to put it back together.

00:08:52   Yeah.

00:08:53   And it's like the thing the hardest part of this is the reality that the things you are

00:08:58   doing are like good things and appropriate things and are moving your right, you know,

00:09:02   moving the app forward and are like it's not like you're doing things that aren't helpful.

00:09:06   Like this is the end result of this would be great and be awesome.

00:09:09   And like, it's definitely a good place to be, but it's just like, by finding the right

00:09:15   time to do that kind of work versus insect really, you know, like the real thing you

00:09:19   have to keep in mind is like you want to be ready to, you know, submit the app, you know,

00:09:23   with even if your basic implementation of your lock screen stuff, like on day one, like,

00:09:28   ideally, that's just sort of what you do.

00:09:29   And you know, like that will happen.

00:09:32   But like, if you're in a weird state or kind of you're not sure or you haven't had time

00:09:36   to thoroughly test or make sure that it's actually what you want it to be, you know,

00:09:40   it's like, then that's an awkward place to be because it's like waiting on the sort of

00:09:45   best possible features rather than and then shipping nothing is definitely worse than

00:09:48   shipping something good and solid if it isn't as sort of expansive as you would like it

00:09:54   to be.

00:09:55   Yeah, exactly.

00:09:56   And I want to be like, I want to be in a good place with the lock screen, which is in particular,

00:10:00   and if I can get widget configurability, that would be great by then.

00:10:04   Because I want to be in a good place for that because this fall in particular, we are largely

00:10:10   expecting the iPhone 14, at least Pro series to have some kind of always on screen and

00:10:17   that's and it would be most likely able to show these lock screen widgets in a certain

00:10:22   like low luminance state just like the recent Apple watches have been able to, you know,

00:10:26   with their always on screens.

00:10:28   And so this is probably like, it's fairly pressing that, you know, if that's if that

00:10:33   ends up happening, as the rumors have foretold, then there's going to be a lot of power users

00:10:38   who get iPhone 14 pros on day one and really expect all of the nerdy apps like mine, all

00:10:48   like the power user nerdy kind of apps to be there on day one with really cool lock

00:10:53   screen widgets so that they can use their this cool new feature of this cool new phone

00:10:56   they just bought.

00:10:57   And so that's like, that's the kind of thing that gets me to get off my butt and and stop

00:11:03   procrastinating and actually ship things quickly.

00:11:06   And so that's why like, I feel pressure, you know, from that end, and I imagine you must

00:11:11   feel immense pressure because widgets are such a massive proportion of your business

00:11:15   at this point, that like you like anything that touches widgets, it's a really big deal

00:11:21   to you.

00:11:22   Yeah, I mean, this, I would say this fall is a weird feeling because coming into, I

00:11:29   was 14 when widgets were first introduced, I had no expectations really, like I thought

00:11:34   it would, you know, I didn't I had no expectations that widgetsmith was going to be, you know,

00:11:38   successful, popular, interesting, like, I thought it was just like, Oh, this is a fun

00:11:41   little extension of this app that I made for the Apple Watch that I can now put on the

00:11:45   iPhone and obviously turned out that that was, you know, that was the biggest understatement

00:11:49   of the century, like, it's like, no, widgets were very important, and widgetsmith was,

00:11:54   you know, like, very popular, and that took me totally by surprise.

00:11:58   And so coming into iOS 16, it's this weird tension of, there's a part of me that like,

00:12:03   because I know what is possible, like, I know that it is possible for a feature like this

00:12:08   to really kind of just like, hit in the culture in a way that is just kind of mind bending,

00:12:15   and you can have, you know, very wide adoption, lots of interest, and it can be this whole

00:12:18   thing, like, I know that's possible. But at the same time, I also don't want to be

00:12:22   like, it's I don't necessarily expect that to happen twice. Like, that was a very unique

00:12:27   and, you know, sort of special situation and a combination of a lot of a lot of things

00:12:31   came together for the iOS 14 launch for it to be as special as it was. And so this year,

00:12:36   it's just the strange feeling of like, I want to be as ready as I can, I want to have

00:12:39   it in all my ducks in a row be as prepared as I can. But on the one hand, I'm expecting,

00:12:45   like it to be kind of just, you know, normal, like, I like everything ready, it launches,

00:12:51   it has some, you know, has a little bit of traction here and there, it gets written up

00:12:54   in a few of kind of like the techie article, you know, sort of news, news places, and that's

00:12:58   great. And like, that's my sort of baseline expectation. But just like in the back of

00:13:02   my mind, it's like, you also have the, you know, boy, I hope I'm not a like missing

00:13:08   something that is going to turn out to be the key thing that, you know, with with with

00:13:12   widgetsmith it, I was very close to not having photo support in it. And if I hadn't had

00:13:19   any photo support in it at all, I don't think it would have been as successful as it was.

00:13:23   And it's like, that was a pretty, you know, it's like, I wouldn't have predicted that

00:13:26   that was the key feature. And so like, coming into this, you know, this fall, it's like,

00:13:30   is there anything that I'm missing? Is there some aspect or some type of widget or some,

00:13:34   you know, sort of approach to this that is going to end up turning me out to be really

00:13:37   important that I'm not there for, you know, it's like some and some other app does, and

00:13:41   then I completely miss out miss an opportunity. And it's just like, Oh, huh, that's, you

00:13:47   know, good for them. But kind of sad for me, like, I don't know, like, it's just impossible

00:13:52   to know. But it's like, I'm going into this year with this weird conflicted feeling

00:13:56   of like, you know, on the one hand bracing for it potentially the potential for it to

00:14:00   be huge, and the most likely reality I think of it just kind of being normal. And like,

00:14:06   normal is great. I love normal. But it's, it's a very strange bit of tension. And

00:14:10   it's definitely kind of amped up my level of preparation and the level of kind of polish

00:14:15   that I feel like I need to have ready on day one this year, just because like, the stakes

00:14:20   feel higher than than usual.

00:14:22   Jared Ranere I think that's, that's a reasonable concern.

00:14:25   But ultimately, like the, you know, that feeling of like, what if I miss the big thing? Or

00:14:29   what if someone else beats me to the big thing? That that's a feeling that I think we all

00:14:34   have around this time of year, you know, when when, you know, we know that, like, something

00:14:38   is about to change, you know, when new iPhones ship, many times there is some kind of new

00:14:43   ability that they provide. And then there is kind of this like race to see who gets

00:14:48   there first to take advantage of it and capitalize on it. And that can that can make big shifts

00:14:52   and changes in like, what apps are dominant in certain categories or what apps, what apps,

00:14:58   what app categories even can exist. But ultimately, I think the reason why you are prepared for,

00:15:05   you know, all this stuff is like, is you are, you are one of the people who is most prepared

00:15:09   in the business to to tackle this, because you have all this experience, like, this is

00:15:14   one of the benefits of being a developer of many apps in the past, is that you have tons

00:15:20   of experience with a very wide variety of different API's past and present dealing

00:15:27   with different hardware capabilities, and you know, different styles of API's, like,

00:15:33   you have such a big, you know, experience behind you, and you have tons of experience

00:15:37   shipping stuff, like getting stuff done quickly and getting it out there. And so you are probably

00:15:43   the most able to quickly capitalize on something like that. That being said, being number one

00:15:50   in any kind of area is very stressful, because when you're number one, all you, you know,

00:15:56   you have a lot of pressure on you to just to not lose that spot. And most of it is probably

00:16:00   self-imposed, but that's still real pressure. And so that I can imagine being like, you

00:16:05   know, a big deal for you, you know, internally. However, I do think that you are best poised

00:16:12   to actually take advantage of it. Like, suppose there is some, you know, some kind of new

00:16:16   widget ability that for some reason we did not predict. Now, that's probably not going

00:16:21   to happen. I think we know, like, from the watch always on screen, they have like the,

00:16:24   you know, the the low lumens, whatever they call it, mode for widgets, like, we can be

00:16:29   pretty sure what's probably going to happen here. But suppose some, you know, something

00:16:34   comes out of left field, right? Is that the right metaphor? I don't know. I don't know

00:16:38   if I'm a baseball or no. Do things ever come out of left field? Don't they go into left

00:16:42   field and then get thrown back? Anyway.

00:16:43   I think things are coming out of left field. Yeah.

00:16:45   Okay. Well, I don't know. That doesn't make sense to me. Because I think, you know, you

00:16:48   see the ball going into left field. Anyway. So assuming that there's some kind of sports

00:16:54   reason why that metaphor makes sense, and assuming that something comes out of nowhere

00:16:57   and no one's expecting, you are very likely to be the person who is able to take advantage

00:17:03   of that first, or at least tying with everyone else who gets there on the same day, you know?

00:17:08   So I wouldn't worry too much about that. And what I've seen too, from my own experience

00:17:13   with my app, is that even though I have a nerdy audience, that nerdy audience is also

00:17:17   very patient in certain ways. Now, if there's some major new OS feature like widgets before,

00:17:26   like when widgets came out in, what was that, was that iOS 13 or 14?

00:17:29   I was 14.

00:17:30   Yeah. So when widgets came out in 14, I didn't have them on day one. I didn't have them until

00:17:35   like four or five months later, something like that. It was a while. Because I was really

00:17:40   in a bad state back then with the app. But at that time, I, it took a few months before

00:17:47   I started getting one star reviews for not having them. And so, like, people do expect

00:17:54   that to be there on day one when they're nerds and they get their new phone. But if you're

00:17:58   not there on day one with something big, you know, it takes a little while before it actually

00:18:04   really starts affecting your business. So if you're a few weeks late, it's fine. Many

00:18:10   people are a few weeks late. It's only big nerdy apps like ours that are actually even

00:18:16   there on day one sometimes. Like, you look at, you know, the apps from big companies,

00:18:20   you know, Google Docs is famous for having terribly slow adoption of anything. You know,

00:18:25   like the big company apps, they oftentimes won't adopt anything at all. Like, you know,

00:18:31   and geez, I mean, a lot of these big company apps don't even do like iPad split screen

00:18:35   yet. Like, you launch them in any of the iPad multi-tasking modes and they take up the whole

00:18:40   screen because they just didn't bother implementing that. Like, there's so much, you know, lag

00:18:44   in implementing new features among most of the app landscape that it only really hurts

00:18:48   the apps that have very nerdy power user audiences like my app. And, you know, if you look at

00:18:54   something like, you know, drafts, like, you know, there's a reason why, you know, Greg

00:18:58   is so, you know, on top of updating that because that's an audience that demands power user

00:19:03   features, power user speed and everything. Most apps aren't like that. Most apps, you

00:19:07   don't need to worry that much about being there on day one with the new features.

00:19:12   We are brought to you this episode by Sourcegraph. So you've hired a brilliant developer. That's

00:19:16   awesome. Now you have to get them onboarded. If your company is growing, onboarding new

00:19:20   developers will be a common occurrence but it's a big undertaking each time. One of the

00:19:24   biggest challenges for new hires is to get up to speed with the project their new team

00:19:27   is working on. This can be tricky if the code bases your developers are working in are huge.

00:19:32   Thankfully, Sourcegraph makes it easy to move quickly even in those big code bases. Developers

00:19:37   know the knowledge is most useful when it's findable. Centralization is helpful but given

00:19:42   the fact that most companies store knowledge in multiple locations, how do you make knowledge

00:19:46   accessible to those who need it? Sourcegraph is a code intelligence platform that gives

00:19:51   developers what they need to drive their own learning over time and in different situations.

00:19:56   Without Sourcegraph, teams need to rely on asking colleagues or reviewing added documentation.

00:20:01   This is cumbersome and time consuming. But with Sourcegraph, every developer can search

00:20:05   across millions of repositories to find specific code, saving time for themselves and everyone

00:20:10   else. So when the big questions actually do come up that aren't answered by that, you

00:20:15   know it's the important stuff that's worthy of the extra time. Sourcegraph was created

00:20:19   to make developers' lives easier. Today, they work with leading companies across every industry

00:20:24   including three out of five of the top tech companies plus PayPal, Uber, Plaid, GE, Reddit

00:20:30   and Atlassian. Visit about.sourcegraph.com to learn more. That's about.sourcegraph.com

00:20:37   to find out why some of the biggest tech companies in the world use Sourcegraph and to see what

00:20:41   it can do for yours. Or to click the link in the show notes to let them know that you

00:20:44   heard about them from us. Once again, about.sourcegraph.com. Our thanks to Sourcegraph for their support

00:20:49   of this show and Relay FM.

00:20:51   So I think the place that it might be interesting just to wrap up this discussion is just to

00:20:57   talk a little bit in more practical terms about some of the kind of things that we do

00:21:00   to get ready for this. Whether it ends up being a big deal or a small deal, we'll find

00:21:05   out. But definitely there are some things that we can do. And specifically, something

00:21:09   that I've tried to really focus on and pay attention to this year is performance testing

00:21:13   and making sure that my apps are solid on this. And I shared some of my tips and tricks

00:21:18   for this last week and I got a lot of interesting questions about it. And it seemed like a good

00:21:22   place to kind of unpack a little bit about what I do here.

00:21:26   And so the first thing I think that is interesting is to understand that when I talk about performance

00:21:30   testing, it's like you're trying to make sure that your app, that no action takes more time

00:21:36   than you would hope it or that the user would expect it to and sort of in some ways takes

00:21:40   the least amount of time possible and uses the least amount of memory and resources in

00:21:44   the process of doing that. But what's difficult and challenging about that is obviously it

00:21:48   was one thing when we were, you and I would remember in the early days of the iPhone where

00:21:52   it's like there were like two iPhones, three iPhones and like that was it. If you tried

00:21:58   it on all three of those, then you were good and you had a very easy and comprehensive

00:22:03   test suite. Whereas now, I support devices back to at least the 6S, I think, generation

00:22:10   of iPhones, maybe even slightly, I think it's as far back as I go. And that's a lot of phones

00:22:16   and a lot of things between now and then. And so having a reasonable testing strategy

00:22:21   for that can be a little complicated. And so it's like the approach I take, and this

00:22:24   is something that I think has worked pretty well for me and I think sort of seemed to

00:22:28   have some resonance for people, was just sort of instead of trying to have an expansive

00:22:32   view of performance testing, that my app needs to be amazing and run perfectly and I'm going

00:22:36   to put the effort in to testing it on all devices, what I do is I take a look at my

00:22:41   stats for my app and kind of look at the processor generations. So I don't particularly care

00:22:47   too much about different screen sizes. There's a little bit of that can be a little complicated

00:22:50   that certainly on some of the older devices like the Plus phones had a very different

00:22:56   performance characteristic to the standard size phones. But in general, even if you just

00:23:00   look at processor generation, and I'll plot what percentage of my users are running each

00:23:05   generation and what I tend to do is make a graph that shows kind of the cumulative coverage.

00:23:10   So if you imagine the iPhone 13 generation, which in my case is about 17% of my users,

00:23:15   and then the next group is the iPhone 12 generation, and I add the number of people running 12

00:23:20   and 13 together and in my case, I get 40%. And you kind of keep working your way back

00:23:24   with an increasing percentage. And it tells you kind of how many people are running this

00:23:29   device or faster. And you almost inevitably you end up with this kind of like asymptotic

00:23:34   curve where you end up with a point of diminishing returns. And for me, that's right around the

00:23:39   iPhone 10, 10s generation, that if I get if my app is running great on an iPhone 10s,

00:23:45   that covers 86% of my customers. For some running great on an iPhone 10, that's 94%.

00:23:51   And so for me, I don't really worry too much about people sort of on the long tail of that

00:23:56   beyond that. And the reason for that, I think this was the part that I think was most interesting

00:23:59   to talk about, is that kind of people are just like, "Well, don't you want your app

00:24:02   to be great for everyone?" And it's like, yes, that's great in the ideal sense and sort

00:24:08   of the conceptual version. But the real reality is, what's tricky with performance work is

00:24:15   usually what you'll do is you'll run a couple of tests, you'll use your application, you'll

00:24:19   run through instruments, all these types of places, and you'll find the slowdowns, you'll

00:24:22   find the points where it's being slow. And then you have to address that. And sometimes

00:24:28   it's just as easy as, "Oh, I'm doing something that I don't need to." You know, there's some

00:24:31   wasted work, there's a very inefficient solution, and you can kind of get free performance wins.

00:24:36   And obviously, take care of all those, take advantage of easy, free performance wins.

00:24:41   But the reality is, is usually, after you've gotten rid of all those, is you end up in

00:24:45   the place where you're going to be having to change your application's behavior, or

00:24:50   the way you've structured your code, in order to make it faster, by introducing things like

00:24:54   caching or using a more sophisticated or complicated algorithm or any number of things that you

00:24:59   might need to do to make something faster. And that introduces complexity and risk and

00:25:05   possibility of bugs. And so it's important, I think, to set a baseline of performance

00:25:10   that you are comfortable with. And anything below that is just you're not going to worry

00:25:14   about. Because if I wanted to make my app run perfectly on an iPhone 6S, I'm going to

00:25:20   have to jump through all kinds of hoops and I'll do all kinds of complicated things with

00:25:23   caching and very low level work in order to make that happen. And as a result, I'm going

00:25:29   to introduce more bugs. And so for me, I tend to take the approach that instead, I'm just

00:25:32   going to focus on performance of my app at a very, like find a level that's comfortable,

00:25:38   find a level that I can feel good about testing on. And just once it's good enough from there,

00:25:44   it's good enough, and I don't worry about sort of below that level. And for me, that's

00:25:47   been working great. I think, you know, my main testing device all summer has been an

00:25:52   iPhone XR, which is I guess the XS generation. And so it's, you know, representative of 86%

00:25:58   of my users. And as long as it's good enough on there, it's been good enough for me. And

00:26:01   I found that this sort of this approach has been kind of freeing me from feeling like

00:26:06   I have to really go, you know, sort of go way down the rabbit hole on some of my older

00:26:11   devices where it's just really hard to get good performance without jumping through some

00:26:15   really complicated technical hoops.

00:26:17   Yeah, I should do something like that. It's a little harder for me to do performance evaluation

00:26:24   overall because I have a huge variety of like sets of podcast data that people can have

00:26:34   in Overcast basically. Like when I get, you know, I'll occasionally get an email or a

00:26:39   report from somebody saying, hey, you know, it's been slow on my phone recently. And they'll

00:26:43   usually drop in or, you know, upon reply, I can get them to tell me like, oh, I have

00:26:47   40 gigs of podcasts downloaded. Oh, okay. Well, this is a bit of a different situation

00:26:55   than, you know, I have on my phone, like maybe two gigs of podcasts, which I consider to

00:27:00   be a lot. And that's, I'm not exaggerating that that's actually the numbers that I, that

00:27:05   people report like tens of gigs of podcasts among hundreds of subscriptions. I'm like,

00:27:11   well, this is a different situation than what I'm usually testing on myself. And it's really

00:27:17   hard to, to performance test for the extremes like that.

00:27:21   You know, like I have like some, you know, I have like a script that generates a very

00:27:24   large account whenever I need one. And I can test with, you know, a huge backlog of podcasts

00:27:29   or very high number of subscriptions. You know, I could, I have tests for that. But

00:27:33   I admit I don't use them very often because it's just really slow no matter what, no matter

00:27:37   what I run it on when the data sets get really, really big. But I don't know, I should do

00:27:42   more of that as part of my process of becoming a responsible developer at some point.

00:27:46   Maybe. But I think the point you're making there though that I think is good to drive

00:27:49   up is this. If you optimized Overcast for the extreme situation, it is not necessarily

00:27:57   true that that would benefit the typical situation. And I think that subtlety is often lost in

00:28:03   these discussions that, you know, if you had someone who is subscribed to 10,000 podcasts,

00:28:11   and your sync system was designed and structured in such a way that it worked really well for

00:28:15   them, it may not work as optimally for someone who has a typical amount, which is I don't

00:28:20   know, like 50 or 10. And I think this kind of thing is just good to be circumspect and

00:28:26   not get too wrapped up in your own mind about chasing down the extremes, which potentially

00:28:33   is introducing risks and problems for the typical case. And it's like, in your case,

00:28:39   if someone has that many podcasts, and it's like, it's slow for them, it's like, okay,

00:28:43   that's unfortunate, but they're representing like 0.01% of your user base, and it's way

00:28:48   better to make sure that like, your initial sync speed and sync speed, if you only have

00:28:53   50 shows, it's like, absolutely, you know, sort of super, super, super snappy, amazing.

00:28:58   And that's the experience that almost everyone's going to have. And so doing something that

00:29:02   doesn't scale to, you know, 10,000, but works great at 10,000, you know, actually is a good

00:29:07   idea, I think.

00:29:08   Yeah. All right. Well, thanks for that. That makes me feel a little better whenever I get

00:29:12   those reports. Well, best of luck to you and to everyone out there dealing with these next

00:29:16   two weeks, which are probably going to be very, very busy for all of us. Thank you,

00:29:20   everybody for listening, and we will talk to you in two weeks. All right, bye.

00:29:24   Thank you.

00:29:25   [