初秋的慕尼黑,早晚已有些微凉意,每天往返于德国研究所和住地,我很庆幸,在华为的第十年,在最好的年纪,能够来到全球科技最发达的国家之一工作学习,一圆当年的海外梦。
没有华为这样大大的舞台,小小的我或许就不会拥有如此宝贵的机会;没有华为这样开放包容的环境,作为研发小兵的我也不会在那方技术的小天地里快速成长。时光漫漫,点滴回忆,拾些片段,分享一二。
2006年,应届入职华为一年的我,加入到新产品OCS(在线计费系统)的开发队伍中。当时,视频通话、网上冲浪、游戏娱乐等业务如雨后春笋般冒出,单一的业务计费模式已经不能适应快速变化的电信市场,迫切需要一个对用户使用的各种网络资源、服务资源进行实时、准确、个性化融合计费的系统。OCS应势而出。
我们的第一位客户是广东移动。客户要求两个月内实现OCS每天凌晨能快速生成前一天的详细报表数据。简言之,导出3张报表,包括用户的余额信息、状态变更的用户信息等。数据的计算规则十分复杂,项目组最初的考虑比较务实,只需按照当前的目标格式和规则,直接写代码即可实现。
然而具体分析时,我发现了一些问题:报表中部分字段的定义规则比较模糊,需要SE(系统分析师)和客户确认,这样统计结果不一定准确,还耗费人力;数据的存储位置发生变化时,会导致生成报表的代码需要频繁修改。而长远考虑,如果业务量增加,未来是不是还会有第4张、第5张甚至更多的报表数据需要导出?
我想编写一个更加灵活的程序,它不限于机械地产生客户当前指定的3张报表,而是能根据配置生成任意报表。打个比方,原先是制造一个只能做“番茄炒蛋”的炒菜机,遇到“韭菜炒蛋”就不能工作了。如果有一个机器,只要输入菜谱就能炒出各种菜,岂非更高效?
我利用业余时间,编写雏形程序来验证思路的可行性,并制定了两个月的具体实施计划。虽然开发难度加大,时间也很紧张,但实践证明应该是可行的。于是我鼓起勇气对项目经理说了我的想法,没想到的是,项目经理(PM)爽快答应,但当时人手有限,只有新员工小张可以和我搭档,我说没关系,并拍着胸脯向PM保证能完成任务。
之后,我每天快马加鞭编写代码,优化算法,带着小张一起调试各种场景,回到住处经常是深更半夜,最终如期交出了新的程序。在同样满足客户所有性能指标的前提下,平均开发一张新报表的周期从原来的2周缩短至一天,效率大大提高。
后来,报表的需求果真从3个增加到十几个,而我们不需要修改主程序,只需要修改配置文件就能解决。这种感觉,就好像修炼《九阴真经》,内功修好了,招式可以千变万化,让人心中很是舒畅。后续其它局点,现场人员甚至可以按照客户的要求直接配置,减少了一线与研发来回交互的环节,也减少了研发成本,更加体现了程序的价值。
事后有人问我,为什么要加班加点去做这么费力的事?对我来说,也许它只是一个小工具,但实实在在提高了交付效率。人生会面临很多困难和挑战,我喜欢尝试每一种可能,尤其是对工作目标有更高的追求时,我会情不自禁地寻找最佳解决方案,并愿意付出更多的时间和精力竭尽全力去完成。
“高亮, 你做的这种语言编程效果不错,解决了交付的大问题,起个名字,就叫高亮码吧。”开发代表张钒说。
“领导,开玩笑吧,这也太高调了,人怕出名……”
“这不只是我的决定,产品线也同意了。你现在想不出名都难咯!”张钒笑。
这是怎么回事呢?且听我道来。
开发完报表模块后不久,我加入OCS主业务的开发中。OCS通过配置数据就能实现各种复杂的功能,需要编写的代码量大为减少,从而能够更快地交付版本。但随着海量的产品交付,大量客户需求接踵而至,需要多人协同配置的版本管理出现了新的问题,比如设置成什么样,谁做了改动,改动原因是什么,改动孰对孰错,问题发生的环节在哪里……这些比对、合并、修订、回退等管理环节要耗费大量人力来回检视,协同开发的效率大受影响。
怎样才能既保持数据配置的优势,又能有传统代码开发成熟的版本管理能力?我陷入思考。在查阅了很多资料后,我想到用可读性更强的文本格式来重新定义这些配置信息,也就是研发里常说的“伪码”。这种“文本格式”比一般的代码要简单易懂,和业务领域更加接近,又兼具版本管理的各种优势。技术上称为“领域语言”。
说干就干,团队很支持我的想法,启动了CBDE(融合计费配置开发环境)项目开发。内部试点应用后,配置模式不变,但通过领域语言解决了多人写作的大规模配置场景下的版本管理问题,大家一下子就接受了这个新事物。
之后CBDE应用全面铺开,以前20人的团队同时交付两三个运营商客户,都会有点吃力,现在同样的团队可以同时交付8个客户甚至更多,高效支撑了多个局点的交付。
公司对我的工作给予了肯定,为这个新语言精心命名为“glee”(首字母gl正是“高亮”的拼音缩写,glee在英语中也有“快乐”之意)。至于中文名,就直接称为“高亮码”了。据说这是公司软件首次以开发者名字命名的相关实现,我倍感荣幸。这份荣誉远远超过了物质所能带来的激励。
2008年11月,我参加了公司成立20周年的奋斗者大会,并获得了业务创新个人奖。没有包容、开放的环境,25岁的我,不可能登上公司级的领奖台。
老话说“前人栽树,后人乘凉”,可有那么一次,自己栽树,恰好给自己乘凉了。这又是怎么一回事?
2012年,我参与下一代计费系统CBS5.5的开发时,编写了几百行代码,加入了一个不起眼的功能:系统中处理完每一个计费请求之后,都可以自动输出一份精简版的“处理摘要日志”,只额外消耗5%的性能,就能在现网随时开启日志看到我们的处理过程。
2013年,CBS5.5准备在巴林上线,此时的我已担任后方上线保障组组长了。这是CBS5.5全球第一个上线局点,又涉及十几个模块,我们要力保不失。
然而上线后没几天,真发生了状况。我们发现有极少量用户的部分余额似乎被“冻结”了,只有特殊处理才能恢复正常。发生这种问题的用户很少,影响程度有限,我们很难根据样本量找到规律跟踪分析。
产品的各级研发领导很慎重,这个核心计费模块,不应当出现任何瑕疵,需尽快查明原因。我既是保障组组长,又是该核心模块的程序员,真是“压力山大”。在常规分析手段无果之后,我灵光一闪,脑海里想起了那个小功能。
我连续开启了一夜的摘要日志,经过一番仔细检查,果真找到了蛛丝马迹。依照线索,我又和开发测试人员进行了深入的分析和测试模拟,原来是和我们的计费系统对接的外部系统在某个特殊场景下没有遵从标准协议。得出这个结论时,天色见明,大家如释重负,迅速给出了解决方案。事后我还心有余悸,要不是这个小功能,咱这个组长可要尴尬了,说不定还得多花几天时间才可能分析出来呢。
回想在OCS多年,从开发工具到接手计费核心模块,参与过很多大型功能开发和技术改进,获得过公司十佳MDE(模块设计师)、金牌奖。然而这个小功能,却给了我特别深刻的记忆。
小功能也有大作用。有时候多想一步,多做一步,也许关键时刻就能派上用场。
如果允许吹牛的话,我想,我是主持界里最会编程的,编程界里主持最好的。
我热爱编程,也喜欢和人交流。我一直在想一个问题,华为程序员那么多,其中不乏编程高手,有什么平台能让大家交流各自的代码技术,甚至相互切磋,一决高下呢?想来想去,那不妨来一场趣味编程比赛吧。
我用业余时间编写了“俄罗斯方块”对战的平台。与游戏网站的同类比赛不同,我设计的游戏不是人人对战,也不是人机对战,而是“程序和程序”的对战:程序员双方各自编写代码开发插件,让插件在游戏平台上进行PK。这很像是“外挂”,但不是比游戏中的执行速度(当然都比人快),而是比算法策略。
这很符合程序员的口味:我也许不太会玩游戏,但编程技术很好,我编写的程序比赛策略可能比你好!如此一来,不仅比赛结果充满戏剧性,程序员们的编程技能秀也充满了趣味性。
平台推出后,我先发给几个同事“试水”,大家迅速被吸引,在业余时间玩得不亦乐乎。像星火燎原一般,比赛迅速走红,小组之间、部门之间相互开展了多次比赛,竞技平台大获成功。
美女与“野兽”的搭配
2013年,平台正式登上南京研究所“编码达人秀”的舞台,在研究所各大部门间进行对抗。更因为大家热烈的响应,它被迅速推广到华为其他研究所,以及南京若干所大学校园的比赛中,吸引了一大批编程高手参与,涌现出很多高质量的作品。
2014年,我推出第二季“推箱子”比赛平台,设计出更适合编程PK的竞赛规则;2015年推出第三季“炸弹超人”比赛平台。一步一个台阶,此项活动已成为南京研究所的经典赛事。
在研究所和面向大学生的历届比赛中,作为比赛平台的开发者和比赛的组织者,我当仁不让地担任了一个新角色:主持人,成为传说中的“南研吴宗宪”,也算是当得有模有样。
感谢十年来华为给予我的一切,让小小的我拥有广袤的学习提升空间,不断发挥和实现自己的价值。我始终相信,再微小的力量只要奋勇前行总有一天会发出大大的光芒。未来,继续奔跑!