Coding like cooking

High pressure, demanding clients and tight deadlines are part of the process to produce great items. This describes the world of both cooking in a restaurant and software development. Perhaps I love cooking and watching cooking shows too much that I have begun seeing parallels between the two worlds.

My first paying job was in a kitchen. I started out as a dishwasher. After the initial training, my duty was to wash all of the dishes coming from the dinner service. At the end of the shift I had the responsibility of sweeping and mopping the floors. It was not a glamourous job with other tasks being taking out the garbage and cleaning the washrooms. After a few weeks I was able to move from dishwashing to becoming a line cook for the busy Sunday breakfast service. They put me on the grill but I was too slow at flipping eggs but I found my natural ability of calling out orders. However even at the end of the shift I still had the joys of taking out the garbage. Starting off from the bottom and moving up the ladder is something that I have also done during my career as a developer.

Starting out at the bottom
When starting out as a developer you try to get your first real life experience doing whatever is available whether that is creating a web site for your neighbour, being a tester or taking on a support role. These are not glamourous job nor are you pulling in the big bucks. You start off in the bottom and move up as you gain more experience.

In a kitchen you start off at the bottom doing the prep work such as peeling onions or chopping potatoes. You are getting things ready for the big show of the dinner service. To become a master sushi chef, some people have to spend at least 10 years as an apprentice. This is not something in place to slow down the growth of people but it is to give people a chance to practice and hone their craft.

When you are a young developer get your hands on everything and give everything a go. From UI work or database work you need experience and practice at the craft before you can excel at it.

Understand on the fundamentals
There is always a new flavour of the week. In the world of cooking it could be molecular gastronomy or cooking food in water baths called sous-vide. At the end of the day it is just another way of cooking but at the heart of it all is the understanding of what it means to cook food but to also give it flavour. Knowing how to use a fancy technique without making it taste good is just a waste of energy. A lot of chefs are classically trained one style of cooking like French, Chinese or any one of the worlds many fine cuisines, but from understanding the basics they can then move on to continue making the classics or making the classics better with creative hacks or fusion style cooking.

The same concept can be applied to programming. One day it could be C++, the next C#, tomorrow it could be AwesomeScript++. Languages will change and evolve. What developers need to know are the fundamental programming concepts such as design patterns and the ability to model real life into data structures. Just because something is written in one language doesn’t make it better than another language. But if it helped you translate your design to model real life scenarios easier and faster while providing the same or better features then you are on to something.

Execute with purpose
If you are going to cook for a customer, if it is raw they send it back, if it is over cooked they send it back. When you code you should approach it with the same spirit. If you don’t provide enough features or it is missing something essential, people will not use your software. If you over-engineer it beyond what is necessary, people will not use your software.

You must know why you are coding and what the problem it is trying to solve at all times of development. Deliver that and you will make everyone happy. Throwing extra features in a piece of software that no one will use is just like throwing in extra spices to make it a dish that no one will want to eat.

Leading like a head chef
A head chef is usually someone who is over looking a brigade of other chefs. This person overlooks the different process from prep, appetizer stations, meat, entrees, fish and dessert stations. They are usually the liaison between the kitchen and the front of house or even the end customers.

A team lead is usually someone who is over looking a team of developers. This person overlooks the different areas of development from support, testing, server side coding, user interface coding and design. They are usually the liaison between the developers and the business or even the end customers.

There are lots of similarities in the roles and responsibility, so as a head chef may have to help out with some cooking, a team lead should be able to help assist with some coding when necessary. A team lead should be someone who has experience in developing code as well as all the different faucets of the software development lifecycle from requirements gathering, testing, project delivery and support. They don’t have to be experts at all areas but well versed enough in each so that they can help assist their team to find a solution when needed. Have you heard of a good head chef who couldn’t cook meat or do desserts? They may not like doing something like desserts but at least they know what it takes to make a good dessert.

Note: Yelling at your team like Gordan Ramsay won’t make your development team work better. It just creates drama which is only good for TV entertainment.

Taste test
When you cook you need to constantly taste. Heat and different elements can change how something may taste. As a chef you can’t blindly follow a recipe, you need to use it as a guide and make adjustments for sugar, salt and sour levels when necessary. Sometimes when you are in the heat of the moment you may reach for the salt but grabbed the sugar instead, they both look the same but taste completely different. If you don’t taste, then how will you know if what you just served will taste good?

When you code, the user interface may give you the illusion that everything is working but you have to test. Test the end to end process and test from the code level. There should not be any excuse. As a team lead, you also need to allocate some time for you to “taste” the code that is coming in from your team. After all you will be the one having the discussion to the customer if something goes wrong or if something is missing. A good rule here is to allocate 20% of your time per developer you are leading. If you are leading 5 people then you shouldn’t be doing any coding really because you can’t maintain quality at that rate. This is just a rule and to every rule there are exceptions but you have to watch out because one bad programmer can create two jobs. Catch items early so they don’t become issues later.

Be passionate
When you listen to chefs talk about food they are passionate even when they are talking about bread. They love food and you can hear it their voices when they are describing how simple ingredients come together to make a dish. How the different climates affect grapes and how that affect is converted into a robust and complex wine or how grains are transformed into wheat used for bread or pasta, the passion is there at every level.

The same can be said about coding and developing. You can get really into how those 1’s and 0’s are transported around the world in milliseconds and how it happens. You can talk about how different tools can help you transform your code into wonderful software. One person who I find is great at sharing this Scott Hanselman (@shanselman) He shares his love of software from explaining technical details of how the latest version of ASP.NET may work to how technology is used in our lives. The important part here is that when you are passionate about something you share this with others. This might be contradictory to my previous point about not being an expert at one thing but if you think it is the greatest language since Turbo Pascal, then let the world know. Share your knowledge by blogging or writing code for Codeplex or GitHub. By teaching and informing others you not improve your knowledge but you create an environment for growth and creativity.

Other similarities

  1. Order tickets – These are your work items or the dishes you have to cook. Once done you move them down the line, sort of like kanban boards.
  2. Sharp knives cut better – Having the right tools to do the work makes your task easier and faster. Having a sharp knives allows you to make precision cuts with ease. Using the right comparison tool for text documents such as Beyond Compare sure beats using your eyes to manual inspect files for differences
  3. Presentation – Having good food that also looks good will make people love your food. Having good code that also looks nice will make people love your software. The presentation brings the people in, the good flavour is what keeps people coming back. It’s about bringing a good experience to the people.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s