According to CATB, the act of shaving a Yak is "Any seemingly pointless activity which is actually necessary to solve a problem which solves a problem which, several levels of recursion later, solves the real problem you're working on.".
The first time I read about the term was on this blog, but that was a long time ago. I was only recently that I noticed that a) I was doing it again, and b) some of my collegues where unfamiliar with the term. Therefor, I decided to (also) blog about it.
The example on Seth Godin's blog is a perfect example of what Yak Shaving is:
Yak Shaving is the last step of a series of steps that occurs when you find something you need to do. "I want to wax the car today."
"Oops, the hose is still broken from the winter. I'll need to buy a new one at Home Depot."
"But Home Depot is on the other side of the Tappan Zee bridge and getting there without my EZPass is miserable because of the tolls."
"But, wait! I could borrow my neighbor's EZPass..."
"Bob won't lend me his EZPass until I return the mooshi pillow my son borrowed, though."
"And we haven't returned it because some of the stuffing fell out and we need to get some yak hair to restuff it."
And the next thing you know, you're at the zoo, shaving a yak, all so you can wax your car.
I happend to me last week, when I wanted to create a Grails presentation. For giving the presentation, I figured it would be nice to have a nice frontend, and since my designer skills are not that great, I decided to look for an alternative. I found several, of which ExtJS appealed the most to me. However, to use it, I thought, let's build an Ext scaffolding mechanism to easily generate my UI.
When searching the Grails mailinglist, I found several people working on it (and none was finished), but I also found ExtTLD, a Taglib based framework for generating Ext user interfaces. It's based on JSP Taglibraries however, which Grails doesn't support yet.
So, in order to create a (one hour) presentation, I first have to implement JSP support into Grails! While this might be a great opportunity to learn and contribute to Grails, it's way off my original plan. So, while this detour might provide some great opportunities to learn, it will also take me much (much!!) longer to reach my original goal, with the danger of not reaching it at all!
If this situation might sound familiar to you, these are the things I (try to) keep in mind when picking up a project:
Reflecting can only be done when you allow yourself some time of the project you're working on. Go for a walk, go sit in the library, anything will do, but try to approach your project/task/problem from a little bit of distance. It will make things much more clear and allow you to choose the right approach (look for alternatives, or dive in) more easily.
People who are also not directly involved in the project at hand can also help you pick the right approach by asking questions like 'Did you think of this', or 'why not take this approach'. Even explaining things to other persons will make things much more clear, and, for me anyway, made me reflect of the approach I was taking.
My original approach would likely result in chaos and not getting any things done! Therefor I decided to do things in a more agile way: decide what I can accomplish in the limited time I have, and try to implement that. If I find a way to improve it later, that will be great, but I first need some working software which will "scratch my itch"! After that, and if necessary, there might be plenty of time to refactor.
So, if you ever find yourself shaving a Yak, it might just be time to take a step back, get some fresh air and reflect if the approach your taking is really the best way to go. If it is, than go for it, but if it isn't, it might be the right time to look for easier alternatives!