花粉俱乐部  logo

花粉俱乐部  因为热爱
搜索 |
[华为故事]

【华为90后的故事 第10集】“照”出代码的美

[复制帖子标题和链接]

211518

匆匆又夏天  版主  发表于 7 天前 来自:浏览器

最新回复 1 小时前

作者:吴亚伟

NDYzMDI=.jpg

  算起来,在26年的短暂人生中,我与电脑结缘14年,编程的“工龄”也快十年了。
  2005年的一个夜晚,还是初中生的我,看到老爸买回了一台价值不菲的电脑,显示屏上的Windows大草原,点一点鼠标就能跳出不同的页面,那时我第一次知道电脑原来是这个样子。少年的好奇心一下子被点燃,从此,我开始和老爸斗智斗勇,来获得更多和电脑的“约会”时间。
  那时的我没想到,这场“约会”持续的时间竟如此之长,我会从事与编码相关的职业,更把这份职业当成我一辈子的事业。

  没办法,就是喜欢!
  步入高中,我已经不满足于通过电脑玩游戏、查资料,在互联网世界里徜徉。我更好奇的是,为什么一台电脑一根网线就能连接世界?一次偶然学习到,通过U盘boot文件自启动批处理,我反编译破解了某个网管软件,懵懵懂懂间开启了编程之路,甚至因此成了某个论坛的版主。“太神奇了!”我发现计算机世界里原来藏着这么多奥妙,于是,高考填报志愿时,毫不犹豫地只选了一个专业:计算机。
  大学生涯,赶上Android兴起,我也随之开启了探索之路。作为一个业余开发者,我鼓捣开发了一款应用,成功安装到了自己的安卓手机里;独立开发了一个游戏辅助工具,还吸引了小的广告商做广告,第一次品尝了一把移动互联网带来的红利;还被院系的老师推荐参加了有关Android的创新项目……
  我如同一条自由自在的鱼在编码的“海洋”里撒欢。2015年,大学毕业的我没有选择深造,而是等到了华为递来的橄榄枝,迫不及待地加入了正在智能手机领域开疆辟土的华为终端,期待在华为继续做自己喜欢的事,在技术领域探索更多的美妙。

  萌新想成为最懂相机应用的那个人
  入职软件基础ROM部两周后,PL(项目负责人)安排我去做预研(预备研发)工作,我成为预研团队里唯一的新员工。他鼓励我:“往上跳一跳,能‘够’到就大胆上!”
  那时候,团队正在做下一代相机预研项目。新的相机应用要切换新的接口,并最终落地到旗舰机的双摄产品中。这涉及40万行代码量和数百个功能的重新开发,而预研要做的是搭起相机应用的基础插件化框架,将内部各个功能解耦成多个相互独立的插件,类似搭积木,彼此能自由组合,供后续功能业务的快速拓展。
  这对萌新的我来说,无疑是一个挑战,当时插件化在业内还没有太成熟的方案,终端内部也没有做过。但越难我越兴奋,职场起步就能接触和学习比较新的技术,还有什么比这更美妙的事吗?
  别看我说得轻松,当时还挺难的。我在学生时代的计算机学习偏技术原理,原来做开发是用的“野路子”,写几千行的代码做小项目还凑合,而现在参与的是需要整个团队维护、数十万代码量级的大工程。“野路子”一下子暴露出短板,写出来的代码不忍直视,小毛病层出不穷,比如只考虑功能的实现,从未考虑代码要分层分模块,没考虑代码的可读性。
  有些挫败,我不得不逼着自己从零开始理解代码,理解相机应用的架构。
  幸运的是,我抓住了架构设计师陈国栋伸出的“援手”。国栋哥在华为已十年,是相机的模块设计师,在相机领域造诣颇深。他给我推荐Java书籍,讲解新框架的设计思想,再手把手教我设计接口草稿。他会从全局考虑设计是否合理,是否适合后续业务演进,接口设计是否稳定,后续会不会频繁修改,他还有一个习惯,和别人沟通时,一边沟通一边写下设计好的接口代码,等沟通完,设计草稿已经出来了。“除了完成任务,更重要的是要想如何高效完成。”他常常对我这样说。
  职场新人喝着前辈的这杯“咖啡”,如饥似渴吸收着宇宙的能量。从他身上,我学到了好代码要讲究可读性、可拓展性、可维护性,知道了代码的设计原则是为了更快更好地业务交付,学会了怎么写代码,相机业务是什么,什么是插件化的技术和解耦……就这样一边工作一边学习,不知不觉间,提前熟悉了相机应用新的架构,也为后面独立承担基础模块开发打下了基础。
  毫不谦虚地说,我自此建立了一种莫名的自信——在熟悉的领域,不管多难都能搞定的自信。也正是这种自信,后来不管遇到什么难题,PL的那句话总会在我耳边响起,万一“够”到了呢!

