最近和兄弟们闲聊,聊到一个瓶颈的问题。开发 3 年多了,做过的项目和产品也有好几个了,感觉移动端的知识基本也都了解了,最近好像遇到了瓶颈,感觉不知道如何提升了。体现在跟别人技术交流的过程中,大方向业务层面的东西基本没有什么问题,可是一旦就某一点深聊的时候,发现自己知识点好像还是停留在表面,不能深入其中。
既然聊到,索性整理了这篇文章。因为自己也是从一个普通的开发人员过来的,站在我的角度,聊一聊职业或者工作生涯中的一些困惑。因为个人技术栈的原因,这里只举 Android 端的情况。那些大牛程序员不按套路出牌,不在讨论范围。
其实需要恭喜你,当你意识到遇到了技术或者发展的瓶颈,感到比较困惑时,表明你来到了工作或者职业的一个分界点,一旦突破瓶颈,你又会达到另外一个境界。这个很像长跑,长跑的人在跑步的过程中都会出现几个极点。到极点的时候你会觉得腿特别沉,虽然有力气,但是就是感觉抬不动腿。一般的人可能到了极点之后就放弃了,但是有经验的人到了极点后,他会慢慢的调整,突破这个极点。突破之后,跑步就变成了一个机械的过程,甚至不需要去关心是否有在用力,整个腿步肌肉会自动带着你往前跑。也就是说,这时候达到了另外一个境界。
无论是工作还是人生,我们的成长过程就像是在不断攀登一座巨大的山峰。如果山脚代表你出生的那一刻,那么山顶代表你死亡的那一刻。而你遇到瓶颈的时候,犹如你爬到了山峰的某一层,你发现似乎没有可以攀爬的地方,无法再往上。每一层都会有很多人,你要做的就是利用你之前的经验、知识、认知,去发现你的落脚点,爬上去。这时候你就又达到了一个全新的高度。
所以,遇到瓶颈不用太慌,你甚至应该为即将遇见全新的自己而窃喜。
遇到瓶颈后的困惑是自然的,大部分是因为不了解产生瓶颈的原因,当你了解了之后,一切也就那么回事。
程序员,一般会经历几个瓶颈(时间段):
1. 工作经验的瓶颈(1~2 年)
这个阶段刚刚学校毕业,带着书本里的知识,投入到了工作当中,除了一些研究性的工作,大部分的工作会跟着产品的业务线走。这时候你会发现很多东西和学校里学习的有很大差别。这时候的瓶颈,是实际工作经验的缺乏。但是突破的方法也很简单,学就是了。难度也不大,因为这时候的你,应该是学习速度最快的时候。对于很多的业务内容,和书本的知识不太一样,会有很强的新鲜感。书本更多传授的是理论知识,而公司的项目和产品要解决的大部分是工程问题。这是一个可以充分把理论的东西结合实践的阶段,你终于发现了学校里学习的那些东西的真正用处。
2. 项目管理的瓶颈(2~3 年)
经过了第一个时间段,如果产品本身比较好,基本上移动端 Android/iOS 的边边角角都会涉及到。UI、网络、数据库、安全、适配、性能优化、第三方库的使用等等。这时候的挑战会慢慢从技术上变成项目管理上。因为这个时候你对业务比较了解,很多的技术也基本掌握了,会自然的承担部分项目管理的角色。这会是另外一个挑战,从跟机器打交道变成了和人打交道。这时候考虑的不一定是要把某一块技术做的多好,而是需要综合各个业务,达到项目整体上的最优。
比如项目的前期,时间是第一位的。首要的任务是如何在最短的时间内产出最小可行性产品(Minimun Variable Product:MVP)。质量和代码的架构重要性就会相对变低。最主要的是考虑如何最快的把产品推出去。但是,等 MVP 验证通过后,就需要不断迭代,一方面优化功能,一方面需要偿还之前快速开发欠下的技术债。
3. 技术深度的瓶颈(3~5 年)
做了很多的产品,项目管理也做过了。这时候会面临几个抉择,继续做技术还是转管理,还是拓展其他的职业。对于那部分技术上想要继续深入的同学就会有这种困惑。因为做了很多的项目,或者在摸个产品或者项目中做了很多的功能,大部分的知识点都覆盖到了。但是由于平时主要还是围绕业务展开,所以潜意识里是解决了what的问题。比如数据库会选用 GreenDao,也会使用 SQLite,网络会使用 OKHttp + Retrofit,图片会使用 Glide 或者 Frasco 等等,这个阶段很多的时候我们会因为业务二陷入怎么用的阶段。这也是为什么大家觉得好像各个方面都懂一些,但是深度不够的原因。怎么突破,需要去了解它是如何实现的,有哪些小的功能模块组成。
了解的时候不要贪多,有一句话形容一些读书人:买书如山倒,读书如抽丝。同样也可以形容开发对技术的态度。不能想着这也要了解,那也要明白。一个人的精力有限,就像做产品,需要找一两项核心的功能去深入打磨,而不是所有的功能都做一遍。
怎么去找那个点。根据自己的爱好。一句话,你对哪方面感兴趣,或者目前你擅长哪块,就深入下去。
举个例子,有的人喜欢 UI,那么布局,动画,事件这些基本的东西肯定是了解的。这样的话就是属于第一个阶段了。第二个阶段,你需要关注一些自定的 UI ,需要了解 View 的绘制过程,熟悉canvas,熟悉paint,对于一些比较有意思的 UI ,能够仿写。开始关注性能方面的东西。如何能够减少绘制次数,如何减少内存使用等等。第三阶段,就要从源码入手,去了解背后实现的原理,比如 TextView 到底是如何实现绘制在屏幕上的,都做了那些优化。经过这三个阶段,基本上 UI 相关的东西就没有什么能够难倒你了。
在第三个阶段,虽然看似只在某一个点深入了解,但是需要补充很多相关的边缘知识进来。比如说设计模式,GPU 的工作方式,算法等等,这个过程也就完成了从点到面的扩展。相信突破这个瓶颈,跟别人聊起技术,再也不会觉得自己还是那个什么都懂一点,又好像什么都不够深入的工程师了。
4. 职业转型的瓶颈(5 年以上)
这个阶段,就需要考虑的更加长远。是继续往技术方面深入,还是考虑其他方面。技术方面,比如全栈、技术经理、架构师、技术总监、CTO等,管理方面,比如项目经理、团队Leader 等,其他如产品经理、产品总监等等。
遇到瓶颈,说明你知道了自己不知道。很多的时候,我们的悲哀不在于不知道,而在于不知道自己不知道。
雅典人说,苏格拉底是雅典最聪明的人,他什么都知道。
苏格拉底说,「我唯一知道的就是我不知道,而你们也不知道,但是你们不知道自己不知道。」
当遇到瓶颈,知道自己不知道的时候,也是提升自己,让自己知道的好机会。跨过去,美好的风景在等着你。
完!