第五十三期:资深技术Leader肺腑忠告:如何成为技术大牛?

这篇文章,对于每一个想成为技术大牛的人来说都值得仔细阅读好几遍。

作者:曹乐来源:再成长一次

 

图片来自 Pexels

双生说:曹乐是典型学霸,清华本硕,多年互联网大厂研发经验,所以“资深”。我刚到新部门的时候,约各位合作部门的 Leader 请教,也算帮我做新岗位入职的“平稳降落”。

印象最深的,就是作为技术 Leader 的曹乐,一点都不像技术——他和我谈对业务的理解,各个维度的见解与想法,让人印象深刻。

然后,他很热情的帮我安排了他团队几个同学的 1-1,帮助我了解了更多从技术视角对业务与技术团队协同、共创的思考。

后来,开始深入合作,发现合作的技术同学,不仅仅技术上追求精进,而且是真正的也能够跳出来去看业务全局。能跳出来,能跳进去。

这封信,是曹乐写给团队的。如何成为技术大牛(来自另一学霸同事的评论,感谢):寻找范式、刻意练习、及时反馈;垂直打透、横向迁移、深度复盘;聪明人要下笨功夫。

Enjoy~

接纳焦虑

很多同学都有关于工程师该如何成长的问题,大家普遍对如何成长为牛人,如何获得晋升,如何在繁忙的工作中持续学习充满了困惑,这其实是每一位同学成长过程中必经之路。

最近几次 1-1 也和同学聊过这方面的问题。在这里也想跟大家分享一下我的一些心得。

同学们普遍对成长充满了焦虑感。工作太忙没时间学习,需求太多太琐碎感觉自己没什么进步,做技术是不是做到 35 岁以后就没人要了,等等,都是对成长焦虑的体现。

在这里我想说的是,这种焦虑是正常的,所有的渴望,在内心的投射其实都是焦虑。

任何一个渴望成长的人,不管处于什么阶段,一线工程师,架构师,还是总监,副总裁,其实内心中都是充满了焦虑的,无一例外。

对于这种焦虑,我们所要做的是接纳,而不需要过度担忧。这种焦虑并不是说,想明白如何成长了就会没有了,到了某个阶段就会没有了的。

成长的脚步和期待一刻不止,内心的焦虑也一刻不会停歇。正是这种焦虑感,驱使你写代码追查问题到星夜,驱使你牺牲休息娱乐的时间和一本本厚厚枯燥的书作伴,驱使你不断努力向前,不舍昼夜。

相反的,如果内心中没有这种焦虑,反而是值得担忧的。这可能说明已经习惯呆在自己的舒适区了。

在现在这样一个高速发展的社会,以及我们这样一个高速发展和变化的行业,失去对成长的渴望和焦虑反而是一个非常危险的信号。

35 岁危机

所谓的程序员 35 岁危机,其实背后的根本原因是,有太多太多人在工作几年以后,就觉得自己什么都会了,之后的十几年工作只不过是头 2-3 年的简单重复而已。

在我们这样一个行业里,在招聘的时候,如果摆在管理面前的两个:

  • 一个是初出茅庐或刚工作 2-3 年,充满了对成长的渴望。
  • 另一个工作十多年了但水平和工作 2-3 年的人差不多,只是更熟练一些,不过在舒适区已经躺了十年了。

如果负责招聘的是你,你会做出什么样的选择?而另一方面,其实是高端人才在行业内的极度极度稀缺。

大家可以想一想,我们部门上一次招聘到 D10 及以上的同学是什么时候?从业务平台部 2016 年中成立到现在,一个都没有过。

D9 同学也是凤毛麟角,一年能招到 1-2 个就足够可以偷着乐了。面试碰到牛人的时候,就如同相亲碰到女神一样激动。这在行业内是非常普遍的现象,真正的大牛太稀缺了。

在这样一个行业里,如果一个人能够持续成长,能力和工作年限成正比的持续提升,这样的人,任何时候在行业里都是被疯抢,怎么可能会遇到任何年龄的危机呢?

