作为纯粹思维的产物,软件可以无限扩展,异常复杂,没有一种极端有效的武器(银弹),能够一劳永逸地解决软件开发效率和产品质量方面的问题。
和业界相比,华为公司软件的复杂度更上一层楼。产品数量异常庞大,很多产品的代码量可达千万行级别,以嵌入式软件为主,运行环境强依赖特定平台和系统集成,不论规模、复杂性、集成度都超出想象。这对质量管理是非常大的挑战。
“过程决定质量”这一业界经验指导无数企业在质量管理上取得成功,华为也是借鉴这个思想,把软件开发的过程具象化,“庖丁解牛”,划分为不同的部分,即从架构到设计、编码、构建、测试的全过程,持续挖掘软件潜力,对软件质量和效率提升的效果非常显著。
在这个过程中,分层分域解耦、图论算法、Committer机制、开发者测试、持续集成等活动,是一些颇有成效的实践。
作者:华为ICT产品与解决方案质量与运营部
来源:《质量为纲》 中信出版集团
架构设计:模块乐高化
例行重构让软件“永葆青春”
对于软件来说,变化是永恒的,不变是暂时的。需求在变,语言在变,框架在变,工具在变……再好的架构,生命力也是有限的。
随着环境变化、新技术引入等,架构一定会走向腐化,怎么修修补补都无济于事。这就需要例行重构,通过一次次“微创手术”,持续优化内部结构,减慢腐化衰老。
分层设计、功能内聚是最重要的架构治理模式之一。简单来说,就是要把复杂问题“分而治之”,同时保证分解后的各个组件像乐高一样灵活,高内聚、松耦合,最终集成为一个完整的整体。
比如,在传送网产品领域,传统软件架构是建造软件大楼的“基座”和“框架”,已经用了十来年,随着环境的变化以及新技术、新功能特性的引入,架构逐渐腐化。
5G微波产品的爆发式启动开发,将开发效率问题“逼上了梁山”。为了提高开发效率和质量,十余人的年轻优化团队,一边顶着巨大的交付压力,开发了5G微波等六七个新产品,一边痛下决心,用全新理念和架构重写了十年存量的279万行代码,将其优化为90万行。
如果说传统架构是“雕版印刷”,那么现有的架构就是“活字印刷”。以往每支持一款新的芯片都需要重建一套软件模型,但现在这一套统一的、可灵活拼装的通用模型,可以极大提升软硬件解耦和重用能力,实现“一次开发,多次使用”,而不是之前的“使用一次,开发一次”。
支持相似的单板,要修改的代码量比以往减少了一半以上,而且新代码在代码重复度、函数圈复杂度等多个关键指标上更优。
软件设计:图论算法“利刃出鞘”
实现软件性能倍增
为了进一步提升软件性能,华为在数学建模和算法引入上做了一些尝试。
以光网络为例,千丝万缕的光纤遍布在地球的每一寸土地,如人体的神经网络一样不断输送着光和信号。
随着网络的演进,站点和站内规模越来越大,光学频谱越来越宽,软件特性越来越多。2019年前,某光交换站点上,软件启动时间很长,严重影响了客户体验。从软件的角度进行性能突破,已经刻不容缓。
在思维碰撞中,该产品性能优化团队创新性地提出了“基于节点可达性的剪枝算法”。简单理解,就是将光层网络划分为多段直路,分别安排人去搜集沿途的信息,并以接力赛的形式进行传递,在每一个分岔路口提供路线指导。
由于大多数的搜索请求只是去某一类节点,如“便利店”“食堂”等,只要为每一种标签提供指引即可。引入算法后,光层路径搜索速度提升了30倍以上。
不过,这只是解决了生成路径数据的效率问题,数量没有发生变化,依旧占据大量的内存资源。于是,优化团队又借鉴了社会管理的户口制度,为每一个路径数据分配一个唯一的ID(标签身份),所有资源的分配和ID挂钩。这不仅大幅优化了软件内存,还可以支持更大规模的数据。
总结起来,产品性能优化团队从路径的搜索、遍历、存储三个角度,设计了一系列的图论算法,最终将内存优化了接近一半,启动速度提升了5倍以上,响应速度提升了100倍,支撑站点规模翻了4倍。
软件开发:应用软件工程方法
让“一砖一瓦”都可信
没有高质量的代码,高质量的产品就是空中楼阁。软件系统中的每行代码如同“一砖一瓦”,虽然看上去毫不起眼,但其质量的高低却会直接影响高楼大厦的安全与稳定。
华为用软件思维管软件,沿着Committer机制落地、开发者测试、持续集成,构建软件工程能力,持续提升软件质量和效率。
Committer机制是一种确保入库代码持续保持清洁的质量保障机制。以基站产品为例,软件架构复杂,技术难度大,质量要求高,且开发项目组涉及多个部门、多个地域的配合,新老开发者开发能力不同,代码提交后出现大量的基础质量问题,直接影响项目交付质量和进度。
为了改变这种情况,团队引入了Committer机制,选拔具备相应业务逻辑经验、软件工程技能水平较高的人员为committer,强化代码审视和同行协助活动。
“这段代码不够简洁。”
“这个函数不安全,容易造成内存泄露。”
“要注意编码的可读性以及可扩展性,不懂这块业务的人很难读懂。”
……
Committer的守护,让代码多了一层防线。每次合入代码的质量会得到门禁检查、代码检视和committer的入库审核等多维度看护,从而保障代码合入质量。同时,committer还可以帮助软件工程师有效理解规范和要求,交流更高效的代码实现方式,确保优秀经验得到有效传承。
此外,持续集成也是一种先进的软件工程实践,可以让团队以小增量、短周期的方式,开发有价值的软件,并保证软件随时可以可靠地发布上线。
以NCE产品为例,研发过程涉及十几个部门的相互配合,软件发布场景复杂,业务流程包含版本计划制订、例行任务设置、公共底座构建、产品域构建、软件包归档、安装部署、冒烟验证、转测试等主要流程。如果主线代码质量不过关,会导致一系列连锁反应。
NCE产品部构筑了个人级流水线、服务级流水线和版本级流水线三层流水线防护机制,将质量要求内嵌到各类流水线中。这就像把铁矿石炼成钢一样,只有经过层层淬炼,去除“硫”“碳”等杂质,才能冶炼出高质量的代码。
开发人员先将代码合入开发分支,小而频地调用持续集成流水线,持续集成流水线会根据预设流程,进行代码静态检查、开发者测试(DT)、构建、安装部署和自动化测试的层层筛选。
好比我们在支线上提前设置了多个过滤系统,水流过后泥沙变少,水变清澈,等到汇入主线时,后端的过滤系统只需要很小的工作量就可以保证水质了。
通过这种方式,主线版本质量得到了大幅提升,而且由于及时将代码进行冒烟测试,避免了很多问题在最后阶段才被揪出来。
以上措施保证了开发人员每天都有新版本进行联调测试,日构建版本可用度在98%以上,构建效率提升一倍,版本高频次、高质量发布。
软件质量和软件开发过程中的每一个环节息息相关,它就存在于每一次需求讨论中、每一次设计斟酌中、每一次提交代码的“回车”中……我们会持续在软件开发过程中落实质量,坚持华为是ICT高质量代名词不动摇。(完)