PodSearch

Under the Radar

167: The WWDC Hangover

 

00:00:00 ◼   ► Welcome to Under the Radar,

00:00:02 ◼   ► a show about independent iOS app development.

00:00:04 ◼   ► I'm Mark Orment.

00:00:06 ◼   ► - And I'm David Smith.

00:00:07 ◼   ► Under the Radar is never longer than 30 minutes,

00:00:08 ◼   ► so let's get started.

00:00:10 ◼   ► - So Dave, I have a confession to make.

00:00:13 ◼   ► I have a WWDC hangover.

00:00:14 ◼   ► - Although you indulged a little too much in the new APIs.

00:00:18 ◼   ► - There is so much.

00:00:20 ◼   ► So here we are, we're recording a week after WWDC.

00:00:24 ◼   ► The dust is starting to settle.

00:00:27 ◼   ► We got such a big year this year

00:00:29 ◼   ► that I personally am kind of feeling overwhelmed

00:00:33 ◼   ► and I'm having a hard time figuring out

00:00:36 ◼   ► what to tackle this summer at all

00:00:38 ◼   ► and what to tackle first.

00:00:41 ◼   ► Because there's so much that we got.

00:00:43 ◼   ► I mean, this was a WWDC for the ages.

00:00:46 ◼   ► This was, I would say, the biggest one

00:00:49 ◼   ► since the Swift announcement about,

00:00:51 ◼   ► what, five years ago was that?

00:00:52 ◼   ► - Imagine, so we're on Swift 5 now,

00:00:54 ◼   ► but yes, that sounds about right,

00:00:55 ◼   ► that it was about four or five years ago.

00:00:57 ◼   ► And there are just, we got so many huge new APIs,

00:01:02 ◼   ► so many foundational shifts and things we can do.

00:01:05 ◼   ► We got almost everything we were asking for,

00:01:08 ◼   ► like on the API front, really,

00:01:10 ◼   ► which is kind of amazing.

00:01:11 ◼   ► And there are so many things that any one or two of these

00:01:15 ◼   ► would have made for a pretty good summer

00:01:16 ◼   ► and a pretty good year, and we got like six of them.

00:01:19 ◼   ► (laughs)

00:01:20 ◼   ► - Which is a little overwhelming.

00:01:22 ◼   ► - A little.

00:01:22 ◼   ► - It is like, I remember feeling,

00:01:26 ◼   ► I always go around WWDC with a notebook,

00:01:28 ◼   ► where I try and, and one of my lists,

00:01:31 ◼   ► I keep like six lists, and one of my lists is always,

00:01:34 ◼   ► this is the thing, something I need to follow up on.

00:01:37 ◼   ► Like some kind of offhand comment they make,

00:01:39 ◼   ► or some API or news thing that they mention,

00:01:42 ◼   ► that I'm like, huh, that's interesting to look at.

00:01:44 ◼   ► And usually that's maybe like two or three things

00:01:46 ◼   ► at the end of the week.

00:01:48 ◼   ► 'Cause these are usually things that aren't

00:01:51 ◼   ► the obvious things that I have to look at.

00:01:53 ◼   ► If they're making a change to HealthKit

00:01:54 ◼   ► that affects my apps, I'm gonna know all about that.

00:01:57 ◼   ► But there's always also those things

00:01:59 ◼   ► that are just like interesting and more side notes.

00:02:01 ◼   ► And this year that was like two pages of small writing

00:02:06 ◼   ► in my book, where there's all these things

00:02:07 ◼   ► that are just kept coming.

00:02:09 ◼   ► And in some ways it makes sense.

00:02:10 ◼   ► I feel like last year we had,

00:02:12 ◼   ► like last year felt like a tune-up.

00:02:14 ◼   ► It felt like it was this year where,

00:02:16 ◼   ► we got some good stuff and things got better.

00:02:19 ◼   ► But for the most part, it was much more incremental

00:02:22 ◼   ► and much more just these small improvements to things.

00:02:26 ◼   ► Which in some ways was nice,

00:02:27 ◼   ► and it made for a much quieter summer.

00:02:28 ◼   ► But this year feels like,

00:02:30 ◼   ► it's like the dam is burst and all the things

00:02:34 ◼   ► that they've been holding back

00:02:35 ◼   ► or they've been working on in secret

00:02:37 ◼   ► for years and years and years now,

00:02:38 ◼   ► all finally appeared all at once.

00:02:41 ◼   ► And like, that's great.

00:02:43 ◼   ► But yeah, where do we start?

00:02:44 ◼   ► - Exactly, I mean, like my list of like significant things

00:02:48 ◼   ► I want to tackle this summer.

00:02:51 ◼   ► Like I spent yesterday still trying

00:02:53 ◼   ► to get AirPlay 2 to work,

00:02:54 ◼   ► 'cause I keep making small progress.

00:02:56 ◼   ► I went to a lab, I talked to the people at the lab,

00:02:58 ◼   ► they were great, so I got a few tips

00:03:00 ◼   ► on things I could try to solve my problems.

00:03:02 ◼   ► So I started trying that yesterday.

00:03:04 ◼   ► Still didn't get anywhere,

00:03:05 ◼   ► but I'm getting slowly, you know, fewer problems.

00:03:09 ◼   ► You know, the first thing I usually do

00:03:12 ◼   ► when there's a new beta is I set my minimum deployment target

00:03:17 ◼   ► to the newest version of the OS

00:03:19 ◼   ► and look at all the deprecation warnings I get.

00:03:21 ◼   ► And I try to see, all right, how do I tackle these?

00:03:24 ◼   ► And usually fixing deprecation warnings

