从大二开始写第一行代码算起,我写代码这件事已经做了十年。
回头看看这十年,我的技术能力确实在提升——从写一个简单的 CRUD 后台,到设计能支撑百万请求的系统架构,从只会用 jQuery 到能熟练使用各种框架和工具。但最大的认知转变,不是关于"怎么写代码",而是关于"什么时候不写代码"。
听起来有点反直觉,对不对?一个写了十年代码的人,最大的收获居然是不写代码。但这就是我的真实感受:写代码是最容易的部分,决定不写什么代码才是最难的部分。
从"能写"到"不写"
刚入行的前三年,我的心态是"所有问题都能用代码解决"。遇到问题,第一反应就是"写一个工具"、"搭一个系统"、"做一个自动化"。那时候我觉得,写代码多就是厉害,功能多就是牛逼。
我记得有一次,我想做一个简单的数据统计功能。公司的现有工具不太方便,我花了整整一周,自己写了一个完整的统计系统。做出来之后我特别自豪,到处跟人炫耀。直到有一天,一个同事路过看了一眼,说:"你为什么不直接用 Excel 透视表?"
我愣住了。Excel 透视表,10 分钟就能搞定的事情,我花了一周写了一个远远不如它好用的工具。
这是我第一次意识到:"能写"不意味着"应该写"。写代码是一件很酷的事情,但如果你把"酷"当作"正确",你就会在错误的方向上越走越远。
什么时候不写代码?
经过多年的"踩坑",我总结出了四个"不写代码"的场景:
1. 已经有现成的,别写
这是最常见的陷阱。很多程序员有"Not Invented Here"综合征——总觉得别人做的不够好,自己写一个才放心。
但现实是:大多数时候,现成的解决方案比你自己写的要好得多。无论是支付系统、用户认证、还是数据分析工具,除非你有非常特殊的需求,否则直接用现成的。你花一个月写了一个"还不错的"支付系统,但 Stripe 已经花了十年、几千个工程师迭代它。你凭什么觉得自己一个月能超越它?
我现在做独立开发,原则是:能用第三方服务绝不自建,能用开源库绝不手写,能用现成模板绝不从零开始。节省下来的时间,全部用来做真正需要我做的事情——理解用户、设计产品、做推广。
2. 这个功能不一定需要,别写
产品经理有一个经典问题:"这个功能用户真的需要吗?"
但程序员自己也有一个类似的问题:"这个代码真的需要吗?"
我做过太多"提前优化"的事情。比如,在用户只有 100 个的时候,就开始设计能支撑 100 万用户的架构。在功能还没验证的时候,就开始做单元测试、自动化部署、监控告警。这些都没有错,但问题是——如果你连这个产品能不能活到 100 万用户都不知道,为什么要花时间做这些?
我现在的做法是:先让功能跑起来,用最笨的方式。如果用户确实需要,数据撑不住了,再迭代优化。90% 的情况下,你担心的那些"优化"根本不需要做。
3. 以后会大改的,别写
很多时候,你写了一段"完美"的代码,但三个月后需求变了,那代码被全部删掉重写。
我学到的教训是:如果你不确定一个功能会长期存在,就用最简单的方式实现它。不要写抽象层,不要设计扩展性,不要做过度工程。因为你为之努力的那些"可扩展性",在需求变更面前一文不值。
有一句名言说得好:"代码不是写出来的,是改出来的。"但更准确的说法是:代码不是写出来的,是删出来的。你写的大部分代码,最终都会被删掉。所以,尽可能少写,尽可能简单。
4. 应该由别人写的,别写
这是最难的一种"不写"。
在团队中,你经常面临一个选择:一个功能,你自己写需要 2 天,但把这个功能教会另一个人来做需要 5 天。你可能会选择自己写,因为"更快"。但如果你算一下长期成本:
- 你自己写:2 天搞定,但以后每个类似的功能你都得自己写。
- 教会别人:5 天搞定,但以后类似的功能他都能做了。
第一个选择短期更快,但长期更慢。第二个选择短期更慢,但长期更快。
我做了太多次第一种选择,结果就是"把自己活成了瓶颈"——所有事情都要经过我,因为我写代码最快,但我也没有时间去思考更重要的事情。
不写代码,比写代码更难
你可能觉得,不写代码不就是"偷懒"吗?有什么难的?
但事实是,不写代码比写代码难得多。因为:
- 需要判断力。你需要知道什么时候该写,什么时候不该写。这种判断力来自大量的经验和反思,不是看几篇文章就能学会的。
- 需要说服别人。当你说"这个功能不应该写"的时候,你需要解释为什么。你需要对抗"多做一点总是好的"的惯性思维。
- 需要承受"不做"的压力。写代码是一种有形的产出。你写了一个功能,任何人都能看到你做了一些事情。但你不写代码,你看上去什么都没做。在大多数组织中,做事情的人被奖励,不做事情的人被质疑。承担"不做"的压力,比"做"要难得多。
写在最后
写代码十年,我最大的收获不是学会了多少框架、多少语言,而是学会了在合适的时候放下键盘。
代码是工具,不是目的。你的目的可能是解决一个问题、创造一款产品、或者帮助一群人。写代码只是通往这个目的的一种方式。如果你不写代码也能达到目的,那就不写。如果你写更少的代码也能达到目的,那就写更少。
下次你准备开始写代码之前,先问自己一个问题:这行代码,真的需要存在吗?
如果答案是"不需要",那就别写。你会感谢你自己的。