Coding & Cooking: Growing as a Developer

Let me tell you about the time I burned water.

My family always believed everyone should be very involved in dinners. Every night I had a task: setting the table, making a salad, doing dishes … everyone was involved, everyone had a role. Eventually we graduated to helping with actual food and that’s where things got interesting. Several meals had to be immediately dumpstered due to massive amounts of salt; broken dish incidents and clean-up times spiked exponentially. Then there was the spaghetti incident.

Spaghetti was a fairly routine meal at our house. You could expect it once a week and it was easy to prepare. Add water to a large pot, bring to a boil, add salt & spaghetti, cook to al dente, drain, toss with a homemade sauce of seasoned ground beef & canned tomatoes, serve.

One night, while I was in-charge of making the spaghetti, I set the heat on a pot of water, then was immediately distracted and wandered out of the kitchen. Some time later a generous amount of smoke started billowing from the kitchen, from the very pot I had placed on the stove. The water had boiled, then completely cooked off, then the pot had heated and was starting to smoke liberally … I had just burned water.

So, what does any of this have to do with writing code or growing as a developer?

Writing performant, extendable, maintainable code has many parallels with successfully cooking a meal. You need to know the basics of your craft and have a solid understanding of your toolset. Whether this is cook temperatures for meats, knife skills and how to thicken a sauce or how to set-up your build pipeline, code defensively and have IDE shortcuts committed to muscle memory. Once you understand the basics you move to more advanced concepts: Are you able to time cooking various dishes at different temperates and times so everything is ready at once? Can you spot design patterns? Are linters and unit / integration testing core to your workflow? From there you move to high-level concepts that demonstrate a holistic understanding. Can you season a dish in the middle of cooking it to bring out certain flavors? Do you develop with consideration for those who will build on your work in the weeks, months and (possibly) years to come?

Developers and at home chefs have many parallels as they grow in expertise

At the start of a developer’s career, we’re very much following a recipe. Whether it’s food.com or stackoverflow, there is a lot of copy-pasting happening. We may not be entirely sure what we’re doing but we’ve been given a problem and we’re going to rely on what we learned in classes, can find online or glean from peers until all the unit tests pass (or someone shows us mercy in a code review). In an organization committed to growing its people, there should be a sherpa program in-place to cultivate new developers. In my experience, real growth happens through failure not success. New developers should feel comfortable stretching their skills and trying new techniques, with a backbone of experienced devs to support them.

As developers and cooks nail down the basics, a new problem arises. We become confident in our abilities and confidence easily leads to over-confidence. A reoccurring phenomenon occurs at this stage which can be distilled to, “Solutions looking for problems.” Once we’ve demonstrated mastery of the basics and have moved to more advanced techniques there becomes a real danger of chasing the technology, platform or approach we’ve just learned with the intent of employing it anywhere. Know Gang of Four design patterns like the back of your hand? Use them everywhere! Just learned Clojure? Let’s write an entire API! Spent the weekend on a Kubernetes crash-course? Let’s move our production architecture ASAP! After seeing this scenario play out again and again, while watching the consequences of implementing technology for the sake of chasing the new-hotness over considerations of training, maintenance and extendability, I believe this is one of the deep pits developers can fall into on their career paths and it is a hurdle that must be overcome in the pursuit of mastering one’s craft.

The empathetic chef / developer

Whether you’re riffing on a dinner to add some spice, perhaps that touch of umami, or building toolsets for fellow developers and creating full stack applications, I’ve found empathy is core to success. Being able to put yourself in the shoes of your dinner guest, fellow developer or end-user is critical to creating a memorable meal and an application that will continue to grow & be maintained long after you’ve pushed your last commit. Solving a problem with the right solution, instead of trying to weld a solution you currently love onto the issue at-hand begins with putting the interests of someone else before yours.

No matter where you are in your journey as a developer (or chef), consideration for those who will maintain and expand (or consume) your work is time well spent.