你好,我是李玥。

今天这节课,是我们这系列课程的最后一讲,我想跟你聊聊我对个人技术成长的感悟。

程序员是一个特别依赖个人技术能力的职业,不同的程序员之间,技术能力的差别也非常大。一个大神程序员的产出,可以抵得上好几个普通程序员。一个技术差还自以为是的程序员,他的产出更是能抵得上几十个程序员,不过这个产出是负的。所谓一人写Bug,大家加班来找茬,相信很多人都有过这样的经历。

相应的,程序员的收入差距也非常大,从年入几万到几百万的都有。同样是应届生,从CRUD(增删改查)开始做起,几年之后有些人还在“CRUD”,只是更熟练了而已。而有的人技术成长得非常快,职位和收入也随之水涨船高。

为什么有些人的技术能快速成长?这里面的原因很复杂,每个人的天赋、工作经历、选择甚至于运气都是影响因素。但除此之外,还是会有一些方法和经验,可以为你的技术成长提速。

把奋斗当成习惯

技术的原始积累,是个人技术能力的基础。这个“积累”主要指的是,你要有足够多的技术经历,这里面包括你读过的书、写过的代码、做过的项目、解决过的Bug、用过的框架、踩过的坑儿以及遇到的各种线上问题,等等。

为什么说技术积累这么重要呢?没有技术积累我直接去学习技术原理,去刷题,通过这些手段去提升技术不行么?

那我给你举个例子,包括很多学习计算机专业的同学,刚毕业的时候,觉得大学里面学到那些专业课和实际工作脱节的厉害,还没有培训班讲的实战课有用。反而很多有多年技术经验的资深程序员,开始捡起大学那些课本去回炉重学。越是大厂技术面试,基础知识、算法、设计模式这些占比越重,这里面很多都是大学专业课学过的知识。

为什么会有这样的现象?因为如果没有足够的技术积累,你很难理解书本上的技术知识和原理它的用途在哪儿,所以会觉得没用。只有你遇到过这样的问题,有过困惑,再去看书上讲的知识,立刻就会有一种恍然大悟的感觉。所以说,原始的技术积累非常重要。

对于技术积累,没有捷径可以走,如果想做到快速积累,只有多写代码、多做项目这一条路。具体的做法很简单,也很难,就是去主动地去多做事情,不要去管这些事情是不是职责范围内的、有没有报酬、会不会有收获、对技术有没有提升。不计得失,任劳任怨。

这个做法说来简单,它真的就很简单,只要想去做,每个人都做得到。但是,它也很难。因为并不是每个人都打心里认同这个做法,如果你没有内心的认同,又强迫自己这么做,是非常痛苦的,并且很难坚持下来。所以,问题的关键是寻求内心的认同。

我刚毕业那几年,对这个观点就是非常不认同。我当时的想法是这样的:每个月才给我这么一点儿钱,凭啥我要主动去做这么多事儿?我对公司产生的价值,绝对对得起我的工资,再多干活,公司又不会给我钱。

我估计很多年轻的朋友也会有同样的想法。我们不能说这个想法就不对,实际上这里面涉及到人生观的问题。比如说,有的人清楚地知道自己想要什么,“我不追求什么技术,也不在乎职务收入,工作只是我谋生的手段,我更看重的是诗和远方”。

但我是一个“俗人”,希望不断提升自身的技术能力,获得自我认同,同时也获得更好的收入和体面的生活。如果你也和我一样不能免俗的话,我建议你在内心上尽快做一个转变。什么转变呢?从“凭什么要我做?”,到“愿意主动去多做事儿”,再到“把奋斗当做习惯”。

我的转变来自一顿酒局。记得当时也是一个前辈在一次一起喝酒的时候提点了我。当我借着喝点儿酒,和他抱怨当时的工作钱少事儿多没技术含量,他一句话点醒了我:“如果你是老板,当你有一个重要的任务,你是愿意交给那个只做分内事和你斤斤计较的人,还是交给那个不计得失兢兢业业的人呢?”

其实你真正应该较劲的人,不是那个扣扣索索不舍得给你发钱的老板,而是那些和你一起竞争有限发展空间的同龄人。主动去多做一些事儿,不仅能获得更多的成长和锻炼,更重要的是获得周围人对你的认同,这里面也包括你的领导和老板。这样你就会获得更重要的任务和更多的锻炼机会,才能相比同龄人更快速地成长,用更短的时间快速实现技术积累。

想通了这个道理,即使去做一些没有意义的脏活累活,心里也不会感觉那么痛苦了。

思考沉淀,让点成势

你的技术能力,会随着你的技术积累线性增长。当你的技术经验积累到一定程度的时候,你需要停下来,给自己几天时间,什么都不做,放空一下自己,利用这段时间去思考,问自己两个问题:

