Christopher G. Wilcox
One of my interests is how cultural factors interact with traditional software engineering
practices. Here's a short introduction to the topic:
Many software projects run over budget and past deadlines, often without producing software that remotely meets user expectations. Since the inception of software development, the same issues arise over and over again. Which factors contribute to the efficient production of high quality software? Why do software projects go astray? The field of software engineering was created to answer such questions. Has the effort been successful? Many working engineers and academics remain unconvinced that software development has evolved into a rigorous engineering discipline.
While many theories explain the current state of affairs, in my mind they fail to address the fundamental issue. My view is that one of the predominant factors in software engineering is the culture and behavior of its practitioners. To discuss such an assertion, we need a concise definition of cultural factors and how they differ from other concerns. My simple taxonomy divides software development concerns into three separate but related areas: technical, environmental, and cultural.
Technical factors consist of the advances that we normally associate with computer science: programming languages, compiler theory, parallel programming, object-oriented (OO) and aspect-oriented (AOP) techniques, database theory, and so on. My list includes everything that lies within the theoretical framework of computer science, with the exception of software engineering. Technical factors exert a strong influence on software development practices, as witnessed by how quickly theory becomes reality in many areas of computer science.
Environmental factors are the real world implementation of the techniques discussed above. Such factors comprise the milieu in which software engineering is performance at any given point in time. The most obvious of these are hardware platforms, operating systems, and compilers and other development tools. Theoretical advances are interesting, but no significant programming can be done until the theory is manifested into working tools. The recent profusion of parallel programming models provides an excellent example of how this works.
Cultural factors encompass the behavior and practices of software developers and managers. The process of developing software is essentially a culture practice, as so elegantly portrayed in "The Mythical Man-Month" by Fred Brooks. As such, it is heavily influenced by the attitudes, biases, and backgrounds of the participants. Within most organizations, a process is followed when making software. Software processes range from ad hoc to carefully managed development lifecycles as described in the software engineering literature. I contend that cultural factors exert an unduly strong influence on the project success or failure.
All of the factors just described are closely related. As mentioned, technical factors drive the environment for software development. Throughout the history of computer science we have seen technical advances appear in actual products very shortly after (or even before) new ideas are published. Environmental factors often exert a strong influence over software development practices. As an example, the development world is currently dividing sharply between desktop and mobile platforms. In a circular fashion, cultural factors often control the adoption of new technologies, which in turn influences the practice of software development within an organization. The real question in all this is what are the cultural factors that contribute to success? I have compiled my own list: