带团队的进阶:从解决问题到发现问题

好久没有写团队管理的文章了。今天写一下最近在思考到的一个问题。

我有一个习惯是会经常检查自己的日程,看看时间花在哪里了。

我会发现很多的时间都是在解决问题,不管是架构的问题,还是需求的问题,还是人的问题。你会发现自己很忙,也很充实,觉得自己发挥了作用。

我们一直讲 XXX左移,如测试左移,需求左移。问题也需要左移。

如果我们正在忙的这些事情下个月还会以相似的形式发生,思考一下我今天到底解决了什么问题?

从接到一个明确任务开始,延伸到问题尚未被准确描述的时候。

题目从哪里来

工程师接到一个任务,通常会先考虑约束。

吞吐量要达到多少,延迟要控制到什么范围,需要兼容哪些调用方,什么时候上线。约束越清楚,技术讨论越容易收敛。方案可以比较,工作可以拆分,结果也有验收标准。

进入管理岗位以后,麻烦在于:这些约束本身,也需要被检查。

假设业务提出,要把某个接口的响应时间减半。团队可以研究索引、缓存、并发和计算过程,也可以重新分配机器资源。这些工作都有工程价值。

但我会先追问:用户究竟在等待什么?

如果用户完成任务要经过多个环节,这个接口只占很小一部分时间,那么局部优化可能无法改变使用体验。如果等待主要发生在人工审核阶段,继续压缩服务端耗时,投入方向就需要调整。如果响应已经足够快,用户仍然反复提交,我们还需要检查状态反馈和操作流程。

这里没有贬低性能优化的重要性。问题在于,团队拿到的技术指标,是否足以代表想要改善的结果。

我经常和业务同学、商务同学以及其它提需求的人,你讲需求,不要讲方案。 因为很多人来把自己的方案当需求。

要求他们描述:谁遇到了什么困难,发生在什么条件下,造成了什么损失,现有证据是什么。

先不要写方案。

管理者需要对任务的来源负责。 方案评审只能检查给定题目下的解法,无法自动纠正题目本身。

扁鹊的难题

《鹖冠子·世贤》里,扁鹊评价兄弟三人的医术,将长兄排在最前,中兄其次,自己居后。长兄在疾病尚未显形时处理,中兄在病情轻微时处理,扁鹊的治疗动作更显著,名声也传得更远。

引用这个故事,我想表达的是其中的评价问题。

问题严重以后,损失是可见的,处理动作也是可见的。系统恢复了,业务继续运行了,参与者很容易理解这项工作的价值。

提前处理则有一个问题:我们无法直接观察那个没有发生的结果。

一个团队说,经过架构调整,避免了一次严重故障。这个说法可能成立,也可能只是把一种担忧包装成了成绩。没有发生故障,可能与改造有关,也可能因为流量没有达到预期,或者相关路径根本没有被触发。

「预防很重要」,但不会接受任何预防性投入。

假设有人提出,某项依赖存在单点风险,需要增加冗余。我希望看到的是:这个依赖失效后会影响哪些功能,现有替代路径是否可用,恢复需要什么条件,团队通过什么方式验证过。

随后才讨论增加冗余的成本,包括建设、切换、演练和持续维护。

故事中的医者似乎能够准确识别尚未显形的疾病。技术管理没有这种确定性。我们面对的是不完整的信息、会变化的业务,以及随时可能被新证据推翻的判断。

因此,观察到了什么,推测了什么,准备如何验证,判断错误时损失有多大。

发现得早,只有在判断质量和处理成本都合适的时候,才值得投入。

把症状写清

我们常常看到当一个问题刚被提出时,责任归属就已经确定了。这是不对的。

项目延期,于是执行力不足;线上出错,于是质量意识不够;评审反复,于是技术能力欠缺。这些解释很容易进入管理讨论,因为它们足够简短,也容易对应到熟悉的动作:催进度、加审核、做培训。

但它们经常缺少可以验证的内容。

以延期为例,我会先把工作过程拆开:需求什么时候达到可开发状态,编码用了多久,等待联调用了多久,返工发生在哪个阶段,验收条件是否改变过。

假设一个任务总共经历了两周,其中多数时间在等待依赖方确认接口。此时要求开发人员提高编码效率,无法覆盖主要损失。继续增加进度会议,还会占用原本可以用于协调和实现的时间。

