ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用工程师思维化解技术分歧:假设清单与决策记录

用工程师思维化解技术分歧:假设清单与决策记录 1. 冲突为什么总在“解决方案”层面爆发先承认大部分分歧不是技术问题1.1 常见的三件事方案、排期、责任边界做软件这行久了你会发现团队里真正让人头疼的往往不是线上故障而是那些开不完的评审会。两个工程师为了接口到底用 RESTful 还是 RPC 争了一个下午两个产品经理为了一个按钮放左上角还是右上角互不相让两个测试为了某个用例算不算 P0 吵到要拉主管。这些场景每一天都在不同公司重复发生它们表面上都是“技术问题”或“业务问题”但如果你把对话全过程录音回放大概率会发现一个尴尬的事实双方争到后半段早就不是在讨论最初那个方案了而是在争“谁对谁错”“谁更资深”“谁的方案看起来更高级”。我参与过的评审会至少有几百场有一段时间我自己也是那种“意见不合就火力全开”的人。后来踩的坑多了才慢慢意识到一件事意见冲突之所以难以收场是因为绝大多数人把力气花在了“说服对方”上而不是花在“把问题定义清楚”上。工程师思维恰恰提供了另一条路——它不教你怎么赢它教你怎么把一团乱麻的争议拆成几根能单独处理的线然后逐根解决。这也是为什么我越来越觉得与其把工程师思维当成编码技能不如把它当成一种“通用共识算法”。在展开这个方法之前值得先说清楚工程师日常遇到的冲突绝大多数发生在三个层面。第一个是方案层面比如“这个模块应该拆成三个服务还是一个服务”这种冲突通常涉及架构风格、可维护性、团队熟悉度。第二个是排期层面比如“这个功能到底要三天还是三周”它的核心变量是估算、风险、历史经验。第三个是责任边界层面比如“线上出了问题到底算数据组还是服务端组”它背后是考核、权责和团队分工。有意思的是大部分冲突表面上是第一个层面实际上常常混合了后面两个。如果不先把层析开就会发生一种很常见的情况一个人在讲架构理想另一个人在讲下周要上线两个人说的都是对的但根本不在一个频道上。1.2 一个反直觉的判断技术分歧背后往往是目标分歧很多年前我带一个功能迭代前端同学说可以两周做完后端同学说要三周因为涉及数据迁移。两个人当着我面就吵起来了前端说“你多出来那一周就是不想干”后端说“你不懂数据迁移的坑就别乱说”。当时我第一反应是做个和事佬说“大家各退一步取中间值呗”后来发现这个办法特别蠢。取中间值意味着给后端砍掉两天工期给前端加了一天工作量两边都不舒服而且没有任何依据。后来我把他们拉到会议室多问了几个问题这次数据迁移是为了支持哪些新字段线上存量数据是多少有没有历史脏数据迁移失败有没有自动回滚问完才发现后端同学设想的迁移是“把所有老用户的数据全量洗一遍”而产品实际想要的只是“新用户注册时带上来”老用户的数据在后续三个月里慢慢补。后端按全量迁移估算一周确实不夸张按增量处理两天就够了。所以这不是“前端说两周后端说三周”的工期之争而是新旧数据迁移策略的目标范围之争。目标一旦对齐估算立刻收敛。这个案例给我的启发特别大所谓的意见冲突技术判断只是表面现象真正的分歧往往在“各自的隐含目标不同”。有人默认要全量迁移有人默认只要增量有人默认要做一个通用组件有人默认只解决眼前需求有人默认线上系统要做到五个九有人默认内部工具能跑就行。预设不同再往下聊方案、聊排期、聊责任就注定谈不拢。所以处理冲突的第一步永远不是评判方案好坏而是先问我们各自默认的目标是什么什么是这次必须做成的什么是可以放弃的这一步做扎实了后面一半的架都不用吵。1.3 情绪与事实的剥离工程师也要做的第一件事工程师思维经常被误解为“冷冰冰、不通人情”但我的体会恰恰相反真正成熟的工程师最重视情绪只是他们把情绪当成一个需要管理的变量而不是一个需要通过争论来发泄的东西。开会的时候如果有人拍桌子最有效的回应不是压回去也不是让步而是先让情绪变量“存档”把人的情绪和观点事实分开处理。具体操作很简单你可以这样说“我感觉到你对这个方案非常不满意这个不满意是很重要的信号我们待会儿专门留时间聊。现在先允许我把双方观点里的客观部分复述一遍确认我没有理解歪。”这段话看上去平淡但在实际会议里非常有用。一方面它承认了对方的情绪是有价值的另一方面它把讨论节奏从“情绪对抗”拉回到“信息对齐”。大多数冲突谈崩不是因为分歧本身有多大而是因为情绪一旦对立人就自动关闭了接收信息的通道。你后面说再多有道理的话对方听到的只是“你在反驳我”。这里我常用的一个技巧是让对方先说完而且强迫自己不用“但是”只用“你的意思是……我复述一下你看对吗”这个复述动作本身就是一种降噪。你会发现很多争论在复述环节就减少了三分之一因为有些人吵了半天发现自己和对方的观点其实差不多只是表达顺序不一样或者对某个名词的定义不一样。2. 工程师思维拆解冲突的四个基本动作2.1 第一步把双方观点翻译成“可验证的断言”在代码的世界里一个 bug 能不能修好标准是明确的能复现、能验证、能回归。但工作会议里的观点往往不具备这种可验证性。比如“我觉得用微服务更好”“我觉得单体就够了”这种观点听起来立场鲜明实际上根本没有可验证的边界。什么是“更好”是维护成本更低还是上线速度更快还是故障影响面更小不把这些指标定出来说“更好”就是一个无法被检验的断言。所以我在任何一场冲突中做的第一件事就是请双方把观点重新组织成一个“如果……那么……”的句式。比如“如果未来半年业务量增长三倍那么微服务的横向扩展优势会明显高于单体”或者“如果我们的团队只有五个人那么单体架构在维护成本上更有优势”。这种句式强迫每个人把自己的判断前提暴露出来接下来的讨论就不再是“你错我对”而是“这两条断言在什么条件下成立在什么条件下不成立”。我会顺手做另一件事把每个断言的可验证程度标个等级。有些断言当场就能验证比如“数据库连接池调到 50 会触发连接打满”这个压测一下就能看到结果。有些断言要一两个月后才能验证比如“新增这套缓存之后接口平均延迟能降到 200 毫秒以内”。还有些断言永远无法严格验证只能靠概率判断比如“这样做更利于团队长期成长”。冲突中最大的浪费是拿“长期团队成长”这种无法验证的断言去否定“接口延迟降低 30%”这种马上能验证的断言。这不是说前者不重要而是说两者根本不是一种讨论维度硬凑在一起只会互相消耗。2.2 第二步量化价值与代价让隐性成本显性化多数工作冲突的核心病灶是双方只强调自己方案的好处不谈自己方案的代价。工程师思维比较反直觉的做法是要求每个方案必须写清楚“它不做什么”和“它牺牲了什么”。一个没有代价的方案是不存在的如果它看起来没有代价说明你还没发现它的代价。打个比方一个很典型的争论是“这个需求要不要做一个可视化配置后台”主张做的人列了一堆好处能自助修改、不用发版、运营方便。主张不做的人只回了一句开发加测试要一个月。然后两个人就僵住了。如果按价值/代价拆开看可以做一张简单的二维表——横轴是方案带来的价值纵轴是方案消耗的资源。这时你发现真正要讨论的其实是三个变量这个配置后台未来三个月会被点击多少次、每次生效的时效要求是分钟级还是小时级、维护它需要多少人日。把这些数字往表里一放很多讨论就自然结束了因为连提问的人自己都说不清“到底有多频繁”。我并不是说所有价值都能量化但这不妨碍我们都尽力量化。常用的量化维度有很多人力成本人日/人月、时间成本延迟多少天、性能成本延迟多了几毫秒、维护成本未来每个月要多花多少时间、风险成本故障概率提升多少。就算每个维度只能给出一个粗略估计也比“我觉得”“我认为”强。因为在所有人的粗略估计都摆上台面之后大家会开始争论数字本身而争论数字比争论立场要实在得多也容易达成共识得多。2.3 第三步设计“最小决策实验”或替代评估路径有些冲突无论怎么讨论都分不出胜负因为双方都是凭经验推演谁都没法说服谁。这时候工程师思维给出的方向不是“继续开会”而是“设计一个实验”。这里的实验不一定要很高大上往往很小的验证就能让共识自动浮现。我最常用的是“最小可行验证”思路就是不要一次性把整个方案做完而是只做一条最关键的路径来验证最大的风险点。举个例子团队在两个图像识别方案之间纠结一个基于规则一个基于深度学习。双方吵了两个小时各有各的道理。我提议先别吵我们拿线上最典型的一千张图片各花两天时间跑一个最小原型拿准确率说话。结果规则方案准确率 61%深度学习方案准确率 83%但深度学习方案在 CPU 机器上单张推理耗时是规则方案的五倍。两个数字一出来答案其实就清楚了准确率要求高的场景选深度学习响应时间敏感但样本简单的场景选规则根本不必二选一而是可以分层使用。如果实验确实做不了比如要几周甚至几个月才能验证那就退而求其次走“反向评估”路径不比较“哪个方案更好”而是比较“哪个方案更不可能后悔”。问自己一个问题假设选错了哪个方案更容易回退一个典型例子是两个封装方案的选择A 方案侵入性小回退容易B 方案性能好但改造面广。如果两个方案在理论评估上五五开我会毫不犹豫选 A因为错误成本低。工程师做架构决策的时候最重要的原则之一就是“留后路”这个原则同样适用于意见冲突的解决。2.4 第四步约定决策记录与回滚条件我见过太多团队开会吵了半天终于“达成共识”散会之后却各自按自己的想法干活。原因很简单会上所谓的共识只是大家碍于面子不说话了根本没有被记录下来也没有变成具体行动。所以每场争议结束之后我都会强制输出一份“决策小记”格式不用复杂就四行结论是什么、关键假设是什么、放弃的替代方案是什么、重新讨论此话题的条件是什么。这里最容易被忽略的是第四行也就是“什么时候我们需要回头重新讨论”。任何决策都有有效期因为信息在变、业务在变、团队在变。明确回滚条件本质上是在给反对者一个下台阶你不是输掉了争论你只是同意“在现状信息下先执行这个方案如果出现这种情况我们承诺重新讨论”。我做过最有效的一件事是在一次大争议结束后把重新讨论的条件写得非常具体比如“当线上单机 QPS 超过 800 时重新评估水平扩展方案”。三个月后这个条件真的触发了我们重新开会当时吵输的一方发现情况确实变了很爽快地接受了反转方案。这种“按契约被验证”的感觉比任何说服技巧都强大。3. 把“说服”换成“列出假设清单”一套通用的讨论框架3.1 假设清单法为什么它能防止争辩循环如果你观察过一场高质量的架构评审会你会发现资深工程师在发言时有一个习惯他们很少说“你这个方案不行”而是说“你这个方案基于哪几条假设我们先检查这些假设成不成立”。这个思维习惯就是“假设清单法”。假设清单法的核心是把每一个观点拆解成一组可以被逐条查看的假设。比如小王提出“我们应该引入消息队列来削峰”这句话背后至少藏着四条假设当前流量峰值已经超过系统能处理的阈值峰值是短时突发而非持续增高引入消息队列后下游消费者能在要求时间内处理完积压团队有足够的运维能力保证消息队列的高可用。如果这四条假设任何一条不成立小王的方案就不成立。但问题是小王自己可能都没想清楚这四条假设他只是凭直觉觉得“加个消息队列更稳”。假设清单法厉害就厉害在它把争论从“方案的优劣”变成了“假设的真实性”。你不需要贬低小王的方案你只需要一条一条地请他去验证假设。如果假设真的成立那你也心服口服支持他如果假设不成立他也会自己发现不用你再开口反驳。整个互动过程是合作式的不是对抗式的双方的脑力都花在“检验事实”上而不是“维护面子”上。3.2 如何用提问代替反驳实际话术示例明白了原理还得知道具体怎么问。这里分享一套我自己整理过的“安全提问清单”都是从实战里总结出来的在几乎所有场景下都不会让对方觉得被攻击。第一问“你方案里最关键的一条假设是什么”这一问是用来把对方的逻辑主线找出来绝大多数人听到这个问题会愣一下然后自己想清楚真正的核心依据。第二问“如果这条假设不成立你的方案还有没有备选路径”这一问是用来测试方案的鲁棒性。一个优秀的方案即使关键假设被推翻也往往能退到次优路径一个脆弱的方案则会全面崩塌。第三问“我们需要拿到什么数据才能证明这条假设是真实的”这一问非常关键它把讨论从“空对空”拉到了“可执行”也是前面说的“可验证断言”的直接落地。第四问“这个数据要花多大代价才能拿到值不值得”这一问是为了防止走向另一个极端——为了验证一个无足轻重的假设花了两周时间做实验这本身也是资源浪费。这四个问题问下来哪怕没有得出最终共识讨论质量也会完全不同。因为大家的注意力已经从“我该怎么反驳你”变成了“我们共同需要知道什么”。3.3 反事例和边界条件主动寻找证伪条件的思维为了验证一个观点是否可靠工程师思维还有一个独特的习惯主动寻找反例而不是想办法证明它是对的。这个习惯叫“证伪思维”也是我们在排查 bug 时最常用的思路——你知道系统大概率在哪里出问题直接把探针插过去。用到冲突场景里当有人提出一个方案时与其问“这个方案听起来不错你打算怎么做”不如问“这个方案在什么情况下会失效如果失效会造成什么后果你打算怎么兜底”举个例子有人提议“我们所有配置都放数据库里支持热更新”听起来很灵活。但你用证伪思维一问就会发现它有一个边界条件如果配置数据库本身不可用服务启动时拿不到配置怎么办如果没有预案那这个“热更新”方案可能带来的复杂度反而比它要解决的问题更大。多年前有一次线上事故就是因为团队采纳了一个“配置热更新”方案但没讨论配置中心挂掉时的兜底逻辑。结果配置中心在一次发布中意外宕机所有服务启动后立刻加载配置失败连锁反应持续了快一个小时。事后来看会议那天只要有人问一句“配置中心挂了怎么办”这个坑就完全能避免。所以现在我在评审任何方案时都会固定追加一句话“请描述一下你这个方案最脆弱的环节以及它的失败模式。”这句话已经成为团队的默认要求。3.4 表格示例一套常见的假设清单模板在实际落地时我建议所有技术团队把假设清单做成一张共享表格而不是靠脑子记。这个模板并不复杂但它的存在本身就是一种沟通契约大家默认“观点必须有假设编号”没编号的发言不参与决策。以下是我比较常用的模板结构你可以直接复制到自己的文档里假设编号观点/方案关键假设验证方式验证代价当前可信度1-5负责人A1引入消息队列削峰峰值流量已超过系统阈值拉过去7天QPS曲线低10分钟4小王A2引入消息队列削峰下游消费者能在30秒内处理完积压压测环境模拟中半天3小李A3引入消息队列削峰团队有运维MQ的能力盘点过往OKR经验低1小时2小张这张表格的好处非常明显一是所有发言人都要对自己提出的假设负责二是领导者和主持人都能一眼看清当前讨论到了哪一步三是这套表格本身形成了团队记忆下次再遇到类似冲突时不用从头吵起。我在团队里推行这张表格之后评审会平均时长从两小时缩短到了四十分钟不是我夸张是被记录逼出来的效率。4. 达成共识之后的“落地共识”决策文档与事后复盘才是关键4.1 把结论写下来会议纪要的工程化写法很多团队觉得会议纪要不重要写了也没人看。但我的观察是写过会议纪要和没写会议纪要的争论后续翻盘率差别巨大。因为“共识”这个东西在没有形成文字之前只存在于每个人的记忆里而人的记忆是会自我美化和改造的。今天会上说“先按方案 A 做两周后重新评估”一周后有人就会记忆成“方案 A 只是临时方案我早就说过不行”。所以我对会议纪要有一个很“工程化”的要求不写流水账只写五样东西第一本次要决策的问题是什么第二被否决的选项有哪些各自被否的关键原因是什么第三当前选择的方案是什么它基于哪几条关键假设第四下一步行动项包括责任人、截止时间、产出物第五什么时候需要重新讨论这个决策。这五样东西写完之后让所有参会者过目确认尤其是反对者我会特意请他们确认一下“我有没有把你的反对理由记歪了”。这一步看上去是走流程实际上是在给“达成共识”加一个契约锚后面谁再想翻案我们都能拿出白纸黑字。4.2 责任人、截止日期、准入标准缺少一环就会反弹写下结论之后紧接着要处理的就是“落地”。这块我吃过亏教训很深。有一段时间我们团队开会效率很高基本每场会都有结论、有记录但落地率依然不好。后来复盘了一下发现问题是我们有结论有责任人但缺了“完成标准”。负责人不是故意不干活而是他不知道做到什么程度才算完。比如会议记录写“小张负责调研数据库中间件选型”小张可能认为做一页 PPT 就算完了主持人认为至少要做对比测试。于是下次开会主持人觉得事情没落地小张觉得挺委屈新的冲突又开始了。要避免这种反弹每个行动项都必须包含“定义完成的检查条件准入标准”。同样是调研数据库中间件可以写成小张在本周五前输出四个候选中间件的功能对比表并且至少在测试环境跑通其中两个的基准读写性能输出结果贴在项目文档链接里。这个标准一出来完成没完成一目了然不需要再开会确认。大部分团队共识之所以名存实亡不是大家不想执行而是对“完成”的定义不清晰。4.3 复盘机制用数据校准下一次决策工程师思维还有一个重要习惯就是每次做完事情之后回头校验当初的决策依据是否准确。这个习惯在冲突解决方案里同样重要因为它能帮助我们不断改进判断模型而不是每次遇到分歧都从零开始吵。最简单的复盘方法是“三个问题”法当初决策时的关键假设现在是否被验证验证结果给我们什么反馈下次遇到类似冲突时有什么可以直接借用的经验我们团队曾经争论过“要不要为低优先级需求做接入层缓存”当时反对理由是“收益不明风险不小”支持的方案是“先做后面看数据”。最后真做了一个月后的数据显示缓存命中率只有 3%但接口复杂度上升明显可以说完全不划算。按常规这算一次失败决策但在复盘之后我们沉淀了一条团队共识“低优先级需求必须先有量化收益预估才允许动缓存层”。这条共识本身没有什么惊天动地的内容但它是在真金白银的教训里长出来的后面所有人再提“我要加一层缓存”都要先拿出 3% 这种数据来否则默认不做。4.4 团队的失败姿势常见雷区与纠正再补充几个我经常在团队身上观察到的“失败姿势”你有则改之无则加勉。第一个姿势叫“民主投票式决策”。遇到技术分歧就举手投票好像多数人支持的就是最优的。这种办法对工程师团队来说基本是灾难因为技术问题的正确与否和人数无关。修复一个 bug不能用投票决定“这个 bug 是不是已经没了”。第二个姿势叫“权威压制式决策”。资深的人说怎样就怎样其他人有意见也憋着。短期来看效率很高长期来看团队里最有判断力的年轻人会越来越沉默错误变得无人提醒。第三个姿势叫“拖延搁置式决策”。双方僵持不下于是领导说“这个事我们再想想”“下周再聊”。下周再聊一般还是聊不出结果但需求方已经等不及了最后在无限延期中被业务倒逼出一个最糟糕的方案。第四个姿势叫“和稀泥妥协式决策”。就是我前面提到的那种“各退一步”的方案这种方案往往让产品付出隐藏成本让技术背负不合理复杂度唯一的好处是会议当场气氛和谐但账会在未来用 N 倍的返工来还。我把这几个姿势写出来其实是希望大家回头对照自己团队的开会习惯。如果发现自己经常滑向这四个姿势中的某一个不要焦虑这恰好说明工程师思维还没变成团队默认协议也说明我们能做的事还有很多。5. 从个人方法到团队机制让工程师思维成为团队默认协议5.1 最小化的冲突解决流程前面讲的都是方法论到了实施层面我会在团队里推行一套极简的冲突解决流程。为什么强调“极简”因为流程复杂了没人用等于没有所以这个流程必须控制在五步以内、一次会议能走完。第一步明确议题。开会之前主持人必须一句话说清楚“我们今天要解决什么分歧”如果说不出那这场会就不该开。第二步各陈己见。每个利益相关方轮流畅所欲言其他人不许打断主持人只负责记录。第三步提取假设。把所有观点里的关键假设提炼成一张表格给出验证方式和代价。第四步决策。如果假设验证方式低代价则当场安排验证后再决策如果无法快速验证则按“回退成本更低”的原则拍板并明确重新讨论的条件。第五步记录。把结论、假设、行动项、重议条件四件事写进文档全员确认。这个流程看起来普通但只要你坚持走三到四次团队里的吵架文化就会明显变化。因为大家逐渐意识到会议上说的每一句话都会被结构化成“假设”“代价”“回退条件”那些没有信息量、纯粹情绪化的发言自然就失去了表演的舞台。5.2 角色分工谁当主持人谁当反对者流程能跑起来还得有人扮演合适的角色。我特别建议团队在冲突会议上引入两个分工一个是主持人一个是“魔鬼代言人”。主持人最好由没有利益相关、同时受双方信任的人担任他只负责控场和维持结构不负责评价方案好坏。在很多团队里这个角色默认由团队负责人充当但如果负责人有自己的倾向很容易在控场时下意识带节奏所以我更推荐跨小组的资深同事来当。“魔鬼代言人”这个角色更为关键它的任务是在讨论阶段专门挑刺专门找方案的漏洞和边界情况。你可能觉得这会激化冲突恰恰相反当挑刺是一个“指派角色”而不是“某人自己跳出来”的时候挑刺的对抗性会大大降低。因为被挑刺的人清楚地知道对方的身份设定就是挑刺他不是针对我他是在完成流程。这就像代码审查里专门安排一个人写反面理由一样把批判行为职业化之后大家反而更能理性接收。5.3 度量冲突处理质量的两个指标如果团队想把冲突处理能力当成一项核心能力来建设最好给这件事装上一块“仪表盘”。我建议初期只关注两个指标不贪多。第一个指标叫签字率指的是每当产生一个重度分歧并形成决策之后明确提出反对意见的人是否在最终决策文档上签了字。这不是搞什么合建而是确保反对意见被正式记录并得到尊重。签字率越高代表流程越让人放心代表反对者有地方说话也就越不容易在会议结束后搞小动作。第二个指标叫返工率就是某类决策在落地之后被迫推翻重来的比例。这个数字当然不是越小越好因为很多时候返工代表信息更新但它的变化趋势能告诉你团队的决策质量是在提升还是在原地打转。我见过一个团队在推行这套方法后返工率从 30% 降到了 15% 不到他们并没做什么特别聪明的技术选择只是坚持把假设写清楚、把回退条件想清楚而已。5.4 一点个人体会共识不是“大家都开心”是“大家都能往前走”最后说一点可能比方法论更重要的事。我见过不少人以为“达成共识”就是所有人开心地同意一个方案这个误解会让很多工程师在冲突中倍感痛苦因为他们会发现无论怎么努力总有人不开心于是他们怀疑自己的能力怀疑对方有私心。可我在多年的实践里越来越确定真正的共识不是所有人都满意而是所有人都能在同一份事实和同一组规则下接受决策。你未必赞成这个方案但只要大家共同认可的关键假设没有被推翻、回退条件没有被触发、决策流程公平透明你就能安心地把力气放在执行上而不是把力气放在“找机会推翻它”。工程师思维的力量不在于让世界变得没有分歧而在于让分歧不再消耗人让我们在分歧之上依然可以协作、可以交付、可以复盘、可以进步。这大概就是工程化协作最迷人的地方吧。
返回列表