[an error occurred while processing this directive]

Learning Software Engineering


It is too easy to get the impression that learning to develop high quality software is just a matter of perfecting coding skills and learning more algorithms. This is far from the truth. It is true that you need good coding skills, but by your senior year in college, you probably already have good coding skills. It is true that some software development projects require difficult algorithms, but that is not the source of complexity for most projects. The real difficulties of software development are determining what the software should do, structuring it to simplify implementation, testing, and maintenance, managing the development process in a way that ensures high quality, and documenting the software in a way that users can understand.

Communication is one important skill that often does not get the attention that it deserves. Communication between developers and prospective users is crucial in determining what the software should do. Communication between managers and developers is essential so that managers can make intelligent plans and keep developers on track. And communication is obviously what documentation is all about.

Judgement is another important aspect of software development. With regard to determining the structure of an application, developers usually have a large number of options. As a budding software engineer, you might not see very many alternatives, but after acquiring more experience they can be overwhelming. And the developers have to make choices. Making choices requires making judgements about the relative merits of the various alternatives. What are their advantages and disadvantages? Which of the advantages and disadvantages is most important?

Judgement is difficult because the ability to understand a value concept does not automatically give you the ability to recognize when it is applicable. In part, this is due to lack of standards of comparison. For example, you often do not see couplings until you have seen an alternative that avoids them. You might not see problems with ease of use until you have see a better user interface. Recognizing where a concept can be applied also requires getting into the habit of looking out for the concept. Understanding the meaning of the concept does not guarantee the development of this habit. That is a matter of practice.

Effective thinking in any discipline requires a body of theory that organizes knowledge in a coherent way. In some disciplines, much of the theory is mathematical in nature. Disciplines in which judgement is crucial require a complex network of values, principles, concepts, techniques and methodologies with complex relationships between them. This complex network is initially just a framework for your later understanding. As you acquire experience, it's lessons are recorded in context within that framework as judgements of what is important and how to deal with problems. As you acquire experience, you also develop the ability to see the relationships within the network better so that you can navigate more comfortably. This is how good software engineers come to be able to think about the right thing at the right time.

Taken out of context, many of the values, concepts, and principles that make up the theoretical framework of software engineering are obvious. Do not let that fool you. The fact that you think something is obvious does not mean that your learning about it is complete. You also need to be able to apply the theory in particular contexts. Software developers work in very complex contexts, with many things to consider. One important difference between good software developers and not so good developers is a well formed habit of considering the right things at the right time. This is a difficult skill that only develops with extensive practice.

How many times have you said to yourself: "I should have thought of that." or "How did I miss that?" when an error or problem was pointed out? We seem to expect that having noticed or realized something once, we will automatically notice or realize it the next time that it is relevant. This is far from true. The human mind does not learn very many lessons in a single experience. If you think about it, it should not work that way. When dealing with complex situations, it is not usually clear what the lesson is. If everthing were learned in a single experience, we would undoubtedly be learning the wrong lesson as often as the right lesson. Many people who were once young can remember a chaotic period of their lives that resulted from trying to grasp truths too quickly. Our mental makeup requires that experiences prove themselves by repetion before lessons are learned from them.

Our mental makeup also helps us to filter out extraneous information. It requires that a concept prove its importance in a particular kind of context before recognition skills become automatic in that context. If our minds did not operate this way, we would be unable to cope with the information overload.

Without the theoretical framework and the thinking habits that are an essential part of good judgement, we can easily find ourselves on a well-known road that is paved with good intentions. We want to design software that controls telephone switching ciruits for better telephone service. But a software defect brings the telephone system to a standstill. We want to design good software that controls radiation treatment machinery to save cancer patients. But a software defect exposes a patient to a lethal overdose. We want to design good software that makes it easier to fly an airplane. But a software defect crashes the airplane into a mountain.

Now is the best time to start the learning process, while the consequences of failure are not so serious.

[an error occurred while processing this directive]