00:03:27 ◼   ► is a really easy job because it's like,

00:03:29 ◼   ► oh, the value of this constant changed.

00:03:31 ◼   ► Like the activity, the style of spinner activity indicators,

00:03:36 ◼   ► like the old styles are deprecated, now there's new ones.

00:03:38 ◼   ► Like I can't use white anymore or gray,

00:03:40 ◼   ► I have to use medium and large.

00:03:41 ◼   ► Fine, that took like one minute to go through my code

00:03:44 ◼   ► and then replace those, it was fine.

00:03:46 ◼   ► But there's also a significant other deprecations

00:03:49 ◼   ► that will require like adoption of entirely new APIs.

00:03:52 ◼   ► And that's things like background refresh, which is huge.

00:03:56 ◼   ► Context menus from 3D Touch, also huge.

00:04:01 ◼   ► Lots of small things like using the status bar frame

00:04:04 ◼   ► to detect orientation, there's all sorts of stuff

00:04:07 ◼   ► that is deprecated in iOS 13.

00:04:08 ◼   ► It's a huge year for just like fixing deprecation warnings

00:04:12 ◼   ► and using the new, and migrating to whatever replaces them.

00:04:15 ◼   ► Like normally that's a small job.

00:04:17 ◼   ► This year that's gonna be probably two weeks.

00:04:20 ◼   ► And then there's also, maybe one week,

00:04:23 ◼   ► so there's also the entire thing about Catalyst,

00:04:27 ◼   ► formerly called Marzipan on podcasts,

00:04:29 ◼   ► where you can bring your iPad app to the Mac.

00:04:30 ◼   ► That's awesome, but it's gonna take some work.

00:04:34 ◼   ► And as I started doing it with my app,

00:04:37 ◼   ► I realized that's a bigger job than I expected it to be.

00:04:40 ◼   ► I'm gonna have to do more work than I expected there.

00:04:43 ◼   ► There's a lot more Mac-specific UI considerations

00:04:48 ◼   ► that you should probably be making.

00:04:49 ◼   ► Like for me, one of the biggest ones is

00:04:51 ◼   ► using my iPad app on the Mac right now really is clumsy

00:04:54 ◼   ► because of my two-column navigation

00:04:57 ◼   ► that's navigating what's really a three-column hierarchy

00:05:00 ◼   ► of navigation stack.

00:05:02 ◼   ► And so I wanna make a three-column view,

00:05:03 ◼   ► but that's more work I have to do.

00:05:06 ◼   ► They also finally gave me Siri audio intents,

00:05:09 ◼   ► which is huge.

00:05:10 ◼   ► That could have been half the summer right there,

00:05:12 ◼   ► just implementing all the new Siri kit stuff,

00:05:14 ◼   ► which is so much better than it was last year.

00:05:16 ◼   ► It kinda makes me mad that I spent last summer doing it

00:05:20 ◼   ► because I have to rip out a lot of that now and redo it.

00:05:23 ◼   ► But oh well.

00:05:24 ◼   ► But that's a huge thing right there.

00:05:25 ◼   ► Siri audio intents, that could be three weeks

00:05:28 ◼   ► of development right there.

00:05:30 ◼   ► Then they did sign in with Apple,

00:05:33 ◼   ► which I'm not sure if I should use yet,

00:05:35 ◼   ► but I probably should offer it.

00:05:37 ◼   ► I don't need to, I don't fit the requirement

00:05:38 ◼   ► of needing to offer it, but I probably should offer it anyway

00:05:42 ◼   ► because that's a thing.

00:05:44 ◼   ► I also would love, there's this new core data

00:05:48 ◼   ► and cloud kit synchronization API.

00:05:51 ◼   ► - Danger, danger.

00:05:52 ◼   ► - I know.

00:05:53 ◼   ► - I have flashbacks to a very bad situation that happened,

00:05:56 ◼   ► what is it, six years ago when they first tried that?

00:05:58 ◼   ► - Yeah, yeah, and that was very bad.

00:06:00 ◼   ► But this is not that.

00:06:02 ◼   ► That was Siri cloud kit.

00:06:03 ◼   ► This looks a lot better.

00:06:04 ◼   ► And I watched the video on that and I'm like,

00:06:06 ◼   ► man, I would love to free myself of user data.

00:06:10 ◼   ► Right now I have to manage all this user data on my servers.

00:06:13 ◼   ► I would love to free myself of that burden

00:06:16 ◼   ► and get myself out of the business

00:06:18 ◼   ► of running most of the servers I run.

00:06:20 ◼   ► I would still probably run some for crawling

00:06:22 ◼   ► and proxying stuff, but I would get myself

00:06:25 ◼   ► out of the business of running most of my servers,

00:06:26 ◼   ► which I'm increasingly hating.

00:06:28 ◼   ► So that would be huge, but moving my entire data layer

00:06:32 ◼   ► like that would also be a massive job.

00:06:35 ◼   ► That's like a whole year right there of getting that right.

00:06:39 ◼   ► It would be six months of the initial implementation

00:06:41 ◼   ► and then six months of bug fixes of getting,

00:06:43 ◼   ► 'cause it's changing the way sync and data storage work

00:06:46 ◼   ► and user accounts, and my users ultimately

00:06:49 ◼   ► wouldn't care about that.

00:06:51 ◼   ► I would care and I would benefit, but they mostly wouldn't

00:06:54 ◼   ► and they would probably be angry at the process

00:06:57 ◼   ► where no new features basically happen

00:06:58 ◼   ► in the app for a long time.

00:07:00 ◼   ► Also, there's the entire question of Swift UI,

00:07:05 ◼   ► which is huge.

