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

2022-03-24 17:50:51 浏览数 (1)

大家好,我是飞哥!

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

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

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

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

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

一、高效成长方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 漫画 | 一台Linux服务器最多能支撑多少个TCP连接
  • 漫画 | 理解了TCP连接的实现以后,客户端的并发也爆发了!
  • 百看不如一练,动手测试单机百万连接的保姆级教程!
  • 漫画 | 花了七天时间测试,我彻底搞明白了 TCP 的这些内存开销!

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 分钟,可以掏出手机来刷一会儿,稍事休息,然后再进入下一个半小时。

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

0 人点赞