Replacing Redux in Swift with… something better?
--
Just as I was getting close to recording a video on Mail Pilot Discovery Edition’s new keyboard shortcuts, I noticed something horrifying.
They were a little… sluggish.
The Problem
When you’re scrolling around the Mail Pilot Discovery Edition interface, with all of its rendered email previews, the interface is buttery smooth despite how much is being rendered. I worked hard to make it extremely performant (redeveloping the entire interface twice to get it there). It is a super unique interface, and required stepping beyond convention to get it to work really well.
Once the keyboard shortcuts were working, moving messages felt fine. But… using your arrow keys to flip up and down between messages did not. You expect this particular interaction to be instantaneous — even more so than basically any other action, as it doesn’t feel as “heavy” of an action as, say, setting a reminder on a message and having it move out of the inbox.
Ultimately, I immediately knew the answer to the inevitable “but, why?”
I had finally hit the limit.
Way back in 2017, when I started developing this new generation of Mail Pilot, I knew I needed a better engineering paradigm for the entire app; convention over invention means that the entire codebase will be far more reasonable. With an email client, and its massive amount of state, its slow APIs (IMAP was invented nearly 40 years ago), the need as a user to get in and out very quickly, and all of the ancillary features that are expected today, a strong paradigm is the only way, in my opinion and experience, to get it right.
I settled in on a Redux implementation in Swift. Redux, as a paradigm, is super simple (you can read my article on this here), which allows you to keep very complex code in your mental model very easily during development. Maintenance becomes a breeze because it’s such a straightforward paradigm. And it eliminates novel invention among your codebase, so there’s rarely any guesswork as to why something is doing something it shouldn’t be.
This is why Facebook invented Redux in the first place: they had this phantom notification bug in their web app for years, where you would see a red “1”…