Mental Models for Approaching Software Projects
The first two chapters described the software product, its quality attributes and its specification. We now turn our attention to the way in which software is developed. This chapter is an investigation of the software project. All software development projects have certain essential characteristics. Software development can be seen in various perspectives:
- As an exercise in collaborative problem solving
- As a kind of product development
- As nonlinear, dominated by the interactions of the participants
What follows is an explanation of each of these perspectives on software development, along with their implications for leadership. By understanding and appreciating these characteristics, you will have a mental model of software development that will help you make the decisions as if by second nature.
3.1 The Development Problem
The problem facing the development leader is the creation of quality software within a specified time and budget. We will call this the development problem. Recall, in Chapter 1, we defined quality as meeting the stakeholders' needs.
One traditional approach to solving the development problem is to create a detailed project plan. This plan has fixed content, schedule, and budget. Once the plan is developed, all efforts are directed towards meeting the plan. Much of the literature restricts its attention to this solution. In fact, at least one well-known consulting firm defines project success exactly in these terms.
However, this connect-the-dots approach to development is unrealistic. Generally, one does not have enough detailed information to solve the development problem using a fixed, detailed project plan. The requirements are not sufficiently enumerated or even understood, the design is yet to be discovered, the estimates are imprecise. Moreover, as we will see, projects are inherently unpredictable; attempting to hold to a highly detailed plan is futile. A more realistic approach to software development must be found.
We start our exploration of understanding how to solve the development problem by exploring problem solving in general.
Consider how you solve a mathematics word problem. First, you make sure that you understand the problem. You make sure you understand the assumptions and what constitutes a solution. Perhaps you draw a diagram or recast the problem using a formula.
Once you are comfortable that you have a sufficient understanding, you can decide how to approach the problem. You might realize that standard algebra can be applied or that the problem is similar to one you have solved before. As you try to apply your approach, you may realize that you are missing necessary data or that you must go back to enhance your understanding of the problem.
Then, when you are confident that you fully understand the problem and believe your approach will work, you implement the solution. With luck, your approach is viable. However, you may discover that your approach is problematic or may not work at all. In that case, you proceed to refine the approach or find an alternative.
Finally, you verify the implementation by checking to make sure your solution solves the original problem statement. If it does not, you check your work, reconsider your approach, and possibly even rethink your understanding of the problem.
No matter what problem you are solving, from developing a high-energy physics model to installing a home network, you go through the same four phases:
- Understanding the problem
- Finding an approach
- Implementing the approach
- Verifying the solution
In software development, the entire team needs to solve the development problem collectively. The team as a whole must go through the problem-solving stages. The leader must take his or her team through this process.