site logo

Marico's space

我是如何审计任何应用技术架构的:12步CTO框架

算法解析 2026-06-26 20:57:28 5

最近帮人做技术尽调,遇到一个挺有意思的现象:很多公司的技术团队其实不清楚自己的系统到底"健康"到什么程度。你问他代码质量怎么样,他说"还行吧";问他数据库设计合理吗,他说"能跑";问他系统能扛住双十一吗,他说"应该可以吧"。

这种模糊的判断对企业决策来说是很危险的。我做技术审计这些年,逐渐摸索出一套12维度的评估框架,每个维度打分0-10,有对应的风险等级,最后汇总成一份有优先级的行动清单。这套框架帮我快速评估过物流系统、法律科技项目、政府SaaS等各种我之前完全没接触过的系统。

今天把这套框架完整展开说说。不是为了让你机械地打勾勾,而是作为思考系统整体健康度的一个思维模型。

为什么需要框架(以及框架的局限)

随意检查出来的就是随意的结果。你容易注意到自己熟悉的问题,忽略掉知识盲区,最后给出一份"个人看法清单"而不是客观评估。

打分框架的好处是强制覆盖。而且能生成一份非技术人员也能看懂的产物。CTO不需要关心你用Optional还是T | None,但他需要知道安全评分是4/10,以及三个发现属于OWASP Top 10级别漏洞。

但局限也要说清楚:分数只是起点,不是判决书。架构评分7/10但安全评分3/10的系统,比六个维度都是5/10的系统更危险。上下文很重要。框架告诉你该看什么,判断该怎么做还是得靠人。

12个评估维度

1. 整体架构

看代码之前,先问自己:这套系统的设计架构是什么?实际实现和设计意图一致吗?

关键区分点:

  • 单体 vs 微服务:这个选择是否适合团队规模和流量?五个人跑十二个微服务,是在给自己挖坑。
  • 分层架构 vs 整洁架构:业务逻辑和基础设施是否隔离?换数据库需要重写业务逻辑吗?
  • DDD对齐:代码里的限界上下文和实际业务域对得上吗?还是看了本书就把所有类名加上"Domain"?

真正要看的东西:耦合度。改一个地方会连锁影响到多少其他地方?高耦合是开发速度慢、缺陷率高的主要推手。

危险信号:模块间循环依赖、业务逻辑堆在controller/route handler里、两千行起步的上帝类、"系统做什么"和"怎么做"之间没有清晰的边界。

2. 后端

框架选型是场暗战。真正要问的是框架怎么被使用的。

我评估这几个方面:

  • SOLID原则:不是学术层面——职责划分是否让代码可测试、可修改?
  • 依赖注入:用了依赖注入吗?还是所有对象都在代码里new出来,导致测试必须依赖真实基础设施?
  • 异步架构:对IO密集型系统,是否全局使用异步?还是热路径里藏着阻塞调用?
  • 异常处理:错误在正确的层级被捕获了吗?"预期失败"(用户错误)和"非预期失败"(程序bug)的区分在代码里清晰吗?
  • 日志:看日志能独立排查线上故障吗?日志级别是有意义的,还是全堆INFO?

真正在找的东西:可测试性和可调试性。这是可维护性的代理指标。难以测试的代码就是难以安全地修改。

3. 前端

前端评审经常比后端粗糙。这是误区——前端是大多数用户可见bug的藏身之处,也是XSS等安全问题的发源地。

重点看这些:

  • 组件架构:展示组件和容器组件有清晰划分吗?组件粒度合理吗?
  • 状态管理:全局状态是否最小化?用状态管理库是因为真的需要,还是模板里带的?
  • 性能:首次交互时间、bundle大小、懒加载。一个静态页面为主的系统需要加载4MB JavaScript吗?
  • 无障碍:不用鼠标能用吗?ARIA属性有且有意义吗?

穿透噪音的问题:如果明天来个初级开发者,他能在10分钟内找到改UI的地方吗?

4. 数据库

Schema设计是技术债务凝固成永久形态的地方。烂Schema不会被修复——只会一直被绕过,永远。

