站立式会议
我可能会去找我的机械师,我们早上有一个小型的站立式会议:
我告诉他我想要轮毂对齐、轮胎旋转和换油。我顺便提了一下: "顺便说一下,我开车过来时刹车感觉有点软,能不能检查一下?我需要什么时候拿回我的车,因为我需要回去工作。"
他把头伸到我的车底下,然后又抬起身来说道:“我的刹车正在漏油,快要失效了。他需要等一个备件,10:30am才能到货,他的员工在中午之前赶不完,但是1:30pm左右我应该可以拿回车子。他的预约已经排满了,所以今天不能做其他的事情,我必须再次预约。”
我问他是否可以做其他的事情,等制动器好了再回来。他告诉我,因为这些制动器可能会导致事故,所以他实在不能让我离开那里,但如果我想去找另外一个机械师,他可以叫人拖车。
由于车很快就会在午餐后完成,我问他的员工是否可以推迟午餐时间,这样我就可以提前一个小时拿回我的车。
他告诉我,他的员工早上8点钟进来,通常工作到晚上。他们赚得每一分休息时间,并且他的员工应该和其他人一起休息。
那些都不是我想要听到的。我希望听到的是,在半个小时内我可以开着我的车子出去,轮毂、轮胎和油都换好了。
我的机械师对我很直接和诚实。你对你的管理层也是这样直接和诚实吗?还是你避免告诉他们他们不想听到的事情?
单元测试
我不会碰那些我不理解的代码行,也不会提交我没有彻底测试过的新代码。(至少是无意地)
你的问题似乎暗示了一个大量文档不好的代码库通过审核并没有进行任何单元测试。也许你参与了其中,也可能没有。每个人都需要承担责任,包括管理层。无论如何,已经发生了的事情就是这样。你无法回头去改变它。
然而,现在,当下,每个人都有责任停止导致问题的行为。你说你花了一年的时间在难以理解且没有单元测试的代码中工作。在那一年中,当你努力提高自己的理解时,你写了多少个单元测试来记录和验证这些理解呢?
在你艰苦地学习代码的过程中,你又添加了多少注释,以便下次不必再费力?
Scrum Backlog
就我个人而言,我认为“Scrum backlog”这个术语是个错误用词。待办事项列表只是一个列表——如果你愿意,可以称之为购物清单。我去修车时有个清单。我与修车工人的站立会议实际上更像是一个冲刺计划会议。
一个冲刺计划会议是一次谈判。如果你的管理人员进行时间盒处理却没有这样的谈判,他们什么也没有管理。他们只是试图将10磅的粪便塞进5磅的袋子里,而你有责任告诉他们这一点。
当你参加一个冲刺计划会议时,你需要承诺完成一项工作,这是你的责任,也要为此做好准备。准备意味着对每个列表项完成所需的工作有一些想法——包括理解模糊代码所需的时间和编写单元测试所需的时间。
如果有人邀请你参加一个你没有时间做准备的计划会议,请拒绝并建议何时重新安排以便你有时间准备。
如果你有一组没有单元测试的现有代码,并且某个功能可能会影响该代码的操作,那么你需要为可能受到影响的旧代码编写单元测试。当你承诺编写该功能时,你就承诺要做这项工作。如果这使你没有足够的时间去承诺其他功能,只需说出来。不要承诺其他功能。
当你承诺修复错误时,你承诺测试你的工作。显然,这意味着为缺陷编写单元测试。但是,如果它涉及没有单元测试的旧代码,这也意味着编写单元测试以防止因你的更改而导致的潜在问题。否则,你该如何测试修复?
如果你由于承诺了太多功能而未能编写这些单元测试,那么责任是谁的呢?
重构
当你重构代码时,你必须测试所有代码,这意味着为所有代码编写单元测试。如果你有一大堆没有单元测试的代码,那么在重构之前,你必须先编写所有这些单元测试。
我建议你等到这些单元测试就位后再进行重构。同时,如果你坚持将单元测试纳入你承诺的工作估计中,最终所有这些单元测试都将到位。然后你就可以进行重构了。
唯一的例外是为了可测试性而进行的重构。你可能会发现,有些代码没有设计用于测试,你必须先进行重构,例如依赖注入等操作,然后才能创建你的单元测试。当你承诺编写需要单元测试的功能时,你就承诺使代码可测试。在承诺该功能时,请包括此内容在内。
承诺+责任=权力
你说你无权无助。当你承担责任并承诺做必要的事情时,我认为你会发现你拥有所需的所有权力。
附言:如果有人抱怨在修复单个缺陷时编写多个单元测试浪费时间,请向他们展示这个视频中的80:20规则并将“缺陷簇”深入他们的脑海。