Six Months on a Mac

I promise I have some good things to say about it!

Published Mar 10, 2020

Six months ago, I started as a new engineer at Gusto, and one of the first new things I had to learn was how to use a Mac. There were a lot of other things, too, of course, like how Ruby works and what ACH is. But the Mac is what this post is about.

I went in knowing it would be different, so I started drafting this post on day one. But I kept finding things that surprised me! Now that the rate has slowed down, I can put thoughts into words.

Background

Before this, I’d probably spent less than an hour in front of a Mac. Well, as long as you start counting after I left elementary school, where we used (I looked it up!) an iMac G3. I’ve seen so many people rave about software development on a Mac, and I’ve seen my fair share of cafes and trains full of “startup standard-issue MacBook Pros”. I’ve spent a long time using Linux 1 on my laptops, and the Mac is still Unix at heart, right?

Anyway, why am I writing this?

  1. This will help me document some of my tweaks so I can rebuild my setup in the future when I inevitably misconfigure it.
  2. It seems like no one has ever written about this before! I couldn’t come up with a search query that returned anything useful for making the switch. Even searching “switching from Linux to Mac” returned results about switching to Ubuntu, even as far as the dreaded page 2 results.
  3. As written in the ancient laws of the internet, the best way to learn how to do something in Linux is to claim that Mac does it better, so it’s time to flip the script on that one ;)

Hardware

It’s a MacBook Pro (15-inch, 2019). I feel lucky that I don’t have to remember which half of the year my model was released in, but I’d still like a version number. Predictable IDs make me feel safe.

The Battery

I only find myself on battery during my commute. However, that commute is 90+ minutes of multiple Electron apps, an IDE, a massive Rails app in development mode, and at least ten Chrome tabs. I never have to think about the battery. Except when it makes that “bloop” sound when I plug it in. I guess they had to do something to indicate that it’s charging, but why not a visual indicator, like a light?

The Screen

The most important piece of a laptop is the screen, because without that, it’s just a very powerful keyboard. This screen is pretty good! It’s bright, it’s big, it’s 16:10 so I can fit more lines of code on the screen at once. But it’s glossy, which makes reading difficult in a well-lit environment. And somehow, as much as I swear I don’t touch it, there are fingerprints all over the screen, and nothing simple seems to be able to take them off. Oh well. I spend most of my time attached to external monitors anyway.

The Trackpad

I’ve mostly gotten used to the trackpad. I still feel like the speed and acceleration are off, but I don’t know if that’s because I just can’t use a trackpad anymore or because this one’s weird. Being on a rumbling train makes that even worse.

Especially bad for me is click-and-drag. I rely on double- or triple-click-and-drag to select text by word or paragraph. Without a dedicated button, I need a second hand to move the cursor while I hold the trackpad down, because you can’t tap-and-drag.

How do you middle-click without a dedicated mouse? I can use Command+Click to open links in new browser tabs (and Command+V to paste), but I don’t like aiming at a tiny close button to close a tab.

And the act of clicking the trackpad makes a “ka-tick” sound that feels artificial for some reason.

The Keyboard

The main input device! In the conversation-turned-rant version of this post, there were a lot more complaints here. I’ve since realized that they were mostly about keyboard-related software, though, not hardware.

Let’s start with things I thought I would hate, but actually turned out okay:

  • The short key travel actually isn’t so bad. But it might be the reason behind my very loud typing.
  • I don’t care about the virtual Escape key because I can map CapsLock to it at the OS level.
  • The Touchbar has never frozen on me, so I can always get to system and media keys. It would be more useful if I could bind my own actions on it.

And the things that aren’t okay:

  • Where did the right Control key go? I keep accidentally pressing (and holding!) the left arrow key, since that’s where Right Control should be.
  • The arrow keys themselves are in an awkward layout, too.
  • There are a bunch of missing keys! Home, End, PageUp, PageDown, and Delete are all hidden in the Function layer. I think I only discovered that by opening up Google Docs and hitting Fn+everything to see what they all did.

TouchID

I didn’t think I’d like having a fingerprint reader so much! It’s really convenient for meetings where I would usually have my laptop closed but need to look something up quickly. I like that login still requires my password after hibernate, which matches my alignment on security vs. convenience.

MacOS

(I think that’s what we’re calling it now!)

Prepare for some very specific issues. I’ve spent over ten years tinkering at this level on other OSes.

Multiple Workspaces

I wish there was some way to use multiple desktops more predictably, like workspaces in something like i3. I like to keep one window per workspace in most cases, so I need a lot of virtual space.

I bound Control+[N] to Desktops 1-10 (extending the defaults, I think). Early on, I would swear that they were re-arranging themselves on me. That’s because they were! There’s a setting to re-order desktops based on use, and I can’t believe it’s enabled by default!

I wish there was some way to see all open windows for all applications at once. Command+Tab only switches between most-recently used windows of applications, Control+Up shows all the desktops but windows can overlap, and Control+Down only shows you the windows for the current application. Since I keep everything mostly visible, I could Control+[Numbers] to quickly scan them, but the desktop switching animation takes way too long to make that worth it.

