cover of episode 292: You Can Always Come Back Later

292: You Can Always Come Back Later

2024/5/9
logo of podcast Under the Radar

Under the Radar

AI Chapters Transcript
Chapters
This episode discusses the decision to ship an app update with an incomplete feature, focusing on the offline map download functionality in Ponder Cost Plus. The core functionality works well, but the deletion mechanism was intentionally omitted due to complexity.
  • Intentionally shipped an incomplete feature (offline map deletion) in Ponder Cost Plus app update.
  • Prioritized core functionality over a less critical feature.
  • Recognized the potential for future improvement and refinement.

Shownotes Transcript

Translations:
中文

Welcome to under the red R A show, but independent I O S F development I mark arment.

David smith, under the radar is usually not longer than thirty minutes, so it's get started. So today I want to talk through some things that I recently sort of had to work through in a big update that I did to ponder cost plus. And specifically, IT was dealing with a feature that I intentionally, but i'm not sure if wisely, but I intentionally decided not to implement in the big update that I shipped at the end of last year.

And specifically, the that update had a lot to do with a the ability to download offline hiking maps before you go out for walks. So if you're going to area that isn't have great connectivity, you have the ability to download your map ahead of times that you can use IT, use the navigation and planning features inside a phenomena, plus even when you're you out summer else. Um but in building that feature, which has been very well received, i've been been very happy with way that the feature turned out.

Um when I built that, I only allowed you to download maps. I I provided no mechanism whatsoever to remove maps that you had downloaded um which is very strange in some ways that that was like what I ended up doing. But IT was one of these situations where I had a lot of chAllenges in coming up with a way to do downloaded maps that I think there's lots of issues that I think may have even talked about this and a cup you know show months ago.

But is the thing that is so tRicky about this problem like how that you're solving, like three different problems at the same time and very different use cases, are you you going out of for a hike that you know you're ggt na do a particular route? And so you went to download the maps around that route, and then how wide around that route, you trying to download the maps for a particular area just around you. The end solution, which I think works really well, that I have now, where I have this sort of semi zoned in map, but not too much, that you can choose books of blocks to which I find is very if works really well um or you can download the maps along the route um but IT works well because it's it's very user focused in terms of its very much about what what are you doing today? It's all central.

You know it's based on where you are physically and it's it's very much set up to the concept of i'm going to go in this hike. I know what i'm doing or I know vaguely where i'm going. I'm going to download IT, but the down on the deleting and sort of handling the delicious side of that, I turned out to be something I found really complicated because I think that mechanism that I have in there now works well on the download side, but doesn't really work very well on the delete side.

And I tried out when to approach hypes sebek last december when I was building this. I just couldn't up with something that I liked. And so I got to this point, and this is, I think, the topic that I actually want to talk about is this.

I decided, you know what, i'm going to ship this in complete, and i'm going to a make sure that the feature is actually well received, that people like you, that it's intuitive, because the way in which I would solve this problem now that I knew with the solution at this point, I knew that whatever the solution I had wanted and needed to sort of coordinate well with the actual the downloading part of this. And so if I end up changing that because I get lots of feedback at the super confusing or doesn't work well or i'm going down this road, that would be problematic or I be building something that would be incoming in congress there. Or I mean, there was a slightly I eve part of me that hoped that like inspiration would strike and I would just suddenly have this magically best, Better solution for IT.

But ultimately, I was just like, you know, this, I was getting stuck. I was getting to a place that IT was the last feature on my to do list, and I didn't know how to solve IT. And IT was one of those.

I could spend my wheel on this for weeks, or monster, who knows how long, or I could just punt and say, you know what, i'm not gna ship with this feature. And in the end, I think that was fine. And it's I think there's something interesting about this, of deciding whether a feature is miserable.

Like you you can just ship you know ship the APP with serve this incomplete feature um and you will be fine you know I think know they think like overcast. If you have the ability to download dcs but not to lead them, I don't think you could get away with that because fundamentally, like organizing your files is one of the core functionalities of that APP, whereas for this, it's like you download these maps. And the basically the downside is that there's some extra files hidden away that you can never see that are taking up bit of space on your iphone, which isn't great.

