入职华为2年,24岁的他两破光传送性能难题

admin2024年03月29日 18:20:50
阅读:
标签: 电脑 游戏 编程 算法
分享:

如果没有真的置身其中,你无法想象办公场所的风景竟如童话般如此美丽,更不可能了解,通信网络的背后,还有如此多极具挑战的技术难题值得探索。


作者(右四)和他的算法团队小伙伴
 
  我从来没想象过,22岁开始的职业生涯,是在风景如画的松研所里敲着代码,致力于解决影响世界的通信难题。
 
  01
 
  从图论到波分
 
  从小我就喜欢玩电脑游戏,对编程产生了浓厚的兴趣。高中时,我参加了省级信息学竞赛,学了一些基础的编程和算法知识,虽然结果不尽如人意,甚至影响了普通课程的学习,但庆幸的是,入读华南理工大学后,我选上了自己喜欢也很适合的软件工程专业,并在大一时就进入了学院的集训队。我和小伙伴连续两年组队参加了国际计算机协会(ACM)主办的ICPC(国际大学生程序设计竞赛,号称编程界的“奥林匹克”)国内邀请赛和亚洲区域赛。2019年,大四的我如愿以偿参加了ICPC世界总决赛,并获得了第41名。
 
  因为忙着打比赛,大四那年华为来学校招聘,华为是我唯一投出的简历,也是我唯一收到的offer。说起来,还有一件好玩的事。我的一个叔叔是寺庙住持,我从小就很爱听他给我讲道理,敬重他,他得知我收到华为offer后,鼓励我说,华为是一家有着博大胸怀的公司,承担着中国科技冲锋在前的角色,你去那里历练不错。
 
  带着这样的期许,大学毕业后,我重回曾经生活了12年的城市,东莞松山湖,正式成为华为光产品线的一员。可能因为在打比赛时,我在团队中主要负责图论算法、博弈论、动态规划算法,进入产品线后我幸运地被安排到光传送技术开发部。一方面,波分在各项技术积累都领先业界,我能够接触到许多十分优秀的专家、大神;另一方面,波分领域涉及大量光口间的路径搜索和资源分配问题,不管是功能的实现,还是性能的调优,都和图论算法息息相关,这正是研究图论算法最佳的土壤。
 
  现在回想起来,我从内心深处感谢打比赛这段经历,因为它教我系统学习了各类算法知识,还培养了分析、解决问题的思维,帮助我掌握了团队作战的方法和技巧。更重要的是,在和各种天才少年们的多次碰撞中,一向骄傲自信的我正视了自己的不足,并懂得了何为攀登的精神,这一切都让我在后续的工作中受益匪浅。
 
  02
 
  重构·用算法实现性能倍增
 
  因为有过图论算法的研究经历,入职一个半月后,我就接到了重构光层寻路模块的工作。在OSN9800光层主机软件中,光层寻路模块是业务配置的基石,它相当于一个由光口和光纤组成的城市中的导航系统,因为模块间彼此独立,绝大多数的路线问题都必须咨询它。而因为冗余的数据访问流程和路线搜索节点,它又成为了光层软件“臭名昭著”的性能杀手。尤其是随着组网规模变大,这一问题更加凸显,严重影响了用户体验和产品演进。
 
  拿到这个任务,我的心情有些复杂,可以说兴奋、迷茫和忐忑交织。兴奋的是,从高中就开始学习的算法和软件知识终于可以投入实际的生产;迷茫的是,入职前就听说,实际的项目工作和打比赛差异很大,有很多前辈都有水土不服的症状,我会不会也如此?而更忐忑的是,第一次就接手这样的项目,而且算法的设计、实现、验证都只有我一个人,我感到压力山大。但秉持着攀登的精神,我选择正面迎接挑战。
 
  在理清基本的原理后,运用之前学到的图论、数据结构的知识,我提出了一些优化的方案,部门主管廖永强和导师、总工乔跃刚给了我很大的信任,鼓励我大胆尝试。我摩拳擦掌准备大干一场,却遭遇了迎头一击。
 
  在学生时期,大部分的问题都是简单抽象的,因此突然面对一个拥有上千万行代码量的“巨无霸”产品时,我有些茫然,一度陷入在过多的旁枝末节中找不到重点。恰逢此时,部门专家勾国凯给我们分享了分形的思想。打个比方,自然界中的山峦和海岸线看似复杂,却可以看作简单形状在不同尺度上展开的叠加;一个庞大的代码体系也是如此,也可以看作交互模块在不同层次上展开的叠加。越是健壮的代码,交互模块就越简单。
 
  我如醍醐灌顶。我梳理了要重构的代码每一层的交互接口,发现纷繁复杂的上层调用最后可以归约为一个通用的搜索算法,每一层在分层之后也具有一定的相似性,以简驭繁,很容易就掌握了。
 
  这一套组合拳下来,我快速读完了主要代码,相当兴奋,因为我发现以前学的算法中,经过一定的组合,就能对现有代码有很大的优化。就其中一个子问题,我快马加鞭地完成了新算法的设计和编码,独立验证确实有很好的效果。
 
  拿着这份“成果”,我兴冲冲地找相关专家汇报,但是现实又给我上了一课。专家委婉地指出,我设计的算法确实能高效地解决我所理解的这个子问题,但这个问题并不太重要,而且我的理解和寻路模块的实际需求有一定的偏差。
 
  一盆冷水兜头而下。第一次尝试就惨遭“滑铁卢”,我有些沮丧。所幸导师很快发现我的不对劲,鼓励我说:“你有能力,但是不要太过急躁。多花点时间了解业务,再发挥你的特长,慢慢地就会有更多的改进思路”。
 
  我想起了从前,在大学期间我曾经也是一个算法菜鸟,但是一直不放弃,摸爬滚打也闯进了世界总决赛。我调整了心态,鼓励自己,困难只是暂时的,一定能找到解题之法。我现在要解决的,是一个糅杂了大量业务细节的难题,和我之前做的算法题还是有很大的差别。于是我转换角色,先做一个出题人,从业务的角度做加法,再一步步做减法,一层层做抽象,将最内层变成纯粹的图论算法题。做完这件事后,问题就被拆解成了两大类,一类是纯算法研究,另一类是业务适配。这样,整个脉络就清晰了,也为后续的图论算法设计提供了坚实的基础。
 
  从图论角度可以做什么“文章”呢?我详细分析了实际图论模型和12种寻路场景的诉求,陆续想出了高效剪枝、记忆化搜索、路径压缩、路径树化等多种优化手段。通过高效剪枝,减少一半以上的无效路径探索,平均寻路速度提升了10倍,再进一步引入记忆化搜索,在部分场景下,把路线的搜索结论存储在关键的“分叉路口”,这样一来,寻路速度提升了25倍。
 
  每做完一次迭代,我就会问自己:还能更快吗?我想到了打磨代码细节,主要是优化递归栈的开销和提取公共数据,相当于为负责搜索的车队减负,并把最常用的物资放到了最趁手的位置,最终使寻路速度优化到了30倍。在当时主要的X万条路径的场景中,整体寻路时间从200多秒降到6秒,耗时减少了97%。
 
  经过严格的测试后,我的重构代码顺利上库了。
 
  就在我以为一切顺顺当当时,没想到更大的风暴在后面。
 
  因为我重构的寻路模块是光层所有路径业务的基础,影响面非常大。上库后两个月,一个又一个电话火急火燎地打了过来,大都是因为没有考虑到特殊情况而导致的漏洞。我顶着压力迅速扑灭了各个问题的火苗,与此同时,梳理出一份详细的上层调用表,联系相关的同事,一起做了排查工作。多番努力后,重构的寻路模块稳定下来了,我也因此加深了对上层各个模块的了解。
 
  在四个多月的时间里,我完成了学生到工程师的转变,不仅是身份上的,更多的是思想上的。“只要思想不滑坡,办法总比困难多”,这段经历,让我突破了个人的思维局限,也初步领略到了光传送的魅力,看到了自己前行的方向。
 
  03
 
  接挑战令再破性能难题
 
  通过一段时间的学习研究,我逐渐对路径相关业务有了更全面的认识。突然有一天,测试同事反馈了一个严峻的问题:我们现在组网规格越来越大,在配置到XX万条满配理论路径时,再增删一条光纤,就会直接导致软件处理时间超过XX分钟,触发强制重启。
 
  虽然这只是一种极端配置的探索,目前现网还没有这种规格,但如果未来因为这件事阻塞组网更大规格演进和用户体验呢?
 
  “绝不能让用户实际使用时出现这种情况”,我心中只有这一个念头。
 
  解决性能瓶颈迫在眉睫,为此PDU下发了性能优化的挑战令,并成立了专家小组,我有幸参与其中,并负责从图论角度进行优化。
 
  经过详细的打点分析,我发现软件的性能问题可以归纳为1个数据中心、2个图论问题(A+B)、4个业务模块。在此之前,最大瓶颈是我上个项目中解决的图论问题A,在这个场景下占了20多分钟,另一个图论问题B和4个业务模块加起来的时间大概是A的时间的七成,但在A被我优化了30倍之后,后者就显得很慢。
 
  在走读代码并和相关专家探讨后,我发现这4个业务模块都是在处理图论B的运算结果。因为上一次的经验,我没有急于动手,而是先进行了抽象建模,把复杂的问题简单化,然后发现了两处明显的冗余:一是每次运算出来的路径中有很多是前几次运算出来的,4个业务模块重复处理了很多完全没有变化的路径;二是业务模块逐条处理路径,重复处理了很多重叠的路径片段。
 
  如果把繁琐的业务问题转变成纯粹的图论问题是不是有可能解决?
 
  我把这个分析结论告诉了相关的专家,得到了初步的肯定,但他们觉得这是一个路径框架,没有从图论角度优化的先例,优化潜力未知,风险和难度很大。我不甘心这个思路无疾而终,于是决定用数据说话,我设计了一套统计实际组网中上述两种冗余度的方案,实验结果甚至比我想的还要夸张,第一种冗余度最大时超过了99%,第二种冗余度最大时超过了90%。
 
  拿着这些数据,我成功说服了领导,给了我充足的时间潜心攻关。因为增删操作是混合的,我做的第一件事情是把这个复杂的混合物进行了提纯分离,很惊喜地发现,这四个业务模块问题可以归为一个统一的图论问题。问题清晰了,但怎么解题呢?我琢磨了很久,想不到什么时空皆优的方法,翻阅了很多“经书”,也没有找到相似的案例和解法。
 
  山穷水复疑无路,柳暗花明又一村。有一天在复盘上一个项目的经验时,我突然发现之前设计的剪枝算法,似乎再改进一下,很有潜力解决这个问题。
 
  在完成算法逻辑上的验证后,我和总工乔跃刚说了初步的方案,他觉得大有可为。部门同时安排了叶志枫和高永禄两位同事与我一起组建了算法微战队,进行方案验证与实现。
 
  得到支持后,我信心倍增。受益于打比赛时的三人作战经历,我很快就明白了如何和两位优秀的同事合作。我把我的核心思想、逻辑推导和他们阐述清楚,把问题、概念、思路对齐,一同树立了可行的自信;接着我们进行了思维风暴,提出了各种改进、质疑、调整;最后我们确立了一个更完善的算法模型,并且进行了逻辑模块切割。接下来,我们进行了分工,我做总体的算法架构、逻辑把关,我们仨分别实现一部分的代码。
 
  在详细分析了实际业务需求后,我们发现,这个问题的难点在于要做到批量复用,就像是多个蝴蝶效应相继发生,有上万只蝴蝶,如果要逐个分析蝴蝶们带来的影响的话,就要把每只蝴蝶都看个遍,我们并没有那么多的时间。它们是否有共性?我对同一批操作的增量更新行为做了深入的分析。分析结果令我振奋,利用一个图的拓扑排序一定也可以作为其子图的拓扑排序的原理,可以将一批操作的更新节点进行局部拓扑排序,然后只需要进行一次可达性更新和可达图减法即可。换言之,这个算法的核心思想是找到一个顺序,符合所有的蝴蝶效应的传递规律,只用一遍的时间,就能把所有影响都统计出来。我把它称为“批量式增量复用可达图算法”。
 
  最终,我们成功将光层软件在搭建组网时,路径搜索的时间优化了97%以上,并将搭建完成后单步操作的响应时间优化了99.9%。
 
  更重要的是,我们挑战了这个性能难题。通过这次的重构,我扩展了知识面,进一步了解了软件整体和瓶颈之间的关联,也收获了分析、拆解、解决复杂问题的经验和能力。
 
  “没有完美的个人,只有完美的团队”,个人力量往往是有限的,但团队的力量是无限的。在这一次的优化项目上我和另外两位同事互相配合,相互鼓励,将不可能变为可能,这种想法最终实现的过程让我们的团队不断向完美进步。
 
  04
 
  从兴趣出发,我们的征途是星辰大海
 
  从小学奥数的欧式几何到图论算法,再到如今的光传送技术开发部,十多年来我主要都在和图形打交道,而后也将继续投身此中。似乎冥冥之中早已注定,我很庆幸自己一直有机会能做自己喜欢的事情。
 
  我很享受这样的探险之旅,也很幸运有一个好的成果,能为部门业务的持续演进添砖加瓦,做出自己微薄的贡献,将学生时代只是比赛中的解题思路的图论算法,逐渐转变成一种能够做出实际产出的神兵利器。
 
  千丝万缕的光纤遍布在地球的每一寸土地,像人体的神经网络一般不断输送着光和信号。光传输行业是IT行业的底座,我们的每一次进步都是为了整个行业的迭代打下坚实的基础。
 
  我们的征途是星辰大海,还有更多更大挑战在后面等着。我会持续学习摸索,持续用图论算法追求极致性能,争取创造更大的价值。
 
 
  来源/《华为人》
  作者/朱国富
 
 

