疫情居家的两个月,我重新审视了自己写的代码

疫情居家的两个月,我重新审视了自己写的代码
踱鸽&水晶蟹疫情居家的两个月,我重新审视了自己写的代码
2020 年春节,原本只打算在家待一周,结果一待就是两个多月。
最开始几天还在刷新闻,后来慢慢定了下来,打开电脑,开始工作。居家远程那段时间,反而有了一些在公司里很久没有过的感受——第一次有空回头看自己写的代码了。
一、上班时的状态
在公司里的日子,需求排着队来。今天这个功能要上线,明天那个 bug 要修,周报要写,评审要参加。
我们团队的 sprint 大概是两周一个迭代,每次排进来的卡基本都是满的。写代码的时候其实没怎么想”这样写对不对”,想的更多是”这样能跑起来吗””接口文档对上了吗””测试那边什么时候开始联调”。
代码 review 是有的,但很多时候都是走形式——互相看一眼,没有明显的 bug 就过了。确实没精力深究,也没人有时间纠结”这个方法是不是太长了”这种问题。
就这样日复一日,代码在赶节奏里写,很少有机会回头看它长什么样。
二、居家后的意外收获
有一天,我在修一个线上小问题,改完了顺手往上翻,看了一眼那个模块周边的代码。这一看,就停不下来了。
那是一个做数据导入的模块,我大概一年前写的。我记得当时赶着上线,代码写得比较糙,心里想着”以后有时间再优化”。
这次翻出来,着实有点不认识了。
三、看到的问题
问题一:一个方法里塞了太多事情
那个模块里有一个 importData 方法,大概 200 行。它做了这些事:读文件、解析 Excel、数据校验、去重判断、写数据库、发消息通知。
全在一个方法里。
当时写的时候大概觉得”都是一件事的步骤,放一起方便”。现在看,这个方法做了六件完全不同的事,任何一件出了问题,调试起来都得在这 200 行里找。
这还不是最难受的,最难受的是测试不了。因为这些步骤高度耦合,没有办法单独测某一步,只能整体跑。
问题二:命名里的”意图丢失”
翻到一段变量声明:
|
三个变量,list1、list2、map,没有任何说明它们存的是什么。
往下看了十来行才搞清楚:list1 是校验通过的数据,list2 是重复的数据,map 是用来做临时 key 去重的。
我写这段代码的时候,可能确实知道这三个变量是干什么的。但三个月后,连我自己都忘了,更别说别人来看这段代码。
问题三:”聪明的”代码
还有一段,我用了一个嵌套的 Stream 操作来做数据转换,链式调用套了三层,写的时候大概觉得挺优雅。现在看,我需要从头认真读一遍才能搞清楚它在做什么,而且完全没有办法在中间加断点调试。
四、引出的思考
这次翻代码让我想了一个问题:什么叫”对自己负责的代码”?
我以前的理解偏技术性——加注释、覆盖测试、没有明显的 bug。但现在我觉得这些只是门槛,不是全部。
真正”对自己负责”,是要预设一个前提:三个月后,你不会记得现在的思路。
所以你现在写的代码,要能让三个月后的自己(或者换一个人)在没有任何上下文的情况下读懂——它在做什么、为什么这样做、边界条件在哪里。
这不是说每行都要加注释,而是命名要诚实(validatedRows、duplicatedRows,而不是 list1、list2),方法要有单一职责(能够独立理解、独立测试),关键逻辑的”为什么”要写出来(// 这里要先判空是因为上游数据源可能传 null)。
居家的这段时间,我把那个导入模块拆了一遍。不是全部重写,就是做了几件具体的事:拆分方法、改名、补了几处关键注释。工作量不大,但之后每次改那个模块,感觉顺手多了。
赶需求的节奏很难改变,但可以在每次提交之前多花五分钟问自己:这段代码,我三个月后还能看懂吗?