Like I had totally wish, did that know I wasn't able didn't have to have this consequence to a user if they download these massive sets of map that there's no way for them to get rid of them. But IT wasn't impacting the actual core functionality of the APP. I think that was the thing that was like it's fine as long as the core functionality of your APP is doable and you you can ship features that are on the insult of the sides of things that don't they aren't complete and that create these opportunities. And I think it's may be some as being honest with yourself that you are gonna go and fix that. I knew eventually I needed to solve well.

Did you? I mean, like how how much space are we talking?

So my largest mapping set, which is for the entire lake district of the in the in the U。 K, which is I don't know, it's like thousands were miles or something .

was about to two gigs of OK. That's because I was going to say, like with podcast, it's necessary because you can accumulate a large podcast collection on your phone and and that does take up non triggers ts to space. Where is like I feel a lot of a lot of tendency for us as nurse might be too overoptimistic ed for this and to provide you UI to delete things that are like, you know one hundred megs or something looks like is like logically a lot of space, but on a phone like you're never gonna tice that compared to like one APP update from uber or something like that. Um but the other thing I I wanted ask is like could you theoretically ally rely on IOS is perjured storage system for this?

So no um and specifically because I once you've downloaded a map I need from the users perspective, IT is um IT must be reliably there in the future.

Oh yeah of course that sense because .

if they're downloaded something and expect you to be there, then even if it's been a few weeks and they're had they downloaded a bunch of movies that took up space. And so the person ble thing you watchdog kicked off, I don't want you to go and download these files. So as far as the system is concerned, they are set up as though they are like user documents that are not delete able are absolutely you must stay there because in theory, like it's a safety concern, even that like someone is expecting a file to be there.

you could like take a picture on the top of a mountain and that kicks off the perch. You use your entire map.

yes. And like that, that would not be good. That would very much not be a desirable outcome. And so, yes, so like I had to do something, uh, to deal with that I could not rely on the system to be purging these files or managing them, which is if anything, in very in a lot of ways is something that you could reasonably do for a lot of cashes if you were viewing this more as a and viewing this more as a cash than as a user feature, because that was one of the big changes I made is previously in the version.

Before I did the offline mapping U I, I did cash the user maps there, but because I was making no guarantees to the user, in that case, IT was that kind of like purchase sort of cashing store that would could come and go at any point. Um and the user I was making no expectations with the user that what they were doing would have a persistence. And while I did persist for both of the time for many people, because unless you happen to download tremendous amounts of all about or like you have to physically visit all of these places, so you were like, I don't know, hiking for hours and hours every day, like using a through hike of the applause trail, maybe you could have accumulated gigs of of cash maps.

But for most people, just couldn't never have gotten to that, because you have to physically go to these places where, as now you have the ability to, in one button push, you could download areas, know hundreds of square miles of of mapping tiles. And so that was a very different problem at the once I reach that point. But I think it's one of these things.

So like it's okay to not ship something complete, which I think is weird um as something that I think very often we think about our designs is wanted to be complete. And I think the difference just when these things bouncing around my head, this as I should ship this update was this like it's that difference between a it's Better for something to be missing than to be sort of bad. I think generally that I what I didn't want was to ship a bad implementation of this.

And we can talk there is some of the actual things that eventually was able to do to this, but it's like I think IT was Better to wait and only ship something when I could actually be confident that I was good, that i'd found the solution, that I wasn't just trying to shoot horn some solution into this problem because I felt like I was know the apple wasn't complete without IT. It's like it's Better for you to be complete. And as far as I know, I think I had one report last like four months, five months that this up has been out there that people were like complaining that they couldn't download the maps.

And so like I was that was all the right choice that I missing. This feature was fine until I could be confident that I actually had the best solution. And I feel like this is mean, as one of these things, I feel like we often run into with way we talk about apple approaching.

