Under the Radar

153: Fear of Major Changes


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

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

00:00:10   So today's episode is going to follow, I guess, a story of a very kind of up and down experience

00:00:19   I've been having over the last, unfortunately, couple of months in terms of some changes

00:00:24   I've been trying to make in Podometer++. And you may, if you're a long time listener of

00:00:28   the show, you may remember that back in October 4th, we even did a whole episode where I was

00:00:33   talking about how complicated it is to implement step counting and diving into that. And that

00:00:39   particular episode was motivated because at the time I was in the middle of making a big

00:00:47   sort of fundamental rewrite, essentially, of the way that the step counting system in

00:00:52   Podometer++ works. Which, given that it's a step counter, the step counting system is

00:00:58   pretty fundamental to the app and for it to be useful. And so it was a change that I didn't

00:01:05   take lightly. And it was a change that was motivated because when iOS 12 sort of came

00:01:10   out, I started getting these sporadic reports that Podometer++ was undercounting steps compared

00:01:18   to the health app or compared to other apps or in general that was undercounting. And

00:01:23   at the time I went and did my kind of investigation, I started looking around, and as best I could

00:01:28   at the time, my initial investigation found that I was seeing lots of undercounting if

00:01:35   I was requesting step samples from Core Motion in the past. So I can ask for up to a week's

00:01:40   worth of data, and when I was asking for data from like four or five days ago, I was getting

00:01:45   undercounted values. And so my initial thought was like, "Oh no, they've changed the way

00:01:49   that this is working. Old day's data is now going to be undercounted." And so there's

00:01:55   no way that I can realistically use Core Motion for this anymore. I need to switch to health.

00:02:00   Switching to health was really complicated and deals with a whole host of problems because

00:02:05   the health API is not nearly as sort of performant as the Core Motion API. Sometimes it just

00:02:15   hangs indefinitely. It doesn't get the data right away. It often has these like 15, 20

00:02:20   minute delays from when you take a step before it would show up. And so I had to build this

00:02:25   really sort of crazy complicated system to kind of manage that and work through it. And

00:02:33   after probably honestly several weeks, maybe a month's work, I think I got to a place that

00:02:36   I was like, "Oh, maybe this works." But then I kind of got stuck. And this is, I think,

00:02:43   the core topic for today was I ended up in this place where I was afraid of releasing

00:02:49   this change because I was sort of scared of making a change, messing everything up, somehow

00:02:56   missing some case in my testing, and fundamentally breaking the app for everybody. Because most

00:03:02   of the changes I make for a particular update, they may be a new feature, they may be a sort

00:03:08   of little tweak somewhere, but it's unlikely that they're going to fundamentally break

00:03:12   the app for every one of my users in a way that I can't easily recover from. And that

00:03:18   was the case for this kind of a fundamental rewriting of the way that I'm acquiring the

00:03:23   data that is key to the app. And I was stuck. And I think that is an interesting state to

00:03:29   find in and for us to talk about because I feel like often we are going to find ourselves

00:03:33   in a situation where we are making a change. And this change could be, you know, it could

00:03:39   be breaking no matter how much testing you do, no matter how robust your system is, there's

00:03:43   always going to be things that potentially could come up. And sometimes this can be paralyzing.

00:03:48   And that's where I found myself. And I was sort of stuck for probably a month, sort of

00:03:53   like ostensibly testing this, but mostly just kind of pushing it down the road because I

00:03:59   was scared of what releasing it would actually be like. No matter how much I tested it, no

00:04:04   matter how sort of much I walked around with five phones in my pocket, like going on long

00:04:09   walks and then checking the data and doing all this kind of stuff, I could never feel

00:04:13   confident enough that I wanted to release it. And I think that fear is kind of a tricky

00:04:18   thing, because it pushed me into a place that I just wasn't being productive. I wasn't doing

00:04:21   useful things. And honestly, like, I mean, I think and while I will continue down this

00:04:25   road for other reasons, it's like, this is part of why I like stuck like, let me it's

00:04:29   like, maybe let's think about making a parameter plus plus for Android, let's go and get an

00:04:33   Android phone. Let's like trial like crazy, like extreme versions of work avoidance. Just

