Podcast Search

Under the Radar

230: Tackling the Redesign

Select a time to play from there. The line being spoken is highlighted as the audio plays.

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

0:00:04I'm Mark Orment.

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

0:00:09So I have finally tackled the redesign.

0:00:14The redesign! Dun dun dun!

0:00:16Well, I mean, maybe I shouldn't say tackle it as though it's completed.

0:00:20I have finally begun chipping away at the redesign, which is probably going to take me a year.

0:00:26Sure.

0:00:27You know, the longest journey starts with the first step, and you have taken that first step.

0:00:31Yeah. Yeah, so this has been a long time coming, and you've been hearing me talk for years about how, you know,

0:00:42at some point I'm going to tackle this redesign of Overcast and really modernize the design.

0:00:47And, you know, I had this whole image in mind of, like, you know, things being much more rounded, pulling away from the edges,

0:00:56you know, making it look like a modern app.

0:00:58You know, right now a lot of Overcast design still has a lot of that, you know, iOS 7 style aesthetic of, like,

0:01:04everything goes edge to edge, everything is square, the borders go all the way across, stuff like that.

0:01:08And it definitely is looking dated.

0:01:11And so I wanted to tackle that in general.

0:01:15And along with the redesign, this is where, you know, there are many conditions where if I was making a brand new app today,

0:01:24starting from scratch, I would of course do things differently than how I did things in 2014 or 2013.

0:01:30When did I write this? I forgot. 2014 is when I released it.

0:01:33Okay, so, you know, there's a lot of stuff I would do differently now if I was starting from scratch.

0:01:39You know, I would obviously be using Swift 100%, whereas Overcast started out 100% Objective-C because it predates Swift.

0:01:46And so it, you know, it was, it's still in transition, you know, most of the new code I'm writing is Swift,

0:01:54but 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.

0:02:03But for the most part, most of the new code I'm writing now is Swift.

0:02:06Also, in those intervening years, we've gotten SwiftUI, which is, again, a whole new way to do things,

0:02:14and Overcast currently uses almost no SwiftUI in the main app, although the watch app, of course, is SwiftUI now, which was a huge benefit.

0:02:21And 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.

0:02:34You know, there wasn't, you know, Catalyst didn't exist back then, there was no iOS apps running on Mac kind of thing,

0:02:42so 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.

0:02:51And 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

0:03:01is that I had this massive scope creep going on in my head the whole time.

0:03:07Like, what I was considering a redesign, I think what it was becoming in my head was a UI rewrite.

0:03:15And a rewrite is a very different thing than a redesign. And the scope of that is just infinite.

0:03:22Like, 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,

0:03:30and the latest stuff is always changing. So for instance, right now, if I wanted to do a giant rewrite, it would be pretty obvious,

0:03:38like, 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.

0:03:47Swift UI was very bleeding edge at those times, and it would have been a little bit tricky.

0:03:52I mean, even today, it would be a little tricky to use Swift UI for an iOS app of non-trivial complexity.

0:03:57We see stories of developers who try it, and sometimes it works, and a lot of times it doesn't.

0:04:03And even Apple is struggling with how to use Swift UI well in larger apps, so that might be not a given yet.

0:04:12But certainly, five years ago, it would have been questionable to rewrite your whole app in Swift at all.

0:04:18It's just Swift, the language. But today, that's more of a given. So, great. That's kind of a win.

0:04:24But certain things, depending on what time you're looking at something, it could be too early for that thing,

0:04:30or it could be about to be replaced by something else, or it might have just been replaced by something else,

0:04:35but you can only use it if you require the newest OS, and maybe you should wait a year or two before you do that.

0:04:40And so, there's always all these considerations that make it really hard to ever get started.

0:04:45And 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,

0:04:57and how big it should be. And then, the second part is that because so many of these massive changes in how apps are written,

0:05:06and how UIs are written specifically, all those changes have happened, because of all that, during this time,

0:05:12Overcast has fallen further and further behind on the technical/API levels, as well as the visual design level.

0:05:21And so, I had to keep spinning and spinning, just trying to keep the app modernized, trying to move it away from deprecated old APIs,

0:05:31trying to move it away from a lot of weird UI kit hacks that I was using to achieve certain effects.

0:05:36And 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.

0:05:44I'm obviously going to use combined/Swift UI mechanics. Obviously, I'm going to redesign the whole thing to be more modern,

0:05:52and maybe do it in a way that could be flexible across the platform, so I could have just one UI code base,

0:05:58and it would also run on iPads and Macs, maybe even the TV, who knows, right?

0:06:06So, 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,

0:06:15and there's never a good time for that. Do you feel that with any of your apps?

0:06:20Yeah, and I feel like there's two things that you're describing, and I feel this more on one than the other.

0:06:28There's the redesign part of this, which is the visual, what the customer interacts and sees part of it.

0:06:36And then there's the rewriting or the recoding or re-architecting part that is much more what the engineer sees and focuses on.

0:06:48And 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.

0:07:00And 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

0:07:12and the growing tech debt and all the aspects that you're talking about that can make it so intimidating to start.

