111

工程师成长的必备技能

 6 years ago
source link: https://mp.weixin.qq.com/s/TJTax4ug8DILa42Q8RkZGQ
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

工程师成长的必备技能

章烨明 未来技术站 2017-11-06 10:06 Posted on

作者 | 章烨明

Image

杏仁医生CTO。中年程序员,关注各种技术和团队管理。

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

1. 基础知识

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

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

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

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

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

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

2. 时间管理

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

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

Image

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

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

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

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

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

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

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

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

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

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

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

3. 项目管理

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

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

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

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

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

4. 学习能力

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

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

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

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

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

5. 锻炼身体

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


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


以下文章您可能也会感兴趣:

我们正在招聘 Java 工程师,欢迎有兴趣的同学投递简历到 [email protected]

Image

杏仁技术站

长按左侧二维码关注我们,这里有一群热血青年期待着与您相会。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK