什么才是高质量好代码?听华为人这么说

菊厂基地打工仔 2024-08-01 00:08:14

我和代码的缘分,还要从大学说起。

我在大学期间,就对专业课上的代码产生了浓厚的兴趣。毕业后,在经历了一年多的职场打磨后,我从一个初出校园的职场菜鸟也成长为了团队的研发骨干。这段时间,我接触到了大量的新技术和新知识,尤其记得在看到苹果全球开发者大会的宣传语“Write the Code, Change the World.(编写代码,改变世界)”后,我在学生时代养成的技术崇拜情节变得愈发强烈。夸张一点讲,这份情节似乎已经逐渐变成了对技术的狂热追求。

但随着新鲜感逐渐逝去,我的工作状态也开始进入了舒适区,任务也逐渐失去了挑战性。两点一线的宅男生活开始变得机械化,这种状态持续了近半年。在一个游戏通关后的空虚深夜,我看向黑漆漆的窗外,无限的宁静和心底的纠结形成了鲜明的对比,我开始思考:当下舒适且平淡的生活,但在五年、十年,甚至二十年后又是什么样呢?

一种强烈的担忧萦绕心头,一个不甘心的声音在脑海里回荡:“世界那么大,我得去看看!”接下来很长的一段时间里,我不断跳出舒适区,在容器、虚拟化和互联网等全新的技术栈中摸爬滚打,紧张的工作节奏带来了不小的压力,但也充分满足了我内心深处对新技术的渴望。也许有人会不相信,但这种感觉就像是一个贪玩的孩子闯入了满是玩具的房间!在这个因热爱而广泛学习的过程中,我也逐渐夯实了技术基本功,并养成了高效工作的习惯。

奋楫笃行,臻于至善

也许,生活就是这样,我们总能在平淡中发现惊喜。在普通得不能再普通的一天上午,我接到了一个电话……

这是一通来自华为的招聘电话。在后续两个多小时的面试交流中,招聘官的一句话让我醍醐灌顶:“有没有考虑过更长远的发展?华为能给你更大的平台和机会!”

是啊,回顾这三年多的工作经历,我一直沉迷于各种新技术带来的新鲜感,看似了解很多,却因之前的公司业务所限,缺乏实践机会而被迫“浅尝辄止”,也从未深入钻研过一个领域,更是缺乏对于未来的系统规划和思考。我是继续在当前趋于成熟的业务中默默耕耘这一亩三分地,还是去更大的平台搏一搏?思考良久,我最终选择了后者。

我在2020年3月来到华为成都研究所,参与到存储迁移工具项目中,开启了我难忘的华为生涯。

入职的那一年,公司正在如火如荼地进行可信变革,开始逐渐重视代码,对于新技术、新事物更加包容。这样的转变,对于我们这群热爱软件、热爱编码、热爱技术的人而言,是一个难得的机会,而属于我的那个机会也很快降临。

9月份,为提升工具的并行能力以突破当前的迁移性能瓶颈,项目组计划对NAS(网络存储)迁移工具进行一次大型多节点重构。当时,部门专门协调了一位软件高手吴宏杰来“坐镇”,我们都称呼他为杰哥。他作为团队的Committer,将带领我们集中攻关重构工作。这是我第一次接触到“可信编码”这个全新的概念,也是我第一次系统地了解到意图编程、SOLID五原则、代码坏味道以及重构手法等新知识。新概念和新思想如潮水般向我涌来,在这潮水中“踏浪”令我乐此不疲。与此同时,基于代码检视机制,我们需要对编写的代码进行交叉检视和优化,在这期间发生了无数次激烈的思想碰撞,也不乏一些火药味浓厚的对峙……

在一次检视中,大家正在看一份由我编写的关于HTTP请求日志的特性代码,出于一直以来追求代码完美细节的习惯,我在提交的代码中着重考虑了性能的实现,做了部分特殊优化。

“这段代码写得不够简洁,一个变量贯穿始终,影响了代码的可读性,不懂这块业务的人很难读懂啊。”在看到我的代码后,杰哥提出了自己的观点。

我立刻自信地回应着:“这里是对大规模场景的特殊考虑,做了针对性的优化。”

“性能是需要测试的,不能只靠臆想,”杰哥不慌不忙地继续说道,“如果没有充分的证据证明有较大影响,还是要优先保持可读性。”

“锤子哟!”我对杰哥的话嗤之以鼻,心里默默想:“真正有追求的程序员就是要用最精妙的代码达到最极致的性能!至于可读性的问题,读不懂是自己还没入门吧?”我一边在心里嘀咕着,一边着手进行这一段代码的性能测试。当测试结果出来时,我不由得嘴角微扬:果然,还是我修改后的代码更能打!

我把所有的数据图表、验证过程以及结论噼里啪啦地通过WeLink一股脑地发给了杰哥,像是在倾泻着我心中的不满。打下最后一个句号的时候,我都已经开始在脑袋里想象着:面对着铁一般的事实,杰哥活活被打脸的样子。

过了一会儿,杰哥当面找到我,对我说:“你的测试过程很严谨,精神可嘉。但是,我们还要意识到,这段代码在我们业务流程中所占的比例很小,即便有相对性能的提升,但绝对性能开销在整个业务中的占比依旧很小,甚至可以忽略不计。”

“我反对这个说法!”我愤怒地反驳,“牺牲略微的可读性换取明显的性能提升,我认为是非常值得的!如果每一处细节都能够进行这样的优化,对于软件整体的提升将会有巨大的意义!”我咽不下这口气,这简直是在否定我一直以来的追求!

虽然我的反应有点失态,杰哥还是微笑着:“你说的也有道理。但是,我还是认为这段代码并不是关键。你可以保留你的意见,代码先按照我给的方案改,Committer是有这个权力的。”

