软件中的摩擦


在构建软件时,摩擦可以是一种非常强大的力量。变得更容易或更难的事情会极大地影响我们的工作方式。我想讨论我在工作中看到摩擦的三个领域:依赖注入,代码审查和技术选择。

DI框架

几年前colleague我讨论了这个问题,并得出结论:大多数DI框架糟糕的原因(我特别关注的是Spring)是因为它们添加了新的依赖项太容易了!绝对没有摩擦。也许是一点XML(shudder)或者只是一个很小的属性。太容易了!

因此,当我们开始一个新的绿地项目时,我们决定对我们的理论进行测试,并在依赖注入中引入一点摩擦。我以前写过关于basic scheme我们领养了AOP endpoint它伸过来了。我认为,最终的结果是非常成功的。经过几年的开发,我们仍然只有10-20个依赖关系。我们引入的摩擦很小(在一个类中添加几行),但它足以不断提醒不要只添加一个新的依赖项,因为它是容易

代码审查

最近在讨论代码审查时,我被提醒了这一点。我对代码审查有复杂的感觉:我看到它们工作得很好,有代码审查总比没有要好,但结对编程还是更好。但并不是所有的团队,并不是所有的开发人员都喜欢结对编程--所以代码审查是存在的。代码审查的麻烦在于它们可能会产生某种形式的摩擦。

如果你和我结对做一件作品,我们会在做的过程中讨论各种权衡:我们是否花时间在这上面,我们是否重构那上面,等等。关于什么值得关注,什么可以留到另一天的不断判断被口头化并达成一致。总的来说,我发现当配对时编写的代码质量很高,但同时也保持了对任务的紧密关注。我过去犯过的冗长漫无边际的重构消失了,我们都试图向自己解释的懒惰的“快速破解”,在配对时不是那么容易掩饰的。

但是代码审查存在于这种动态之外。在第二天的寒光下,一些不参与的人会审查你的工作,并通过他们是否认为你的工作达到标准的判断。很容易理解为什么这会变得好斗:它不是协作性的,而是被看作是通过的判断,不仅是对代码的判断,也是对作者的判断。

在审阅代码时,很容易设置一个非常高的标准,高于您可能为自己设置的标准,也高于您在配对时可能同意的标准。现在,这是否意味着这些评论是无效的?绝对不行!你说得对,这里缺少了一个测试用例,虽然我的更改是无关的,但是我应该把缺少的测试用例添加进去的。你是对的,这段代码是一团糟;这是一个混乱之前,我在这里和作出一个简单的编辑;但你说得对,我应该收拾一下的。每个人都应该练习规范园艺。

这些都是完全有效的注释,但它们创建了一种摩擦。当我在一个依赖于这些代码的团队工作时,你会审查知道您将得到注释:因此您将提交保持在较小的范围内,以便将差异最小化。一个较小的差异可以最大限度地减少您需要编写的额外测试的数量。一个很小的差异将大部分现有的混乱排除在审查之外,因此您不会被要求开始重构。

现在,这似乎是不正常的:我们故意试图优化审查过程的顺利通过,而不是优化代码质量。然而,比这更糟糕的是从未发生过的事情:重构提交。回顾过去,我意识到我看到的唯一的代码审查(作为审查者和被审查者)都是针对特性更改的。从来没有提交过任何纯技术性债务削减的代码审查。当然,在特性更改中会有一些单独的提交。但从来没有任何专用的,多提交的会话,其唯一目的是改进代码库。这是一个耻辱,因为就像任何遗留代码库一样,还有改进的余地。

与那些不进行代码审查的团队相比,我更倾向于在减少技术债务方面做出更多的努力。开发人员不必担心无休止的评审评论循环,可以自由地进行重构工作(可能成功,也可能失败!)-但至少他们可以试试。相反,代码审查提供了一种形式的摩擦,从长远来看,这种摩擦实际上可能会损害代码的质量。

技术选择

我最近与另一位同事交谈,他确信Hibernate仍然是在关系数据库中获取数据和从关系数据库中获取数据的最佳方式。我真的不知道如何说服人们他们是错的--当然使用Hibernate就足以说服你了吧?尤其是在大型遗留代码库中--Hibernate造成的痛苦是显而易见的。然而,许多人仍然相信冬眠。甚至还有人仍然相信春天。他们是否仍然相信牙仙,目前还不清楚。

但我认为技术选择是另一个摩擦很重要的领域。当考虑离开一些众所周知的,在工业中使用得很好的东西,如Spring或Hibernate时,会有很多摩擦。有新的技术需要学习,有新的方法需要理解,有新的风险需要管理。这些都增加了摩擦,所以有时候坚持我们所知道的是最容易的。有时候这确实是一个正确的选择--你所擅长的技术是你马上最有成效的。但也有更长期的问题,这些问题很难回答:团队使用X技术最终会比使用Y技术更有效率吗?

软件中的摩擦是一个强大的过程:我们是非常懒惰的生物,不断尝试优化。任何让我们慢下来或阻碍我们前进的事情,都会很快被绕过或绕过。我们可以将这些知识作为指导开发人员行为的工具,但有时我们也需要意识到摩擦是如何使行为变得更糟的。