我在华为写了13年代码的一些感悟

一天晚上,我和老婆聊天,说部门要我写个“大咖谈软件”的文章,老婆斜了我一眼,淡淡地说:“Linus大神21岁就写出了Linux内核的雏形,缔造了一个自由主义的开源世界;张小龙28岁写出了foxmail,在2000年就卖出了1200万的价格。大咖,认识您这么久了,还不太了解您有什么杰出的成就?”我讪讪地咽了口水:“好吧,我重新组织下语言,我需要写个谈软件的文章……”

回首过去这半年,软件总工、软件专家的任命,还有新年伊始任总《全面提升软件工程能力,打造可信的高质量产品》的发文,都让我们这些写了十多年代码的软件工程师激动不已。我2006年进入公司,几乎参与了华为3G控制器产品的完整生命周期,见证了华为3G从起步、上升、灵魂深处的改进、巅峰、回落的波澜壮阔历程,并在35岁“高龄”有幸加入到5G开发部的大家庭。

十几年来,我一直坚持在编码岗位,经历了普通开发人员、TL、MDE、MDEL、SDM(云化团队)、Committer、软件专家等各种岗位。然而我却深知,不算大牛的我,从事编码这个“高危”职业十几年而没有被拿去“祭天”,依靠的是一个程序员的自我修养——扎实的基础软件能力、如履薄冰的工作态度、对技术孜孜不倦的追求。

▲幽默的“祭天”说明


1好代码长什么模样?

记得几年前部门第一次评选优秀代码,我成为“金码奖”获得者之一。是因为代码很炫吗?并不是。我参与评选的代码,遵循着简单的原则:简洁、逻辑清晰、函数职责单一、合理的数据结构设计。并没有使用高深的编码技巧,也没有应用某某设计模式。正如公司最新的C/C++语言编程规范,也是将编写简洁的程序放在首位。简洁、逻辑清晰的代码,易于阅读和维护,这段代码后面也因需求变化而被修改,但却从来没有引入过网上问题。

当然,简单不代表没有思考,恰恰相反,更需要我们在写代码之前谋定而后动、三思而后行。有一次项目组安排我做性能优化,通过反复分析热点函数、反复测试比对不同话务模型下的性能差异,前前后后花了3个星期的时间,我找到了引起性能恶化的最关键因素。最终我决定采用修改备份机制、减小备份数据的优化措施。这些方案代码改动都很小、很简单,但实际优化效果却很好,满足了未来几年业务发展的需求。

再来看另一个例子,某局点升级新版本后出现CPU负载上升的问题。经过近两周的攻关,我最终定位是新版本在业务处理流程中新增了直接读取DB内核的操作。直接读取DB内核,代码处理简单,也能正常实现业务功能,但是性能却非常差。如果开发过程中能多想一步,采用缓存的方案,性能会有天壤之别,也是更好的代码。

人们常说唯一不变的就是变化,客户需求一直在变化,我们的代码也会被动或者主动地在变化。设计出可扩展、自动适应客户需求变化的软件架构,是软件工程师永恒的追求。这说说容易,做起来却很难。需要我们不停积累业务知识,扩展知识面,勤于思考,识别技术未来演进趋势。我们无法从一开始就做一个无所不能的架构,来包含未来的千变万化,即使能,交付节奏也不一定允许。满足当前及未来一定时间内业务需要的设计,或许就是最合适的。

2练好扎实的基本功

能写出好代码,更要能持续地写出好代码,需要我们深刻理解技术原理和业务逻辑。前提是具备扎实的编程基础,即基础软件能力,如基础的数据结构和算法、编译原理等。

去年底,我跟部门几个软件高手一起,去外部参加了一次互联网架构大会。AI、区块链、物联网、云、中间件等时尚、热点、风口相关的议题非常多。但是我没想到,最火爆的却是一些基础软件设计、架构设计和演进之类的专题。就像武侠小说写的一样,练好基本功、练好内功,后续无论什么精妙招式,都会信手拈来。

另外,一些编程习惯,如果坚持下去,对于编程修养提升也是非常有用的。比如快捷键的使用、有效的代码注释、命名规则、代码风格等。每次写代码除了追求好代码之外,我都会时刻去思考软件上的优化,能否能使用更少的内存,能否有更好的性能。重视数据结构中的每一个字段,重视每一处小的代码优化,都有可能给我们带来意想不到的收获。比如去年做性能优化,我们仅仅是将流程中的一处动态内存申请修改为静态内存池,却意外获得了30 CAPS(每秒呼叫次数)的性能提升。

▲团队合影

3一行代码引发的惨案

有人问,道理我都懂,为什么却依然写不出好代码?

很多开发人员,因为个人习惯、赶工期、外部要求不高等多种原因,在编程时特别随意,直接Copy-Paste。我觉得程序员应当像追求生活品质一样,养成不将就的编程习惯、严谨的编程态度。

