1.1 程序及质量保证方法

1.1.1 程序及质量要求

产品的质量问题:

  • 外在质量(用户观点):用户可直接感觉到的,外在的功能和性能
    • 如正确性、高效性、可靠性、友好性
  • 内在质量(程序员观点):用户无法直接感触到,维修人员能认识到
    • 如可理解、可修改、可维护、可重用

1.1.2 质量保证方法

  • 编码规范:好的编码风格可以提高代码的可读性和理解性,可维护性和可重用性
    • 目标:易读性(一看就懂)、简明性(结构清晰)、易改性、无二义
    • 代码布局:缩进、大括号换行、一行一条语句
    • 代码组织:一定次序说明顺序、字母顺序说明对象、尽量避免嵌套、统一缩进
    • 命名规范:有意义和一目了然的命名方式,用英文单词,不要过长,尽量全称
    • 代码注释:注释说明程序做什么、为什么这么做、注意事项。在语句块的头尾注解、有效必要简洁、随着代码的修改而修改
  • 设计方法
    • 语句设计:单入口单出口,少用goto,加强异常处理
    • 模块化设计:尽量将程序按照模块编写,如函数、过程、方法、类、程序包
    • 高内聚度:模块内各要素紧密相关,仅实现单一功能。
    • 低耦合度:不同模块间的关系应当非常松散。
  • 代码重用:在编写代码的过程中,充分利用已有和现成的代码
    • 优点:可以极大提高编程效率和程序质量
    • 现成代码来源:他人子功能代码片段、函数库、开源代码
  • 结对编程:两位程序员坐在统一工作台前一起开发软件
    • 一方具体编写程序,另一方看程序和发现问题,双方相互讨论,周期性互换角色
    • 软件开发是集体性、群体性行为。
    • 优点:提高程序质量、提高开发效率、促进学习交流

1.1.3 质量分析方法

  • 人工审查:纯粹通过阅读和理解代码,来发现缺陷和问题
    • 审查内容:是否符合编程规范、是否存在错误和缺陷
    • 缺点:效率低、难以发现深层次问题、难以全面系统分析
    • 主体分类:自我复审、同伴复审、团队复审
  • 自动化工具审查:由计算机软件来自动完成代码审查,在 无需运行被测代码 的前提下
    • 审查内容:是否符合编程规范、是否存在错误和缺陷
    • 优点:可快速定位隐藏错误和缺陷
    • 常见分析工具:SonarQube, CheckStyle, FindBugs, PMD, Jtest 等
  • 软件测试技术:设计测试用例→运行测试用例→判断运行结果

1.2 软件及其特点

1.2.1 软件

软件的定义:在计算机系统的支持下,能够完成特定功能和性能的 程序、数据和文档

软件中的文档

  • 定义:记录软件开发活动和阶段性成果、软件配置及变更的阐述性资料。
  • 优点:可以帮助定义和理解软件、记录软件开发成果、辅助开发人员交流
  • 分类:需求文档、设计文档、测试文档、用户手册等等

软件中的数据

  • 定义:程序的加工处理对象和结果
  • 形式:用户、订单、交易、日志数据
  • 处理方式:表示、获取、存储、检索、分析

软件不仅仅是程序,开发软件不仅仅是编写程序。

软件生命周期

  • 定义:软件从提出开发到最终灭亡所经历的时期。
  • 各阶段:需求分析 $\Rightarrow$ 软件设计 $\Rightarrow$ 编码实现 $\Rightarrow$ 软件测试 $\Rightarrow$ 部署运行 $\Rightarrow$ 使用维护

软件特点

  • 逻辑性:是思维活动的产物,不会磨损和老化
  • 易变性:需求经常变,难以把控
  • 复杂性:规模大、运行复杂
  • 是设计开发而成的
  • 缺陷具有隐蔽性

软件的分类

  • 应用软件:面向特定应用领域的专用软件,如淘宝、12306、微信等等
  • 系统软件:对计算机资源进行管理,为应用软件的运行提供基础设施和服务的一类软件。介于计算机硬件和应用软件之间。如操作系统、数据库、编译软件等等
  • 支撑软件:辅助软件开发和运维的软件。如 SonarQube, Visual Studio 等等

1.2.2 开源软件

闭源软件

  • 代码不对用户开放的一类软件,购买软件时只提供可运行软件或服务,没有提供源代码。
  • 许可证 (License) 的方式授权用户使用软件。
  • 问题:无法掌握软件内部实现情况,限制开发者的创新自由。
  • 示例:Windows, Office 等

开源软件

  • 源代码可以自由获取和传播的计算机软件。
  • 通过 开源许可证 赋予被许可人对软件进行使用修改和传播。
  • 好处:源代码可自由传播、激发创作者热情、降低使用成本、质量更高更安全、研制和交付更快、功能更为强大
  • 示例:Linux, Ubuntu, Eclipse, Kubernetes, MySQL, TensorFlow 等
  • 开源软件正在逐步替代闭源软件

开源软件代码托管平台:Github, SourceForge, Gitee

软件开发知识分享平台:Stack Overflow

开源许可证:声明获得开源代码后拥有的权利,界定对别人的开源作品进行何种操作、何种操作是被禁止的,规范开源软件的使用要求和约束

1.2.3 软件质量

软件质量要素:

  • 正确性、可靠性、健壮性、有效性、安全性
  • 可维护性、可移植性、可重用性
  • 可理解性、可信性、持续性、可用性、互操作性