00:04:39   because the word I could never feel confident enough. And that paralysis, I think is just

00:04:45   like it is inevitable with whenever in time you make a big change. And I think it's just

00:04:49   something we have to kind of work through to not let it get you stuck like it did get

00:04:53   me stuck.

00:04:54   I've faced a lot of these like, you know, big change potentials over the years, and

00:05:00   I never I never become comfortable with it. Like it never becomes easy. And I, I will

00:05:07   tackle them eventually, like, you know, and like, I'm currently facing a couple now, like

00:05:10   I one that I'm facing with overcast in like the near term is when I when I do complete

00:05:18   my transition to airplay to what I really have to do is basically rewrite and, you know,

00:05:24   throw out a good chunk of my audio engine and and start it over with a different API

00:05:29   and a whole different approach. And that is really, really intimidating to do. And it's

00:05:36   going to be a lot of work. I've already you know, I'm still laying foundation work,

00:05:39   so I haven't actually started throwing away the audio engine yet. So but that comes next

00:05:43   like that that is going to be the next step like that. I'm probably going to be starting

00:05:46   in the next month or two. And it's it's incredibly intimidating because basically,

00:05:51   like, you know, I did all this code up in a very similar sort of like I did all this

00:05:55   all this code and did this approach up to this point so far. But now in order to move

00:06:00   it forward into what it needs next for the market or whatever, it needs to totally change

00:06:07   needs to be something totally different. And so I'm facing, you know, a complete rewrite

00:06:11   of core components of the app. And that's going to be really, really hard.

00:06:15   And I think the weirdest thing I find too is it's like, it's hard because the apps are

00:06:22   doing well. Like in this weird list before I found it's like as the app does better and

00:06:28   has a bigger audience like the stakes increase in such a way that like if it breaks, it's

00:06:33   one thing if it like when an app is new and young and if you break something, it's like

00:06:38   maybe it'll affect a few hundred people or a few thousand. But as that number gets bigger

00:06:42   and bigger and becomes more significant as like the way you make your living, like the

00:06:46   stakes for shipping in a change like that just kind of get it becomes so scary to me

00:06:52   the thought of like, I'm glad that iTunes Connect or App Store Connect now has the feature

00:06:58   where you can roll out changes over seven days, which I think makes me slightly confident,

00:07:03   but it is weird where like the stakes get so high and you're just like, I just I hope

00:07:07   it works.

00:07:08   Yeah, I mean, that's my problem too. It's like, you know, there's the you know, the

00:07:13   old saying like if it isn't broken, don't fix it. Like, yeah, there's a there's a lot

00:07:19   of inertia behind just keeping things going when they're working well. Like it's really,

00:07:23   really hard to to take a risk like that. You know, not only is it hard to justify the time

00:07:29   to do something like this sometimes, which we've talked about before, but it's also just

00:07:33   like it's a risk. Like like I have this audio engine that's being used by all these people

00:07:36   and it's working fine. And I wrote I wrote most of the core components in 2014, I think,

00:07:42   or 2013. And but it's been fine. It's been totally fine. And so like I I don't want to

00:07:48   touch a lot of this stuff. It's almost like like some of the the programmers that I respect

00:07:55   the most in a field I will never ever, ever feel comfortable working in our programmers

00:08:00   who work on financial software. So, you know, what is code that deals with people's money,

00:08:05   whether it's banking or whatever that to me is very intimidating because if you screw up,

00:08:11   you could have massive consequences for you know, you could have legal issues. You definitely

00:08:17   would have accounting issues like you could lose your company a ridiculous amount of money

00:08:21   or you could lose people a ridiculous amount of money like so like anything that works

00:08:25   with money, you know, like people make fun of the banking industry for having all this

00:08:28   old like Fortran code. But there's a reason why because nobody wants to touch it because

00:08:32   it works. And if you touch it and if you touch it wrong, you have a big problem on your hands.

00:08:37   So that's kind of how I feel like with a lot of my, you know, like my like foundational

00:08:41   audio code. It's like, you know, it's not quite to that level of penalty if I screw