对于代码上库,我一直都是战战兢兢,如履薄冰。上库前我会反复看自己修改的代码,看修改代码的上下文,并进行修改前后代码比对。代码上库后再看几遍,确保都已按预期合入。进入公司这么多年,自己从来没有多合、漏合、错合过任何一行代码。

大家可能会觉得我这是小题大做,但事实上,这都是历史上曾经发生过的惨痛教训。我们在某国升级新版本后发现用户接入成功率恶化,最后定位是由于一行代码被误删除导致的。事后回溯,开发人员自己都不记得这一行代码为什么会被删除。还有一次,一行代码被误删除,导致一个关键KPI指标:软切换统计次数有变更。部门把这两起事件总结为“一行代码引发的惨案”,无论是对产品品牌、客户印象、还是对于个人,都造成了恶劣的影响。

事后大家都在思考,我们有结对编程、代码检视、开发者自测试等非常完善的开发流程,还有MDE(模块设计师)检视作为代码上库前的“守门员”,为什么还会发生这么低级的错误?是流程没执行到位,还是MDE疏忽、没把好关?

在IPD 2.0变革中,公司借鉴开源组织的Committer运作,来加强我们的Committer机制和文化。5G开发部也选拔、任命了一批Committer,我有幸成为其中之一。刚开始履行Committer职责时,我有点疑惑:这不就是给MDE角色披上了新的外衣,把MDE原先“私下”做的事情,通过Committer统计数据给呈现出来嘛?

不过,经过几个月的摸索、实践后,我渐渐地明白,Committer机制应该是一种文化上的变革,牵引大家提升自己的软件能力。Committer的职责很多,作为代码提交前的最后一道关卡,这是在当前人员能力不足阶段有效果,但是最终应该被弱化的一项实践。参与编码前的软件设计、持续做好架构看护和技术债务清理,让大家都有更大的机会写出更好的代码,我认为这是Committer更大的价值。

随着个人和组织的软件工程能力提升,自动化测试防护网和变更防护墙建设完善之后,前面提到的“一行代码引起的惨案”,是可以避免的。

4“变更防护墙”够不够可靠?

对于大部分老员工,特别是无线2G/3G/4G等部门的老员工来说,一提到变更控制,都会如临大敌。版本升级后,KPI变差是绝对不允许的,严重时可能面临版本回退、客户投诉和上报事故。而KPI变好,除了要向客户解释,还有可能面临商务风险,客户会觉得之前吃亏了。现实世界对我们就是这么苛刻,谁让我们是影响世界的通信软件工程师呢,他们这是爱之深、责之切啊!

我们开发一个版本,动辄涉及几十万代码的新增、修改或重构。要想不引入变更问题,除了做好设计、结对编码、代码检视和测试之外,我认为最关键的就是完善的自动化防护网。在3G时,我带着两个同事将IT测试工程从只有几百个用例扩充到上万个用例。全方位的场景覆盖、严密的信元有效性检查、完善的用例失败判决机制、无死角的资源泄漏检查等手段,让变更错误无所遁形,给3G留下了一道变更防护墙。

开发过程中补充IT和PC-ST测试用例,不是为了提升代码覆盖率,而是为了自动化防护。而要能达成自动化防护的前提,是每个用例都具备完善的有效性检查,否则防护网就是形同虚设。几年前,我跟一个同事开玩笑:“我会故意将某行代码改错,看看你补充的用例是否能检查出来。”让我意外的是,在交付紧张的情况下,他仍然多花了半天时间完善用例有效性检查,并请我故意改错代码来做试验。当然,最终的结果是,他准备得很充分,我没能发现问题。多么有自我追求的一个程序员!    

5保持对于新兴技术的好奇心

说起程序员的追求,我还想起了2016年参与的一个产品云化项目,我负责弹性伸缩特性的方案设计。在此之前,我一直在投入嵌入式软件开发,虽然期间产品也换了好几代的硬件,经历了产品与平台解耦、制式间解耦、软件与硬件解耦等过程,但是对于服务化、微服务化、云化等概念,我却基本处于懵懂的状态。

不懂怎么办,只能是“站在巨人肩膀上,为我所用”。兄弟产品线不是已经做了吗,那就找他们做同行协助;友商不是有路标和规划了吗,那就在他们的有限材料中寻找可借鉴的地方;互联网的亚马逊云、阿里云不是有非常成熟的方案了吗,那就下载他们的产品手册和用户指南……那段时间感觉自己就像是入了魔一样,疯狂地学习分布式软件相关技术,疯狂地吸收各方面的能量为我所用,最终给出了一个令自己和项目满意的设计方案。

