<audio id="audio" title="结束语 | 把奋斗当习惯" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/97/da/97e0062ec511fcff9a10ee3701088eda.mp3"></audio>

你好，我是李玥。

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

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

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

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

## 把奋斗当成习惯

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

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

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

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

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

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

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

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

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

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

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

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

## 思考沉淀，让点成势

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

- 这段时间我都做了什么？
- 技术上我都学到了什么？

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

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

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

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

我在上一门课程《[消息队列高手课](https://time.geekbang.org/column/intro/100032301)》中，有很多的示例代码，用了Java、Scala、Python和Golang四种比较流行的编程语言。我日常工作使用的是Java语言，Python偶尔会到。当时在编写这门课程的时候，Scala和Golang这两门语言都是现学现卖的。

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

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

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

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

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

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

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

## 洞见技术本质

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

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

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

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

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

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

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

再见。
