软件质量保证
一位 Wikibookian 认为此页面应该拆分为具有更窄子主题的较小页面。 您可以通过将此大页面拆分为较小的页面来提供帮助。请务必遵循命名策略。将书籍分成较小的部分可以提供更多焦点,并允许每个部分做好一件事,这有利于所有人。 |
高质量的软件应用程序让用户感到满意。他们喜欢使用它,并且它不会妨碍他们。它能够快速产生正确的结果,无需解决错误的变通方法,不会崩溃或占用系统资源,并允许用户继续他们的生活。程序要么对他们来说是不可见的,他们不会考虑使用它,要么运行得非常好,以至于他们喜欢使用它,并可能向朋友推荐它。
另一方面,质量差的软件应用程序会让用户感到恼火、烦躁和/或沮丧,甚至会导致他们损失大量时间、金钱或更糟糕的情况。它要么太慢,以至于他们失去耐心等待它执行其功能。要么它经常崩溃或占用系统资源。要么它可能看起来很丑陋,或者具有设计糟糕的用户界面。要么它有其他错误,例如导致数据丢失的错误。无论其缺陷是什么,它都无法或部分无法成为用户手中有用的工具。
作为软件开发人员,我们的使命是确保我们开发的软件是高质量的,以便它能够正常执行其功能,而不会给用户带来痛苦或损失。
现在我们可以提出两个问题
- 是什么使软件具有高质量?
- 如何确保我们的软件确实具有高质量?
第一个问题的答案比较简单:维基百科有一篇关于软件质量的文章,以及Shlomi Fish撰写了一篇题为“是什么使软件具有高质量?”的文章,列举了许多良好软件应用程序的方面。大多数最终用户可以通过使用程序并证明他们对它的看法来判断程序是否为高质量(当然,不同的人可能会发现使或不使软件适合他们的不同方面)。
一旦我们解决了这个问题,我们现在就可以专注于第二个问题:我们如何确保我们的软件是高质量的。这将是本书的主题。这个问题或它的各个方面一直是无数书籍、论文、文章、博客文章和其他写作的主题。在这本书中,我们将尝试涵盖所有方面,并给出对实现高质量程序的各种建议方法的各个方面的各种观点。毕竟,询问两位软件开发人员有关软件工程某些方面的问题,您将得到三个不同的答案。
编写良好程序的第一条规则是“不要立即编写它”。相反,寻找一项可以完成您想要完成的所有或大部分工作的现有成果,并加以利用。软件商店重新实现现有软件的趋势被戏称为“此处未发明”综合征(或简称 NIH)。如果您能够重用现有代码来完成您想要做的事情,那么您将能够更快地完成。
由于定价、许可、法律或其他方面的原因,现有成果可能并不总是适合使用。例如,许多开源项目重新实现了专有软件:OpenSSH 是 SSH 协议的客户端和服务器的开源实现,该协议已经有一个专有实现;GNU Octave 是专有 Matlab 的纯净室实现;KDE 和 GNOME 桌面(以及后来的 XFCE)旨在为专有 CDE 桌面提供开源替代方案;等等。GnuTLS 的开发人员不得不开始对 OpenSSL 进行纯净室重新实现,因为 OpenSSL 具有一个有问题的(但仍然是开源的)许可证,与 GNU 项目青睐的 GPL 许可证不兼容。而且这种情况还在继续。
有时,给定的软件包可能存在太多错误而无法挽救,可能与目标平台(操作系统、编程语言、处理器架构、虚拟机等)不匹配,因此重新实现可能更快。尽管如此,通常可以找到足够接近的东西作为需要解决的任务的基础,并且可以重用此代码。
Joel Spolsky 在他的“Joel on Software”网站上撰写了一篇题为“为‘此处未发明’综合征辩护”的文章,他在文章的结尾说:“如果它是一个核心业务功能——无论如何都要自己做。”
一些查找已编写软件的良好来源包括,但请注意,大量此类代码可能是在某些许可证下许可的,例如GNU 通用公共许可证,这些许可证与“收缩包装”非开源软件(即所谓的“专有软件”)的一些使用不兼容。
- 软件目录,例如Freshmeat或自由软件基金会的自由软件目录
- 开源软件开发中心(“Forge”),例如SourceForge。
- 通用网络搜索引擎,例如Google 搜索。
- 各种Linux 发行版和其他发行版或操作系统的软件包存储库。
- 各种语言或平台的软件包集合,例如 Perl 编程语言的CPAN(“全面 Perl 档案网络”)。
通常,使用良好的搜索引擎(尝试多个关键词)和 Freshmeat 进行搜索就足够了。如果您仍然想确保,您可以尝试询问是否有人可以在流行的互联网中继聊天 (IRC)网络(如Freenode)的相关频道或不同类型的互联网论坛中为您指出此类程序。
功能规范是旨在解释最终用户将如何与程序交互以及程序将如何响应的设计文档。Joel Spolsky 在他的“Joel on Software”网站上有一篇关于编写功能规范的四部分系列文章,他在其中介绍了编写功能规范的原因和方法。此外,可以找到一些开源项目的以下开放内容功能规范
- 自由职业者公告板的功能规范(具有圣经主题)。
- 改进 CPAN 模块分类的功能规范(以 FOSS 世界名人为主题)。
- Windows 软件包管理系统功能规范(以奥兹与米莉中的角色为特色)。
有些人认为,编写和准备功能规范所需的时间最好花在编写代码上(为了他们的辩护,应该注意的是,编写它们比编写其他设计文档(如全面的技术规范)要少得多)。在开源软件的背景下,功能规范可能与《大教堂与集市》系列文章中的建议不一致,埃里克·S·雷蒙德在该系列文章中声称,程序员应该在他们能够以集市风格开始开发之前,独自完成一个有限的工作版本。
代码设计是在最初阶段进行的一项脑力活动,用于规划代码未来发展的方向。设计的方法有很多:编写技术规范(可能不完整),在编写代码之前编写文档,与团队进行设计会议,思考,编写笔记,准备图表等等。大多数软件开发人员在面对这个问题时,都会同意在编写代码之前做好代码设计是一个好主意,因为修复设计糟糕的代码可能会花费更多的时间成本。
一些软件工程学派(例如极限编程)指出,无论向实际程序员交付多少设计,他或她仍然需要自己进行最少的设计,例如决定如何构建子程序的内部结构,或者如何命名临时变量。
极限编程方法倾向于不赞成“前期大设计”,即在实现时将应用程序设计到最细微的细节,声称这很可能被证明是错误的,很可能浪费大量时间,并且会让底层程序员感觉自己受到了轻视。相反,它提倡每周进行一次设计会议,以确定代码未来的发展方向。
待办事项:添加更多内容。
重构是指在不改变代码外部行为的情况下,提高代码内部质量(或优雅性)的过程。根据马丁·福勒的《重构》一书(以及之前人们“清理”代码的经验),重构可以通过对现有代码库应用一些易于理解的转换来完成,同时在每个点上都保持代码的完整性,需要很少的精力并且很少有破坏代码的风险。
除了重构之外,一些程序员有时会觉得需要重写代码的某些部分,他们认为这些部分要么完全不优雅,要么无法满足代码新功能所需的任务。这种重写的一种极端形式是从头开始项目,这被称为完全重写。
待办事项:添加Joel的“你永远不应该做的事情,第一部分”,以及“Rub a dub dub”,关于ack-users邮件列表中重写的讨论。