每一个业务平台技术部的同学,都应该立志成为这样的大牛,持续学习和成长。

刻意练习三步法

如何学习,其实是有方法论的,那就是刻意练习。所谓的 10000 小时成为大牛的理论是片面的,如果只是简单重复 10000 小时,是不可能成为大牛的。

刻意练习包含了三个步骤:

  • 找到你要学习的这个领域体系的范式(Pattern)
  • 针对每个范式刻意的反复学习和练习
  • 及时反馈

大家在过往的工作和学习生活中,或多或少都在实践着刻意练习。拿面临高考的中学生举例子。

好的学生通常是把一门功课拆成了很多知识点(寻找 Pattern),然后针对知识点以及他们的排列组合,有针对性的反复做各种难度的题(刻意练习)。

每次做完题都对一下答案看看正确与否,如果错了就思考,记录,复盘(持续及时反馈)。这样的学习方法就是事半功倍的。

而事倍功半的学习方法,就是不分青红皂白拿起一本习题或卷子就拼命做,我上学的时候身边不少同学非常勤奋但成绩并不好,多半都是这个原因。

再举一个我最近在学打羽毛球的例子,正确的学习方法是把打羽毛球拆解成步法和手上动作,小碎步,米字步,正反手挑球,放网,正手和头顶高远球吊球杀球等(寻找 Pattern)。

然后针对每一个动作反复练习(刻意练习),然后请教练或者录下来看视频纠正自己的动作(及时反馈)。

而错误的学习方法是,上来就盲目找人打比赛,以赛代练,这样的进步是很慢的,而且错误的动作形成习惯以后未来反而很难纠正。

当学习方法不正确的时候,刻苦的学习常常只是看起来很勤奋,并没有应有的效果。

当接触一个陌生领域的时候,错误的学习方法是不带目的性,上来就找一堆相关的大部头开始啃。

而正确的学习方法应该是快速梳理该领域的知识点,形成框架体系(寻找 Pattern),这里有些小窍门可以快速构建起一个领域的知识点体系。

例如看一些该领域的综述性或开创性的文章(看论文,别瞎看网上的文章),或者找本该领域综述性的教科书看它的目录(注意,好的教科书的目录往往就是这个领域的知识框架,内容倒不一定非要看下去)。

然后,针对每个知识点,找书里的相关章节,该领域相关 Paper 里的相关 Section 深入学习,建立起自己对这个知识点的理解(刻意练习)。

最后,再把知识点和现实工作中的情况(自己工作,或其他公司相关的工作)进行对照(及时反馈),从而建立对一个知识点的深度理解,最后融会贯通建立对一个领域的理解。

这样说可能有点抽象,拿我当年学习分布式存储的过程为例子,先结合自己的工作内容梳理出需要深入了解的知识点。

例如,元信息组织、Meta Server 设计和 HA、副本组织和管理、Recovery、Rebalance、单机存储引擎、数据/元信息流、纠删码、一致性、多租户、存储介质、网络环境和 IDC 等等。

同时看很多综述性的材料,梳理分布式存储的知识点(有网上各种整理的比较好的文章,也有从各种系统实现的 Paper 里抽出),不断迭代构建分布式存储领域的知识点(寻找 Pattern,这是最难的一个过程)。

然后针对每一个知识点,找相关材料进行深度学习,例如,对于分布式一致性,需要阅读 CAP 理论,Paxos 的论文,Raft 的论文等等,以及周边的很多材料(刻意练习)。

然后找各种系统实现的论文或文章,比如 GFS,Dynamo,Aurora,OceanBase,Ceph,Spanner 等等,看看和对比它们在一致性上是如何考虑和取舍的。

当然,最重要的是结合自己工作中的反复实践和所学知识点进行比对(及时反馈)。

这三个阶段并不是割裂的,而是周而复始的,经常会在刻意练习和及时反馈的学习过程中,发现自己遗漏的知识点,或者发现自己梳理的两个知识点其实是重合的。

