刷到这条热搜标题的时候,我第一反应不是那个夸张的年薪数字,而是「7万行」这三个字。做了十几年开发,看到「一个人写完整个项目」这种描述,脑子里的下意识动作就是拿计算器敲一遍:这个量级撑不撑得住一款产品早期版本的功能面?第二个反应更实际一点——这类标题真正值得琢磨的地方从来不在数字本身,而在于它背后藏着的那个判断:什么阶段一个人全包是效率最高的选择,什么阶段必须立刻拆开。这个问题,每个从零做过产品的人早晚都要面对一次。
这篇内容不聊八卦,也不做人物评价。我想以一个普通开发者的视角,把「单人完成数万行代码」这件事拆开来看:这个量级在工程上意味着什么,什么样的人在当时能一个人干完,为什么这种做法今天几乎不可复制,以及那条「天价年薪」的传闻该怎么理性地看待。不管你是刚入行的新手,还是已经带过团队的技术负责人,只要你曾经动过「要不我自己一个人把整个东西写出来」的念头,下面这些内容应该都能对应上你的某些困惑。
1. 「7万行」这个数字到底有多少含金量
1.1 先用工程量尺量一量这个体量
很多人对代码行数没有直观概念。我给个参照:一个熟练开发者写业务代码,状态好的时候一天的有效产出大概在100到300行之间,注意是「有效」——能跑、有逻辑、后续不用大改的那种,不算反复删改和调试。按这个速度折算,7万行大约是250到700个有效工作日,也就是一到两年的纯编码时间。而现实中的产品开发不可能天天状态在线,还要开会、还要试错、还要推翻重来,所以这个数字如果属实,对应的是一段相当长、相当高强度的开发周期。
但这里有个关键的分叉:行数从来不是一个均匀的度量单位。同样是7万行,如果里面包含大量重复的界面布局代码、手写的字符串拼接、早期的兼容层,那实际的信息密度可能只有三万行的水平;反过来,如果是一个高度精简的核心引擎,7万行已经能撑起一个相当复杂的东西了。所以看到「7万行」这种描述,先别急着惊叹,得问一句:这7万行里,有多少是真正的业务逻辑,有多少是那个年代不得不手写的「体力活」?
我拿一个通用的统计命令举例,任何人都可以用它看看自己项目的真实构成:
# 按目录统计代码行,排除依赖和构建产物 find . -type f \( -name "*.c" -o -name "*.h" -o -name "*.js" \) \ -not -path "./node_modules/*" -not -path "./dist/*" \ | xargs wc -l | sort -n | tail -20跑完你会看到,真正撑起功能的文件往往是少数几个,剩下大量文件是配置、是适配、是边角料。这也是为什么我不太喜欢用行数衡量「厉害程度」——它太容易被填充了。
1.2 早期项目为什么天然「行数虚高」
如果这个项目发生在十几年前,那行数虚高几乎是必然的。原因有几个,都跟那个年代的开发环境直接相关。
第一是缺少成熟框架。今天写一个列表页,一个组件库几行配置就出来了;当年得手写布局、手写滚动、手写粘性头部,一个页面几百行是常态。第二是缺少构建和模块化工具,很多代码是平铺的,无法复用,同一段逻辑在十个地方各写一遍。第三是大量兼容性代码,早期设备性能参差不齐,为了让功能在各种机器上都能跑,开发者要写很多降级方案,这些代码在今天的视角看完全是噪音。
所以一个很反直觉的结论是:7万行在当年,可能只相当于今天的两三万行。这不是贬低,恰恰相反——在没有框架、没有生态、没有现成轮子的年代,一个人从零搭起一套能用的东西,需要的不只是编码能力,更需要对整个链路的完整理解。你得自己当自己的产品经理、自己当自己的测试、自己当自己的运维。这种「全链路通感」,才是这类故事里真正稀缺的东西,行数只是它的副产品。
1.3 真正值得关注的是「决策密度」而非代码数量
我见过太多人把注意力放在数字上,却忽略了更重要的维度:在一个项目里,一个人做了多少个不可逆的关键决策。数据怎么组织、状态存在哪里、界面怎么切分、异常怎么兜底、后续怎么扩展——这些决策一旦定下来,后面几万行代码都得围着它转。
一个人写完整套东西,好处是决策链路极短,想到什么立刻就能落地,改起来也没有沟通成本;坏处是所有的坑都是你自己埋的,而且你当时往往意识不到。这也是我后来做项目评审时的一个固定动作:不看代码写得多漂亮,先看核心数据结构和模块边界怎么划的。边界划错了,代码再整洁也是负资产。
2. 一个人能写完全栈产品的时代条件
2.1 早期产品的功能边界窄得惊人
现在回头看那些「一个人搞定」的传奇项目,会有一个共同点:第一版的功能面窄到难以置信。可能只有最核心的一两个动作,没有账号体系、没有复杂的权限、没有运营后台、没有数据看板。用户能做的事就那么几件,代码复杂度自然可控。
这不是偷懒,而是极其清醒的取舍。产品从零到一的阶段,唯一需要验证的事情是「这个东西有没有人用」,其余全是噪音。你多写一个设置页,就多一周的开发和半年的维护成本;你多做一个自定义主题,就要处理无穷的边界情况。所以我一直建议身边做个人项目的朋友:第一版只做一件事,做到能让陌生人三秒内理解你在干什么。
那位技术负责人在早期选择独自完成,本质上也是这个逻辑的极端版本——不分工、不交接、不开会,所有时间都投在核心路径上。这种做法的效率红利是巨大的,因为它把协作成本压到了零。代价是天花板很低,一旦功能开始横向扩张,一个人立刻会被淹没。
2.2 单人开发的隐性成本:想的比写的多
外界看「一个人写了几万行」,想象的是一个人坐在那儿疯狂敲键盘。实际做过的人都知道,真正耗时的是想清楚的部分。
我自己的经验是,写代码的时间和想清楚的时间大概是三七开。你得先想明白这个功能在什么场景下被触发、失败了怎么办、数据从哪来、到什么状态算是完成。这些想不清楚,写出来的代码一定会推倒重来。一个人做项目,最难的不是编码,而是没有人跟你抬杠——你脑子里冒出来的第一个方案,没有人帮你质疑,你只能靠自己反复推演。
有个很实用的土办法我用了很多年:在动手前把方案写成一段给自己看的文字,不用长,三五句话,把「输入、处理、输出、失败情况」四件事说清楚。写不出来,说明还没想明白,那就别急着开编辑器。这个习惯帮我省掉的返工时间,远超它占用的那几分钟。
2.3 什么情况下「一个人全包」仍然是最优解
虽然我一直在强调单人的局限,但有几种场景下,一个人干确实是最优解,甚至是唯一解。
第一种是概念验证阶段。你要验证的只是一个想法,这时候拉三个人开会讨论架构,纯属浪费。一个人两三天做出能点能看的东西,比什么都强。第二种是内部工具。使用范围就那几个人,需求稳定,不需要扩展,一个人写完扔那儿跑三年不出问题。第三种是高度依赖个人判断的部分,比如核心算法、关键的交互逻辑,这类东西在早期由一个人定调,比集体讨论更快收敛。
反过来,一旦出现这几个信号,就该立刻考虑拆分:需求开始排队、改动开始互相影响、你要花超过三成时间解释自己在做什么。这三个信号出现任意一个,继续一个人扛就是在给自己挖坑。
3. 单人代码到海量用户:架构的第一次质变
3.1 单机结构的天花板先从哪儿裂
一个人写的系统,默认假设是「一台机器、一个进程、一个数据库」。这个假设在用户量小的时候完全没问题,甚至性能好得惊人——没有网络开销、没有序列化成本、没有分布式事务。但它有三条硬边界,撞上任何一条都得推倒重建。
第一条是连接数。单进程能扛的并发连接是有限的,用户数一上来,排队就开始了。第二条是数据量。单库单表写到几千万行,查询开始变慢,索引维护成本飙升。第三条是发布。所有功能在一个进程里,改一行代码要整体重启,任何一个小改动都可能把整个服务带下去。
这三条边界的本质是一样的:耦合度太高,任何局部的变化都会传导到全局。而耦合度高恰恰是单人开发的必然结果——一个人写代码,追求的是「快」,模块边界能省就省,反正自己心里清楚。这种写法在小规模下是优势,在规模上来之后就是灾难。
3.2 重写还是重构,早期代码的宿命
几乎所有的单人造物最后都要面对一个问题:这套代码还能不能继续改。我的观察是,答案通常取决于一件事——核心抽象有没有错。
如果当初把消息、联系人、会话这些核心概念的数据结构定对了,后面再怎么加功能都只是往上叠,重构就能搞定。如果核心抽象本身就歪了,比如把不同类型的东西塞进同一个表用字段区分,那越往后越拧巴,早晚要重写。这也是为什么很多早期项目最后都经历了一次「推倒重来」——不是因为代码写得烂,而是因为当初的问题定义变了,软件不得不跟着换骨架。
这里有个我踩过的坑值得分享:不要为了「以后可能扩展」而过度设计。我年轻时做过一个项目,为了「未来支持多种存储」硬加了一层抽象层,结果这个抽象层从来没被换过,反倒让每次读写都多绕两道。抽象要跟着真实需求走,不能跟着想象走。早期的单人代码之所以高效,很大程度就是因为它没有为想象付费。
3.3 规模上来之后,行数彻底失去意义
一个很值得玩味的现象是:当一个系统从几万行涨到几十万行、几百万行之后,没有人再提行数了。因为衡量标准完全变了,变成了可用性、延迟、成本、迭代速度。
这个转变对开发者的职业生涯其实有很强的暗示。你写代码的能力决定你能不能入行,但你能不能在更大的系统里创造价值,取决于你能不能理解系统之间怎么咬合。一个人写了七万行,说明他有极强的单点穿透力;但让这个系统支撑起海量用户,靠的是完全另一套能力——拆分、治理、权衡、取舍。
我经常跟团队里的年轻人说一句话:代码写得多不是资本,能说清楚「为什么这么写」才是。前者会随着时间贬值,后者会随着经验升值。
4. 高薪传闻背后的定价逻辑
4.1 技术人的价格不按代码行数结算
每次这类新闻出来,评论区总会有人算:7万行,3亿年薪,一行代码值四千多块。这个算法看着有趣,但逻辑上是错的。
技术人的报酬从来不是按产出物计件的。真正被定价的是三样东西:决策的影响力、结果的不可替代性、以及承担的风险。一个人写了一万行代码但方向错了,价值是负的;一个人只写了一百行但定对了关键结构,价值可能是巨大的。这就是为什么架构师和普通开发者的薪资差距,远大于他们的代码量差距。
更具体一点说,一个技术负责人的价值通常体现在几个层面:他决定了资源往哪儿投,他判断了哪些事情不做,他在关键节点上承担了失败的责任。这些东西无法用行数衡量,也没法外包。
4.2 从「解决问题」到「定义问题」的那道坎
我观察过很多技术人的成长路径,大概能分成三个阶段。
第一阶段是「实现者」:给需求,写代码,能跑就行。这个阶段的核心能力是执行速度。第二阶段是「解决者」:给问题,自己找方案,能选出成本最低的路径。这个阶段的核心能力是判断力。第三阶段是「定义者」:自己发现什么问题值得解,什么方向该押注。这个阶段的核心能力是品位和视野。
绝大多数人卡在从第二阶段到第三阶段的跨越上。原因不复杂——前两个阶段有明确的反馈,代码能跑就是对的,方案能用就是对的;第三个阶段没有标准答案,你押错了半年之后才知道,而且往往没人告诉你错在哪。跨越这道坎,靠的不是多写代码,而是多看、多想、多复盘失败。
那个被反复传颂的故事,真正稀缺的部分可能就在这儿:一个人在早期阶段就承担了「定义问题」的角色,而不只是「实现问题」。这才是难以复制的。
4.3 面对薪酬传闻,怎么建立自己的判断
关于那个年薪数字,我的态度很简单:无法验证的数字,就不要当成事实去讨论。公开信息里能查到的往往是股权、期权这类长期权益的估值,和「年薪」不是一回事,把它们混在一起谈,很容易得出离谱的结论。
更重要的是,这类数字对普通从业者没有任何参考价值。你没法拿它当薪资谈判的依据,也没法拿它当努力目标。真正有用的是把它拆成可迁移的能力项:完整的产品判断、端到端的技术掌控、在资源极少时做出取舍的魄力。这些能力,在任何一家公司、任何一个岗位上都能练。
我给自己定的一个判断标准是:看到任何「某某人赚了多少」的信息,先问三个问题——数字来源是什么?统计口径是什么?这个人的具体贡献能不能拆解成可学习的东西?三个问题问完,大部分信息就自动降噪了。
5. 被「个人英雄叙事」带偏的三个误区
5.1 把代码行数当成能力刻度
这是最普遍、也最有害的一个误区。很多人会把「我今天写了八百行」当成某种成就,然后下意识地觉得写得越多越厉害。
但真实的工程世界里,行数是成本,不是产出。每一行代码都是一份维护负担,都需要被读、被改、被测试。写得少而准,比写得多而全要难得多。我见过最厉害的一次重构,是把一个两千行的模块压缩到三百行,功能一个没少,缺陷率反而降了。那才是真本事。
所以我现在评判代码的第一标准不是「能不能跑」,而是「半年后别人接手,能不能在半小时内看懂主干」。能,就是好代码;不能,行数再多也是负债。
5.2 把「一个人能全干」当成职业终点
第二个误区是把全栈能力当成终极目标,觉得什么都会写就是最强的状态。全栈当然是好事,尤其在早期阶段,它能让你一个人跑通完整链路,理解各层怎么配合。
但全栈不等于什么都自己干。到了一定规模,你的价值来自于「知道该找谁、该定什么标准、该在哪儿划边界」,而不是「自己亲手写完」。我自己也经历过这个转变,早期觉得让别人写不如自己写快,后来发现这想法在团队里是灾难——你成了瓶颈,团队反而变慢。
真正成熟的状态是:你有能力一个人干完,但你选择把合适的事交出去,并且能把标准说清楚。前者证明你懂,后者证明你能放大。
5.3 忽略时代窗口的不可复制性
第三个误区最隐蔽:把特定时间、特定条件下的成功,当成可以随时复现的路径。
十几年前的市场环境、竞争格局、设备条件、用户习惯,和今天完全是两个世界。当年一个精准的产品判断可能带来指数级回报,今天同样的判断大概率连水花都没有。不是能力退步了,是赛道拥挤了、门槛提高了、用户的注意力被瓜分干净了。
所以看这类故事,我的建议是只提取可迁移的部分,不复制具体路径。可迁移的是「如何在小资源下做出关键取舍」「如何快速验证一个假设」;不可复制的是「在那个时间点做那个选择」。把这个区分清楚,你看新闻的心态会平静很多。
6. 这些叙事能给普通开发者什么
6.1 用「一个人能跑通」来验证想法
我特别推荐每个开发者都保持一个习惯:手上永远有一个自己一个人能跑通的小项目。不用大,能解决你自己一个真实的小麻烦就行。
原因有三个。第一,它强制你走完整个链路,从想法到实现到上线,这个闭环经历一次,你对产品的理解会完全不一样。第二,它给你一个安全的试错空间,在这里犯错的成本是零。第三,它会持续提醒你「用户视角」是什么——你自己就是用户,好不好用你第一时间知道。
具体怎么做?我的建议是把范围压到两周内能出可用版本。超过两周,热情基本会耗光。功能只保留最核心的一个动作,界面能省就省,先让它跑起来,再想优化。
6.2 一个人写代码时最容易埋的三个坑
这些年我自己一个人做项目,踩过的坑不算少,挑三个最有代表性的说。
第一个坑是不写日志。一个人开发时觉得自己什么都记得,出了问题是靠猜。等过了两周再回来看,完全想不起当时为什么这么写。我的做法是:关键路径上一定留一条能定位问题的日志,宁多勿少,上线稳定后再精简。
第二个坑是没有边界校验。单人项目最容易省略输入校验,因为「我知道传什么」。但现实是,异常数据一定会来,可能来自网络抖动,可能来自用户乱点。缺失校验不会立刻出问题,而是等到某个深夜突然炸给你看。
第三个坑是不留撤退路线。改动大的时候不做备份、不做灰度、不做开关,一把梭改完直接上。这个习惯在小项目里侥幸能过,一旦项目有点规模,一次失败就把你打回原形。给任何有风险的改动加一个能一键关闭的开关,这个习惯救过我很多次。
6.3 在项目变大之前,先把「可交接」设计出来
一个人做项目最容易被忽略的一件事,是为未来的自己或别人留下接手路径。
具体做法不复杂。第一,把项目的启动方式、构建方式、部署方式写成一个文件放在根目录,任何接手的人照着做就能跑起来。第二,把核心的数据结构和模块职责用几句话说明白,不用写成完整文档,一段注释就行。第三,把「哪些地方是临时方案、哪些地方有已知问题」明确标出来,别让接手的人去猜。
这三件事加起来大概花不了两个小时,但能在关键时刻省下几天。我见过太多项目因为「只有一个人知道怎么跑」,最后不得不整体重做。代码是写给未来的,不是写给现在的——这句话听着老套,但在一个人做项目的时候尤其需要反复提醒自己。
说到底,那个「一个人几万行」的故事之所以被人反复讲,不是因为它证明了一个人能有多强,而是因为它刚好卡在一个特殊的时间窗口上——产品足够简单、工具足够原始、竞争足够稀疏,一个人恰好能覆盖全部复杂度。今天的环境早就不一样了,复杂度分布在了完全不同的地方。
我个人在实际项目里的体会是:别把「一个人能做完」当成目标,把它当成一种保底能力。真正该练的,是在资源极少的时候做出正确取舍,在复杂度上来之前把结构留好,在自己成为瓶颈之前主动拆开。这三点做到了,写不写那七万行,其实没那么重要。