0:07:20The 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.

0:07:30But 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,

0:07:41you 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.

0:07:51You 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.

0:08:06So 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.

0:08:20So 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.

0:08:34But instead, I'm just like limping along, updating things as I go, doing my best to keep things working.

0:08:42And 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.

0:09:00And 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.

0:09:13And 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.

0:09:25It'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."

0:09:49But 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.

0:10:09Yeah, 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.

0:10:28So 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.

0:10:40But 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.

0:10:58There'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.

0:11:11And 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.

0:11:22So that's going to have to drop all at once. But for the most part, the design is going to be gradual over time.

0:11:30And 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.

0:11:41Because 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.

0:12:01And 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.

0:12:15Nobody wants their tools to change from under them. So I have to be fairly conservative with some of the things that I do.

0:12:23But 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,

0:12:38but a lot of the work I've done so far is not going to involve even a rewrite of its view controller.

0:12:45Some 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.

0:12:55I'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.

0:13:09There'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.

0:13:21It makes no sense and would bring no benefit to me or my customers to rewrite the entire app in Swift.

0:13:28So 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.

0:13:36Most of that stuff is going to stay Objective-C, so I have to also balance the needs of interfacing with that and everything.

0:13:42Anyway, 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.

0:13:48But first, we are brought to you this time by the Best in Class iOS App Book Series.

0:13:54The Best in Class iOS App Book Series is here to help you take your apps from good to great.

0:13:59It'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.

0:14:07Accessibility, design, user experience, and iOS APIs.

0:14:12So the accessibility section is great. You learn how to make sure your apps are designed for everyone.

0:14:16Master the basics and then deep dive into APIs like the rotor control or how to best support voiceover.

0:14:22And design. Every successful app eventually wins with design, speaking of which, but it looks different for each app.

0:14:28Here, 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.

0:14:34Now, if an app is pretty to look at but unusable, it'll get deleted.

0:14:38So your user experience section is all about how not to let that happen.

0:14:43And finally, the last section in the series is an exhaustive look at all the major iOS frameworks and APIs.

0:14:49You 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.

0:14:56So 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.

0:15:03The accessibility book is up first. It already has over 100 pages of content, over 30 code samples with both UIKit and SwiftUI.

0:15:10And this is really great so far. It's looking great and I strongly suggest that you check it out.

0:15:15The series will be $160 when it's out of early access.

0:15:19And our listeners can right now enjoy a 50% early access discount.

0:15:23You can get all the books in the series as they come out, a comprehensive Xcode project with all the code samples,

0:15:28access 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.

0:15:36Visit BestinClassiOSApp.com/Radar to get started today.

0:15:41Whether 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.

0:15:49It's like Apple's HIG combined with the in-depth documentation and code samples.

0:15:53So once again, that's BestinClassiOSApp.com/Radar to get the series for 50% off.

0:15:59Our thanks to BestinClassiOSApp for their support of this show and Relay FM.

0:16:04And so I think what you're describing I think sounds very practical and wise.

0:16:09That 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.

0:16:18That you're rewriting things when it is sort of essential or makes sense or really makes that process much more straightforward.

0:16:26But otherwise, leave as few things touched as possible, but allow yourself to evolve it.

0:16:32I 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.

0:16:41Where 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.

0:16:50But in general, I would say the Xcode team has done a great job of making them kind of these incremental changes.

0:16:58That if you look back over several releases are substantial, meaningful, and kind of become more profound.

0:17:06But from each release to the next, their changes are much more minor and easy to adapt to.

0:17:11And 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.

0:17:19That it preserves familiarity while still allowing you to bring things forward.

0:17:23So 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.

0:17:31Well, and I thank you for that. But also, if I did it any other way, I would never do it.

0:17:38If 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.

0:17:46I would never actually do it. Because that's the kind of thing that even big companies with big staffs have trouble tackling that.

0:17:54That'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.

0:18:01So this is how I'm doing it. So I'm starting out very, very simply.

0:18:05The first things I did were I disabled my custom font. So sorry everybody who still loved it.

0:18:13Custom font is gone because it's very hard to do a redesign and test two different fonts with all these different conditions.

0:18:22And have to tell all the frameworks every single time I'm using them, use this font, use this font, tweak this font this way.

0:18:28The 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?

0:18:35A long time.

0:18:36It's old.

0:18:37A long time.

0:18:38San 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.

0:18:47Or Helvetica Noya. But anyway, so the San Francisco font is really good.

0:18:52And there's all these different variations it has now, all these different styles you can make it, deep support in the system for it.

0:18:59And deviating from the San Francisco font is getting to be decreasingly useful and increasingly a pain in the butt.

0:19:08Especially 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.

0:19:15And 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.

0:19:22While 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.

0:19:32So San Francisco has way more support for that and stuff like that.

0:19:37So I think it's time for most apps to just use the system font at this point.

0:19:43The era of custom fonts being the norm, I think is coming to an end and is largely iPhone specific.

0:19:52I 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.

0:20:03Like 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.

0:20:10And 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.

0:20:18So 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.

