分类: 项目管理
2009-07-16 13:54:53
1好程序的标准
(1) 能够工作;在程序风格方面,要注意以下三点:
先保证正确,再提高执行速度;
先保证安全,再提高执行速度;
先保证清晰,再提高执行速度。
(2) 调试代价低,所花时间少;
(3) 易于维护;
(4) 易于修改;
(5) 不复杂的设计;
为了使程序易于调试维护和修改,最合理的办法(有时也是唯一的办法)就是使程序简单。
(6) 高效;80% 20%原则。
为了得到高性能的程序,应采用下面的方法:
(a) 先用直截了当的方法写程序,强调简单,易读,可靠;
(b) 程序工作后,再把最花机器时间的那部分程序优化,不要再作普遍的优化,只优化那些确实值得优化的程序;
2 美国一些学者建议的软件工程硕士毕业生应具备的水平
(1)能在系统分析、设计、编码、调试这四个领域中的每一个领域内,准确地使用至少一种最新方法,从事软件的研发工作;
(2)有能力用精心设计的实验对自己编制的软件进行调试与测量,以验证软件系统的质量(例如可靠性和效率),并识别出系统中需进一步完善的那些部分;
(3)有能力至少在一个有意义的领域内,研制出先进的专用软件系统。这里所说的有意义的领域可以是操作系统、编译系统、数据库管理系统、信息管理系统和其他各种有价值的应用领域;
(4)能有效的管理一个中等规模的软件项目,既3-7人做1-2年的项目;
(5)能和用户、经理及其他技术人员进行有效的讨论和联系;
(6 ) 能很快的学会新的软件工程方法,能跟得上计算机科学领域内的有关进展;
(7)有能力评价、选择和实现新方法。
3 结构化程序设计的思想
三种基本的控制结构:顺序、选择、循环;自顶向下的设计方法;一个入口一个出口。
普遍认为应允许的控制结构(1)多分支结构;(2)REPEAT型循环;
一些人认为应允许的控制结构:DO f LEAVE IF c ELSE g AND REPEAT。
4程序调试是表明程序故障存在的有效方法,但在证明程序故障不存在方面无能为力
5逐步求精的设计方法
下面举一个例子说明逐步求精方法。要编一个程序DISPLAY,执行下述任务:
读一串整数,该串整数以一个负数作为结束标记。当读到一个正整数N时,打印N个星号,然后换行;当读到0时,打印出数字0,然后换行。这样就以一种图形方式(即线条长度)一目了然地显示了这一串整数的变化。
下面来研究程序员编制这—程序的思维过程。由于此程序是用来读和处理一串数的(以负数结束),故很易想到用一个循环。每循环一次处理一个数,我们把此数称作WIDTHOFBAR(即线条长度),以后应把它说明为INTEGER变量。WIDTHOFBAR的值表示应该打印的星号个数。每个整数占一行,所以打完后应换行,然后该循环必须读入下一个整数。这些考虑导致下面的程序骨架。
层1概要
PROGRAM DISPLAY(INPUT,OUTPUT);
说明部分;
BEGIN
读第一个WIDTHOFBAR;
WHILE非数据结束DO
BEGIN
输出WIDTHOFBAR的表示形式
开始新的一行输出;
读下一个WIDTHOFBAR
END
END( * DISPLAY * )。
上面的程序只是一个抽象程序,常被称为“伪代码”,并不能被机器执行。大写字母组成的英文字已是PASCAL形式了,中文表示的则是某些要执行的动作或某些要计算的表达式的非正式描述。例如,“非数据结束”应是一布尔表达式,但现在我们并不打算把它严格化(即细化)。我们只要求在层l阶段得到一个程序骨架。
在作任何进一步的细化之前,我们能对整个程序进行检查。这种检查是用试样输人数据对程序动作进行追踪的办法实现的,但都是手工完成的。例如,对于上面层1的程序概要,可以选择输入数据:
5 16 8 4 0 2 1 —1
然后追踪程序的动作,看它如何读数据,改变变量值,测试条件以及打印输出。特别要注意输出结果是否符合问题的规范。假如检查发现错误,则应在层1概要中修改,层1没有错误后才能进入层2。程序概要不能看作临时草稿,细化也不应看作“修正”和“改错”。每一层的程序概要应是正确和完整的,只是详细程度只适合于那一层的要求。
当层1概要检查正确后,应进一步细化。层1中最复杂的步骤是“输出WIDTHOFBAR的表示形式”,所以我们先细化这一步。当WIDTHOFBAR为正时,应打出一行星号,星号的个数即WIDTHOFBAR的值。
细化1.1:输出WIDTHOFBAR的表示形式
IF WIDTHOFBAR=0 THEN
以数字形式订印WIDTHOFBAR
ELSE
打印WIDTHOFBAR个星号
层1的其他组成都分均可直接细化成PASCAL语言,不必再进—步细化了。
细化1.2:读下一个WIDTHOFBAR
READ(WIDTHOFBAR)
细化1.3:开始新的一行输出
WRITELN
细化1.4:非数据结束
WIDTHOFBAR>=0
细化1.5:读第一个WIDTHOFBAR
READ(WIDTHOFBAR)
把上述细化结果代入层1概要,使得到更加详细的层2程序概要。
层2概要
FROGRAM DISPLAY(INPUT,OUTPUT);
说明部分;
BEGIN
READ(WIDTHOFBAR);
WHILE( WIDTHOFBAR>=0 ) DO
BEGIN
IF WIDTHOFBAR=0 THEN
以数字形式打印WIDTHOFBAR
ELSE
打印WIDTHDFBAR个星号;
WRITELN;
READ(WIDTHOFBAR)
END
END( * DISPLAY * )。
继续细化前,必须对此进行检查。仍可用上面的试样输入数据。
层2概要中只有两个成分需进一步细化。我们选择较复杂的“打印WIDTHOFBAR个星号”来说明。我们很容易用语句WRITE(‘*’)打印一个星号。为打印若干个星号,应把此语句放在一个计数控制的循环中。
细化2.1:打印WIDTHOFBAR个星号
BEGIN
准备输出一行;
WHILE WIDTHOFBAR个星号尚未打印完DO
再打印一个星号
END
细化2.2:以数字形式打印WIDTHOFBAR
WRITE(WIDTHOFRAR :1)
代人层2概要,将得到层3程序概要,这里不再整个列出
我们研究上面的
WHILE WIDTHOFBAR个星号尚未打印完DO
再打印一个星号
的进一步细化问题。此循环程序必须记住已打印了多少个星号,为此我们引
入整形变量STARCOUNT(记住以后将要给出说明)。每次开始打一行星号
时,STARCOUNT将置为0;每打一个星号,STARCOUNT加1。这样
STARCOUNT的值就代表当前行已经打印的星号个数。
细化3.1:WIDTHOFBAR个星号尚未打印完
STARCOUNT<WIDTHOFBAR
细化3.2:再打印一个星号
BEGIN
WRITE(‘*’),
STARCOUNT:=STARCOUNT十1
END
现在我们研究
准备输出一行的进一步细化问题。此时应置STARCOUNT为0;另外还需注意:打印0时,只占一列,即打印在第一列上(见细化2.2)。为了与打印星号情况有正确的对比,当打印一行星号时,应从第二列开始打,第一列应打印空白。
细化3.3:准备输出一行
WRITE(‘ ’),
STARCOUNT:=0
现在整个程序已表示成PASCAL语句,只是说明尚未加上。因为我们已知道所需的全部变量,故最终写成如下形式:
细化3.4:说明部分
VAR
STARCOUNT,WIDTHOFBAR, INTEGER
这样就完成了程序DISPLAY的逐步求精,最终得到下面的程序
层4 程度
PROGRAM DISPLAY(INPUT,OUTPUT)
VAR
STARCOUNT,WIDTHOFBAR,INTERGER
BEGlN
READ(WIDTHOFBAR);
WHILE WIDTHoFBAR>=0 DO
BEGIN
IF WIDTHOFBAR=0 THEN
WRITE(WIDTHOFBAR:1)
ELSE
BEGIN
WRITE(‘’);
STARCOUNT:=O;
WHILE STARCOUNT<WIDTHOFBAR DO
BEGIN
WRITE(‘*’)
STARCOUNT := STARTCOUNT+1
END
END;
WRITELN;
READ(WIDTHOFBAR)
END
END( * DISPLAY * )
6 自顶向下的设计、编码与调试的优点
(1)促进有条理的思维。先全局后局部,先整体后细节,先抽象后具体.比较容易使程序有一完整清晰的总体结构,易于理解,不易出错。
(2)设计工作(指分解和确定各模块的输入、输出和功能)由一人完成,大大减少接口约定方面的不一致问题。
(3)先编高层模块的程序,有利于发现下一层模块设计方面的问题。编码是最严格和准确的,迫使程序员更仔细地考虑该模块实际上做些什么事。往往框图成其他工具表达中有含糊之处,到编码时才会发现。尽早发现下层模块的设计错误是很有好处的,可以减少返工。
(4)传统意义上的系统联调实际上已不存在。自底向上时,联调任务十分繁重,工作量大、难度大,一下子把这么多的模块连接在一起,很可能会出现接口方面的问题。一旦要修改接口,可能引起整个程序较大的返工。自顶向下的调试则完全不同,每步调试只增加一个模块,而且高层模块反复被调试和考验。这是有好处的,因为高层模块往往是整个程序的总控部分,比较关键。
(5)程序的重大接口首先调试。这样,重大错误可能在项目的早期阶段发现,而在项目后期出现的大多为次要的故障。
(6)系统的骨架能较早运行,尽管低层模块的细节尚未编制。这样用户能较早看到系统的某些效果,有利于纠正全局性错误。当骨架运行时,程序员的信心将显著增加。
7 主程序员组的组织形式
主程序员组的固定成员是主程序员一人,辅助程序员一人,程序资料员(或秘书)一人。外加的程序员、系统分析员和技术员将依据项目的规模和类型,按需要随时加入组内。
主程序员是一高级程序员,负责整个软件系统的开发,他是该组的技术经理。主程序员将亲自完成软件系统的关键部分的设计、编码和调试。
辅助程序员也是一高级程序员,他的任务是在细节上给主程序员以充分的支持。他必须完全熟悉该项目的开发工作,当需要时他将取代主程序员的职责。因此,在项目的所有阶段,包括设计、编码、调试和管理等方面,辅助程序员都是很括跃的。通常,在主程序员的指导下,辅助程序员将考虑不同的设计方案,并制定调试计划。
从上面的职责描述可以看出。主程序员和辅助程序员必须在程序技术方面和项目管理方面具有经验和才能。他们必须在技术上是称职的,在系统分析、规范、设计、具体编码和系统调试等所有方面都是高度熟练的。由于主程序员和辅助程序员将承担系统关键部分的具体编码,他们必须十分熟悉操作系统和程序语言的使用。作为技术经理.他们应能管理组内技术事务,制定开发计划并监督计划的实施。他们还应善于和更高层的管理人员以及用户共事。
当项目较小时,主程序员、辅助程序员和资料员三人就能完成整个系统。当项目较大时,需要再增加几个程序员、系统分析员或其他专家。这些增加的人员将在主程序员的安排下完成系统的某些功能。例如可能从事低层模块的存根编码,低层模块的详细编码,高层子系统的编码,直到复杂的数学分析和算法开发。这些工作都是在主程序员的安排下进行的。当项目涉及到比较复杂的法律和财政问题时,还需增加一个项目经理。这样可以使主程序员专心致志于项目的开发和技术管理方面。
8 结构化程序设计总结