Problems as they don't necessary tend to not ship sort of half baked solutions. They tend to wait until there I was fully baked. And once they are fully baked, then they release them rather than only it's like it's Better for to be missing and you know just not there than to shift the wrong thing and have to deal with that in the future going forward.

Yeah, that takes a certain level of of patients and a little bit of gust, I say, to be willing to do that. And and the thing is like you can do that badly and I can love in your face too. Like because in the reason that takes a bit of courage to ship to ship something that lacking in certain features or the thing complete is that you had to be really sure that's the right move because you're going to be judged by your customers and by reviewers.

If you're lucky to get reviews and stuff like that, you're going to be judged by what's there when you ship IT and like that, like those one star reviews or those press blog post or whatever could be there for months or years afterward as what people see when they search for your APP. So you have to really be sure that that whatever you are intentionally omitted or is not that important and is not like that, that not that many users are gonna looking forward, expected IT to be there. And so I think in your case, I think you did find that baLance and your feedback shows that.

But certainly, this is not like a blanket lesson that like, oh, just ship, but I have your stuff and it'll be fine later. Like, well, think about IT first. Like be a little careful about what what you are meeting before you before you make that leap. And and I think something like this where it's like i'm accommodating an edg case. Um I think that is A A good area where usually a safe move or similarly.

I think there's an element of waiting until it's like this problem would get worse over time as people downloaded more maps. And so IT isn't a problem. The first week I ship the APP, it's a problem months later when they have lots and lots of maps. And so IT becomes this in some ways you can have been there are sometimes also benefits where you can omit a feature that you know won't be a problem until later. As long as you're discipline to actually getting a shift before IT becomes the problem, you can potentially also do that as well.

Yeah or could be kind of like technical detail like if if I built to search index with every episode you ever viewed an overcast and I just never deleted anything that search index, that wouldn't be a problem. No IT would be couple hundred maggs for a decent service public election for a little while. But then after like after ten years, that could be a few gigs.

And so like you'd have to have some mechanism eventually, but you can get away with that for a little while. And to be fine, we brought you this episode by, indeed, we're driven by the search for Better. But when IT comes to hiring, the best way to search for a candidate isn't a search at all.

Don't search match with. Indeed, if you need to hire, you need indeed, indeed is your matching and hiring platform. Over three hundred and fifty million global monthly visitors according to indeed data in matching engine that helps you find quality candidates fast. So ditch the busy work use indeed for scheduling, screening and messaging. You can connect with candidates faster and indeed doesn't just tell you higher, faster.

Ninety three percent of employers agree indeed delivers the highest quality matches compared to other job sites, according to a recent survey, by indeed leveraging over one hundred and forty million qualifications in preferences every day, indeed matching engineers constantly learning from your preferences. So the more you use indeed, the Better IT gets for you. Join more than three point five million businesses worldwide that use indeed to hire great talent, fast. Listen to the shower, seventy five dollar sponsor job credit, get your jobs. More of visibility at indeed dot com slash under the radar just go to I D E E D dot hum slashed under the radar right now and support our show by saying you heard about indeed on this podcast, indeed 点 com slash under the radar terms and conditions apply, need, the higher you need indeed are things to indeed your support of this show and really fm.

so the actual solution I came up with, which is probably the next thing is worth talking into, I think is interesting as well. And so far as the reason I was stuck and the reason I felt like I needed to postponed this feature, or admitted from the start, is because of this week, sort of theism was a step in the middle that, like, you is like, I had, I had the problem. I sort of knew where I wanted the solution to be.

But in the middle there was a step that was like, would just like in my note just written, like, you know, do the magic. Like, do the like. There is this thing of what I would do that because ultimately, what I want is to be able to present the user with A A clear list of the areas that they ve downloaded that is offline.

