icse 2019 https://ieeexplore.ieee.org/abstract/document/8805734
背景
软件开发人员必须在已实现代码中隐含的质量属性(例如安全性、性能、功耗、可靠性和可用性)之间 进行权衡。
例如,在实现管道来连接两个组件时有很多考虑因素:
- 是否应该对数据流进行加密和签名以确保机密性,这可能会降低性能作为副作用
- 如果是,则要使用的算法?
- …
为了做出最佳设计决策,开发人员必须是所有这些领域的专家,才能了解和评估大量备选方案。此外, 涉及质量属性权衡的设计决策通常是隐含的,在代码中无法直接观察到。
为了解决这些问题,本文提出了一种称为 ToD 的新开发概念,通过使质量属性权衡成为代码和设计的明确组成部分,从而使质量属性权衡成为first-class的编程实体。
ToD 将现有实现重用于领域专家创建的设计决策库中重复出现的设计决策;
使非专家开发人员能够为每个设计决策声明性地指定质量属性,可选择优先级; 并自动从库中选择最适合的实现。
方法设计
应用于管道示例的 ToD 概述。
- Contract。用于质量属性不同的设计决策实现的功能接口
- Design Decision Implementation。设计决策实现是相应合约的具体实现。 它的特点是它支持某些质量属性的程度。 Contract可以通过许多不同的实现来实现。 每个实现都提供跨多个维度(例如,性能、内存消耗、安全性)的质量属性。
- Quality Attributes。质量属性是表征合同实施的一个维度。 示例包括性能、内存消耗、安全性或特定于域的属性,例如精度或容错性。
- Application Context。有关预计运行软件的硬件(例如,内存、CPU 速度、核心数量和 GPU 属性) 和环境(例如,网络的速度、可靠性和安全性)的信息会影响关于哪种实现的决定最适合。
Implementation Selector。实现选择器会自动为Contract选择一个实现。
使用场景
Implementation。初级开发人员 Alice 需要为她的分布式银行系统实现管道。 她通过在索引中搜索术语“pipe”来浏览管道合同的设计决策库。 由于传输敏感数据,她高度重视数据机密性、数据完整性和可靠性。 她认为可用性应得到中等优先级,因为确保正确传输数据更为重要。 性能被指定为最低优先级, 因为延迟是可以接受的。 因此,她创建了一个效用函数,根据这些优先级对这些质量属性进行加权,并将其传递给设计决策库。由于她知道硬件属性和网络容量,因此她按照管道合同文档中的建议将这些信 息添加到应用程序上下文中.
- Changing Requirements。经过一段时间的测试,Alice 意识到两个组件之间发生了一些不涉及敏感数据的通信,由于加密开销,这成为了性能瓶颈。 由于质量属性权衡在代码中表示为一级实体,因此她可以直接跟踪做出此决定的位置。 因此,她将数据机密性的范围缩小到仅敏感数据交换,并提高了瓶颈处的性能优先级。 在内部,不同的实现用于相应类型的通信,并且系统现在可以根据更改的需求进行定制。
- Implementation Update。位安全研究人员刚刚发布了一种新的加密算法,该算法提供更高级别的安全性,同时仍然比现有算法计算速度更快。 此属性由附加到实施的自动化测试以及了解库中所有加密算法的其他领域专家的评估确定。 Alice 不知道这个新的进步,但由于实现成为设计决策库的一部分,她的应用程序会自动选择改进的版本。 在下一次部署之后,她的银行应用程序运行得更快,并提供了更高级别的安全性。因此,作为非安全专家的 Alice 可以重用安全研究人员创建的高质量实现。 一般来说, 设计决策库应该由领域专家社区开发和维护,而目标受众主要是非专家开发人员。
不足与挑战
- 如何处理与Contract 接口不匹配的实现?
- 如何评价质量属性?