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

news2024/11/26 11:26:13

a30e018df5fe318dd810c72f85e05eda.gif

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

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

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

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

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

0545400c32f1a9dfab241fd7e1277e29.png

个人经历

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

  1. 2019年新年伊始,收到网易、小米的日常实习offer,一个本科学生能够拿到这样的实习offer还是非常难得的,非常开心的去网易有道实习了三个多月,也第一次远行去了北京。

  2. 后来,回到了成都腾讯PCG进行暑期实习,当时成都HC少得可怜,能拿到离家近的实习offer非常满足(家在重庆),最后也成功拿到了留下来的正式offer,好像经总监特批,拿到了 SP 。

  3. 大三暑假,拿到了淘宝架构组的正式offer,禁不住“架构组”三个字的诱惑,决定放弃舒适区。2020年3月淘宝架构组进行毕业前最后一段实习,“见见世面”。

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

  1. 工作第一年,主要负责 APM 可视算法准确性提升、模块重构等工作,得到了老板的认可,拿到了年会上的“最佳新人” 。

  2. 工作第二年,主要负责跳失、页面模型体系数据构建,卡顿问题定义等,成功在大厂毕业季中晋升一级,很幸运。

  3. 工作第三年,主要负责卡顿问题体系化解决推进、内存等OS级底层数据搭建,参与全量设备可排查数据体系解决方案,拿到了CARE卡、体验Go等。

62ee078dd8770c7981794df59995f0d4.png

ba8d3dc5662c62bed74c9d0d45b87d50.png

我的总结

  聊聊写好代码

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

  • 如何写好代码

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

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

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

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

  1. 广泛的阅读,并在读优秀的框架或者源码时,不应止步于了解实现了什么。Android源码中存在大量设计模式,例如处理点击事件的责任链模式、Activity生命周期的模板方法模式、Binder机制中的中介者模式等;也需要了解类之间的关系,例如Context及其子类;了解为什么需要这样使用。持续性给自己输入,处处反思,不将设计原则束之高阁。

  2. 刻意的练习并将代码提给『代码写得像诗一样的同学』认真CR。在学习设计原则时,往往是一些简单的demo,但如何落地到具体的工程代码中,是我们需要持续思考的问题,非常考验代码功底。工作中持续练习,并主动获得反馈,帮助了我快速成长。

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

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

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

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

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

e4f0fea56861677d8519e8a33ffbd7c1.png

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

你是否也写过妥协的代码?一起提高标准,严格要求自己的代码。

  聊聊学习

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

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

c536dd3ce6104325ed87eb51d3f89878.jpeg

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

6a9cb0d3943fc6a4ab76d4acc370674e.jpeg

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

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

29bfe4daa45fabdbde8f67c5519eccb0.jpeg

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

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

  聊聊工作状态

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

  1. 热爱工作,让自己快乐

    当我厌恶工作,那我在工作的时候就会觉得很煎熬;如果我不喜欢工作内容,我就会觉得无聊。别人可能会带给我们痛苦,但快乐我们一定要学会自给自足。工作在我们的生活中的时间占比太高,如果想要自己快乐一点,那就仿佛只有接受它,并热爱它。也算是打不过就加入、改变不了环境就改变自己的另一种形式吧。

  2. 热爱工作,提升自己的工作效率

    当自己心生抗拒时,效率不自然的就会降低,效率降低,工期拉长,如又遇到推进有问题,自己就会陷入痛苦之中。所以我会警惕自己产生抗拒心理。而『抗拒心理的敌人就是热爱』!专心投入时,自己会更加积极推进(自驱力),遇山开山,遇水搭桥。

热爱,永远的必杀技!

  聊聊做事

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

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

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

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

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

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

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

864608058dda6d6082c2db611b688b11.png

  • 做好规划与目标

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

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

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

2e88957544af39f4177862a4c44d8a5b.jpeg

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

c14a75092a0e35dcd91ec7826f8eb3eb.png

未来与期望

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

52244e8b098a195cad27c040342f5596.png

团队介绍

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

¤ 拓展阅读 ¤

3DXR技术 | 终端技术 | 音视频技术

服务端技术 | 技术质量 | 数据算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/595923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RNN基础概念

一、潜变量回归模型 使用潜变量 h t h_{t} ht​总结过去的信息 二、RNN 更新隐藏状态: h t φ ( W h h h t − 1 W h x x t − 1 b h ) h_{t}φ(W_{hh}h_{t-1}W_{hx}x_{t-1}b_{h}) ht​φ(Whh​ht−1​Whx​xt−1​bh​) 更新输出: o t W o h h t b…

第六十天学习记录:C语言进阶:文件操作3文件版通讯录改造

在之前写的静态通讯录和动态通讯录中,都存在一个致命的弊端,那就是当软件运行的过程中添加信息,不关闭软件能够正常显示信息。但一旦关闭软件,内存回收之后当再次打开软件,之前保存的信息全部都得重新添加。 因此需要…

人工智能-推荐

常用的推荐系统算法实现方案有三种: 协同过滤推荐(Collaborative Filtering Recommendation):该算法的核心是分析用户的兴趣和行为,利用共同行为习惯的群体有相似喜好的原则,推荐用户感兴趣的信息。兴趣有高…

老旧Mac不能升级macOS Ventura 13解决方案