00:07:07 ◼   ► Swift UI, formerly known as Amber and the rumor mill,

00:07:10 ◼   ► this is massive.

00:07:13 ◼   ► Now, it's also, I started playing with that.

00:07:15 ◼   ► It's super early.

00:07:16 ◼   ► It's clearly a 1.0, but it's surprisingly good

00:07:21 ◼   ► for a 1.0, but it's still, to me,

00:07:24 ◼   ► there's a huge learning curve there,

00:07:26 ◼   ► because I also, by the way, need to really

00:07:29 ◼   ► finally learn Swift and dive into it fully.

00:07:31 ◼   ► I've used Swift for a couple years,

00:07:35 ◼   ► but I wouldn't say I know it.

00:07:37 ◼   ► I spent the plane ride home and a couple days after

00:07:42 ◼   ► just reading through the Swift book

00:07:43 ◼   ► and finally teaching myself a lot more of the details

00:07:47 ◼   ► about how this language works and how to use it,

00:07:50 ◼   ► but I still have to start using it.

00:07:51 ◼   ► Now, I want to really dive into Swift fully

00:07:54 ◼   ► and start writing all new code in Swift

00:07:57 ◼   ► whenever that's reasonably possible,

00:07:59 ◼   ► but I have an app that is 99% Objective-C,

00:08:01 ◼   ► and so there's a bunch of overhead,

00:08:04 ◼   ► both conceptually and in code, of doing that,

00:08:07 ◼   ► of starting to write new code in Swift

00:08:09 ◼   ► if it's interacting with an almost entirely Objective-C app.

00:08:12 ◼   ► There's some overhead to that, and so I have to,

00:08:16 ◼   ► or I want to learn an entire language

00:08:19 ◼   ► that is pretty new to me still,

00:08:21 ◼   ► use that to write new UI code in a new UI framework

00:08:25 ◼   ► that fortunately you can also adopt Swift UI in parts

00:08:28 ◼   ► in a UI kit app and other languages,

00:08:31 ◼   ► but that's still integration.

00:08:34 ◼   ► There's barriers, there's bridges, there's transfers.

00:08:37 ◼   ► There's friction there, not to mention the fact

00:08:39 ◼   ► that Swift UI is itself brand new,

00:08:42 ◼   ► and so there's very little documentation,

00:08:44 ◼   ► very few tutorials.

00:08:45 ◼   ► Swift UI, as it stands today, is going to be,

00:08:50 ◼   ► adopting that today is going to be the hardest version

00:08:53 ◼   ► of Swift UI to adopt that we will ever have

00:08:55 ◼   ► because it is so young and so minimally documented,

00:08:59 ◼   ► and there's no sample code, there's no tutorials.

00:09:01 ◼   ► So that's very, very young, and there's still

00:09:04 ◼   ► the giant question, as I was playing with it,

00:09:07 ◼   ► I had the giant question of how do I know what I can do?

00:09:12 ◼   ► That's really hard for me with Swift UI.

00:09:14 ◼   ► I would, okay, well, you type in the box, whatever,

00:09:17 ◼   ► you get some crazy Swift error

00:09:19 ◼   ► if you do anything slightly wrong

00:09:21 ◼   ► because the crazy syntax hacking they're using

00:09:24 ◼   ► to get it to work, it produces incredibly unfriendly

00:09:28 ◼   ► Swift errors if you miss a brace somewhere

00:09:31 ◼   ► or if you use a type that isn't implying a return

00:09:36 ◼   ► of the correct value or something, it's real weird.

00:09:40 ◼   ► Or if you actually see the, if you right-click on a block

00:09:44 ◼   ► and you say move to method, and you see the method signature

00:09:47 ◼   ► it generates, you realize quite how complex and crazy

00:09:52 ◼   ► this language is of trying to fit this fairly dynamic system

00:09:56 ◼   ► into this incredibly rigid language,

00:09:59 ◼   ► and there's all these generics everywhere,

00:10:01 ◼   ► and it's a mess once you go slightly below the surface.

00:10:04 ◼   ► So there is a huge learning curve there.

00:10:07 ◼   ► You can do the simple stuff quickly,

00:10:09 ◼   ► but more complex stuff is gonna take us a while

00:10:11 ◼   ► to figure out how to do and to really internalize

00:10:14 ◼   ► how this works.

00:10:15 ◼   ► So Swift UI, that's a huge thing I wanna tackle this summer.

00:10:19 ◼   ► And I also wanna rewrite my entire watch app

00:10:21 ◼   ► using Swift, Swift UI, and combine a whole new thing

00:10:25 ◼   ► to me as well with the independence goal

00:10:29 ◼   ► and with direct syncing to the internet

00:10:31 ◼   ► and direct downloading from the internet

00:10:33 ◼   ► so that the standalone playback is much more reliable.

00:10:36 ◼   ► So that's another thing I wanted to do,

00:10:38 ◼   ► and I have this huge dilemma of not only like

00:10:42 ◼   ► where do I even start with all this stuff,

00:10:44 ◼   ► 'cause what I just described is like three years of work.

00:10:46 ◼   ► - You got three months, it'll be fine.

00:10:48 ◼   ► - Yeah, right, exactly, I have three months,

00:10:50 ◼   ► at the end of which my customers will want all of this.

00:10:53 ◼   ► (laughs)

00:10:54 ◼   ► And then, and I think a lot of this comes down to

00:10:56 ◼   ► a dilemma that I have that I think a lot of us

00:10:59 ◼   ► are probably facing right now,

00:11:01 ◼   ► which is the dilemma of wanting to rewrite code

00:11:04 ◼   ► using the new stuff.

