Skip to content

第二百零四章:代码审查

飞升期

涉及内核源码:

林小源顺着邮件之海的洋流漂到了一片被金色光网覆盖的海域。光网上悬挂着无数补丁,每一条补丁旁边都有几位修士在仔细端详,时而摇头,时而点头,时而在补丁上写下自己的意见。

一位身穿紫袍的审查者注意到了林小源。她的眼睛像鹰一样锐利,手中的笔在空中划出一道道光弧,每一道光弧落在补丁上,都化作一行审查意见。

"你来了,"紫袍审查者头也不抬,"想往内核提交代码?先学会审查别人的代码。"

她从光网上取下一个补丁,递给林小源。补丁上已经布满了审查意见:第四十二行有人批注"这里应该检查返回值",第五十八行有人批注"变量命名不够清晰",第七十三行有人批注"这个函数太长了,建议拆分"。

"审查不是挑刺,"紫袍审查者终于抬起头,目光直视林小源,"审查是帮助提交者写出更好的代码。你要检查正确性——边界条件、错误处理;检查风格——是否符合编码规范;检查性能——有没有不必要的开销;检查安全——有没有漏洞。"

c
/*
 * 代码审查:
 *
 * 审查内容:
 *   1. 正确性 — 代码是否正确
 *   2. 风格 — 是否符合编码规范
 *   3. 性能 — 是否有性能问题
 *   4. 安全 — 是否有安全漏洞
 *   5. 可维护性 — 是否容易理解
 *
 * 审查回复:
 *   Reviewed-by: 表示审查通过
 *   Acked-by: 表示同意
 *   Nacked-by: 表示反对
 *   Tested-by: 表示测试通过
 *
 * 审查流程:
 *   1. 提交补丁
 *   2. 审查者审查
 *   3. 修改补丁
 *   4. 再次审查
 *   5. 维护者合并
 *
 * 审查礼仪:
 *   尊重作者
 *   具体建议
 *   解释原因
 */

/* 模拟审查意见 */
struct review_comment {
    char reviewer[64];
    int line;
    char comment[256];
    char suggestion[256];
};

void print_comment(struct review_comment *c) {
    printf("审查者: %s\n", c->reviewer);
    printf("行 %d: %s\n", c->line, c->comment);
    if (c->suggestion[0])
        printf("建议: %s\n", c->suggestion);
}

printf("=== 代码审查 — 内核的质量保障 ===\n\n");

printf("代码审查是内核质量的保障:\n\n");

/* 示例审查意见 */
struct review_comment comments[] = {
    {"张三", 42, "这里应该检查返回值", "if (ret < 0) return ret;"},
    {"李四", 58, "变量命名不够清晰", "把 i 改为 index"},
    {"王五", 73, "这个函数太长了", "拆分成子函数"},
};

int n = sizeof(comments) / sizeof(comments[0]);

printf("--- 审查意见示例 ---\n");
for (int i = 0; i < n; i++) {
    print_comment(&comments[i]);
    printf("\n");
}

printf("--- 审查内容 ---\n");
printf("1. 正确性:\n");
printf("   代码是否正确\n");
printf("   边界条件\n");
printf("   错误处理\n\n");
printf("2. 风格:\n");
printf("   是否符合编码规范\n\n");
printf("3. 性能:\n");
printf("   是否有性能问题\n\n");
printf("4. 安全:\n");
printf("   是否有安全漏洞\n\n");
printf("5. 可维护性:\n");
printf("   是否容易理解\n\n");

printf("--- 审查回复 ---\n");
printf("Reviewed-by:\n");
printf("  表示审查通过\n\n");
printf("Acked-by:\n");
printf("  表示同意\n\n");
printf("Nacked-by:\n");
printf("  表示反对\n\n");
printf("Tested-by:\n");
printf("  表示测试通过\n\n");

printf("--- 审查流程 ---\n");
printf("1. 提交补丁\n");
printf("2. 审查者审查\n");
printf("3. 修改补丁\n");
printf("4. 再次审查\n");
printf("5. 维护者合并\n\n");

printf("--- 审查礼仪 ---\n");
printf("尊重作者:\n");
printf("  不要人身攻击\n");
printf("  对事不对人\n\n");
printf("具体建议:\n");
printf("  不要说\"这不好\"\n");
printf("  要说\"这应该改成...\"\n\n");
printf("解释原因:\n");
printf("  不要说\"不要这样做\"\n");
printf("  要说\"不要这样做,因为...\"\n");

紫袍审查者带林小源走到光网的另一侧,那里悬挂着一些已经被撕碎的补丁——它们的提交者在审查中与审查者发生了激烈的争吵,最终补丁被废弃。

"审查是技术讨论,不是人身攻击,"紫袍审查者的语气变得严肃,"我见过太多因为态度问题而夭折的好补丁。审查者说'这代码有问题',提交者觉得被冒犯,回一封愤怒的邮件,审查者也愤怒了,整个讨论变成骂战。"

她从地上捡起一块碎片,上面还残留着一行被划掉的文字——"你根本不懂这个子系统"。

"这种话在内核社区没有立足之地,"紫袍审查者将碎片扔掉,"你要说'这里应该改成这样,因为……'。具体建议,解释原因,对事不对人。尊重是协作的基础,没有尊重,代码再好也进不了内核。"

林小源看着那些破碎的补丁,心中警醒:技术能力是入场券,但态度决定了你能走多远。

紫袍审查者从袖中取出四枚徽章,依次摆在林小源面前。每一枚徽章上都刻着不同的符号,散发着不同颜色的光芒。

"这些是审查回复的标签,"她指着第一枚金色徽章,"Reviewed-by——审查者仔细审查了代码,认为它是正确的。这不是随便给的,审查者要对代码负责。"

她拿起第二枚蓝色徽章:"Acked-by——表示同意,通常来自相关子系统的维护者。它说'我不反对这个改动'。"

第三枚徽章是红色的,散发着警告的气息:"Nacked-by——表示反对。如果维护者给了 Nacked-by,这个补丁就不会被合并。"

最后一枚是绿色的:"Tested-by——有人实际运行了这个补丁,确认它能工作,没有引入回归。"

紫袍审查者将四枚徽章串成一条链,递给林小源:"这些标签不是装饰,是历史记录。十年后有人想知道这个改动是否经过审查,翻到补丁上的 Reviewed-by 就知道了。每一个标签都是一个承诺。"


道藏笔记

内核启示

代码审查是内核质量的保障。

审查内容:

  • 正确性 — 代码是否正确
  • 风格 — 编码规范
  • 性能 — 性能问题
  • 安全 — 安全漏洞
  • 可维护性 — 容易理解

审查回复:

  • Reviewed-by — 审查通过
  • Acked-by — 同意
  • Nacked-by — 反对
  • Tested-by — 测试通过

审查礼仪:

  • 尊重作者
  • 具体建议
  • 解释原因

代码审查是保障——让代码经得起检验。


破关试炼

代码审查之试

哪一个审查回复标签表示审查者仔细审查并认可代码?

答对后才能继续滑动和进入下一章。

以修仙之名,悟内核之道