这也让我充分意识到自己之前把眼光局限于所在产品、系统、子系统的不足。作为一个程序员,除了要提升自己的基础软件能力,我们也要始终保持对于新兴技术的好奇心,孜孜不倦的追求,不断拓宽自己的视野。而这方面的能力和诉求,在5G时代更是如此。

当前我们华为5G面临的网络安全问题,虽然有着很大的政治因素,但也从侧面反映了5G的战略意义。超高速率、超大连接数、超高可靠低时延,对我们在软件处理时延、可靠性、安全、韧性等方面的能力都提出了更高的要求。同时,5G承载的垂直行业应用、接口开放和硬件“白盒化”等趋势,也必将对我们当前的知识和技术体系,提出更大的挑战。

公司计划用五年的时间,全面提升软件工程能力,对我们是考验,也是机会。统一编程规范、整洁代码、整洁优雅的架构,不同的人有不同的追求,需要我们有持之以恒、水滴石穿的决心。五年或者十年后,当我们回首时,会发现自己曾经的付出是值得的。正如,清代著名学者王国维提出的读书三境界之第三境:“众里寻她千百度,蓦然回首,那人却在灯火阑珊处。”

也许我们绝大多数人终其一生也无法成为Linus、张小龙这样的大神。然而,我们能够做一个有修养的程序员,并参与到改变世界的华为5G产品开发中来,在人类的通信史中留下自己的优秀代码,幸哉。

本文来自《华为人》,作者:徐宏伟

原标题:写了十几年代码,我为什么还没有被拿去“祭天”?

Image placeholder
liubin9043
未设置
  67人点赞

没有讨论,发表一下自己的看法吧

推荐文章
我在华为做外包的真实经历!

一个爱钱如命,又有所不为的人。1写在前面我将用系列文章,回顾十年程序生涯,一方面是对职场生涯的阶段性总结,另一方面希望这些经历,对大家往后职场生涯有所启发。我很庆幸一路走来皆是自己的选择,虽然也走了不

开源社区的技术债:写代码的“码农”VS 删代码的“清道夫”,谁更该被嘉奖?

大数据文摘出品编译:楚阳、橡树、钱天培对于开源项目来讲,写新代码的贡献者不一定是好程序员,但不会删代码的程序员一定不是合格的程序员——因为“删代码”才是使开源软件项目的代码简洁高效的关键所在。Mong

在头条和百度搜索了100个关键词之后,我们发现……

作者|闫丽娇苏琦编辑|苏琦• 常用名词搜索方面,百度站外内容占比更高,内容来源比头条更多元。头条搜索的信息流广告目前还没有接入;• 疑问解答类搜索,百度的内容发散性更杂,而头条在信息准确度上更能理解用

一通骚操作,我把SQL执行效率提高了10000000倍!

场景我用的数据库是mysql5.6,下面简单的介绍下场景课程表:create table Course(c_id int PRIMARY KEY,name varchar(10))数据100条学生表:

担心美国政府限制,Github考虑在华设立子公司

大数据文摘出品“代码天堂”Github要来中国了?在中美关系持续走低的大背景下,这一消息或许会为代码届带来一些曙光。据英国《金融时报》报道,由于担心美国政府的限制,GitHub正在考虑在中国成立一家子

谈谈最近的一点感悟和之后的学习安排

“ 成年人的世界从来没有容易二字。”最近真的很忙,忙着大改需求,忙着加班,似乎有点怀疑人生。结合最近的一些想法,写下这篇文章以执行之后的计划,也给你们一个参考吧。学习我想先谈谈学习方面的。在我看来,做

React Hooks 完全指南,读React作者博文感悟(2W字精华)

阅读facebook大佬:DanAbramov的文章颇有感悟大佬github地址https://github.com/gaearon 重点总结 useEffect是同步的 状态是捕获的当前props

到2023年,智能城市的支出将达1890亿美元

IDC最新发布的“全球智能城市支出指南”显示,到2023年,全球智能城市支出计划将达到1895亿美元。其中首要是能源和基础设施项目,其次是数据驱动的公共安全和智能交通。在2019年至2023年的预测中

到2023年,全球数字化转型支出将达到2.3万亿美元

根据IDC报告显示,到2023年,全球用于数字转型的支出将达到2.3万亿美元,超过所有ICT支出的一半。全球用于商业实践、产品和企业数字化转型(DX)的技术和服务支出将达到2.3万亿美元。DX支出预计

PHP跌出前十,铁打的 Python 连续3年第一:IEEE Spectrum 2019编程语言排行榜出炉

Python势头不减,依旧第一,而且进一步拉开了与其他语言的差距。这一结果,来自IEEESpectrum2019年度编程语言排行榜。这已经是Python连续3年保持第一。在Python之下,第二交椅的

到2023年,SD-WAN供应商的收入将增至44亿美元

