程序员是一个特别依赖个人技术能力的职业,不同的程序员之间,技术能力的差别也非常大。一个大神程序员的产出,可以抵得上好几个普通程序员。一个技术差还自以为是的程序员,他的产出更是能抵得上几十个程序员,不过这个产出是负的。所谓一人写Bug,大家加班来找茬,相信很多人都有过这样的经历。
相应的,程序员的收入差距也非常大,从年入几万到几百万的都有。同样是应届生,从CRUD(增删改查)开始做起,几年之后有些人还在“CRUD”,只是更熟练了而已。而有的人技术成长得非常快,职位和收入也随之水涨船高。
为什么有些人的技术能快速成长?这里面的原因很复杂,每个人的天赋、工作经历、选择甚至于运气都是影响因素。但除此之外,还是会有一些方法和经验,可以为你的技术成长提速。
把奋斗当成习惯
技术的原始积累,是个人技术能力的基础。这个“积累”主要指的是,你要有足够多的技术经历,这里面包括你读过的书、写过的代码、做过的项目、解决过的Bug、用过的框架、踩过的坑儿以及遇到的各种线上问题,等等。
为什么说技术积累这么重要呢?没有技术积累我直接去学习技术原理,去刷题,通过这些手段去提升技术不行么?
那我给你举个例子,包括很多学习计算机专业的同学,刚毕业的时候,觉得大学里面学到那些专业课和实际工作脱节的厉害,还没有培训班讲的实战课有用。反而很多有多年技术经验的资深程序员,开始捡起大学那些课本去回炉重学。越是大厂技术面试,基础知识、算法、设计模式这些占比越重,这里面很多都是大学专业课学过的知识。
为什么会有这样的现象?因为如果没有足够的技术积累,你很难理解书本上的技术知识和原理它的用途在哪儿,所以会觉得没用。只有你遇到过这样的问题,有过困惑,再去看书上讲的知识,立刻就会有一种恍然大悟的感觉。所以说,原始的技术积累非常重要。
对于技术积累,没有捷径可以走,如果想做到快速积累,只有多写代码、多做项目这一条路。具体的做法很简单,也很难,就是去主动地去多做事情,不要去管这些事情是不是职责范围内的、有没有报酬、会不会有收获、对技术有没有提升。不计得失,任劳任怨。
这个做法说来简单,它真的就很简单,只要想去做,每个人都做得到。但是,它也很难。因为并不是每个人都打心里认同这个做法,如果你没有内心的认同,又强迫自己这么做,是非常痛苦的,并且很难坚持下来。所以,问题的关键是寻求内心的认同。
我刚毕业那几年,对这个观点就是非常不认同。我当时的想法是这样的:每个月才给我这么一点儿钱,凭啥我要主动去做这么多事儿?我对公司产生的价值,绝对对得起我的工资,再多干活,公司又不会给我钱。
我估计很多年轻的朋友也会有同样的想法。我们不能说这个想法就不对,实际上这里面涉及到人生观的问题。比如说,有的人清楚地知道自己想要什么,“我不追求什么技术,也不在乎职务收入,工作只是我谋生的手段,我更看重的是诗和远方”。
但我是一个“俗人”,希望不断提升自身的技术能力,获得自我认同,同时也获得更好的收入和体面的生活。如果你也和我一样不能免俗的话,我建议你在内心上尽快做一个转变。什么转变呢?从“凭什么要我做?”,到“愿意主动去多做事儿”,再到“把奋斗当做习惯”。
我的转变来自一顿酒局。记得当时也是一个前辈在一次一起喝酒的时候提点了我。当我借着喝点儿酒,和他抱怨当时的工作钱少事儿多没技术含量,他一句话点醒了我:“如果你是老板,当你有一个重要的任务,你是愿意交给那个只做分内事和你斤斤计较的人,还是交给那个不计得失兢兢业业的人呢?”
**其实你真正应该较劲的人,不是那个扣扣索索不舍得给你发钱的老板,而是那些和你一起竞争有限发展空间的同龄人。**主动去多做一些事儿,不仅能获得更多的成长和锻炼,更重要的是获得周围人对你的认同,这里面也包括你的领导和老板。这样你就会获得更重要的任务和更多的锻炼机会,才能相比同龄人更快速地成长,用更短的时间快速实现技术积累。
想通了这个道理,即使去做一些没有意义的脏活累活,心里也不会感觉那么痛苦了。
思考沉淀,让点成势
你的技术能力,会随着你的技术积累线性增长。当你的技术经验积累到一定程度的时候,你需要停下来,给自己几天时间,什么都不做,放空一下自己,利用这段时间去思考,问自己两个问题:
- 这段时间我都做了什么?
- 技术上我都学到了什么?
然后,在脑海中把这两个问题的答案再梳理一下,这个时候你就有可能会发现,你之前积累的零散的知识,它们之间其实是有联系的,然后再通过总结,你就有可能会在某一个小的技术领域上,构建出一个知识体系。
原来看不清楚脉络的技术,有可能就看清楚了。反过来,理清了技术脉络,构建起知识体系之后,也会极大地加快你继续学习和积累的速度。
这么说有点儿抽象,我们还是通过一个例子来看。比如说学习一门新的编程语言,这个对很多同学来说都是一个挺大的挑战,但我现在是可以做到用一周的时间来学会一门全新的编程语言。
达到什么程度呢?精通和熟练是肯定谈不上的,但至少可以做到写出规范和合格的代码,去开发一个真正可以用于生产的系统,这个是没问题的。
之所以能够做到快速学习,一个前提是,我之前在熟练地掌握了二、三门语言之后,经过了思考和总结,理清楚了编程语言的技术体系是什么样的,以及我已经掌握的这几门语言,它们之间有哪些共通的知识。
当我再学习一门全新的语言时,我首先会去看一下,这门语言和其他语言有什么不一样的特性,这些特性往往是,为了解决其他语言中那些不容易解决的问题而诞生的。比如,最近特别火的Rust语言,它之所以这么火的原因是,它采用了所有者模型来解决内存管理的老大难问题。如果你经历过用C 内存泄漏的痛苦,也体会过Java以及Golang动不动Stop the world的垃圾回收器,那你一下子就能理解Rust语言的这个特性有多可爱。
你可以看到,快速理解这些新特性的基础,还是要有足够的技术积累做支撑,如果你没有C 、Java和Go这些语言的使用经验,你的感受可能是:为什么会有所有者模型这么奇葩的设计?这个垃圾的编译器为什么总是编译不通过?
再说回学习编程语言,了解完一门新语言特性后,我会:
- 看它的基本语法、线程模型及内存管理模型,是不是和已有语言是一样机制
- 再看它的基础类库,包括常用集合类、如何读写文件、如何处理输入输出这些
- 再就是它的源代码如何组织,编译构建系统是什么样如何处理类库之间的引用依赖这些编译运行的问题
- 最后看一下这门语言生态系统,如常用Web框架、RPC框架,一些常用场景,配合哪些中间件最合适等
这么多内容,不可能一下都记住,但你会发现,这里面绝大部分内容都是和其他语言差不多,只要记住这个语言独有的那些特性即可。
了解了以上这些内容,基本上我们就算是初步掌握一门语言。不过我可能还没有那么熟练,写几行代码就得去看看文档和例子,写的还比较慢,但我们写出来的代码规范性和正确性是可以保证的。剩下的就交给时间,逐步去练熟直到精通。
所以,停下来,去思考沉淀,让点成势,构建出自己的知识结构,是技术成长的捷径。
洞见技术本质
如果说,我们能够不断地积累,思考,再积累,再思考,那不仅你的技术成长会非常快,反复地总结和思考,也会在无形中逐渐提升你的思考能力。
随着你的知识体系越来越完备,总结和思考的能力越来越强大,那你也就会越来越容易看清一项新技术的本质和原理,这又非常有助于你快速地学习一些新的技术。这个时候,你会有一种学习任何技术都很容易很轻松的感觉,恭喜你,你已经完成了技术的升华和蜕变。
但这个时候,我还要打你一棒子,那个很轻松、很容易的感觉其实是个错觉。为什么这么说呢?因为技术的原理或者说是本质,它本来就是很简单的,并不是我们有厉害。真正复杂和难的是工程实践中的细节。
比如说,汽车发动机的原理大家都知道,汽油燃烧热胀冷缩推动活塞做功。但是,这个地球上真正能造出可靠耐用的汽车发动机的公司并不多,原因就是光掌握原理是不够的,还要解决很多复杂的工程问题。
看清一项技术的原理之后,会利于我们快速学习这项技术,但要想达到精通并熟练的应用,还是要沉下心来,去深入学习、研究、使用和总结,这个功夫是少不了的。
好的,以上这些就是我对个人技术成长的一点点感悟。其实这些知识道理并不高深,只是能够做到,并且将这些道理变成自己的信条时,你才真正拥有了它。
如果你能站在他的位置思考问题,那么以后你就很可能取代他的位置。
两者虽不同,但觉得还有些相通
我身边的同事有很多都是比较主动型的,他们会主动去做一些事儿,而不仅限于产品提出的业务需求,在多做事儿的同时,成长也可想而知了