聊聊我在淘宝做性能分析的经历

6,243 阅读12分钟

我们新推出大淘宝技术年度特刊《长期主义,往往从一些小事开始——工程师成长总结专题》,专题收录多位工程师真诚的心路历程与经验思考,覆盖终端、服务端、数据算法、技术质量等7大技术领域,欢迎一起沟通交流。

本文为此系列第三篇内容。

第一篇:负责淘宝业务前端开发9年,聊聊我的心得

第二篇:“技术开发最应该做什么?”,聊聊我在服务端开发5年的理解和收获

本文作者千诺毕业后一直专注于Android相关技术,风雨天晴,砥砺前行,十分有幸能和大家分享一路走来所见的风景。

个人经历

毕业前走过好几家公司,每一家公司都有不一样的感受,非常幸运:

  1. 2019年新年伊始,收到网易、小米的日常实习offer,一个本科学生能够拿到这样的实习offer还是非常难得的,非常开心的去网易有道实习了三个多月,也第一次远行去了北京。
  2. 后来,回到了成都腾讯PCG进行暑期实习,当时成都HC少得可怜,能拿到离家近的实习offer非常满足(家在重庆),最后也成功拿到了留下来的正式offer,好像经总监特批,拿到了 SP 。
  3. 大三暑假,拿到了淘宝架构组的正式offer,禁不住“架构组”三个字的诱惑,决定放弃舒适区。2020年3月淘宝架构组进行毕业前最后一段实习,“见见世面”。

开始工作后,新的征途,新的状态:

  1. 工作第一年,主要负责 APM 可视算法准确性提升、模块重构等工作,得到了老板的认可,拿到了年会上的“最佳新人” 。
  2. 工作第二年,主要负责跳失、页面模型体系数据构建,卡顿问题定义等,成功在大厂毕业季中晋升一级,很幸运。
  3. 工作第三年,主要负责卡顿问题体系化解决推进、内存等OS级底层数据搭建,参与全量设备可排查数据体系解决方案,拿到了CARE卡、体验Go等。

图片

我的总结

聊聊写好代码

程序员,工作中的重要工作内容就是编写代码,在淘宝的这一段时间,在如何写代码这件事上,有了不一样的体会。

如何写好代码

作为代码手艺人,需苦练手艺,谁不想写出谁看谁赞的代码呢。

工作中有相当一部分时间都是写代码,而如何写出好代码,是我们不断追求的目标。首先需要摆正对代码的认知,代码是给人读的,机器码才是给机器执行的。认知不同,书写的思路也是不同的。在开发过程中,会有一些代码对性能有极高的要求,这时候我们要做好极致性能与可读性的平衡。

对于代码,我们也要“知其源”,懂何来何往。对于Android同学而言,怎么可以不懂AGP的浪漫呢?Google提供了AGP,为开发者非常便利的将Android工程编译成一个apk文件。日常工作中,会涉及到排查一些奇怪的问题,往往直接指向就是字节码,熟悉编译就成了一个必选项;找出问题,下次在代码中进行规避。对于编译,我们需要知道一段代码如何变成APK的,APK字节码是如何跑在ART上的,了解机器码与字节码的转换,当我们将整个体系了解透彻后,能从更低层的视角来审视自己的代码。

好代码是兼具扩展性和可读性,如何写出好代码,经过前人不断探索和沉淀,六大设计原则和设计模式可谓是诸多沉淀中的精华,往往只要我们遵守六大设计原则、用好常用的设计模式,代码就不会太差。这一个点十分的重要,看似简单的设计原则,但是想要融入点点滴滴的开发中还是十分艰难的。为了更好的理解设计原则并转化成潜移默化的技能,我是这样做的:

  1. 广泛的阅读,并在读优秀的框架或者源码时,不应止步于了解实现了什么。Android源码中存在大量设计模式,例如处理点击事件的责任链模式、Activity生命周期的模板方法模式、Binder机制中的中介者模式等;也需要了解类之间的关系,例如Context及其子类;了解为什么需要这样使用。持续性给自己输入,处处反思,不将设计原则束之高阁。
  2. 刻意的练习并将代码提给『代码写得像诗一样的同学』认真CR。在学习设计原则时,往往是一些简单的demo,但如何落地到具体的工程代码中,是我们需要持续思考的问题,非常考验代码功底。工作中持续练习,并主动获得反馈,帮助了我快速成长。

Notice:刻意练习设计模式不是强套设计模式,每一种设计模式都有自己适合的场景。我就接手过一个模块,里面大量使用了单例模式,为了方便内部大量单例相互调用,直接导致类关系紊乱,当我想对这个模块进行功能拆分的时候,我发现就很难做到。

手艺人的坚守--不妥协

在我们写代码的时候,不能对自己『妥协』,一处妥协,处处妥协。--来自『代码写得像诗一样的同学』

在遇到需要某一个变量的时候,你是否为了方便,就直接将这个变量开一个方法直接暴露出去了呢?代码中自己明明知道这样写会不优雅,但是为了追求更快的完成工作,直接怎么简单怎么来了呢?

在过去的代码中,自己会经常遇到这样的问题,就比如说下面这段代码,摘抄自今年提交的代码中:

图片

聊聊学习

如果说写代码是手艺的话,那么知识体系的学习就是内功了。不苦练内功,代码手艺人终究只是手艺人,成长不到“宗师”。
随着行业的变换,Android侧也不可否认的越来越内卷起来,我们需要学习的知识内容也不断膨胀起来,对口领域技能要求也越来越高。
图片
涉及的跨度比较大,任何一块都有大量的知识点,但是往往工作中都会有所涉猎,所以自己的知识体系还是需要足够的宽的,以我自身为例,自身知识体系更像是是 T 型:『专业方向需要足够深,相关知识面需要足够广』。
图片
在如此繁杂的技能树中,工作环境不同,侧重点又会不同。我在工作中,主要做横向支撑较多,加之阿里独特的『人人都是PM』的工作环境,在广度上,沟通与合作、内部平台熟练度会更重要一点。

