配图:Wedgwood 野草莓系列 By Yingyun
茶话会介绍
2022.3.25 ,周五晚上九点,The Performance 知识星球举办了第一次线上茶话会,3 位星球主理人 + 5 位星球嘉宾,50 多位球友参加,非常感谢各位!
第一次茶话会没有预设主题,预计 1 个小时就可以结束,结果聊了 2 个半小时,光是主理人和嘉宾的个人介绍就花了一个小时。平时大家在群里和星球里交流很多,但是通过语音在线交流还是第一次,再者大家的公司基本上涵盖了 Android 上下游:既有 App 大厂的大佬,也有一线手机厂商的系统大咖,也有芯片公司和造车新势力的资深专家。所以在每个人自我介绍的时候,会聊一些公司相关的东西,再发散一下,其他人再问一些问题,时间就过去了。
后续会不定期举办星球茶话会,主题会更加明确,也会邀请更多嘉宾来一起聊聊,不局限于技术,欢迎大家多多参与和提问。考虑到隐私问题,
本次茶话会没有录屏,下面的内容也不会涉及到各位的隐私,文字稿是根据聊天内容部分还原的。
关于职业发展
领域的应届生真的被庞大的知识体系压的有点喘不过气
改变心态:学校跟专业领域是不一样的。学校是有课本,学完一门课就算结业了。从事专业事项的时候,两个不一样,而且很不一样。
从手边的问题开始学习:把工作中遇到的不懂的问题弄懂,做到 100 分甚至 110 分,平时储备自己不具备的知识。对于新人来说,把工作做好有很多好处。一是增加经验,二是获得更多学习与接触新东西的机会。切忌主业没做好,做另外一个方向,除非你确定目前的主业不适合自己干。
面向解决问题编程:工作中很重要的一个技能就是解决问题,老板发钱就是让你解决问题的。掌握好度,以经济学来说就是控制好边际收益,投入与产出应最大化是比较理想的情况。
掌握学习的方法和技巧:爬山的时候直接看山顶,更让人容易放弃。更好的方式是,头朝下一步一步走,偶尔看看地图是否走错,或者走着走着发现更适合自己的路。
刚从 App 开发转到安卓系统性能优化的小白
跟踪公司的项目走:如果有人带那就好,跟着公司项目走,这是最快的。
自驱力:如果愿意平时学习,会的多了争取到的机会也多一些。还是那个观点,对于新人来说,把手头工作做好的前提下努力学习跟主业相关的新知识。当你做手头工作的时候你的主观能动性会变强、周边同事与领导也会支持你,而且给你的奖励也是不错的。
不要给自己设限:知识都是融会贯通的,不要把自己局限在自己的一亩三分地,尤其是做性能的,App、Framework、Kernel、Hardware 这些,都可以去看去学习。努力使自己处于「知道自己不知道」的状态,最糟糕的是「不知道自己不知道」还觉得优化没啥可做,从经验与常识来看,这都是错误的。
知识体系化:性能优化涉及到的知识非常广,平时分析和解决问题的时候,要多看代码、多记录、总结和归纳,把学到的知识体系化,不要想着一蹴而就,要厚积薄发。
利用好现有的资源:跟着星球内容、博客内容、大厂的优秀文章这些学习,多提问,不管有多初级。
关于提问
星球是一个很好的平台,很多让你困惑的问题别人也经历过。但是你要利用好他的前提是能问出准确的问题。如果问问题,是个技术活。
可以参考这篇文章:到底如何提问?:https://mp.weixin.qq.com/s/l_Iz5pZ5yXhBAoPzNi4m-Q
决定探讨、思考、回答的质量和效率。「提出好的问题已经解决了问题的一半」,说得没什么科学依据,但也不妨理解好问题的重要性。
决定做事方向。曾经有人问爱因斯坦:「如果您有一个小时来拯救世界,您将如何使用?」他回答说:「我将花 55 分钟确定问题,然后花 5 分钟解决问题。」
提问是认识世界和人的桥梁。好问题能激发优秀者的教学欲望,将宝贵信息倾囊相授。
其实可以从一个人提问的能力来判断其段位。就像杨澜说的,「一个人的提问力,彰显在与外界互动质量的高低。」
尽量使用 Google 来搜索答案,百度和 Google 的答案差异很大。答案不区分中文资料和英文资料,能解决疑惑就是好资料,值得保存和分享(到星球或者星球微信群)。
需要提供日志分析问题时
如果涉及到敏感内容,比如 Systrace 中涉及到敏感信息,可以使用文本软件,比如 VSCode 打开 Systrace 文件,一键将敏感信息(比如 package name)替换。
Log 中如果涉密,尽量还是不要发出来。
如果是单独发给三个主理人,那么不脱敏也无所谓,我们承诺不会公开这些内容,只会做分析使用。
一个好的闭环:大家伙提问 -> 一起分析原因 -> 尝试各种方法解决 -> 通过数据验证有效果 -> 把结果分享给大家。
关于面试
有时候需要出去跟友商、新赛道的人沟通下,可以看看外部环境都在发生怎样的变化。首要目的不是为了跳槽(如果有好机会,跳也无妨),而是为了让自己在人力资源市场上有比较高的竞争力。
这里首先要区分职业与工作的区别。我是软件工程师,这是我的职业。我在 A 工作任职负责某个模块,这是我的工作。这两个是不一样的,如果你能把两者区分开(前提是能区分得开),那在择业、面对公司变化的时候都能从容应对。
最理想情况下,应该追求自己喜欢的职业,因为它伴随你绝大部分时间,如果这个职业本身不让你感到兴奋,你不太可能做出比较好的成绩,进而无法获得比较高的回报。
遇到好的工作,那就看天意了。这很复杂,与很多很多因素有关系。当你遇到面试不顺利,只能说这个工作不适合你,没有缘分,无法进一步说明更多的事情。
关于公司环境
不同的公司在不同的行业赛道、竞争格局上所采用的策略是不一样的。微观上,你的部门领导的风格以及同事们的结构,都影响到了你具体做事的环境。不同环境所追求的「回报最优值」是不一样的。
有的是需要你做到行业 5%,得到组织认可。有的是能把问题搞定就行而不关心如何搞定的,得到组织认可。
要么直接硬刚这种环境,按照你认为对的方式行事,要么就适应它。无论选择哪种,要知道局面是什么局面,而不是遇到与自己想象不一样的时候要么怀疑自己,要么以为这个世界就是这样。
关于学习新技术
对于优化业务来说,它是有底层逻辑可寻的。而这些底层逻辑遇到不同的技术栈、不同的局面的时候会藏的比较深。平时学习中,要努力找出这种底层不变的东西,将可变的东西套进去,一是增强对新技术的判断力,二是可以举一反三提出更进一步的优化方案。
不要在新技术的表面上游荡,一是自己觉得累,二是这没啥意义。
优化做到一定深度,肯定是往底层走。比如编译器、硬件特性,甚至硬件整合。因为这些东西直接决定了程序的速度,所以是绕不开的一道坎。
关于 GPU
讲 GPU 架构相关:下面是一些 PDF,各时代、各厂商的 GPU 架构都不一样,当然也有相似之处,建议都看看。初学 GPU 架构的人会遇到很多专业名词,遇到了不懂的词要去搜索,然后弄懂,会有文章介绍,看完后会更加拓展你的视野,发现新的一片天地。
GPU Architectures[1]
Introdution to GPU architecture[2]
Introduction to Modern GPU Architecture[3]
Graphics and Computing GPUs[4]
GPU Architecture and Function[5]
讲 GPU 架构相关的书,几乎没啥书:
Mobile 3D Graphics SoC From Algorithm to Chip 这本书网上只有付费的,免费的 PDF 可以在我们星球上搜。
讲 GPU 相关的博客,很多我找不到了,就列举了一些我能找到的:
深入 GPU 硬件架构及运行机制 - 0 向往 0 - 博客园[6],这个论坛讲的内容比较成体系,作者面向的读者应该是游戏开发的人群,不过学习图形的人都可以看看。
Tile Based 架构下的性能调校[7],关于 Tile base 如果性能调优。-** 厂商一般都没有 OpenGL 实现库源码,如果又对源码感兴趣,可以下载下面两个库代码看**:
谷歌的 swiftshader,在谷歌 Android 源码根目录 external/swiftshader 下,一个完全用 CPU 实现的 OpenGL 3.0 的版本,代码可读性非常高,可以帮助大家理解 OpenGL 的各种原如:状态机、资源管理、API 实现等。
Mesa 3D[8],一个开源的图形驱动库,网上有一些文档介绍可以搜搜。
如果没有图形开发经验,想学习 Vulkan 开发个人推荐先学习 OpenGL:因为 GPU 底层原理和机制都一样,学习了 OpenGL 入门 Vulkan 会更加简单,因为 Vulkan API 更加底层如果直接学习 Vulkan 估计会比较困难。如果有了 OpenGL 开发基础,想学 Vulkan,我分享一下我的学习之路(可能不是最优的,大家参考一下即可):
Vulkan Tutoria l[9] 学习最简单的 Vulkan 例子,如:如何绘制一个三角形。
《Vulkan Programming Guide》By Graham Sellers and John Kessenich,网上有 PDF,也有中文版,这本是官方出版的书,一本没有感情介绍 Vulkan API 的书,比较赤裸裸的介绍 API,几乎不讲原理,我学习它的目的是要熟悉 Vulkan 的 API。
《Vulkan 学习指南》作者帕敏德·辛格,也是一本入门的书,我是微信读书看的中文版,不过翻译得很一般,能看英文的尽量看原版,这本书比较注重渲染的流程和原理的讲解,不过 API 的介绍不全,需要配合《Vulkan Programming Guide》一起看。
看了入门的书,那就要动手写代码了,所以我推荐大家看一本用 Vulkan 来介绍游戏开发的书,我个人看的吴亚峰的《Vulkan 开发实践指南》,这本书个人觉得写的很一般,我看它的主要原因是,我大学的时候看过这本书 OpenGL 版本的,这本书基本就是 OpenGL 版本直译过来,讲的比较冰冷。
为什么都在推 Vulkan,Vulkan 比 OpenGL 有什么优势?可以看:
苹果开发官网的Bringing OpenGL Apps to Metal[10]视频,Metal 和 Vulkan API 基本一样,目的也是一样,都是来自 AMD 的 Mantle,把视频中 Metal 当做 Vulkan 就可以了
上面书中《Vulkan 学习指南》作者帕敏德·辛格,开编就有讲 OpenGL 和 Vulkan 差异
最后就是:学习图形开发的人一定要沉得住气耐得住寂寞,多看书多练习,不然很难学得精通,这是一个长期的过程,不是看几本书就能精通的。学习 GPU 架构的人,国内基本没有一家像样的 GPU 供应商,GPU 方面资料会很少,所以一定要多到外网去收集学习资料,可以多用 GPU 调试工具调试去分析应用程序,去了解 GPU 内部的 Counters,如 DS5 Streamline、Snapdragon Profiler 等,另外在没有很全面的学习资料的前提下,去学习一门更加底层的图形开发技术对学习和了解 GPU 架构也很重要,如 Vulkan,这会有助于自顶而下的去了解 GPU 内部的工作原理。
关于提到的文章、书
文章:十年创业者万字长文分享招人
文章地址:https://presence.feishu.cn/docs/doccn71hTTKbaRGF8RvD2XzLJEK,里面列举了作者总结的[11] S、A、B、C 类人才,大家可以对照一下自己做事的方式,看看更高级别的人才是怎么做事的
书籍:程序员的自我修养 by 俞甲子 / 石凡 / 潘爱民
豆瓣地址:https://book.douban.com/subject/3652388/[12]
这本书主要介绍系统软件的运行机制和原理,涉及在 Windows 和 Linux 两个系统平台上,一个应用程序在编译、链接和运行时刻所发生的各种事项,包括:代码指令是如何保存的,库文件如何与应用程序代码静态链接,应用程序如何被装载到内存中并开始运行,动态链接如何实现,C/C++运行库的工作原理,以及操作系统提供的系统服务是如何被调用的。每个技术专题都配备了大量图、表和代码实例,力求将复杂的机制以简洁的形式表达出来。本书最后还提供了一个小巧且跨平台的 C/C++运行库 MiniCRT,综合展示了与运行库相关的各种技术。
对装载、链接和库进行了深入浅出的剖析,并且辅以大量的例子和图表,可以作为计算机软件专业和其他相关专业大学本科高年级学生深入学习系统软件的参考书。同时,还可作为各行业从事软件开发的工程师、研究人员以及其他对系统软件实现机制和技术感兴趣者的自学教材。
书籍:软件调试(第 2 版) by 张银奎
本书堪称是软件调试的“百科全书”。作者围绕软件调试的“生态”系统(ecosystem)、异常(exception)和调试器 3 条主线,介绍软件调试的相关原理和机制,探讨可调试性(debuggability)的内涵、意义以及实现软件可调试性的原则和方法,总结软件调试的方法和技巧。
卷 1:硬件基础
豆瓣地址:https://book.douban.com/subject/30379453/[13]
第 1 卷主要围绕硬件技术展开介绍。全书分为 4 篇,共 16 章。第一篇“绪论”(第 1 章),介绍了软件调试的概念、基本过程、分类和简要历史,并综述了本书后面将详细介绍的主要调试技术。第二篇“CPU 及其调试设施”(第 2 ~ 7 章),以英特尔和 ARM 架构的 CPU 为例系统描述了 CPU 的调试支持。第三篇“GPU 及其调试设施”(第 8 ~ 14 章),深入探讨了 Nvidia、AMD、英特尔、ARM 和 Imagination 这五大厂商的 GPU。第四篇“可调试性”(第 15 ~ 16 章),介绍了提高软件可调试性的意义、基本原则、实例和需要注意的问题,并讨论了如何在软件开发实践中实现可调试性。
本书理论与实践紧密结合,既涵盖了相关的技术背景知识,又针对大量具有代表性和普遍意义的技术细节进行了讨论,是学习软件调试技术的宝贵资料。本书适合所有从事软件开发工作的读者阅读,特别适合从事软件开发、测试、支持的技术人员,从事反病毒、网络安全、版权保护等工作的技术人员,以及高等院校相关专业的教师和学生学习参考。
卷 2:Windows 平台调试
书籍信息:https://book.douban.com/subject/35233332/[14]
第 2 卷分为 5 篇,共 30 章,主要围绕 Windows 系统展开介绍。第一篇(第 1~4 章)介绍 Windows 系统简史、进程和线程、架构和系统部件,以及 Windows 系统的启动过程,既从空间角度讲述 Windows 的软件世界,也从时间角度描述 Windows 世界的搭建过程。第二篇(第 5~8 章)描述特殊的过程调用、垫片、托管世界和 Linux 子系统。第三篇(第 9~19 章)深入探讨用户态调试模型、用户态调试过程、中断和异常管理、未处理异常和 JIT 调试、硬错误和蓝屏、错误报告、日志、事件追踪、WHEA、内核调试引擎和验证机制。第四篇(第 20~25 章)从编译和编译期检查、运行时库和运行期检查、栈和函数调用、堆和堆检查、异常处理代码的编译、调试符号等方面概括编译器的调试支持。第五篇(第 26~30 章)首先纵览调试器的发展历史、工作模型和经典架构,然后分别讨论集成在 Visual Studio 和 Visual Studio(VS)Code 中的调试器,最后深度解析 WinDBG 调试器的历史、结构和用法。
本书理论与实践结合,不仅涵盖了相关的技术背景知识,还深入研讨了大量具有代表性的技术细节,是学习软件调试技术的珍贵资料。
这本书应当还有卷 3,此卷里会讲基于 Linux 平台的调试方法。
关于 The Performance 知识星球
The Performance 是一个分享 Android 开发领域性能优化相关的圈子,主理人是三个国内一线手机厂商性能优化方面的一线开发者,有多年性能相关领域的知识积累和案例分析经验,可以提供性能、功耗分析知识的一站式服务,涵盖了基础、方法论、工具使用和最宝贵的案例分析
星球介绍[15]:https://www.androidperformance.com/2022/03/13/the-performance/[16]
付费版本微信扫码加入即可
还有一个免费版,定位是知识分享和交流,也可以微信扫码加入
参考资料
[1]
GPU Architectures: https://drive.google.com/file/d/12ahbqGXNfY3V-1Gj5cvne2AH4BFWZHGD/view
[2]Introdution to GPU architecture: http://www.irisa.fr/alf/downloads/collange/cours/ada2020_gpu_1.pdf
[3]Introduction to Modern GPU Architecture: http://download.nvidia.com/developer/cuda/seminar/TDCI_Arch.pdf
[4]Graphics and Computing GPUs: https://www.comp.nus.edu.sg/~cs2100/2_resources/AppendixA_Graphics_and_Computing_GPUs.pdf
[5]GPU Architecture and Function: http://meseec.ce.rit.edu/551-projects/spring2015/3-1.pdf
[6]深入 GPU 硬件架构及运行机制 - 0 向往 0 - 博客园: https://www.cnblogs.com/timlly/p/11471507.html
[7]Tile Based 架构下的性能调校: https://www.cnblogs.com/gameknife/p/3515714.html
[8]Mesa 3D: https://github.com/mesa3d/mesa
[9]Vulkan Tutoria l: https://vulkan-tutorial.com/
[10]Bringing OpenGL Apps to Metal: https://developer.apple.com/videos/play/wwdc2019/611/
[11]https://presence.feishu.cn/docs/doccn71hTTKbaRGF8RvD2XzLJEK,里面列举了作者总结的: https://presence.feishu.cn/docs/doccn71hTTKbaRGF8RvD2XzLJEK,里面列举了作者总结的
[12]https://book.douban.com/subject/3652388/: https://book.douban.com/subject/3652388/
[13]https://book.douban.com/subject/30379453/: https://book.douban.com/subject/30379453/
[14]https://book.douban.com/subject/35233332/: https://book.douban.com/subject/35233332/
[15]星球介绍: https://www.androidperformance.com/2022/03/13/the-performance/
[16]https://www.androidperformance.com/2022/03/13/the-performance/: https://www.androidperformance.com/2022/03/13/the-performance/