“7万行代码,一个人写完”——这句话在技术圈里流传的时间,比很多人入行的时间都长。每次有人提起,评论区基本分成两派:一派觉得这是神话,一个人怎么可能扛住一个中型系统的全部逻辑;另一派觉得这没什么稀奇,早期项目功能少、框架简单,堆也能堆出来。我个人的看法是,这两种声音都只看到了表面。真正值得琢磨的不是“7万行”这个数字本身,而是它背后那条几乎每个技术人都要面对的路径:从一个人能掌控全部上下文,到必须把上下文拆给一群人。这条路径上会发生什么、在哪个节点必然崩坏、崩坏之前能做哪些准备,才是这段故事里最有复用价值的部分。
这篇内容不聊八卦,也不做人物评价,只做技术侧的拆解。我会把“单人完成一个规模不小的系统”这件事拆成四层来看:代码量的真实含义、单兵作战的技术前提、团队化的临界点判断,以及最后落到实操层面——如果你现在手上正好有一个想一个人做完的项目,该怎么控制节奏、怎么埋接口、怎么避免把自己写进死胡同。不管你是刚入行两三年想独立做点东西的开发者,还是带团队几年、正在纠结要不要拆模块的技术负责人,应该都能从里面捞到点能直接用的东西。
1. 先把“7万行代码”这个数字翻译成人话
1.1 7万行在不同技术栈里的“含金量”完全不同
很多人拿代码行数(LOC)做横向比较,这其实是个很容易翻车的做法。同样7万行,在不同语言、不同编码风格下的实际信息量能差出两到三倍。
举个最直观的例子:一份包含大量头文件声明、宏定义、模板展开的C/C++工程,7万行里真正承载业务逻辑的可能只有三万多行,剩下的都是声明和胶水。而在动态语言里,7万行往往意味着更密集的逻辑密度——没有类型声明,没有接口样板,每一行都在干活。至于前端项目,如果把构建产物、依赖锁文件、自动生成的类型定义算进去,7万行可能连一个中等规模的业务模块都算不上。
所以看到任何“XX万行代码”的说法,第一反应应该是问三个问题:算不算依赖和生成代码?算不算注释和空行?是物理行还是逻辑行?这三个问题的答案不同,数字的实际分量能差一个数量级。
我自己的习惯是,评估一个项目真实规模时不用 LOC,用另外两个指标更靠谱:有效逻辑行(去掉声明、注释、空行、生成代码)和模块数。前者反映的是复杂度,后者反映的是结构复杂度。一个一万有效逻辑行但拆成三十个清晰模块的项目,理解成本通常低于五千有效逻辑行却糊在五个巨型文件里的项目。
提示:如果你在面试或者做技术分享时想引用“代码量”这个概念,最好把口径说清楚。含糊的“多少万行”在专业场合几乎一定会被追问细节,说不清楚反而减分。
1.2 一个人写完7万行,真正难的不是写,是“记得住”
写代码这件事本身,在熟练之后并不算高难度劳动。真正把人卡住的是另一件事:你需要同时在自己脑子里维护整个系统的状态。
认知科学里有个大致共识,人的工作记忆能同时稳定持有的“块”是有限的,量级在个位数。对应到软件工程上,就是那句老话:一个人能同时清晰掌握的模块数量大概也就七八个,再多就开始靠猜和靠翻代码了。
这就是单人开发中型系统最残酷的地方。第一个月,你写完用户模块,脑子里门儿清。第三个月,你写支付和消息投递,回头再改用户模块,就得先花二十分钟翻自己的代码找回上下文。第六个月,改一个字段名,你需要 grep 全项目,生怕漏掉某个三周前写的、已经忘了存在的调用点。
所以“一个人写7万行”这件事的真正门槛,不在于打字速度,而在于这个人是否建立了一套对抗遗忘的机制。这套机制通常是:极度一致的命名规范、极简的抽象层数、把所有“约定”都写进代码而不是记在脑子里、以及一套自己用得顺手到不用思考的目录结构。
我在实际项目里见过最有效的做法是把“约定”文档化到极致——不是写给人看的那种长篇设计文档,而是一份不超过两页的“项目约定清单”:目录怎么分、命名怎么起、错误怎么抛、日志怎么打、配置从哪读。这份东西自己写、自己看,但它的价值在于把心智负担从“记忆”转移到了“查阅”。
1.3 单人项目的代码结构,几乎必然长成一个样子
我观察过不少由单人从零写到几万行的项目,抛开语言和业务差异,它们的结构惊人地相似:
- 顶层目录少,通常三到五个,而且名字带有强烈的个人风格;
- 有一个“万能工具”文件,里面塞满了各种零散函数,越写越长,最后突破两千行;
- 业务逻辑和 IO 操作高度混合,一个函数里既查数据库又拼字符串还发通知;
- 配置项散落在代码各处,没有统一的读取入口;
- 错误处理以“能跑就行”为标准,异常要么吞掉要么统一抛到最外层;
- 注释只对作者本人有意义,比如“这里特殊处理一下”,但没说什么情况特殊。
这些特征不是缺点,而是单人开发的自然产物。因为在没有第二个人阅读你代码的前提下,抽象、分层、解耦这些动作的收益是延迟兑现的,而成本是立刻付出的。人天然会倾向于先解决眼前的问题。
理解这一点很重要——它解释了为什么很多“一个人写出来的系统”在初期迭代极快,却在接入第二个人之后迅速变得难以推进。不是代码质量突然变差了,而是之前被省掉的那些结构成本,开始集中兑付了。
2. 一个人扛下一个系统,需要哪些技术前提
2.1 早期选择单兵作战,其实是相当理性的决策
很多人事后复盘时会说“当初就应该直接上团队、上规范”,这话有点站着说话不腰疼。在一个需求还没定型、方向随时可能调整的早期阶段,单兵开发的效率优势是碾压性的。
算一笔很简单的账。沟通成本粗略可以用 n(n-1)/2 来估,两个人的时候只有一条沟通通道,五个人就是十条。每一次需求变更,单人的处理路径是“我想清楚→我改代码→我验证”,链路上没有信息损耗;五个人的处理路径是“需求方说→我理解→我传达给相关人→各自理解→各自改→对齐”,每一环都有衰减和偏差。
更要命的是,早期阶段最大的成本不是写代码,而是试错。试错的成本跟“改一次要多久”强相关。单人项目里,把一个做错的方向推倒重来,可能就是一个下午的事;在一个有接口约定、有联调、有发布流程的团队里,同样的推倒重来要走的流程能拖上一两周。
所以早期单兵不是“英雄主义”,是成本结构决定的理性选择。真正的问题不在于“该不该一个人做”,而在于“一个人做的窗口期有多长,什么时候必须切换”。
2.2 单兵开发的三个隐形约束:内存、心智、时间
我把单人开发的约束归成三类,这三类约束的到达时间不一样,但都会到。
内存约束,指的是你脑子里能同时装下的系统状态。这个约束大概在项目写到两万到三万有效逻辑行的时候开始明显吃紧,表现为:改 A 模块要先看 B 模块、开始频繁写出重复逻辑、开始出现“我记得这里处理过但找不到在哪”的情况。
心智约束,指的是架构一致性。一个人写代码,风格会随心情和时间漂移。前三个月喜欢用函数式,后三个月开始写类,再后来为了赶进度直接过程式糊上去。三种风格混在一个项目里,理解成本是叠加的。这个约束往往比内存约束更晚爆发,但破坏力更大,因为它污染的是全局结构。
时间约束,指的是迭代节奏。单人开发的吞吐量是有天花板的,大概在每天 200 到 500 行有效逻辑行(含调试和自测)这个量级,状态好的时候能翻倍,但不可持续。一旦需求增长速度超过这个吞吐量,项目就开始欠债,而欠的债只能靠加班或者砍功能来还。
这三条约束里,我认为最该警惕的是心智约束。因为它不像另外两个那样有明显症状——你不会因为架构风格混乱而突然写不出代码,你只会在某一天发现自己改一个小功能要动五个文件,然后骂一句“这代码谁写的”,再想起来是自己写的。
2.3 单兵作战必须提前埋好的四个“接口”
如果确定要一个人先把系统搭起来,有几样东西我建议从一开始就按“将来要换人”的标准来做。理由很实在:这四样东西的后期替换成本最高,而前期做对的成本最低。
第一是日志。不要用零散的打印语句,从第一天就引入结构化日志,字段固定(时间、级别、模块、请求标识、耗时)。单人阶段你可能觉得日志没用,因为出问题你直接调试就行。但等到线上出问题、你又不在电脑前的时候,日志就是唯一的信息源。结构化日志的迁移成本极高,因为它是嵌入式的,散落在每个函数里。
第二是配置。所有可变量——地址、开关、阈值、超时——必须从统一入口读取,不允许硬编码在业务代码里。这条规矩的价值在于,它让你在需要把系统部署到第二套环境时,不用全文搜索改代码。
第三是数据访问层。哪怕只有一个数据库,也要把 SQL 或者查询逻辑收敛到一个薄层里,不要散在业务代码中。原因是数据模型是变化最频繁的部分,收敛之后,一次字段调整只改一处。
第四是协议与序列化。客户端和服务端之间、模块和模块之间的数据结构,从一开始就定义清楚,并且版本化。单人阶段你可能直接传一个字典或者对象过去,省事。但只要涉及跨进程、跨版本,没有版本号的数据结构迟早会让你在灰度发布时痛不欲生。
下面是一个我常用的最小配置加载结构,不算优雅但足够稳:
# config.py —— 全项目唯一的配置入口 import os _DEFAULTS = { "db_url": "sqlite:///local.db", "request_timeout": 3.0, "feature_flags": {}, } def load(env: str = None) -> dict: env = env or os.getenv("APP_ENV", "dev") cfg = dict(_DEFAULTS) cfg.update(_read_env_file(f".env.{env}")) # 文件覆盖默认值 cfg.update(_read_os_env("APP_")) # 环境变量优先级最高 return cfg CONFIG = load()这段代码没什么技术含量,但它的意义在于:项目里任何地方需要配置,只有CONFIG一个来源。规矩一旦立住,后面加环境、加开关、做灰度,都是改一个文件的事。
注意:这四样东西不是让你一开始就做重。恰恰相反,要做得极薄——日志封装一个函数、配置就一个字典、数据访问就一个文件、协议就用最简单的 JSON 加一个 version 字段。重点是“有统一入口”,不是“做得完备”。
3. 从几万行到千万行,工程体系的临界点在哪
3.1 代码量增长的三个阶段,各自的崩坏点不一样
我把一个系统的代码规模增长粗略分成三个阶段,每个阶段的“崩坏点”完全不同,用错药会很痛苦。
| 阶段 | 有效逻辑行量级 | 主要矛盾 | 典型崩坏信号 | 该做的事 |
|---|---|---|---|---|
| 功能堆叠期 | 1 万行以内 | 需求不清、方向摇摆 | 反复重写同一模块 | 快速试错,别过度设计 |
| 结构分化期 | 1 万 ~ 10 万行 | 模块边界模糊、耦合上升 | 单文件超 2000 行、改一处动五处 | 抽模块、定边界、加测试 |
| 工程治理期 | 10 万行以上 | 协作成本、发布效率 | 构建超 10 分钟、新人上手超两周 | 拆服务/拆仓、建 CI、定规范 |
第一阶段最忌讳的是“提前架构”。在需求还没验证的时候搞分层、搞抽象、搞插件化,大概率是白干,因为方向一变全废。这个阶段唯一的目标是“用最短路径验证想法”。
第二阶段是绝大多数项目卡住的地方。这个阶段的问题不是“代码写不出来”,而是“代码写出来了但改不动”。典型症状是:你想加一个小功能,发现要动三个模块;你想改一个字段名,全项目搜出八十个引用点。这时候必须停下来做结构整理,而不是继续堆功能。
第三阶段的问题已经从代码转移到了流程。一个人或者十个人写十万行,代码本身的复杂度已经不是主要矛盾,主要矛盾变成“怎么让二十个人在同一个仓里不打架”。这个阶段要解决的是构建速度、依赖管理、发布流程、环境一致性这些工程问题。
关键判断是:你现在处在哪个阶段,就用哪个阶段的方法。用第三阶段的方法管第一阶段的项目,会把自己管死;用第一阶段的方法撑第三阶段的项目,会把自己拖死。这个判断失误在中小团队里极其常见。
3.2 团队化之后最先崩的,往往不是代码
很多人以为加人之后的问题是代码冲突,其实不是。代码冲突一天解决十次也不算什么,真正吃掉效率的是上下文丢失。
具体表现是这样的:新来的人接手一个模块,代码他能读懂,但他不知道“为什么这么写”。为什么这个字段要做成可空的?为什么这里要重试三次而不是五次?为什么这个接口要单独开一个超时?这些信息不在代码里,在原作者的脑子里。
于是每一次交接都变成一次考古。老成员被迫做大量口头解释,新成员在半懂不懂的状态下改代码,改出问题再回头问,形成循环。一个十人团队如果有三个人长期处于“上下文不全”的状态,整体效率能掉三成以上。
对抗这个问题的办法,行业内比较有效的有两类。一类是把决策记录(也就是常说的 ADR,架构决策记录)当成硬性流程,任何一次结构性改动都要留一段几百字的说明,写清楚背景、选项、选择和理由。另一类是降低单模块的信息密度,把大模块拆成“一个人能在一周内完全理解”的粒度。
我更倾向第二类。因为第一类依赖人的自觉,而人一忙就会跳过;第二类靠结构约束,不写也得写。拆到足够小之后,每个模块的“隐含知识”天然就少,交接成本自然下降。
3.3 判断“该不该把单兵拆成团队”的几个可量化信号
“感觉忙不过来了”是个很模糊的判断,容易导致过早扩张或者过晚拆分。我习惯用几个可以数的信号来判断,这些信号不需要精确统计,粗略观察就够用:
- 同一个源文件,一天之内被修改超过 3 次;
- 每周因为代码冲突产生的返工时间超过半天;
- 一次完整发布需要的人工步骤超过 10 个;
- 线上问题从发现到定位的平均时间超过 1 小时;
- 新人从入职到能独立提交一个不影响他人的改动,超过两周;
- 需求排期表里,超过 30% 的条目因为“依赖别人”而阻塞。
命中三条以上,基本可以确认:瓶颈已经从“写得慢”变成了“协作差”,这时候加人或拆模块的收益会明显大于成本。反过来,如果一条都没命中,就别急着招人——加人带来的沟通成本很可能大于产出增量,这个坑我见过太多次。
4. 关于“价值定价”:天价薪酬背后的技术逻辑
4.1 稀缺性定价:能被定价的从来不是“写了多少行”
网上讨论天价薪酬时,最常见的逻辑是“他写了多少行代码,所以值多少钱”,这个换算方式在工程上完全不成立。代码行数是过程指标,价值是结果指标,两者之间没有线性关系。
真正决定定价的是稀缺性,而稀缺性来自“能定义问题”和“能把问题落地”这两件事的叠加。会写代码的人很多,能在一个没人说得清需求的环境里,自己判断什么该做什么不该做、然后把判断变成可运行系统的人,数量会陡降一个数量级。再往上,能把一个系统从零带到亿级用户规模、并且在每个阶段都做出正确取舍的人,数量就更少了。
换句话说,定价定的是“在高度不确定的环境里持续做出正确决策的能力”,而不是“产出代码的速度”。这个逻辑对所有技术岗位都成立,只是量级不同。一个能独立负责一条业务线的工程师,和一个只能按需求文档实现功能的工程师,市场定价差距往往在三到五倍,原因就在这里。
4.2 别用代码行数换算薪资,这是个思维陷阱
我见过不少人在做职业规划时掉进这个坑:把自己写的代码量当成筹码,觉得“我写了十万行,凭什么不如他”。这个思路的危险之处在于,它会引导你去做那些“容易堆行数”的事——重复业务、复制粘贴、堆功能,而不是做那些“减少行数”的事——抽象、复用、删代码。
真正拉开差距的能力,往往体现为减少了多少代码而不是增加了多少。一个重构把三万行压到八千行,同时让新增功能从三天变成三小时,这个价值在行数指标上完全是负的,但业务价值极高。
所以如果你想给自己做能力盘点,别数行数,数这几个东西更实在:
| 能力维度 | 可观察的行为 | 为什么值钱 |
|---|---|---|
| 问题定义 | 能把模糊需求拆成明确的边界和验收条件 | 决定项目方向,错了全白干 |
| 取舍判断 | 能说清“为什么不做某个功能” | 直接决定资源投入效率 |
| 系统设计 | 能在需求变化时只改一处 | 决定长期迭代速度 |
| 故障处理 | 能在信息不全时快速缩小范围 | 直接对应线上损失 |
| 知识传递 | 能让别人在你的系统上独立工作 | 决定团队能否扩张 |
这五项里,前三项在简历上几乎无法量化,但在实际工作中的区分度极高。我个人的经验是,中高级工程师和普通工程师的分水岭基本就在“取舍判断”这一项上——前者敢说“这个不做”,后者只会说“这个能做,排期三天”。
4.3 普通开发者能迁移的三样东西
抛开薪酬这种不可复制的因素,那段“单人做完一个大系统”的经历里,真正可迁移的东西其实只有三样,而且每一件都能通过刻意练习获得。
第一样是“把模糊变具体”的能力。拿到一个“做一个内部工具”的需求,能自己问出关键问题:谁用、用多久、数据量多大、要不要权限、出问题谁负责。这些问题问完,需求基本就清晰了。练习方法很简单:每次接需求,强制自己写一页纸的“边界说明”,写不出来说明没想清楚。
第二样是“控制抽象层数”的能力。新手容易过度设计,老手容易不设计。合适的度是:抽象层数不超过三层,每一层都有明确的职责,且每一层单独拿出来都能被人看懂。判断标准很粗糙但有效——如果你要向别人解释这段代码,需要画图才能说清,那层数就太多了。
第三样是“在信息不全时推进”的能力。这条最难练,也最值钱。具体表现是:不因为“文档没写清楚”就停工,而是先做出一个可验证的最小版本,用它的结果去反向澄清需求。这件事的本质是把“等待信息”换成“生产信息”。
5. 实操:如果你也想一个人做完一个中型项目
5.1 立项之前先写三张表,能省掉后面一半的返工
一个人做项目最大的浪费不是写错代码,是方向错了之后的大量沉没成本。对抗这个的办法不是想得更久,而是把关键假设提前写下来,做成可检查的形式。我通常要求自己开工前写三张表,加起来不超过两页纸。
第一张:功能清单(含“不做清单”)。左列写要做的,右列写明确不做的。右列比左列重要得多——因为项目失控几乎都是从“顺手再加一个功能”开始的。写下不做清单,等于给自己设了一道需要主动跨过的门槛。
第二张:数据模型表。列出核心实体、关键字段、实体间关系。这张表决定后面所有的代码结构,值得多花两小时。经验法则是:实体数量控制在七个以内,超过七个通常说明你在把“流程”当“实体”。
第三张:风险表。列出三到五个“如果这个不成立,整个方案就废了”的假设,以及验证它的最小成本方式。比如“用户能接受每天同步一次数据”,验证方式是先手动跑一周看反馈,而不是先做自动同步。
提示:这三张表的价值不在于写得多完整,而在于写的过程会逼你把模糊的想法具体化。我做过对比,写表和直接开写,前者的返工率大概能低一半。
5.2 开发期的节奏控制:把时间当预算管,而不是当任务管
一个人做项目最容易犯的错是“按功能排期”,结果每个功能都超期,最后全线崩盘。更可控的方式是按时间预算管理,也就是每周固定投入多少小时,然后倒推能做完多少功能。
假设你每周能投入 20 小时(业余项目比较现实的数字),一个中型项目大概需要 400 到 600 小时,也就是 5 到 7 个月。这个数字听起来长,但它是真实的。任何声称“两个月做完”的计划,通常都漏算了调试、返工和收尾。
时间段怎么分配,我的经验比例是这样的:
| 阶段 | 占比 | 主要产出 | 常见误区 |
|---|---|---|---|
| 骨架搭建 | 15% | 目录、配置、日志、数据层 | 过度设计,一上来就分层 |
| 核心链路 | 40% | 一条能跑通的主流程 | 并行开发多个半成品 |
| 边缘功能 | 25% | 次要功能、异常处理 | 主流程没稳就铺开 |
| 收尾打磨 | 20% | 部署、监控、文档、自测 | 完全不留时间,直接上线 |
这个表里最容易被砍掉的是最后 20%,也是最能决定“项目能不能真的用起来”的部分。我吃过这个亏:功能全做完了,但部署脚本没写、日志没接、配置写死在代码里,结果第一次真正给别人用的时候,光是把环境跑起来就花了两天。
核心链路的推进方式我强烈建议串行而不是并行。一个人并行开发三个模块,结果是三个都是半成品,没有一个能验证。正确的做法是先打通一条最窄的端到端路径——哪怕它只支持一个用户、一个场景、硬编码几个参数——先让它跑起来,再横向扩展。跑通那一刻带来的确定性,比写三千行代码都值。
5.3 交付前的自查清单,比测试用例更早发现问题
项目做到能跑之后,最容易忽略的是“别人能不能用起来”。下面这份清单是我自己每次交付前必过的,不长,但每一条都对应过一次实际的翻车。
- 全新环境能不能一次跑起来。找一台没装过任何东西的机器(或者一个干净的容器),按文档走一遍。这一步能暴露 90% 的文档缺失和硬编码问题。
- 配置项是否全部外部化。全文搜索一下地址、端口、密钥,确认没有硬编码残留。
- 日志能否定位一次完整请求。随便找一个功能跑一次,看日志里能不能串起来这条链路的每一步。
- 出错时的表现是否可接受。主动制造几个错误(断网、空数据、超长输入),看系统是崩掉还是给出有意义的提示。
- 数据能不能恢复。备份和恢复流程实际跑一次,不要假设它能用。
- 有没有“关掉”的开关。任何一个可能出问题的外部依赖,都要有降级或者关闭的配置,而不是只能改代码重发。
这份清单里第一项和第六项,是我踩坑最多的。前者让我意识到“我本地能跑”和“别人能跑”之间隔着十条硬编码;后者让我在一次第三方服务故障时,只能干看着系统全线报错,因为没有任何降级路径。
6. 常见问题与踩坑实录
6.1 单人项目高频问题速查表
| 现象 | 大概率原因 | 排查方向 | 处理方式 |
|---|---|---|---|
| 改一个字段要动十几个文件 | 数据结构没有收敛 | 搜字段名的引用分布 | 抽数据访问层,逐步收敛 |
| 单个文件越来越长,打开就烦 | 业务和 IO 混在一起 | 看文件里有没有数据库/网络调用 | 按“纯逻辑 / 副作用”拆开 |
| 加功能越来越慢 | 缺少复用,重复逻辑多 | 找相似函数名和相似代码块 | 抽公共函数,先合并再抽象 |
| 线上问题和本地表现不一致 | 配置或环境差异 | 对比配置项、依赖版本 | 统一配置入口,锁依赖版本 |
| 改完 A 功能 B 功能坏了 | 缺少自动化验证 | 看有没有覆盖主链路的测试 | 至少补主流程的冒烟测试 |
| 自己都看不懂三个月前的代码 | 命名和注释失效 | 抽查几个核心函数 | 补“为什么”而不补“是什么” |
| 部署一次要半小时手工操作 | 流程没有脚本化 | 记录一次部署的全部手工步骤 | 逐步脚本化,先做一键构建 |
这张表里我特别想强调最后一条。手工部署的痛苦是会累积的——第一次部署花半小时你觉得还能接受,第十次的时候你会开始害怕发版,然后发版频率下降,然后每次发版的变更量变大,然后出问题的概率上升。这是一个非常典型的负向循环。打破它的唯一方式是尽早把手工步骤脚本化,哪怕一开始只是一个把所有命令串起来的 shell 脚本。
6.2 几个只有亲手写过才明白的坑
第一个坑:过早引入“通用”。写第二个相似功能的时候,人很容易想“干脆做个通用的”。结果通用版本为了覆盖两种场景,参数多了一倍,逻辑绕了三道弯,第三种场景来的时候发现还是不适配。我的经验是:同样的逻辑出现第三次再抽象。前两次就老老实实复制,复制带来的重复成本,远低于错误抽象带来的理解成本。
第二个坑:把注释当成文档。单人或小团队项目里,最常写的一类注释是“这里要注意一下”,但从来不写注意什么。三个月后你自己看,完全不知道当初在防什么。有效的注释只有一个标准:写清楚为什么这么写,而不是这段代码在干什么。后者代码本身就能表达,前者只有你知道。
第三个坑:忽略“删除”的成本。加功能的时候很爽,删功能的时候很痛。因为删除意味着要确认“没有任何地方还在依赖它”,而这个确认在没有测试覆盖的情况下,只能靠全文搜索加人工判断。这就是为什么我前面反复强调主链路的冒烟测试——它不只用来防 Bug,更重要的是给你“敢删代码”的信心。一个不敢删代码的项目,规模只会单向增长。
第四个坑:用加班解决吞吐量问题。单人项目的吞吐量有硬上限,加班能在短期内把上限抬高一点,但代价是错误率上升。而在一人项目里,一个错误可能需要三天来排查,这笔账怎么算都不划算。更理性的做法是砍范围——把功能清单里的“应该做”划掉一半,只留“必须做”。这件事心理上很难,但技术上永远正确。
第五个坑:把“能跑”当成“完成”。代码能跑通只是完成了六成,剩下的四成是:异常路径、日志、配置、部署、文档。这四成不做,项目就只能停留在“我自己的玩具”阶段,永远没法交给第二个人用。我见过太多做到八成然后停下的项目,原因几乎都是“核心功能做完了,剩下的没意思”。可恰恰是剩下的那部分,决定了它是不是一个真正的东西。
7. 最后聊几句个人体会
我自己带过几个从零开始的项目,也接手过别人写到一半的单人项目。最深的感受是:一个人能写多少行代码,其实不是能力的上限,而是上下文管理能力的体现。同一份七万行代码,有人写出来是一个能持续演进五年的系统,有人写出来是一坨三个月后自己都不敢碰的东西,差别不在技术栈,在于写的时候有没有为“未来的自己”和“将来的别人”留位置。
现在回头看,那些当初觉得“先这样,以后再说”的地方——硬编码的配置、复制粘贴的逻辑、没写的日志——基本上都在半年内以某种方式回来找过我。而那些当时多花了半天做对的地方,几乎全都省下了后面好几天的返工。
如果你手上正好有一个想一个人做完的东西,我的建议很朴素:先把不做清单写下来,先把日志和配置的入口留出来,先打通一条最窄的端到端路径,然后每周老老实实记一下实际投入的时间。做到这四件事,剩下的就是耐心问题了。