00:08:46   up but it certainly has a lot of that stress of like this is working. It's really important

00:08:52   to my app. It's working fine. And so, you know, even though I'm faced with wanting

00:08:58   to rewrite a lot of it to get these to get you know, new technology, new features, etcetera.

00:09:04   That's really scary because I know it's not going to be perfect. It's and it's so

00:09:08   foundational to the app. I know I'm going to introduce bugs. And so for a while, you

00:09:12   know, for like the first month or two after I release it, it's probably going to be

00:09:16   worse in some respects for some group of people because I, you know, no matter how big I make

00:09:22   the beta, there's going to be bugs that get out, you know, that, you know, that we

00:09:25   didn't catch during the beta. And so like I just I know I'm going to be messing things

00:09:29   up for somebody and that's a really hard thing to to take on. And, you know, it ultimately,

00:09:35   you know, in the long run, it's probably for the better to know like, okay, well, I'm

00:09:39   it's going to be worse, but I'm laying a better foundation for the future. But it's

00:09:45   hard to tackle that now when the part that will be most immediate after release is the

00:09:51   worst part before I get to that nice future.

00:09:55   Yeah. And it is funny. I think that as I've become more mature of a developer, I have

00:10:01   much more of a confidence that it will break than I used to. Oh, yeah, it always breaks.

00:10:07   Yeah. And it's like there's a it's like there's maybe a younger, more naive version

00:10:11   of myself who would just be like, eh, seems to work. Let's ship it. And then like, as

00:10:16   a result, I've shipped in the past, like horrific breaking bugs that like destroyed

00:10:21   people's data and like did awful things. I think it because I didn't take it seriously

00:10:26   enough. And like, that's one of those tricky things, these types of situations where, like,

00:10:31   there is a good lesson in this kind of change that like being like really cognizant of the

00:10:38   scope and the scale of the change and what the likely downsides are. And like that, it's

00:10:44   sort of like the if you if you ever, you know, it's like if you're as soon as you stop

00:10:47   feeling that kind of that nervousness about something, it probably means that you're

00:10:51   becoming reckless, like having just in general in life, like, whenever something stops being

00:10:56   nervous, it's because you've become reckless. And like, it's good to have a little bit

00:11:00   of fear. It's good to have a little bit of a apprehension about when you make a big

00:11:05   change about when you're doing something like this, that, like, you're being aware

00:11:09   that yes, this is, you know, like, this could be bad. I need to have a big beta, I need

00:11:13   to do all like do any kind of quality assurance that I can I need to test it. I need to do

00:11:19   code review, even for even if only for yourself, like something that I've started to do a

00:11:22   lot more is I'll end up like, you know, I do a diff in invert and get from my, you know,

00:11:28   from like, whatever the like, the last good version is to the new version, I'll just

00:11:31   go through all the all the diffs to make sure that they all like seem reasonable in isolation

00:11:35   after like a couple of days of not working on the project. You know, just trying to try

00:11:40   and catch like the weird like, why am I doing that? That seems really weird. Like, there's

00:11:44   all these things that we can do, but it's motivated in a weird way, because I've made

00:11:49   the mistake enough. And now that I know I'm like that I have, like 100% confidence that

00:11:54   something is going to go wrong. And that confidence is like good, but can also make you get stuck.

00:12:02   And like the the stuck part, I think is the thing that is ultimately like is where it

00:12:06   becomes problematic, because the reality is and this is like, it's easy for me to say

00:12:10   in retrospect for my own situation. But is the like, the the, like the app is not getting

00:12:17   any better for me to sort of getting stuck. Like either the change is worth doing or the

00:12:23   change is not worth doing. And after we after our break, I'll have a bit of a turns out

00:12:28   crazy turn of events for this particular situation. But the ethic if the change is worth making,

00:12:34   then it's worth it. We will do our best to make it right and to clean everything up.

00:12:40   But at a certain point, like don't get stuck. And I think that is the best advice that I

00:12:44   can give to myself and probably to anyone listening to this is, yes, it's kind of scary.

00:12:49   And yes, it's going to break and it's going to cause problems. But like either you have

00:12:54   to move forward or not. And if you if you're not going to move forward, like what are you

