1 概论

软件=程序+软件工程

软件工程是什么?

软件工程:是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。

软件工程把计算机相关的技术和过程统一到一个体系中,叫“软件开发流程”。
软件开发流程的难点:

  • 复杂性(Complexity)
  • 不可见性(Invisibility)
  • 易变性(Changeability)
  • 服从性(Conformity)
  • 服从性(Conformity)

计算机科学和软件工程

计算机科学中的理论研究部分,大多可以从形式上证明,与数学、离散数学、数理逻辑密切相关;计算机科学中与实践相关的部分,都和数据以及其他学科发生关系;
软件工程则和人的行为、现实社会的需求息息相关。软件工程的研究目标(软件的开发、运营和维护)都有“人”出现,这些“人”可以是项目需求的提供者,可以是软件的开发人员,还可以是软件的用户。

NeatReader-1600427829800.png
计算机科学和软件工程的不同侧重点

软件工程的“工程”二字意味着它和许多工程领域的学科,以及管理学科有很大的关系。软件团队开发和维护软件的行动,就和质量控制理论中的PDCA(Plan-Do-Check-Act)模型有很深的联系。

软件工程知识领域
2014年,IEEE发布了SWEBOK V3.0(Software Engineering Bodyof Knowledge),下面是其中提到的15个知识领域(Knowledge Area,KA)

  1. Software Requirements
  2. Software Design
  3. Software Construction
  4. Software Testing
  5. Software Maintenance
  6. Software Configuration Management
  7. Software Engineering Management
  8. Software Engineering Process
  9. Software Engineering Models and Methods
  10. Software Quality
  11. Software Engineering Professional Practice
  12. Software Engineering Economics
  13. Computing Foundations
  14. Mathematical Foundations
  15. Engineering Foundations

2 个人技术和流程

好的单元测试

单元测试应该准确、快速地保证程序基本模块的正确性。
单元测试应该产生可重复、一致的结果。

注意,100%的代码覆盖率并不等同于100%的正确性!
分析如下:

  1. 代码覆盖率对于“应该写但是没有写的代码”无能为力。例如代码申请了内存或其他资源,但并没有释放。又如,代码中并没有处理错误情况。就像没有处理和文件、网络相关的一些异常情况,例如文件不存在、权限有问题,等等。
  2. 代码中有效能问题,虽然代码执行了,并且也正确地返回了,但是代码效率非常低。有些情况下,可以针对代码效率写一个单元测试。
  3. 多线程环境中的同步问题,这个问题和代码执行的时序、共享资源的锁定有关。
  4. 其他与外部条件相关的问题(例如与设备、网络相关的问题)。

回归测试

“退步”(Regression):在构建时,一个模块从正常工作的稳定状态退化到不正常工作的不稳定状态。

如果“倒退”是由于模块的功能发生了正常变化引起的(例如,我们要修改模块,支持电子邮件地址以.name为最后的域名),那么测试用例的基准就要修改,以便和新的功能保持一致。
针对一个Bug Fix,我们也要做Regression Test。目的是:
1. 验证新的代码的确改正了缺陷
2. 同时要验证新的代码有没有破坏模块的现有功能,有没有Regression

效能分析

image.png

“效能测试,分析,改进,再效能测试”的流程

个人开发流程

卡内基梅隆大学(CMU)的能力成熟度模型(CMM和CMMI),是用来衡量一个团队能力的一套模型。
CMU的专家们针对软件工程师也有一套模型,叫 Personal Software Process(PSP)。

随着工程经验的增长,工程师会将更多时间花在需求分析代码测试上,而不是代码编写。
PSP的目的是记录工程师如何实现需求的效率,而不是记录顾客对产品的满意度。

根据最新的版本(PSP2.1)来看看一个软件工程师在接到一个任务之后应该怎么做
image.png