But they've been downloading maps, kind of egoi piggy, however they want whenever they were moving around. There are all kinds of different mechanisms by which they can download them. And so I didn't want this to be this issue, that this is something that reason I was going down this road is I get very frustrated with other apps like see you, even apple maps of google maps. One of those when you have offline maps as you go to a similar place multiple times and you end up with these like weird overlapping rectangles of this trip, I went to this place since I downloaded over here, and then this one over there, and you end up with these multiple map sets that sometimes overset overlap s sometimes don't ever lap.

And if you delete one, will you delete the other map set, even if IT overlaps or intersex like you ended with these really awkward questions that I just didn't like that kind of you, but I wanted the conceptual sort of version of, do I want I want to download the maps or delete the maps that i've downloaded for this particular place and do the magic parties is like coming up with that list of places that you have maps for because they aren't specifically the user is not choosing the as I need to do the magi C2Come up wit h the m um and so tha t was the end. The end was like the reason I put you know push office because I didn't know how to do the magic or I didn't wasn't sure what the magic would look like. And in but in the end, I think I was actually able to get there.

And I functionally, what I do at a technical level now is I look through your offline mapping tile sets and run an algorithm that of cleverly groups them together into what seemed to be related places and geographically, and into clusters that you can then look at and delete. So if you going to a trip in one of you into the assessment ley, in your first time, you only stayed down in the valley, but then the next trip you went in, climbed. And so now you have this extra sort of set of maps that extend out from your first set.

This will become a single set and that becomes your semey set. Or, you know, but if you only visited the place once, or you did have only export a very small area, he will just group that together and say that that's a particular set. And like, that was the end, the magical step at him.

But that I think that was transformed, even making the entire networks, where I can give you that kind of group, you, I easy to delete, easy to manage, you make IT very easy to just, you know, say out, well, no, I don't want these maps to me. You something, i'm not gonna there anymore. You just hit delete to clear them all out rather than you having to manage all the multiple trips you may have gone.

There are the different places. It's sort of the slightly smarter grouping mechanism. And once I was able to do that, like working out to technically how to do that magic, then I had, I had the U.

I, I wanted I could do that. I could do IT in a very performance way. I could like there was all these things that were the hard part that um I just needed that data. And I think so often IT was also the serve the confirmation that the version of the motive was very well received.

And so I was confident that I needed a solution that didn't require the user to choose a name and manage the areas themselves because that was the thing that I was trying to stay away from. And IT seemed like IT worked and IT seemed like it's really been very well received because I see if it's if the end solution was that I needed to end up doing what apple maps and google maps do where you build these like named areas and you've all these overlapping rectangles. And if I had to go down that road, because that's what use is ultimately really wanted and demanded.

And like the deleting problems super easy in some ways, you just like delete the thing that the user tells you to delete. Um but in my case, that wasn't the case. And as once that was confirmed by user experience, then I just needed to do the work to build an algorithm to solve the U. I. Problem that I was facing.

Yeah and the U I that you came up with, like I think what what's great about, like the the mechanic that you found an important here is that when you see IT IT looks totally obvious that of course that's how this should be done. And that's like one of the great things about about good design is that that's like the result of good design, always seems so obvious that no one quite appreciate the iteration and thought that when I do IT because what you arrive at like, oh, of course this is this is easy of like this makes social sense. This is the only way I could possibly be done IT is that obvious but IT might have taken you quite a lot of iteration and time to get there.

Um but yeah like and I like I like how you you really are focusing on getting things working and getting things shipped and getting things out there, even if IT is not the most like technically ideal solution at that moment because that's what indeed have to do a lot of time. That's what all companies to do, honest, sly. But you know like that that so often holds us back like we might optimize a premature reformist ation is the root of all delayed.

Um we we we often try to optimize for things that for technical purity or elegance. At levels if IT doesn't matter. And it's not to say that there are no levels that IT does matter. Like you know, one of the major things i'm i'm working on with the overcast three right is performance.