包括设备、控制器和管理软件在内的全球软件定义广域网(SD-WAN)市场在2019年第二季度连续增长了23%,这是因为企业加大了购买力度,以用SD-WAN取代其已安装的路由器基础启用的设备。根据IHSM

SWIG-Python中调用C代码的另一种方法

SWIG SWIG是SimplifiedWrapperandInterfaceGenerator的缩写。是Python中调用C代码的另一种方法。在这个方法中,开发人员必须编写一个额外的接口文件来作为S

我在 GitHub 上看到了一个丧心病狂的开源项目!

有人说,写作是少数可随时间推移而不过时的技能之一。但实际情况是,尽管许多人在写作这条道路都做出了尝试,可最终坚持下来的只有极少部分人。在这当中,导致他们放弃或停止写作的最大一个原因就是:拖!延!症!。

我在职场第一次薪资翻倍的经历!

一个有所追求的人。1写在前面我将用系列文章,回顾十年程序生涯,一方面是对职场生涯的阶段性总结,另一方面希望这些经历,对大家往后职场生涯有所启发。我很庆幸一路走来皆是自己的选择,虽然也走了不少弯路,但那

工程师笔记:我对数据库系统云原生化的一些思考

作者|张敏(于期)阿里云智能高级技术专家划重点我眼中的云原生我认为的云原生关键能力我眼中的云原生化技术手段我对数据库云原生化的思考伴随着云原生技术越来越热门,阿里内部关于CloudNative、Ser

《关于MySQL的一些骚操作》

概要回顾以前写的项目,发现在规范的时候,还是可以做点骚操作的。假使以后还有新的项目用到了MySQL,那么肯定是要实践一番的。为了准备,创建测试数据表(建表语句中默认使用utf8mb4以及utf8mb4

Vuex的一些常用知识点介绍

一、为什么要使用Vuex1、多个组件依赖同一个状态,使用组件之间通信方法会非常繁琐,例如多层嵌套组件。2、需要全局保存的数据,例如用户、权限信息,全局系统设置二、Vuex的五个核心属性1、state:

值得收藏的一些 CSS 属性选择器!

属性选择器非常神奇。它们可以使你摆脱棘手的问题,帮助你避免添加类,并指出代码中的一些问题。但是不要担心,虽然属性选择器非常复杂和强大,但是它们很容易学习和使用。在本文中,我们将讨论它们是如何运行的,并

硬核盘点,华为面向开发者的十大技术

随着社会的发展,科技的进步,5G落地、AI爆发、大数据持续突破、云计算已然成为新时代的水电煤。日益增多的新兴技术,为开发者带来机遇的同时也带来了不少挑战。尽管开发者们经常身处历史性事件的前沿,但由于

最新安卓零日漏洞被曝出,或影响谷歌、华为和小米等品牌手机

近日,据外媒BleepingComputer报道,谷歌威胁分析团队(TAG)称,一个最新的安卓0day漏洞或被用于攻击谷歌Pixel、华为、小米和三星以及OPPO等智能手机。 该漏洞是由谷歌Pro

欧盟发布2018全球企业研发费用榜单:华为超苹果跃居第5,BAT排名50开外

大数据文摘出品作者:王嘉仪、魏子敏华为的迅速增长并不是一蹴而就的,至少从近几年的研发投入上看,它比中国任何一家公司都努力。欧盟下属联合研究中心近日公布了2018年度全球企业R&D研发投资排行榜(EUI

这次华为重构园区网的目标:让光纤到每个桌面

当下,5G成为了聚光灯的宠儿,但5G的发展需要更快的光网络作为基础,5G基站之间的连接、5G基站到主干线等都需要光网络,从用户需求而言,VR/AR、4K/8K高清、云网专线等业务兴起,也亟需光网络升级

连续4年 华为依然是“高交会”上最靓的仔

2019年11月13-17日,由科技部、国家发改委等10个部委和深圳市人民政府共同举办的2019中国国际高新技术成果交易会(高交会)在深圳举办。这是华为连续第4年参加高交会智慧城市展览,不仅如此,华为

别小瞧了 Linux,安卓、华为的自研系统,均源自 Linux!

众所周知,目前国内已有众多的国产系统,基本上均源自linux,以linux为基础进行二次开发。比如红旗linux、深度等等。但不知道为什么,一说起某系统是基于linux而来,很多网友就瞧不起,并且会觉

10亿美元!苹果收购Intel大部分芯片业务,晚半步布局5G芯片能赶上华为高通么?

大数据文摘出品作者:易琬玉、曹培信2200名英特尔员工,17000项无线技术专利,伴随着苹果在今天凌晨官宣收购英特尔大部分5G基带业务,都将逐渐流向苹果。这也意味着,继高通、华为、三星、联发科、紫光展