00:11:06 ◼   ► Like we have a code base that works,

00:11:09 ◼   ► but there's all this new stuff that in many ways is better

00:11:11 ◼   ► and in many ways can reduce the amount of that code

00:11:13 ◼   ► or can eliminate certain problems that we're having.

00:11:15 ◼   ► And so it's so tempting to want to rewrite

00:11:19 ◼   ► what already works, what we already have.

00:11:22 ◼   ► And like on one level, that is a terrible idea.

00:11:26 ◼   ► Like there's the famous old Joel and Software post about it,

00:11:28 ◼   ► like this is known in the industry,

00:11:29 ◼   ► like rewriting stuff that already works from scratch

00:11:32 ◼   ► is usually not a good idea.

00:11:34 ◼   ► It usually is not nearly as easy as you think it will be.

00:11:38 ◼   ► It usually has a large period afterwards

00:11:41 ◼   ► where you basically have to refix all the bugs

00:11:43 ◼   ► that you fixed over the last X years,

00:11:44 ◼   ► like you've refixed them in the new system,

00:11:47 ◼   ► and customers don't really usually care

00:11:49 ◼   ► or benefit from whatever you did under the hood.

00:11:52 ◼   ► But it's so tempting to do this, to get the new stuff,

00:11:56 ◼   ► to simplify things and to eliminate certain classes of bugs

00:11:58 ◼   ► or problems that you were having, but your old code works.

00:12:01 ◼   ► And it's rarely a good idea to rewrite what works.

00:12:05 ◼   ► But at the same time, I look at this and I think,

00:12:07 ◼   ► well, I do need to learn some of this stuff,

00:12:09 ◼   ► so this might be a good way to do it.

00:12:10 ◼   ► And also, legacy code, like a huge legacy code base

00:12:14 ◼   ► and just like the general idea of a legacy burden

00:12:17 ◼   ► is a liability when a new competitor can come in

00:12:22 ◼   ► and outrun you if they only use the new stuff.

00:12:28 ◼   ► How long does it take, if you have five years

00:12:31 ◼   ► of your code base, how long would it take

00:12:34 ◼   ► for a new competitor to come in and match you

00:12:38 ◼   ► and then outrun you if they were only using the new stuff,

00:12:41 ◼   ► if they didn't have your legacy?

00:12:43 ◼   ► You gotta think about that.

00:12:44 ◼   ► I have no idea even where to start with any of this.

00:12:49 ◼   ► So instead, I will start with our sponsor

00:12:51 ◼   ► and then you can tell me where to start afterwards.

00:12:53 ◼   ► - I can tell you what to do, don't worry, I got this.

00:12:55 ◼   ► - Okay, good, please, I'm really depending on you.

00:12:58 ◼   ► So we are brought to you by Linode.

00:13:01 ◼   ► With Linode, you can instantly deploy and manage

00:13:03 ◼   ► an SSD server in the Linode cloud.

00:13:05 ◼   ► You can get a server running in just seconds

00:13:07 ◼   ► with your choice of Linux distro,

00:13:08 ◼   ► resources and node location.

00:13:11 ◼   ► It doesn't matter if you're working on your first server

00:13:14 ◼   ► or deploying a complex system, Linode is where to go.

00:13:17 ◼   ► They offer the fastest hardware network

00:13:20 ◼   ► with outstanding customer support if you ever need help

00:13:22 ◼   ► and it's super easy to launch a Linode cloud server.

00:13:25 ◼   ► They also now have block storage available in Newark,

00:13:28 ◼   ► Fremont, Dallas, Atlanta, Frankfurt, London and Singapore,

00:13:31 ◼   ► soon to be released in Tokyo and they have this all new

00:13:34 ◼   ► version four RESTful API that's now out of beta

00:13:37 ◼   ► that includes a great CLI, including an officially supported

00:13:40 ◼   ► Python CLI.

00:13:41 ◼   ► So also right now, Linode is hiring.

00:13:45 ◼   ► So if you want to learn more and check out what they are

00:13:46 ◼   ► looking for, just go to linode.com/careers.

00:13:49 ◼   ► Now I love Linode, I've been there for over eight years now.

00:13:52 ◼   ► I have all my servers hosted there and really,

00:13:55 ◼   ► you know, I said earlier, I'm trying to get myself out

00:13:57 ◼   ► of running so many servers but it's not their fault at all.

00:13:59 ◼   ► Linode is great, like everything they do for me

00:14:01 ◼   ► is super easy.

00:14:03 ◼   ► It's like if you want to run a server with minimal

00:14:05 ◼   ► complexity, minimal effort and honestly minimal price,

00:14:09 ◼   ► they are the place to go.

00:14:10 ◼   ► Their pricing options are fantastic.

00:14:13 ◼   ► Their plans start at one gig of RAM for just $5 a month.

00:14:16 ◼   ► They also offer high memory plans, dedicated CPU plans

00:14:19 ◼   ► and lots of other specialties in case you need that

00:14:21 ◼   ► and Linode has a special offer for our listeners.

00:14:23 ◼   ► If you go to linode.com/radar and use promo code radar2019,

00:14:28 ◼   ► you will get $20 towards any Linode plan.

00:14:31 ◼   ► So on that $5 a month plan, that could be four months free

00:14:34 ◼   ► and with a seven day money back guarantee,

00:14:36 ◼   ► you have nothing to lose.

00:14:37 ◼   ► So give Linode a try today at linode.com/radar,

00:14:41 ◼   ► promo code radar2019 to learn more, sign up

00:14:44 ◼   ► and make the most of that $20 credit.

00:14:46 ◼   ► Thank you so much to Linode for their support of this show