沟通与合作:当从定义问,到发现问题都属于论证阶段,并不是每一项性能问题别人都是改,也并不是只要举着性能的大旗,所有的业务方都会看齐,只有证出利害、辩出价值,才能向上或横向拉到资源并推动下去,在这种环境中,什么是双赢的合作实现路径就值得细细考量。
图片
内部平台熟练程度:与其独自负重前行,不如合理利用资源、在奔跑的巨人身上前行。大厂工作的一大优势就是内部平台丰富,无论是低代码平台、还是数据报表平台,亦或是审批流程搭建,平时绝大多数想要用的东西,在大厂内部就是一个一个的平台,诚然,平台会有各种各样奇奇怪怪的问题,但是问题需要快速验证、流程需要进行初步搭建、闭环需要快速跑通的时候,将所需的功能进行快速串联,就能发挥出神兵利器一般的威力。

多读书,多看报,少打痘痘,多睡觉。学习,无他法,唯坚持尔。

明知结构不合理,却写在了这里,后续对其改动的概率也不会太大了,一步错,一直错。如果处处是妥协,那么我们的代码结构、代码风格、原有设计,都会一步一步腐化。我需要在今后的日子里,更加警惕这样的实现。
你是否也写过妥协的代码?一起提高标准,严格要求自己的代码。

聊聊工作状态

一个人的精神状态,会严重影响到自己的生活质量和工作产出,也会感染周围同学的状态,影响团队氛围。每一个人对待工作的态度都有所不同,我想这里总结并分享下自己对工作状态的感受与思考:

  1. 热爱工作,让自己快乐当我厌恶工作,那我在工作的时候就会觉得很煎熬;如果我不喜欢工作内容,我就会觉得无聊。别人可能会带给我们痛苦,但快乐我们一定要学会自给自足。工作在我们的生活中的时间占比太高,如果想要自己快乐一点,那就仿佛只有接受它,并热爱它。也算是打不过就加入、改变不了环境就改变自己的另一种形式吧。
  2. 热爱工作,提升自己的工作效率当自己心生抗拒时,效率不自然的就会降低,效率降低,工期拉长,如又遇到推进有问题,自己就会陷入痛苦之中。所以我会警惕自己产生抗拒心理。而『抗拒心理的敌人就是热爱』!专心投入时,自己会更加积极推进(自驱力),遇山开山,遇水搭桥。

热爱,永远的必杀技!

聊聊做事

在淘宝工作中,因为专职做性能方面,所以工作内容跟业务开发会有较大差异。工作中往往收到的是做某一个方向,至于实施方案与实施路径都需要自己敲定,所以如何在这种环境中拿到好绩效,就需要我们不止是要码好代码,更是需要思考怎么把事情做到超预期

每一个人都有自己的做事风格与方法论,待在阿里,成长在阿里,也慢慢有了自己做事的三板斧:

上手新东西,不贪大不求全,先做样板间。

因为自己往往接触的方向都比较大,例如卡顿、能耗、跳失等。往往方向越大,开始做事情的时候越要做小。先陪着一个业务方玩好,打造样板间。在做样板间的过程中往往会遇到很多问题,因为影响面可控,可以在前期充分验证方案的可行性、是否有推广的价值。待时机成熟,遍地花开。

在做 APM 自动化计算页面加载耗时校准后,数据波动解释问题愈发突出,自动化计算不与加载过程耦合,只关心最后的加载终点,到底是什么导致加载慢了始终是一个谜团。

为了应对数据的不正常上扬,针对页面打开数据持续性防劣化,我们增加了页面加载过程监控,而这过程就会与页面打开流程进行耦合。针对这一数据体系建设,我们选取了详情作为样板间。

经过一段时间观测,能够较为有效的发现问题,针对各个页面加载阶段有较为明显的防劣化效果。与此同时,在和详情的合作中,数据流转、接口定义等细节也多次打磨,才达到使用标准。最终形成了以页面加载为场景、以页面加载耗时为北极星指标、以加载子阶段为排查支撑数据的数据体系,结合日志与上传,建立了大盘与单机排查数据体系

图片

做好规划与目标

虽说从一个小点做起,但起手需着眼全局,做好系统性梳理与规划。没有全局规划,很容易着眼于一点,丢西瓜捡芝麻,不知路在何方,下一步如何前行。

跳失率,是APM产出的一个重要指标,描述的是启动或打开页面过程中流失的用户比例。跳失率连接了性能与业务数据,是优化用户体验的另一角度阐述。

回顾跳失率的历程,着眼全局,根据用户动线逐渐铺开,得到大量团队的认可,无论是技术还是业务同学,也慢慢作为优化的目标。

图片

跳失率由最开始的外链单渠道验证,再引入到外链全渠道数据衡量,后续推广到全入端流量和所有正常的页面打开。

未来与期望

移动互联网走到今天,辉煌之后是回归平淡,还是更有另一山高,还犹未可知,但我愿一路向北,直挂云帆。作为刚踏上工作的小年轻,一路走来有朋友相伴,有大神指导,有非常好的工作坏境,感恩相遇,也十分珍惜。前路阻且长,希望能不忘初心,在技术上还能保有那一份坚持,保持对工作的热情,守住生活中的小美好。