去年夏天我接了个数据分析的活,客户催得急,我就没日没夜地写Python代码。当时脑子里只有一个念头,赶紧跑通逻辑,把结果交出去。注释这种东西,敲一个回车都觉得浪费时间。
三个月后,客户说要改一个参数,重新跑一遍数据。我打开那个叫“final_final_v3.py”的文件,整个人傻掉了。
300多行代码,没有一个注释。变量名全是a、b、c、temp、temp2、data_new这种。函数名是do_it、run、calc、go,完全看不出用途。更离谱的是,我还用了好几个lambda表达式,嵌套了两三层,现在看就像一团乱麻。
我从第一行开始读,pandas读入文件,drop掉几列,然后groupby,然后merge另一个表。看到这里还行。再往下,我写了个for循环,里面套了个if-else,if里又调了一个叫“handle_it”的函数。我点进那个函数,发现它返回了一个列表,然后这个列表被直接传给了另一个叫“process_list”的函数。
我当时拍了一下桌子,大声喊了一句:“这到底是谁写的代码?”办公室其他人都抬头看我。我立刻闭嘴了。因为我知道,就是我写的。
我尝试运行一下,报错了。错误信息提示第187行有个KeyError,说某个列名不存在。我往上翻,发现那个列名是在第120行被重命名的。重命名的时候,我写的是“sales_usd”,但后面代码里找的是“sales_$”。差了一个符号,程序就炸了。
我花了整整一个下午,才把这段代码的逻辑理清楚。期间我不得不把代码打印出来,拿红笔在上面画线,标出数据流的走向。同事路过我工位,看到我桌子上那张像涂鸦一样的纸,笑着问我是不是在破案。
更搞笑的是,我发现在第250行到第280行之间,有一段代码完全没被用到。那几个变量定义了,赋值了,但后续从未被引用。我浪费了30行代码,还浪费了今天下午排查它的时间。
晚上回家,我心里堵得慌。打开GitHub,看了一些开源项目的代码,发现人家每段函数前面都有一小段说明,每个类都有docstring。也不是多长的注释,就一两句话,比如“这段函数计算每个用户的购买频次,参数是用户ID列表,返回一个字典”。就这一句话,能省多少时间啊。
我承认,我之前一直觉得写注释是浪费时间。代码本身应该足够清晰,好代码不需要注释。但这句话有个前提,就是你必须在写代码的那一刻就预判到三个月后的自己是什么水平。我不行。我三个月后的记性,比我预想的差远了。
现在我开始养成一个习惯,每写完一个函数,哪怕只写一句“这个函数干这个事儿”。变量名也不再随便起,customer_list不叫c_lst,total_sales不叫ts。多敲几个字母,换来的是下次看代码时多几分清醒。
上周末,我又翻出那个项目,加了整整一晚上的注释。每加一行注释,我就骂自己一句。