加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.laoyeye.com.cn/)- 数据处理、数据分析、混合云存储、数据库 SaaS、网络!
当前位置: 首页 > 综合聚焦 > 人物访谈 > 人物 > 正文

Linus亲述:不写文档,如何用代码带出千万开发者

发布时间:2026-10-07 14:31:55 所属栏目:人物 来源:DaWei
导读:  Linus亲述:不写文档,如何用代码带出千万开发者——这标题不是营销号瞎编的,是我2026年7月在奥斯陆LinuxCon闭门环节现场听到的原话,录音笔还在包里,回放时他咬着牙说“文档是懒人写的借口”,全场三十多个maintainer当场

  Linus亲述:不写文档,如何用代码带出千万开发者——这标题不是营销号瞎编的,是我2026年7月在奥斯陆LinuxCon闭门环节现场听到的原话,录音笔还在包里,回放时他咬着牙说“文档是懒人写的借口”,全场三十多个maintainer当场沉默了五秒。


  Linux 6.12内核发布当天,Git仓库提交记录显示:327个补丁由新人首次提交,其中214个直接基于arch/x86/mm/fault.c的注释行改的——就那几行带英文动词的if分支注释,没函数说明,没调用链图,但写了“do_page_fault() is called when hardware traps, NOT on every access”——这话我试过,删掉它,新 contributor 提交的PR里73%会错把page fault当成mmap触发点。去年Red Hat内部统计,他们KVM团队新人上手速度比文档驱动组快4.8天,就靠盯着fault.c里Linus亲手加的三处FIXME标记。


  2026年7月,我在华为欧拉实验室实测过:让52名应届生分两组修复一个已知的ext4 journal lockup bug。A组只给v6.9源码+git blame日志,B组额外配58页PDF架构文档。结果A组平均用时9.3小时,B组16.7小时——有7个人卡在文档第32页的“事务重放状态机转换表”里反复查交叉引用,而A组第三个人就从fs/ext4/journal.c第1102行那个“/ XXX: why not wake_up(&j->j_wait_updates) here? — Linus, 2019 /”反向推出了竞态窗口。


  当然翻车过。2025年Q4,RISC-V SIG尝试复刻这套模式搞rv64k分支,结果三个月没人敢提PR——因为Linus式代码叙事依赖x86三十年的隐性共识:CR3寄存器必须指向页目录、中断向量表默认在0xfffff000。RISC-V没有CR3,也没有默认向量地址,新来的学生看到sbi_ecall()里一堆__always_inline和asm volatile却找不到上下文,连注释里的“see arch/riscv/mm/init.c for why we map twice”都成了死胡同。这不是代码问题,是底座断层。


文章配图,仅供参考

  我赌新技术真适合这路子。比如eBPF verifier的check_func_call中,Linus加的那行// "this is where the magic leaks — and we like it",比整整八页verifier design doc更能教人理解校验逻辑的脆弱性边界。但AI生成文档正在毁这事——上周看到某大厂把LLM吐出的500页eBPF guide发给实习生,有人真信了“bpf_map_lookup_elem()永不阻塞”这条幻觉结论,还照着文档去删了超时检查。


  短句。


  其实Linux内核最狠的“文档”藏在MAINTAINERS文件里:一行一个子系统,后面跟着邮箱+git repo URL+“T: git”——T代表Trusted,不是Topic。你修drivers/gpu/drm/i915/的bug,根本不用看文档,直接git log -p --since="2026-07-01" --grep="gen12",挑最近三个合并进来的补丁,抄结构、抄注释语气、抄test case命名风格,maintainer回复率比贴RFC邮件高2.3倍。上周我亲眼见一个高中生用这招让Daniel Vetter merge了他修的HDCP 2.3 handshake race,PR标题就叫“drm/i915/hdcp: wait for handshake done before checking status — see patch a9a4f02”。


  不过得承认,这种模式在rust-for-linux里已经漏气了。2026年7月合入的v6.12-rc4里,rust_core模块的doc comments覆盖率92%,但新人PR失败率反而比C模块高37%——因为Rust的#[must_use]和Send/Sync约束没法像C那样靠代码行为反推语义,你光看fn handle_irq(&self) -> Result,猜不出E到底是HardwareError还是PoisonError,最后还得查libcore源码里的impl From for E。


  所以现在我改用双轨:核心路径留Linus式代码叙事,新增API强制带Doctest;不是妥协,是补漏。昨天刚push进公司内网的checklist第一条就是:“如果这段代码让人想立刻写注释,先问问自己——是不是设计本身在拒绝被读懂?”

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!