00:12:58   doing, you're just going to be spinning your wheels forever, which isn't is a disservice

00:13:03   to yourself, you know, to your business and to your customers.

00:13:07   We are brought to you this week by Linode. Linode gives you access to a suite of powerful

00:13:12   hosting options and their prices start at just $5 a month. You can be up and running

00:13:16   with your own virtual server in the Linode cloud in under a minute. Whether you're just

00:13:21   getting started with your first server or deploying a huge complex system Linode is

00:13:26   the choice for you. They are for the fastest hardware, the fastest network and the best

00:13:31   customer support backing it all up if you need help. It has never been easier to launch

00:13:36   a Linode cloud server and Linode guarantees 99.9% uptime for server availability. Once

00:13:43   your server is up, they intend to keep it that way. They have all sorts of wonderful

00:13:47   other additional features beyond straight hosting. They have things like block storage,

00:13:51   load balancing, manage beta or manage backups. It's wonderful. I've been using Linode now

00:13:56   for I think about eight or nine years, some ridiculous amount of time because they're

00:14:00   just great. And I have slowly moved everything I host over to Linode because they're just

00:14:05   better than most hosts I've used. They're better than all hosts I've used honestly.

00:14:09   Like the control panel is nice and easy to use. The pricing is incredible. It's such

00:14:14   a good value. The performance is great. I'm a very happy Linode customer and I have been

00:14:18   for a very long time. So it's great whether you want to host a web app or do something

00:14:24   more specialized like maybe you want to run a mail server or run a VPN or run Docker containers

00:14:30   or private Git servers. Whatever it is, you can host it at Linode. And they're hiring

00:14:34   right now. If you want to maybe work there, go to linode.com/careers. Anyway, Linode has

00:14:39   fantastic pricing options available. Plans start at one gig of RAM for just $5 a month.

00:14:45   And they have wonderful plans that go up from there if you have higher needs than that.

00:14:48   Listeners of this show, go to linode.com/radar to support us and that'll get you $20 towards

00:14:54   any Linode plan. So on the $5 a month plan, that could be four months for free. And with

00:14:58   a seven day money back guarantee, there's nothing to lose. So go to linode.com/radar

00:15:03   to learn more, sign up and take advantage of that $20 credit or use promo code radar2018

00:15:09   at checkout. Thank you so much to Linode for supporting this show and Relay FM.

00:15:14   So if you listened to last week's show, you may remember a little anecdote I told where

00:15:20   I had to make sure that I didn't learn the wrong lesson from finding an old monitor buried

00:15:26   in a box of old cords in my garage. That the lesson I shouldn't take from that is...

00:15:31   What was the right lesson to learn?

00:15:34   The right lesson is that sometimes hoarding technology will be useful, but hoarding technology

00:15:40   in general is probably not good for you. There's a tremendous selection bias and if you focus

00:15:46   on that selection bias, you'll have problems. So I have to do the same thing for this story

00:15:52   I'm about to tell about not learning the wrong lesson from the way this situation with Podometer

00:15:59   ++ ended up playing out. Because I ended up, like I said, I got stuck, I got paralyzed,

00:16:06   and this went on for months. Without exaggeration, probably at least two or three months. I've

00:16:11   been stuck in this place where I have this code that I think kind of works, I've tested

00:16:15   it as best I can, it seems to work, but I'm so stuck, I don't want to ship it. And all

00:16:20   this time, people, users out in the real world, which is sometimes hard to keep in my mind,

00:16:26   are having this trouble. People are getting undercounted steps, and this is bad, and it's

00:16:30   kind of getting increasingly worse and problematic. And at one point, and this happened just last

00:16:36   week, I got an email to our support from someone who said they're having this undercounting

00:16:42   bug, and they said something in their email that totally changed and reframed what I thought

00:16:49   the actual problem was. Because they mentioned that the today widget was showing the correct

00:16:57   number, but the main app was showing the undercounting number. Which is one of those little things

00:17:05   where you never know when there's going to be a little clue that just completely reframes

00:17:10   the problem for you. Because suddenly, this issue that I thought was old data being underreported

