工程师成长的必备技能

桂林seo半杯酒博客

经常听到有些工作1、2年的工程师说,觉得很迷茫,不知道该学些什么,想让我给一些建议。今天我就列几个我认为对工程师很重要,越早学会越有用的知识或者技能。不知道学什么的时候,学这些总是没错的:)

1. 基础知识

不管你是哪个方向,前端、后端、运维、QA、数据甚至AI等,基础的重要性再怎么强调都不为过。因为基础决定了一个工程师未来能达到的高度。

就像建高楼一样,越高的楼,地基肯定需要打得越深。有些人会觉得平常工作里用不到那些知识,于是忽略了。他们按部就班的做一些日常工作,可能也没什么问题。但是当他们想要进一步提升自己的时候,就会发现好像有个天花板,怎么也突破不了。如果意识不到这一点,那可能一辈子就是一个平庸的工程师了。打个不恰当的比方,基础知识就是一个工程师的内功。内功不行,修炼再多的招式,也不可能成为高手。基础也会影响一个人分析问题解决问题的能力。基础不好的人,遇到问题可能都不知道去搜索什么关键词。

简单举几个例子,比如性能优化,如果要做到极致,那就需要对硬件(如CPU、缓存结构、内存性能等)、系统(如进程、线程、内存分配、系统调用等)、网络(如TCP重传、拥塞控制、IP路由等)、数据结构、编程语言等都非常了解。再比如说 AI,数学和算法不好也能用 AI 做一些东西,但真要训练一个好用的模型,基本的数学和算法知识就必不可少了。再比如系统分析和设计,编程功底不足、逻辑能力和抽象能力锻炼不够的人,设计出来的系统恐怕也是惨不忍睹的。

所以我建议大家可以把大学里对应专业的基础课程,找一些更好更深入的教材再好好的看看。对开发来讲,程序设计、数据结构和算法、操作系统、数据库、计算机网络、软件工程等等都应该看看。这些方面有很多经典的书可以读,比如《算法导论》、《TCP/IP详解》、《深入理解计算机系统》、《计算机程序的构造和解释》、《代码大全》等等。如果有志于数据分析、数据挖掘、AI 方向的,数学、概率论、统计学等也应该看看。我刚毕业那几年也算看了一些,但现在常常觉得还是不够,又没有时间再去重新学习基础内容。所以说,趁年轻有时间的时候,一定要多投入一些时间把基础打扎实了。

学习基础的时候,也不要死抠细节。更重要的是理解它的原理,学习解决问题的思路。比如,学习数据结构里的树,不是要你把这些它们的翻转、遍历算法倒背如流,而是要理解他们的原理、优缺点,知道在哪些情况下适用或者不适用,比如为什么 Java 的 TreeMap 用 红黑树,为什么数据库用 B+ 树等等。当然,学习的时候还是要动手写写这些算法,才能更好理解。

不过学习基础知识是很枯燥的事情,短期内也不会有明显效果,所以更需要耐心和坚持。基础扎实了,接下来根据发展方向的不同,就可以自己选择性的去学习了。

2. 时间管理

这是我希望当年我刚毕业就学会的技能,可惜过了好几年我才明白它的重要性。很多人不会管理自己的时间和精力,白白浪费了不少大好时光。

时间管理最有用的我认为就是《高效能人士的七个习惯》里提到的“要事第一”原则,它的核心就是四象限。顺便提一下,史蒂芬·柯维的这本书,很值得一看,我看过好几遍,获益良多。

第四象限,不重要不紧急。比如上网、游戏、购物、聊天、看朋友圈等。这些事情偶尔作为生活调节没有问题,但切记不可沉溺。有些人总抱怨自己没有时间学习,其实可以看一下,自己是不是花了太多时间在这一象限的事情上。

第三象限,紧急不重要。比如不速之客、不重要的会议、日常的琐碎工作。对这些事,先考虑是否可以拒绝?是否值得自动化?或者是否有其他方式优化流程?如果都不是,那就尽快做掉。

第二象限,重要不紧急。比如自动化或者改进效率的事情、工作规划、回顾总结、学习分享等等。这是最重要的象限(注意,最重要的不是第一象限),我们应该把大部分时间花在这里。这里的事情,大部分是着眼于未来,可以提升自己能力、改进工作效率的事情,但往往由于不是那么急迫,会被人忽视。

第一象限,重要且紧急。比如线上故障、Deadline 等。这些都是要立即处理的事情。但其实这里的很多内容是从第二象限转变过来的,例如本来一个任务不紧急,但一拖再拖就变成紧急任务了。又比如如果我们把监控、稳定性做好的话,那线上故障就会减少。所以对待这个象限的原则是,尽量想办法减少这个象限的内容。

每次遇到事情,考虑一下它是哪个象限的,再决定如何处理。总之它给我们不少启示:

  • 把自己的时间花在重要不紧急的事情(第二象限)上。

  • 学会取舍。有的事情不一定要做,或者不一定现在要做。

  • 学会协作。有的事情不一定要自己做,可以找人一起帮忙。

  • 不要拖延。拖延会把不紧急的事情变成紧急的事情。

  • 不要钻牛角尖,把时间花在没有结果的事情上。

