飞哥:程序员完全没时间提升自己该怎么办?

Posted qcrao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了飞哥:程序员完全没时间提升自己该怎么办?相关的知识,希望对你有一定的参考价值。

大家好,我是飞哥!

很多同学都和我说过一个问题,有心想扎实地提高技术能力,但无奈工作太忙没有时间该咋办。相信你的实际工作中可能也有过过类似的困境。

当你工作了以后,你会发现抽出时间来学习貌似是一件很困难的事情。现在很多公司都是 996,早9晚9,12小时的高强度工作导致下班后根本不想再动脑子。

当你工作了以后,你会发现工作不像你想象的那么美好,并不是时时刻刻都是在做高技术含量的事情。你的大部分时间将被的各种琐碎的会议、业务需求评审会、线上维护、bug处理所占据。

当你工作了以后,可能感觉每天做的都是各种杂事。不单单技术感觉难以成长,就连年底的绩效考评成绩可能也是平平淡淡,没有亮点可言。你的自信也在一点一点的被磨没。

如何在繁忙的工作中来保证自己的技术能力能够持续进步,工作绩效能够突出?我觉得这是一个共性的问题。我个人 2010 年硕士毕业,有在腾讯、搜狗十多年的工作经验。我今天就结合我的工作经验,来谈谈对这个问题的看法。

一、高效成长方法

我觉得办法总比困难多。怎么破局,关键点是在于要协调好工作绩效和技术成长这二者的关系,争取让它们能够达成一种互相促进的状态

我分享的方法可以分成如下几步。

1. 保持好奇,勤于在项目中发现问题

我觉得第一点应该要保持一颗好奇心,多多去项目中发现问题。我举两个我个人刚工作前两年时间里的两件事情。

第一件事情是在 2010 年的时候,我在第一家公司还是一个新人,我发现我们所开发的客户端启动一次特别的慢。于是我开始思考 Windows 进程启动的过程中都干了啥,有哪些地方可以优化一下。后来进行过系统的研究后我用了两个手段进行改进,将启动速度提升了 15% 左右。并总结成文反馈给了我的领导。鉴于此类的工作输出比较多,刚工作一年多的时候,我的 leader 就准备提升我为副组长了。不过我还是更热爱互联网,于是婉拒了领导的挽留,我在 2011 年跳槽到了腾讯。

第二件事情是在腾讯内部我同样在工作中进行了深度的知识整理。当时老大给我分配到了一个模块,所有合作方数据源的图片下载模块。这个模块的需求描述起来也很简单,就是把合作方数据中的图片 url 摘出来,然后下载并存储到腾讯的服务器上。在这个过程中,引发了我很多的思考。比如新建一个空文件的话消耗磁盘空间吗?一个文件夹下最多能存多少个文件?文件名太长了的话会影响系统性能吗?

基于这些深度的思考我进行研究和学习,后来的技术方案就是为了提高性能,我们将文件通过 hash 的方式散列到三级目录结构下。保证每一次获取文件都很快完成。基于此我还整理出了一篇热文,该文章在腾讯内部KM年度热文榜上登顶,而且在外网也是广为流传,参见《Linux文件系统十文》

2.带着问题去深度思考、查各种资料

在我思考的过程中,我需要回头去翻各种经典书籍、看 Linux 的内核源代码,以及其它各种网上的资料。曾经有一次为了把一个内存的工作原理的问题弄明白,我嫌家里的书少,网上的资料不够,直接跑到国家图书馆待了半天。

下图是我日常工作思考中参考的一部分书籍。值得强调的是,我更多地是把它们当成工具书。在遇到疑惑的时候来查。而不是像在学校里那样,逐本逐页的硬啃

有想下载的同学我提供给大家。不过如果大家有需要,我仍然建议大家购买纸制版。纸质书使用起来要比电子书方便的多。

下载地址: https://pan.baidu.com/s/1yzSbhD96wdfYW6ncA9cN7A
提 取 码: 4uqa
解压密码: kfngxl

3. 别偷懒,加上动手验证实测

在看完书,查完各种资料后,理论上你可能得到初步解释了。但其实这个时候你的理解深度还远远不够。而且还有可能是你查到的资料是片面的,甚至有可能都是错的。

这时候的动手实际测试显得尤为重要,用各种性能测试工具也可以,自己直接亲手写一段代码也ok。反正就要用实践检验理论是否正确。不正确的时候,再去别的地方搜其它的解释。如此往复迭代,直到把疑惑彻底消灭掉为止~

举个例子,我曾经为了搞懂一条 TCP 连接消耗多大的内存,一台机器到底能不能突破 65535 条连接而进行了大量的实验,参见:

4. 将你的成果用起来,提升项目效果

最后这一步是点睛之笔。只有对实际工作提升的技术才是有价值的技术。把你的深度思考的结论应用到项目中,将项目的效果进行提升。

举个我几年前的小栗子,当时接手了前任开发留下来的一个推送模块,推送一次要跑将近 12 个小时。经过我剖析业务逻辑后发现主要耗时都花在了用几百万的 imei 到一个几千万条记录的数据库里查询了,大量的网络 IO 加随机磁盘 IO。

我把业务逻辑进行了改造,而是一次性将表中数据全查下来。然后在本地机器上在执行顺序读取遍历查询。这样大量的网络 IO 、大量的远程 mysql server 的随机磁盘 IO 全被我干掉了。在 mysql 上和本地服务器上全部都是磁盘顺序 IO。整体耗时直接从 12 小时下降到了 20 分钟左右。