然后,在脑海中把这两个问题的答案再梳理一下,这个时候你就有可能会发现,你之前积累的零散的知识,它们之间其实是有联系的,然后再通过总结,你就有可能会在某一个小的技术领域上,构建出一个知识体系。

原来看不清楚脉络的技术,有可能就看清楚了。反过来,理清了技术脉络,构建起知识体系之后,也会极大地加快你继续学习和积累的速度。

这么说有点儿抽象,我们还是通过一个例子来看。比如说学习一门新的编程语言,这个对很多同学来说都是一个挺大的挑战,但我现在是可以做到用一周的时间来学会一门全新的编程语言。

达到什么程度呢?精通和熟练是肯定谈不上的,但至少可以做到写出规范和合格的代码,去开发一个真正可以用于生产的系统,这个是没问题的。

我在上一门课程《消息队列高手课》中,有很多的示例代码,用了Java、Scala、Python和Golang四种比较流行的编程语言。我日常工作使用的是Java语言,Python偶尔会到。当时在编写这门课程的时候,Scala和Golang这两门语言都是现学现卖的。

我之所以能够做到快速学习,一个前提是,我之前在熟练地掌握了二、三门语言之后,经过了思考和总结,理清楚了编程语言的技术体系是什么样的,以及我已经掌握的这几门语言,它们之间有哪些共通的知识。

当我再学习一门全新的语言时,我首先会去看一下,这门语言和其他语言有什么不一样的特性,这些特性往往是,为了解决其他语言中那些不容易解决的问题而诞生的。比如,最近特别火的Rust语言,它之所以这么火的原因是,它采用了所有者模型来解决内存管理的老大难问题。如果你经历过用C++内存泄漏的痛苦,也体会过Java以及Golang动不动Stop the world的垃圾回收器,那你一下子就能理解Rust语言的这个特性有多可爱。

你可以看到,快速理解这些新特性的基础,还是要有足够的技术积累做支撑,如果你没有C++、Java和Go这些语言的使用经验,你的感受可能是:为什么会有所有者模型这么奇葩的设计?这个垃圾的编译器为什么总是编译不通过?

再说回来学习编程语言这件事,了解完一门新语言的特性之后,我会看一下它的基本语法、线程模型以及内存管理模型是什么样的,是不是和已有的语言是一样的机制;再看一下它的基础类库,包括常用的集合类、如何读写文件、如何处理输入输出这些;再有就是它的源代码如何组织,编译构建系统是什么样的,如何处理类库之间的引用依赖这些编译运行的问题;最后还要看一下这门语言的生态系统,比如最常用的Web框架、RPC框架是什么,一些常用的场景下,配合哪些中间件最合适等等。

当然这么多内容,不可能一下子都记住,但你会发现,这里面绝大部分内容都是和其他语言差不多的,我们只要记住这个语言独有的那些特性就好。

了解了以上这些内容,基本上我们就算是初步掌握一门语言了。不过我可能还没有那么熟练,写几行代码就得去看看文档和例子,写的还比较慢,但我们写出来的代码规范性和正确性是可以保证的。剩下的就交给时间,逐步去练熟直到精通。

所以,停下来,去思考沉淀,让点成势,构建出自己的知识结构,是技术成长的捷径。

洞见技术本质

如果说,我们能够不断地积累,思考,再积累,再思考,那不仅你的技术成长会非常快,反复地总结和思考,也会在无形中逐渐提升你的思考能力。

随着你的知识体系越来越完备,总结和思考的能力越来越强大,那你也就会越来越容易看清一项新技术的本质和原理,这又非常有助于你快速地学习一些新的技术。这个时候,你会有一种学习任何技术都很容易很轻松的感觉,恭喜你,你已经完成了技术的升华和蜕变。

但这个时候,我还要打你一棒子,那个很轻松、很容易的感觉其实是个错觉。为什么这么说呢?因为技术的原理或者说是本质,它本来就是很简单的,并不是我们有厉害。真正复杂和难的是工程实践中的细节。

比如说,汽车发动机的原理大家都知道,汽油燃烧热胀冷缩推动活塞做功。但是,这个地球上真正能造出可靠耐用的汽车发动机的公司并不多,原因就是光掌握原理是不够的,还要解决很多复杂的工程问题。

看清一项技术的原理之后,会利于我们快速学习这项技术,但要想达到精通并熟练的应用,还是要沉下心来,去深入学习、研究、使用和总结,这个功夫是少不了的。

好的,以上这些就是我对个人技术成长的一点点感悟。其实这些知识道理并不高深,只是能够做到,并且将这些道理变成自己的信条时,你才真正拥有了它。

到此,我们的《后端存储实战课》也就告一段落了。课程结束并非终点,我们还可以在留言区互动交流,也祝你享受成长,学有所成。

再见。

评论