除了四象限,常用的时间管理方法还有 GTD 和番茄工作法。这些大家都应该了解下,但是也不用生搬硬套,而是要最终建立一套自己的工作方法。可以借助一些工具(比如我用的 Doit.im),学会规划好自己每天、每周以及更长期的任务。

3. 项目管理

项目管理是一个很大的话题,很多人觉得项目经理才需要学这个,但其实对于普通工程师,了解一些项目管理的原则和方法,是很有帮助的。

比如说任务分解,看上去是很简单的事情,但要做好并不容易。任务分解的一个基本原则是 MECE 原则(相互独立、完全穷尽),也就是任务之间不能有重叠,并且不能遗漏。对于开发任务,按照垂直的功能去划分任务(即分成一个个完全独立的小功能),按照水平的分层去划分任务(即分成前端、服务层、数据层等),会有很不相同的效果。但怎么分解好,也是要具体问题具体分析,不能一概而论。

我们做任何事情,其实都需要在不同维度上进行任务分解。工程师应该要学会如何去分解自己的工作。比如以前我还用 C 和 C++ 的时候,见过不少人喜欢一下子先把代码都写完,然后再编译和调试。结果一编译,出现满屏幕的编译错误,然后花费大量的时间修改和调试。现在 IDE 比较先进,这种情况不多见了,但很多人还是习惯先写好很多代码,再去调试。常常调试、修 BUG 的时间比写代码的时间还多很多。但其实我们可以把任务继续进行分解,例如 2 天的任务,我们可以把它分解成更小的模块、类甚至方法,每次实现了一部分,就去测试一下,或者写个单元测试确保这部分代码正确了,再去做下一个小任务。TDD 也是这种理念,不过它把写单元测试放到前面去了。并且认真规划的话,大部分情况都可以确保完成每个小任务后,应用功能还是可用的,随时可以提交代码。而不是要花上一个礼拜,等整个功能全部完成才提交代码。

再比如风险管理。有风险意识的工程师,会在开始任务前,仔细考虑可能遇到的各种问题,采取一定预防措施,做好沟通工作,并考虑好对策。而不是等到问题出现就手足无措,很多延迟和返工就是因为这类原因出现的。

为什么优秀工程师效率会比一般工程师高很多?原因之一就是优秀工程师会用项目管理的思维去规划他们工作,采用最合适的方式去完成任务。所以工程师了解一些项目管理知识,包括WBS、MECE 原则、各种估算方法、风险管理等,对自己当前的工作也好,对未来承担更重要的职责也好,都有很大的帮助。

4. 学习能力

软件行业的知识和技术日新月异,作为一个软件工程师,要不想自己被淘汰,就只能不停的学习。

十年前我刚毕业的时候,网上的资料很少,开源代码更少,要学东西只能自己去买书然后边看边实践。现在不一样了,只要不是太冷门的内容,都能在网上找到各种教程、文章甚至还有开源代码,学起来方便多了。

对于工程师来讲,学习需要既有一定的广度,同时也要在某个特定方向有足够的深度。广度方面,可以定期学习一些新的知识,关注行业的最新动向。至于深度,那还是要去看书、看代码、动手实践。对于开发工程师,可以多阅读一些优秀开源项目的代码,也可以上 Leetcode,Topcoder 之类网站刷刷题,对自己的功力提升有非常大的帮助。

然后就是尝试多写、多分享。一个知识,当我们尝试要去把它写成文章的时候,常常会发现我们对它还有很多不了解的地方。特别是要用通俗易懂的方式把它写下来,其实非常难,需要我们对这个知识理解的很深刻。这也是我们杏仁要求每个工程师都去写知识库,并且鼓励大家做分享的原因。前面的一篇文章,《四维阅读法 - 我的高效学习“秘技”》也提到了分享的重要性。

除了自己专业的知识,大家也不妨多了解些其他专业和行业,比如经济、历史、财务、运营等方面的内容。学习多种思维模型,避免手里只有一把锤子,然后把所有问题都看成是钉子。

5. 锻炼身体

最后再加一个彩蛋。很多工程师都有颈椎、腰椎的问题,很是痛苦。我也是,有段时间脖子疼腰疼,特别不好受。以前虽然也运动或跑步,但很不规律。最近几年开始健身跑步,一周保证至少两次,颈椎和腰痛都好了很多。平常注意坐姿,劳逸结合,坚持锻炼,不仅可以免受很多痛苦,精力也会更充沛。

当然想要成长为大牛,光靠这里说的这些还是不够的,还有很多东西需要不断的学习和磨练,比如沟通协作、系统设计、产品思维等等。但我认为上面几点,是最核心最基础的,可以说是“元”技能,越早学会这些“元”技能,能够更好学习其他知识和技能,更快突破自己。