It’s been a while since my last update. I wrapped up my sabbatical, did a whole bunch of interviewing, and have since been working on some interesting spreadsheet-related problems at a new job.
Oh, and there’s been a global pandemic on, it’s been weird. Anyway, I kept busy over the last year and a bit:
Switched to Windows
I switched to Windows full time, after a lifetime of Macs for personal use and a decade of Windows for professional use.
This was an experiment in intentionally shaping my own interests; I knew that if I used Windows at home I’d be more interested in the minutia of making good Windows applications.
It worked; I’m just over a year in, and I’ve learned a lot. I still miss a lot of things about macOS but I’m mostly happy on Windows. The Surface devices are really neat pieces of hardware.
I built my own music player. This was the culmination of something I’ve been thinking about for years; I listen to a lot of long-form music and existing music services don’t serve that niche well. iTunes is progressively less interested in catering to users who bring their own music, and the Windows client has many irritating bugs.
So I decided to build my own music library system with an offline-first native client; how hard could it be? Well, 500+ commits later…
This was a fun opportunity to get my hands dirty with a distributed system; I designed it with easy push/pull metadata syncing across multiple clients. It also made me grapple more with the current state of client applications on Windows, which led to:
Windows native development deep dive - WinRT/UWP/WinUI/Project Reunion
I missed the culture of high-quality native apps from macOS, and I wanted to make ReiTunes feel like a proper native Windows application. After some agonizing, I decided to build it as a UWP application; I’d heard many complaints about the limits of UWP in the past, but the UWP applications I used on Windows often felt better than the alternatives (especially on touch devices).
UWP was largely rejected by people building enterprise applications for Windows (or to be more accurate, UWP rejected them) so it was mostly new to me. My feelings about the area are complex and I’ll probably write about them another time, but some high-level thoughts:
- The Windows team is currently catching up from a lost decade with Project Reunion. This comment explains it well.
- The development experience of WinUI is similar to working with WPF XAML. Some nice improvements have been made in binding and animation, but many pain points (styling, verbosity) still remain.
- The Windows Runtime APIs are remarkably extensive; it’s sad how much work went into them only to go mostly unused.
- It will probably be another year before WinUI 3 is useful in production scenarios, and I suspect that’s going to be too little too late. Blazor Desktop will make Electron-like applications much more attractive.
I would not recommend that most people learn UWP in 2021. You can deliver a user experience that is nicer than many alternatives, but there’s a lot to learn and it’s unclear how much will be obsolete soon. But conveniently, I was stuck at home with a lot of free time; it really gave me a better understanding of where Windows has been recently and where it’s going.
Overall, I’m mostly optimistic about the future of Windows. Some very good people are working on Project Reunion, in particular Rich Turner who drove a lot of the WSL and Windows Terminal+ConPTY work. I’m confident that Windows is moving in the right direction, but time will tell if it’s moving quickly enough.
I’ve been doing a lot of .NET performance work and it’s been really fun. It’s satisfying to chip away at a slow process and speed it up bit by bit; I’ve made the main product I work on an order of magnitude faster, which starts to open up some cool possibilities for interactive use.
This past year has given me the opportunity to build a few greenfield projects where interactivity and immediate feedback are critical. It’s been a steep learning curve; I mostly focused on back-end systems in the earlier stages of my career, and if I’m being honest I looked down a bit on front-end work as being easier. Was I ever wrong!
Trying to build performant interfaces has been a great learning experience; I’ve never had to deal with so many multithreading and concurrency problems before.
This has some nice synergy with the performance work.