0:20:24Also, 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.

0:20:35And my icons kind of look a little developer-y in certain points in the app. And Apple's icons are pretty good.

0:20:44And I used them extensively for the new watch app when I rewrote that. And so I'm using them in the main app now.

0:20:50I'm not using SF Symbols exclusively. There are still some icons I'm drawing myself. But I'm using them a lot.

0:20:56I'm using them in most places and it is largely fine. And this brings a lot of benefits.

0:21:02So 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.

0:21:09And 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.

0:21:16When your icons look really nice and when they match the system's styles. That's usually a good thing.

0:21:22So again, this is an area where a lot of customization in the past was either necessary or stylish.

0:21:29And I think less icon customization over time is necessary. Because the system stuff is just getting really good.

0:21:35And it's spreading across multiple platforms and just becoming more expected by customers.

0:21:40So SF Symbols making heavy use in most of the app now.

0:21:45And 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.

0:21:54But I started finally the other day looking at the new list configuration, list style configuration stuff.

0:22:03Like, 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.

0:22:18A lot of that stuff is deprecated now. And I'm using a ton of that throughout the app.

0:22:25So, as I think, you know, most apps written before recent years of iOS would have used tons of that stuff.

0:22:33Because most apps contain a lot of table views. And that's, that's most of Overcast is table views.

0:22:41So, 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.

0:22:55You know, collection views now seem to be able to replicate much, if not most, of the behaviors of table views.

0:23:03But then you get some of the benefits of them being collection views and some more of the flexibility and everything else.

0:23:08So, I'm finally diving into that and that, oh, and diffable data sources too. That's a whole thing.

0:23:15Again, having your models be Objective C makes that a little bit clumsy at times, but, you know, shimming it here and there where necessary.

0:23:23But, diffable data sources, that's another thing where, you know, I have so much code to do this manually, basically.

0:23:31And 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.

0:23:42And 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.

0:23:48So, the more of that complexity I can push onto the system frameworks, the better.

0:23:53So, I'm leaning into that. And this stuff is massive. Like, the code samples are so big.

0:24:02I'm using a lot of that, like, that modern collection view Xcode sample that they have that is just filled with collection view templates.

0:24:09And it's just so massive. And I hit a really low point a couple days ago.

0:24:15Like, 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.

0:24:24Because I'm making some changes there. It would be a lot easier if it was a collection view.

0:24:28And it's a relatively, like, the cells in that are relatively simple compared to episode lists.

0:24:34So, 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.

0:24:43And all you see ahead of you is massive amounts of complexity and there's no end in sight.

0:24:50And 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?

0:24:56I was so there, like, two days ago. Because I was trying to get into all this stuff.

0:25:01And it's just the prospect of going from where I am with, you know, UI table view delicate and Objective-C stuff,

0:25:08going from that to Diffable Data Source and modern collection view layout and stuff.

0:25:14It is daunting. And there is so much code and there's so much, kind of, you know, to use an old JOLN software term,

0:25:22so much architecture astronautism going on. Like, so many classes on top of classes on top of providers and factories.

0:25:28And it's just, oh, somebody read the Gang of Four book a lot when they designed these APIs.

0:25:34It is cumbersome to get started. But over the last couple of days I have, you know, slowly gotten things working.

0:25:44And I'm, like, I'm coming up out of that valley slowly now. So that's where I am.

0:25:50And 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.

0:25:58I'm not going to wait until it's all done. Because that'll never happen either.

0:26:02I'm just going to start chipping some of this stuff and start getting it out there.

0:26:05And you're going to start seeing the, you know, the design of Overcast slowly get updated over probably a year or two.

0:26:12And alongside, you know, other features and bug fixes I'm also doing in the meantime.

0:26:17And 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.

0:26:30Yeah. 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.

0:26:42That it isn't, you know, you're shipping it as you go. You have an idea for something or something comes up.

0:26:48You can, like, pause the redesign, do whatever it is you want to do, and then come back to the redesign.

0:26:54And 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.

0:27:02And 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,

0:27:13like the more just risks you have for weird, like, "Oh, I need to do with this minor little bug fix update."

0:27:18And then I need to re-merge that back in and it just becomes a complete disaster over time.

0:27:23So, 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.

0:27:29And 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.

0:27:39And 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.

0:27:50And so I think it is also nice that you can get, you can base your, you can adjust course based on the feedback.

0:27:55So 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.

0:28:05And 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.

0:28:18It 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.

0:28:41That 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.

0:28:51And they especially did with, I love that there's SF regular, SF Rounded and the Serif version now too.

0:28:58Yeah, New York, I think they call it.

0:29:13I 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.

0:29:29But anyway, I hope this goes well for you. And it sounds like it already has. And that's exciting that this thing that I feel like you've been mentioning for years and years has finally begun and you're able to get cracking on it.

0:29:41And it will never end.

0:29:43Never end.

0:29:44But at least it's going.

0:29:45It's going down side.

0:29:46At least it's starting.

0:29:47Exactly.

0:29:48Thank you for listening everybody and we'll talk to you in two weeks.

0:29:51Bye.