现代软件工程第二章
软件工程师
软件工程师的特质
责任感,敏锐的意识,坦诚,抗压能力 ,公平感,注重细节,务实,技术能力
程序员应具备的基本技能
1.编写代码和阅读代码:
程序设计语言,集成开发环境,读懂已经存在的代码
2.代码质量(保证自己负责的代码的质量)
代码规范,测试,调试
3.版本控制(管理自己或团队代码)
个人在软件团队中的作用
软件系统的绝大部分模块都是由个人开发或维护的。在软件工程的术语中, 我们把这些单个的成员叫做 Individual Contributor (IC).
个人工作的质量直接影响产品质量
软件团队
高效团队的特征
目标意识,参与意识,信任意识,进步意识,技能的多样化
团队的组织模式
封闭模式—遵循传统的权利层级模式
随机模式—团队松散,依靠团队成员的个人自发性
开放模式—尝试组成一种团队,既具有封闭模式团队的可控性,还具有随机模式团队的创新性。
同步模式—有赖于问题的自然区分 ,不需要很多的交流就可以将成员组织起来共同解决问题。
不同的团队类型
主程序员团队,
“一窝蜂”团队
功能团队
代码规范
编程的依据是详细设计的结果,因此程序的质量主要取决于设计,但代码的质量也在很大程度上影响着程序的质量(可理解性、可测试性、可修改性)
源程序文档化
在源程序中可包含一些内部文档,以帮助阅读和理解源程序
在源程序中的内部文档主要包括:
标识符的命名:
选择含义明确的名字,使其能正确提示标识符所代表的实体
名字不要太长,太长会增加打字量,且易出错。必要时可使用缩写
不用相似的名字,相似的名字容易混淆,不易发现错误
匈牙利命名法
要求前缀字母用变量类型的缩写,其余部分用变量的英文或英文的缩写,单词第一个字母大写。
小驼峰式命名法
第一个单词首字母小写,后面其他单词首字母大写。
大驼峰式命名法
每个单词的第一个字母都要大写。
下划线命名法
单词与单词之间通过下划线连接。
注解
程序中的注解用来帮助人们理解程序,决不是可有可无的
一些正规的程序文本中,注解行的数量约占整个源程序的1/3到1/2,甚至更多
注解分为序言性注解和功能性注解
序言性注释
通常置于每个程序模块的开头部分,主要描述:
模块的功能
模块的接口:包括调用格式、参数的解释、该模块需要调用的其它子模块名
重要的局部变量:包括用途、约束和限制条件
开发历史:包括模块的设计者、评审者、评审日期、修改日期以及对修改的描述
功能性注释
通常嵌在源程序体内,主要描述程序段的功能。
书写功能性注解时应注意的问题:
注解要正确,错误的注解比没有注解更坏;
为程序段作注解,而不是为每一个语句作注解;
用缩进和空行,使程序与注释容易区分;
注解应提供一些从程序本身难以得到的信息,而不是语句的重复。
程序的视觉组织
缩进
通过在程序中添加一些空格、空行和缩进等技巧,
帮助人们从视觉上看清程序的结构,通过缩进技巧可清晰地观察到程序的嵌套层次,同时还容易发现错误
自然的程序段之间可用空行隔开
可通过添加空格使语句成分清晰
也可以通过添加括号突出运算的优先级,避免发生运算的错误
语句构造
1.编码阶段的主要任务就是书写程序语句。有关书写语句的原则有几十种,总起来说,希望每条语句尽可能简单明了,能直截了当地反映程序员的意图,不能为了片面追求效率而使语句复杂化。
2.在一行内只写一条语句,并且采取适当添加空格的办法,使程序的逻辑和功能变得更加明确。
许多程序设计语言允许在一行内写多个语句。但这种方式会使程序可读性变差。因而不可取。
3.程序编写首先应当考虑清晰性,不要刻意追求技巧性,使程序编写得过于紧凑。
4.程序编写得要简单,写清楚,直截了当地说明程序员的用意。
数据说明
为了使程序中数据说明更易于理解和维护,可采用以下风格:
1.数据说明的次序应当规范化:
数据说明次序规范化,使数据属性容易查找,也有利于测试,排错和维护
原则上,数据说明的次序与语法无关,其次序是任意的。但出于阅读、理解和维护的需要,最好使其规范化,使说明的先后次序固定
2.说明语句中变量安排有序化
当多个变量名在一个说明语句中说明时,可以将这些变量按字母的顺序排列,以便于查找
3.使用注解说明复杂数据结构
如果设计了一个复杂的数据结构,应当使用注释来说明在程序实现时这个数据结构的固有特点
输入/输出
- 对所有的输入数据都要进行检验,识别错误的输入,以保证每个数据的有效性;
- 检查输入项的各种重要组合的合理性,必要时报告输入状态信息;
- 使得输入的步骤和操作尽可能简单,并保持简单的输入格式;
- 输入数据时,应允许使用自由格式输入;
- 应允许缺省值;
- 输入一批数据时,最好使用输入结束标志,而不要由用户指定输入数据数目;
- 在交互式输入时,要在屏幕上使用提示符明确提示交互输入的请求,指明可使用选择项的种类和取值范围。同时,在数据输入的过程中和输入结束时,也要在屏幕上给出状态信息;
- 当程序设计语言对输入/输出格式有严格要求时,应保持输入格式与输入语句的要求的一致性;
- 给所有的输出加注解,并设计良好的输出报表。
代码复审
也称代码评审,是指通过阅读代码来检查源代码与编码标准的符合性以及代码质量的活动。
复审的目的:在项目的早期发现缺陷,将损失降至最低。
1.编码错误,比如一些能碰巧骗过编译器的错误。
2.不符合项目组的代码规范的地方。
3.发现逻辑错误,程序可以编译通过,但是代码的逻辑是错的。
4.发现算法错误,比如使用的算法不够优化。
5.发现潜在的错误和回归性错误
发现可能改进的地方。
促进团队沟通、促进知识共享、共同提高。
结对编程
结对编程(Pair programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。
好处
提高质量,降低成本,提高解决问题的决心,提高士气,减轻风险,提高效率
坏处
工作方式的不同,让人感觉到威胁,时间可能花在培训上面,对个人情绪,自尊的影响
代码测试
单元测试
指对软件中的最小可测试单元进行检查和验证。
单元:就是人为规定的最小的被测功能模块。(函数、类、组件。)
回归测试
在软件项目中,如果一个模块或功能以前是正常工作的,但是在一个新的构建中出了问题,那么这 个模块就出现了一个“退步”(Regression),从正常工作的稳定状态退化到不正常工作的不稳定状态。
回归测试最好要自动化,因为这样就可以对于每一个构建快速运行所有回归测试,以保证尽早发现问题。单元测试是回归测试的基础.
如何单元测试
多个测试用例,一次执行;利用断言比较测试结果。
测试驱动开发
简称TDD
是一种不同于传统软件开发流程的新型的开发方法。
它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。
这有助于编写简洁可用和高质量的代码,并加速开发过程。
程序调试
软件调试
软件调试是在进行了成功的测试之后才开始的工作,它与软件测试不同,调试的任务是进一步诊断和改正程序中潜在的错误
调试活动由两部分组成:
确定程序中可疑错误的确切性质和位置
对程序(设计,编码)进行修改,排除这个错误
调试的特点
调试工作是一个具有很强技巧性的工作
软件运行失效或出现问题,往往只是潜在错误的外部表现,而外部表现与内在原因之间常常没有明显的联系,如果要找出真正的原因,排除潜在的错误,不是一件易事。
调试是通过现象,找出原因的一个思维分析的过程。
调试步骤
从错误的外部表现形式入手,确定程序中出错位置
研究有关部分的程序,找出错误的内在原因
修改设计代码,以排除这个错误
重复进行暴露了这个错误的原始测试或某些有关测试。
调试工具
单步跟踪
每次执行一条汇编指令
每次执行源代码一条语句
每次执行一个程序分支
每次执行一个过程
断点
代码断点。
设置断点的位置为某一段代码的起始处。当cpu执行到此代码时产生中断。
数据断点。
设置断点的位置为数据的起始地址。当被调试程序访问此数据的地址时,命中断点。可以定义触发断点的方式为:读/写断点。
版本控制
版本控制是指对软件开发过程中文件变更的管理
程序代码
配置文件
说明文档
版本控制的作用
追踪文件的变更
并行开发(多人协同开发,有效解决版本的同步,不同开发者之间的开发通信问题,提高协同开发的效率。)