<audio id="audio" title="22 | 学习观：程序员如何定义自己的技术舒适区？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/1b/62/1b329ba43ce0bcc7001f2067f92a5562.mp3"></audio>

你好，我是臧萌。从这一节开始，我们就进入到了技术成长篇。不过在这篇里，我们不去深入聊任何具体的技术细节，而是围绕技术这个核心，和你聊聊如何看待技术，聊聊围绕技术的那些事儿。这是技术成长篇的第一篇文章，我来带你一起看看，我们应该如何定义自己的技术舒适区。

## 程序员的舒适区

平时我们谈论所处的工作状态的时候，都喜欢用舒适区、学习区、恐慌区这三个词来形容。我觉得这几个词形容得非常贴切。一个人处在舒适区，就是可以轻松愉快地应对自己工作，闭着眼睛都能把工作完成。学习区呢，就是工作有一点挑战，需要学点东西，但是也不需要费什么劲儿。恐慌区，就是看啥啥不懂，干啥啥不会，满满的压力，完全无法进行工作。

### 不要相信舒适区

其实很多职业都可以轻松打造出自己的舒适区。比如出租车司机、售货员、手机贴膜员这些职业，从技术技能角度来讲，花个几个月，就可以打造出自己的舒适区，然后就可以轻轻松松完成自己的工作了。

但是程序员这个职业不同。程序员所在的软件行业是一个高速发展的行业，如果要把技术当做安身立命的本事，那么程序员就必须要一直学习知识，才能保证自己不被淘汰。下面我来说说为什么。

假设现在你可以不太费劲地完成自己的工作，紧接着的一段时间，你也不需要学什么东西，也可以完成自己的工作，看似岁月静好，十分惬意。但是设想一下，在IT这么一个飞速发展的行业中，为什么没有给你所做的工作带来新的挑战？为什么不需要你们的技术进行升级换代？

答案很可能就是你所在的公司，或者现在所从事的职业，已经处于淘汰、停滞不前的状态了。公司业务非但没有增长，可能还缩水了。这时候一切舒适、惬意、轻松所营造的岁月静好的氛围，其实都是表象。而表象下面，则是你很可能被淘汰。

### 技术要么发展，要么被淘汰

急速发展的软件行业，尤其是互联网行业，是一个不进则退的行业。业务量和业务的复杂度都在增长，留给开发的时间则是越来越短。为了满足这一切，技术的更新换代，甚至技术方向的完全改变，都是不可避免的。

比如微服务架构，一个重要的目标是能解耦依赖，进而加快迭代。本着配置简单、从轻从快的思想的SpringBoot，很好地满足了微服务的要求，让原本部署在J2EE容器里的war包，变成了返璞归真的jar包，可以直接运行，吃过的都说香。

最近几年风行的Docker，就颠覆了之前打包部署的方式，让打包部署上线这个过程简单又标准。同时与之一起的虚拟化技术，也颠覆了计算资源分配和管理。当然还有很多很多别的技术，比如熔断降级，监控等等，这些技术串在一起，犹如一条龙服务一样，解放了我们程序员的生产力，让我们可以更快地对业务需求作出响应。

如果一个程序员现在还在使用Tomcat、web.xml、打包、物理机、拷贝部署war包，一方面说明公司对程序员的效率要求不高，业务压力不大，也就是业务发展的不好。另一方面，如果这个程序员想出来找工作，和面试官一聊，好么，考古级的技术栈，请问谁愿意要这样的程序员？

我们不能拿公司用不到做借口，程序员就是要有学习的本能冲动，推动公司的技术进步，至少要让公司的技术能跟得上行业标准水平。所以，就好像北上广不相信眼泪一样，我们程序员也不要相信有舒适圈的存在。如果一个工作让一个程序员享受到了舒适圈待遇，那么就说明这个工作可能要凉，可以考虑换个工作了。

### 学到手的技术会贬值

其实从利益的角度来讲，我们程序员也不应该呆在所谓的舒适区。一个客观事实是，软件行业的技术在飞速地发展，也就是说，程序员现有的技术知识存量，会一直贬值缩水。

长期来看，你觉得公司会为贬值的技术付出不变的，甚至还要增加的薪水吗？如果人才市场上，有性价比更高的人才，要的薪资更少，能做的事情更多，你觉得公司会不会考虑换人呢？

所以说，也许老的技术应对公司的业务足够了，但是这并不代表一个程序员就可以守着老的技术，在一个公司一直混下去。只要技术还在进步，那么就会有人可以用更少的工作经验，更低的薪水，更好地完成一份工作。别等到自己的看家本领被淘汰了，才想起来学习。

做一个合格程序员，就要拒绝技术舒适圈。但是拒绝舒适圈，不代表不能有一个舒适的状态。下面我们就来聊聊程序员的舒适状态。

## 程序员的舒适状态

程序员的生涯中，只有一直学习才是最舒适的状态。这里说的舒适当然不是指轻松随意，而是通过不断的学习，让自己可以轻松地应对工作，知道自己能够一直学得会、跟得上最新的技术。而自己的这种状态，可以带来发自内心的自信。这种技术自信，就是让自己舒适的根本。那要如何建立这种技术自信呢？我们接着往下讲。

### 找到提供正反馈的学习目标

其实关于学什么这个问题，我也走过弯路。立过很多flag，最后大都啪啪打脸。捂着“打肿”的脸，我就开始反思，为什么没坚持学下去呢？最后我得出了一个结论：学习没有形成正反馈。

没有正反馈，就是指学了之后找不到用的地方，没有看到学习带来的好处，没有感觉到自己在成长，热情就开始大大下降。最后，心里随便找个什么借口，比如工作很忙啦、这个东西用不到啦之类的，也就弃坑了。

