1.软件开发最终是由人来执行和完成而不是机器。
# Software development is performed by human beings. This notion
was first popularized by Gerald Weinberg in 1971, with a book entitled
The Psychology of Computer Programming (the silver anniversary edition
of the book was republished in 1998). McConnell noted that estimating
models like COCOMO-II demonstrate the significant cost/effort multipliers
associated with having talented, experienced personnel on a project.
He also suggests that we can draw three conclusions from this point:
(a) the success of companies like Google, Yahoo, and Microsoft is
not accidental, and is partially due to their emphasis on hiring
talented people; (b) recruiting talented staff members is easily
cost-justified; and (c) spending money on employee retention programs
is cost-justified.
2.增量开发是必须的
Incrementalism is essential. Steve distinguishes between “incremental”
and “iterative” development; by “incrementalism,” he refers to the
idea of developing a little bit at a time, in contrast to the big-bang
software development approach.
3.迭代开发是必须的
Iteration is essential. This is a familiar concept, but Steve warned
us to avoid accepting the all-or-nothing extremes of iteration.
You don’t have to accept the “keep iterating forever” extreme, nor
do you have to accept the “no iterations are allowed” waterfall
approach.
4.增加一个缺陷的成本是延长了开发周期
The cost to increase a defect increases over time, throughout the
development life cycle. This is a concept that has been widely accepted
for the past 25 years, and McConnell says he has revalidated its
truth with data as recent as 2004, including XP/agile projects.
I was somewhat surprised by this, because a common argument from
the XP/agile enthusiasts is that modern tools have made the old
concept irrelevant — i.e., the XP/agile people argue that it doesn’t
cost much to fix a requirements defect later in the development
process, because modern IDE tools make it easy to redevelop software.
McConnell obviously disagrees with this point, and I’ll have to
look into it further before I make up my own mind.
5.软件开发过程的瀑布模型是重要的内核(每一个增量或迭代都是一个小瀑布)
There is an important kernel of truth in the waterfall model of
development. McConnell suggests that the primary activities of software
development are discovery (of what the requirements really are),
invention (of a solution), and construction (i.e., implementation
of that invented solution). And he argues that while these activities
can overlap and take place somewhat concurrently, there is an intrinsically
sequential nature to the activities.
6.精确的软件估算需要增加整个软件系统的开发周期
The accuracy of estimates (about the schedule, effort, and cost)
for a project increases over time throughout the development of
a software system. There is a great deal of uncertainty in the initial
estimates that we create at the beginning of a project. The “cone
of uncertainty,” as McConnell calls it, does not narrow by itself,
it must be actively managed. As a result, McConnell concludes that
iteration must be iterative, project planning must be incremental,
and that estimates aren’t meaningful unless they contain a description
of their uncertainty.
7.最强大的重用是重用任何可复用的事物而不仅仅是代码复用
The most powerful form of reuse is reuse of everything — not just
code. We’ve long known that we should be reusing designs, plans,
checklists, role, etc; and McConnell reminds us that we should be
reusing processes for developing systems. Indeed, that’s what SEI-CMM
level 3 is all about.
8.风险管理给软件开发过程提供重要的洞察力
Risk management provides important insights into software development.
McConnel notes that most projects spend more than 50% of their effort
on unplanned work, and that the role of risk management is to reduce
unplanned work.
9.不同类型和规模的软件需要不同类型的开发方法论
Different kinds of software calls for different kinds of software
development approaches. The “one size fits all” approach to software
development methodologies is just plain silly
10.软件工程体系和指南是软件开发人员的重要资产
The Software Engineering Body of Knowledge (SWEBOK) is an important
asset for software developers. SWEBOK has detailed information about
10 different areas of software development, including the familiar
ones of analysis, design, construction, and testing. McConnell notes
that it can be used for curriculum development, career development,
certification, interviewing, and building a technical skills inventory. |