00:17:16   turns out couldn't be the case, A, because this is happening on today's data. Like, the

00:17:21   today widget is strictly showing today's date, or today's step counts. And so, it's something

00:17:28   else, and the way that I query the data between the today widget and the main app is slightly

00:17:35   different. Because the today widget only has a concept of today, it doesn't have to store

00:17:40   data and deal with all the crazy timezone issues and all the stuff that I had to deal

00:17:45   with before for the main app, which has a concept of history. The today widget just

00:17:49   asks Core Motion for the steps from midnight to today, or till now. So it just does one

00:17:55   query, whereas the main app had done the thing where, I don't know if you remember from episode

00:17:59   143, where I dived into this, I query the data every 15 minutes, so I get these 15-minute

00:18:04   chunks of data, and it adds them all up for today. But the today widget doesn't do that,

00:18:10   it just asks for all of them. And so, when he said that, it was one of those, like, "Huh,

00:18:15   that's really weird." I go back to Core Motion, I go back to investigating, and it turns out

00:18:20   that the behavior that I was observing, where old data was being undercounted, was I was

00:18:27   seeing the wrong thing there. What was actually happening is data was always being undercounted,

00:18:33   but not all the time. It could happen on any day at any time, and Core Motion was just

00:18:38   kind of unpredictable with this, because I started asking for data in different time

00:18:43   buckets. I started asking for data in, rather than 15 minutes, into hour buckets, or two-hour

00:18:48   buckets, or six-hour buckets, or the whole day. And I noticed that, depending on how

00:18:53   I asked for the data, I got wildly different numbers back. And so the actual bug, and this

00:18:59   is an issue that was introduced in Core Motion in iOS 12, is that when you ask for data in

00:19:07   short chunks, you are more likely to expose yourself to a bug that seems like Core Motion

00:19:13   has a greater than or equals to, that should be a greater than or less than or equal to.

00:19:18   Like, there's some kind of boundary condition issue where it isn't correctly counting steps

00:19:23   that happen across the interval that you're asking for. So if I was asking for steps from

00:19:29   4pm to 5pm and then from 5pm to 6pm, if you happened to be walking right at 5pm, like

00:19:36   the way it accounted for those steps meant that they sometimes got sort of fallen off

00:19:39   and they didn't show up in either bucket. Turns out, that's the problem. That bug,

00:19:47   totally easier to fix, because it's way, like, I can stick with Core Motion, I don't

00:19:53   have to deal with all the craziness with health, and mostly, the bug goes away if you ask for

00:19:58   it in hour-long chunks. It doesn't completely go away, but it seems like 80-90% of the bug

00:20:03   just disappears, and I can deal with that. All I really need to do is account for the

00:20:08   two time zones, like Nepal and Northern Australia, where they have weird half-hour or quarter-hour

00:20:14   time zones, but that's a vanishingly small percentage of my users. Everyone else, they

00:20:20   won't even notice a difference if I switch to hour buckets rather than quarter-hour buckets.

00:20:25   And then I can very easily just ask for the whole data for the whole day, and if the numbers

00:20:29   are slightly different than, like, if I am getting undercounting at the hour level, which

00:20:34   seems pretty rare, if I am, I can take the difference and I can reapply it to the steps

00:20:39   that I saw to make sure that the two numbers match up. Like, super easy, it was about a

00:20:43   day's work to fix, and that's the fix that I submitted to the App Store yesterday. So

00:20:48   I need to not learn the lesson that my paralysis and my fear at not shipping the update previously

00:20:55   for the last two months, hurting my customers for all this time and all this problematic

00:20:58   thing, meant that I ultimately found the correct solution, and instead I need to learn, you

00:21:04   know, have the lesson that being stuck is problematic and is not good, and I shouldn't

00:21:08   just wait around for this magic-like customer support query with this super clue that magically

00:21:15   solves my problem for me, because I suspect that is a fairly rare circumstance and not

00:21:20   something that is going to happen all the time.

00:21:22   - Wow, that, I can't believe that all that was the result of just this crazy little bug

00:21:31   in the framework instead of, like, some fundamental need.

00:21:34   - Yeah, no, me neither.