00:14:48 ◼   ► and all of Relay FM.

00:14:49 ◼   ► So Dave, where do I start?

00:14:52 ◼   ► What do I do?

00:14:54 ◼   ► - This year is worse than the normal pattern

00:14:56 ◼   ► but I think the normal pattern still helps us get out

00:14:59 ◼   ► of this hole because this year there's just more,

00:15:01 ◼   ► there's more choices, there's more options,

00:15:03 ◼   ► there's more things that we can do

00:15:05 ◼   ► but I think the approach I think that I found works well

00:15:09 ◼   ► in past years, I think still applies well here,

00:15:13 ◼   ► is that ultimately the next three months

00:15:17 ◼   ► are about making sure that our users' expectations

00:15:21 ◼   ► for new and user-facing, invisible

00:15:26 ◼   ► and heavily marketed by Apple features are taken care of

00:15:30 ◼   ► which I think is both good for our customers

00:15:33 ◼   ► in terms of obviously giving them the new things

00:15:36 ◼   ► that they're looking for and expecting

00:15:38 ◼   ► and also as a side benefit, useful in terms of being part

00:15:42 ◼   ► of the marketing and editorial push that will happen

00:15:46 ◼   ► September, October.

00:15:48 ◼   ► And this year I feel like a lot of that stuff

00:15:50 ◼   ► is going to be, it's like making sure we do obviously

00:15:53 ◼   ► the dark mode on--

00:15:55 ◼   ► - Oh, I forgot about that. - On iOS

00:15:57 ◼   ► which is less complicated,

00:15:59 ◼   ► like Overcast already has a dark mode,

00:16:01 ◼   ► Pedometer++ already has a dark mode.

00:16:03 ◼   ► But now I have to think about do I offer it as an option

00:16:06 ◼   ► to follow the system setting

00:16:08 ◼   ► or to keep your own independent setting

00:16:09 ◼   ► 'cause this always happens, whenever the system adds

00:16:11 ◼   ► something like rotation lock or something,

00:16:13 ◼   ► then apps that already had that as a separate option

00:16:16 ◼   ► are faced with these problems of if you just follow

00:16:19 ◼   ► the system and remove the option from your app,

00:16:21 ◼   ► then users will complain because they're like,

00:16:23 ◼   ► I want to keep the system in light mode

00:16:25 ◼   ► but I want your app in dark mode.

00:16:27 ◼   ► And so then you have to decide whether to not follow

00:16:30 ◼   ► the system or whether to have another preference

00:16:33 ◼   ► that says follow the system preference

00:16:35 ◼   ► or use my own preference.

00:16:37 ◼   ► - That is going to be tricky, but at least

00:16:41 ◼   ► the fundamental work, like the hard part with dark mode

00:16:43 ◼   ► was making all your views have dynamic theming.

00:16:47 ◼   ► That's the part that was really challenging

00:16:49 ◼   ► and more difficult, but that's a feature that I think

00:16:51 ◼   ► users are going to expect and especially it's a feature

00:16:55 ◼   ► where people are going to really,

00:16:57 ◼   ► you would really stand out if you didn't adopt it.

00:17:00 ◼   ► Because if the user has switched their phone into dark mode

00:17:03 ◼   ► and they're going around between all these black apps

00:17:06 ◼   ► and then suddenly they come to one of yours

00:17:08 ◼   ► and it's like this blinding white screen of brightness,

00:17:13 ◼   ► that's going to stand out both in terms of burning their eyes

00:17:18 ◼   ► as well as like, oh, whoa, what's going on here?

00:17:21 ◼   ► And so that's a feature that I think we absolutely need

00:17:23 ◼   ► to make sure is absolutely ready day one.

00:17:28 ◼   ► And I think that's a feature that doesn't feel young,

00:17:31 ◼   ► doesn't feel particularly problematic.

00:17:34 ◼   ► It's something that they trialed in Mac OS before.

00:17:36 ◼   ► So in my mind it's kind of like starting there.

00:17:40 ◼   ► Like start with those kind of visual features,

00:17:42 ◼   ► making sure we adopt some of the new card-based things

00:17:46 ◼   ► for modals and there's a few things like that

00:17:48 ◼   ► where there's new sort of visual things

00:17:52 ◼   ► that users are going to expect.

00:17:54 ◼   ► I think going along those same lines,

00:17:57 ◼   ► I feel like on the watch the big push

00:17:59 ◼   ► is going to be independence.

00:18:01 ◼   ► And so if you have a watch app,

00:18:03 ◼   ► I feel like it is imperative that you make it independent

00:18:06 ◼   ► and have it be independent at the beginning.

00:18:09 ◼   ► And it's more important that probably for day one

00:18:11 ◼   ► that it is independent than that it uses SwiftUI

00:18:16 ◼   ► and has all the fancy new UI things you can do there

00:18:18 ◼   ► and the new capabilities, but it's like at the very least

00:18:22 ◼   ► it needs to be able to be something that you can use

00:18:25 ◼   ► in some form by itself.

00:18:28 ◼   ► Like that seems like something that's,

00:18:30 ◼   ► it seems like the general theme is

00:18:32 ◼   ► that's a very important thing,

00:18:33 ◼   ► it doesn't really make sense now,

00:18:34 ◼   ► but it will probably make a lot of sense this fall.

00:18:36 ◼   ► That's kind of the vibe I get.

00:18:37 ◼   ► And then what I tend to do is I'll lay out

00:18:40 ◼   ► the rest of the features and the things that I want to do.

00:18:42 ◼   ► And I'll start with the customer.

00:18:44 ◼   ► Start with things that they will notice

00:18:46 ◼   ► that they would appreciate, that would make their experience

