When I was in highschool I started writing a game in Qbasic. Along the way, I wanted it to have a console (like Quake) where you could enter commands and modify the game as you were running it. This lead me to create a scripting engine in Qbasic, and long story short, I’ve been on a yak shaving epic quest now for almost 30 years now. No game, but I have a hybrid C / Lua game engine/general purpose application platform. Still tinkering and still no end in sight. I’m having fun though!
I couldn't figure out the 3D math for quake, or write a fast texture mapper, so I stuck to working on things like Doom level editors.
But, I loved the quake console so I made a similar thing for my editor, basically just a hot key that swung it down and I could change a few hard-coded variables and added some commands like loading/saving files.
I always liked yak shaving, but avoided it because I knew it came with costs and tradeoffs. More recently, with the help of AI, I’ve been doing lots of it, as the costs and tradeoffs have greatly diminished. In fact, I’ve learned that building my own tools and frameworks, when done properly, comes with huge performance benefits and helps me understand the problems I’m trying to solve much more deeply. There has never been a better time for yak shaving!
Personally, I find it difficult to competently reason about a system unless I've built my own version of that system. So if you make a practice of building your own versions of things, you end up with a more robust mental library of how stuff works. For this reason, I've never seen yak shaving as a waste of time. The yak shaving was at least 50% about loading the abstractions into my brain fully.
I was taken by Christopher Priests book The Extremes and sat down to write a blog post about what compelled me so much about it, and wanted to add some gifs to it. In particular the "deja vu" scene from The Matrix, but I couldn't find it, and I no longer have an old version of Photoshop around to create the gif myself, and three weeks (and many tokens later) I'm finishing up an xcode MacOS native app that is dedicated to generating gifs. I've still not written the blog post.
Yak-shaving-shaming puts limits on the creativity of talented engineers by constraining them to existing patterns and practices or building on top of abstractions, and practically, that results in engineers and teams with less breadth. In an applied software world that's exploded in framework and library complexity in recent years, I think there are always going to be yaks in dire need of a shave.
This is one of the reasons I’ve never liked the aphorism "make it work, make it right, make it fast." By the time you get to the last point, say, having used Electron to build your graphing calculator, it is far too late to magically make it fast, like trying to make a Boeing 787 into a Cessna.
At a previous job, my coworkers coined the term "Thomasing" [1], referring to me, as "the act of having a question explained so thoroughly, detailed, and long-winded that the asker has lost interest in the question that they were asking".
I thought it was pretty funny, because that does basically describe me in a nutshell.
[1] Lovingly, it was a good, fairly-tight-knit group, they weren't being jerks. We all did lighthearted ribbing.
(Non short video format - https://youtu.be/AbSehcT19u0 ... When in the office I had a QR code of that so people could scan it and understand what I was working on)
My current after work activity is building a basic window manager (on top of river[1]) and asking myself what I am doing with my life. I'm not sure if I needed to read this or if this is the last thing I needed to read. It's not even so much fun as a kind of burning curiosity. "Shaving this yak would be stupid and unnecessary, I'm not going to waste my precious time doing it. ...but if I were to shave this yak, I wonder what would it look like?"
Also, Ren and Stimpy, there's a blast from the past!
> This blog doesn’t use a static site generator or framework like Jekyll, Hugo, or Gatsby.
I guess that's why the blog name stays on screen and covers the text when I scroll down, with fully transparent background so it doesn't even cover the article text, it blends with it which distracts my eyes a little too much. If it was any other blog post I'd be certain it's a bug, but here I'm not sure if it isn't intentional, and one of those customization a ready-made software wouldn't let them do.
This feels like what is really splitting the programming community right now- those that have typically enjoyed the journey, and those that just want to be at the destination as soon as possible.
They are different things. There are projects where I deeply care about the code, and projects where I deeply care about the end result. And a whole lot in between, or that are entirely throwaway.
But I use AI also for some of the ones where I deeply care about the code, now. E.g. my terminal is in Ruby, and it worked well enough, but over the last couple of days I had Claude put together a test harness and burn down a number of sharp corners and refactor the code. It's not perfect still, but it's cleaner than it was because I didn't have time to do enough yak shaving myself. I do care about that codebase, because I have other things I want to use it for, and not having to do it all manually gave me enough time to get it to a far better state.
I feel like a lot of the split comes from people who are a whole lot less overcommitted. If you have way too many projects, you pick and choose which projects you want to lovingly care for and which ones you just want to advance the functionality of as fast as possible. Sometimes those are one and the same at different times.
I’d argue most businesses have had their start through yak shaving.
I’ve found that the overuse of AI papers over a lot of problems. Then if things start failing people have no idea where or what to start fixing. I’m very much a destination person, but I’ve been on enough rides which crashed and burned to be cautious about it.
In my experience it's not as simple and depends on a whole lot of circumstances: generally I am interested to learn and to build. Give me pressure through dysfunctional processes, understaffed teams, unrealistic standards, too strong peer opinions- etc - and I'll happily reach for the shortest path.
It makes me of the difference between the indie developer who labored over Stardew Valley vs. (for example) Square Enix putting out a farming sim because their committee of suits decided they wanted revenue from that genre.
Speaking of things that I don’t buy. Metaphorically yesterday this site would gatekeep over enjoying the process of coding itself. People who merely programmed for a 200KUSD paycheck, pphew, disgusting.
Made a post about how you learned to touch type? Or improved something keyboard-related? “I don’t think that typing code was ever the bottlenck”.[1] Now we’re supposed to be grateful for non-deterministic code completion, ah it saves us millions of keystrokes a year.
Some will cry Goomba Fallacy. Yeah of course. Could be that many lurker accounts started posting more, displacing the gatekeeper typist hackers. Now it’s all of a sudden an even split. Huh.
The OP was not about AI. But thankfully there was a top-level meta comment to drag us down into that pit.
[1] The non sequitur of it all is a separate topic
I love this. My very own static site generator, Teeny [1], is going on five years now. It's 350 lines of hand-written JS and has powered all my blogs and personal websites for years. It currently powers https://yakko.dev.
I added plugins this year which made it really powerful and allows me to keep the core small.
I’ve been yak shaving the interfaces not the implementation.
I used ai to convert c headers into in nice zig code. Then I link to the library.
It’s cheap to use zig translate-c to convert c headers but the output isn’t nice.
You can give ai c++ source which usually has more documentation than the compromised flat c header. It allows you to do a better zig port. Zig greatly cuts down the noise in c headers as everything needs to have long prefix for namespacing. But in zig we can just nest things properly.
We can introduce intermediate layers to use proper tagged unions and distinguish ?T, *T, [*]T
> Of course, this is an extreme success story; most yak shaving fails.
To be fair, this is true for most things. Though that doesn't mean it's useless or not a worthwhile endeavor.
I think we often make a mistake by assuming that when there's no visible output that time was wasted.
When I was in grad school this hit me, and everyone I knew, pretty hard. But when looking back I think most of the progress I made was entirely invisible. Those "failures" are not so much failures as narrowing the search space. Unless you have a full understanding of the problem before you begin (lol[0]), then this is always going to be true.
Which made me change my view on a lot of things and realize you just need to trust people. Help people get unstuck and out of rabbit holes but just because there isn't visible progress doesn't mean there isn't progress. If we try to make all progress visible then the reality is we just misalign from our actual goals.
So Yak Shave. There's lots of hidden treasures, even if you don't think it's a treasure at the time
[0] bahahaha I'd love to live in that fantasy world. Nothing is so well defined, even when using formal languages like math. Exploration is always required (yes, even in research. No one plans everything before they start working. The difference between researchers and industry is just how much up front strategizing they do. But exploration always happens, even if through different mediums)
I can't blame them. I instantly know what they mean when they use that phrase, but I have to think just a little bit to remember what "yak shaving" means. It's a cute name, but it's not intuitive at all. You have to learn it.
As in most things I think it's a mixture of quantity and set and setting.
I enjoy a yak, but right sizing my yak is pretty important to my enjoyment of it. Maybe the yak doesn't get a full shave but gets a trendy hair cut, and that's okay.
I leave my yaks at home when I go to other engineers decision meetings, project kickoffs, or RFCs.
Glad you gave yak-shaving a proper definition. I was always annoyed at my boss for insisting on a particular arrangement of import statements in typescript files. For him, it was a way of telling us to be more mindful of the code we typed. But mostly I’d have preferred a simple eslint config with autofix on save. This kinda yak shaving is no fun - trust me
Internet Search Thing now tells me sable (for soft brushes) and hog hair (for wire-like brushes) is the best hair for this purpose. Oxen occasionally show up. Yaks nowhere to be found.
Coincidentally, this is also the first time I'm hearing about sable.
Hah!
I couldn't figure out the 3D math for quake, or write a fast texture mapper, so I stuck to working on things like Doom level editors.
But, I loved the quake console so I made a similar thing for my editor, basically just a hot key that swung it down and I could change a few hard-coded variables and added some commands like loading/saving files.
Upside: Only the features you actually need. Likely fewer dependencies. You know exactly what your yak looks like under the fur.
Stewart Butterfield shaved the shit out of two yaks at his video games company, which eventually became Flickr and Slack.
At a previous job, my coworkers coined the term "Thomasing" [1], referring to me, as "the act of having a question explained so thoroughly, detailed, and long-winded that the asker has lost interest in the question that they were asking".
I thought it was pretty funny, because that does basically describe me in a nutshell.
[1] Lovingly, it was a good, fairly-tight-knit group, they weren't being jerks. We all did lighthearted ribbing.
https://youtube.com/shorts/kSJgLA1frS4?is=2RA7C0EDEe7Mg8Fp
Also, Ren and Stimpy, there's a blast from the past!
[1] https://isaacfreund.com/software/river/
I guess that's why the blog name stays on screen and covers the text when I scroll down, with fully transparent background so it doesn't even cover the article text, it blends with it which distracts my eyes a little too much. If it was any other blog post I'd be certain it's a bug, but here I'm not sure if it isn't intentional, and one of those customization a ready-made software wouldn't let them do.
But I use AI also for some of the ones where I deeply care about the code, now. E.g. my terminal is in Ruby, and it worked well enough, but over the last couple of days I had Claude put together a test harness and burn down a number of sharp corners and refactor the code. It's not perfect still, but it's cleaner than it was because I didn't have time to do enough yak shaving myself. I do care about that codebase, because I have other things I want to use it for, and not having to do it all manually gave me enough time to get it to a far better state.
I feel like a lot of the split comes from people who are a whole lot less overcommitted. If you have way too many projects, you pick and choose which projects you want to lovingly care for and which ones you just want to advance the functionality of as fast as possible. Sometimes those are one and the same at different times.
I’ve found that the overuse of AI papers over a lot of problems. Then if things start failing people have no idea where or what to start fixing. I’m very much a destination person, but I’ve been on enough rides which crashed and burned to be cautious about it.
Made a post about how you learned to touch type? Or improved something keyboard-related? “I don’t think that typing code was ever the bottlenck”.[1] Now we’re supposed to be grateful for non-deterministic code completion, ah it saves us millions of keystrokes a year.
Some will cry Goomba Fallacy. Yeah of course. Could be that many lurker accounts started posting more, displacing the gatekeeper typist hackers. Now it’s all of a sudden an even split. Huh.
The OP was not about AI. But thankfully there was a top-level meta comment to drag us down into that pit.
[1] The non sequitur of it all is a separate topic
Yaks [1] have a shoulder hump you can't miss.
0: https://en.wikipedia.org/wiki/Highland_cattle
1: https://en.wikipedia.org/wiki/Yak
I added plugins this year which made it really powerful and allows me to keep the core small.
[1] https://github.com/yakkomajuri/teeny
I needed pandoc, but the internet and electricity were both out, so I built my own in a race against my dying ebay laptop battery.
I used ai to convert c headers into in nice zig code. Then I link to the library.
It’s cheap to use zig translate-c to convert c headers but the output isn’t nice.
You can give ai c++ source which usually has more documentation than the compromised flat c header. It allows you to do a better zig port. Zig greatly cuts down the noise in c headers as everything needs to have long prefix for namespacing. But in zig we can just nest things properly.
We can introduce intermediate layers to use proper tagged unions and distinguish ?T, *T, [*]T
I think we often make a mistake by assuming that when there's no visible output that time was wasted.
When I was in grad school this hit me, and everyone I knew, pretty hard. But when looking back I think most of the progress I made was entirely invisible. Those "failures" are not so much failures as narrowing the search space. Unless you have a full understanding of the problem before you begin (lol[0]), then this is always going to be true.
Which made me change my view on a lot of things and realize you just need to trust people. Help people get unstuck and out of rabbit holes but just because there isn't visible progress doesn't mean there isn't progress. If we try to make all progress visible then the reality is we just misalign from our actual goals.
So Yak Shave. There's lots of hidden treasures, even if you don't think it's a treasure at the time
[0] bahahaha I'd love to live in that fantasy world. Nothing is so well defined, even when using formal languages like math. Exploration is always required (yes, even in research. No one plans everything before they start working. The difference between researchers and industry is just how much up front strategizing they do. But exploration always happens, even if through different mediums)
I enjoy a yak, but right sizing my yak is pretty important to my enjoyment of it. Maybe the yak doesn't get a full shave but gets a trendy hair cut, and that's okay.
I leave my yaks at home when I go to other engineers decision meetings, project kickoffs, or RFCs.
- oh we should paint it
- we need a paintbrush
- I hear yak hair makes the best paintbrushes
- here I am, shaving a yak
made more sense than the examples given in the op
Coincidentally, this is also the first time I'm hearing about sable.
They are yakocryphal. A real yakrilege to spread such nonsense.
But truthfully part of the process of creating in general is yak shaving… as is so often said “trust the process”.
Arguably, the entire concept of tech debt is owed to the lack of yak shaving.
[1] https://youtube.com/@InheritanceMachining
https://www.ulaandlia.com/collections/mongolian-baby-yak-woo...
Oh wait, you meant figuratively!