我们组是怎么靠代码规范工具活下来的

Rebase迷路人
2025-12-22 08:09
阅读 1852

去年双11前两周,我们实验室负责的电商平台后端服务突然在线上崩了。排查半天,发现是一个实习生手滑把 if (user != null) 写成了 if (user = null) —— 没错,赋值号代替了判等。虽然 Git 提交记录清清楚楚写着“修复用户登录逻辑”,但没人 review 出来。当时我盯着日志看了半小时,差点想把 MacBook 合上直接跑路。

这事之后,导师在组会上拍桌子:“再这么搞,项目验收直接挂!” 作为已经在实验室干了快两年的研二老油条,我被迫接下“整顿代码规范”的烂摊子。毕竟,全组就我一个人坚持用 Mac 写代码(Windows 只拿来测兼容性),平时还总叨叨什么“可读性”、“可维护性”——这锅不背谁背?

于是,就有了这篇血泪交织的 开发心得技术分享


别人写代码,我们写规则

一开始我以为就是加个 ESLint 就完事了。天真!我们组五个人,三个前端两个后端,技术栈横跨 Vue3、React、Node.js、Spring Boot,还有个玄学 Python 脚本天天跑数据清洗。每个人写代码风格千奇百怪:有人喜欢分号结尾,有人坚决不用;有人缩进用两个空格,有人偏爱 Tab;更别提命名规范了,“userName”、“user_name”、“usrName” 全齐了。

我试过手动 Code Review,结果每次 PR 都像在考古。上周五晚上十点,我还被叫去改一个“看似没问题但跑不通”的接口,最后发现是某人把 async/await.then() 混着用,Promise 链断裂了。那一刻我真的想把键盘扔出窗户。

所以,光靠人肉检查?不可能。我们必须让机器替我们“骂人”。


选型:不是越强越好,而是能落地才好

我调研了一圈主流工具:

  • ESLint / Prettier:前端标配,没得说
  • Stylelint:CSS/SCSS 规范,虽然我们用 Tailwind 多,但 legacy 代码里还有不少原生样式
  • Checkstyle / SpotBugs:Java 后端用,但配置复杂到劝退
  • Ruff:Python 的新秀,速度快得离谱,比 flake8 快 100 倍

但光有工具不够,关键是怎么让大家愿意用。我们组有个铁律:不能增加开发负担。如果每次提交都要手动跑一堆命令,第二天肯定被删干净。

于是我搞了个“三步走”策略:

  1. 本地开发自动格式化(保存即修复)
  2. Git 提交前强制检查(pre-commit hook)
  3. CI 流水线兜底拦截(GitHub Actions)

这样,日常写代码无感,提交时自动修,真有人绕过本地检查,CI 也会把他打回来。产品经理催进度时,我们还能甩锅给“流水线卡住了” 😏


实战:从混乱到秩序的关键配置

下面是我们最终落地的核心配置,全是踩坑后调出来的。

前端:ESLint + Prettier + Husky

先装依赖(我们用 pnpm):

pnpm add -D eslint prettier lint-staged husky

然后 .eslintrc.js 这样配(重点来了):

module.exports = {
  extends: [
    '@vue/typescript/recommended', // 我们用 Vue3 + TS
    'plugin:prettier/recommended'  // 让 Prettier 接管格式
  ],
  rules: {
    // 关闭一些太严格或影响开发体验的规则
    '@typescript-eslint/no-explicit-any': 'off', // 紧急情况允许 any
    'prettier/prettier': ['error', { semi: false, singleQuote: true }],
    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
  }
}

再配 package.json 里的 lint-staged:

{
  "lint-staged": {
    "*.{js,ts,vue}": ["eslint --fix", "prettier --write"]
  },
  "scripts": {
    "prepare": "husky install"
  }
}

运行 pnpm prepare,Husky 自动装好。下次 git commit,只检查你改的文件,快得飞起。

后端:Spotless for Java(比 Checkstyle 友好多了)

Gradle 项目里加 plugin:

plugins {
    id 'com.diffplug.spotless' version '6.25.0'
}

spotless {
    java {
        googleJavaFormat() // 用 Google 风格,简单粗暴
        removeUnusedImports()
        trimTrailingWhitespace()
        endWithNewline()
    }
}

然后在 CI 里加一步:

- name: Check code format
  run: ./gradlew spotlessCheck

谁要是提交了不符合格式的代码,直接失败。测试同学再也不用吐槽“你们 Java 代码缩进像心电图”了。

Python:Ruff + ruff-format

Python 组的同学原本用 black + flake8,慢得要死。我安利 Ruff 后,他们惊了:

# pyproject.toml
[tool.ruff]
select = ["E", "W", "F", "I", "N"] # 错误、警告、未定义、import 规范等
ignore = ["E501"] # 忽略行长度,我们用 VS Code 自动换行

[tool.ruff.format]
quote-style = "double"
indent-style = "space"

本地开发时,VS Code 装 Ruff 插件,保存自动格式化。CI 里一行命令搞定:

ruff check . && ruff format --check .

效果:从“天天救火”到“稳如老狗”

推行三个月后,效果立竿见影:

指标 推行前 推行后
PR 平均 review 时间 45 分钟 18 分钟
因格式/低级错误导致的返工 每周 3~5 次 几乎为 0
新人上手速度 1~2 周 2~3 天

最爽的是,现在 Code Review 终于能 focus 在业务逻辑架构设计上,而不是“你这变量名能不能别叫 a1、a2?”。

上周导师还夸我:“你们组代码现在看起来像一个团队写的。” 我表面谦虚,心里狂喜——终于不用半夜被叫起来修 ===== 的锅了!


一点真心话

说实话,搞代码规范工具不是为了“炫技”,而是为了活得久一点。程序员最宝贵的是注意力,别让它浪费在低级错误和风格争论上。

当然,工具只是手段,团队共识才是核心。我们组每周留 15 分钟开“规范小会”,讨论要不要加新规则、要不要放宽某条限制。比如最近大家一致同意允许在调试时用 console.log,只要上线前删掉就行——毕竟,人不是机器。

最后送大家一句我在 GitHub 上看到的话:

“Code is read far more often than it is written.”

你今天偷懒省下的那几秒,可能就是明天同事(或者未来的你自己)加班两小时的源头。

所以,别犹豫了。今晚就回去给你项目加个 ESLint 吧。
毕竟,规范不是束缚,而是自由的边界

(写完这篇,我得赶紧去 fix 一个因为没跑 prettier 被 CI 打回来的 PR……)

评论 0

最热最新
暂无评论
Rebase迷路人Lv.1
0
影响力
0
文章
0
粉丝