When I was a kid, Star Trek: The Next Generation was airing new episodes, and I was really obsessed. I watched every episode, and loved every one of them. I read the Technical Manual cover-to-cover about a zillion times.
Once I stopped watching ST:TNG, I basically stopped watching Star Trek altogether. I never really gave Deep Space Nine a fair shake, and I had moved along by the time Voyager aired. I was obliquely aware of it, but had never seen an episode.
My friend Jean MacDonald asked me to join her on Voyager Revisited to re-watch the season 2 finale and season 3 opener. Having never seen Voyager before, this seemed like a tall order, but it was more than worth it to have an excuse to talk to Jean.
I enjoyed the episodes, and very much enjoyed chatting with Jean. Whether you’re a lapsed Star Trek fan like me, or a super-fan like Jean, I think you may enjoy our discussion.
As Jamie Tartt would say, I’m not just a loser. I’m the loser.
This is because I completely forgot to link to my appearance on Football is Life last week. I joined Jean MacDonald, Peter Hartlaub, Jason Snell, and James Thomson to discuss the second epiosde of season two of Ted Lasso: Lavender.
In our discussion, we recapped the episode, discussed theories for where the show is going, found repeat appearances of old characters, and generally had a good time. Ted Lasso is easily one of my favorite television shows of all time, and it’s a complete pleasure and honor to be able to discuss it with such a great panel.
Watch the show, and then have a listen.
Many podcasts are best when they’re longest — it gives the hosts a chance to really air out their thoughts and go deep on subjects. Some, like Clockwise, are best when they’re so quick they end before they begin.
On this week’s episode, I joined fellow guest Simone De Rochefort, as well as hosts Dan Moren and Mikah Sargent. We discussed subscriptions we’ve added or culled during the pandemic, how we could make TV shows out of our Twitter bits, wielded magic wands and de-IPO’d companies, as well as gushed about our favorite technology used for travel.
Every episode of Clockwise I do is super fun, but this one in particular, I felt like all four of us were firing on all cylinders. It’s a great one to try, if you haven’t yet.
I make my living in an odd way, but I have many of the same career goals as everyone else. Most especially, I aspire for my work to be recognized by the press or — most especially — my heroes.
I’ve been lucky enough to have that happen from time to time. This week was one of those times.
It is an absolute honor to share that I guested on this week’s episode of Do By Friday. Do By Friday is nominally a weekly challenge podcast, but is so much more than that. I don’t really know how to describe it, other than a tour-de-force of pop culture, current affairs, and, really, life.
On this episode, Alex and Merlin were silly enough to give me a
soapbox to continue to spread the gospel of Fahrenheit, colleges in the
State Commonwealth of Virginia, Irish Spring, Cheap Trick, and more.
Don’t sleep on the after show, where we really go off the rails. As you do.
I’m so lucky to have been asked to join the show for an episode, and even more so to call these two wonderful humans friends.
As hinted earlier, I made a second appearance on The Incomparable’s Ted Lasso rewatch podcast, Football is Life.
On this episode, I was joined by my pals Moisés Chuillan and Aleen Simms, as well as my new friend Keir Hansen. We discussed what it’s like to move on from a curse; and how lighting things on fire is, in actuality, sometimes the solution to your problems.
I won’t stop talking about Ted Lasso, as it is easily in my top three TV shows of all time. I can’t wait for season two to start on 23 July. If you haven’t given Ted Lasso a try, please do. If you have, a great way to prepare for the next season is to listen to Football is Life recaps. 😄
I was overjoyed to join host Kelly Guimont and fellow panelists Kathy Campbell and Steve Lutz to discuss episode 3 of Ted Lasso for Football is Life.
On the episode, we cover Trent Crimm: The Independent. I had an absolute blast talking about one of my all-time favorite TV shows.
Seriously, if you haven’t taken the time to watch Ted Lasso, you must. I don’t care if you don’t like sports. I don’t care if you think you know the whole schtick of the show. I assure you: it doesn’t matter, and you don’t.
Once you watch the show, follow along with Football is Life and The Incomparable as we re-watch and discuss season one in preparation for season two releasing on 23 July.
And keep an eye out on the podcast; I may just be showing back up later. 😶
Last week, Paul Hudson wrote a far more actionable and, well, kind version of my prior post on the… undesirable state of Apple’s documentation. Paul’s post — Reimagining Apple’s Documentation — was largely framed around a WWDC wish list.
I’m taking this chance to make my own WWDC wish list. There are many others like it, but this one is mine. And really, it’s only two items.
1. Improved & Prioritized Documentation
Given my constant kvetching about this, it should be of no surprise that the #1 thing I want from Apple is improved documentation. I can’t stress enough: reading Paul’s post is a great way to see what kinds of actual changes Apple can make to improve finding and using their documentation.
But, as Paul said in his post, it’s more than just that. Apple doesn’t seem to prioritize documentation in the way I think they should. I could quote the entirety of Paul’s post, but this in particular stuck out to me:
No APIs mentioned in the WWDC Platforms State of the Union talk should be allowed to ship with “No Overview Available” as their documentation – either can the feature or prioritize documentation.
For my money, I think this should be true of all new APIs, but that’s not a particularly realistic expectation. Nevertheless, anything that makes it into the Platforms State of the Union — the keynote that’s aimed squarely at developers — should absolutely have fully cooked documentation to go with it.
I also loved this idea of Paul’s:
The top 100 most popular APIs should get either a screenshot or a video showing exactly how it works and what the result is.
Hear hear.
2. More Breadth to Combine
Easily my favorite new API to come out of Apple from the last couple years is Combine. It is a first-party take on ReactiveX, in many ways aping RxSwift in the best possible way.
Combine was introduced at WWDC 2019, and I immediately fell in love. Though it makes many choices I’m not sure I would, I immediately dove in, writing a series of blog posts comparing and constrasting it with RxSwift.
Combine also powers a lot of both Peek‑a‑View and a new thing I’m working on.
Politics Killed the Framework Star?
Last year, at WWDC 2020, I was super amped to see the improvements made to
Combine. I was hoping more than anything else to see a Combine knock-off of
RxCocoa. This hypothetical set of extensions would allow developers
to use Publisher
s that are exposed by UIKit controls such as UIButton
,
UITextField
, etc.
Unfortunately, that never landed. In fact, there were almost no updates to Combine in 2020. I was, and remain, really saddened by this.
I can only speculate why Combine didn’t get any more love in 2020, but if I were a betting man, I’d guess it’s politics. SwiftUI is the new hotness. Though some of SwiftUI is powered by Combine, a lot of what makes SwiftUI great could be similarly accomplished using Combine and “CombineCocoa”.
If I were the captain of the good ship SwiftUI, I would not be keen to see “CombineCocoa” off the port bow. If there’s an alternative to SwiftUI that leverages all of UIKit, but with some new affordances for faster and easier development, that’s a threat. I’d fire all my cannons, as quickly as possible.
To do so would be immature, and it would be against Apple’s best wishes. The best thing Apple can do is provide as many options for developers as they can. Why should I have to throw away my years-deep knowledge of UIKit just to use SwiftUI?
One of the things that made Swift great — from day one — was its ability to coexist [mostly] gracefully with Objective-C. The same is true of SwiftUI: UIKit and SwiftUI can [mostly] coexist without too many compromises. As a developer, this affords me the ability to use the right/best tool for the job: SwiftUI for things that are less interactive; UIKit for when I have intense/complex interactions, or need to have deeper control.
My money is on Combine being neutered — if not straight-up scuttled — by an over-zealous SwiftUI champion, politicking within Apple. I surely hope that isn’t the case, because a rising tide raises all boats. Giving developers like me the option to use whichever tool is the best fit for the job makes for better apps, and a better user experience on Apple devices. Dare I say, Tim, that it also increases customer sat?
What Does Combine Need?
To my eyes, there’s a couple of ways that Combine could be improved. In summary, it could mostly be summarized as “more breadth”.
Combine could most directly be improved by increasing its coverage of
legacy APIs. When Combine originally shipped, it included some very
simple but very useful bindings for URLSession
—
dataTaskPublisher(for:)
— and for NotificationCenter
— publisher(for:object:)
. I’d love to see many other Apple
APIs get this kind of basic Publisher
coverage:
That’s just a few that jump to mind off-hand. There are so many others that could stand to get the same treatment.
Another thing that I really wish Combine had — and which existed in some
early betas! — is a way to programmatically create a Publisher
with a
closure. Effectively, I’d love to have the equivalent of Future.init(:)
that worked for Publisher
s that signal more than once.
I know that this is one of the many neat things that is added in CombineExt,
but it’d be great if I could create Publisher
s via closure without having to
bring in an entire open-source project.
(See also some other neat CombineExt tricks like materialize
.)
Why Bother with Combine?
A keen-eyed observer may note that there are several technologies that are very close to landing in Swift that may obviate Combine entirely. Some obvious examples:
Both of these tools do a great job covering some of the Combine surface area. However, they leave out most of what makes Combine so great.
The Components of Combine
To my eyes, Combine is a combination of a few different things:
- A consistent way to do multi-threaded/asynchronous programming
- …including a consistent and understandable way of hopping between threads
- A consistent way to deal with asynchronous messaging:
- Callbacks
NotificationCenter
- Key-value observation
- A consistent way to manipulate streams of data
To most, the first two items — asynchronicity and messaging — may
seem like the stars of the show. Au contraire, mon ami. For my money, manipulation
is the real winner. Take a gander at the sidebar on RxMarbles.
There are so many classes of things one can do with an Observable
/Publisher
:
- Conditionals
- Combinations
- Filtering
- Mathematics
- Transformation
- Timing
Note that each of those groups above has many operations that can be performed.
It’s quite a bit more than just .map()
, .compactMap()
, and .flatMap()
.
It’s this incredibly broad and deep collection of operations that allows the canonical example of how powerful Combine/functional reactive programming can be:
let searchTerms: AnyPublisher<String, Never> = /* ... */
let searchRequestPublisher = searchTerms
// Don't send values until they've been
// static for at least 0.3 seconds
.debounce(for: .seconds(0.3), scheduler: RunLoop.main)
// Don't send values until they're
// more than 3 characters
.filter { query in query.characters.count > 3 }
With this combination of a timing operator (.debounce(for:scheduler:)
) and
a filtering operator (.filter(_:)
) makes it possible, with two lines of code,
to ensure that searchRequestPublisher
only gets new values when the text the
user input has been still for 0.3 seconds, and is more than 3 characters.
Actors and async
/await
Aren’t Enough
All of these things are absolutely possible with Actors, and with async
/await
,
but there is so much more code required.
async
/await
— or, at least, my understanding of it today — makes
asynchronous programming easier to both write and reason about. Asynchronous
code written using async
/await
looks, at a glance, almost identical to
the synchronous code we are all used to.
Actors build on the vast improvements of async
/await
and, via convention
as well as compiler rules, prevent race conditions, and generally
ensures improved safety, particularly around threading and data access.
All of these protections and affordances are important. In some cases, even
as a devout Combine fan, I can absolutely see myself turning to async
/await
or Actors in order to accomplish a task. Here again, that’s what makes all
these technologies so great: they permit me to use the best tool for the
task at hand.
So, Apple, my wish is for you to re-discover Combine, refine it, and build it out. However, reading the tea leaves, right now I’ll happily settle for you not sending Combine out to pasture. 🥺
One More Thing
The iPad hardware is ridiculously powerful. Please, please, can we have some software improvements to match? Some things that I prefer to do on my Macs that I can’t do nearly as effectively on my iPad:
- Managing more than two concurrent applications
- Any sort of proper software development
- Culling and ingestion of photos, particularly from my big camera
- Podcasting
Granted, not all of these things I necessarily want to do on my iPad, but it really chaps my behind that I can’t. Or if I can, without having so many gotchas and caveats that it makes it a waste of time.
You’ve given yourselves such powerful hardware. Let’s combine forces and make use of it, together.
Last week I also had the distinct honor of joining my pals Stephen Hackett and David Sparks on their phenomenal Mac Power Users podcast.
On this episode, we discussed my current gear landscape, what I’m expecting to upgrade soon, and how my iPad and iPhone fit into my working life. We also chatted about my Synology, my absolutely 🍌 photo management workflow, iOS development, Raspberry Pis, and David’s new project.
Mac Power Users is such a mainstay in our community; it amazes me I’ve been asked to be on it once, much less four times. (!) Hopefully I can convince David and Stephen I have at least a few more in me. 😏
Last week, I joined Max Roberts on his semi-new Max Frequency podcast. Max and I actually met through the Relay Members’ Discord, where he immediately endeared himself to me by sharing a couple of photos of Disney World. 🤩
On this episode, we discuss my recent foray into aerial photography, Formula 1 and Drive to Survive, video games (!), and three years (!!) of me being independent. Then, the tables are turned, and I pepper Max with some questions about what it’s like to work in The Happiest Place on Earth.
I really enjoyed talking with Max, and it was neat to discuss some stuff that I don’t typically have the occasion to chat about on my other shows.
This week I was happy to join Brianna Wu, Mikah Sargent, and Dan Moren on Clockwise. On this episode, we discussed Apple’s new iPad Pro, AirTags, Apple TV, and how we customize our hardware.
Clockwise is such a fun — if stressful! — show to do. Being used to being able to let my thoughts air out, being concise doesn’t exactly come naturally. 🙃 If you’ve ignored all my previous pleas to give the show a shot, now is a great time to dive in.