不过,看到等待时间很长,也不能立即宣布「跨团队协作有问题」。

等待可能来自接口定义不清,也可能来自对方没有资源,还可能因为我们过早启动了一个条件尚未具备的任务。几种情况需要不同的处理方式。统一加一个协调角色,可能只会多出一次信息转述。

可以使用如下的逻辑:已经观察到的事实,基于事实形成的解释,以及准备采取的动作。

例如,几个任务都在同一个依赖环节停留较久,这是事实;对方资源不足,这是待验证的解释;调整双方排期,是一种候选动作。把它们写在一起,会让后面的讨论默认接受前面的推测。

问题描述越接近可观察的行为,团队越容易讨论具体改动。把大量精力花在解释一个人「为什么不够负责」上,通常得不到能够验收的方案。

寻找提前信号

等到事故发生再分析,证据往往比较集中。寻找早期问题,面对的信号要模糊得多。

我会优先关注那些暂时没有形成损失,却持续依赖额外劳动才能维持的环节。

例如,告警频繁发生需要开发介入排查;每次发布都需要某个人手工确认;某类数据每天都要补一次;一个模块只有固定的人敢修改;项目能按时交付,但前提是临时取消测试或压缩验收。

这些现象还不足以证明系统即将失控,但值得进一步检查。因为当前结果里,包含了没有被正式记录的人工投入。

如果只看交付是否完成、服务是否可用,我就无法知道团队为维持这些结果付出了多少补偿性劳动。

我会让团队用较低成本记录几类信息:重复的人工操作、等待外部决定的时间、计划外的工作,以及必须依赖特定人员才能完成的事项。记录的目的,是找到重复出现的位置,不追求把每个人的一天切成几十个时间片。

粒度过细,记录会变成负担,数据也容易围绕考核要求失真。

技术系统的观察也需要类似的取舍。我不会因为担心遗漏,就要求所有路径全量记录详细日志。采样比例、保存时间、字段数量和查询需求,都需要对应到具体诊断问题,并给采集开销和存储费用设预算。

如果新增一组数据无法回答任何决策问题,我倾向于先不采集。

告警同样需要说明后续动作。某个指标越界以后,谁要介入,要判断什么,允许等待多久?回答不了这些问题的告警,我会先把它放进观察范围,避免直接打断值班人员。

提前发现需要足够的信息,却不能靠无限增加信息量完成。可以从几个高损失场景倒推:在结果恶化之前,我们有没有机会看到变化?现有信息能否区分不同原因?缺少的那部分,怎样以最小代价补上?

追问到哪一层

发现重复问题以后,很容易进入另一个极端:不停追问原因,直到得到一个足够宏大的解释。

一次发布失败,可以追到测试不足;测试不足,可以追到排期紧张;排期紧张,可以追到业务压力;最后写成「组织需要加强质量文化」。

讨论完成了,下一次发布怎么做,仍然没有答案。

建议把分析停在当前能够改变、能够验证的层次,同时记录更上层的约束。

假设某次故障涉及配置变更。恢复服务后,我希望继续弄清楚:配置是否经过校验,发布前能否发现异常,变更是否可以独立回退,为什么已有检查没有覆盖这条路径。

如果缺少校验,就讨论怎样增加校验。如果具备校验能力,却因为发布时间紧张被跳过,就需要检查绕过条件和批准权限。再往上,若每次承诺交付时都默认压缩验证时间,排期方式也要进入改进范围。

这几个层次可以同时存在。没有必要强行选出唯一的「根因」。

我更关心哪一项改动能切断已知的失败路径,哪一项能缩短恢复时间,以及哪些约束暂时只能接受。

增加发布审核,是一种常见选择,但我会谨慎使用。它需要持续占用审核者时间,也会让发布等待另一个人的判断。如果某类错误可以通过确定性检查识别,我会优先评估自动校验;如果必须依赖业务背景判断,人工审核才有对应价值。

自动化是一种常见的策略,但是要考虑成本。一个发生频率很低、每次处理只需少量时间的例外,未必值得建设复杂流程。反过来,高频且规则稳定的操作,长期依赖人工检查,我会要求说明理由。

