SWE / New Grad · VO Debug / Bug Squash

Stripe Mako Debug:文件路径、AST Visitor 与注释控制行

把三类失败测试分别定位到路径前置条件、语法树 visitor 覆盖和控制行边界,避免靠记忆照抄补丁。

题目重点:把三类失败测试分别定位到路径前置条件、语法树 visitor 覆盖和控制行边界,避免靠记忆照抄补丁。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练目标是调试方法和对应最小复现,不把某个论坛回忆当成所有 Mako 版本共同 bug。
  • 每次只改一个可复现失败,把测试固定在当前源码版本;Python 版本不兼容等环境问题先与功能 bug 分开。
  • 路径校验具体应使用 isfile、isdir 还是其它 predicate,取决于函数合同;AST visitor 的 node 字段结构也要按当前 repo 检查。

解题路线

  1. 先建最小可运行环境:锁住给定依赖/解释器版本、跑单个失败测试、读 traceback 与调用链;确认失败是环境导入、测试数据还是目标函数。不要在未跑通测试前靠题目描述中的行名批量改文件。
  2. 路径问题:复现传入文件、目录、不存在路径及相对路径;检查条件分支是把目录误当文件还是反过来,并在合适边界抛预期异常。修补后验证正常路径仍通过。
  3. AST visitor 问题:构造最小含函数参数的模板,比较 parse tree 与渲染/遍历输出;查 visitor 分派是否缺少 arg 节点处理,新增 visitor 后测试位置、默认值与多个参数,不要只让失败测试消失而遗漏子节点。
  4. ControlLine 问题:用仅注释、注释加空白和真实控制语句三个样本比较解析结果;若空主体应被跳过,修补解析条件与换行/缩进边界并验证普通控制语句不受损。
  5. 每次提交前重跑相关测试,再读一遍改动路径和错误分支;如果测试数量很大,先最小失败→所属模块→全量。面试中讲清为何这个输入触发 bug,比背诵某个函数名有价值。

手动走一遍

训练例 `source_path` 指向目录时,若后续函数要打开文件,错误应在入口就显式暴露;`source_path` 指向有效模板文件则应继续。另建只有一个带参数调用的模板检查 visitor 是否记录该参数,再建只有注释的控制行检查 parser 不制造伪节点。这三个测试各验证一类不变量,不是对缺失 repo 的逐字复刻。

规模与取舍

非算法题。路径检查通常 O(1) 元数据调用,AST 遍历 O(N) 于节点数;调试成本由最小复现、环境一致性和回归范围决定。直接修改大范围 parser 可扩大回归风险。

易错点与追问

容易失分的边界

  • 把论坛提到的 `os.path.isdir` 字样不加上下文直接改成 `isfile`,可能反向修坏正确分支。
  • 新增 visit_arg 但没有继续遍历子节点。
  • 只跑预期失败 case,不测正常模板与注释/空白边界。
  • Python/依赖版本不兼容时把环境栈追踪误诊为题目 bug。

继续深挖

  • 如果 `visit_arg` 在当前代码库已经存在,还可能是哪条分派路径漏用了它?
  • 路径是符号链接或权限不足时 isfile 与 open 的结果不一致,如何设计异常路径?
  • 测试只在某个 Python 版本失败时怎样缩小环境差异?
✓已复制微信号!