00:18:50 ◼   ► of using the app better.

00:18:52 ◼   ► And start there and then just kind of work backwards.

00:18:55 ◼   ► Because many of the architectural changes

00:18:58 ◼   ► and the kind of under the hood improvements that we get,

00:19:02 ◼   ► you know, that were made possible this year.

00:19:04 ◼   ► Like there's huge amounts of stuff with,

00:19:07 ◼   ► you know, I remember in our kind of like

00:19:08 ◼   ► Wants and Wishes episode we asked

00:19:09 ◼   ► for better UITableView stuff.

00:19:11 ◼   ► And we got a lot of that.

00:19:13 ◼   ► Like there was a, we have this whole new

00:19:15 ◼   ► difficult data source system that can, you know,

00:19:18 ◼   ► we give you dynamic and thoughtful updates to UITableView

00:19:21 ◼   ► to make sure you don't get into an inconsistent state.

00:19:25 ◼   ► That's great.

00:19:25 ◼   ► But if you have a current system that works

00:19:27 ◼   ► and that's just going to be made better,

00:19:29 ◼   ► you know, it's like that gets pushed farther down

00:19:32 ◼   ► the line in my mind.

00:19:33 ◼   ► Because ultimately, it's like what I want to do is,

00:19:36 ◼   ► you know, push forward those features

00:19:38 ◼   ► that people are going to notice.

00:19:39 ◼   ► That are going to get attention,

00:19:40 ◼   ► that are going to make my users life better.

00:19:42 ◼   ► That are actually going to be quality of life improvements

00:19:44 ◼   ► for them.

00:19:45 ◼   ► And then it's this process from there of working back down,

00:19:48 ◼   ► you know, progressively deeper in the stack.

00:19:50 ◼   ► Getting towards things that like start benefiting me

00:19:53 ◼   ► rather than my customer.

00:19:54 ◼   ► And like, I don't know if that's the exact right approach,

00:19:58 ◼   ► but what's something that I've found sort of over the years

00:20:00 ◼   ► that seems to work well is to have that,

00:20:03 ◼   ► just start with the user and work your way back

00:20:05 ◼   ► rather than it is so easy to get stuck

00:20:08 ◼   ► on the things that are exciting.

00:20:09 ◼   ► The things that are really cool and would make your life,

00:20:12 ◼   ► like the developer, you know, you or my,

00:20:14 ◼   ► or our listeners life easier.

00:20:16 ◼   ► Like those things are great, but they're also,

00:20:19 ◼   ► like no one's ever going to notice.

00:20:20 ◼   ► And like in many ways, like you know you're going down

00:20:23 ◼   ► a tricky road when it's a feature where your goal

00:20:26 ◼   ► is that the user doesn't notice.

00:20:27 ◼   ► Where your goal is that you've switched something out

00:20:30 ◼   ► under the hood and they should never be aware of it.

00:20:33 ◼   ► And if that's the case, like absolutely do that.

00:20:35 ◼   ► And that is a great feature for like, you know,

00:20:37 ◼   ► the end of the year, January, February,

00:20:39 ◼   ► when things tend to slow down and the initial,

00:20:43 ◼   ► you know, sort of push of this has settled out.

00:20:46 ◼   ► But that's sort of the general approach

00:20:49 ◼   ► I'm taking this year.

00:20:49 ◼   ► And I think the only slight exception to that is,

00:20:53 ◼   ► with SwiftUI on the watch, is an area that I feel

00:20:55 ◼   ► very conflicted about.

00:20:58 ◼   ► Because we finally have the ability to make

00:21:01 ◼   ► like a genuinely interactive, not kind of horrible

00:21:05 ◼   ► and broken watch interface.

00:21:07 ◼   ► And if you've listened to the show for a long time,

00:21:09 ◼   ► I love making watch apps.

00:21:10 ◼   ► Like, it's my jam, I love it.

00:21:12 ◼   ► And I'm very tempted to dive into SwiftUI,

00:21:16 ◼   ► probably sooner than I should.

00:21:18 ◼   ► Because it's a very young, it's a very young framework.

00:21:21 ◼   ► I mean, I'm sure it's been developed

00:21:23 ◼   ► and been working on for years at Apple.

00:21:24 ◼   ► But it's not something that has been out in the public,

00:21:27 ◼   ► and been battle tested, and is in wide use by Apple itself.

00:21:31 ◼   ► And it's something that is very young.

00:21:34 ◼   ► And it was a funny thing I kept saying this last week,

00:21:36 ◼   ► is that I felt really smug for never learning auto layout,

00:21:40 ◼   ► never learning size classes, never learning storyboards.

00:21:44 ◼   ► Like, there's all these UI frameworks and platforms

00:21:47 ◼   ► that Apple has introduced over the years,

00:21:48 ◼   ► and I never used them, because I was just happy

00:21:50 ◼   ► doing what I was doing.

00:21:51 ◼   ► And here's another one they're presenting.

00:21:53 ◼   ► And I think the effort behind it makes me think

00:21:56 ◼   ► it's a bit more comprehensive than those kind of things,

00:22:00 ◼   ► those previous UI paradigms, which were all about

00:22:03 ◼   ► taking the old version and making it better.

00:22:06 ◼   ► But the reality is, if I want to make cool watch apps,

00:22:08 ◼   ► I'm going to need to learn it.

00:22:10 ◼   ► And I kind of want to start making those now.

00:22:12 ◼   ► But in my mind, that's my dessert at the end of the summer

00:22:16 ◼   ► for hopefully when, hey, the bugs are kind of starting

00:22:18 ◼   ► to get worked out, and we're on beta six of the Swift UI,