分析问题的深度,应当服务于干预选择。继续追问已经无法改变行动时,我会停止扩展讨论,把精力转向验证。

问题也要排期

发现问题的能力提高以后,待办事项很可能先变多。

代码有债,流程有缺口,人员有依赖,业务假设也有风险。如果每一个发现都必须立即解决,团队会同时启动大量改善工作,原本的交付计划也失去可信度。

管理者需要对「暂时不处理」承担责任。

判断一个问题是否进入排期,我会看几件事:已经造成了什么损失,未来损失可能如何扩大,判断依据有多可靠,处理成本是多少,以及推迟以后是否会失去调整空间。

简单来说就问一个问题:不做什么怎么样,做要多少成本? 这也算是两个问题吧。

假设两项改造都能减少一定维护工作。其中一项随时可以做,另一项涉及即将被多个团队依赖的接口约定。后者一旦扩散,迁移就需要更多参与者配合。我可能优先处理后者,即使它眼前节省的时间更少。

但我不会把这些因素全部塞进一个精确分数,然后按小数点排序。概率、影响和工作量里包含大量估计,算式不能消除不确定性。

对于信息不足的问题,我会单独安排验证工作。

例如,先花一个有限时间窗口检查实际调用情况、做一次容量实验,或者回放一批历史任务。验证结束后,再决定是否启动完整改造。验证任务需要有结束条件,不能以「持续调研」的形式长期占用人力。

我也会区分两种决定:允许风险暂时存在,以及承诺在某个时间解决。前者需要记录接受风险的人、接受范围和重新检查的条件。不能把所有暂缓事项都放进一个没有期限的技术债列表,等下一次出事再说「早就提过」。

有限的资源只能处理有限的问题。管理者的工作包含排序、延后和拒绝,不能只提供一份越来越长的风险清单。

先做有限验证

提前发现的问题,往往还没有足够证据支持大规模改造。我们需要优先寻找能改变判断的小实验。

假设团队认为,交付慢主要来自公共组件不好用。直接重建组件库,投入很大,验证周期也长。可以先选一类重复任务,调整其中一个高频接口,再比较接入步骤、返工次数和总耗时。

这个实验不需要证明新方案在所有场景都更好。它需要回答:当前识别出的障碍,是否确实影响了交付;移除障碍以后,预期变化有没有出现。

实验设计里,我们可以要特别检查比较条件。

两次任务的复杂度是否接近,参与者是否不同,是否有额外辅导,新方案是否获得了旧方案没有的资源。如果这些条件发生变化,就要缩小结论的范围。

如果测试任务都是规则清楚、信息完整的样本,结论也只能覆盖这部分任务。遇到资料缺失、规则冲突或无法判断的情况,系统怎样退出,谁来接手,都要进入验证范围。

有限实验也有局限。它可能遗漏低频问题,额外受到团队关注,或者无法覆盖规模扩大后的协作成本。因此,通过一次实验以后,我会继续限制推广范围,保留回退条件。

我愿意为这些步骤支付一些时间。相较于一次性更换完整流程,分阶段验证让我有机会在投入扩大之前修正判断。

授权与介入

发现问题容易让管理者产生一种冲动:既然我已经看到了,亲自处理应该最快。

在紧急情况下,这可能是合适的选择。但如果每一次复杂问题最后都回到我这里,我就需要检查自己的介入方式。

我会区分三个环节:识别风险、作出决定、执行处理。它们可以由不同的人负责。

管理者发现某个发布环节存在风险,可以要求补充证据、确定负责人和完成期限。除非风险已经超过团队当前能力,或者需要跨越现有权限,否则没有必要接管全部实现。

授权时,我需要交代的是目标、约束、可使用的资源,以及什么情况下必须升级。对于实现细节,我会留出空间。

这里存在实际代价。团队选出的方案可能与我的习惯不同,局部实现也可能没有我亲自处理得快。如果每次出现这种差异,我就收回任务,成员很难积累完整判断的经验。

但授权也不能变成不检查。

我会根据风险安排检查点。可以轻易撤销的局部改动,允许负责人快速推进;涉及数据破坏、跨团队承诺或难以回退的迁移,需要更早检查方案和前提。检查频率随风险变化,避免所有任务都接受相同强度的管理。