When you have very large podcast collections, the existing overcast activate out there for ten years is really not very performance at all in certain areas once you have if you have like a few hundred podcast that you've ever listen to or describe to um and that's something that like when I was first making the APP and designing all the data structures and the concurrency model, everything I was first doing all that ten years ago, i'd never considered somebody might have two hundred podcast descriptions. I was like that I was think you maybe you have twenty for ten or five. You not a lot of people had hundreds of pot testing services in twenty fourteen.

Um but now many people actually have accumulated that money. And so now the APP is very, very slow. And so now I I know which areas I had to optimize um and that's what i'm doing the right right. Um but there's other areas of the APP where like if I optimize something like crazy for something like the display of a setting screen, nobody will ever care. No one will will ever notice.

IT is not a good use of my time and again and again going back to earlier, even the areas like, for instance, if you are slow with large collections, even that I really didn't need to do that for the first six or seven years of overcast, really like that, something that I I was able to ship, something that was not as in complete, but also not ideal for large collections management. And IT did work fine and continues to work fine for many people. But IT IT took until many years in, before I had any any non trivial number of customers who actually had large collections.

And and so where that would actually matter. So IT was fine for you to ship IT in a simpler er way with dummer slower algorithms and simpler er models inside the APP. That was fine ten years ago.

And now I can fix IT now and I can improve IT now with the area. But I didn't really need to do all that had up front, back. I mean, I wish I had, and certainly, but I couldn't have known that then. And then I was focused on let's get this APP out there.

And and I wrote the entire initial happened something like a year um and now like the idea I get more on the area and after so long, way longer than a year so now the idea of that is kind of kind of my loving but be like I did learn back then I learned now looking back at at what I did like that was the right move back then to ship what I had back then with what I knew back then, even though he was in completing some ways, there were many slow, get slow, simple algorithms for certain things. But IT works. And there there are so many opportunities for like micro optimization that we have today that once you actually run them on a device, you realized this does not matter at all.

So you know for instance, like if you need to uh you know keep keep like you know an array versus a set and you want to see like art, I want to see if I if this element IT already exists in the collection, that's way faster. In most cases, if you use a sentence that of an array. But unless you're dealing with large collections very frequently in some kind of tight loop in your APP, you probably won't notice that difference. And so if there are some other big advantage to that thing being in array and set of a set when you to test membership here and there, it's probably gonna fine like you. And so and there are so many instant where we can get lost in the weeds with algorithm purity and algorithmic uh ideology almost really um for things that really don't matter very much um well, maybe not having enough time as a result to address the things that really too matter like angling large collections .

yeah and I think there is something is going to the so many times when I was doing my like magic bit in the middle where my computer like I did, did you have a Better degree in computer science and so like i'm trained for what I do, which I know not everyone who's a developer if has that background where they actually worth of trained in the sort of the theory of computer programing and algorithms and those kinds of things. And sometimes I feel like that background comes back to bite me, because I haven't the back of my mind that there I think about the old, like the big, big o notation.

And this is and square. I cannot possibly .

ship this exactly. And that was, this is exact thought that I had with my my first night solution to my like a grouping algorithm for working out, know where are the areas you have, offline maps. And the first version I came up with IT, was this very naive, like just compare the various points to sound like it's not quite every can pointed to every other point, but it's not that much far from that.

It's a slide clever version of that. But it's like rather than having this very like, I started in me investigating these all these allegorist. Ms, you can do with this new convex whole creation out things that works.

How does IT work when the groups are combining? And he got very complicated very quickly. And I like, oh like, I only sort of understand this allegorist m that i'm reading about.

And if I only sort of understand IT, the chances of me implementing IT successfully incorrectly go down dramatically. So let's just start off by let's the throw away the complexity and just do the super simple basic thing. And I have a very large offline map down database with just thousands and thousands of square miles of mapped tiles.

Let's see half as to is to run. And I build that very straight forward simple version that doesn't this kind of simple grouping. And then the group's camping, if you know a point, exist in multiple groups in very straight forward, like the whole thing is maybe like forty lines of swift, like very easy to understand, like straight forward algorithm.