00:21:36   - Yeah, I can imagine. Oh, wow, yeah, so I, one thing that I also want to talk about is,

00:21:43   like, maybe, like, some of these large changes and rewrites and things that maybe are not

00:21:49   worth doing, you know, and it's always hard to tell, you know, when something is new in

00:21:55   your mind, like, when the concept of, you know, oh, I'm going to rewrite the whole app

00:22:00   in HealthKit or whatever, I'm going to rewrite my whole audio engine to be AirPlay 2 compatible.

00:22:05   Sometimes it's hard to see past, like, 'cause in that moment, you are very excited about

00:22:09   that idea, and so you start, like, oh, man, wouldn't it be great, you're thinking of all

00:22:12   the positive things, wouldn't it be awesome if I rewrote this thing with this, you know,

00:22:17   if I did X, Y, or Z, that's this massive job, because then it'll be justified by having

00:22:22   benefits X, Y, Z, and it's hard at that time to see, like, is this going to be worth, like,

00:22:30   a six-month slog or something, like, some massive amount of time, you know, having a

00:22:34   period where there's going to be more bugs and it's going to be less stable and you're

00:22:37   going to have problems to deal with that you otherwise wouldn't have, and it's hard to,

00:22:45   in that period of, like, early project optimism, it's hard to really see and to make a good

00:22:50   judgment of, like, is this really ever worth doing or not, or is it worth doing now or

00:22:57   not, and one of the areas that I've been, like, toying with in my head for, ah, about

00:23:03   a year is I would, theoretically, I would love to redo the entire user data model in

00:23:11   Overcast to be where everything about your user data is stored in iCloud and that Overcast

00:23:19   servers know nothing about anybody and that all they're doing is, like, crawling the feeds

00:23:23   and sending push notifications, like, whenever, like, things are new, like, this feed is new,

00:23:29   go and it would, like, notify everybody, you should go check this feed because it's new

00:23:32   and you deal with your user stuff on your side, and this is a fantasy in part because

00:23:37   I don't want people's data as much as possible, like, I'm trying to get rid of people's data

00:23:41   if I can, and in part because it would make running the servers dramatically simpler and

00:23:46   not only way cheaper, but, like, way fewer problems and way fewer liabilities, like,

00:23:52   if I ever got hacked, there would be nothing really to see, if the, you know, if certain

00:23:57   servers go down, you know, it wouldn't be, it wouldn't impact the app that much if, you

00:24:02   know, if, you know, I could run a lot fewer servers, like, way, way fewer servers and

00:24:07   have, you know, a way simpler server-side code base, so, like, this is a wonderful fantasy.

00:24:13   The reality of it is that that would require rewriting massive portions of my app and then

00:24:21   I would, and massive portions of the backend that currently, like, achieve certain functionality

00:24:26   by having user data, I have to move that into the app into client-side logic and certain

00:24:31   functionality would just no longer be available because I don't have, I wouldn't have, like,

00:24:35   the, you know, combined user data on the server, so you wouldn't have things like recommendations

00:24:39   be very easy, and then, and then I would have all these, like, all this, like, new code

00:24:45   to write, all these bugs to fix, I'd have to deal with sync, which is really hard, and

00:24:50   I already have sync working, so it's like, once you have it working, don't touch it,

00:24:54   but you know, it's like, that's, that'd be really hard, and then I would have all this

00:24:58   lost time to get this in the system. Meanwhile, my users in reality would not care at all.

00:25:04   This would benefit most users, zero. Like, some people would care about the additional

00:25:10   privacy, but most people are very happy with the current level of privacy I offer, and

00:25:14   so it, like, most people wouldn't care. It would just be, like, a theoretical benefit

00:25:18   to me long-term, like, I, you know, my server-side would be much simpler and cheaper to run,

00:25:21   but like, the reality is, like, that would be a massive undertaking, and I'd have to

00:25:26   rewrite so much of the app in order to achieve a benefit that, if I think about it only,

00:25:33   like, optimistically, academically, it sounds great, but in practice, like, man, all that

00:25:38   bug potential, all that work, all that rewriting, sometimes these big, ambitious ideas aren't

