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

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



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

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

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

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



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


个人经历


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

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


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

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



我的总结


 聊聊写好代码


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

  • 如何写好代码


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


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


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


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

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


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


  • 手艺人的坚守--不妥协


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


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

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


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

 聊聊学习


如果说写代码是手艺的话,那么知识体系的学习就是内功了。不苦练内功,代码手艺人终究只是手艺人,成长不到“宗师”。

随着行业的变换,Android侧也不可否认的越来越内卷起来,我们需要学习的知识内容也不断膨胀起来,对口领域技能要求也越来越高。

涉及的跨度比较大,任何一块都有大量的知识点,但是往往工作中都会有所涉猎,所以自己的知识体系还是需要足够的宽的,以我自身为例,自身知识体系更像是是 T 型:『专业方向需要足够深,相关知识面需要足够广』。

在如此繁杂的技能树中,工作环境不同,侧重点又会不同。我在工作中,主要做横向支撑较多,加之阿里独特的『人人都是PM』的工作环境,在广度上,沟通与合作、内部平台熟练度会更重要一点。


沟通与合作:当从定义问,到发现问题都属于论证阶段,并不是每一项性能问题别人都是改,也并不是只要举着性能的大旗,所有的业务方都会看齐,只有证出利害、辩出价值,才能向上或横向拉到资源并推动下去,在这种环境中,什么是双赢的合作实现路径就值得细细考量。

内部平台熟练程度:与其独自负重前行,不如合理利用资源、在奔跑的巨人身上前行。大厂工作的一大优势就是内部平台丰富,无论是低代码平台、还是数据报表平台,亦或是审批流程搭建,平时绝大多数想要用的东西,在大厂内部就是一个一个的平台,诚然,平台会有各种各样奇奇怪怪的问题,但是问题需要快速验证、流程需要进行初步搭建、闭环需要快速跑通的时候,将所需的功能进行快速串联,就能发挥出神兵利器一般的威力。


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


 聊聊工作状态


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

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


热爱,永远的必杀技!


 聊聊做事


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

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


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


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

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


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


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




  • 做好规划与目标


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

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


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


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


未来与期望

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


团队介绍

我们是淘宝体验技术&架构团队,以打造极致的移动用户体验为愿景,立志于移动端架构演进、高性能中间件、基础技术探索,为淘宝及其他移动应用核心场景体验赋能。我们长期招聘志同道合的伙伴,欢迎有志人士加入。

相关文章
|
4天前
|
存储 数据库 流计算
TDengine 资深研发分享解决思路,长查询不再成为系统性能瓶颈!
本文探讨了如何应对和解决长查询问题,以提升 TDengine 在复杂查询场景下的表现。
59 0
|
4天前
|
移动开发 小程序 JavaScript
【经验分享】记一次支付宝小程序的性能优化
【经验分享】记一次支付宝小程序的性能优化
39 6
|
8月前
|
设计模式 运维 Java
硬核!阿里P8耗时3月撰写700页性能优化笔记:程序优化提升了7倍
前言 在我看来,Java性能优化是Java进阶的必经之路,性能优化作为Java工程师必备的一种技术,一直热度不减。 Java是目前软件开发领域中使用最广泛的编程语言之一。Java应用程序在许多垂直领域(银行、电信、医疗保健等)中都有广泛使用。帮助开发者通过专注于JVM内部,性能调整原则和最佳实践,以及利用现有监测和故障诊断工具,来提升应用程序在商业环境中的性能。
|
11月前
|
设计模式 缓存 Java
好家伙!阿里新产Java性能优化(终极版),涵盖性能优化所有操作
上月公司来了一位大佬,入职不到一周就把公司现有项目的性能优化了一遍,直接给公司节省了一半的成本。 一问情况,才知道这位仁兄也是一路被虐过来的。去年年底被裁,本以为自己技术还行,看了一段时间面经,复习了基础知识,就开始投大厂简历。阿里最先给他面试机会,结果没能扛过三面,然后是各种大大小小的公司,在实际面试中被碾压得翻不了身。整整一个半月,一个offer都没拿到,最后针对性的恶补,才入职了我司。
|
消息中间件 缓存 安全
相亲app开发,性能优化技术并不是突发奇想
相亲app开发,性能优化技术并不是突发奇想
淘宝预售“买崩”程序员20分钟修复,全靠这份亿级流量并发手册
朋友们,今年双11电商大促即将到达,感受到四面八方激动的心情没有? 去年天猫淘宝在双十一中订单可是破了58.3万笔/秒,预测一波今年成交额又会打破去年记录。作为一名互联网民工,我关心的不是订单有多少,而是系统竟然没崩!以及这背后为了抗住这巨大的并发量的程序员同胞们……
|
设计模式 缓存 监控
如何搞好性能优化
想必大家都晓得,程序员想要提升,性能优化这块是最重要的一点,实现同样的功能,不同的设计思路能够极大的节省服务器开销,能够更好的提高用户体验,本篇文章我们就来一起探讨一下,性能优化优化的是哪些点。
117 0
|
SQL 监控 网络协议
云架构系统如何做性能分析?| 实战干货
云架构系统如何做性能分析?| 实战干货
|
存储 缓存 数据库
一对一直播系统开发,复杂数据的不一致问题分析
一对一直播系统开发,复杂数据的不一致问题分析
|
监控 程序员 开发工具
2021 友盟+移动应用性能挑战赛 -- Unity开发游戏启动慢问题解决方案
探索Unity制作游戏启动慢的问题原因分析和使用友盟+定位问题及处理问题的解决方案记录。
282 0
2021 友盟+移动应用性能挑战赛 -- Unity开发游戏启动慢问题解决方案