最后，我发现我是一个比较懒的人，也发现工作确实让人“急功近利”，很难像学生时代那样心平气和地为学而学。后来，我总结出来一个寻找学习目标的法则：没事儿不找事儿，遇事儿不怕事儿。

没事儿不找事儿，就是当遇到对你没太大帮助的技术，不去投入大把精力学它。只去简单了解这个技术的大概，细枝末节不去深究，只要知道它解决的问题是什么就可以了。

这样做有两个原因，一方面，当一个技术名词频繁出现在你眼前的时候，不能完全无视它。我们得先知道它是干嘛的，通过什么方法和技巧，解决了什么问题。不到这一步，你就是固步自封了。接下来，你就得想想在自己的兴趣和工作的范围之内，这个技术能否用得上，用上了是否能带来好处。如果不能给你带来好处，那就先不去管它。

遇事儿不怕事儿，就是说每当你遇到任何需要解决的技术问题，不要绕着走，要记下来，挤时间吃透它。因为根据我的经验，你遇到过一次的问题，就会遇到第二次第三次。与其让问题一遍遍地欺负自己，不如自己主动点，第一次遇到问题的时候就别认怂，直接学起来。这样的好处就是正反馈来得很直接，成果立竿见影。

对比上一条说的“没事儿不找事儿”，如果你工作中遇到问题或者某个细节不清楚的情况，正愁不知道学啥呢，忽然一个问题“千里送人头”。这时候还等啥，送上门的不收割，难道还放走了不成？

在这里我举个自己的例子。大概在10年左右吧，Hadoop在国内已经开始火了。我的心也躁动得不行，大数据、分布式、Google论文这些词儿都在撩着我。于是我就立了一个flag：“今年学Hadoop”。结果毛都没学，只是知道了一个HDFS和Mapreduce的基本概念，一丁点实操都没有。

忙吗？那一年其实不算忙。就是自己懒，而且内心就知道这玩意学了用不上。后来过了几年，我换了工作，有一个工作要用到Hadoop和HBase，从把集群折腾起来了，到用客户端API跑通POC，总共也没用俩星期，期间还做了别的很多工作。

无数的经验告诉我，有需求的情况下，知识的供给才是有效的供给。知识解决了问题，就有了正反馈，学习的飞轮才能持续地转下去。还有就是人的潜力是很大的，deadline才是第一生产力，哈哈。

### 有效的学习姿势

前面说的方式也有一个问题，就是可能无法系统地学习知识。如果只是东一榔头西一棒槌的学，知识会很不成系统。这样不是一个好的学习姿势。我总结出一个学习的方法，就是主动花功夫构建骨架，被动增加知识点。

主动花功夫构建骨架，就是指有大的方向不会，就选个趁手的资料，有计划成系统的学习。任何一门新技术，都要先经历这个过程。比如Spring，核心就是管理对象的创建和依赖关系。你得深入了解Spring内部机制，了解Spring是如何做到这一点的。

如果再往细了说，可以从以下五个点来构建骨架。

- 核心架构设计：这个技术有哪些核心的架构设计。架构设计决定了技术的特征，也决定了这个技术的优劣势和适用的场景。比如Java是基于字节码和虚拟机的，HBase的本质就是一张排序的大表，Aerospike本质就是一张大的散列表等等。
- 功能模型：这个技术有哪些功能，功能的接口是什么。
- 状态模型：系统在运行时有哪些状态，状态之间的变化原因是什么。
- 数据模型：这个技术是怎么组织数据的，是怎么处理数据的。
- 线程模型：这个技术有哪些线程，分别是做什么的。

构建这个技术骨架，我大部分都是靠自己的业余时间来完成的。在我日常工作中，如果统计下来算的话，应该有30%到50%的时间在学习。其中很大一部分都是在学习一些细碎的小东西，比如某个API或者某个library怎么用之类的。这些东西，都是技术骨架上的点缀。有了自己的技术骨架，接下来就可以等着问题上门了。问题送上门一个，收割一个，so happy。

技术骨架的重要之处还在于，它一方面可以让我们学习相关的新东西时能抓住精要、触类旁通、学得更快更准。另一方面，技术骨架可以让我们学的知识成系统成生态，这样我们才能记得更牢固，用得更顺手。

## 总结

程序员的舒适区，其实就是自己的技术领地。技术领地越大，舒适区越大。当你精通Java了，Java就是你的舒适区。当你听到一个Java的问题，心里就很舒适，因为你知道这对你来说根本不是问题。

技术只有被淘汰和正在进步两种状态。即使是网络，操作系统这些基础，也在不断地进步。随着IPv6的普及，原来IPv4的知识就被淘汰了。随着计算机硬件的发展，操作系统里的CGroup也应运而生，可以让我们更好地管理资源的分配。即使你原来精通网络，精通操作系统，如果几年不学习，回过头来也会发现自己的知识已经过时了。

所以说，程序员就是要在自己的旧领地被慢慢淘汰的同时，积极地去开拓自己的新领地，让自己的舒适区不断扩大。<br>
<img src="https://static001.geekbang.org/resource/image/96/de/96d69ee22bce1293c3b9b724864dd7de.jpg" alt="">

## 思考题

这篇文章，可以说是我这个懒人关于“如何打造技术舒适区”的一套方法。你是如何学习新技术的呢？哪些技术是你领地呢？哪些技术让你觉得自己可以舒舒服服地解决相关问题呢？

欢迎你在评论区写下自己的思考，也欢迎把这篇文章分享给你的朋友或者同事，一起交流一下。