00:25:44   worth doing, and I think that's one of those things that, like, it'll probably never be

00:25:48   worth doing that, because it's just such a massive undertaking for a benefit that most

00:25:53   of the users don't care about.

00:25:54   >>

00:26:01   Yeah, and I think it's so easy, and to jump to wanting to do it, because I think in the

00:26:03   moment, it is easy to see the, to see the benefit, especially the benefit for you, and

00:26:10   I think that is, like, of all the things that I'm kind of trying to take from this experience

00:26:15   for myself, and I think it would apply to what you're talking about, is the, like, the

00:26:19   blessing and the curse of being independent and not having, not being told what to do

00:26:25   means that we can do anything, which is great, in the sense that it gives us flexibility,

00:26:31   it gives us the opportunity to be creative, like, there's lots of really cool things that

00:26:35   go into that, but it also means that we can be our own worst enemy and be making changes

00:26:41   and doing work that is ultimately not in line with the broader context of our users, or

00:26:48   we can be solving the wrong problem or the wrong problem at the wrong level, because

00:26:53   it's, like, we only have our own perspective, and I think that's the thing that is probably

00:26:59   best for us to, like, the broader advice is just to try and keep a broader perspective

00:27:05   about any time we have to make a change in our application.

00:27:08   Who is this going to impact?

00:27:10   What are the benefits?

00:27:11   What are the benefits to me?

00:27:12   What are the benefits to our customers?

00:27:15   And try and ask more people about this situation, about the change.

00:27:20   Is it worthwhile?

00:27:21   Like, talk to people that you know who can give you good advice, whether that be your

00:27:25   users, whether it can be other developers, friends, but family, whatever it is.

00:27:29   But I think in this situation, like, I kind of wish that I had, like, in previous jobs

00:27:36   where I've worked, there likely would have been somebody who, as soon as I found my first,

00:27:42   like, solution that I thought, like, "Oh, it seems like this is the problem," it would

00:27:46   have been like, "Are you sure that's the only problem?

00:27:50   Could there be more problems?"

00:27:51   Right.

00:27:52   Like, and then if I'd spent just, like, whatever it was two months ago, if I'd spent one more

00:27:56   day or one more hour or had a slightly different testing regime to work out what the problem

00:28:02   was, like, rather than being stuck in my kind of, like, very focused, like, you know, sort

00:28:08   of, I had a very fixed sort of concept of what the problem was.

00:28:12   If I had a different perspective, if I had a broader mind, like, mind about what I was

00:28:16   trying to look for, like, rather than just being like, "Huh, in my current system, when

00:28:19   does the data go bad?"

00:28:20   Versus like, "What if I try a different approach to this problem?"

00:28:25   Like, having that broader perspective is probably good.

00:28:27   And in, like, in the case of what you're describing of, like, there could be these really cool

00:28:31   architectural benefits that would be so great for you.

00:28:34   But if they don't benefit our customers, or they don't make, or like, they're not really

00:28:40   moving the product forward, then they probably aren't worth doing.

00:28:44   Yeah.

00:28:45   And this can apply to lots of different areas.

00:28:46   I mean, one area that we probably should save for another episode is, like, you also might

00:28:51   have a similar kind of, you know, potential for change in your business model.

00:28:58   Yeah.

00:28:59   You know, like, that's, you know, we've been talking about code this whole time and, you

00:29:02   know, architectural considerations, but there's also, like, you could want to change your

00:29:05   entire business model up, and that comes with some of the same risks and thoughts and everything.

00:29:10   Obviously, you know, some stuff is different, but that's probably safe for a different episode.

00:29:13   Sure.

00:29:14   There's a whole lot of fear associated with that for sure, though.

00:29:16   Oh, yeah.

00:29:17   And that's with good reason.

00:29:18   Yeah.

00:29:19   We will get to that another time.

00:29:20   But today, we are out of time.

00:29:21   Thank you so much for listening, everybody, and we'll talk to you next week.

00:29:24   Thanks.

00:29:25   Bye.

00:29:26   And if you happen to work on the Core Motion team, bug number 46606259 could use some love.

00:29:31   (laughs)