加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.028zz.com.cn/)- 高性能计算、基础存储、混合云网络、云安全、数据计算!
当前位置: 首页 > 访谈 > 正文

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

发布时间:2026-10-08 11:28:07 所属栏目:访谈 来源:DaWei
导读:  三个月之前,我盯着 Linux 6.12 内核源码里 drivers/gpu/drm/amd/display/dc/core/dc_resource.c 的 372 行——那里有个没注释的 switch 分支,case 0x1e 是什么?查 commit log 发现是 2023 年 9 月 14 日 Linus 在凌

  三个月之前,我盯着 Linux 6.12 内核源码里 drivers/gpu/drm/amd/display/dc/core/dc_resource.c 的 372 行——那里有个没注释的 switch 分支,case 0x1e 是什么?查 commit log 发现是 2023 年 9 月 14 日 Linus 在凌晨 3:17(UTC)推的补丁,消息只写了“fix dp dsc timing on RV2”。我翻了 17 个相关 PR,全在 patch 上直接写调试过程:git bisect 指向 3b8f5a1,用 drm_dbg_state() 打印了 4.2 秒延迟后发现 clock_gate_enable 早于 phy_reset。没人写文档。但那天晚上,GitHub 上有 237 个 fork 新增了带 printf 的临时分支,其中 41 个 PR 最终被合入主线——它们的标题全是 “dc_resource: add debug for DSC timing (Linus-style)”。


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


  这事儿真不是玄学。Linux 5.18 合并窗口期间,drivers/net/ethernet/intel/ice/ice_main.c 的 ice_vsi_setup 函数被重写了三次,每次改动都附带一个“broken in v5.17”的标签和具体崩溃栈地址(比如 RIP: ice_vsi_setup+0x41a/0x6c0),但函数头注释栏空着。我试过按常规方式加文档——2022 年底提交过一份 RFC 文档草稿,结果被 maintainers 集体忽略;三个月后我把它改成了一个测试用例 ice_test_vsi_setup_edge_cases.c,立刻收到 3 封邮件要求合并到 tools/testing/selftests/drivers/net/ice/。他们说:“这个比 man page 看得懂。”


  Git blame 显示,2021 年 8 月 22 日 Linus 在 fs/ext4/inode.c 第 4102 行把 / TODO: handle encryption flag / 改成 / no encryption here — ever /,然后删掉整段预留代码。这不是懒,是暴力收敛:他拒绝为未发生的需求预留接口。对比之下,2019 年 Btrfs 团队写的 btrfs_docs.txt ——足足 82 页,但 2023 年 audit 发现其中 63% 的示例命令已失效,连 mount -o compress=zstd 的参数位置都错了。最讽刺的是,Btrfs 用户群组 2023 年 Q3 投票显示,78% 的人首选看 tools/btrfs/btrfs.c 的 main 函数调用链来学新功能。


  去年十一月我给内核新手讲内存管理,直接打开 mm/mmap.c,挑第 1281 行 do_mmap 的 if (len > TASK_SIZE_MAX - addr) 判断,让所有人猜这个 TASK_SIZE_MAX 是多少。有人查 include/asm-generic/memory_model.h,有人翻 ARCH_ARM64 的 head.S,最后发现 x86_64 是 0x00007fffffffffff 而 arm64 是 0xffff000000000000——两个值差 16 个数量级。没人去读 Documentation/vm/overcommit-accounting.rst,因为那个文件最后更新是 2017 年 4 月 3 日,而 do_mmap 实际行为在 2022 年就因 MAP_SYNC 引入彻底重构。代码跑起来才作数。


文章配图,仅供参考

  失败案例?WebAssembly 的 WASI 接口文档项目就是典型。WASI Core API 规范写满 287 页,每个函数配 JSON Schema、Rust Binding 和 C binding 对照表,结果两年间只有 3 个非基金会成员提交 PR。反观 Rust 的 std::fs::OpenOptions,它的文档就一行“// See https://github.com/rust-lang/rust/blob/master/library/std/src/fs.rs#L78-L135”,点进去全是实打实的 match self.mode {} 分支,连注释都懒得加——可它偏偏成了 WebAssembly 生态最常 copy-paste 的样板代码。我不信文档能教人怎么处理并发 open,但 23 行代码里的 .read() + .await 组合,谁看了都能改出自己的异步 fs 模块。


  新技术。


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


  这话听着刺耳?可你知道吗,Rust 的 rust-analyzer 插件自动生成文档功能,上线首周就关闭了——因为所有用户反馈都说“生成的 doc 字数太多,不如直接跳转到 impl 块看 trait method 签名”。我现在自己写工具库,宁可留十个 panic!("TODO: fix race on reinit"),也不写一段“本模块保证线程安全”废话。上个月在 XDP eBPF 开发中,我把 bpf_map_lookup_elem 的返回值强制解包,编译报错时 clang 输出的 error message 里自动带上了 map 声明语句和键类型尺寸——这比任何手册都准。当然,代价是刚入行的人看到 -122 errno 直接懵圈,这个局限我认。下次我想试试,在 GitHub PR template 里强制要求每项改动必须附一个能通过的 test case,而不是描述“该修复逻辑缺陷”——哪怕 test 只有一行 assert_eq!(parse_config(""), Err(ParseError::Empty))。

(编辑:站长网)

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