我也需要亲自参与一部分现场工作,例如阅读一次故障时间线,跟进一个长期受阻的任务,或者检查一次改造的实际使用情况。

如果信息只来自层层整理后的汇报,我很难判断哪些成本被省略了。亲自接触现场,是为了校准判断;后续仍然要让明确的负责人完成处理和验收。

发现问题之后,我还欠团队一个决定:谁负责、投入多少、何时检查,以及哪些事情因此不做。

让风险能上来

如果我希望团队提前报告问题,就需要检查自己怎样回应坏消息。

成员提出风险以后,立刻被要求证明一定会出事;承认进度存在不确定性以后,被评价为缺乏担当;发现历史缺陷以后,首先被追问为什么之前没有发现。面对这些回应,一个人有理由等证据更充分以后再开口。

等到证据充分,调整空间可能已经缩小。

我会允许风险报告保留不确定性,但要求表达具体:观察到了什么,可能影响什么,还缺少哪些信息,希望获得什么支持。

「这个项目肯定要延期」和「关键依赖尚未确认,如果本周无法完成,我们需要调整后续联调安排」,包含的信息量不同。后一种表达让管理者可以作出决定,也允许后续事实修正判断。

对于善意提出、最终没有发生的风险,我不会仅凭结果认定提出者判断失误。我会回看当时的信息是否足以支持担忧,验证动作是否合理,以及是否因为提前处理才没有继续恶化。

同样,我也不会奖励没有证据的持续悲观。风险提出以后,需要有人补充信息、缩小范围,必要时撤回判断。只负责提醒所有可能性,却不参与验证,会把筛选成本转移给整个团队。

预防性工作的评价也需要证据。

我会看风险路径有没有被验证,改造是否覆盖了它,回退或恢复是否经过检查,后续维护责任是否落实。至于「避免了多少损失」,没有足够依据就不写一个夸张数字。

对于重复的人工劳动,可以比较前后的处理次数和时间;对于恢复能力,可以记录演练中实际完成的操作与耗时;对于协作改善,可以检查等待和返工有没有变化。评价应当尽量落在能够复查的记录上。

这样做会增加一些记录成本。我愿意保留与决策和验收有关的部分,不要求团队为每项改善制作完整汇报材料。

检查已经完成的

还有一类问题,很容易被技术管理忽略:任务完成了,但投入没有产生预期结果。

系统按时上线,功能通过验收,接口符合设计,团队也没有犯明显错误。几个月以后,使用量很低,原有人工流程仍在继续,新系统还多了一份维护责任。

如果我的检查到上线就结束,这类问题不会进入视野。

我会在立项时约定一次投入后的复查。具体检查什么,取决于项目要解决的问题:人工步骤是否减少,用户是否完成了原来难以完成的任务,业务是否真的采用了新流程,旧系统是否按计划退出。

不能用「已经上线」替代这些问题的回答。

如果结果没有出现,我需要重新检查原来的假设。也许我们识别错了障碍,也许方案只处理了一小部分,也许业务条件已经发生变化。继续增加功能之前,先确认追加投入还有没有依据。

停止项目在这里也是一种需要认真评估的选择。它涉及已有投入、人员安排和承诺调整,处理起来往往比批准下一期更麻烦。但维护一个缺少使用理由的系统,同样会持续消耗资源。

发现问题因此也包括检查团队正在解决的问题是否仍然存在,解决方式是否仍然适用,以及目标是否已经改变。

这会改变我安排时间的方式。

我仍然需要参与故障处理,理解技术细节,对交付结果负责。同时,我会固定留出时间检查重复劳动、尚未验证的判断和上线后的实际结果。对于已经暴露的问题,要求处理闭环;对于只有迹象的问题,安排有限验证;对于暂时接受的问题,留下重新检查的条件。

我也会定期回看自己提出的问题。有多少得到了证据支持,有多少被否定,哪些因为迟迟没有决定而继续消耗团队,哪些处理动作带来了新的负担。

否则,所谓发现问题,很容易变成管理者不断向团队追加任务。

从解决问题到发现问题,对我意味着工作范围扩大了:需要参与定义,需要作出取舍,还需要在结果出现以后检查当初的判断。问题提前进入视野,只是给了我们更多处理空间。这个空间有没有被用好,最终仍然要回到具体的行动和结果上。

以上。