我无法理解,更无法接受!我和杰哥争得面红耳赤,周围的同事都围过来劝和。我真不明白,我写的代码不够好吗?那好的代码究竟长什么样?

在杰哥多次耐心、细致的帮助下,为期两个多月的大型重构有条不紊地进行着。随着我检视的代码越来越多,一段又一段过度优化、晦涩难懂、难以维护的“高性能”代码也在不断刺激着我,我开始理解“代码首先是给人读的,然后才是给机器运行的”这句话,也逐渐理解了当初杰哥对于代码可读性的那份执着。可信编码,是要让编码的人做到可信,以人为本,才能编写出简洁易读、设计良好、易于维护和扩展的高质量代码。

现在回头看,曾经亲手写下的那些令我引以为傲的代码,简直毫无章法、毫无设计、毫无可读性,我甚至都能给每段代码提出100个改进意见。在后来的开发工作中,我不再一味地纠结具体实现,在注重细节的同时,我开始思考设计模式、可读性以及可扩展性。借着这套组合拳,我也在接下来的工作中越做越好,越写越自信。

以热爱共赴星辰大海

在那次重构后不久,我们又迎来了一个挑战。为了进一步提升NAS迁移工具的能力,我们急需一种能够从根本上提升文件系统扫描性能的方案。我大胆地向导师王张平提出了自己的想法:“平哥,要不我们自己开发吧!别人能行,我们也能行!”

“时间紧任务重,这个需求时间节点非常紧张,而且最终效果还是个未知数,风险很大呀……这样吧,在保证项目交付进度的前提下,你先初步调研一下,有初步的结果后,咱们再一起看看!”

于是,我激动地开始研究相关的开源组件,又厚着脸皮邀请了公司里的存储协议专家和优秀开源组件作者等业界“大神”喝了几次咖啡。我利用业余时间,从零开始学习协议标准文档,用了三周的时间完成了第一个实验版本。虽然代码非常粗糙,但放到实验环境上一跑,实验结果竟然略优于当前的方案。我激动地拿着实验数据和平哥“邀功”,平哥也很惊喜,肯定了我的方案。

在接下来一个半月的时间里,我近乎“魔怔”地不断完善、优化这份实验代码,不断改进框架、优化设计、打磨代码……在一遍遍的对比验证中,在一次次的逐行优化中,我几乎将我的“毕生功力”都注入到了这份代码中。

当然,开发过程也并非一帆风顺。在研究的中后期,我发现在一些超大规格场景下,经常会出现因内存泄漏导致虚拟机崩溃。而且,为了解决效率问题,我前期采用了大量的异步API(应用编程接口)设计,这就导致了模块之间存在了大量的嵌套回调,难以调试,定位这个问题将变得更加困难。

这个时候距离预定的交付时间只剩下不到三周,并且这也是工具提升扫描性能的关键,我没办法在这个问题上“放水”。为了解决这个疑难问题,我尝试寻找并学习多个内存问题定位的工具,查阅了二十余篇相关的技术文档,对十多个代码的模块进行逐个诊断,诊断生成的内存快照文件几乎都要填满实验机的磁盘了。更令我头疼的是,因为难以调试,我只能一遍遍完整地去从头跑测试用例,直到触发问题后再记录分析——每次运行都近乎是一种煎熬!

在历经了无数次的对比验证后,我终于定位到了一个可疑模块!我紧紧抓住这一缕希望,开始对这个模块代码进行地毯式的逐行排查。努力最终得到了回报,我终于定位到了根本原因:这是一个管理请求超时的模块,因为在请求响应之后没有及时地移除异步回调并释放相关资源,才导致内存泄露,进而使虚拟机崩溃。

问题解决了,我悬了半个月的心稳稳落下。尽管最终修补的代码仅有三行,但是这三行代码背后的汗水和煎熬都将成为我记忆里不可磨灭的印记。我们克服了种种困难,圆满地达成了业务目标:迁移扫描性能整体提升超30%,扫描需要的线程数量从128降低到2,迁移割接的最优时间从天缩短到分钟级别。基于此技术,我们团队还孵化了一个高价值的技术专利,并且获得了当年的创新技术大赛铜奖,我也在业务上得到了领导和同事的一致赞赏。

风不会凭地而起,雨不会凭空而落,清晰地找到问题所在,才是破局的关键。我沉浸于这些解题的迷途中,一步一步地慢慢向前,一点一点地抽丝剥茧……我想能够支撑我坚持下去的,正是那份对于代码的热爱和追求吧。

我还是曾经那个少年

我很喜欢一句话:“一切需要时间沉淀的美好,大都值得我们耐着性子去等待。”在工作中,我学会慢慢沉下心,踏实做好每一件小事。

团队为营造“写好代码”的氛围,组织了很多竞赛活动,每一次我都积极参加。到现在,我一共获得了四次部门的王者代码,最骄傲的是凭借那份让我“头疼”了很久的扫描代码成功获得了华为成都研究所第三届好代码一等奖:“星辰大海奖”。

后来,我还有机会参与2022年ICT软件技术大会青年才俊路演、第四季信龙门阵等活动,和大家一起分享关于我的这份成长的蜕变经历。

在2021年末,我很荣幸地成为了一名Committer!从最初彷徨的职场菜鸟成长为现在能够独当一面的Committer,我褪去了一丝青涩,增添了几分醇熟,也背负了新的使命。

虽然身份改变,但我还是曾经那个少年,那个在代码中披荆斩棘,挥洒血汗的少年,那个希望默默地将对好代码的热爱和对技术的追求继续坚持下去的少年。

0 阅读:0

菊厂基地打工仔

简介:感谢大家的关注