More on this book
Community
Kindle Notes & Highlights
Accretion describes the way an oyster makes a pearl, by gradually adding small amounts of calcium carbonate. In geology, "accretion" means a slow addition to land by the deposit of waterborne sediment. In legal terms, "accretion" means an increase of land along the shores of a body of water by the deposit of waterborne sediment.
In incremental development, you first make the simplest possible version of the system that will run. It doesn't have to accept realistic input, it doesn't have to perform realistic manipulations on data, it doesn't have to produce realistic output—it just has to be a skeleton strong enough to hold the real system as it's developed. It might call dummy classes for each of the basic functions you have identified. This basic beginning is like the oyster's beginning a pearl with a small grain of sand.
The anecdotal evidence in favor of this approach is impressive.
the incremental metaphor
the farming metaphor
The image of "building" software is more useful than that of "writing" or "growing" software.
blueprints
you don't waste time fixing mistakes that could have been avoided.
You'll make extensive use of high-level language features rather than writing your own operating-system-level code. You might also use prebuilt libraries of container classes, scientific functions, user interface classes, and database-manipulation classes. It generally doesn't make sense to code things you can buy ready-made.
you're building a first-class software product, you might build your own scientific functions for better speed or accuracy. You might build your own container classes, user interface classes, and database classes to give your system a seamless, perfectly consistent look and feel. Both building construction and software construction benefit from appropriate levels of planning. If you build software in the wrong order, it's hard to code, hard to test, and hard to debug. It can take longer to complete, or the project can fall apart because everyone's work is too complex and therefore too
...more
Many terms common in software development derive from the building metaphor: software architecture, scaffolding, construction, foundation classes, and tearing code apart.
buy into
Key Points Metaphors are heuristics, not algorithms. As such, they tend to be a little sloppy. Metaphors help you understand the software-development process by relating it to other activities you already know about. Some metaphors are better than others. Treating software construction as similar to building construction suggests that careful preparation is needed and illuminates the difference between large and small projects. Thinking of software-development practices as tools in an intellectual toolbox suggests further that every programmer has many tools and that no single tool is right
...more
skyscraper
tailored
This chapter describes the work that must be done to prepare for software construction.
with building construction, much of the success or failure of the project has already been determined before construction begins. If the foundation hasn't been laid well or the planning is inadequate, the best you can do during construction is to keep damage to a minimum.
"Measure twice, c...
This highlight has been truncated due to consecutive passage length restrictions.
accou...
This highlight has been truncated due to consecutive passage length restrictions.
Chapter 5. If you don't like the idea of prerequisites to construction, review Determine the Kind of Software You're Working On, to see how prerequisites apply to your situation, and then take a look at the data in Importance of Prerequisites, which describes the cost of not doing prerequisites. Importance of Prerequisites A common denominator of programmers who build high-quality software is their use of high-quality practices. Such practices emphasize quality at the beginning, middle, and end of a project.
If you emphasize quality at the end of a project, you emphasize system testing.
quality-assurance strategy, and it's not the most influential
If you emphasize quality in the middle of the project, you emphasize construction practices. Such practices are the focus of most of this book.
If you emphasize quality at the beginning of the project, you plan for, require, and design a high-quality product.
In software development, you do such planning when you define the problem, when you specify the solution, and when you design the solution.
Since construction is in the middle of a software project, by the time you get to construction, the earlier parts of the project have already laid some of the groundwork for success or failure.
The rest of this chapter describes in detail why proper preparation is important and tells you how to determine whether you're really ready to begin construction.
The methodology used should be based on choice of the latest and best, and not based on ignorance. It should also be laced liberally with the old and dependable. — Harlan Mills
a good project planner clears major risks out of the way as early as possible so that the bulk of the project can proceed as smoothly as possible.
By far the most common project risks in software development are poor requirements and poor project planning, thus preparation tends to focus on improving requirements and project plans.
A common cause of incomplete preparation is that the developers who are assigned to work on the upstream activities do not have the expertise to carry out their assignments.
When developers don't know how to do upstream work, the recommendation to "do more upstream work" sounds like nonsense: If the work isn't being done well in the first place, doing more of it will not be useful! Explaining how to perform these activities is beyond the scope of this book, but the "Additional Resources" sections at the end of this chapter provide numerous options for gaining that expertise.
Some programmers do know how to perform upstream activities, but they don't prepare because they can't resist the urge to begin coding as soon as possible. If you feed your horse at this trough, I have two suggestions. Suggestion 1: Read the argument in the next
section. It may tell you a few things you haven't thought of. Suggestion 2: Pay attention to the problems you experience. It takes only a few large programs to learn that you can avoid a lot of stress by planning ahead. Let your own experience be your guide.
A final reason that programmers don't prepare is that managers are notoriously unsympathetic to programmers who spend t...
This highlight has been truncated due to consecutive passage length restrictions.
Why Isn't Sam Coding Anything? or Why Isn't Mary Programming?
A second questionable alternative is pretending to be coding when you're not. Put an old program listing on the corner of your desk. Then go right ahead and develop your requirements and architecture, with or without your boss's approval. You'll do the project faster and with higher-quality results.
Third, you can educate your boss in the nuances of technical projects. This is a good approach because it increases the number of enlightened bosses in the world. The next subsection presents an extended rationale for taking the time to do prerequisites before construction.
Finally, you can find another job.
Then you know that before you implement a system, you need to understand what the system is supposed to do and how it's supposed to do it.
Part of your job as a technical employee is to educate the nontechnical people around you about the development process.
preparation is important.
From a management point of view, planning means determining the amount of time, number of people, and number of computers the project will need. From a technical point of view, planning means understanding what you want to build so that you don't waste money building the wrong thing.
The architect consumes the requirements; the designer consumes the architecture; and the coder consumes the design.
In programming, if you have healthy food at each stage in the food chain, the result is healthy code written by happy programmers.
nuclear
programming, if your requirements are contaminated, they contaminate the architecture, and the architecture in turn contaminates construction. This leads to grumpy, malnourished programmers and radioactive, polluted software that's riddled with defects.
builder who is building a housing development doesn't need to know every detail of every house in the development before beginning construction on the first house. But the builder will survey the site, map out sewer and electrical lines, and so on. If the builder doesn't prepare well, construction may be delayed when a sewer line needs to be dug under a house that's already been
constructed.
In general, the principle is to find an error as close as possible to the time at which it was introduced. The longer the defect stays in the software food chain, the more damage it causes further down the chain. Since requirements are done first, requirements defects have the potential to be in the system longer and to be more expensive. Defects inserted into the software upstream also tend to have broader effects than those inserted further downstream. That also makes early defects more expensive.