Code Maps

如何评估

地图上的每个数字都来自一条你可以读到的公式。下面把它们画出来。

从仓库到城市

四步,全部在你自己的机器上完成。

在本地版本中,除了聊天,没有任何东西离开你的机器。

一栋建筑的解剖

一个装着代码的目录。九件事一眼就能看出来。

3 1 11 19 1 2 3 4 5 6 7 8 9
  1. 1红色桅杆 — 热点
  2. 2高度 = 复杂度:1.5 + 1.1 × √复杂度
  3. 3台阶 高度超过 11 和 19 个单位时出现
  4. 4立面颜色 = 当前视角
  5. 5宽度 = √文件数
  6. 6 漏洞与配置问题,取其中最严重一条的颜色
  7. 7 疑似密钥 — 具体的值永远不会显示
  8. 8屋顶 = 街区颜色
  9. 9心跳 = 存在严重级问题

“复杂度”数的是什么

每个文件里的决策点数量,再按目录求和。一个快速的启发式,不是完整的圈复杂度。

export function settle(orders, rates) {  let total = 0;   (const order of orders) {     (!order.paid  order.voided) continue;    const rate = rates[order.currency];     (order.items.length  rate) {      const item = order.items.pop();      switch (item.kind) {         'refund': total -= price(item, rate); break;         'fee':    total += fee(item, rate);   break;      }      try { audit(item); }  (e) { report(e); }    }  }  return total;}

8这个文件里的决策点

目录把其中所有文件的分值相加

  • settle.js8
  • invoice.js14
  • tax.js5

billing/27

建筑高度7.21.5 + 1.1 × √27

点击一个决策点把它去掉,就像你简化了代码一样,看看塔楼如何变矮。

switchtry 不计入,只数 if for while case catch && ||

问题从哪里来

三台仪器。两台是通用工具,第三台只是几条规则,背后没有任何工具。

  • Trivy

    读取锁文件与清单(npm、yarn、pnpm、pip、poetry、go.mod、Cargo、pom、gradle),Java 还会扫已构建的 jar,以及 Dockerfile、compose、Kubernetes 和 Terraform。

    产出漏洞配置问题。严重级别沿用 Trivy 的判定。

  • gitleaks

    读取工作区文件,使用默认规则集。

    产出疑似密钥,目前一律按高危计:尚未区分“很可能”和“存疑”,这会抬高风险值。只保留规则名和文件:行号

  • 技术债规则

    读取所有源码文件,加上 git 里的 commit 次数。

    产出TODO/FIXME/HACK/XXX = 低 · 超过 500 行 = 中 · 每行超过 0.25 个分支且文件超过 50 行 = 中 · 热点(commit 数 × 复杂度排在仓库前 5%)= 高。

  • SARIF 报告

    读取你放进 .codemap/.sarif 文件:Snyk、Semgrep、CodeQL、ESLint、Checkov,以及任何能导出 SARIF 2.1.0 的工具。

    产出security-severity:算漏洞(≥ 9 严重,≥ 7 高,≥ 4 中)。不带:算技术债error 为中,其余为低。工具中已抑制的结果不会进入。

四个严重级别

  • 严重

热点

每个点都是 expressjs/express 的一个真实目录:越靠右,最近 12 个月改动越多;越靠上,逻辑越多。两者乘积最高的 5 % 会得到一根红色桅杆。

1101001101001000 稳定且简单 改得多但简单 复杂但很安静 改动频繁且复杂:bug 就住在这里 前 5 % 的分界线 examples/auth · 1 × 17 test/acceptance · 1 × 14 examples/route-middleware · 1 × 6 examples/search · 1 × 6 examples/ejs · 1 × 3 lib · 15 × 287 test · 16 × 247 libtestexamples/auth commit(改动) 复杂度
  • 一个目录(一栋建筑)。悬停可查看是哪一个。
  • 热点:地图上的红色桅杆,以及一条高级别技术债发现。
  • 分界线:提交数 × 复杂度为常数。坐标轴为对数,所以它是一条直线。

一栋建筑的风险

权重

站在建筑上的每一条问题都加上自己的权重,加起来就是风险。

从风险到颜色

取对数:一条严重问题就已经看得出来,一百条也不会饱和。

1 条高 = 5 → 0.41 1 条严重 = 10 → 0.55 10 个密钥 = 50 → 0.89 04080 01 风险

实时评级

这些滑块直接喂给产品自己的评分函数 —— 和控制台导入的是同一个模块。动手拖一拖。

问题数量

真实仓库:

react/react 实际上有 215 条严重和 1,124 条高危,已经超出滑块上限。安全扣分无论如何都封顶在 50,所以评级不变。

50
200
300
4
488
751,838

检查报告

得分: 47 / 100 · 评级: D

47满分 100

分数去哪了

  • 起点100
  • 安全 −50.0上限 50
  • 密钥 −0.8上限 20
  • 技术债 −1.9上限 30

分级标尺

A ≥ 90 · B ≥ 75 · C ≥ 60 · D ≥ 40 · E 更低。

四种视角

同一座城市,四个数值,一条渐变。每种视角都归一化到 0–1,再给立面上色。

  • 风险

    决定先修哪一个。

    无发现严重

    log(1 + 风险) / log(81)对数曲线:一个严重问题就能看出来,一百个也不会饱和。

  • 债务

    安排重构,看清哪个街区正在腐烂。

    0 小时16 小时以上

    小时 / 1616 小时约等于两个工作日:超过就是全红。

  • 脉搏

    分清活代码和睡着的代码。又睡着又有风险,是最危险的组合。

    一年前今天

    1 − 天数 / 365今天改过 = 1;一年没动 = 0。

  • 流量

    找出整个团队天天都要走的那条主干道。

    0 次提交最繁忙

    提交数 / max(提交数)相对于仓库里最繁忙的那栋建筑。

同样的八栋建筑,由每种透镜分别上色。

地面热力每栋建筑都把自己的数值辐射到地面。街区底板的颜色来自 mean × 1.3peak × 0.5

街区与连线

一条路径怎么变成街区

连线

billing model api stripe 引用 被引用

外部依赖包会被忽略:只有能在仓库内解析到的 import 才会变成连线。

诚实的局限

  • 评级是用来横向比较和排优先级的启发式,不是标准。
  • 复杂度只是关键字计数,不是真正的圈复杂度。
  • 密钥扫描会把文档和测试里的示例也标出来。
  • 没有锁文件或构建产物时,就不会有依赖相关的问题。
  • 在你的机器上没有方案限制;只有一个可调整的技术上限:每个仓库 10k 个文件。在 Cloud 中,规模取决于方案。
  • 脉动和流量只看最近 12 个月的 git 历史。没有历史的克隆会让它们为空,地图会提示。
  • 评级阈值尚未用仓库语料校准:适合比较同一份代码的两个版本,不适合比较两家公司。

去看源码 有问题找我们