And I take IT and I run IT on an iphone ten r with my full database and the whole thing took, like he was point two seconds to run and is not all right. That is that is good enough? Yes, that is.

And it's any special because it's not an Operation that the user is doing very often, if at all. And that's on the oldest phone, essentially, that I support. You have run on my own, on my iphone, whatever I have, fourteen, fifteen, whatever the most recent iphone is like so many.

we've lost .

track IT is like, I know on that. It's different point two seconds like, point o two seconds like it's essentially instantaneous. It's like, oh, right, that this algorithm totally fine. I don't need to make this more out, more computationally, pure and elegant and fancy. This version is fine and that's amazing and that's not to say that you should never do the fancy algorithm like I have you in my mapping engine.

I think that actually is rendering um the map to the user, which is shown on the apple watch, is shown on the iphone, showed in life activities like there's all these places that this mapping engine is used. I do a lot of the really tRicky, complicated algorithm work because that's being updated like a once person. Second in potentially on devices where battery life is really important.

And so like I need that code to be super clevers, to be super optimized to rather any kind of waste or inefficiency. I want to get out of IT as much as I can so that it's superfast and important. great. Do IT there.

But I was interesting this time when I started going down this, like, you know, I tend to do this thing where i'm starting to read, not like a sort of articles or wikipedia post, for things about different algorithms and trying to decide which one makes the most sense. And in the end, as I know, don't like just do this simple, obvious basic thing that you know what I can understand and then seems to work great and start there. And if that somehow that hadn't works, if i'd run that are my massive offline database and I did, you know taken ten seconds to one, it's like, okay, well, that's not going to work.

I'm going to need to do something faster or Better or I need you know more magic or a different kind of magic in the middle. Um but I was definite learning experience for me. It's like just I shouldn't lean too heavily into those these courses I took whatever was like twenty five years ago, my college, they were telling me, oh know if you any time you have an insane algorithm is bad. It's I know it's probably fine. Like and even for reasonably large version.

IT depends on what end is.

but IT depends on how like even that like I maybe i'm doing ten thousand comparisons or hundred thousand comparisons. Maybe there's is what i'm doing like because this could be a relatively big number or million comparisons, I don't even know, but the the chips that my my APP is running on can do a million comparisons in a fraction of a second.

And so it's just not a problem that you need to solve necessarily unless it's an Operation that is happening lots and lots of times. I wouldn't anted to be inefficient every second for twelve hours of a hike that would be foolish. But if you're going to do be slightly inefficient for two tens of a second um once every couple of weeks, that's probably fine. And that helps get the APP of the door IT helps like me finish off this feature that i've been learning lingering around before. And I mean, I can move on until other features and me focusing on things like the why of the future, which is way more important in many ways than the the groth maturity of the way that I know creating the data and rest .

sure to every single other APP on your customers phones is gonna burning all that like, you know, wasted ban. But it's going to be burning that every things time they open the p just like focusing bit like reporting back to their analytics servers and running their own like incredibly heavy weight everything Operations that they're doing to track every single possible thing you're doing and to serve you ads.

Like what you're doing is a drop in the bucket. I find like it's helpful for me to to actually like you load up. I I have a couple of overcast test accounts that I can log into that have hundreds of thousands of podcast episodes like huge collections that like for the most part, I don't think any any user would actually have a collection in that big.

And I can load IT up in the old code where is just basically freezes and crashes. And I can load IT up in the new code where it's a little heavy but IT works. And i'm like, okay, now like now i've tried the extreme, like that's something tried the extreme with something that you think is going to be too slow.

And if the extreme case is usable, you're probably okay, especially when you then go back to the communication and IT takes your point two second. S like it's fine, you're gna be fine um the the theme of the episodes like get get IT to work, it's probably fine and move on. You can always come back later.

yes. And I think having that freedom to come back later is absolutely in the key thing to being able to shift things in the first place.

Thank you, everybody, for listening and will talk to you in two weeks.

bme.