WHAT IS SOFTWARE ENGINEERING?
A formal defi nition of software engineering might sound something like, “An organized, analytical approach to the design, development, use, and maintenance of software.”
More intuitively, software engineering is everything you need to do to produce successful software. It includes the steps that take a raw, possibly nebulous idea and turn it into a powerful and intuitive application that can be enhanced to meet changing customer needs for years to come.
You might be tempted to restrict software engineering to mean only the beginning of the process, when you perform the application’s design. After all, an aerospace engineer designs planes but doesn’t build them or tack on a second passenger cabin if the fi rst one becomes full. (Although I guess a space shuttle riding piggyback on a 747 sort of achieved that goal.)
One of the big differences between software engineering and aerospace engineering (or most other kinds of engineering) is that software isn’t physical. It exists only in the virtual world of the computer. That means it’s easy to make changes to any part of a program even after it is completely written. In contrast, if you wait until a bridge is fi nished and then tell your structural engineer that you’ve decided to add two extra lanes, there’s a good chance he’ll cackle wildly and offer you all sorts of creative but impractical suggestions for exactly what you can do with your two extra lanes.
The flexibility granted to software by its virtual nature is both a blessing and a curse. It’s a blessing because it lets you refi ne the program during development to better meet user needs, add new features to take advantage of opportunities discovered during implementation, and make modifi cations to meet evolving business needs. It even allows some applications to let users write scripts to perform new tasks never envisioned by developers. That type of fl exibility isn’t possible in other types of engineering.
Unfortunately, the fl exibility that allows you to make changes throughout a software project’s life cycle also lets you mess things up at any point during development. Adding a new feature can break existing code or turn a simple, elegant design into a confusing mess. Constantly adding, removing, and modifying features during development can make it impossible for different parts of the system to work together. In some cases, it can even make it impossible to tell when the project is finished.
Because software is so malleable, design decisions can be made at any point up to the end of the project. Actually, successful applications often continue to evolve long after the initial release. Microsoft Word, for example, has been evolving for roughly 30 years. (Sometimes for the better, sometimes for the worse. Remember Clippy? I’ll let you decide whether that change was for the better or for the worse, but I haven’t seen him in a while.)
The fact that changes can come at any time means you need to consider the whole development process as a single, long, complex task. You can’t simply “engineer” a great design, turn the programmers loose on it, and walk off into the sunset wrapped in the warm glow of a job well done. The biggest design decisions may come early, and software development certainly has stages, but those stages are linked, so you need to consider them all together.
WHY IS SOFTWARE ENGINEERING IMPORTANT?
Producing a software application is relatively simple in concept: Take an idea and turn it into a useful program. Unfortunately for projects of any real scope, there are countless ways that a simple concept can go wrong. Programmers may not understand what users want or need (which may be two separate things), so they build the wrong application. The program might be so full of bugs that it’s frustrating to use, impossible to fi x, and can’t be enhanced over time. The program could be completely effective but so confusing that you need a PhD in puzzle‐solving to use it. An absolutely perfect application could even be killed by internal business politics or market forces.
Software engineering includes techniques for avoiding the many pitfalls that otherwise might send your project down the road to failure. It ensures the fi nal application is effective, usable, and maintainable. It helps you meet milestones on schedule and produce a fi nished project on time and within budget. Perhaps most important, software engineering gives you the fl exibility to make changes to meet unexpected demands without completely obliterating your schedule and budget constraints.
In short, software engineering lets you control what otherwise might seem like a random whirlwind of chaos.
▸ PART I SOFTWARE ENGINEERING STEP‐BY‐STEP
CHAPTER 1 Software Engineering from 20,000 Feet
CHAPTER 2 Before the Beginning
CHAPTER 3 Project Management .
CHAPTER 4 Requirement Gathering
CHAPTER 5 High‐Level Design
CHAPTER 6 Low‐Level Design
CHAPTER 7 Development
CHAPTER 8 Testing
CHAPTER 9 Deployment
CHAPTER 10 Metrics
CHAPTER 11 Maintenance
▸ PART II PROCESS MODELS
CHAPTER 12 Predictive Models
CHAPTER 13 Iterative Models
CHAPTER 14 RAD
APPENDIX Solutions to Exercises