+++
hook = "Very early impressions on Apple's new M1 architecture. Very fast, great battery, a little painful."
published_at = 2020-12-05T05:35:52Z
title = "Apple M1: First impressions"
+++

Apple's [M1 chip](https://www.apple.com/mac/m1/) is the most exciting hardware-related in a decade. We'd been expecting an interesting PC ARM chip from Apple all year, but no one knew just _how_ interesting it'd be. The fact that it's blowing even high-end Intel/AMD chips out of the water on its first ever iteration is nothing less than stupefying. And even better is the 15 to 20 hour battery life -- absolutely unheard of previously, and sure to change the game once people are back on the road. I haven't bought a personal laptop in about five years now, so when Apple announced their first set of releases, I ordered one immediately.

I'm far from the first to say it, but the M1's as good as advertised. It's very fast, the battery life is _insane_, and Rosetta works well enough to make transition between architectures as painless as it could possibly be.

Every problem I've run into so far is a growing pain, but even so, they might be enough to justify holding out for a few more months. Vendors are making decent progress on releasing universal binaries for major apps, but it's a mixed bag. Some have transitioned already including Alfred, Chrome, iTerm, and Slack. Others are laggards including 1Password, Divvy, and Dropbox. The latter run more or less fine, but staring at CPU and memory usage on a new Dropbox sync made me afraid that my new computer would melt.

Homebrew is a mess (although a [well-organized one](https://github.com/Homebrew/brew/issues/7857)). The current recommendation is to maintain two separate installs -- one for ARM and the other for Intel. Compile ARM-compatible programs where possible, and fall back to Intel where it's not. To facilitate this I have Homebrew's ARM compatibility list bookmarked, and some new shell aliases that I never expected to need:

``` sh
alias abrew='/opt/homebrew/bin/brew'
alias ibrew='arch -x86_64 /usr/local/bin/brew'
```

It's certainly not pretty. The situation will eventually resolve itself, but we'll be well into 2021 by the time it does.

What's been giving me the most trouble so far is Go. Its been slowly adapting to M1, but doesn't expect a compatible release until [February](https://tip.golang.org/doc/go1.16). It often works under Rosetta, but something like 30% of my builds mysteriously fail, stall, or go rogue. After noticing my battery being drained more quickly than expected, I checked `ps` to find three phantom `go build` processes which should have ended hours ago, still alive, and each eating 100% CPU. This is a bit of a problem because Go makes up the majority of my personal programming. I've taken to SSHing into my Intel machines to reduce pain.

But, the upsides are definitely there. I haven't put the battery under true duress, but today coded a good 8+ hours on it (mostly in Vim, some compiling, some browser use), and by the end of the session, it was reading ~25%. That's pretty incredible, and I feel comfortable making the call already that this is the new developer dream machine, especially once the kinks are ironed out.
