如何控制系统软件的复杂度
2023-10-23 16:52:48 184
本文总结自参考链接的内容。
概要
本文主要讨论了几个减少软件系统复杂度的方法。首先是对于非核心组件,应该购买现成的软件而不是自己研发,以减少复杂度。其次是通过统一编码规范、代码审查和重构、统一命名规范等方法来降低代码复杂度。此外,文章还提到了在关键函数和变量命名上反映业务而不是程序逻辑,以及保证系统架构上的可沟通性等方法来简化系统。最后,文章还强调了编写单元测试和自动化部署来加快质量反馈时间。
软件的复杂性来自两个方面:本质复杂度和偶然复杂度, 控制复杂度的核心是接受本质复杂性, 消除偶然复杂性。
对于非核心组件能买就买
不应该自己去投入研发数据库、调度系统、消息队列、分布式缓存等软件。通过购买的方式,研发团队完全不用承担这些复杂度,也能轻松地支撑好用户规模的增长。
减少编码过程带来的复杂度
- 统一团队的编码规范,确保所有成员使用相同的风格和命名约定,建立清晰的文档和开发指南;
- 定期进行代码审查和重构,及时发现并解决冗余、重复或不必要的代码;
- 采用统一的命名规范,使不同模块中的概念命名一致,减少理解成本;
- 推行系统架构的设计审核,及时发现并纠正不符合标准和设计原则的代码;
- 加强团队内部的沟通和协作,提高成员对系统整体的理解和把控;
- 提供培训和指导,帮助团队成员理解系统架构和设计原则,以便他们能够在开发中做出更合理的选择;
- 注重持续集成和自动化测试,确保系统在被多人开发时的稳定性和可维护性。
关键函数变量命名上反应业务,而不是程序逻辑
比如
function emailsForCustomers(customers, goods, bests) {
var emails = [];
for(var i = 0; i < customers.length; i++) {
var customer = customers[i];
var email = emailForCustomer(customer, goods, bests);
emails.push(email);
}
}
function biggestPurchasePerCustomer(customers) {
var purchases = [];
for(var i = 0; i < customers.length; i++) {
var customer = customers[i];
var purchase = biggestPurchase(customer);
purchases.push(purchase);
}
}
应该改成:
function emailsForCustomers(customers, goods, bests) {
return map(customers, function(customer) {
return emailForCustomer(customer, goods, bests);
});
}
function biggestPurchasePerCustomer(customers) {
return map(customers, function(customer) {
return biggestPurchase(customer);
});
}
架构上,保证跨系统之间可沟通性
- 避免不同子系统对同一概念有不同的名称。
- 建立跨团队、跨部门的系统架构师角色,负责对系统整体进行设计和控制。
- 确保团队目标一致,避免不同团队在负责不同目标的同时对系统进行开发和演进。
- 加强沟通协作,提高团队间的协同性,避免各个子系统之间独立开发导致的系统复杂度增加。
- 关键问题域要有唯一的负责人
- 进行定期的复杂度分析和梳理,及时发现系统中的冗余和重复的部分,合并或重构相关的子系统,减少概念和术语的重复出现。
- 设计文档应当写清楚系统上下文图,以便清晰地展示系统不同组件和子系统之间的关系,帮助工1. 程师更好地理解系统整体结构和各部分之间的依赖关系。
- 加强团队协作和共享知识,在团队成员之间建立一个统一的语言和上下文,减少交流和理解时的翻译成本和误差。
- 注重培养工程师的系统思维和架构能力,使他们在需求提出时就能够考虑系统上下文,从整体和长远的角度思考问题,并能够提出合适的解决方案。
通过写单元测试,自动化部署加快质量反馈时间
单元测试应该具有以下特点:
- 提供清晰的质量反馈:每次运行单元测试,应该能够及时获得有关代码质量的反馈,避免出现等待多个小时或多天的情况。
- 包含必要的断言(assert):单元测试应该包含适当的断言,用于验证代码的预期行为和输出。
- 稳定可信的测试集:编写的单元测试应该是稳定的,即代码是好的,测试是正常通过的。测试集应该可靠,可以被信任,确保捕捉到代码中的问题。
- 执行时间较短:单元测试应该在短时间内运行完成,避免长时间等待,可以增加开发效率。
- 手动编写单元测试而非代码生成:为了保证单元测试的有效性和意义,应该手动编写单元测试代码,而不是依赖于代码生成工具。这样做可以更好地理解代码逻辑和需求,并确保测试覆盖范围。
参考:
https://mp.weixin.qq.com/s/f82GBadLcQJCiFHcGWzkCA