I use Spectacle (on recommendation from my teammates) to simulate the first level of tiling windows, but I really miss automatic tiling. I’ve heard of ChunkWM (now archived), which made me interested in yabai by the same author. Amethyst is the other option. They seem to be like bspwm and xmonad, respectively, which I’ve tried and disliked. I guess they’re both worth a try though, if I’m willing to “disable System Integrity Protection” (discouragingly dangerous!) for it.

Multiple Monitors

At work, I have a centered horizontal monitor with my laptop on a stand to the right. At home, I have a centered horizontal monitor with a vertical monitor on the right and my laptop on a stand to the left.

For a very long time, I thought I would have to live with Desktop 1 always being on the internal monitor. But I looked it up! In the display arrangement settings, you can drag the white bar representing the menu bar (?) between screens to mark the primary display! However, you can’t mark the secondary display, so the other desktops are ordered by magic.

There’s no first-party USB-C to mini-DisplayPort adapter, so I’m using two of the USB-C power + HDMI + USB-A dongles to attach my monitors. If I plug in the displays in the wrong order, I get the wrong one rotated.

When I plug the monitors in, the first desktop seems to be “split” onto all monitors. That means that if I want Spotify, for example, to occupy the first desktop on the internal monitor when I’m at my desk, I have to keep it on Desktop 1 when I’m undocked. But that’s where I want the first Chrome window to be in both cases, so sometimes I see Spotify when I want Chrome when I’m mobile.

I also have no idea how the desktops rearrange themselves when changing display count. Do they remember where they go? Or is it the windows that know?

Bluetooth Audio

This is actually awesome! It’s closer to “just works” than literally every other device I’ve ever connected my multiple sets of headphones to.

The only problem I have is that sometimes switching from mic-and-audio to just audio sometimes also switches the output balance to about 75% left. That’s three clicks and a drag to fix, but honestly, that’s a small price to pay for not having to think about it at any other time.

Night Shift

Having this built into the OS is cool! It’s made even better by having it connect to the existing location information (whatever that comes from), to handle latitude changes.

At first, it refused to access that location info, even when I had the correct permissions checked. Luckily, there’s an Apple StackExchange where the solution exists.

Keyboard Shortcuts

(This is the rest of the keyboard rant.)

Keyboard shortcuts exist in a global namespace. I understand that this makes it difficult to design for everyone’s needs and that you have to put the most common and familiar use cases first.

This is why I like conventions like C-c letter in Emacs, <leader> in Vim, and “don’t ever bind Super” in Linux. In these cases, there’s an easy place to put all of my keybindings so I don’t have to worry about applications binding over them. I also don’t have to worry about breaking other people’s muscle memory, since I can leave all the default bindings as-is. (That turns out to matter a lot in an environment where pair programming is encouraged.) Anyway, I don’t think there’s any similar convention in MacOS. I’ve seen both Command+Option+Shift+F8 and Control+Shift+Tab bound in RubyMine somewhere, so I don’t know what’s safe anymore.

On the other side, there’s the actions that a keyboard shortcut can be bound to. I think it’s really cool that I can bind a shortcut to essentially any menu item in any application. I haven’t used it yet, but that’s the kind of customization I know I’ll need when I have a real workflow. But even with that, I can’t seem to bind something that would simply focus a specific application. I also don’t have a way to focus the next monitor in series, or to focus a full-screen window without pressing Control+Arrow multiple times. And I there has to be a keyboard-compatible way to dismiss a notification, right? I can’t find it.

Software Ecosystem

Homebrew is great! I can find almost everything I want there, but searching is a bit difficult. Nix and the AUR have spoiled me there, so it’s a lot to live up to.

I miss dragon-drag-and-drop (usually found as dragon) that lets me drag files from a terminal to a GUI application. The other direction is already easy. My workaround is using open . to get a Finder window at the current directory, but I still have to visually find the file again, because directories seem to remember how they were sorted last.

Third-party Mac applications seem way more polished than their Linux equivalents. Even if they’re not officially packaged, they still adhere to OS conventions and don’t re-invent the GUI toolkit every time. I don’t know why that is, but I appreciate it!

Final Thoughts

This is still the beginning of my Mac adventure, so I’m still getting used to doing anything in a new way. I’ve at least developed a usable workflow, and I’m starting on customizations that aren’t available in the Settings GUI, like keyboard repeat rate.

I probably felt the same way switching from Windows to Ubuntu all those years ago, even if I don’t remember it now. Learning a new OS is hard!


  1. I recognize that what I’m referring to as “Linux” is always a specific combination of the Linux kernel, a GNU userland, and a curated set of supplementary packages and patches that are easily installed in that environment. However, since “Linux” is the closest thing we have to a brand identity here, I’ll use that as a shorthand for the collection of distributions as a whole. ↩︎