通过这种交叉比对,以及在实践中不断检验的方式建立的知识点是非常可落地的,而不会看了几篇论文以后就人云亦云。

拿分布式存储的一致性举例子,如果不是反复对比、思考和反复实践,你不会发现 GFS 论文里最难的一段,多个 Writer 对一个文件进行 Append 的逻辑,在实践中根本没用。

你也不会发现看起来优雅而学术的 CAP 三选二的理论,实践中压根不是这么完美,很多时候只能三选一。

你也不会发现 Dynamo 论文里的 Vector Clock,网上有无数文章摇头晃脑的解读,但在 Amazon 的应用场景里是个典型的 over design,Cassandra 在这点就务实很多。

这时候大家可能会有个疑问,工作本身就如此繁忙了,哪里能抽出足够多的时间去学习?

工作和学习并不割裂

其实工作和学习本身,是不应该被割裂的。工作本来就应该是学习的一部分,是学习中的实践和及时反馈的部分。学习如果脱离工作的实践,是非常低效的。

因此每个同学应该对自己工作所在的这个技术和业务领域进行系统性的学习,并在工作中反复实践和验证。

不同的领域之间其实是融汇贯通的,当你对一个领域精通并总结出方法论以后,很容易就能上手别的领域。

因此花几年实践彻底研究透一个领域,对于刚工作几年的同学来说,是非常重要,甚至是必须的,也只有在一个领域打透之后才谈得上跨领域迁移,去拓展自己的知识面。

更直接的说,对于一个领域还未完全掌握的同学,深度是最重要的,不用想广度的事情,等掌握了一个领域之后,再去拓展广度就变得很容易了。

这里一个常见的误区是,学习的内容和工作的领域没有太多直接的关系。

例如,我以前曾经花了非常大的功夫去读 Linux 内核的源代码以及很多相关的大部头,几乎花掉了我将近两年的所有空闲时间。

然而在我这些年的工作里,几乎是没有用处的,最多就是有一些“启发”,ROI 实在是太低了,现在也忘得差不多了。

更重要的,软件工程是一门实践科学,从书本上得到的知识如果没有在实践中应用和检验,基本上是没有用处的。

举一个例子,很多优秀的架构师,尽管日常工作中可能反复在用,但未必说得出开闭原则,里氏替换原则,迪米特法则等等。

反过来,对面向对象设计这 7 大原则出口成章的人,很多其实离真正的架构师还远得很,有些甚至只是博客架构师而已。

实践远远比看书,看文章重要得多,上文所述的我构建自己分布式存储知识体系的过程,看起来好像都是看材料,看论文,而实际上 80% 的收获都来源于带着理论的实践,和从实践中总结沉淀的理论。

因此,彻底搞明白自己工作所在的技术和业务领域,是最务实高效的做法,工作和学习割裂,会导致工作和学习都没做好。

这时候大家可能会有另一个疑问,感觉日常工作非常琐碎,学不到什么东西,怎么办?

如果把学习分成从书本中学,和从工作中学这两种的话,那毫无疑问,工作中的“知识密度”,比起书本的“知识密度”,肯定是要低很多的,因为书本里的知识,那都是人家从他们的工作中抽象总结出来的。

这也是为什么大家普遍觉得日常工作“琐碎”。然而工作中每个点滴的琐事与平凡,都是可以抽象总结成为方法论的,更别说工作所在的领域自身的博大精深了。从日常工作中学习的秘诀,就是“行动中思考”。

优秀架构师的两大能力

对于每一个软件工程师,最重要的两个能力:

  • 写代码
  • Trouble Shooting

并且,要成为优秀的架构师,出色的开发能力和追查问题的能力是一切的基础。

提高写代码的能力的核心,首先在于坚持不断的写,但更重要的,在于每天,每周,持续不断的 Review 自己之前的代码,同时,多 Review 牛人写的代码。

