编程是过人生不是写代码
中国最早的 BBS 上有个版叫"程序人生",雷军是版主。他曾整天在上面飙信,想创造无人能及的记录,所以不仅写编程的信,任何信都得回。
1993 年,网易创始人丁磊(BBS ID:Ding Lei)在宁波电信,在中国惠多网另一位创始人孟超的帮助下,架起了自己的 BBS 站。
1995 年 2 月,腾讯创始人马化腾(Pony Ma)花 5 万元,用 4 条电话线,在深圳的家里架起了 Ponysoft。
1996 年 1 月,中国第一程序员、WPS 作者求伯君(Vincent Qiu)在珠海架起了"西线"BBS 站。
1996 年 5 月,金山总裁雷军(Lei Jun)在北京架起了"西点"。
他们当时建 BBS,都不是为了写代码。求伯君和雷军当时是因金山皓月失败,在BBS上逃避······
三十多年来,我采访过无数顶尖程序员,他们的作品,于今天大都已过时,但他们的编程思维一直影响着我。
①很多项目死在第一行代码之前
没有事先想清楚:问题是什么,输入是什么,输出是什么, 成功标准,失败的代价······
急着写代码,写完发现不对, 改一版还不对, 再改:上线了, 半年后:推倒重写。
DoNews 起点的是 1998 年,那年我出版《知识英雄》。书放到网上,也放在新浪。后来又写新文章,也要发上网,只能手工写 HTML。
新浪总编辑陈彤把权限给我了。但 HTML 容易写错,我写错过,将新浪的网页搞乱过。
"能不能有一种个人发布系统,让我能方便地把新文章发上网,跟读者互动、获取反馈。"我想了两年,直到──
2000 年,小林在 ICQ 上向我宣传他是少年网管。我问他会写 BBS 吗?他说会。我将 DoNews 的想法,写了半页纸,给他。小林两天就完成了。
此后很长一段时间,DoNews 的核心,就是我那半页纸和小林那两天。
我那时想,既然我自己需要不停地、方便地把文章发到网上,别人肯定也需要,所以我把它共享给别人用了。这就是最早的博客自媒体web2.0思想。
②将世界先变成数据
一棵树要变成数据,一个人要变成数据,一段对话要变成数据,一场交易要变成数据,一种情绪,也得变成数据——否则机器看不见。
变成什么样的数据,决定了你能算出什么。
把人变成手机号——通讯录的世界。 把人变成消费记录——电商的世界。 把人变成关注和被关注——社交网络的世界。 把人变成 embedding——大模型的世界。
世界是同一个世界。被装进哪种数据结构,决定了它在机器眼里长什么样。
数据结构不是技术问题,是哲学问题。你决定记录什么,就决定了你能看见什么;数据结构看不见的,机器也看不见。
互联网公司的核心资产是数据结构。模型可以重训练,代码可以重写,数据结构一旦定下来,改它的成本比换一套系统还高。
③状态机
React 是状态管理。 数据库是状态管理。 Kubernetes 是状态管理。 区块链是分布式状态机。 游戏引擎是状态机。 分布式系统的所有问题,本质都是状态一致性问题。
什么叫状态?程序当前在哪一步,当前数据是什么,下一步可以去哪里,出错怎么回滚,并发冲突怎么解决。
写 if-else 的人在算逻辑。 写状态机的人在算时间。 后者比前者难一个数量级。
状态会冲突。 状态会过期。 状态会丢失。 状态会被并发污染。 状态会被回滚。
新手看到"功能"。 老手看到"状态"。 高手看到"状态在多节点之间的协议"。
银行账户余额是一个状态。微信红包是一个状态。淘宝订单是一个状态。GitHub 仓库的当前 commit 也是一个状态。这些状态如果有一秒钟不一致,世界会出大问题。
12306的难点是分布式海量并发读写冲突高所导致的余票冲突。几亿人从不同地方同时抢一张票的状态怎样不冲突······
状态机不只在软件里。
婚姻是状态机:未婚 → 已婚 → 离婚。 法律是状态机:起诉 → 审理 → 判决 → 执行。 金融是状态机:挂单 → 成交 → 清算。 国家是状态机:稳态 → 危机 → 战时 → 重建。
④能跑是最低要求
新手最常说的话:"我电脑上能跑。"
老工程师听到这句话默认翻译:你交付了一个会爆炸的玩具。
软件最大的危险不是不能跑。是看起来没问题。
小数据看起来没问题,大数据爆。 单线程看起来没问题,并发爆。 今天没问题,半年后数据漂移爆。 正常路径没问题,边界条件爆。
测试不是为了证明你对。是为了发现你错。
一个能跑的程序,不等于一个对的程序。 一个对的程序,不等于一个稳的程序。 一个稳的程序,不等于一个能改的程序。 一个能改的程序,不等于一个有人愿意维护的程序。
每一级之间,差一个数量级的工作量。
⑤复杂度才是上限
算法的复杂度有公式:O(n)、O(n log n)、O(n²)。
但真实世界里,最危险的复杂度不在算法里,在人。
人之间的沟通成本是 O(n²)。
2 人团队,1 条沟通线。 5 人团队,10 条。 10 人团队,45 条。 100 人团队,4950 条。
为什么大公司软件烂?不是工程师水平不行。是协调成本超过了创造价值。
为什么微服务流行?不是架构本身更优。是把人之间的协调,移到机器之间——机器之间的接口可以自动化,人之间的接口不能。
为什么开源项目能跑这么远?因为代码本身就是协议——绕过了组织的协调税。
写代码是个体劳动。 做软件是大规模协作。 管软件公司是组织设计。
⑥降复杂度只能切
复杂度无法消灭,只能切。
一个百万行的项目,没人能在脑子里整体把握。把握的方式只有一种——分。
分成函数。函数解决"这一段代码做什么"。 分成模块。模块解决"这一组功能属于谁"。 分成接口。接口解决"两个东西怎么对话"。 分成服务。服务解决"两个团队怎么并行"。
每一层切分,都是认知负担的降级。
好工程师和普通工程师最大的差距,不在写代码的速度,在切分的能力—— 什么时候该把一段代码独立成函数,什么时候不该。 什么时候该新建一个类,什么时候不该。 什么时候该拆服务,什么时候不该。
切早了:过度抽象,系统僵硬,改一个小需求要动十个文件。 切晚了:大泥球,无法维护,每一次提交都在赌运气。
⑦AI 把工程变成实验
老的软件追求确定性。新的软件大量进入概率领域。
搜索排序是概率。 推荐相关度是概率。 广告点击率是概率。 风控欺诈识别是概率。 LLM 的下一个 token 是概率。
工程师过去的工作像数学家——证明对错。 现在的工作越来越像实验科学家——做 A/B 测试,看分布,等收敛。
写代码不再是"写一个正确程序",是"写一个能被验证、能被调参、能被对抗的系统"。
AI 最危险的不是它不会,是它高置信度地胡说八道。
LLM 不知道自己不知道。它会用同一种语气说出"巴黎是法国首都"和"火星是地球的卫星"——两句话的语调一样,其中一句是错的。
人对 LLM 最大的误判,是把"流畅"当成"正确"。
AI 时代程序员的核心价值变了: 不是生成代码。 是约束 AI、验证 AI、对抗 AI、给 AI 兜底。
这件事比写代码难。生成是个体动作,验证需要系统能力——边界在哪里、什么算对、什么算错、怎么自动发现错。
⑧工程是算账
开发成本、学习成本、维护成本、沟通成本、招聘成本、迁移成本、失败成本。
每一个技术决策都在算账。
一个团队选 Python,不是因为 Python 最好,是因为团队会 Python。切到 Rust 性能可能高 10 倍——但全员培训三个月,业务停摆,这笔账多数公司算不过来。
烂系统也能成功。不是它好,是替换它的成本更高。
这就是为什么 COBOL 还活着,Fortran 还活着,IE 浏览器死得这么慢——存量的协调成本压倒了新技术的边际优势。
技术债不可避免。不是消灭技术债,是控制利息增长。
新手谈"最佳实践"。 老手谈"权衡"。 真正的高手看到每一个权衡背后的成本承担者——谁省了钱,谁付了代价。
⑨编程不能解决的事
不是所有问题都能写成代码。
代码能解决的,是可以被形式化的问题。
现实里大量的问题不能被形式化——情绪、文化惯性、权力结构、黑天鹅、不可观测变量、非线性反馈。
你写一个推荐系统能算 CTR。 你写不出一个程序解决一个团队的政治内耗。
你写一个交易引擎能算市场。 你写不出一个程序预测 2020 年 3 月会发生什么。
你写一个客服 Bot 能回答 80% 的问题。 你写不出一个程序处理那剩下的 20%——因为那 20% 通常根本不是问题,是抱怨、是情绪、是"我只是想找人说话"。
工程师最大的诱惑,是把所有问题都软件化。 工程师最大的成熟,是知道哪些问题不该软件化。
工具会改造用工具的人。三十多年用代码看世界,看到的多半是可以被代码解决的事;不能被代码解决的事,慢慢就从视野里淡出。
我见过的失败项目,大半死在这一条上——硬把不该写成代码的事写成了代码。
工业革命扩大体力。 信息革命扩大脑力。 AI 革命扩大的,是组织复杂系统的能力。
AI 能写代码,AI问不出新问题······