如何评估
地图上的每个数字都来自一条你可以读到的公式。下面把它们画出来。
从仓库到城市
四步,全部在你自己的机器上完成。
- 仓库本地目录,或一次 clone。
- 读取目录、行数、分支、git 历史、import。
- 本地扫描Trivy · gitleaks · 技术债规则。
- 城市 + 报告建筑、街区、问题,还有一个评级。
在本地版本中,除了聊天,没有任何东西离开你的机器。
一栋建筑的解剖
一个装着代码的目录。九件事一眼就能看出来。
- 1红色桅杆 — 热点
- 2高度 = 复杂度:
1.5 + 1.1 × √复杂度 - 3台阶 高度超过 11 和 19 个单位时出现
- 4立面颜色 = 当前视角
- 5宽度 =
√文件数 - 6● 漏洞与配置问题,取其中最严重一条的颜色
- 7◆ 疑似密钥 — 具体的值永远不会显示
- 8屋顶 = 街区颜色
- 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
点击一个决策点把它去掉,就像你简化了代码一样,看看塔楼如何变矮。
switch 和 try 不计入,只数 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 % 会得到一根红色桅杆。
- 一个目录(一栋建筑)。悬停可查看是哪一个。
- 热点:地图上的红色桅杆,以及一条高级别技术债发现。
- 分界线:提交数 × 复杂度为常数。坐标轴为对数,所以它是一条直线。
一栋建筑的风险
权重
站在建筑上的每一条问题都加上自己的权重,加起来就是风险。
- 严重10
- 热点6
- 高5
- 中2
- 低1
- 每条技术债0.2
从风险到颜色
取对数:一条严重问题就已经看得出来,一百条也不会饱和。
实时评级
这些滑块直接喂给产品自己的评分函数 —— 和控制台导入的是同一个模块。动手拖一拖。
检查报告
得分: 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.3 与 peak × 0.5。
街区与连线
一条路径怎么变成街区
-
1
srcmainjavacomacmebillingservice
先去掉填充目录:
src main java kotlin lib test。 - 2 comacmebillingservice 如果一个街区装下了超过一半的建筑,就再往下拆一层。
- 3 billing 街区。
连线
外部依赖包会被忽略:只有能在仓库内解析到的 import 才会变成连线。