This past Saturday, I joined my pals Kathy Campbell, Jean MacDonald, James Thomson, and Jason Snell to discuss the final episode of season two of Ted Lasso.

Without spoilers, this season of Ted Lasso hit me differently than the last. I really enjoyed talking with this fine panel of people about this final episode. The discussion helped me interpret the episode differently, and gave me a different perspective of the season at large. The focus of this episode of Football is Life is just the last episode — not the whole season — but we naturally had some broader conversations as well.

Ted Lasso remains one of my favorite shows of all time, and doing these wrap-up shows is immensely fun. If you’re a Ted Lasso super-fan like me, you’d surely enjoy Football is Life.


 

Football is, as they say, life. And though this season of Ted Lasso has been somewhat divisive, I’m overjoyed to have appeared on another episode of The Incomparable’s rewatch podcast, Football is Life.

On this episode, I join host Jason Snell, and fellow panelists Kelly Guimont and James Thomson to discuss Headspace. It’s a varied and long conversation about heel turns, parental issues, and running an enjoyable but meaningful comedy-drama.

I’ve praised Ted Lasso until I’m blue in the face. It’s a phenomenal show, and I’m extremely stoked to see where the bottom half of season two takes us.


 

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. 😶


WWDC 2021 Wishes

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 Publishers 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 URLSessiondataTaskPublisher(for:) — and for NotificationCenterpublisher(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 Publishers 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 Publishers 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:
  • 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.