I have a passion for software development, but I get an equal thrill out of preparing elaborate meals, which my friends and family often label “fine restaurant quality.” It struck me that quite a few of my software engineer
A great chef’s modus operandi can provide excellent lessons in how to achieve scale, while retaining quality in software development. leads to product differentiation. The combination of desired qualities becomes the secret sauce. Although the seasonings idea was a good start, I could think of many more ways to associate software development with food preparation, as Table 1 shows. As I thought about these parallels, I began to appreciate the complexity of a gourmet restaurant. Being a master chef is no easier than being a software development guru, yet celebrity chefs like Emeril Lagasse and Bobby Flay make preparing elaborate dishes look easy.What do they know that empowers them to achieve a high-quality product repeatedly and with seeming ease? After much deliberation, I identified 10 practices that might hold the answer. Master basic skills I’ve heard that the dreams of creating savory sauces and delectable dishes quickly vanish in those first days at culinary school.You start at the bottom, chopping various ingredients, dressing meats, cleaning fish, and executing an assortment of other less-than-exciting tasks.Of course,you eventually move on, since skill with a knife does not make a master chef. However, no chef becomes a master without it. This idea of basic-skills
mastery is the same for software development.The best software engineers can deftly manipulate modeling and programming languages, debug systems, and properly apply a variety of integration techniques. Use the best ingredients Great food starts with the best ingredients. The best chefs are actually students of agriculture and food processing, and they can tell where different ingredients came from; how they were grown, raised, or manufactured; and if the ingredient is ripe, spoiled, and so forth. Similarly, great software uses only the highest-quality components, whether open source or off the shelf.And the best software engineers have more than a cursory understanding of what’s inside the package. Use the best tools Any chef knows that a great set of knives outperforms a cheap set. The same goes for virtually every other kitchen utensil. In fact, what craft doesn’t benefit from the best tools? Software is no different. Using the highest-quality tools—open source or off the shelf—is critical to any software development project’s success. Similarly, the best software engineers make sure they have access to the best hardware and highest quality software tools for requirements management, system architecture and design, code development, testing, version control, and so on. Test and retest If there is one way to ensure quality in transforming raw materials into finished products, it’s through continuous testing. Chefs constantly sample their food at each preparation stage— from raw ingredients to the last spoonful of béarnaise sauce.Similarly, high-quality software just cannot be developed without continuous testing throughout the software life cycle. Be ready to adapt core recipes Much of cooking involves a small set of basic recipes that chefs adapt as required, for example, taking a basic pizza recipe and creating variations on that theme. The best chefs know how to combine simple ingredients and basic sauces using standard techniques to derive all kinds of exotic and novel dishes. Organizations that develop software already know that custom software is expensive, and want to avoid the waste of reinventing existing code—two strong motivations for reusability and modular design. On the other hand, standard solutions often aren’t enough. It makes economic sense to find a midTable 1. How software development and food preparation intersect. Aspect Software development Food preparation Process artifacts Single-purpose software, components, Single meal, buffets, multicourse dinners, domain-specific application software, and banquets and general-purpose software Printed artifacts Requirements specification, design Restaurant operational plans, menus, and document, code, and test plans recipes Functional activities Requirements elicitation, software design, Restaurant/banquet process planning, menu code development and acquisition, systems food preparation, and presentation testing, and integration Key participants Requirements engineers, software designers, Executive chef, head chefs, sous chefs, software developers, testers, project apprentice chefs, waiters, and diners managers, and customers need not be quite as lavish as some gourmet dishes, but they do require careful thought. On the other hand, too much time on the interface and too little time on the underlying product is the software equivalent of offering spam á la mode. Plan, but be ready to improvise There is really no way to mass-produce high-quality food without carefully preparing ingredients, thinking through how to configure preparation stations, and training sous chefs and assistants.In other words,it can’t happen without a plan. In software engineering, a well-defined project plan with appropriate metrics for monitoring, testing, and control, is a prerequisite to a software product delivered on time,on budget,and with the highest possible quality. On the other hand, it isn’t always possible to slavishly follow a plan. On “Iron Chef,” a television show where celebrity chefs square off to prepare exotic dishes using a theme ingredient, the participants are under tremendous pressure to perform. Under this intense scrutiny and short timeline, it’s not unusual for dishes to fail mid-preparation. But the best chefs, rather than discarding the dish and admitting defeat, find some way to adapt it. This scenario is the very essence of software delivery, with managers and customers breathing down the software team’s collective neck. The very best software engiNovember ❘ December 2005 IT Pro 41 neers find ways to salvage design elements or portions of code without starting again from scratch. Part of thinking on your feet is knowing the various architectural styles and how they fit. Chefs are adept at fusion cooking—the melding of various culinary styles (Chinese, French, or Middle Eastern) in some innovative way to achieve novel and superior tastes.Fusion software engineering involves the mixing and matching of various approaches, architectures, pattern languages, and techniques—even techniques from other disciplines—to achieve a superior product. Take appropriate risks The essence of great cooking is not simply to follow a recipe verbatim every time, but rather, to try to push the boundaries by substituting different ingredients and adding new twists. The same goes for software development. No one size fits all, and despite
the promises of pattern-based software engineering, for example, or of reusable frameworks like model-view controller, there are few ready-made solutions for the masses. Every time you vary from the standard framework slightly, or recombine design patterns in a new way, you are taking an appropriate risk. This is a good thing, and the sheer essence of software engineering. Know when to throw it away I once watched a cooking challenge show in which five contestants each prepared three dishes based on a theme ingredient. One of the contestants burned a dish. Rather than try to salvage a lost cause, she chose to serve just the two dishes. Surprisingly, the judges rewarded her for not violating a primary rule of cooking— never serve something that isn’t perfect. Software development could learn from this tenet. Sometimes it’s better to discard a first-generation system or prototype rather than carrying over bad decisions into the next version. Of course, it costs a lot less to throw away a meal than to scrap a major software project, but then the risk is equally unbalanced: The consequences of serving that slightly imperfect meal might be far less severe than serving a software product with possibly fatal flaws. S o what are the lessons for software engineering? Both remarkable software and superb cooking are a mix of science and art; of repetition and innovation;and of theory and intuition.From this blend comes practices that aim to balance quality, scale, and time pressures. Perhaps the most essential lesson is that there are no shortcuts to success. Über-practitioners like Bob Martin and Martin Fowler make software architecture, construction, refactoring, and testing look simple, but that’s because they’ve put in hours of practice and follow the same principles as master chefs: Keep the kitchen clean, have the best tools and quality ingredients, learn and practice basic techniques, and have basic recipes,but be prepared to adapt them. Eliza Acton expressed the essence of cooking and software engineering eloquently more than a century ago: “It is not, in fact, cookery books that we need half so much as cooks really trained to a knowledge of their duties.