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:20
◼
►
- Which is a little overwhelming.
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: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: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: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: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.