00:00:05 ◼ ► And I'm David Smith. Under the Radar is never longer than 30 minutes, so let's get started.
00:00:20 ◼ ► I have finally begun chipping away at the redesign, which is probably going to take me a year.
00:00:27 ◼ ► You know, the longest journey starts with the first step, and you have taken that first step.
00:00:31 ◼ ► Yeah. Yeah, so this has been a long time coming, and you've been hearing me talk for years about how, you know,
00:00:42 ◼ ► at some point I'm going to tackle this redesign of Overcast and really modernize the design.
00:00:47 ◼ ► And, you know, I had this whole image in mind of, like, you know, things being much more rounded, pulling away from the edges,
00:00:58 ◼ ► You know, right now a lot of Overcast design still has a lot of that, you know, iOS 7 style aesthetic of, like,
00:01:04 ◼ ► everything goes edge to edge, everything is square, the borders go all the way across, stuff like that.
00:01:15 ◼ ► And along with the redesign, this is where, you know, there are many conditions where if I was making a brand new app today,
00:01:24 ◼ ► starting from scratch, I would of course do things differently than how I did things in 2014 or 2013.
00:01:33 ◼ ► Okay, so, you know, there's a lot of stuff I would do differently now if I was starting from scratch.
00:01:39 ◼ ► You know, I would obviously be using Swift 100%, whereas Overcast started out 100% Objective-C because it predates Swift.
00:01:46 ◼ ► And so it, you know, it was, it's still in transition, you know, most of the new code I'm writing is Swift,
00:01:54 ◼ ► but not all of it because sometimes I have to be interfacing with such Objective-C crap that it makes a lot more sense to just do it in Objective-C.
00:02:06 ◼ ► Also, in those intervening years, we've gotten SwiftUI, which is, again, a whole new way to do things,
00:02:14 ◼ ► and Overcast currently uses almost no SwiftUI in the main app, although the watch app, of course, is SwiftUI now, which was a huge benefit.
00:02:21 ◼ ► And then, also in the intervening years, we've had huge advances in iOS, and of course there's also cross-platform, you know, requirements or considerations now.
00:02:34 ◼ ► You know, there wasn't, you know, Catalyst didn't exist back then, there was no iOS apps running on Mac kind of thing,
00:02:42 ◼ ► so we've had massive changes in the years since I started writing this app, but it's such a big app that it's hard to just switch it all over at once.
00:02:51 ◼ ► And so I've been planning this redesign in my head, and part of the reason why it has taken me so long to even start the redesign efforts
00:03:07 ◼ ► Like, what I was considering a redesign, I think what it was becoming in my head was a UI rewrite.
00:03:15 ◼ ► And a rewrite is a very different thing than a redesign. And the scope of that is just infinite.
00:03:22 ◼ ► Like, first of all, there's never a great time to start a rewrite, because you always want to base it on the latest stuff if you can,
00:03:30 ◼ ► and the latest stuff is always changing. So for instance, right now, if I wanted to do a giant rewrite, it would be pretty obvious,
00:03:38 ◼ ► like, I should probably do it in Swift UI, or at least mostly in Swift UI, but two years ago or three years ago, that was not necessarily a given.
00:03:47 ◼ ► Swift UI was very bleeding edge at those times, and it would have been a little bit tricky.
00:03:52 ◼ ► I mean, even today, it would be a little tricky to use Swift UI for an iOS app of non-trivial complexity.
00:03:57 ◼ ► We see stories of developers who try it, and sometimes it works, and a lot of times it doesn't.
00:04:03 ◼ ► And even Apple is struggling with how to use Swift UI well in larger apps, so that might be not a given yet.
00:04:12 ◼ ► But certainly, five years ago, it would have been questionable to rewrite your whole app in Swift at all.
00:04:18 ◼ ► It's just Swift, the language. But today, that's more of a given. So, great. That's kind of a win.
00:04:24 ◼ ► But certain things, depending on what time you're looking at something, it could be too early for that thing,
00:04:30 ◼ ► or it could be about to be replaced by something else, or it might have just been replaced by something else,
00:04:35 ◼ ► but you can only use it if you require the newest OS, and maybe you should wait a year or two before you do that.
00:04:40 ◼ ► And so, there's always all these considerations that make it really hard to ever get started.
00:04:45 ◼ ► And so, part of the reason why I hadn't started until recently is that I kept spinning my wheels on what a redesign should even be,
00:04:57 ◼ ► and how big it should be. And then, the second part is that because so many of these massive changes in how apps are written,
00:05:06 ◼ ► and how UIs are written specifically, all those changes have happened, because of all that, during this time,
00:05:12 ◼ ► Overcast has fallen further and further behind on the technical/API levels, as well as the visual design level.
00:05:21 ◼ ► And so, I had to keep spinning and spinning, just trying to keep the app modernized, trying to move it away from deprecated old APIs,
00:05:31 ◼ ► trying to move it away from a lot of weird UI kit hacks that I was using to achieve certain effects.
00:05:36 ◼ ► And the scope of this redesign kept growing and growing in my head, thinking, "Well, if I'm going to rewrite it from scratch, I'm obviously going to use all Swift.
00:05:44 ◼ ► I'm obviously going to use combined/Swift UI mechanics. Obviously, I'm going to redesign the whole thing to be more modern,
00:05:52 ◼ ► and maybe do it in a way that could be flexible across the platform, so I could have just one UI code base,
00:06:06 ◼ ► So, it just kept growing and growing and growing in scope, and so I never started it, because it was such a daunting prospect to rewrite the whole app,
00:06:20 ◼ ► Yeah, and I feel like there's two things that you're describing, and I feel this more on one than the other.
00:06:28 ◼ ► There's the redesign part of this, which is the visual, what the customer interacts and sees part of it.
00:06:36 ◼ ► And then there's the rewriting or the recoding or re-architecting part that is much more what the engineer sees and focuses on.
00:06:48 ◼ ► And those two things are very related, but they're very different. You can do one without the other, you could do both together, but they're very separate concepts.
00:07:00 ◼ ► And I feel like the redesign is something that in some ways is easier to pick up, insofar as it's not strictly tied to any of these complexities
00:07:12 ◼ ► and the growing tech debt and all the aspects that you're talking about that can make it so intimidating to start.
00:07:20 ◼ ► The redesign you can do, and also you can do is the kind of thing that you can do incrementally, rather than necessarily having to do it the whole way or from the ground up.
00:07:30 ◼ ► But as soon as you start trying to modernize or increase the, sort of adopting new APIs or making the app more modern in any way,
00:07:41 ◼ ► you suddenly hit all these walls where it's like, if I make this change, it becomes very hard to go back, it becomes very hard to make sure that it's going to work.
00:07:51 ◼ ► You have all the difficulty of you're doing this while people have an existing user base who has existing expectations, who I don't expect would be particularly happy about if there were regressions or issues or problems that come up.
00:08:06 ◼ ► So there is really never a good time to do that because the benefit is, you're making a benefit to yourself ostensibly far into the future by taking on pain and discomfort right now.
00:08:20 ◼ ► So I very rarely have undertaken this. Some of my apps are, if I was writing them now, I would write them very differently, I would structure them very differently, I would use different technologies.
00:08:34 ◼ ► But instead, I'm just like limping along, updating things as I go, doing my best to keep things working.
00:08:42 ◼ ► And really, it's only if I hit a wall where there's some new thing, like whatever, when I was 15, I was 16, I was 17, there's some feature that gets deprecated completely or goes away completely or something doesn't work, like you were running into your issues with navbars in this last update.
00:09:00 ◼ ► And those are the things that tend to force the issue. But in terms of choosing to do it, in terms of choosing to start doing a redesign or start doing a rewrite, it is like there's never a good time.
00:09:13 ◼ ► And unfortunately, that of course, that does mean that eventually, you're falling farther and farther behind. And so I suppose unless you are constantly rewriting as you go, which isn't probably a good idea either, like there is no good answer to this.
00:09:25 ◼ ► It's just, this is the reality of software development that especially the early stages of an app when it is young and has a very small user base or only a beta user base, you can be more wild with your implementations or change things or if a new thing comes out, it's like, "Oh, wow, that's really cool. Let me adopt that."
00:09:49 ◼ ► But at a certain point, it's like the inertia just gets too large and it never really makes sense to do. And so you either have to do it piecemeal or just sort of accept this is going to be a long detail-oriented slog to make sure that you're not making a horrible mistake in the process of doing this.
00:10:09 ◼ ► Yeah, because you're right that the best time to do it is never, or the best time to start doing it is never, but you also at some point have to do it. Because there's never a good time to start, but you also have to get it done sometime.
00:10:28 ◼ ► So it's one of those things that takes a lot, it takes kind of a leap of faith and kind of some foresight and a lot of self-discipline to properly balance when and to what degree you do this.
00:10:40 ◼ ► But all this time, I kept thinking about it as this grand rewrite of most of my UI. And I think what you said a minute ago is wise, and that's kind of where I'm going now, is I've decided and just started working on just doing it piecemeal.
00:10:58 ◼ ► There's never going to be some big grand release where the design drops all at once and everyone's blown away. What I'm doing is I have multiple different ideas for multiple different screens and parts of the app and how I'm going to do certain things.
00:11:11 ◼ ► And I'm tackling them one by one. And so for a while, the design is going to be just slowly evolving. And some parts of it will be a little bit bigger, like I want to kind of restructure the now playing screen.
00:11:22 ◼ ► So that's going to have to drop all at once. But for the most part, the design is going to be gradual over time.
00:11:30 ◼ ► And I've also decided that it's not going to be massively different from what I have now. It's just going to be updated as opposed to totally reimagined.
00:11:41 ◼ ► Because what I have now is mostly fine. Also, it's a podcast app, which means two things. Number one, people aren't staring at the UI the whole time they're using it. And number two, it's a utility app that people who use it tend to use very frequently and tend to be very attached to the way they already use it.
00:12:01 ◼ ► And nobody wants a tool they use all the time every day to radically change in ways they don't care about or that might confuse them or that might make things worse for the specific way they use the app.
00:12:15 ◼ ► Nobody wants their tools to change from under them. So I have to be fairly conservative with some of the things that I do.
00:12:23 ◼ ► But basically all this is to say I finally started the redesign and I've decided to do it incrementally and critically. A lot of the redesign work I've done so far, which I'm doing things like modernizing the appearance of some of the list screens so far,
00:12:38 ◼ ► but a lot of the work I've done so far is not going to involve even a rewrite of its view controller.
00:12:45 ◼ ► Some of them I am rewriting, but some of them I'm not. And a lot of this work I'm just doing in Objective-C. I'm not rewriting the whole view controller in Swift.
00:12:55 ◼ ► I'm not rewriting, because then too, rewriting things in Swift also brings other issues. Like if I want to access certain things in Swift, it's easier if I modernize the layers that are below them and rewrite those in Swift.
00:13:09 ◼ ► There's this massive data model layer in Overcast that is all Objective-C. And I've put a couple of Swift shims on top of it to do certain things, but most of that stuff is going to stay Objective-C.
00:13:21 ◼ ► It makes no sense and would bring no benefit to me or my customers to rewrite the entire app in Swift.
00:13:28 ◼ ► So those low-level stuff, that's going to remain Objective-C until it makes sense to rewrite it for other reasons. And then maybe I'd rewrite it in Swift.
00:13:36 ◼ ► Most of that stuff is going to stay Objective-C, so I have to also balance the needs of interfacing with that and everything.
00:13:42 ◼ ► Anyway, I'm doing it incrementally, I have finally started, and it feels great. And I'll tell you exactly what I've done in a minute.
00:13:54 ◼ ► The Best in Class iOS App Book Series is here to help you take your apps from good to great.
00:13:59 ◼ ► It's written by indie developer Jordan Morgan, and he's covering all he knows about what he believes are the four most critical topics to develop quality software in iOS.
00:14:12 ◼ ► So the accessibility section is great. You learn how to make sure your apps are designed for everyone.
00:14:16 ◼ ► Master the basics and then deep dive into APIs like the rotor control or how to best support voiceover.
00:14:22 ◼ ► And design. Every successful app eventually wins with design, speaking of which, but it looks different for each app.
00:14:28 ◼ ► Here, you'll figure out how to find your app's voice and use it to make it look and feel right at home on the iOS platform.
00:14:43 ◼ ► And finally, the last section in the series is an exhaustive look at all the major iOS frameworks and APIs.
00:14:49 ◼ ► You can learn about things like WidgetKit, that sounds familiar, or how to leverage the Siri APIs to make sure your app is tightly integrated across the system.
00:14:56 ◼ ► So I've seen this book series so far. It's coming out. It's in early access and new content updates come out every two weeks.
00:15:03 ◼ ► The accessibility book is up first. It already has over 100 pages of content, over 30 code samples with both UIKit and SwiftUI.
00:15:10 ◼ ► And this is really great so far. It's looking great and I strongly suggest that you check it out.
00:15:23 ◼ ► You can get all the books in the series as they come out, a comprehensive Xcode project with all the code samples,
00:15:28 ◼ ► access to a private Discord server with the author and other developers, a bonus section just for early access buyers, and free updates for all the books.
00:15:41 ◼ ► Whether you're an experienced developer who wants a reference guide, or you need to brush up on design, or are just new to the world of iOS, this book series has you covered.
00:16:09 ◼ ► That like doing it incrementally, doing it in a way that preserves as much of the existing sort of battle-tested code that exists in the app as possible.
00:16:18 ◼ ► That you're rewriting things when it is sort of essential or makes sense or really makes that process much more straightforward.
00:16:26 ◼ ► But otherwise, leave as few things touched as possible, but allow yourself to evolve it.
00:16:32 ◼ ► I think it makes a lot of sense. I mean, it made me think when you were describing it, it makes me think of the way that Xcode has evolved over the years.
00:16:41 ◼ ► Where I feel like every year at W2DC there are some improvements that happen or changes that happen to the UI, to the way it's structured, to the way it looks.
00:16:50 ◼ ► But in general, I would say the Xcode team has done a great job of making them kind of these incremental changes.
00:16:58 ◼ ► That if you look back over several releases are substantial, meaningful, and kind of become more profound.
00:17:06 ◼ ► But from each release to the next, their changes are much more minor and easy to adapt to.
00:17:11 ◼ ► And you kind of have this stepping stone process where it doesn't hit you all at once and mean that you don't know how to use things.
00:17:23 ◼ ► So it seems like it's sort of a great way to do this that just is very pragmatic and good and wise as a result.
00:17:31 ◼ ► Well, and I thank you for that. But also, if I did it any other way, I would never do it.
00:17:38 ◼ ► If I actually tried to tackle the full UI rewrite that I've been envisioning for years, I would just keep envisioning it for more years.
00:17:46 ◼ ► I would never actually do it. Because that's the kind of thing that even big companies with big staffs have trouble tackling that.
00:17:54 ◼ ► That's never a good idea to do. So yeah, in this case, this is how I can do it and this is how I should do it.
00:18:05 ◼ ► The first things I did were I disabled my custom font. So sorry everybody who still loved it.
00:18:13 ◼ ► Custom font is gone because it's very hard to do a redesign and test two different fonts with all these different conditions.
00:18:22 ◼ ► And have to tell all the frameworks every single time I'm using them, use this font, use this font, tweak this font this way.
00:18:28 ◼ ► The system font has made a lot of progress in the last seven years. Or eight, whatever it's been. Nine? How old has it been?
00:18:38 ◼ ► San Francisco, I think, came out in that intervening time. I think when I first wrote Overcast it was against iOS 7 and therefore it would have been Helvetica as a system font.
00:18:52 ◼ ► And there's all these different variations it has now, all these different styles you can make it, deep support in the system for it.
00:18:59 ◼ ► And deviating from the San Francisco font is getting to be decreasingly useful and increasingly a pain in the butt.
00:19:08 ◼ ► Especially in the world of Swift UI, it's just so easy to just rely on the system fonts instead of having your own custom stuff.
00:19:15 ◼ ► And I can tweak the system font a little bit here and there to give it the personality and the behaviors and the metrics that I want.
00:19:22 ◼ ► While still also retaining its massive support in things like world alphabets, where my previous custom font had some of the world's alphabets but not many of them.
00:19:43 ◼ ► The era of custom fonts being the norm, I think is coming to an end and is largely iPhone specific.
00:19:52 ◼ ► I think once you go past the iPhone, certainly to the Mac, but even if you look at the watch and the iPad even, I would say custom fonts are looking like a dated thing in those environments.
00:20:03 ◼ ► Like on the Mac, they were never that big of a thing for apps. On the watch, I think they shouldn't have been and they mostly weren't.
00:20:10 ◼ ► And even on the iPad, which is getting more and more Mac-like, I think a big custom font on the iPad kind of looks weird.
00:20:18 ◼ ► So I dropped my custom font. I think it's time for me to do that and it's time for many apps to consider doing that.
00:20:24 ◼ ► Also, I'm using SF Symbols a lot. In part, this is because I'm an okay icon designer, but Apple has way better icon designers.
00:20:35 ◼ ► And my icons kind of look a little developer-y in certain points in the app. And Apple's icons are pretty good.
00:20:44 ◼ ► And I used them extensively for the new watch app when I rewrote that. And so I'm using them in the main app now.
00:20:50 ◼ ► I'm not using SF Symbols exclusively. There are still some icons I'm drawing myself. But I'm using them a lot.
00:20:56 ◼ ► I'm using them in most places and it is largely fine. And this brings a lot of benefits.
00:21:02 ◼ ► So number one, it's just easier and faster and makes the app smaller. These are just assets that I don't have to manage anymore.
00:21:09 ◼ ► And it also unifies the look with other system apps. So there's a little bit of familiarity there and it makes the app look polished, I think.
00:21:16 ◼ ► When your icons look really nice and when they match the system's styles. That's usually a good thing.
00:21:22 ◼ ► So again, this is an area where a lot of customization in the past was either necessary or stylish.
00:21:29 ◼ ► And I think less icon customization over time is necessary. Because the system stuff is just getting really good.
00:21:35 ◼ ► And it's spreading across multiple platforms and just becoming more expected by customers.
00:21:45 ◼ ► And finally, I've come to, and I mentioned earlier, doing things like rounding the artwork and pulling it in from the margins and list screens and stuff like that.
00:21:54 ◼ ► But I started finally the other day looking at the new list configuration, list style configuration stuff.
00:22:03 ◼ ► Like, that they introduced I think in iOS 13. But they're going to, I think in iOS 15 they officially deprecated a lot of the old methods of accessing like UI table view cell, detailed text labels, and you know, title text label and stuff like that.
00:22:25 ◼ ► So, as I think, you know, most apps written before recent years of iOS would have used tons of that stuff.
00:22:33 ◼ ► Because most apps contain a lot of table views. And that's, that's most of Overcast is table views.
00:22:41 ◼ ► So, I have a lot of that to modernize. And so I've finally started diving into those WBC sessions over the last week, from the last couple of years of WBCs and looking at, you know, the modern list configurations, modern collection view stuff.
00:22:55 ◼ ► You know, collection views now seem to be able to replicate much, if not most, of the behaviors of table views.
00:23:03 ◼ ► But then you get some of the benefits of them being collection views and some more of the flexibility and everything else.
00:23:08 ◼ ► So, I'm finally diving into that and that, oh, and diffable data sources too. That's a whole thing.
00:23:15 ◼ ► Again, having your models be Objective C makes that a little bit clumsy at times, but, you know, shimming it here and there where necessary.
00:23:23 ◼ ► But, diffable data sources, that's another thing where, you know, I have so much code to do this manually, basically.
00:23:31 ◼ ► And my code is both complex and also not perfect. And Apple's code, while it might be complex, it's, you know, shoved under the surface and it becomes their problem, not mine.
00:23:42 ◼ ► And it's better written to begin with because it's better tested against more cases and more environments and by more people and more devices.
00:23:53 ◼ ► So, I'm leaning into that. And this stuff is massive. Like, the code samples are so big.
00:24:02 ◼ ► I'm using a lot of that, like, that modern collection view Xcode sample that they have that is just filled with collection view templates.
00:24:15 ◼ ► Like, I had started doing all this diffable data source and modern collection view stuff because I'm trying to use that for my root screen in the app, the one that lists your playlists and podcasts.
00:24:24 ◼ ► Because I'm making some changes there. It would be a lot easier if it was a collection view.
00:24:28 ◼ ► And it's a relatively, like, the cells in that are relatively simple compared to episode lists.
00:24:34 ◼ ► So, I figured that was a good place to start. And I just hit this low point of, like, when you're learning a new API or a new language or whatever.
00:24:43 ◼ ► And all you see ahead of you is massive amounts of complexity and there's no end in sight.
00:24:50 ◼ ► And you haven't really gotten anywhere with it yet. And, like, you know that valley of doubt that you get into, like, when you're in that point?
00:25:01 ◼ ► And it's just the prospect of going from where I am with, you know, UI table view delicate and Objective-C stuff,
00:25:14 ◼ ► It is daunting. And there is so much code and there's so much, kind of, you know, to use an old JOLN software term,
00:25:22 ◼ ► so much architecture astronautism going on. Like, so many classes on top of classes on top of providers and factories.
00:25:28 ◼ ► And it's just, oh, somebody read the Gang of Four book a lot when they designed these APIs.
00:25:34 ◼ ► It is cumbersome to get started. But over the last couple of days I have, you know, slowly gotten things working.
00:25:50 ◼ ► And I'm going to just start chipping some of this stuff. You know, I'm not going to wait until this is all perfect because it'll never happen.
00:26:05 ◼ ► And you're going to start seeing the, you know, the design of Overcast slowly get updated over probably a year or two.
00:26:17 ◼ ► And I think that's not a very flashy way to do it, but I think that is a pragmatic way to do it for a one-person shop trying to modernize a very large but fairly old app.
00:26:30 ◼ ► Yeah. And I think it makes sense too in so far as it, like, it means that you have the ability to continue to be responsive to other ideas or opportunities or things that come up.
00:26:42 ◼ ► That it isn't, you know, you're shipping it as you go. You have an idea for something or something comes up.
00:26:48 ◼ ► You can, like, pause the redesign, do whatever it is you want to do, and then come back to the redesign.
00:26:54 ◼ ► And it isn't, but you've been able to be making progress in the meantime that it does not like you had to wait until this huge monolithic thing happens.
00:27:02 ◼ ► And then you end up in the weird state where, like, the farther your, like, main development set of code, like your main branch is from the thing that's shipping out there,
00:27:13 ◼ ► like the more just risks you have for weird, like, "Oh, I need to do with this minor little bug fix update."
00:27:18 ◼ ► And then I need to re-merge that back in and it just becomes a complete disaster over time.
00:27:23 ◼ ► So, like, doing it this way, like, it's easy, you know, that pragmatism just is, it seems like it will bear a lot of fruit.
00:27:29 ◼ ► And it's like, I've been doing a lot of this myself with WidgetSmith especially, where I've been trying to, you know, make the app better, make it more intuitive, do these kind of changes.
00:27:39 ◼ ► And a lot of it has just been these small little tweaks over the course of, you know, five or six updates that in aggregate can make a big impact, but I'm not causing a lot of trouble on the way.
00:27:50 ◼ ► And so I think it is also nice that you can get, you can base your, you can adjust course based on the feedback.
00:27:55 ◼ ► So if you update your main root list screen based on the feedback you get from that, baby, you know, what's confusing, what's good, you can adjust as you go down into the next screen and the next screen.
00:28:05 ◼ ► And you can be more responsive to your customers and making it the design that ultimately that works for them in a way that isn't necessarily coming it from, you know, entirely based on what you think is best for you.
00:28:18 ◼ ► It can be best for everybody. And it's like, I mean, SF Symbols is great. I've been using that a ton myself. I feel like it's like San Francisco and SF Symbols are, you know, it's like Apple has done the work that they clearly have invested in those two areas of the API in ways that mean that there's just, it doesn't make sense to do it any other way.
00:28:41 ◼ ► That nothing you can do unless you had a massive infrastructure team and design team and just expertise in this area that you'd be able to match anywhere close to what they're doing.
00:28:51 ◼ ► And they especially did with, I love that there's SF regular, SF Rounded and the Serif version now too.
00:29:13 ◼ ► I think the rounded one is a bit more playful or if you wanted to use the New York one, the Serif one, it's like a little bit more fancy, but you aren't, by going that route, you're not losing anything. They're just slightly different looks and it's enough to give you differentiation without doing too much.