我关注这些:

  • 规范化:有重复组吗?本该派生存储的数据是否冗余存储了?
  • 索引:外键没加索引吗?查询计划器真的在用你建的索引吗?(看执行计划,别猜。)
  • 查询模式:ORM使用中存在N+1查询吗?生产环境代码路径里有无限制的SELECT *吗?
  • 迁移策略:Schema变更通过迁移工具管理(Alembic、Flyway等)吗?迁移是版本控制、可回滚的吗?还是开发者在生产库直接跑ALTER TABLE
  • 备份恢复:上次测试备份是什么时候?"我们有备份"和"能从备份恢复"是两回事。

最难回答的问题:你们的RTO/RPO是多少?备份策略真的能满足这个目标吗?

5. API设计

设计良好的API是一份契约。烂API是个陷阱——坑前端开发者、坑集成方、坑未来的自己。

评估标准:

  • REST语义:HTTP动词用对了吗?GET是幂等的吗?DELETE返回正确的状态码吗?
  • 版本管理:变更响应格式前已经有版本策略了,还是到时候直接破坏客户端?
  • 错误处理:错误响应结构一致吗?400422500有意义区分还是随心情?
  • 限流:上线前就实现了限流,还是出了第一次滥用事件才开始加?
  • 分页:列表接口从第一天就分页了吗?SELECT * FROM events返回200万行是真的会发生的生产事故。

真正要找的东西:API传递的是意图,还是要求调用方了解实现细节?

6. 安全

安全评审这里我要放慢速度。安全漏掉的发现和"代码质量"漏掉的发现,后果完全不同。

我以OWASP Top 10为基准,再加上这些:

认证:凭证用现代算法哈希的吗(bcrypt、Argon2)?有账户锁定机制吗?密码重置安全实现了吗(限时token、一次性使用)?

授权:服务层做授权检查了吗,还是只在路由层?有没有横向权限提升的测试(用户A访问用户B的数据)?

注入:ORM参数绑定能防SQL注入吗——有没有地方用了字符串拼接?用户输入会被传到shell命令吗?

密钥管理:密钥放环境变量(勉强接受)还是硬编码/提交到代码库(不可接受)?.env.gitignore里吗?

传输安全:强制HTTPS吗?安全响应头有吗(CSP、HSTS、X-Frame-Options)?

找到最多真实漏洞的审计模式:追踪数据。选一条用户提交的数据,从HTTP请求一路跟到数据库再返回。沿途每个转换和校验点都可能是漏洞。

7. 性能

性能问题分两类:现在存在的,以及流量10倍时会出现的问题。

当前状态:

  • 正确的层级有缓存吗(内存、Redis、CDN)?
  • 图片优化了吗?静态资源前面有CDN吗?
  • API响应开了压缩吗(Gzip/Brotli)?

未来状态:

  • 10倍负载时的瓶颈在哪?数据库?应用服务器?还是有限流的第三方API?
  • 热路径里有同步操作可以移到队列吗?
  • 数据库是单副本吗?读流量大了会成为瓶颈吗?

每次评审必问的问题:系统里最慢的操作是什么?它在热路径上吗?

8. DevOps

DevOps是软件系统的运维边界。再完美的代码,手动部署到单台服务器也是脆弱的。代码再烂,有扎实的CI/CD、自动回滚、结构化日志,系统就是可控的。

重点看这些:

  • CI/CD:每次合并到main都自动测试部署吗?部署耗时多少?能5分钟内回滚吗?
  • 容器策略:容器是不可变的吗?镜像构建一次然后跨环境推进,还是每个阶段重建?
  • 环境一致性:预发和生产跑一样的基础设施吗?只在某个环境出的bug说明它们不一致。
  • 可观测性:回答"系统现在正常吗"需要手动查日志吗?有仪表盘和告警吗?
  • 故障响应:有手册吗?团队演练过故障响应吗,还是每次出事都是第一次?

9. 云基础设施

和应用级DevOps分开的云原生问题:

  • 扩展性:计算资源配置自动扩缩了吗?流量来了系统自动扛,还是需要人工介入?
  • 高可用:有单点故障吗?数据库有主从吗?应用跨可用区部署了吗?
  • 灾备:有经过测试的灾备方案吗?地域布局是怎样的?
  • 成本模型:资源规格合理吗?可预期的负载有预留实例吗?

暴露未审视假设的问题:主region宕机4小时怎么办?给我走一遍流程。

10. 测试

测试是唯一能提供证据(而非信心)证明系统正常运作的机制。

