Creating a Software Engineering Culture
- With a little artistic license and stretching of the imagination, we could imagine computer programmers as having a culture—a shared set of beliefs and activities which shape their day-to-day activities.
- —Gerald M. Weinberg, The Psychology of Computer Programming
In their classic book Peopleware, Tom DeMarco and Timothy Lister report a range of performance among the best and worst individual computer programmers who participated in their Coding War Games of about ten to one [DeMarco, 1987]. Other studies have shown variations of up to twenty to one in programmer productivity and quality [Weinberg, 1992]. DeMarco and Lister also describe an eleven to one productivity range among the ninety-two software development organizations in their study. We can conclude that not all software groups are created, or perform, equal.
Imagine the impact of a ten to one range of productivity or quality in other professions: assembly line workers, airline pilots, physicians, race car drivers, or secretaries. Most businesses could not tolerate such huge differences in the capabilities of individual employees, but this is a reality in the software world. Software managers must find ways to deal with such a wide range of individual performance.
A significant factor in this performance variability is the culture of a software development organization. The American Heritage Dictionary defines “culture” as “the totality of socially transmitted behavior patterns, arts, beliefs, institutions, and all other products of human work and thought characteristic of a community or population.” Culture includes a set of shared values, goals, and principles that guide the behaviors, activities, priorities, and decisions of a group of people working toward a common objective. Cultural cohesion is not necessarily constructive or forward-thinking. The nineteenth century British workmen known as Luddites had a common culture, which was to oppose the labor-saving textile machinery that they feared would eliminate their jobs. Some cultures are characterized by a divergence of opinions and behaviors rather than by shared values. But when coworkers align along common, uplifting beliefs, it is easier to induce changes that will increase the group’s effectiveness and its likelihood of survival. A shared culture is one difference between a team and a “bunch of bozos on a bus” (to paraphrase Larry Constantine).
The ability to implement any specific change in the techniques or tools used by an organization depends on the prevailing cultural attitudes. A development staff with a commitment to excellence in software engineering is more receptive to trying new approaches that might help it reach this objective. In contrast, an attitude of “just bang out the code because we haven’t got time to think about the problem before trying to solve it” will make it difficult for a manager to encourage process improvements or behavioral changes.
Every organization has its own culture, but some are more uplifting than others. When I refer to a software engineering culture, I’m talking about the quality-focused group, not the code crankers. I often call this a “healthy” software engineering culture, because it includes three essential components:
- personal commitment by each developer to create quality products by systematically applying effective software engineering practices
- organizational commitment by managers at all levels to provide an environment in which software quality (in its many dimensions) is a fundamental success driver, and which enables each developer to achieve this goal
- commitment by all team members to continuously improve the processes they use, thereby continuously improving the products they create
Figure 1.1 illustrates how a software engineering culture relates to the goals, actions, priorities, and technical practices of an organization. The values and beliefs held by the team members define quality and productivity goals, which imply the practices that are adopted to achieve those goals. The consistent application of these practices, and the ability to demonstrate that you are achieving the desired results, reinforces the culture devoted to software engineering. Similarly, the culture provides a foundation for decisions and actions, the consistent application of which further reinforces the cultural values. The culture also helps the organization’s managers set their priorities. Consistent priorities communicated by managers send the message that all levels of the organization share a commitment to software quality. These reinforcing feedback loops are needed to sustain the evolution of the software culture to ever-improving performance.
Figure 1.1: A software engineering culture.
People working in a culture oriented toward software engineering realize there is much more to application development than hacking out a computer program. The tasks of project planning and management, problem domain analysis, requirements specification, architecture and program design, validation, and documentation far outweigh the effort that goes into the actual programming step. These other activities lay the foundation for the solid code that will deliver what the customer needs. Software engineering focuses on developing useful applications by using a variety of tools and techniques that cover a range of application problems, not simply writing programs.
As software organizations throughout the world strive to improve their processes and products, those organizations that develop a culture that effectively implements sound engineering practices ultimately will beat out the competition. This is true for software groups that support the internal operations of a corporation, as well as for those that sell in the commercial or embedded systems markets. Corporate software groups that deliver quality products on schedule and budget are more likely to survive the ever-present threat of outsourcing.