Linux user meets macOS
I decided to buy myself a nice shiny new computer.
Status quo ante
For several years preceding the start of the current one, my daily driver machine has been a Thinkpad T460. The hardware has served with flair, and in spite of years of extended daily usage and occasional surprise visits to the floor, it has remained in one piece and in good working order.
From a software standpoint this machine has been running Debian Stable since the day I got it. Much as I would like to claim that I’ve been running a single continuous Debian install since then, I did have to reinstall at one point along the way, as I mentioned in a previous post a few years ago.
People do occasionally joke about the software versions in Debian Stable lagging behind the latest upstream versions (I’m looking at you, NixOS unstable users!), however I also very much enjoy not having to worry about significant or breaking changes to my operating system more than once every two years. It’s been a long time since I ran Arch Linux on my NAS, and I have vastly less free time now than I did then.
Other than that, I’m running a fairly boring i3wm configuration, and most of my life lives inside a terminal emulator, Firefox tabs, Thunderbird, and (to my slight irritation) a slowly increasing number of chat applications.
English Wikipedia tells me that the T460 dates from 2016, and in the past year or two it has been starting to show its age. A RAM expansion was a well-earned mid-life upgrade, however the CPU has become a bit of a sore point. At some point I got it into my head that the CPU’s thermal power dissipation is low enough that it almost doesn’t need active cooling, however I don’t have any references on hand to back that up.
The desktop responsiveness of my T460 has been perceptibly lacking, especially since using a considerably newer Thinkpad with an AMD Ryzen chipset at work as a comparison point. It’s not clear whether this is purely a matter of available CPU cycles, or whether playing around with the kernel task scheduler might make a difference. I also have hyperthreading disabled on the T460 out of vague and poorly-defined concerns about security; I make no claims about whether this is well-justified.
My T460 has a 1366x768 display, and while I would really like to say that this is resolution enough, I’ve really been spoiled by the pixel density of contemporary smartphones and 1440p and 4K displays getting to the point where they’re readily available second hand.
There is a significant upshot here in that the lower CPU power and display resolution are both very good for battery life. The T460 is old enough to have two separate batteries, one internal and one external. With an expanded external battery, and accounting for battery wear, my Thinkpad reports an overall power density of 80 Watt-hours. Under light usage, the machine easily lasts an entire day on a single charge.
Philosophical interlude
There is a scale with idealism on one end and cynicism on the other. Somewhere on this line lies pragmatism. As with anything else, technology choices come with tradeoffs.
In the past I’ve cared strongly about owner control of my devices, which is either how I got into Linux in the first place or because I got into Linux in the first place – I was once upon a time a very enthusiastic tinkerer. This is how I ended up using Thinkpads, given that they intersect good driver support and reasonable durability. I run Android on my phone for similar reasons, given the ecosystem of third-party ROM’s and gratis open source software.
Of course, this points at a trade here. Linux’s hardware support has not always been so good in consumer hardware (though I have no idea what that’s like these days), and the software ecosystem is something of a mosaic. The fragmentation can make developing applications for Linux dubiously tractable, and there are still settings where Linux users are a poorly or not at all supported special case.
On the other hand, I have a lot of friends who are contented macOS users – and this is entirely reasonable, as macOS has some nice things going for it. Apple certainly knows how to make pretty computers, and sometimes aesthetics matter – as far as the Thinkpad is concerned, reducing the text size in the browser so I can fit more words on the screen works up until the display runs out of resolution for legible text rendering.
It’s certainly quite convenient to have a computer which stays cool to the touch even in 35 (Celsius) degree weather during the summer, and can nonetheless still tear through more demanding computational tasks like video streaming in between the heat waves. Apple integrates vertically, which the user experience also benefits from greatly. Not everyone wants to take a box of software Lego bricks to build their own bespoke user interface. I’m told that Apple’s accessiblity functionality is also very, very good, though I haven’t used it myself.
Good things come with a price however – both in terms of how much lighter your wallet becomes after buying a computer from Apple, and in how much Apple keeps their fingers wedged into it after they’ve handed it over to you.
Any tradeoff is influenced by what you’re trying to achieve.
It’s like threat modelling: what are you actually up against? Idle web browsing, watching Netflix, video conferencing, or rebuilding the Rust compiler? A machine which can chew through Haskell builds like a hot knife through butter can probably handle these tasks just fine, but it’s not necessarily going to be as portable as a butter knife.
I can comfortably do a little bit of coding here and there on my Thinkpad, which was a good match for churning out university coursework back in the day. However, it’s a bit bulky and gets a bit too hot for comfortably watching films in bed, and the CPU really struggles with video conferencing, which is decidedly suboptimal in the current age. My leisure time these days, alas, features much more media consumption and socialising than software development.
My requirements have changed, and hence the tradeoffs I’m willing to accept as well.
The Darwin side of the Force
I was originally going to write “sometimes, idealism is for suckers” at the start of this section, but on balance I think that’s a bit mean. Regardless, I bought an M2 MacBook Air earlier this year.
The hardware is sleek. It’s an Apple product, so that probably goes without saying. Nonetheless I’m very impressed with how thin the machine is. I’m not sure how it compares to the Thinkpad in weight, however it slips into the back of my rucksack and is more comfortable to carry. It’s light enough that I’ve developed the incredibly bad habit of simply throwing it across the room from my desk to my bed and trusting that the bed is clear of obstacles.
My initial impressions of the battery life were a little underwhelming, however I adjusted my expectations when I realised my point of reference was a seven year old Thinkpad with considerable extra battery capacity strapped on. The MacBook battery comfortably lasts a day or two of light usage, and given the ubiquity of USB-C chargers in my social life I don’t need to worry about forgetting a charger of my own. In comparison, my Thinkpad slightly predates USB-C, and uses the weird proprietary Lenovo power adaptor which externally looks like a USB-A plug – these are considerably less ubiquitous in my social life, so knowing where one’s charger is is much more important there.
The first draft of this post was left neglected for over three months before I got round to finishing it, so the memories of the unboxing and first-boot setup experience are lost to the wind. The UI is otherwise fairly pleasant overall, and in spite of its (apparently well-known?) quirks and shortcomings, the floating window management is a nice chanage. I find this works better than tiling for me on larger displays, though I might just not have had enough practice using i3 on big screens.
The UI is mouse-oriented, and the touchpad gestures integrate with the window management splendidly, though I got used to the gestures so quickly that I’ve had difficulty using macOS with a mouse. I’m less enthusiastic about the keyboard, as the key travel distance is much shorter than that of my Thinkpad, and I’ve found that prolonged use causes some wrist pain. While I initially developed a strong preference for the MacBook over the Thinkpad, overuse of the MacBook keyboard contributed to me straining my wrist a month or two ago, so more recently I’ve been preferring the Thinkpad for more keyboard-oriented activities when I’m not sitting with my ergonomic keyboard.
As for application software, I’m using Homebrew – that’s what my macOS power user friends are using. I considered installing Nix, however I use Nix at work, and this is meant to be a leisure machine. Homebrew also integrates with native applications (so they’re visible in the spotlight search and so on), which to my knowledge Nix does not.
The difference in performance between the two laptops is stark. That much is obvious on paper – going from a seven year old dual core chipset which traded performance for power consumption to a contemporary many-core heterogenous chipset (running an operating system which is vertically integrated for this hardware) is a big step up for sure. But it’s another thing to observe that in practice. One of the first things I noticed with the MacBook is that it reloads webpages in Firefox much quicker than the Thinkpad, and I’ve also found that some web applications (including some instant messaging clients which will remain unnamed) are much more responsive on the MacBook. The thermal efficiency goes without saying, as all the Apple Silicon MacBook Air’s are passively cooled.
Appendix: tweaks and tricks
Some of the accumulated wisdom from the road.
I’m partial to the Ubuntu font family. Fonts on macOS are managed using the
Font Book.app
system application, which allows you to drag and drop downloaded TTF files into the window to import fonts into the system font library.Homebrew has an extension called homebrew-bundle which allows specifying packages to install as a list specified in an aptly-named
Brewfile
. This is useful for bootstrapping new machines without having to manually keep track of which packages you have installed and copy around unwieldybrew install
one-liners. You can also tell Homebrew to uninstall all packages which aren’t listed in a givenBrewfile
, which is a nice touch for garbage collection. (The Nix users in the audience can sit down, I already know what you’re going to say.)If you’re in the unfortunate position of using GnuPG, there is a pinentry program which uses the macOS-native UI toolkit for displaying PIN popups. It’s available in Homebrew as
pinentry-mac
, and can be configured by putting this line into~/.gnupg/gpg-agent.conf
:pinentry-program /opt/homebrew/bin/pinentry-mac
macOS on Apple Silicon comes with a compatibility layer for running iOS apps, which is really convenient.
By default
sudo
is configured to authenticate using passwords only, however authentication using Touch ID is also possible by inserting the following line at the top of/etc/pam.d/sudo
:auth sufficient pam_tid.so
This file is however overwritten on OS updates, so if you want to keep this configuration you have to edit the file again after every update.
The system keyboard settings have a lot of configuration knobs. I have the caps lock key mapped to control so applications with Emacs-like keybindings don’t obliterate my left pinkie.
I have multiple keyboard layouts configured in order to get working spell checking for different languages, though I only regularly use a single layout. When multiple input methods are enabled, macOS automatically activates keybindings on control-space and the function key for switching between input methods, however I have these disabled so I can use the default
C-SPC
binding in Emacs with the function key bound to the emoji picker.Speaking of Emacs, by default Emacs takes control of both command and option keys on both sides of the keyboard, and maps them to the super and meta keys, respectively. However, this means that you can’t use system keybindings like command-C and command-V for copy and paste, or the option key for shifting onto a different keyboard layer to access special characters which aren’t on the base layer.
As a compromise, I have the right option key configured as Emacs meta, and the left option key configured as macOS option:
(when (equal system-type 'darwin) (setq mac-right-option-modifier 'meta mac-option-modifier 'none))
(The choice of the right option key matches the layout on my Kinesis keyboard I use with X11 on Linux, which puts the meta key under my right thumb too.)
A similar situation arises with iTerm2, where by default the option keys are mapped to the macOS default function, which leaves some useful readline key chords inaccessible. This can be configured on a per-profile basis in the profile keyboard settings.
Was it worth spending that much money on this computer? Yeah, I think it was.