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

Python涨薪研究所

共 4126字,需浏览 9分钟

 ·

2021-12-15 19:24


源 /         文/


很多同学都和我说过一个问题,有心想扎实地提高技术能力,但无奈工作太忙没有时间,该怎么破?
的确,现在很多公司都是 996,早9晚9,12小时的高强度工作导致下班后根本不想再动脑子。
日常工作也不像工作前想象的那么美好,并不是时时刻刻都是在做高技术含量的事情。你的大部分时间将被的各种琐碎的会议、业务需求评审会、线上维护、bug处理所占据。
每天做的都是各种杂事,不单单技术感觉难以成长,就连年底的绩效考评成绩可能也是平平淡淡,没有亮点可言。你的自信也在一点一点的被磨没。
如何在繁忙的工作中来保证自己的技术能力能够持续进步,工作绩效能够突出?我觉得这是一个共性的问题。
我个人 2010 年硕士毕业,有在腾讯、搜狗十多年的工作经验。我今天就结合我的工作经验,来谈谈对这个问题的看法。

一、高效成长方法

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

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

我觉得第一点应该要保持一颗好奇心,多多去项目中发现问题。我举两个我个人刚工作前两年时间里的两件事情。
第一件事情是在 2010 年的时候,我在第一家公司还是一个新人,我发现我们所开发的客户端启动一次特别的慢。
于是我开始思考 Windows 进程启动的过程中都干了啥,有哪些地方可以优化一下。后来进行过系统的研究后我用了两个手段进行改进,将启动速度提升了 15% 左右。并总结成文反馈给了我的领导。
鉴于此类的工作输出比较多,刚工作一年多的时候,我的 leader 就准备提升我为副组长了。不过我还是更热爱互联网,于是婉拒了领导的挽留,我在 2011 年跳槽到了腾讯。
第二件事情是在腾讯内部我同样在工作中进行了深度的知识整理。当时老大给我分配到了一个模块,所有合作方数据源的图片下载模块。
这个模块的需求描述起来也很简单,就是把合作方数据中的图片 url 摘出来,然后下载并存储到腾讯的服务器上。
在这个过程中,引发了我很多的思考。比如新建一个空文件的话消耗磁盘空间吗?一个文件夹下最多能存多少个文件?文件名太长了的话会影响系统性能吗?
基于这些深度的思考我进行研究和学习,后来的技术方案就是为了提高性能,我们将文件通过 hash 的方式散列到三级目录结构下。保证每一次获取文件都很快完成。基于此我还整理出了一篇热文,该文章在腾讯内部KM年度热文榜上登顶,而且在外网也是广为流传,参见《Linux文件系统十文》

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

在我思考的过程中,我需要回头去翻各种经典书籍、看 Linux 的内核源代码,以及其它各种网上的资料。曾经有一次为了把一个内存的工作原理的问题弄明白,我嫌家里的书少,网上的资料不够,直接跑到国家图书馆待了半天。
下图是我日常工作思考中参考的一部分书籍。值得强调的是,我更多地是把它们当成工具书。在遇到疑惑的时候来查。而不是像在学校里那样,逐本逐页的硬啃

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 用了。
这些就是我总结出来的个人技术能力提升方法,希望对你也有用!

END


顶级程序员:topcoding

做最好的程序员社区:Java后端开发、Python、大数据、AI


一键三连「分享」、「点赞」和「在看」


浏览 7
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报