1、软件工程开发第一章 软件工程基本观念1.1 软件工程的目标与常用模型 软件工程的目标是提高软件的质量与生产率,最终实现软件的工业化生产。对开发人员而言,如果非得在质量与生产率之间分个主次不可,那么应该是质量第一,生产率第二。软件工程的主要环节如图1所示,软件开发过程一般包括可行性与需求分析、系统设计、程序设计、测试和维护。图1 软件工程环节常见的软件工程模型有:线性模型,渐增式模型,螺旋模型,快速原型模型,形式化描述模型等等。虽然线性模型比较简单,太理想化,但是每一个非线性的模型都能转化为一系列简单的线性模式,因此在其他模式中需要灵活运用线性模式。 1.2 软件开发的基本策略 1.2.1 复用
2、在一个新系统中,大部分的内容是成熟的,只有小部分内容是创新的。应该把大部分的时间用在小比例的创新工作上,而把小部分的时间用在大比例的成熟工作中。我们将具有一定集成度并可以重复使用的软件组成单元称为软构件。软件复用可以表述为:直接使用已有的软构件,即可组装(或加以合理修改)成新的系统。这样可以提高生产率和质量。图2应用软构件产生应用软件1.2.2 分而治之 我们可以把复杂的问题分解成N个简单的问题,再逐个寻求解决方法。但是最终的目的是要保证单个的简单问题可以通过程序实现,组装后能够使原本复杂的问题得到合理解决。1.2.3 优化折衷 优化是用以优化软件的各个质量因素,但不能面面俱到,应折衷,其目标
3、就是协调各个质量因素,实现整体质量最优。而不能盲目得拆东墙,补西墙。第二章 软件开发过程各个环节介绍2.1 可行性分析与需求分析 2.1.1 可行性分析要求可行性分析是从经济、技术、市场与政策及人员方面分析这个项目做还是不做。2.1.2 需求分析要求当确定做之后,我们就要与客户交流,进行需求分析,但由于客户表达不清、需求自身经常变动或分析人员理解有误,都会导致需求分析困难。因此,有必要通过请教行家或者分析同类型产品,来做进一步的分析。2.2 系统设计2.2.1 体系结构设计体系结构就如同人体中的骨架,是软件系统中最本质的东西。其中层次结构和客户机/服务器结构是两种非常通用的软件体系结构。每个系
4、统均有一个体系结构,我们在没有必要地情况下不可以修改。2.2.2 模块设计模块设计过程不仅要考虑本身提供什么样的功能,还要考虑该模块与其他模块如何交流。常用以下三个特征进行模块优劣的评价:“信息隐藏”、“内聚与耦合”和“封闭开放性”。模块的信息隐藏可以通过接口设计来实现,执行模块的功能或与模块交流信息必须且只须通过调用公有接口来实现。内聚是模块内部各成分之间的关联度,而耦合是模块间的依赖程度,在模块设计时应做到强内聚,弱耦合。2.2.3 数据结构与算法设计在算法设计时我们主要要从时间和空间的角度考虑软件的效率。时间与空间的优化也应该采取折中的方式。2.2.4 用户界面设计人机界面设计应从合适性
5、、风格和广义美上着手。做到吸引眼球和谐,才能吸引客户。2.3 程序设计本节主要讲述了编程的一些小注意事项,需养成良好的编程规范。1、命名约定 (1)宏定义用大写字母加下划线表示,如MAX_LENGTH; (2)函数用大写字母开头的单词组合而成,如SetName, GetName ; (3)指针变量加前缀p,如 *pNode ; (4)BOOL 变量加前缀b,如 bFlag ; (5)int 变量加前缀i,如 iWidth ; (6)float 变量加前缀f,如 fWidth ; (7)double变量加前缀d,如 dWidth ; (8)字符串变量加前缀str,如 strName ; (9)枚
6、举变量加前缀e,如 eDrawMode ; (10)类的成员变量加前缀m_,如 m_strName, m_iWidth ; 2、使用断言:使用assert函数可以追踪断点,检查程序是否有出错。 3、new、delete与指针:在C中是malloc与free,在申请内存后,要记得释放。要防止指针指向已释放的内存。4、使用const :const可定义有类型的常量,可确保此常量不被改变。5、不要将BOOL值TRUE和FALSE对应于1和0进行编程。2.4 测试与改错2.4.1 测试测试的目的在于发现尽可能多的错误,而不是为了说明程序中没有错误。测试可分为测试和测试。测试是公司内部人员进行的测试,其
7、中开发人员要做白盒测试,就是已知各模块的结构进行单步调试,而测试小组要做黑盒测试,主要是看模块接口是否正确,输出结果是否正确。测试是请用户过来试用,发现在试用中出现的一些问题,提交测试报告。2.4.2 改错在发现错误之后需要及时大胆得修改,但是修改之后还要重新测试,以免引入新的错误。2.5 维护与再生2.5.1 维护软件维护划分为主要的三类:纠错性维护、适应性维护和完善性维护。(1)纠错性维护。由于前期的测试不可能找出所有潜在的错误,用户在使用软件时仍将会遇到错误,诊断和改正这些错误的过程称为纠错性维护。 (2)适应性维护。由于新的硬件设备不断推出,操作系统和编译系统也不断地升级,为了使软件能
8、适应新的环境而引起的程序修改和扩充活动称为适应性维护。 (3)完善性维护。在软件的正常使用过程中,用户还会不断提出新的需求。为了满足用户新的需求而增加软件功能的活动称为完善性维护。 2.5.2 再生 再生工程主要出于如下愿望:(1)在商业上要提高产品的竞争力;(2)在技术上要提高产品的质量。再生工程与维护的共同之处是没有抛弃原有的软件。再生工程主要有三种类型:重构、逆向工程和前向工程。 重构是再原程序上修改,不改变体系结构。而逆向工程是从其他同类产品中提取有用信息,再加以修改。前向工程也称预防性维护,则会根据需求对软件进行预防功能的完善,减少未知错误发生。第三章 小结看完软件工程思想之后的一些
9、感受。1、 在软件编程的时候不要过分依赖一些开发书籍,要在尊重原程序的基础上,添加自己的想法,而不是生搬硬套。2、 需求分析很重要,要先明确需求,然后要在设计的时候一边编程一边根据需求的改变而改变,越早修改,代价越小。3、 编程的时候越简洁越好,这样便于后人阅读理解修改,不要过多得使用编程中鲜为人知的技巧,适当添加解释性的注释。4、 在编程中,错误无大小,要正视自己的不足,吸取经验教训,及时改正。5、 做项目的是团队而非个人,在整个团队中,每个人都必须将自己的工作认真完成好,引用一个公式:成功=意愿*方法*行动,如果每个人每一步只及格的话,最后就只完成了21.6%,而团队里面每个人相乘,所做的工作就更少了,因此每个人都必须付出100%的激情与努力。6、将自己经常犯的编程错误记录下来,制成表格贴在计算机旁边。