NDYyNzQ=.jpg

  落地双摄,我“够”到了
  完成了新相机基础插件化框架预研,3个月后,旗舰机就要发布了,为赶上进度,预研组十余人展开了与时间赛跑的封闭开发。
  “亚伟,你最熟悉基础框架,基础流程管理由你来做吧。”基础流程管理涉及相机启动模块,3A算法交互模块、插件管理模块、基础拍摄流程等,是人像、夜景、大光圈等各个模式的实现基础,但也最容易出现问题,主管将它交给了新员工的我。有时候信任也是信心的强心针,我毫不犹豫应承下来。
  那时候,我每天都要面对任务板上几十个密密麻麻的问题单和需求,有的能复现,有的是小概率偶现,还有一些是历史遗留问题,问题的繁杂常常让我措手不及。
  好在“敲代码”这件事,我一直乐在其中。我在代码的海洋里奋力探索,从团队空间到公司论坛,再到外部开源社区、搜索引擎,想尽办法不断汲取知识,找到解题思路,把一个个问题作为练手的工具,每晚奋战到深夜仍然乐此不疲。
  当时相机的启动涉及二代接口和第三方应用,能参考的资料非常少,我查阅了各种文档、手册和网上的问答,几乎搜遍全网,终于在公司Andriod源码里找到了参考工程,有全量几十万行的代码。我再从中搜索与实现功能有关的代码,仔细分析研读,最终找到了解题的钥匙,独立解决问题游刃有余,问题单的闭环速度也越来越快,从一开始一天一两个到后来平均五六个,甚至在组内有了“解单高手”的称号,算是站稳了脚跟。
  忙碌的日子总是过得飞快,搭载了全组人心血的全新相机应用火热出炉,我们成功按期交付版本,落地P9系列双摄产品中。
  现在回想起来,当时的艰难困苦都烟消云散,只留下满满的收获与感激。每当遇到艰难的时刻,我就会想起这段经历,对自己说:不怕跳一跳,就怕不敢跳;每一次起跳,都是向下一次发起冲击。看,我“够”到了!

  十来天,我让相机启动性能达业界第一
  2018年,离EMUI9.0版本商用只有十几天,我们突然接到一个新的优化诉求——Connect老化性能评测,相机启动性能要从1.2秒优化至0.6秒。
  这个突如其来的要求把我搞懵了,我非常排斥,心想这怎么可能?往常这种需求要投入两三人用一个月的时间实现,是不是流程出了问题?一般一个指标提升10%已经是非常大的变化了,这次要提升100%,幅度这么大,合理吗?业界其他竞品当时最快就是0.6几秒,我们在十几天内能做到超越吗?
  尽管带着诸多疑问,我还是一边和测试部确认需求,一边着手分析历史代码。三天时间,通过排查发现,原来是历史代码随意增加功能捣的鬼。我开始对代码大胆“开刀”,对“坏味道”的历史代码逐一优化,并且调整相机全局资源,加载流程的优先级,想尽办法减少每一毫秒的开销,一下子优化到了0.9秒,但是离最终目标还有不小的差距。
  有优化的空间!这个发现让我很是惊喜,那就再试试吧。之后,考虑多个线程相互等待的问题,我把一些线程的串行改为并行,把相机应用的首界面不会出现的模式晚一点加载,相机启动性能又优化了0.2秒。
  还有什么办法吗?我感觉自己已经绞尽脑汁,可离要求还有0.1秒!
  想来想去,只能采用比较极端的办法了。相机启动涉及几十个类、几百个变量的初始化,我细细去抠每个变量的初始化时间消耗,有些不需要在相机启动时出现在界面的变量,要么挪到后面,要么放到比较靠后的时间段执行,这样一个一个细抠,终于达到0.6秒。成了!
  最终,我们的相机启动性能在Connect老化海外评测中业界第一。
  这时的我对代码的理解又深了一层。随意添加功能导致性能恶化,这些就是我们开发人员自己挖的坑,而优化指标,不过是开发人员必要的自我填坑罢了。有的人会及时填坑,目的是解决短期矛盾;而更优者则是前期“不留坑”,和坏代码说“NO”,目的是解决长远问题。
  2019年,做相机1+N 组件化方案时,在完成需求规定特性的基础上,我依然思考着如何避免以前的问题重犯。组件化后会带来加载的高负载,我想了一个办法,按需延迟加载各个拍摄模式组件,减少初始内存消耗20M,整体内存占用下降10%,高负载下性能优化15%以上。
  有人说,你走过的路每一步都算数。在我看来,每改一次坏代码,积累的好代码就越多;每一次写代码“不留坑”,持续用好代码要求自己,就是在构建好代码的万里长城。

  主动重构,效率提升60%
  相机作为新手机发布会卖点的“常客”,界面设计一直以来受到用户的广泛关注。
  我来公司的这几年,相机界面从4.1版本升级到10.0版本,存在多次大的用户界面调整。记得2017年,我和同事十余人日夜奋战3个月,修改了十万行代码,成功交付新版相机界面。但改完之后复盘,我们发现,人力投入还是比较大,一个想法不断在我心里不断冒出:能不能让相机应用的界面调整变得更简单?能不能做到在不影响功能逻辑的前提下调整界面?
  当时相机应用的界面和功能耦合,界面就是用户看到的图标、按钮,功能是用户点击了图标或按钮后的响应。调整界面就会影响到功能,修改起来复杂,容易引入问题。
  痛定思痛,我决定选择重构,也减少以后界面调整的工作量。我的这一想法也得到了团队的支持。
  然而,万事开头难,新接口不仅要解决历史痛点,又必须适配相机所有的功能特性,这意味着很多需求都要推倒重来。而要推倒重来的前提,是对原来的功能业务代码了解透彻,并有很好的重构思维。
  比如,相机的美肤功能,重构时存在一代简单美肤、二代加了虚化效果,后来又加了光滑、美白、瘦脸等美肤能力,每一个功能对应不同的历史产品,由不同的人开发的不同版本,规格不一,重构后的代码必须能保证以往的功能规格都能使用,且不会遗漏。为了了解原来的代码,我找到当时做这些功能需求的人,一个一个去交流,但有些功能已经实现很久了,开发的人也不一定记得自己写过的代码,我也只能靠一行一行读代码,自己去理解掌握。
  说实话,这期间,我曾经有过放弃的念头。团队并没有给我定重构的目标,能实现多少是自己拟定的,我曾考虑放弃比较复杂的模块,但一想到下一次交付还会产生问题,还不如一次就把事情搞定,只得硬着头皮咬牙坚持下来。
  幸运的是,重构之后,界面服务化管理模块成功上库,界面和功能在EMUI9.0版本中解耦成功,开发变得更简单,更稳定。紧接着在2019年最新的EMUI10.0相机界面中,我基于重构的代码,用了2个月便快速完成界面替换,效率提升60%。
  这让我把余下的精力放到与界面设计师一起持续打磨极致体验上。原先相机在华为手机、平板、折叠屏的布局上并不统一,带来了界面适配和维护较大的工作量,我们一起优化了设备的差异性,进行了统一,在面向用户的EMUI10.0设计风格调研中,相机的整体满意度再上一个台阶,让我再次尝到重构的美妙。
  渐渐地,我养成了一个习惯,每次修改问题单时,主动识别坏代码、重构问题频发区。2019年,我重构的代码获得了消费者BG软件部首届鸿蒙金码奖。
  在编程界,一直流传着一句话——10万行代码铸就编程高手,我现在还没写到十万行,但它激励着我发现坏代码要大胆重构,写出更多好代码。这种量变到质变的过程,本身就是代码修炼之道。

