从 16 年 6 月毕业至今,一晃已经八年过去了。八年前,我只一个对技术只有一腔热爱,却懵懂无知的菜鸟,不知道技术的这条路该怎么走,不知道该怎样成为技术大牛,一路跌跌撞撞走过来,走了不少弯路,遇到了不少挫折,虽然现在的我认为离心中的目标依然很远,但是目前起码知道自己的方向该如何去走,因为也不会迷茫。
对于刚毕业的新人程序员来说,不知道如何去成长,感到迷茫可能是大概率的事件,因此我总结了我在职业生涯中领悟到的六个建议,希望通过这些建议,能让新人程序能更快速的成长。这些建议分别如下:
加入技术社群
不断扩展边界
探寻技术的本质
培养快速学习的能力
不要局限在一个技术领域
在某一个领域成为专家,并打造影响力
一,加入社群
很多程序员都是内向,不爱社交的人,我也是其中一员,刚毕业的前几年,我都是一个人独自的学习技术,看技术文章,从没参与任何技术社群,这也是我在技术路上走的弯路之一,直到最近几年,我加入了各种技术社区,才明白尽早参加一些技术社群的重要性。
技术社群有很多技术大牛和经验丰富的人,而且这些大牛大都是愿意分享的人,通过社群,我们可以获得最新的行业知识和技术动态,有时候大牛几句话的指点,就可以让自己少走很多弯路。其次在社群里面,也有很多职业内推的机会,内推对我们进入心仪的公司有时候非常的重要的,有很多人会因为学历或历史工作的公司不太好,在大公司面试时连简历面都过不了,但是通过内推,有内推人帮你做背书,就能获得面试机会。并且通过活跃在各个技术社群,我们也能扩展自己的人脉,认识更多的朋友,让生活更加的丰富和有趣。
那么怎样才能加入技术社群呢?其实也很简单,每个技术方向都有对应的技术社群,比如 Android 这一块就有 GDG(谷歌开发者社区),还有一些行业大牛自己创建的一些交流群等等,这些社群往往都会主动的去拉一些人进来,我们只需要平时关注到后,主动一点即可。
二,不断扩展边界
对于刚毕业的新人开发者来说,往往会认为只把安排给自己的事情做好就行,我刚毕业也是这样,但是在大公司中,即使你把安排的事情做的在好,也只能勉强获得一个普通的绩效。经过在大厂多年的教训,以及向优秀的同事学习,我才明白,想要获得好的绩效,仅仅把安排好的事情做完是远远不够的,而是要不管的扩展自己职责的边界。
以一个简单的业务需求来说,我们可以非常快速的把这个业务开发完成,但是开发完成之后,我们可以进一步的去思考该业务的性能是否需要优化,当把该业务的性能优化完成后,我们可以将对该业务进行性能优化时沉淀的工具,方案,经验扩展到其他业务中,最后去推动各个业务能有一套性能优化的规范和标准。
除了性能之外,我们也可以从架构出发,在做业务需求时,当开发完成之后,我们可以通过优化,或者引入更优的架构方案来让代码更加的解耦和可扩展,然后我们将该方案扩展到其他业务,甚至到整个 APP,这样我们就是在不断地扩展边界,扩大自己的职能范围。
不断的扩展边界并不是为了拿到一个好绩效,好绩效只是在践行该行动时的其中一个收益,在扩展边界的同时,我们不仅让自己的技术实力更加精进,除此之外还包括沟通能力,团队协作能力都会不断的成长。
三,探寻技术的本质
对于程序员来说,技术的更新迭代是非常快的,各种新的框架层出不穷,这些框架或者新技术大都属于上层的技术,虽然这些上层的技术迭代非常快的,但是底层的技术,也就是技术的本质,更新变化是非常慢,这些层出不穷的新的框架和新技术也只是围绕着底层技术的衍生品而已。
了解这些本质的技术才是最重要的,因为变不离其中,当我们了解这些底层技术后,我们可以很快速的学会这些上层技术。我曾经做过一段时间的跨平台的框架,如 RN,快应用,小程序等都是跨平台的框架,虽然跨平台的框架非常多,但是在渲染的技术原理上都是大同小异的,不仅仅是这些跨平台框架,还包括 webview,Android,Flutter 等在界面渲染的本质上都是大同小异的。都由 DSL 语言来描述界面,然后对解析引擎对 SDL 语言进行解析,最后底层由 Skia,OpenGl 等渲染框架进行渲染。
底层技术有很多,比如操作系统原理,图形渲染原理,虚拟机原理等等,想要掌握这些技术虽然要投入大量的时间,但是却是性价比最高的技术,因为他们的更新变化非常慢,当我们掌握后可以使用非常长的时间。
四,培养快速学习的能力
对于程序员来说,技术的变化太快,要学习的东西也太多,我刚毕业的时候做了一段时间的 VR,当时是使用 Uniity 和 C# 来开发的,后面又去做 Android,在 Android 这一块又做过跨平台的渲染引擎,性能优化,业务等等,在我的职业生涯中,使用过的语言包括 c#,Java,Kotlin,C++,Rust 等等,我业余时间也有自己做一些前端或后端的东西,对 vue,node,python ,php 等等技术也都涉猎。可以看到,程序员的职业生涯要涉及到大量的知识和技术,面对这些技术时,快速的学习能力就非常的重要了。当我在学习新的知识时,主要都遵从下面这四项原则来进行学习:
挖掘本质
知识迁移
知识组合
技术输出
在前面探寻技术的本质中其实也提到了掌握技术本质的重要性,当我们掌握底层的原理性技术后,就可以快速的理解上层的技术。在业余时间,我会花很多时间在底层技术的学习上,如 Linux 系统,编译原理,OpenGL 等等,这些底层技术都属于技术的本质。除了学习这些底层技术外,还要学会去提取各个技术的本质特性,比如所有的编译语言都需要进行任务调度,都需要管理内存,都需要进行异常处理,这些公共的特性也都属于技术的本质。
很多技术都是相通的,不同的技术之间的区别变化都不会太大,在学习新的技术时,我们可以通过自己已经掌握的知识去学习新的知识,比如学会了 Java,那么就可以快速的掌握 C#,或者一些强类型的解释型语言,掌握的 JVM 虚拟机,我们可以快速的去掌握执行 Ptyhon 的 CPython 引擎,执行 J S 的 V8 引擎等。
在学习一些新技术时,我会找到这个新技术和我已经掌握的技术有哪些共同的特性,有哪些独特的特性,比如我在学习新语言时,我会将编程语言提炼出下面这些共同的特性。
如何进行任务调度
如何处理数据
如何处理异常
如何管理内存
找到这些共同的特性后,我再利用我已经掌握的语言去对比新的语言,快速的理解这门新语言,并且重点学习这门新语言特有的知识。
不管是多复杂的技术,都是由不同的知识组合而成,在学习一个复杂技术的,将该技术拆分,然后各个击破,是我常用的学习方法。
当我在学习 webview 渲染技术时,就是通过该方式来学习,Webview 的渲染非常复杂,但是我们依然可以通过拆分,并逐个击破来进行掌握。webview 分为 html 、div 和 js,js 执行主要由 V8 引擎来进行,由于我本来就熟悉 Java 的 JVM 虚拟机,所以在学习 V8 引擎时通过知识迁移,很快就掌握了该引擎的原理和特性。
html 是一个 dsl 描述语言,在 webview 渲染时,会通过 dsl 解析器将 html 进行解析,然后在配合 div 进行测量和布局,最后通过 skia 进行渲染。可以看到 webview 的渲染和 Android 的界面渲染有大曲同工之处,Android 在渲染时,也是通过 xml 进行界面描述,然后通过解析器来解析 xml 布局,并进行界面的测量和布局,最后交给 skia 或者 opengl 渲染。对于渲染流程,我们拆分成一个个知识点,如 dsl 语言是如何解析呢? 如何对界面进行测量和布局? skia 是如何渲染界面的?由于我对 Android 的了解,所以我也很快了解这 webview 中这些类似的知识,当我们掌握这些知识点后,在进行整合,此时就对 webview 的渲染流程非常熟了悉,不仅如此,我们甚至对 IOS,Flutter 等各个平台或技术的渲染流程都熟悉了。
通过输出来学习是掌握知识最有效的方式之一,输出的方式可以是写文章,可以是分享等,当我们能将别人教会时,就证明我们真正的掌握了这些知识。很多新人不愿意写技术文章,原因是觉得太多人写了,写了也没人看,或者觉得写文章太浪费时间,这种思想并不太对,在我们职业前期,写技术文章主要给我们自己看的,通过大量的文章输出,我们不仅可以培养自己的写作能力,并且能更快速的深入掌握该知识,写文章看起来会更耗费时间,实际上帮我们节约了大量的技术学习时间。
根据二八原则,我们仅需要 20% 的时间,可以掌握某个方向的知识点 80% 的知识,当然,这个二八原则一定是建立在我们掌握了快速学习能力的技术上的,因此培养快速学习的能力,对新人程序员来说是很重要的一件事。
五,不要局限在某一个技术领域
在工作中,我们经常会遇到一些老员工固守在自己熟悉的知识上,不愿意学习新的知识,比如在 Android 这一块,我就遇到不少坚持使用 Java,不愿意尝试 Kotlin 的程序员。局限在某一个技术领域,实际上是很不利技术成长的,不同的技术都有自己的特性和优点,很多时候,我们通过某一个技术没法解决的难题,很容易就可以通过其他技术来实现,比如我们在 Android 中想要使用协程,Java 是实现不了的,但是我们可以使用 Rust 来实现,这样在 IO 密集场景下,对性能的提升会非常大。
我们掌握和了解的技术越多,思想才会越开阔,在面对技术难题时,也才会有更多的思路和灵感。当然,想要不局限在某一个技术领域,最关键的还是要培养快速学习能力,很多人不愿意学习新技术,主要也都是因为学新技术带来的时间成本或者困难导致的,但是当我们掌握快速的学习能力后,这些时间成本和困难其实都没那么大。
六,成为某一个领域的专家
有很多经验丰富的程序员都是全栈,他们拥有快速学习的能力,也会非常多的知识,但是却很少有很有名气的全栈程序员。因为只有成为某一个领域的专家,你才能建立起自己的行业影响力。
我在工作前几年,也写了大量的技术文章,但是这些文章都是各个方向,知识点零碎且散,因为我的文章也一直没多少人看,也没多少人了解我,因为这个细分方向,有大量更优秀的文章,这个方向的开发者不会因为我这一两篇文章就对我有印象。
但是后来我开始专注于性能优化这一块,针对性能优化写了大量的且体系化的文章,很快速便建立了自己的影响力,并获得了 GDE(谷歌开发者专家)的称号。
成为某一个领域的专家,在这个领域有大量的输出,是建立我们影响力最重要的方式。我们需要识别在自己所在领域中稀缺而有价值的技能,并专注于这些技能的提升,然后通过技术社群,技术博客等平台不断地输出,只要坚持,最终必然会在这个方向有一定的影响力。