ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

技术评审实战:如何通过区分问题类型与优化沟通方式高效指导新人

技术评审实战:如何通过区分问题类型与优化沟通方式高效指导新人 1. 先搞清楚“评审徒弟”到底在审什么“评审徒弟的两个问题”这个标题听起来像是一个技术团队内部的导师带教场景。它不是一个具体的工具或框架而是一个关于技术评审和新人指导的实战经验总结。对于带过团队、做过导师或者经常需要参与代码、设计、方案评审的人来说这个主题非常接地气。很多人以为评审就是“找茬”或者“提几个意见就完事了”。但实际带人时你会发现评审的核心价值往往不在于指出一两个具体的语法错误而在于通过问题引导徒弟建立正确的思考框架和工作习惯。这两个问题很可能就是导师在无数次评审中发现新人最容易反复踩坑、最影响成长效率的关键点。所以这篇文章不是讲某个技术的参数怎么调而是讲如何通过评审这个动作高效地传递经验、规避风险、并培养徒弟独立解决问题的能力。如果你正在带新人或者你的工作经常需要你给别人提意见那这篇文章里提到的思路和具体操作应该能帮你省下不少沟通成本也让你的反馈更有建设性。2. 第一个问题是“结果不对”还是“路径错了”徒弟提交了一段代码、一个设计图或者一份方案文档。你第一眼看到的结果可能就有问题。新手导师最容易犯的错误是直接跳到结果层去批评“这个功能跑不通”、“这个性能不达标”、“这个界面丑”。但更有价值的评审会先区分问题性质这到底是最终“结果”本身错了还是达成结果的“思考路径和方法”错了2.1 结果性错误直接给答案不如给检查清单结果性错误通常比较明确比如代码编译报错、运行崩溃、逻辑错误导致输出不符合预期。设计明显违背设计规范、颜色字体混乱、交互流程断掉。方案遗漏了核心需求、技术选型存在硬伤如用关系型数据库存海量日志。对于这类问题我一般不会直接说“你这里写错了应该改成XXX”。因为直接给答案徒弟只学会了这个具体问题的解法下次换一个场景可能还会错。我的做法是提供一个排查清单或思考框架。比如面对一段跑不通的代码我会问“你跑的时候报错信息是什么完整的堆栈看了吗”“你试过用调试器跟一下或者在最可疑的地方加打印日志吗”“这个函数的输入在你调试的时候真的和你想象的一样吗”“你查过这个API的官方文档吗确认过它的前置条件和返回值了吗”通过这些问题我把“debug”这个动作拆解成了可执行的步骤。徒弟下次再遇到问题就会先按这个顺序去自查而不是直接跑来问我。这就是在传递“渔”而非“鱼”。2.2 路径性错误纠正思维习惯才能治本路径性错误更隐蔽也更关键。它指的是虽然这次的结果可能凑合能用但达成这个结果的思考过程、工作方法有严重缺陷长期来看会埋下大坑。比如盲目复制粘贴从网上或旧项目里抄了一段代码但完全没理解上下文和边界条件导致在新环境里水土不服。过度设计/过早优化一个简单的内部工具却用上了最复杂的微服务架构和设计模式。缺乏边界思维只考虑了“happy path”一切正常的情况没考虑网络超时、数据为空、用户非法输入等异常场景。不写测试/不做验证功能写完就直接说“好了”没有任何自测或单元测试。评审时遇到这类问题重点就不在于修改当前的产出物了。我会把评审会变成一次小的“复盘”或“设计讨论”。我会问“你是怎么想到用这个方案的有没有考虑过更简单的做法”“如果输入的数据量增大10倍你这段代码哪里会先出问题”“这个功能上线前你自己会怎么验证它是对的能演示给我看吗”这些问题旨在暴露他思考过程中的盲区。通过讨论引导他去建立“先理解后复用”、“先跑通再优化”、“先考虑主干再处理异常”、“开发完必须自验”等一系列好的工作习惯。纠正了路径以后他产出正确结果的概率才会大幅提升。3. 第二个问题是“他没听懂”还是“我没讲清”评审完给出了修改意见但徒弟改出来的第二版、第三版还是不尽人意。这时候很多导师会 frustration觉得“这人理解能力有问题”或者“不上心”。但根据我的经验至少有一半的情况问题出在沟通反馈的方式上。我们的评审意见可能本身是模糊的、矛盾的或者缺乏上下文的。3.1 模糊的指令 vs. 清晰的验收标准我们经常说一些正确的“废话”比如“这个代码要优化一下。”“这个设计不够优雅。”“性能再提升提升。”这些反馈对于新人来说等于没有反馈。他不知道具体要做什么做到什么程度才算“优化”、“优雅”、“提升”。我要求自己给出的每一条修改意见都必须尽量符合“SMART”原则具体、可衡量、可达成、相关、有时限中的前两条。比如模糊“优化一下数据库查询。”清晰“这条SQL语句在测试环境查100条数据花了2秒目标是在相同条件下降到200毫秒以内。可以尝试从加索引、优化WHERE条件、或者减少SELECT的字段数这几个方向入手改完后我们再用同样的数据测一次。”模糊“这个错误处理太简陋了。”清晰“这个网络请求目前只处理了成功的情况。需要补充处理1. 网络超时比如30秒无响应2. HTTP状态码非200如404、5003. 返回的JSON解析失败。每种情况至少要在日志里留下明确的错误码和简要信息。”给出清晰的验收标准徒弟才知道靶心在哪改起来有方向你复查起来也省力。3.2 缺乏上下文的“金科玉律”有时候我们给出的意见是基于长期经验形成的“最佳实践”但直接抛出去徒弟会觉得很教条。比如“这里一定要用StringBuilder不要用字符串拼接”如果不说原因徒弟可能只是机械地改了但下次在另一个不关键的场景比如只拼接两三次字符串他可能又会忘记。他会觉得这条规则很“玄学”。所以我在给出这类“规则性”意见时一定会附带简短的上下文和原因“在循环体内做字符串拼接用号会产生大量临时对象影响性能。StringBuilder是专门为这种场景设计的内存效率更高。当然如果只是固定拼接两三个字符串在外面用号更直观也没问题。”“这个配置不要写死在代码里要放到配置文件。因为以后部署到测试、生产环境这个值很可能不一样硬编码会导致每次都要改代码、重新编译。”解释了“为什么”规则就不再是冰冷的禁令而成了有道理、可被理解、甚至可被灵活运用的知识。徒弟也更容易记住并应用到其他场景。4. 把评审变成一个可重复的“培养流程”评审不能是随机的、即兴的。对于带徒弟尤其是初级新人我倾向于把它变成一个结构化的、有准备的例行活动。这样对双方都更高效。4.1 评审前让徒弟带着“上下文”来我不会让徒弟直接把代码或文档扔过来就说“师兄/姐帮我看一下”。那样我切入成本太高。我要求他在发起评审请求时必须附带一个简短的“自评说明”哪怕只有几句话。这个说明要包括核心改动这次提交主要想实现什么功能解决了什么问题实现思路你大概是怎么做的例如用了哪个库、主要算法逻辑是什么已知问题你自己觉得哪里可能还有问题或者哪里没把握测试情况你自己是怎么测试的结果如何这个动作逼着他在提交前先自己过一遍脑子进行了一次自我评审。很多时候他在写这个说明的过程中自己就能发现一些问题。同时这份说明给了我巨大的上下文让我能快速抓住重点不用从零开始理解他的代码。4.2 评审中聚焦核心分层讨论正式评审时我会遵循一个讨论顺序避免东一榔头西一棒子目标对齐层先确认我们理解的目标是一致的。有时徒弟做着做着会偏离原始需求。架构/设计层整体方案有没有大问题模块划分是否清晰扩展性如何关键实现层核心算法、关键流程、外部依赖的使用是否正确、高效代码规范/细节层命名、注释、错误处理、日志打印等。测试与部署层是否有足够的测试配置、依赖是否清晰这个顺序很重要。如果架构就有问题那么讨论代码细节的命名规范是毫无意义的。我会明确告诉徒弟“我们现在在讨论第二层的问题第三层的细节我们先记下来等大方向定了再回头看。”4.3 评审后明确行动项并跟踪闭环评审会议结束时最忌讳的就是“嗯大概明白了我去改改”。这样大概率会漏项或者改偏。我的习惯是当场用文档如会议纪要、Issue评论、共享文档列出明确的行动项Action Items。每个行动项包括内容具体要修改什么。基于前面讲的“清晰指令”负责人谁来做。通常是徒弟验收标准怎么算改好了。截止时间什么时候完成。然后我会和徒弟约定一个简单的跟踪方式比如改完后在文档里标记完成或者再次发起一个轻量的代码审查。确保每一个评审意见都落地闭环了。这不仅保证了问题被解决也让徒弟养成“凡事有交代件件有着落”的职业习惯。5. 导师自己容易踩的坑心态与边界最后说说作为导师在评审时自己要注意的几个心态问题这些坑我也都踩过。第一个坑追求“完美”而非“通过”。新手导师容易陷入细节想把徒弟的代码改成自己心中的“艺术品”。这会导致评审时间无限拉长徒弟也备受打击。要记住评审的首要目标是确保代码/方案“正确且可维护”而不是“完美”。一些不影响正确性、可读性和可维护性的个人风格问题可以适当放宽或者作为后续改进建议提出不要 blocking。第二个坑变成“我来写”而不是“你来改”。看到徒弟写得不好一着急就直接上手改代码或者把重写好的代码发给他。这剥夺了他学习和思考的过程。正确的做法是用提问引导他自己找到修改方向或者在他修改的过程中提供实时答疑。他的代码最终必须由他自己的手改出来。第三个坑忽视正向反馈。评审不能只提问题。当徒弟某处设计得不错、考虑得很周全、或者相比上次有显著进步时一定要明确指出来给予肯定。正向激励和负面批评同样重要甚至更重要。它能帮助徒弟建立信心明确知道什么是对的、好的从而形成正向循环。第四个坑没有随着徒弟成长而调整评审重心。对刚入职的徒弟评审要细侧重基础规范和思维养成。当他逐渐上手后评审重心就要转移到架构设计、性能边界、技术选型等更高层次的问题上。如果他已经开始独立负责模块那么评审可能就更像是“技术方案讨论会”以同步信息和风险识别为主。导师的介入方式和深度需要动态调整。说到底评审徒弟的工作技术能力只占一部分更多是沟通和引导的艺术。把这两个核心问题——“结果vs路径”、“表达vs理解”——处理好了你就能从一个单纯的“代码审查者”变成一个真正的“成长加速器”。这个过程对徒弟是学习对导师自己何尝不是一次管理能力和技术视野的锤炼。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进