比如团队里你觉得代码写的比你好的同事,比如社区里以代码漂亮著称的开源代码(作为一个 C++ 程序员,当年我的榜样之一是 Boost 库)。一旦觉得自己之前的代码不够好,就立刻复盘,立刻重构。

更重要的是,多思考自己代码和好的代码之间不同之处背后的为什么,通常这就是为什么这些代码更好的背后的秘密。

特别要说明的是,代码规范除了知道是什么外,要格外重视思考每一个代码规范背后的为什么。代码规范的每一句话,背后无一例外都是一片江湖上的血泪史。

要提高 Trouble Shooting 的能力,关键在于要深度复盘自己遇到的每一个问题,包括线上的,包括测试发现的。

寻找每一个问题,每一次事故背后的 Root Cause,并且思考后续如何避免同类问题,如何更快的发现同类问题。

要对团队内外遇到的所有问题都要保持好奇心,关注一下周边的事故、问题背后的 Root Cause。

Trouble Shooting 能力的提高是几乎无法从书本上得到的,完全来源于对每一个问题的深度思考,以及广泛积累每一个问题。

对于架构师而言,可能未必在一线写代码了,但看团队中一个架构师是否真正牛逼的一个很重要标准,就是看他是否能够追查出团队其他同学查不出来的问题。

我见过的一个真正牛逼的架构师,对于系统中疑难杂症,通常问几个问题,就能大致猜出是哪里出的问题,以及可能的原因是什么,准确程度如同算命,屡试不爽,令人叹为观止。

对于一个架构师,除了更加优秀的代码能力和 Trouble Shooting 能力外,需要构建相对完整的当前技术领域的知识体系,需要有体系化的思维能力,需要对技术所服务的业务有非常深入的了解。

体系化的思维能力,来源于两个方面。一方面是在日常工作中,对每一个接口设计,每一个逻辑,每一个模块,子系统的拆分和组织方式,每一个需求的技术方案,每一个系统的顶层设计,都要反复思考和推敲,不断的复盘。

另一方面,需要大量广泛的学习行业内相似系统的架构设计,这其实就是开天眼,只是技术相对来说,行业内的交流更加频繁。

淘宝、美团、百度、Google、Facebook、Amazon 等各个公司介绍系统架构的论文和 PPT 铺天盖地,需要带着问题持续学习。

除了技术领域本身外,架构师需要非常了解业务上是如何使用我们的系统的,否则非常容易 Over Design,陷入技术的自嗨中。

这也是为什么我说 Amazon Dynamo 论文里讲的 Vector Clock 是个 Over Design 的原因。

另一方面,很多时候技术上绕不过去的坎,可能非常复杂的实现,往往只需要上层业务稍微变通一下,就完全可以绕过去。

这也是为什么我说 GFS 论文里,多个 Writer 同时 Append 同一个文件是个根本没用的设计(实际上 Google 内部也把这个功能去掉了)。

这也是为什么我在咱们部门内反复强调大家需要深入了解业务,因为达到同样的业务目标,可能稍微改一下产品方案就可以让需求的技术实现变得无比简单。

只有真正知道上层业务是如何使用系统的,才可能真正做好架构。

深入了解业务并不难,对于每个同学,只要对于每一个接到的需求,对于每一个需求评审中的需求,对于周边同学或团队要做的需求,都深入思考为什么业务要提出这个需求,这个需求解决了业务的什么问题,有没有更好的方案。

遇到不明白的多和周边同学、产品、运营同学请教。最怕的是自己把自己限定为纯粹的研发,接到需求就无脑做,这等于放弃了主动思考。

衡量一个人是不是好的架构师,也有一个方法。对于一个需求,如果他给出了好几个可行的方案,说这些方案也可以,那些方案也可以,往往说明他在架构师的路上还没有完全入门。

架构师的难点不在于给出方案,而在于找到唯一的那一个最简单优雅的方案。

总结起来看,行动中思考,就是始终保持好奇,不断从工作中发现问题,不断带着问题回到工作中去;不断思考,不断在工作中验证思考;不断从工作中总结抽象,不断对工作进行复盘,持续不断把工作内容和全领域的知识交叉验证,反复实践的过程。