00:22:23 ◼   ► which is hopefully going to be a lot better than it is now,

00:22:25 ◼   ► where I chewed through 35% of the battery on my laptop

00:22:30 ◼   ► at the airport trying to work on it for 10 minutes.

00:22:33 ◼   ► And Xcode was using 600% of my CPU doing the live preview.

00:22:38 ◼   ► And I don't know why.

00:22:39 ◼   ► It wasn't like I was building this crazy complicated thing.

00:22:42 ◼   ► But that's developer tools.

00:22:43 ◼   ► It's the first beta of something that is clearly not,

00:22:47 ◼   ► has not been optimized for battery performance

00:22:50 ◼   ► at this point.

00:22:52 ◼   ► That is not what it's there for.

00:22:54 ◼   ► And so maybe beta five, beta six,

00:22:57 ◼   ► that's a good time to pick that up.

00:22:58 ◼   ► And in the meantime, focus on anything

00:23:00 ◼   ► that the user is going to see.

00:23:01 ◼   ► And then I suppose there's also this other side thing

00:23:04 ◼   ► of deciding what we're going to do with adoption

00:23:06 ◼   ► in terms of requiring iOS 13 or watchOS 6.

00:23:11 ◼   ► And deciding that now because it gets really awkward

00:23:14 ◼   ► to kind of, either you need to intentionally be developing

00:23:17 ◼   ► in parallel features or you need to decide now

00:23:21 ◼   ► that you're going to cut support

00:23:22 ◼   ► and be able to push that off

00:23:24 ◼   ► and deal with deprecation in that way now

00:23:28 ◼   ► because deciding late in the summer

00:23:29 ◼   ► is just going to mean that you've either done double the work

00:23:31 ◼   ► or you've dug yourself into a big hole.

00:23:34 ◼   ► - Yeah, I mean, my usual approach to that

00:23:37 ◼   ► is to take advantage of the fact

00:23:39 ◼   ► that I'm a one-person company with lots of early adopter users

00:23:43 ◼   ► and just require the new OS pretty soon after it's out,

00:23:46 ◼   ► either on day one or maybe a couple of weeks

00:23:48 ◼   ► or a month later.

00:23:49 ◼   ► 'Cause the people on the old OS,

00:23:52 ◼   ► the old apps that they have that won't auto update

00:23:55 ◼   ► to the new version still work.

00:23:57 ◼   ► Overcast, 2019 point, whatever it's going to be,

00:24:01 ◼   ► when the new version ships, that's still going to work

00:24:06 ◼   ► for a while probably.

00:24:08 ◼   ► And this year, last year, the iOS 12 transition

00:24:11 ◼   ► didn't cut off hardware support for any devices,

00:24:13 ◼   ► but this year the iOS 13 transition does.

00:24:15 ◼   ► So there is some argument to hold back a little bit,

00:24:20 ◼   ► but ultimately, for me, I'd rather lose those users

00:24:25 ◼   ► 'cause that's, lose them having the latest version

00:24:28 ◼   ► because it is a relatively small percentage

00:24:30 ◼   ► after not too long than have to write

00:24:34 ◼   ► two different code bases or have to, if available,

00:24:38 ◼   ► all this stuff in my code and add to my workload

00:24:42 ◼   ► and add to my maintenance and then get reports about like,

00:24:43 ◼   ► oh well, if you do this certain thing with the new version

00:24:47 ◼   ► on iOS 12, it crashes, and then I have to bring up

00:24:50 ◼   ► an iOS 12 instance of something or have a test device

00:24:52 ◼   ► lying around for that.

00:24:54 ◼   ► That's no fun.

00:24:55 ◼   ► And for a one-person shop, that is a pretty big burden.

00:25:01 ◼   ► So I always plow full steam ahead and require the new thing

00:25:04 ◼   ► pretty much immediately, and that has worked out fine.

00:25:08 ◼   ► - I will say, this is one of those years

00:25:10 ◼   ► where I am sorely tempted to go down that road,

00:25:13 ◼   ► where I think typically I take the same approach

00:25:15 ◼   ► that you take of, or that you don't,

00:25:18 ◼   ► I take the opposite approach of supporting

00:25:21 ◼   ► one or two levels back, but this year I feel like

00:25:23 ◼   ► I'm very tempted by what you do because it does feel

00:25:26 ◼   ► like the kind of year where pushing the,

00:25:30 ◼   ► it's like the platform itself is being pushed

00:25:32 ◼   ► so far forward that trying to hold onto the past

00:25:36 ◼   ► is just going to feel awkward in a way that,

00:25:39 ◼   ► and certainly obviously on the watchOS platform,

00:25:42 ◼   ► that's going to be, you can do night and day difference

00:25:45 ◼   ► between the two platforms in terms of on watchOS 5

00:25:48 ◼   ► and watchOS 6, and supporting them both in parallel.

00:25:51 ◼   ► They're two very fundamentally different systems,

00:25:54 ◼   ► and so having a, essentially all you could do

00:25:58 ◼   ► is take the old version of the app and leave it

00:26:01 ◼   ► in its own little UI tree, often a little,

00:26:05 ◼   ► it's like put it in a box off in the corner,

00:26:07 ◼   ► and if you happen to launch on that device,

00:26:10 ◼   ► like you go into that box and you stay in that box.

00:26:13 ◼   ► But, and then if you're running the latest stuff,

00:26:16 ◼   ► you get the new thing, but, and the reality is,

00:26:18 ◼   ► I think, it's like, I think this year I'm so tempted,

00:26:21 ◼   ► I'm not there yet, but I'm so slowly tempted by the,

