第一部分:软件工程的概述
一 软件=程序+软件工程
在看到这个公式时,我想大家也很容易理解这个,一个软件的实现都离不开程序的支持,程序是软件的“血肉”,那么仅仅有程序就可以了吗?答案是否定的,因为一个优秀的软件,离不开好的架构和设计方案,更离不开团队的共同协作,,,,,,,那这一系列的实现,一定需要相关的方法,而这些方法和思想,正是我们软件工程所要研究的部分,这就是我们软件”骨架“。
接下来,给大家举一个简单的例子:现在我们是一名建筑设计师,要建设北京的鸟巢体育场,目前所需的建筑材料和工人都已经到位,那么现在我们要做的就是如何通过系统的,有序的,可量化的方式方法把这些元素有机的组合到一块,形成一个建筑,这个鸟巢不仅坚固而且还美丽漂亮.。那么我想软件工程就是把需求分析,设计,写码,维护等一系列过程有机的组合到一块,从而形成一个用户认可的软件(这个用户认可可能没有一个统一的标准),那么这就是软件工程所要做的。
我们先补充点基础知识,重点介绍一下程序这个概念:先看一下官方定义:程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。为实现预期目的而进行操作的一系列语句和指令。程序,在这里指的是源程序,就是一行一行的代码。仔细看过去,它们的确是建立在数据结构上的一些算法。(程序=数据结构+算法)但是光有代码还是不行的,这些一行一行的代码不会自己运行,得有人编译成机器能懂的目标代码,而编译不仅仅是 cc 和 link 命令,对于一个复杂的软件,我们不但要有合理的软件架构(Software Architecture),软件设计和实现 (Software Design & Implementation), 我们还要用各种文件来描述各个程序文件之间的依赖关系,编译参数,链接参数,等等。这些都是软件的构建。
在软件的开发过程的当中,我们的代码不可能是一成不变的,对代码进各方面的改动,有时候需要更改程序的配置,这些过程是对源代码的管理,我们称之为配置管理,我们还有一系列的工具和程序来保证程序的正确性,这些工具和程序本身应该更正确,才能保证别的软件的质量,这就是质量保证, 具体的验证过程叫软件测试.,同时,我们的软件时有一定目的性的,在做软件之前,我们需要对软件进行相关的需求分析,把相关的可行性要求列举出来,为以后的工作做好准备,接下来就是软件的设计,编码的实现,测试,到最后的软件交付,后来,我们也可能对软件进行相关的测试和后期维护。
软件生命周期(SDLC,Systems Development Life Cycle,SDLC):是软件的从产生直到报废或停止使用的生命周期(上面叙述的一系列过程),周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段,这种按时间分程的思想方法是软件工程中的一种思想原则,即按部就班、逐步推进,每个阶段都要有定义、工作、审查、形成文档以供交流或备查,以提高软件的质量。
软件的核心部分是:构建管理,源代码管理,软件测试,项目管理,到后来,我们也包括了用户的体验,用户界面的设计,也包括相关的商业用途和行为。
所以,上面讲解的所有的内容就是为了推导:
软件=程序+软件工程
从而得到一个扩展的推论是:
软件企业=软件+商业模式
程序是所有内容进行的基础,软件工程决定了软件的质量和使用周期,商业模式决定一个软件企业的成败
二 软件工程是什么?
(一)软件工程的定义;
(1)概念: 软件工程是把系统的, 有序的, 可量化的方法应用到软件的开发, 运营, 和维护上的过程。
(2) 软件工程包括下列领域: 软件需求分析, 软件设计, 软件构建, 软件测试, 和软件维护.
(3)加深理解:我们在开发,运营, 维护软件的过程中有很多技术, 做法, 习惯, 和思想体系。 软件工程把这些相关的技术和过程统一到一个体系中, 叫 “软件开发流程”,软件开发流程的目的是为了提高软件开发, 运营, 维护的效率;以及用户满意度, 可靠性,和软件的可维护性。
(二)软件工程的特点:
(1)复杂性:
软件可以说是人类创造的最复杂的系统,大型的软件系统有着超过数百万的代码,同时,软件的各个模板之间有着各种各样的依赖关系,随着系统的成长和模块的增多,这些关系的数量的增长速度也会是很快的,随意复杂性也可想而知。
(2)不可见性:
软件代码的运行方式是以机器代码的形式运转的,我们看到的源代码并不等于软件本身,软件的最终运行形式我们是看不到的,一单出现错误(代码量大的情况下),我们无法准确的重现程序到底出现什么问题,这个不可见性也是很可怕的。
(3)易变性:
客户的需求不可能是一成不变的,随着用户需求的变化,软件的可变性也随之增加,有时候修改软件的改变部分是很困难的。
(4)服从性:
软件开发的目的是为人们服务,它需要一定的硬件需要,同时也要符合用户的需求,这一些的服从性也是非常重要的一部分
(5)非连续性;
人们很容易理解连续性,增加输入,就能看到相应的输出增加,但是许多软件系统却没有这样的特性,有时候输入很小的变化,会引起输出极大的变化
(三)软件工程的目标:
(1) 研发符合用户需求的软件
(2) 通过一定的软件流程,在预计的时间内发布“足够好”的软件
(3) 通过数据和其他方式展现所开发的软件时可维护和继续发展的
注意:
评判是否足够好的标准:
A:用户的满意度:Bug少,符合用户的需求,软件的效率高
B:可靠性:软件的运行性能良好,安全性高
C:软件流程的质量:软件团队人员的组件,还有团队的整体能力和职业素质等,与软件的Bug成负相关关系。
D:可维护性:软件期初的架构有问题,导致软件的维护难度增大,对软件的整个生命周期也会造成相应的影响。
第二部分:个人开发流程
软件开发的过程中,团队的开发是不可避免的一种表现形式,但是团队的发展,离不开个人的努力,然而,个人的开发也需要一定的开发流程来提高我们的而开发效率和产品的质量,接下来我们看一下个人开发的具体开发流程
(一)具体操作流程图:
(二)PSP的特点:
• 不局限于某一种软件技术 (如编程语言), 而是着眼于软件开发的流程, 这样不同应用的工程师可以互相比较。
• 不依赖于考试, 而主要靠工程师自己收集数据, 然后统计提高。
• 在小型,初创的团队中, 高质量的项目需求很难找到,这意味着给程序员的输入质量不高,在这种情况下, 程序员的输出 (程序/软件) 往往质量不高, 然而这并不能全部由程序员负责。
• PSP 依赖于数据
• 需要工程师输入数据, 记录工程师的各项活动, 这本身就需要不小的代价。
• 如果数据不准确或有遗失, 怎么办? 让工程师编造一些?
• 如果一些数据不利于工程师本人 (例如: 花很多时间修改缺陷), 我们怎么能保证工程师能如实地记录这些数据呢?
• PSP的目的是记录工程师如何实现需求的效率, 而不是记录顾客对产品的满意度。工程师可能很高效地开发出一个顾客不喜欢的软件, 那这个工程师还是一个优秀的工程师么?
这些内容在邹欣老师的《构建之法》的基础之上做的重点总结。由于是初学者(大神可绕过),部分观点可能不太正确,欢迎大家批评指正!让我们一起进步!
参考资料:《构建之法》邹欣 人民邮政出版社