优秀软件工程方法的基本原则


软件工程是指在创建软件产品和应用程序时使用系统工程原理。它是一门工程学科,涉及评估用户需求、软件设计、开发、测试和维护。

以下是一些优秀的软件工程基本原则:

  • 更好的需求分析是一种基本的软件工程技术,它提供了对项目的全面了解。最终,对用户需求的透彻理解通过提供满足其需求的高质量软件解决方案为用户创造价值。

  • 所有设计和实现都应该尽可能简单,这意味着遵循 KISS(保持简单,愚蠢)原则。它将代码简化到调试和维护都变得更容易的程度。

  • 软件项目成功的最重要方面是在整个开发过程中保持项目的愿景。由于对项目有清晰的愿景,因此可以正确地开发它。

  • 软件项目中包含许多功能;所有功能都应使用模块化方法进行设计,以使开发更快更容易。由于这种模块化,功能或系统组件是自包含的。

  • 抽象是关注点分离思想的专门化,用于抑制复杂事物并为客户/用户提供简单性,这意味着它只为用户提供他们需要的东西并隐藏其余部分。

  • 三思而后行是软件工程中必不可少的概念,这意味着在开始实现功能之前,必须首先考虑应用程序架构,因为对项目开发流程的正确计划会产生更好的结果。

  • 当开发人员组合所有功能时,他或她随后可能会发现它们不再需要。因此,坚持“永不添加额外功能”的方法至关重要,因为它只实现了真正必要的功能,从而节省了时间和精力。

  • 当其他开发人员处理另一人的代码时,他们不应该感到惊讶,也不应该花费时间试图弄清楚发生了什么。因此,在关键阶段改进文档是一种改进软件项目的绝佳方法。

  • 应该遵守迪米特法则,因为它根据功能分离类并减少耦合(类之间的连接和相互依赖性)。

  • 开发人员应该以满足通用性原则的方式设计项目,这意味着它不应该局限于特定的一组案例/功能,而应该不受人为约束的限制,并且能够为具有特定或一般需求的客户提供全面的服务。

  • 一致性原则在编码风格和 GUI(图形用户界面)设计中很重要,因为一致的编码风格使代码更容易理解,而一致的 GUI 使用户更容易学习界面和程序。

  • 如果需要某些东西并且它已经存在,则永远不要浪费时间;相反,请使用开源以您自己的独特方式解决它。

  • 持续验证确保软件系统满足其需求并发挥其预期功能,从而提高软件质量控制。

  • 为了摆脱当前的技术行业狂潮,使用最新的编程方法至关重要,以便以最及时和最复杂的方式满足用户的需求。

  • 为了扩展和处理对软件应用程序不断增长的需求,应在软件工程中保持可扩展性。

  • **关注点分离** - 关注点分离认识到人类需要在受限的环境中运作。根据 G. A. Miller [Miller56],人类的大脑一次只能处理大约 7 个数据单元。一个单元是一个人已经学会作为一个整体处理的单个想法或概念。尽管人类似乎具有无限的抽象能力,但抽象成为一个有用的工具需要时间和反复使用;也就是说,作为一个单元发挥作用。

    在定义数据结构组件的行为时,通常需要考虑两个方面:基本功能和数据完整性支持。当尽可能将这两个关注点分离到不同的客户端方法集中时,数据结构组件通常更容易使用。如果客户端文档分别处理这两个问题,客户端将受益。单独考虑核心算法和数据完整性以及异常处理的更改也有助于实现文档和算法说明。

    关注点分离也很重要,因为另一个原因。为了提高产品的质量,软件开发人员必须处理复杂的值。我们可以从算法复杂度的研究中吸取宝贵的教训。尽管存在使单个可测量变量最大化的有效方法,但需要优化多个数量的问题几乎总是 NP 完全的。虽然这没有得到证明,但大多数复杂性理论专家认为,多项式时间算法无法解决 NP 完全问题。

    鉴于此,分离不同值的处理似乎是合适的。这可以通过在软件开发过程中的不同时间处理不同的值来实现,或者通过安排架构使不同的组件负责获取不同的值来实现。

    运行时效率是与其他软件值发生冲突的一个值的示例。因此,大多数软件工程师建议将效率视为一个单独的问题。在创建程序以满足其他需求后,可以评估和分析运行时间以发现时间在哪里花费。如果需要,可以使用大部分运行时间的代码区域进行更新以减少运行时间。Ken Auer 和 Kent Beck 在 [VCK96,第 19-42 页] 中的论文“惰性优化:高效 Smalltalk 编程模式”详细介绍了这个概念。

  • **模块化** - 模块化概念是关注点分离原则的一个子集。遵循模块化概念需要根据其功能和职责将软件分解成组件。Parnas [Parnas72] 撰写了关于模块化问题的第一批文章之一。[WWW90],一篇较新的论文,在面向对象的上下文中提供了一种责任驱动的模块化技术。

  • **抽象** - 抽象原则是一种关注点分离概念的专门化。抽象原则要求将软件组件的行为与其实现分离。它需要学习从两个角度检查软件和软件组件:它们做什么以及它们如何做。

    未能将行为与实现分离通常会导致不必要的耦合。例如,在递归算法中,通常会添加其他参数以使递归工作。之后,应使用提供其他参数的适当初始值的非递归外壳调用递归。否则,调用者将面临更复杂的行为,这将需要指定其他参数。如果最终将实现切换到非递归方法,则需要更改客户端代码。

    对于处理抽象,契约式设计是一种关键技术。Fowler 和 Scott [FS97] 概述了契约式设计的核心概念。Meyer [Meyer92a] 对该方法提供了最全面的描述。

  • **变更预期** - 计算机程序是计算机辅助解决问题的解决方案。问题发生在软件用户知道的上下文或领域中。该领域指定用户需要处理的数据类型以及它们之间的关系。

    另一方面,软件工程师熟悉数据抽象技术。他们使用结构和算法,而无需考虑数据的含义或重要性。软件开发人员可能会根据图形和图形算法进行构思,而无需赋予顶点和边具体的含义。

    因此,找出问题的自动化解决方案对于软件工程师及其客户来说都是一个学习过程。软件开发人员正在学习客户端操作的领域。他们还了解客户的价值观:哪种数据呈现风格对客户最有价值,以及哪些类型的数据至关重要并且需要特定的保护措施。

    客户越来越了解软件技术可以带来的解决方案的广度。他们也正在学习根据其满足客户需求的能力来评估潜在的解决方案。

    如果要解决的问题很复杂,那么在短时间内找到最佳答案是不合理的。另一方面,客户需要快速响应。大多数情况下,他们不愿意等到找到理想的答案。他们希望尽快得到一个可接受的答案;完美可以等待。程序工程师需要了解需求,或者软件应该如何运行,以便提供及时的解决方案。变更参与的概念承认软件工程师及其客户的学习过程的难度。早期应制定初步需求,但应允许在学习发展过程中调整标准。

    耦合是转化的一个重大障碍。如果两个组件紧密连接,更改一个几乎肯定需要替换另一个。

    内聚性对可变性有积极的影响。当需求发生变化时,内聚组件更容易重用。如果一个组件将多个作业组合到一个包中,那么在进行修改时几乎肯定需要将其拆分。

  • 通用性 - 通用性的概念与变更预期概念相关联。创建不受人为约束和限制的软件至关重要。使用两位数的年份数字是人为约束或限制的一个突出示例,这导致了“2000年问题”:将在世纪之交混淆记录保存的软件。尽管两位数限制当时似乎是可以接受的,但优秀的软件通常会超出其预期的使用寿命。

    将客户的业务方法更改为自动化软件作为通用性概念在实践中的另一个示例。他们通常试图满足广泛的需求,但他们根据其现有行为来识别和表达他们的需求。随着他们对自动化解决方案能力的了解越来越深入,他们开始认识到他们需要什么,而不是他们目前正在做什么来满足这些需求。这种差异类似于抽象差异的概念,但其后果在软件开发过程的早期就实现了。

  • 分步开发 - Fowler 和 Scott [FS97] 对增量软件开发方法进行了简洁而全面的概述。此方法涉及分步构建软件,例如一次添加一个用例。

    使用增量软件开发方法可以更容易地进行验证。如果您以少量增量构建软件,则在进行验证时只需要处理新引入的功能。如果发现任何错误,它们已经被部分隔离,从而使其更容易纠正。

    通过精心策划的增量开发策略,也可以更容易地处理需求变更。为此,规划必须确定最有可能更改的用例,并将它们放在开发过程的最后。

  • 一致性 - 一致性的概念认识到在熟悉的环境中执行任务更容易。例如,编码风格是一种以统一的方式编写代码文本的方法。这实现了两个目标。首先,它使理解代码变得更容易。其次,它使程序员能够自动化代码输入所需的一些能力,从而使他们能够专注于更重要的挑战。更高级别的一致性包括创建用于处理常见编程问题的习惯用法。

更新于: 2021年11月29日

2K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告