1 概论
软件=程序+软件工程
软件工程是什么?
软件工程:是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。
软件工程把计算机相关的技术和过程统一到一个体系中,叫“软件开发流程”。
软件开发流程的难点:
- 复杂性(Complexity)
- 不可见性(Invisibility)
- 易变性(Changeability)
- 服从性(Conformity)
- 服从性(Conformity)
计算机科学和软件工程
计算机科学中的理论研究部分,大多可以从形式上证明,与数学、离散数学、数理逻辑密切相关;计算机科学中与实践相关的部分,都和数据以及其他学科发生关系;
软件工程则和人的行为、现实社会的需求息息相关。软件工程的研究目标(软件的开发、运营和维护)都有“人”出现,这些“人”可以是项目需求的提供者,可以是软件的开发人员,还可以是软件的用户。
计算机科学和软件工程的不同侧重点
软件工程的“工程”二字意味着它和许多工程领域的学科,以及管理学科有很大的关系。软件团队开发和维护软件的行动,就和质量控制理论中的PDCA(Plan-Do-Check-Act)模型有很深的联系。
软件工程知识领域
2014年,IEEE发布了SWEBOK V3.0(Software Engineering Bodyof Knowledge),下面是其中提到的15个知识领域(Knowledge Area,KA)
- Software Requirements
- Software Design
- Software Construction
- Software Testing
- Software Maintenance
- Software Configuration Management
- Software Engineering Management
- Software Engineering Process
- Software Engineering Models and Methods
- Software Quality
- Software Engineering Professional Practice
- Software Engineering Economics
- Computing Foundations
- Mathematical Foundations
- Engineering Foundations
2 个人技术和流程
好的单元测试
单元测试应该准确、快速地保证程序基本模块的正确性。
单元测试应该产生可重复、一致的结果。
注意,100%的代码覆盖率并不等同于100%的正确性!
分析如下:
- 代码覆盖率对于“应该写但是没有写的代码”无能为力。例如代码申请了内存或其他资源,但并没有释放。又如,代码中并没有处理错误情况。就像没有处理和文件、网络相关的一些异常情况,例如文件不存在、权限有问题,等等。
- 代码中有效能问题,虽然代码执行了,并且也正确地返回了,但是代码效率非常低。有些情况下,可以针对代码效率写一个单元测试。
- 多线程环境中的同步问题,这个问题和代码执行的时序、共享资源的锁定有关。
- 其他与外部条件相关的问题(例如与设备、网络相关的问题)。
回归测试
“退步”(Regression):在构建时,一个模块从正常工作的稳定状态退化到不正常工作的不稳定状态。
如果“倒退”是由于模块的功能发生了正常变化引起的(例如,我们要修改模块,支持电子邮件地址以.name为最后的域名),那么测试用例的基准就要修改,以便和新的功能保持一致。
针对一个Bug Fix,我们也要做Regression Test。目的是:
1. 验证新的代码的确改正了缺陷
2. 同时要验证新的代码有没有破坏模块的现有功能,有没有Regression
效能分析
“效能测试,分析,改进,再效能测试”的流程
个人开发流程
卡内基梅隆大学(CMU)的能力成熟度模型(CMM和CMMI),是用来衡量一个团队能力的一套模型。
CMU的专家们针对软件工程师也有一套模型,叫 Personal Software Process(PSP)。
随着工程经验的增长,工程师会将更多时间花在需求分析和代码测试上,而不是代码编写。
PSP的目的是记录工程师如何实现需求的效率,而不是记录顾客对产品的满意度。
根据最新的版本(PSP2.1)来看看一个软件工程师在接到一个任务之后应该怎么做