在工作所在的技术和业务领域中刻意练习,加上行动中思考,就是成为技术大牛的秘诀。

看起来方法也不复杂,为什么大牛还是非常稀少?

尽管我们通篇都在讲方法,但其实在成为技术大牛的路上,方法反而是没那么重要的。

真正困难的,在于数年,数十年如一日的坚持。太多人遇到挫折,遇到瓶颈,就觉得手头的事情太乏味枯燥,就想要换一个方向,换一个领域,去学新的技术,新的东西。

而真正能够成为大牛的,必须是能够青灯古佛,熬得住突破瓶颈前长时间的寂寞的,必须是肯下笨功夫的聪明人。

因此,和坚持相比,方法其实并没有那么重要。和大家共勉。

 

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

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

相关文章

互联网搜索引擎

说明:文章内容来源于课程视频和课程ppt。我只学习了课程没有做习题。文章不是翻译,是我对课程的理解。 1 挑战 互联网搜索引擎与一般搜索引擎的区别主要在以下问题。  第一是数据量(scalability)。互联网搜索需要处理的数据量大,如何保证能…

第五十四期:Libra盟友纷纷“跳船”,联盟链还有戏吗?

曾经被诺贝尔奖得主斯蒂格利茨评价为“傻子才信”的Facebook数字加密货币项目Libra,自从出世开始就负面不断。最近在其首届理事会议前夕,PayPal、Visa、万事达、Stripe和eBay等全球型金融巨头“盟友”的相继退出,更使其遭遇了不少“看空”。 …

python time模块

时间戳、结构化时间、字符串时间 import time#时间戳 ,大多时候用于计算 #从1970年0点0分0秒开始计算的秒数 print(time.time())#结构化时间------当地时间(东8区) #返回一个时间对象 print(time.localtime())#time.localtime()中默认参数为…

第五十五期:区块链将在2020年实现的重大改变

科技界的每家公司都已经拥有区块链战略。如果他们现在没有,他们就有可能错过了这个时代的一个机会。在过去几年中,许多企业已经对整体采用区块链技术的好处和相关风险进行了估算,分析和讨论。 科技界的每家公司都已经拥有区块链战略。如果他们…

为什么机器学习算法要与人类水平比较

原因 1 近年来机器学习的效果越来越好,能够和人类的相应能力做比较。 2 设计和构建机器学习系统,这个工作流程很高效。 因为种种原因,ML或者人都不可能超过Bayes Optimal Error 贝叶斯最优误差,ML随着时间推移会越来越接近贝…

第二十九期:运维之三大监控对比

Zabbix核心组件主要是Agent和Server,其中Agent主要负责采集数据并通过主动或者被动的方式采集数据发送到Server/Proxy,除此之外,为了扩展监控项,Agent还支持执行自定义脚本。 作者:艺术生的运维路来源:今日…

[Leetcode][第459题][JAVA][重复的字符串][子串][匹配]