00:26:24 ◼   ► you know, like the dark side of what you're talking about,

00:26:27 ◼   ► Marco, because it's like, it is, Apple has done

00:26:31 ◼   ► such a good job of being really annoying

00:26:34 ◼   ► about watch, about updating to the latest stuff.

00:26:37 ◼   ► Like, they are annoyingly aggressive about it.

00:26:40 ◼   ► You know, every time I pick up one of my testing phones,

00:26:43 ◼   ► it's like, it's every, it feels like every two or three

00:26:46 ◼   ► hours, it's like, hey, you know there's a new version

00:26:48 ◼   ► of iOS, hey, you know there's a new version of iOS.

00:26:50 ◼   ► And then like, watches are even the same way now.

00:26:52 ◼   ► Like, they're very aggressive about it,

00:26:55 ◼   ► and they get around the problem of not making it

00:26:58 ◼   ► so that you could, that it takes so long to do the update

00:27:00 ◼   ► by saying, hey, the next time your watch is on a charger,

00:27:04 ◼   ► we'll go ahead and install it for you.

00:27:05 ◼   ► You don't have to do anything.

00:27:06 ◼   ► And so then, like, more likely than not,

00:27:09 ◼   ► that's going to happen there.

00:27:10 ◼   ► And like, I've seen right now, you know,

00:27:12 ◼   ► watchOS adoption is very, very good.

00:27:13 ◼   ► Like, of devices that can support watchOS 5,

00:27:16 ◼   ► I think I'm at like 98.8% are running watchOS 5.

00:27:20 ◼   ► Like, it is huge.

00:27:21 ◼   ► Very, very good from four to five.

00:27:23 ◼   ► And like, fair enough.

00:27:24 ◼   ► - That's better than the phone adoption rate.

00:27:25 ◼   ► - I think it is, and it's like, I think there's an element

00:27:27 ◼   ► of it's just so aggressive, and really, you know,

00:27:31 ◼   ► pushes people to do it.

00:27:33 ◼   ► And the reality is, like, there's going to be those people

00:27:36 ◼   ► who are on devices who we can't support

00:27:39 ◼   ► if that's the road we go down.

00:27:40 ◼   ► And like, that's frustrating.

00:27:42 ◼   ► Like, you know, if you're running a Series 0 watch,

00:27:45 ◼   ► or a 5S, a 6, or a 6+, like, you're kind of out of luck

00:27:49 ◼   ► with this new stuff.

00:27:50 ◼   ► But that's going to be a smaller and smaller group of people

00:27:53 ◼   ► and it's not really, like, that's the features

00:27:56 ◼   ► that are going to, you know, excite new customers

00:27:59 ◼   ► and excite Apple and excite people who are, you know,

00:28:02 ◼   ► who are going to write about your apps.

00:28:04 ◼   ► They're interested in the new stuff.

00:28:05 ◼   ► They're not that interested in the effort and time it took

00:28:08 ◼   ► for you to support the old things.

00:28:10 ◼   ► And so, like, this definitely feels like a year

00:28:12 ◼   ► where Apple has taken this inflection point

00:28:14 ◼   ► and they're, like, heading in a new direction,

00:28:17 ◼   ► and like, burning the ships and starting, you know,

00:28:20 ◼   ► sort of heading out with them,

00:28:21 ◼   ► maybe is, like, a good choice this year.

00:28:24 ◼   ► - Yeah, 'cause, you know, like, I'm not going to say

00:28:25 ◼   ► that there's no cost of doing this.

00:28:27 ◼   ► Like, there is a cost of losing the support

00:28:30 ◼   ► of the previous OS.

00:28:32 ◼   ► And it is significant for some apps.

00:28:34 ◼   ► But there is also a cost of not doing that.

00:28:37 ◼   ► There's also a cost of maintaining support on your side.

00:28:40 ◼   ► So, like, you have to weigh those costs.

00:28:43 ◼   ► And for certain apps or for certain companies,

00:28:45 ◼   ► it makes sense to, you know, keep the old support around

00:28:47 ◼   ► for a while, but especially for independent developers,

00:28:50 ◼   ► I think there's a huge argument to be had

00:28:52 ◼   ► of just require the newest thing and be done with it.

00:28:54 ◼   ► Because you save so much on your side

00:28:56 ◼   ► and your time is so precious as an indie, like,

00:28:59 ◼   ► that you might have to lose a few customers to do that.

00:29:03 ◼   ► But the cost difference might be such

00:29:05 ◼   ► that it actually makes sense to do that.

00:29:07 ◼   ► - Yeah, and I think one thing,

00:29:08 ◼   ► the only thing I'll say with that is,

00:29:09 ◼   ► if you are going to go down that road,

00:29:11 ◼   ► make sure your last version before you drop support

00:29:13 ◼   ► is a really good version.

00:29:14 ◼   ► - Yeah. (laughs)

00:29:15 ◼   ► - That's just a pro tip.

00:29:16 ◼   ► I've been down that road, I've made that mistake.

00:29:18 ◼   ► Don't do that.

00:29:19 ◼   ► Make sure it's a really, like, solid, bug-free,

00:29:21 ◼   ► like, excellent version that you would feel happy

00:29:24 ◼   ► running out into the future for who knows how many years.

00:29:28 ◼   ► - All right, with that, we're out of time,

00:29:30 ◼   ► so thank you for listening, everybody.

00:29:32 ◼   ► Good luck tackling all your stuff.

00:29:34 ◼   ► I'm gonna try myself and we'll report back in two weeks.

00:29:37 ◼   ► - All right, bye.

00:29:38 ◼   ► - Bye.

00:29:39 ◼   ► [ Silence ]