我评估这些:

  • 覆盖率:单元测试覆盖率多少?更重要的是:测的是对的东西吗(业务逻辑,不是getter/setter)?
  • 集成测试:有测真实数据库的测试吗,不是mock?mock和现实脱节的测试会引发生产事故。
  • 端到端测试:生产部署时跑冒烟测试套件吗?
  • 测试设计:测试隔离吗?有测试数据管理吗?测试失败是单一原因,还是缠绕了多个关注点?

覆盖率陷阱:测trivial代码达到85%覆盖率,不如关键路径40%覆盖率。覆盖率是代理指标。真正重要的是:你能放心地重构吗?

11. 代码质量

代码质量是成千上万个小决策积累出来的。我从结构层面评估:

  • 可读性:新工程师不用读依赖就能理解一个函数在做什么吗?
  • 命名:变量和函数名表达意图吗?有Hungarian notation、非关键场景用单字母、名字和实际行为矛盾的吗?
  • 模块化:模块大小合理吗?有5000行的文件吗?
  • 技术债务:有TODO考古层吗——三年前的注释引用一个已经不存在的工单?

真正在衡量什么:做一次修改需要的认知负荷。认知负荷高→开发慢→bug多→技术债务多。恶性循环。

12. AI就绪度

2026年了,AI就绪度是头等架构关注点。不是问"你们用AI了吗",而是"系统设计是否能随着AI能力演进集成AI"。

关键问题:

  • API优先设计:系统业务逻辑通过清晰API可访问吗?还是埋在单体流程里,AI Agent根本碰不到?
  • 事件驱动架构:重要状态变更有作为事件发出吗?AI Agent能对这些事件做出反应吗?
  • MCP兼容性:考虑过Model Context Protocol吗?AI Agent能通过结构化接口检查和操作你的系统数据吗?
  • RAG就绪:内容结构支持检索增强生成吗?有语义搜索能力或相关接口吗?
  • 数据质量:AI再好也受限于训练和检索数据。数据是结构化、干净、可访问的吗?

战略问题:18个月后,竞争对手会有能自动化你们用户30%手工操作的AI Agent。你们的架构让这个成为可能,还是根本不可能?

评分模型

每个维度0-10分:

分数 解读
9-10 最佳实践。没有有意义的改进空间。
7-8 稳健。小幅改进边际收益很低。
5-6 够用。有已知差距但无即时风险。
3-4 显著差距。3-6个月内需要改进。
1-2 严重缺陷。需要立即处理。
0 完全未实现。

从12个维度得分推导出综合指标:

  • 技术总分(0-100):加权平均,安全和可靠性权重更高
  • 生产就绪度(%):安全、DevOps、测试、可观测性得分的函数
  • 企业就绪度(%):在生产就绪度基础上加上合规态势、审计日志、多租户
  • AI就绪度:独立评分,战略重要性日益凸显

交付物

审计产出四份交付物:

1. 评分卡——12个分数、风险等级(低/中/高/严重)、每个维度一句话发现。

2. 关键问题——风险最高的10个发现,不分维度。这些是可能引发事故、导致数据泄露、或让融资尽调失败的事情。

3. 速赢清单——一周内能搞定、影响不成比例的变化。这些维持团队动能,早期就体现价值。

4. 路线图——中期(1-3个月)和长期(6-12个月)架构改进,粗略工时估算和业务论证。

最让人意外的是什么

和工程团队分享结果时,最让他们意外的发现在测试或数据库维度——不是他们至少会焦虑的安全维度。

具体来说:

  • 用mock数据库的集成测试:团队自信地说"我们有80%覆盖率",然后发现这些测试没有一个能抓到"在SQLite上能跑但PostgreSQL上挂掉"的查询。这是一个真实的事故模式。
  • 未迁移的Schema变更:表在生产库直接改了,但对应的迁移文件不存在。应用能跑,但从源码无法复现生产环境。
  • 缺失的复合索引:查询在当前数据量下表现正常。10倍数据量就超时了。没人发现,因为开发流程里没有性能测试。

关于判断力的说明

这套框架是结构化思考的工具,不是思考的替代品。

一个内部工具公司安全评分6/10,和支付公司安全评分6/10,是完全不同的处境。原型系统测试评分4/10可以接受;处理医疗记录的系统4/10是负债。

框架告诉你该看什么。和工程团队、和CTO、和业务负责人讨论,才能确定这意味着什么、该怎么做。

这部分没法自动化。