Appearance
本模块聚焦架构设计层面的核心面试题,涵盖高可用设计、技术选型、方案评估、落地推动、架构评审和技术债务治理。这些题目旨在考察候选人的系统性思维、架构决策能力和技术视野,是中高级工程师和架构师面试的重中之重。
Q1: 如何设计一个高可用系统? 「🔴 高级」
考察点:考察候选人的高可用设计能力和系统性思维。筛掉那些对高可用只有模糊概念、说不出具体手段和设计原则的候选人。高可用是分布式系统设计的核心课题,也是架构师的基本功。
参考答案:
高可用的核心思想:冗余 + 故障转移 + 故障隔离 + 降级兜底。目标是在故障不可避免的情况下,尽可能降低故障影响面和恢复时间。
衡量高可用的指标:
- 可用性 = 正常运行时间 / 总时间
- 99% → 年停机 3.65 天
- 99.9% → 年停机 8.76 小时
- 99.99% → 年停机 52.56 分钟
- 99.999% → 年停机 5.26 分钟
- RPO(Recovery Point Objective):灾难发生后,允许丢失多少数据
- RTO(Recovery Time Objective):灾难发生后,多久能恢复服务
高可用设计的六大维度:
1. 冗余设计(消除单点)
- 应用层冗余:无状态服务多实例部署,通过负载均衡分发流量。任何一个实例挂了,流量自动切到其他实例
- 数据层冗余:
- 数据库:主从复制、一主多从、MGR 集群
- 缓存:Redis 哨兵 / Redis Cluster
- MQ:多副本机制(Kafka 的 ISR、RocketMQ 的同步双写)
- 机房级冗余:
- 同城双活:两个机房同时提供服务,距离近(<100km),网络延迟低(<2ms)
- 异地多活:多个城市的机房同时提供服务,解决地域级故障,但数据一致性挑战大
- 异地灾备:平时不提供服务,故障时切换过去,RTO 较长
2. 故障转移(自动恢复)
- 健康检查:负载均衡/注册中心定期探活,不健康的实例自动摘除
- 自动故障转移:
- 数据库主从切换:MHA、Orchestrator、MGR 自动选主
- Redis 哨兵:主节点挂了自动从从节点中选新主
- K8s Pod 自愈:Pod 异常自动重启或重建
- 流量调度:
- 同城双活:一个机房故障,DNS/网关自动把流量切到另一个机房
- 多级容灾:实例级 → 机房级 → 城市级,逐层兜底
3. 故障隔离(防止级联)
- 物理隔离:核心业务和非核心业务部署在不同集群,互不影响
- 线程池隔离:不同接口用不同的线程池,防止慢接口耗尽线程拖垮整个服务
- 资源隔离:
- 数据库:读写分离,报表查询走从库/OLAP 库,不影响主库
- 缓存:热点数据隔离,防止缓存击穿雪崩
- 舱壁模式(Bulkhead):像船舱一样把系统分成多个独立的舱室,一个舱室进水不会导致整条船沉没
- 故障域划分:按地域、机房、可用区、机架划分故障域,避免单点故障扩散
4. 限流降级熔断(保护自己)
- 限流:超过系统承载能力的请求直接拒绝,保证系统不被打垮
- 算法:令牌桶、漏桶、滑动窗口
- 层级:网关限流、服务限流、接口限流
- 降级:非核心功能暂时关闭,保证核心功能可用
- 例如:大促时关闭商品推荐、评论查询,保下单和支付
- 熔断:下游服务故障时,暂时切断调用,防止故障向上游蔓延
- 状态机:关闭 → 打开 → 半开
- 常见框架:Sentinel、Hystrix、Resilience4j
5. 可观测性(快速发现和定位)
- 监控三支柱:
- Metrics(指标):系统健康度仪表盘,秒级告警
- Logging(日志):结构化日志,便于排查问题
- Tracing(链路追踪):分布式调用链,快速定位故障点
- 告警体系:多维度告警(业务指标 + 系统指标),分级告警(P0/P1/P2),告警收敛避免告警风暴
- 预案体系:常见故障有应急预案,定期演练,确保故障时从容应对
6. 混沌工程(主动验证)
- 思想:主动注入故障,验证系统的容错能力
- 常见故障注入:
- 应用层:杀实例、注入延迟、抛异常
- 基础设施层:断网、CPU 打满、磁盘满、主机宕机
- 数据层:主库挂了、从库延迟、缓存雪崩
- 目标:在故障真正发生之前,发现系统的脆弱点并修复
高可用设计的原则:
- 故障不可避免,接受失败:不要追求零故障,要追求故障发生时的快速恢复
- 最小化故障影响面:故障隔离比故障恢复更重要——一个模块挂了,别让整个系统都挂
- 自动化优先:能自动恢复的就不要人工介入,人是最不可靠的环节
- 定期演练:高可用方案不演练等于没有,谁也不知道真正出问题时能不能顶得住
- 权衡取舍:可用性越高,成本越高。要根据业务特点选择合适的可用性级别
追问延伸:
- 同城双活和异地多活有什么区别?各自的适用场景是什么?
- 你怎么设计限流算法?令牌桶和漏桶有什么区别?
- 熔断和降级有什么区别和联系?
- 混沌工程在你们团队是怎么落地的?遇到了什么阻力?
- 99.99% 的可用性需要做哪些事情?99.999% 呢?
- 你经历过的最严重的可用性故障是什么?从中学到了什么?
Q2: 做技术选型时你会考虑哪些因素? 「🔴 高级」
考察点:考察候选人的技术决策能力和架构视野。筛掉那些只会追热点、人云亦云、说不清楚选型理由的候选人。技术选型是架构师的核心职责之一,选型能力直接决定了系统的成败。
参考答案:
技术选型的本质是在约束条件下寻找最优解。没有最好的技术,只有最合适的技术。
技术选型的八大考量因素:
1. 功能匹配度(能不能解决问题)
- 核心功能是否满足需求?有没有明显的功能短板?
- 是完全匹配、部分匹配,还是需要二次开发?
- 未来可能的需求扩展,技术是否能支撑?
- 反例:为了用 Kafka 而用 Kafka,其实业务场景只需要一个简单的任务队列
2. 性能表现(能不能扛住压力)
- 在我们的场景下(数据量、并发量、延迟要求)性能是否达标?
- 性能瓶颈在哪里?上限是多少?
- 性能是线性扩展还是到某个点就上不去了?
- 注意:不要只看官方 benchmark,一定要结合自己的场景做压测验证
3. 可扩展性(未来能不能撑住)
- 水平扩展能力如何?加机器能不能线性提升性能?
- 数据量增长 10 倍、100 倍后怎么办?
- 功能扩展是否方便?二次开发成本高不高?
- 社区 roadmap 是否活跃?未来的发展方向是什么?
4. 可靠性与稳定性(生产环境敢不敢用)
- 有没有大厂生产环境的成功案例?
- 社区 issue 多不多?严重 bug 的修复速度怎么样?
- 数据可靠性如何?会不会丢数据?一致性保证是什么级别?
- 故障恢复机制是否完善?RPO、RTO 怎么样?
5. 社区生态与成熟度(生态好不好)
- 社区是否活跃?GitHub star 数、contributor 数量、release 频率
- 文档是否完善?中文资料多不多?
- 周边工具链是否完善?监控、运维、调试工具好不好用?
- 商业支持:出了问题有没有付费支持?
6. 团队熟悉度(团队能不能 hold 住)
- 团队有没有相关的技术储备和经验?
- 学习成本有多高?上手难度怎么样?
- 招聘难度如何?市场上人才多不多?
- 踩坑成本:出了问题团队能不能自己搞定,还是要依赖外部?
- 注意:这是很多人忽视但极其重要的一点。再好的技术,团队 hold 不住就是灾难
7. 运维成本(维护起来麻不麻烦)
- 部署复杂度怎么样?是一键部署还是需要一堆配置?
- 监控告警是否完善?需不需要自己搭?
- 日常运维操作(扩容、升级、迁移)难度如何?
- 有没有成熟的 K8s Operator 或云服务托管版本?
8. 成本因素(钱够不够)
- 直接成本:软件授权费、云服务费、硬件成本
- 人力成本:开发成本 + 运维成本 + 学习成本
- 机会成本:选型失误的返工成本、业务损失
- TCO(总拥有成本):不要只看采购成本,要看全生命周期的成本
技术选型的决策流程:
明确需求和约束 → 列出候选方案 → 多维度评估对比 → 原型验证/POC → 最终决策 → 小步落地选型中的常见误区:
- 追新逐热:什么技术火就用什么,不考虑是否适合自己的场景
- 过度设计:为了 1% 的可能性,引入了 100% 的复杂度
- 盲目跟风大厂:大厂用的不一定适合你,人家的规模和团队能力跟你不一样
- 只看技术不看人:忽略团队的学习成本和运维能力
- 没有 POC 就拍板:听别人说好用就直接上生产,踩坑了才后悔
追问延伸:
- 这些因素中,你最看重哪几个?为什么?
- 举一个你做过的技术选型案例,具体是怎么决策的?
- 如果团队里有人反对你的选型,你怎么说服他?
- 选型后发现不合适怎么办?有没有回退方案?
- 你做过最后悔的技术选型是什么?为什么?
- 自研和开源怎么选?什么情况下应该自研?
Q3: 如何评估一个技术方案的好坏? 「🔴 高级」
考察点:考察候选人的方案评审能力和技术判断力。筛掉那些只会"我觉得还行"、说不出评价标准和方法论的候选人。能不能客观、全面地评估一个技术方案,是高级工程师区别于中级工程师的重要标志。
参考答案:
评估技术方案没有绝对的好坏,只有是否适合当前的业务场景和约束条件。但有一些通用的评估维度可以帮助我们做出更理性的判断。
技术方案评估的八大维度:
1. 正确性(Correctness)
- 方案是否正确解决了问题?有没有遗漏的边界场景?
- 数据一致性是否满足要求?是强一致、最终一致还是弱一致?
- 有没有逻辑漏洞?异常情况是否考虑周全?
- 验证方式:单元测试、集成测试、故障注入测试、数学证明(对关键算法)
2. 性能(Performance)
- 吞吐量(QPS/TPS)是否满足要求?峰值能扛多少?
- 延迟(P50/P95/P99)是多少?是否满足 SLA?
- 资源利用率如何?CPU、内存、IO 的使用情况?
- 性能瓶颈在哪里?是否有优化空间?
- 验证方式:压测、性能 profiling、容量评估
3. 可维护性(Maintainability)
- 代码是否清晰易懂?新人上手需要多长时间?
- 模块划分是否合理?职责是否单一?依赖关系是否清晰?
- 是否有完善的文档和注释?
- 修改一个功能的成本有多高?会不会牵一发动全身?
- 可测试性如何?是否容易写单元测试?
4. 可扩展性(Scalability)
- 水平扩展能力:加机器能不能线性提升性能?
- 功能扩展能力:新增一个需求改动量大不大?
- 数据扩展能力:数据量增长 10 倍、100 倍后架构是否还能撑住?
- 注意区分:scale up(垂直扩展)vs scale out(水平扩展)
5. 可靠性与可用性(Reliability & Availability)
- 单点故障:有没有单点?挂了会怎么样?有没有自动故障转移?
- 故障影响面:一个模块挂了会不会导致整个系统不可用?
- 数据可靠性:会不会丢数据?有多少个 9 的可靠性保证?
- 降级预案:极端情况下能不能降级?降级后影响多大?
- 可观测性:出了问题能不能快速发现和定位?
6. 安全性(Security)
- 认证授权:身份验证是否可靠?权限控制是否合理?
- 数据安全:敏感数据是否加密?有没有数据泄露风险?
- 输入校验:有没有 SQL 注入、XSS、CSRF 等常见漏洞?
- 防攻击:能不能抵御 DDoS、暴力破解、爬虫等攻击?
- 合规性:是否符合法律法规(如 GDPR、等保)的要求?
7. 成本(Cost)
- 开发成本:需要多少人天?复杂度怎么样?
- 运维成本:部署、监控、日常维护的人力成本?
- 硬件/云资源成本:服务器、带宽、存储费用?
- 机会成本:做了这个方案,会不会耽误其他更重要的事情?
- 长期成本:技术债务、未来迁移成本?
8. 风险(Risk)
- 技术风险:技术是否成熟?有没有不可控的坑?团队能不能 hold 住?
- 进度风险:能不能按时交付?最大的不确定性在哪里?
- 依赖风险:依赖的外部服务/组件是否可靠?挂了怎么办?
- 人员风险:核心人员离职后会不会出问题?
- 合规风险:有没有法律、政策层面的风险?
评估方法:加权评分法
给每个维度赋予权重(根据业务场景确定),然后对每个方案打分,最后加权求和,得分最高的胜出。
示例:
维度 权重 方案A得分 方案B得分 正确性 20% 9 8 性能 20% 7 9 可维护性 15% 8 6 可扩展性 15% 9 7 可靠性 15% 8 8 成本 10% 6 9 风险 5% 7 6 加权总分 100% 8.0 7.75
评估的核心原则:
- 没有完美的方案,只有权衡取舍:每个方案都有优缺点,关键是看哪些对你最重要
- 用数据说话,不要拍脑袋:性能要压测,成本要估算,风险要识别
- 考虑长期,不要只看眼前:短期最优不一定长期最优,要考虑技术债务和演进成本
- ROI 思维:投入产出比最高的方案才是好方案,不是技术最牛的方案
- 警惕过度设计:为了不存在的需求引入复杂度,是架构设计的大忌
追问延伸:
- 这些维度中,如果只能选三个,你选哪三个?为什么?
- 两个方案各有优劣,一个性能好但复杂度高,一个简单但性能一般,你怎么选?
- 怎么评估方案的风险?有没有什么方法论?
- 你评审过最糟糕的方案是什么样的?问题出在哪?
- 方案评审中,你和别人意见不一致怎么办?
- 怎么判断一个方案是不是过度设计?
Q4: 如何推动一个技术方案在团队中落地? 「🔴 高级」
考察点:考察候选人的推动力、影响力和跨团队协作能力。筛掉那些只会写方案、不会落地,或者只会自己闷头干、不会带团队一起做的候选人。技术方案的落地能力,是高级工程师走向技术管理/架构师的关键一步。
参考答案:
好的方案只是成功的一半,落地才是真正的考验。技术方案的落地不仅是技术问题,更是人的问题。
推动落地的六步法:
第一步:达成共识(Why)
- 找对人:先搞定关键决策者(技术负责人、业务负责人),再争取核心开发者的支持
- 讲清楚价值:用对方听得懂的语言讲价值
- 跟业务方讲:提升用户体验、降低故障率、支撑未来业务增长
- 跟技术负责人讲:降低技术债务、提升研发效率、提升系统稳定性
- 跟开发同学讲:减少加班、降低维护成本、学习新技术、提升个人能力
- 数据驱动:用数据和事实说话,而不是"我觉得"。"现在每次大促都出故障,损失 X 万"比"系统太烂了要重构"有说服力得多
- 争取盟友:找到团队中有影响力的人,先说服他们,让他们帮你一起推动
第二步:小步验证(Prototype / POC)
- 不要一上来就大动干戈:先做一个小范围的原型验证,证明方案的可行性和价值
- POC 的目标:
- 验证技术方案的可行性
- 拿到性能数据、收益数据,增强说服力
- 踩坑,提前发现风险和问题
- POC 的原则:快、小、聚焦。花最少的时间验证最核心的假设
- 用结果说话:POC 成功后,拿着数据去说服反对者,效果比空口说白话好 10 倍
第三步:制定计划(Plan)
- 拆分阶段:把大目标拆成小目标,每个阶段都有明确的产出和里程碑
- 第一阶段:核心功能落地,验证基本可行性
- 第二阶段:完善功能,扩大覆盖范围
- 第三阶段:全面推广,沉淀最佳实践
- 风险识别与应对:提前识别可能的风险,制定应对预案
- 技术风险:xxx 技术可能有坑 → 先做 POC 验证
- 人员风险:核心开发可能离职 → 做好知识传递,文档齐全
- 进度风险:可能延期 → 设置缓冲时间,优先保证核心功能
- 资源协调:需要多少人、多少时间、什么支持,提前说清楚
第四步:逐步落地(Execute)
- 灰度推进:
- 先切 1% 流量 → 10% → 50% → 100%
- 先在一个业务线落地 → 推广到其他业务线
- 灰度过程中密切关注监控数据,有问题及时回滚
- 快速迭代:不要追求一步到位,先跑通核心流程,再逐步完善
- 及时同步:
- 定期同步进度和成果,让所有人看到进展
- 遇到问题及时暴露,不要捂着,越早暴露越好解决
- 阶段性成果要及时庆祝,增强团队信心
第五步:文档沉淀(Document)
- 设计文档:方案设计、架构图、接口定义、数据模型
- 使用文档:接入指南、最佳实践、常见问题
- 运维文档:部署手册、监控告警、故障排查指南
- 复盘文档:过程中踩过的坑、总结的经验、改进的方向
- 文档不是一次性的,要持续维护和更新
第六步:培训赋能(Enable)
- 技术分享:做内部分享,让大家理解方案的设计思想和使用方法
- Code Review:通过 CR 帮大家理解和掌握新的技术方案
- 一对一带教:对核心成员进行一对一辅导,快速培养种子用户
- 示例代码:提供完善的示例代码和脚手架,降低接入成本
- 目的:让方案从"你的方案"变成"大家的方案",从"你推动"变成"大家主动用"
推动落地中的常见阻力与应对:
| 阻力类型 | 典型表现 | 应对策略 |
|---|---|---|
| 认知阻力 | "现在不也挺好的吗,为什么要改?" | 用数据和事实说话,展示痛点和收益 |
| 利益阻力 | "改了之后我的工作更多了" | 找到共赢点,让对方看到对他的好处 |
| 能力阻力 | "这个我不会,学起来太麻烦" | 降低门槛,提供培训、文档、示例代码 |
| 信任阻力 | "你这方案靠谱吗?别搞砸了" | 先做 POC 验证,用结果建立信任 |
| 优先级阻力 | "业务需求太忙了,没时间搞这个" | 把技术方案和业务目标绑定,争取排期 |
推动落地的核心心法:
- 价值驱动,不是技术驱动:永远从业务价值和用户价值出发,而不是从"技术很酷"出发
- 小步快跑,持续验证:不要憋大招,快速交付价值,建立信任,再扩大战果
- 换位思考,找到共赢:站在对方的角度想问题,找到对方的利益点
- 先上车后补票:有些事情先做起来,做出成绩了自然有人支持
- 功成不必在我:真正的领导力不是你自己厉害,而是让团队变得厉害
追问延伸:
- 你推动过最成功的技术方案是什么?具体怎么推动的?
- 推动过程中遇到的最大阻力是什么?怎么克服的?
- 如果领导不支持你的方案,你怎么办?
- 怎么判断一个技术方案该不该推动?会不会出现"为了推动而推动"的情况?
- 你觉得技术影响力和技术实力哪个更重要?为什么?
- 有没有推动失败的经历?为什么失败?从中学到了什么?
Q5: 架构评审你会关注哪些要点? 「🔴 高级」
考察点:考察候选人的架构治理能力和全局视野。筛掉那些只关注代码实现、不关心系统整体设计、说不出架构评审方法论的候选人。架构评审能力是架构师的核心技能之一,能看出一个人的技术成熟度和系统性思维。
参考答案:
架构评审的目的不是挑错,而是提前发现风险、统一认知、提升质量。好的架构评审应该是建设性的,而不是批判性的。
架构评审的十大关注要点:
1. 设计原则与基本理念
- 是否遵循了业界公认的设计原则?(SOLID、DRY、KISS、YAGNI...)
- 设计理念是否清晰一致?还是东拼西凑、想到哪做到哪?
- 有没有过度设计?为了不存在的需求引入了不必要的复杂度?
- 有没有设计不足?该考虑的扩展性没有考虑,后期要推倒重来?
- 核心判断:简单的方案能不能解决问题?如果能,就不要用复杂的
2. 边界划分与职责定义
- 模块/服务的边界划分是否合理?职责是否清晰?
- 有没有"上帝模块"?一个模块什么都干,职责严重过载
- 有没有"碎片模块"?拆得太细,每个模块都没什么逻辑,徒增调用成本
- 依赖关系是否合理?有没有循环依赖、反向依赖?
- 核心判断:高内聚、低耦合做到了吗?
3. 数据设计
- 数据模型设计是否合理?表结构、字段类型、索引设计是否得当?
- 数据量预估是否准确?有没有考虑数据增长后的扩展性?(分库分表、冷热分离)
- 数据一致性如何保证?是强一致、最终一致还是弱一致?是否符合业务需求?
- 数据安全是否考虑到了?敏感数据加密、数据备份、灾备方案?
- 数据迁移方案是否可行?历史数据怎么迁?会不会影响线上服务?
4. 接口设计
- 接口定义是否清晰?命名是否易懂?语义是否明确?
- 接口是否兼容?新增字段会不会影响老版本?
- 幂等性如何保证?重复调用会不会出问题?
- 错误码设计是否规范?调用方能不能根据错误码正确处理?
- 接口性能是否达标?有没有性能瓶颈?
- 核心判断:接口是不是正交的?有没有冗余?好不好用?
5. 可观测性
- 监控是否完善?关键指标有没有覆盖?(业务指标 + 系统指标)
- 日志是否规范?有没有结构化?排查问题方不方便?
- 链路追踪是否接入?能不能快速定位故障点?
- 告警策略是否合理?有没有告警风暴?会不会漏告警?
- 核心判断:出了问题能不能在 5 分钟内发现、10 分钟内定位?
6. 可靠性与高可用
- 有没有单点故障?单点挂了会怎么样?
- 故障转移机制是什么?自动的还是手动的?需要多长时间?
- 限流、降级、熔断有没有设计?降级预案是否完善?
- 数据可靠性如何保证?会不会丢数据?RPO 是多少?
- 灾备方案是什么?同城双活还是异地多活?RTO 是多少?
- 核心判断:最坏情况是什么?能不能扛得住?
7. 安全性
- 认证授权是否合理?有没有越权访问的风险?
- 输入校验是否严格?有没有 SQL 注入、XSS 等常见漏洞?
- 敏感数据是否加密存储和传输?
- 有没有防刷、防爬、防攻击的机制?
- 合规性是否满足要求?(等保、GDPR、数据安全法等)
8. 性能与容量
- 性能目标是否明确?(QPS、延迟、并发数)
- 有没有做容量评估?现有资源能不能扛住峰值?
- 性能瓶颈在哪里?有没有优化方案?
- 扩展性如何?流量翻倍后怎么应对?
- 有没有压测计划?怎么验证性能达标?
9. 运维与可部署性
- 部署方案是什么?是 K8s 还是物理机?蓝绿/金丝雀/滚动发布?
- 回滚方案是什么?出问题了能不能快速回滚?
- 配置怎么管理?有没有配置中心?配置变更怎么管控?
- 日常运维操作有哪些?有没有自动化工具?
- 运维成本高不高?需不需要专人维护?
10. 风险与成本
- 技术风险:有没有引入团队不熟悉的技术?有没有不可控的坑?
- 进度风险:排期是否合理?最大的不确定性在哪里?
- 依赖风险:依赖的外部服务/组件是否可靠?
- 人力成本:需要投入多少人?开发周期多长?
- 运维成本:服务器费用、带宽费用、人力成本?
- 机会成本:做了这个,会不会耽误其他更重要的事情?
架构评审的流程建议:
- 提前发材料:评审前 1-2 天发出设计文档,让大家有时间消化
- 控制时长:单次评审不要超过 2 小时,时间太长效率低
- 先讲背景:先讲清楚为什么做、目标是什么,再讲方案
- 聚焦重点:不要陷入细节讨论,架构评审关注架构层面的问题,代码细节留到 CR
- 记录结论:评审结束要有明确的结论(通过 / 有条件通过 / 不通过)和 action item
- 跟踪落地:评审中提出的问题要有专人跟进,确保闭环
追问延伸:
- 这些要点中,你觉得最重要的是哪几个?为什么?
- 你经历过最糟糕的架构评审是什么样的?
- 架构评审中,你怎么看待"过度设计"和"设计不足"?怎么把握度?
- 如果评审时大家意见不一致,你怎么拍板?
- 有没有"事后评审"?上线后效果不好会不会复盘?
- 你觉得架构评审应该由谁来主持?技术负责人还是架构师?
Q6: 如何治理系统的技术债务? 「⭐ 专家」
考察点:考察候选人的技术管理能力、长期规划能力和战略视野。筛掉那些只会埋头写代码、不会从全局视角管理技术资产的候选人。技术债务治理是技术负责人/技术管理者的核心职责,体现的是对技术团队长期价值的思考。
参考答案:
技术债务治理不是一个技术问题,而是一个管理问题。它的本质是在短期业务价值和长期技术健康之间找到平衡。
技术债务治理的完整框架:识别 → 量化 → 排序 → 计划 → 执行 → 融入 → 文化
第一步:识别与分类(摸清家底)
技术债务的四大类:
- 代码级债务:坏味道代码、重复代码、命名混乱、缺少注释、圈复杂度过高
- 架构级债务:模块边界模糊、依赖混乱、分层不合理、技术选型过时
- 工程实践债务:缺少测试、CI/CD 不完善、代码评审不严格、文档缺失
- 基础设施债务:监控告警不完善、部署流程繁琐、运维效率低、安全漏洞
识别方法:
- 静态代码扫描:用 SonarQube 等工具自动扫描代码质量问题
- 架构梳理:定期梳理系统架构图、依赖关系图,发现不合理的地方
- 团队访谈:和一线开发聊聊,他们最清楚哪里"烂"
- 故障复盘:从线上故障反推技术债,每次故障背后往往都有技术债的影子
- 技术债登记:建立技术债清单(可用 Jira/飞书表格),一条一条记录在案
第二步:量化评估(让债务看得见)
技术债之所以容易被忽视,是因为它的成本是隐性的。量化就是把隐性成本显性化。
量化维度:
- 影响范围:影响多少个模块?多少个团队?
- 严重程度:会不会导致线上故障?会不会拖慢研发效率?
- 修复成本:修复需要多少人天?风险有多大?
- 增长趋势:是越来越严重,还是基本稳定?
量化方法示例:
- 代码质量分:用 SonarQube 的质量分作为量化指标
- bug 率:某个模块的线上 bug 数量 / 代码行数
- 需求交付周期:某个模块的平均需求开发时长
- 故障数量:由技术债导致的线上故障占比
- 研发感受:定期问卷调研团队的"技术债痛苦指数"
第三步:优先级排序(先还哪些债)
优先级评估矩阵:
影响大
│
高优先级 │ 最高优先级
(先放放) │ (马上就干)
│
影响小 ───────┼─────── 修复成本
│
低优先级 │ 中优先级
(不用管) │ (有空再做)
│
影响小- 最高优先级:影响大 + 修复成本低 → 马上就干,立竿见影
- 高优先级:影响大 + 修复成本高 → 立专项,排期做
- 中优先级:影响小 + 修复成本低 → 顺手做了,童子军规则
- 低优先级:影响小 + 修复成本高 → 暂时放着,观察变化
排序原则:
- 安全债优先:有安全漏洞的先修
- 稳定性债优先:经常导致线上故障的先修
- 效率债其次:严重拖慢研发效率的
- 质量债最后:代码风格、命名之类的,可以慢慢来
第四步:制定偿还计划(怎么还)
偿还策略:
专项偿还:大的技术债(架构重构、系统重写)单独立项,争取独立排期
- 适用:影响面大、修复成本高的"大债"
- 关键:要和业务方达成共识,讲清楚收益和风险
迭代偿还:每个迭代预留 20% 的时间还技术债
- 适用:中等规模的技术债
- 关键:要制度化,不能"业务一忙就砍掉"
童子军规则:每次改代码时顺手优化一下周围的代码
- 适用:小的技术债(命名、注释、小的重构)
- 关键:养成习惯,积少成多
新老隔离:新代码用新规范老标准,老代码逐步替换
- 适用:历史包袱重的系统
- 关键:控制增量,逐步消化存量
第五步:融入日常(让还债成为常态)
技术债务不能靠运动式治理,必须融入日常研发流程。
- 代码评审:CR 不仅要审逻辑对不对,还要审设计合不合理、有没有引入新的技术债
- 技术方案评审:重大功能上线前必须评方案,从源头避免架构债
- 质量门禁:CI 流水线加代码质量检查、覆盖率检查、安全扫描,不达标不让合并
- 定期盘点:每季度做一次技术债盘点,更新清单,调整计划
- 度量跟踪:把技术债指标纳入团队度量体系,定期 review
第六步:文化建设(从"要我还"到"我要还")
- 树立正确的质量观:技术债不是"技术人的自嗨",而是和业务效率、产品质量直接相关的
- 认可技术债工作:还技术债也是产出,要和做业务需求一样得到认可和激励
- 建立技术自豪感:优秀的代码和架构是技术人的脸面,鼓励大家追求卓越
- 容错机制:重构出问题不可怕,可怕的是没人敢重构。建立合理的容错机制,鼓励大家积极还债
技术债务治理的核心认知:
- 技术债务是必然存在的:不要追求零技术债,那是不现实的。关键是可控、可管理
- 技术债务不全是坏事:有时候为了抢占市场窗口期,适当举债是合理的。关键是要有意识地举债,而不是稀里糊涂欠了一堆债
- 技术债务的本质是选择权:今天的快速交付换来了明天的灵活性损失。值不值,要看业务价值
- 治理技术债务是技术负责人的责任:不能指望一线开发自己主动去还债,必须从制度和文化层面去推动
追问延伸:
- 你怎么说服业务方花时间还技术债?毕竟技术债不直接产生业务价值
- 技术债务和敏捷开发的关系是什么?敏捷是不是意味着更多的技术债?
- 怎么衡量技术债务治理的效果?有没有什么 KPI?
- 技术债务无限增长会怎么样?有没有临界点?
- 你见过技术债务最严重的系统是什么样的?最后怎么解决的?
- 作为技术负责人,你怎么平衡业务交付和技术债务治理?
- 有没有"良性债务"?怎么判断技术债是良性的还是恶性的?