注:本文系作者 admin 授权融媒体发表,并经融媒体编辑,转载请注明出处和本文链接

我要围观…
705人参与 36条评论
  • 最热评论
  • 最新评论
加力那24分钟前 回复284

就是因为病人多,专家少,你还要抓?如果你是一个专家,一天12小时不吃不喝不上厕所给20个病人看病,可是外面排队的病人有100个。

Taso韩先生28分钟前 回复284

就是因为病人多,专家少,你还要抓?如果你是一个专家,一天12小时不吃不喝不上厕所给20个病人看病,可是外面排队的病人有100个。

加力那28分钟前 回复284

就是因为病人多,专家少,你还要抓?如果你是一个专家,一天12小时不吃不喝不上厕所给20个病人看病,可是外面排队的病人有100个。

Taso韩先生24分钟前 回复284

就是因为病人多,专家少,你还要抓?如果你是一个专家,一天12小时不吃不喝不上厕所给20个病人看病,可是外面排队的病人有100个。

admin

关注

现专注于互联网行业—公关领域。兴趣广泛,热爱传统文化,以及看书,闲时写些文字等。

  • 17万阅读量
  • 17万文章数
  • 3评论数
作者文章
  • 省应急管理厅领导到湖南水电职院考察职业技能鉴定和培训工作

  • 让高质量鄱阳湖水利枢纽工程服务好中国式现代化新道路

  • 从“狗猛酒酸”谈优化营商环境

  • 湖南水利水电职业技术学院组织消防应急疏散演练

  • 网络舆情四种信号的演进路径及党媒引导措施

关于我们 |加入我们 |广告及服务 |提交建议
友情链接
赛迪网 |钛媒体 |虎嗅网 |品途网 |i黑马 |果壳网 |砍柴网 |创业邦 |易观网 |凯恩思 |创业邦 |舆情之家
Copyright©2003-2015 融媒体版权
粤ICP备05052968