Adam Fields (weblog)

This blog is largely deprecated, but is being preserved here for historical interest. Check out my index page at for more up to date info. My main trade is technology strategy, process/project management, and performance optimization consulting, with a focus on enterprise and open source CMS and related technologies. More information. I write periodic long pieces here, shorter stuff goes on twitter or


Shared lessons between programming and cooking

Filed under: — adam @ 7:22 pm

I originally wrote this a few years ago, but I thought it was worth restating. Here it is lightly edited:

Fine programming and fine cooking are similar disciplines, each a mixture of a lot of craft with a good deal of art. In each, you can have just the craft without the art, or just the art without the craft, but the results are extremely likely to be disappointing without both. The balance between the two is a reflection on the practitioner’s technique, the personality of which is always highly evident in the end product. I have found that my development discipline has been adaptable to cooking, and that many of the things I’m learning about cooking have analogues in programming.

For example, in cooking, good stock is critical. It adds flavors to other dishes, and can be layered to build complexity and texture. The more attention you pay to getting your stock right and correctly flavored, the better your end product will be. Stock requires upfront planning, dedication of resources, patience, and unit testing. Stock is a module. Like any module, you can make your own and it will be exactly what you need (or terrible, depending on your own skills), or you can buy someone else’s and it will either be good enough or terrible (depending on the skills of the stockmaker), and the quality of your final product will hinge heavily on which one it actually is.

Some shared lessons:

  1. Perfection is the goal, but the product had better damn well go out when it needs to and be right when it does. Perfection is the standard by which you measure what you did wrong last time so you can try not to do it again.
  2. Taste, test, measure, know. If you don’t know what’s supposed to be happening, or you don’t know what is actually happening, you have no way to compare the two, and you certainly have no way to bring them together.
  3. Building and maintaining your toolkit, which includes both tools and ingredients, is of utmost importance. For development, this is your development environment and your past history of specs, diagrams, and old code to repurpose. For cooking, this is your knives and other tools, as well as your collection of stocks, scraps, and spices.
  4. Knowing what’s in your toolkit is important, but knowing where to find something you need if it’s not is even more so.
  5. It’s sometimes easier to buy components, but it can be less effort in the long run to start from scratch. It’s entirely likely that a component you build yourself will be better for you, but the trick lies in knowing the difference before you start. Sometimes you have no choice.
  6. Waste is the enemy. Time, materials, and resources all have costs. Usage is not necessarily waste. Not taking care to avoid waste is itself waste. Failing to properly maintain your tools is waste. Not using everything that can be used is waste. Doing unnecessary tasks is waste. Documenting what you did is not waste.

Powered by WordPress