|
去年冬天,程序我在一个老旧的代码大全GitHub仓库里翻到一份2003年的C代码,文件名就叫copy_all.c。可复作者在注释里写:“这段代码我复制了十七次,程序每次改三个变量。代码大全”我盯着屏幕笑了半天——这不就是可复“程序代码大全可复制”的原始形态吗? 很多人以为“可复制”是指Ctrl+C、Ctrl+V。程序错了。代码大全真正能复制的可复代码,是程序那种你把变量名全换掉、把业务逻辑抽走、代码大全剩下的可复骨架还能直接塞进另一个项目里跑起来的东西。我见过一个做工业控制的程序老哥,他的代码大全串口通信模块从2008年用到2023年,换了四家公司的可复产品线,核心那三十行read/write循环愣是没动过。每次移植只改波特率和缓冲区大小。这叫可复制。 复制的前提是“别耍小聪明” 新手写代码喜欢炫技。一个数组去重,非要用reduce加Set加展开运算符写成一行。看着很酷,但换到老式浏览器或者嵌入式环境里直接报错。我自己的习惯是:能写三行清晰循环,绝不写一行嵌套三元。去年帮朋友改一个微信小程序,他用了某开源库里的“优雅”工具函数,结果在小程序基础库2.9.0上直接白屏。我把它替换成一段从2015年博客里复制来的for循环,五秒钟解决问题。 可复制的代码往往长得“笨”。比如下面这种: function copyArray(src) { var result = []; for (var i = 0; i < src.length; i++) { result.push(src[i]); } return result; } 没有任何现代语法,但你在任何JavaScript环境里都能跑。我电脑里有个snippets文件夹,里面全是这种“笨代码”——日期格式化、防抖节流、深拷贝简易版。每次开新项目直接拖进去,改个命名空间就用。 复制不等于偷懒,是建立自己的“零件库” 我认识一个独立开发者,他做外包十年,电脑里有个parts目录。按功能分类:登录模块、支付回调、文件上传、分页组件。每个模块都配一个readme.txt,写明依赖什么、暴露什么接口、已知坑点。接新活时,他先花半天把零件拼起来,剩下时间全用来调UI细节。他跟我说:“你写过的每一行代码,都应该变成下次能直接用的零件。” 这话我记了五年。现在我自己写代码,遇到通用逻辑就停下来问一句:这个逻辑下个项目还会用吗?会的话,就抽成独立函数,参数写全,注释写清边界条件。比如一个简单的formatDate,我写了七个重载版本——从时间戳到字符串、从Date对象到“刚刚/五分钟前”。每次复制粘贴,改一个pattern参数就行。 有些代码复制了会出事 但“可复制”不是万能药。我见过最惨的案例:一个团队把某电商的库存扣减逻辑复制到自己的秒杀系统里,结果忘了改Redis的key前缀。大促当天,两个业务的库存互相覆盖,超卖了四百多台手机。后来复盘,那段代码本身没问题,问题出在复制的人没看注释里那行“注意:key必须包含业务标识”。 所以我现在复制任何代码前,先做三件事:看注释、搜全局变量、查硬编码。尤其是那些写着localhost、127.0.0.1、test_开头的字符串,十有八九是坑。 最后说个真事 上个月我帮一个高中生改他的Python作业——一个简单的学生成绩管理。他用了pandas读CSV,又用了numpy算平均分,还引入了matplotlib画图。我问他:“你电脑装这几个库花了多久?”他说一晚上。我把他代码里那三十行依赖全删了,换成从csv模块复制来的读写逻辑,加上一个for循环算平均。代码从八十行变成二十行,在他学校的旧电脑上跑得飞快。 他问我:“这样是不是太土了?” 我说:“你交作业是为了让老师看懂,不是为了秀你装了多少库。能复制、能跑通、能改一行就适配新数据——这就是最好的代码。” 那天晚上他发来消息:“老师给我加了五分,说逻辑清晰。” 你看,可复制的代码,连分数都能复制。 |