NDYyNzU=.jpg

  年轻,就要一“码”当先
  有人说,你做相机应用的,是不是特别会照相?还真是两码事。我和妻子去旅行时,给妻子拍照也常常被她吐槽是直男审美,但这并不影响我对手机拍照功能的理解,不妨碍我和小伙伴一道努力将华为手机的相机应用做到极致。我很喜欢去视频网站看手机拆解视频、前沿科技评测视频,了解主流厂商摄像头规格及安装方式,了解未来趋势,从中去挖掘相机功能的一些巧思妙想。
  转眼进入华为已经4年有余,我很幸运,伴随着终端的每一步发展和崛起,我也从职场菜鸟成为能独当一面的模块设计师。我更庆幸的是,从少年时代敲下第一行代码开始,我找到了自己的兴趣,并将兴趣发展成为自己的特长和爱好。而最幸运的是,我一直做着自己喜欢的事。
  未来面临全场景的应用设计的新挑战,这将又是新的学习之旅,但我始终相信,只要拼搏向前,再大的困难总会结束,我们终有所获。
  作为26岁编码人,我常常会幻想这样一个场景:
  夕阳西下,年迈古稀,家里的小辈问我最会什么,我能自豪地说:“我最会敲代码!”

(本文为《华为人》版权所有,未经允许不得转载。如需转载请联系编辑部hwrb@huawei.com。正式出版版本请见书籍《蓬生麻中 不扶自直》)