【问题描述】[中等] 【解答思路】 1. 枚举 找出能整除的子串长度,再用substring遍历匹配即可 时间复杂度:O(N^2) 空间复杂度:O(1) class Solution {public boolean repeatedSubstringPattern(String s) {int len s.length();for(int i 1…

第五十六期:百度CTO王海峰CNCC2019演讲:深度学习平台支撑产业智能化

百度CTO王海峰在会上发表题为《深度学习平台支撑产业智能化》的演讲,分享了百度关于深度学习技术推动人工智能发展及产业化应用的思考,并深度解读百度飞桨深度学习平台的优势,以及与百度智能云结合助力产业智能化的成果。 作者:佚…

【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

版权声明:本文为博主原创文章,允许转载,但希望标注转载来源。 https://blog.csdn.net/qq_38410730/article/details/80312357IIC的基本介绍 IIC的简介 IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公…

【数据结构与算法】广度优先遍历(BFS) 深度优先遍历(DFS)

一、 搜索算法 深度优先搜索和广度优先搜索是最暴力的图的搜索算法。算法的目标是,给定一张图,一对初始和终止节点,找到两节点之间的节点路径。(代码均是找到两个节点之间的路径) 广度优先搜索是一层一层搜索&#xf…

stack专题

20 Valid Parentheses 问题:没有意识到字符串中只包含字符:’(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’ 代码:git代码 682 Baseball Game 问题:错误在操作:top1 先弹出,top2 再弹出,还原到…

第三十期:简单好用的9个电脑必备工具!让你轻松10倍

下面 9 款工具都是精心挑选的电脑必备神器,涵盖你需要的各个方面,无论是安全防护、文件查找、解压加密还是娱乐都在其中;最最最重要的是,它们不但各个功能强大,而且非常轻便,没有弹窗广告、没有捆绑安装、也…

【数据结构与算法】字符串匹配 BF算法 RK算法

单模式串匹配 BF 算法和 RK 算法 BM 算法和 KMP 算法多模式串匹配算法 Trie 树和 AC 自动机 一、BF 算法 1,BF算法是Brute Force的缩写,中文译作暴力匹配算法,也叫朴素匹配算法。 2,两个概念:主串和模式串 如在字符串…

第三十一期:大数据分析师学习入门,10个数据可视化技巧

在这篇文章,我想和大家分享 10 个基本的中级和高级的绘图工具。我发现在现实生活中,当涉及到绘图解释你的数据时,这些工具非常有用。 作者:加米谷大数据来源:今日头条 我必须对你说实话:当我学习数据科学时…

[Leetcode][第491题][JAVA][递增子序列][回溯][RK算法]

【问题描述】[中等] 【解答思路】 1. 二进制枚举 哈希 复杂度 class Solution {List<Integer> temp new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();Set<Integer> set new HashSet<In…

第五十七期:小型企业将如何从5G中受益

在足够多的新设备进入主流市场之前&#xff0c;5G已经在许多领域引起了越来越多的关注。从IT、零售、交通和制造业到医疗、娱乐、教育和农业&#xff0c;几乎每个行业都将在某种程度上受到5G的影响。 作者&#xff1a;李雪薇来源&#xff1a;IT168网站 在足够多的新设备进入主…

第三十二期:MySQL常见的图形化工具

MySQL作为一款非常流行的、开源的关系型数据库&#xff0c;应用非常广泛。因为MySQL开源的缘故&#xff0c;图形化管理维护工众多&#xff0c;除了系统自带的命令行管理工具之外&#xff0c;还有许多其他的图形化管理工具&#xff0c;这里介绍几个经常使用的MySQL图形化管理工具…

centos7 源码安装goaccess

1. 使用yum安装在不同服务器上可能失败, 推荐使用源码安装goaccess # 安装依赖 yum install -y ncurses-devel GeoIP-devel.x86_64 tokyocabinet-devel openssl-devel# 下载源码包并安装 cd /usr/local/software wget http://tar.goaccess.io/goaccess-1.3.tar.gz tar -xvf goa…

【数据结构与算法】字符串匹配 BM算法

单模式串匹配 BF 算法和 RK 算法 BM 算法和 KMP 算法多模式串匹配算法 Trie 树和 AC 自动机 BM算法 BM算法的核心思想是通过将模式串沿着主串大踏步的向后滑动&#xff0c;从而大大减少比较次数&#xff0c;降低时间复杂度。而算法的关键在于如何兼顾步子迈得足够大与无遗漏&…

第五十八期:AI艺术日渐繁荣,未来何去何从?

本文的配图都是AI艺术领域领导者、德国艺术家马里奥克林格曼(Mario Klingemann)利用人工智能创作的作品。 利用人工智能创作而成的画作近年来越来越受瞩目&#xff0c;有的作品甚至能在知名拍卖行拍得高价。但这类作品仍有不少问题需要解答&#xff0c;比如它的作者是开发出算…