老旧Mac不能升级macOS Ventura 13. 我2016年的MacBook Pro,遇到升级xcode失败以及不能更新到最新系统的问题。 ITMS-90725: SDK Version Issue - This app was built with the iOS 15.5 SDK. All iOS apps submitted to the App Store must be built with the iOS 15 SDK or …

chatgpt赋能python:Python信息隐藏:掩耳盗铃的神奇技巧

Python信息隐藏:掩耳盗铃的神奇技巧 在现代社会中,保护信息资产安全已经变得至关重要。信息隐藏(steganography)是一种将秘密信息嵌入到其他无关数据中以便于传输的技术。Python作为一种易学易用,而且功能强大的编程语…

嵌入式驱动入门之LCD-1.基础原理(颜色格式、FB、8080/RGB接口)

主要介绍LCD显示的基本原理,涉及像素、分辨率、颜色模型、RGB888等格式、Framebuffer、8080接口、RGB接口。 参考资料:嵌入式驱动入门之LCD-1.基础原理(颜色格式、FB、8080/RGB接口) 1.LCD显示出图片的基本原理 LCD作为显示器&…

Golang每日一练(leetDay0083) 汇总区间、多数元素II

目录 228. 汇总区间 Summary Ranges 🌟 229. 多数元素 II Majority Element ii 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专…

WPF绘制深圳地铁路线图

经常坐地铁,却不知道地铁多少条线路?哪个站下车?今天就带领大家熟悉并绘制深圳地铁路线图。 WPF在绘制矢量图方面有非常强大的优势,利用WPF可以绘制出各种矢量图形,如线,圆,多边形,…

SQL:批量获取次月留存和滚动留存

一、批量获取每月的次月留存率 问题描述: 现在有一份用户活跃数据,想要取每个月的用户在次月的留存,结果如下表 month活跃用户数次月留存用户数2023-011000050002023-021100060002023-03150007500... 思路: 先生成每个日期对…

Hadoop 原理介绍

1 文件系统和分布式文件系统 1.1 文件系统 文件系统:一种存储和组织数据的方法 实现了数据的存储、分级组织、访问、获取等操作使得用户对文件的访问和查找更容易使用树形目录的抽象概念代替了硬盘等物理设备中数据块的概念 ——>用户不必关系数据底层存在硬盘…

Java与分布式架构:微服务和RPC框架的应用和设计思路

章节一:引言 在当今互联网时代,大规模、高并发的应用成为了主流。为了应对这些挑战,软件架构趋向于分布式架构的设计。本文将重点讨论Java语言在分布式架构中的应用,以及微服务和RPC框架在设计中的关键思路和技术案例。 章节二&…

chatgpt赋能python:Python倒序排列的全面指南

Python倒序排列的全面指南 在Python中,几乎所有的数据结构都支持倒序排列。倒序排列是许多编程问题的解决方案,如查找最后一个元素,寻找最大值或最小值等等。在这篇文章中,我们将深入探讨Python中倒序排列的使用方法和技巧&#…

Flutter 笔记 | Flutter 核心原理(五)Box 布局模型和 Sliver 布局模型

根据前文我们已经从宏观上得知:Layout流程的本质是父节点向子节点传递自己的布局约束Constraints,子节点计算自身的大小(Size),父节点再根据大小信息计算偏移(Offset)。在二维空间中&#xff0c…

Android逆向猿人学2022年app比赛第五题双向验证SSLpinning(步步验证)

SSLpinnig 前言一、起步二、抓包三、分析四、验证第一种方法:第二种方法: 借鉴 前言 这题在抓包方面会有点小问题,但是最后结果是正确出来了,如果有了解后面这个问题的读者,请多指教,十分感谢。 一、起步…

C Primer Plus第十五章编程练习答案

学完C语言之后,我就去阅读《C Primer Plus》这本经典的C语言书籍,对每一章的编程练习题都做了相关的解答,仅仅代表着我个人的解答思路,如有错误,请各位大佬帮忙点出! 由于使用的是命令行参数常用于linux系…

串口通信简介

1. 数据通信的基础概念 1.1 数据通信方式 按数据通信方式分类,可分为串行通信和并行通信两种。串行和并行的对比如下图所示: 串行通信的基本特征是数据逐位顺序依次传输,优点是传输线少、 布线成本低 、 灵活度高等优点,一般用…

docker架构速看(2)-镜像

docker架构细看(2)-镜像 ​ 上一章讲了Docker服务端的启动,这一章我们来看Docker中的镜像,需要对容器镜像分层存储,容器存储驱动有一定了解,参考 容器技术原理(一):从根本上认识容器镜像 ​ Docker篇之镜像存储-OverlayFS和联合…

JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO

JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO 这是一篇总结文章。 文章目录 JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO1、学习技术的梳理1.1、jdbc的引入1.2、ResultSet[结果集]1.3API小结 2、数据库连接池3、Apache公司的DBUtils工具-BasicDAO…

在页面上画一个三角形然后点击内部触发事件

在HTML页面上创建一个canvas元素。使用JavaScript绘制三角形并将其填充。您可以使用canvas的API来绘制形状,例如beginPath()和lineTo()等。将一个事件监听器绑定到canvas元素上,以便在单击三角形时触发事件…

Rust每日一练(Leetday0017) 字母异位词分组、幂函数、N皇后

目录 49. 字母异位词分组 Group Anagrams 🌟🌟 50. 幂函数 Pow(x, n) 🌟🌟 51. N 皇后 N-Queens 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日…