评分

参与人数 2人气 +20 威望 +18 收起 理由
水墨_清华 + 10 + 8
一梦盛夏 + 10 + 10

查看全部评分

花粉必须有我一个  版主  发表于 7 天前 来自:浏览器
每张美照的背后,都有这个小伙子写的代码~~
一梦盛夏  版主  发表于 7 天前 来自:浏览器
厉害了~
123班小明  登峰造极  发表于 7 天前 来自:荣耀30 Pro+ 5G
很多人的努力促成了华为的今天。

点赞支持!
湘君丶  自成一派  发表于 6 天前 来自:HUAWEI P40 5G
路过
AiSang_U  自成一派  发表于 6 天前 来自:荣耀V20 4800万3D相机
厉害
诚哥55  登堂入室  发表于 6 天前 来自:华为Mate Xs 5G
赞一个
huafen970665979  登堂入室  发表于 6 天前 来自:荣耀20 PRO
转世长老  登堂入室  发表于 5 天前 来自:HUAWEI Mate 40 Pro
不容易啊,辛苦了
t小勇哥  登堂入室  发表于 5 天前 来自:荣耀X10 5G
666
您需要登录后才可以回帖 登录 | 立即注册

EMUI10.0
用户组申请
版规
最新精华
  • 感知是我们与世界对话的方式——华为P系列
  • 感知是我们与世界对话的方式——华为P系列
  • 感知是我们与世界对话的方式——华为P系列
  • 感知是我们与世界对话的方式——华为P系列

工具下载

  • 花粉客户端官方

    Make it Possible

华为软件专区

关注花粉俱乐部

粤ICP备19015064号-4|备案主体编号:44201919072182| 粤公网安备 44190002003939号

Copyright © 2012-2020 华为终端有限公司 版权所有

快速回复 返回顶部 返回列表