Notes on Chapter 1 of
Modern Software Development Using Java (2nd ed.)
by Tymann and Schneider

1.1 Introduction

What topics ought we study to prepare to do (modern) software development? In the typical CS1 course, the emphasis is on programming (including concepts such as variables, scope, conditionals, loops, recursion, methods, and classes). You probably "coded" a number of small programs as homework exercises, and you probably spent considerable time "debugging" them in order to make them work properly.

The focus on coding and debugging in CS1 has the danger of giving students the false impression that they are the main activities involved in developing software.

Actually, coding and debugging typically occupy only about 20% of the time required to develop "production" software.

Why the difference between the classroom and the real world? Size! (And, as a corollary, complexity.)

Inevitably, the programs that you worked on in CS1 were very small and simple. This is only to be expected, for a beginner cannot be expected to tackle a large, complex program! But in the real world, programs tend to be much bigger (because the problems they solve are much more complex).

See examples in the special interest box on page 4 pointing out the sizes, in source lines of code (SLOC), of several popular software products. Mozilla Web Browser: 300K, Boeing flight control: 5M, Windows XP: 40M, Red Hat Linux: 30M, Debian GNU/Linux : 231M !

Figure 1-1 (page 3) categorizes programs into several sizes (trivial, small, medium, ...) by SLOC and time to develop. (Even 10K is small??!)

Consider the difference between building a birdhouse and building a skyscraper. Or between setting up a lemonade stand and establishing a multi-national corporation. It is analogous to the differences between building a trivial program and a large program: in building a trivial program, you can keep all the implementational details in (the front of) your mind, you can remember what you've finished, what is in progress, and what still needs to be done. You don't need a blueprint or a management plan: You can just start coding (just like you can start hammering to make a birdhouse). And you make corrections/adjustments (when you run into problems) "on the fly".

Unfortunately, developing a large software system (effectively) requires a much more disciplined approach. So, even though it will not be practical for you to develop a large (or even a small one, by the authors' standards) software system in this course, we are going to try to approach the task as though we were.

1.2 Software Life Cycle

(Note that some of the attitudes espoused by the authors in this section may be contrary to advocates of the Agile Programming movement, who claim that it is appropriate to start coding very early in the cycle.)

For anything larger than a very small program, a great deal of preparation is required before coding begins. The analogy is made to building a house, where it would be foolish to begin simply by picking up hammer, nails, and lumber. Rather, you should have a blueprint, and a plan in mind for the order in which various tasks should be carried out.

Also, much work occurs after coding is over, including testing, documentation, and maintenance.

Various experts have different opinions on exactly how to describe the life cycle of software, and in what order things ought to be done, but the general consensus is that the following are the essential activities. (Recall the idealistic waterfall model.)