再比如在近两年里,我们接手了一个新的业务。在该业务中,由于各种历史原因,存在大量的本地网络 IO(每天几十亿量级)。这些网络 IO 其实都可以通过其它方式优化掉的。说到这里,可能很多同学也会隐隐约约地觉得本机网络 IO 没有多大的开销,这个认知其实是非常有问题的。

本机网络 IO 和跨机 IO 比较起来,确实开销会低一些。比如发送数据不需要进 RingBuffer 队列,直接把 skb 传给接收协议栈(经过软中断)。但是在内核其它组件上,开销可是一点都没少,系统调用、协议栈(传输层、网络层等)、网络设备子系统、邻居子系统整个走了一个遍。连“驱动”程序都走了(虽然对于回环设备来说只是一个纯软件的虚拟出来的东东。对细节感兴趣的同学参见《127.0.0.1 之本机网络通信过程知多少 ?!》

所以我们接手该项目以后,花了一些人力把所有的本地网络 IO 都优化掉了。优化逻辑上线后,该服务线上的总 CPU 核数就得以节约掉了 30%,一个非常不错的效果。

二、时间管理

最后一点,但是也非常重要,那就是时间管理。我分两个角度来说,一是专注度、二是时间分配。

1. 精力高度专注

在时间管理中,首先我觉得最最重要的一点就是要精力高度专注

现在的各种手机应用已经成为了人们深度思考的最大障碍。各个 App 都希望能瓜分你的时间,让你在它的各种碎片,低价值甚至是垃圾的信息里逗留。吸取你的注意力,为他们创造广告价值。你一定要学会控制住自己刷手机的欲望。

当然现在生活中你完全脱离手机也不可能。至少工作中还有很多事情需要你通过手机处理。累了也需要需要打开某个 app 消遣一会儿。

所以我推荐的时间管理方法是番茄工作法。某段时间内,比如半个或者一个小时,集中精力只对某一件事的高专注度的学习或工作。在这段时间内,王者荣耀、抖音、微博、朋友圈等会分散你注意力的东西统统丢开,甚至连整个手机扔到手摸不到的地方都可以。中间间隔比如 5 - 10 分钟,可以掏出手机来刷一会儿,稍事休息,然后再进入下一个半小时。

平时我都是尽量保持这种方式来进行学习和工作的。我把手头的事情按照轻重缓急排个序,然后就一个时间段,一个时间段地进行安排。在我专注处理某个问题的时候,周围的很多干扰我都会自动屏蔽(倘若这段时间内有人胆敢打扰我,哼,我就生气!😂)

2. 规律时间投入

在前面高效成长方法提到的四点中,很多事情是你无法在工作时间完成的,比如。因为你的日常工作中可能存在着大量的会议、沟通、bug 处理等等杂事。不太可能让你有大块的不被打扰的时间去专注深入研究某个技术点。

所以你需要一个固定的时间段来做以上的事情。如下建议中,你可以根据自己的工作生活习惯进行参考。

工作日固定时间段。每天抽固定的时间段。拿我自己举例,我之前是每天早上的 7 点 30 到 9 点 这段时间固定用来深挖技术(这段时间内高度专注,我几乎连手机都不碰)。至于你个人,可以根据自己的生活习惯来。比如你喜欢晚睡,就安排在睡觉前。能早起,就安排在早上起床后,上班前。即使是 996,我觉得每天至少抽出一个小时来是完全没问题的。

周末大块时间。周末是一个很好的可以挤出更大块时间的地方。有些事情是一小时左右无法完成的,这些工作都可以放在周末完成。周末两天可以固定抽出比如四个小时来。

通勤时间利用。很多一线城市的同学可能上班都比较远。这段路上的时间也可以考虑利用起来,听一些极客时间课程或者是随身带本书。不过这种时间也只适合浅度了解性的学习,想深挖某个技术点这种时间里不太可能能挖好。所以我建议还是尽量离公司近一些,无论是租房还是买房都离公司近一些,达到职住平衡的状态。我建议大家别贪图郊区房子的新,面积大而住的贼远。你要知道,你路上浪费的时间可能是很值钱的。

不过这些时间都应该是在你发现了有技术点需要深挖,有性能测试需要去压、或者有技术点需要整理成文的时候才需要的。如果某段时间内没有这些事情做,那也不要硬逼自己头悬梁锥刺股,没必要。好好去休息休息,享受享受生活也是很好的。

最后

总结一下重点,就是工作以后的学习方式和方法已经不能完全照搬你学校里的习惯了。你必须要学会要把深度的技术学习和提升你手头工作效率结合起来。

当你每次都能用你深厚的技术能力把工作效果提升一大截时候,你其实就进入了一种技术和工作互相促进的良性循环。这种良性循环持续下去,你的技术能力在稳步增长,你的绩效也绝对会很不错。达到这种状态岂不是美哉!

最后我想补充说一点,其实你也不用把整个成长过程想的多么的鸡血。你的工作中的这种提升并不需要太多。假如你工作了三年,你在项目中有过三次大一点的效果提升,其实就足够你拿到好的绩效,或者是在面试中拿 offer 用了。

这些就是我总结出来的个人技术能力提升方法,希望对你也有用!

以上是关于飞哥:程序员完全没时间提升自己该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

程序员在中年危机到来之前,是该努力提升自己竞争力还是提前谋划另谋出路?

程序员职业规划,3步告别忙累压力大没成绩

程序员快速技术提升之道

刚入行的程序员要如何提升自己技术呢

刚入行的程序员要如何提升自己技术呢

刚入行的程序员要如何提升自己技术呢