如何在团队中处理不同的编程风格?


14

我们有一个小的开发团队(只有3个开发人员),最近我们有了一个新的团队成员。虽然他是一个聪明的编码器,但是他的编码风格与我们完全不同。我们现有的代码库主要包含可读,干净和可维护的代码,但是新团队成员正在迅速更改许多文件,引入难看的hack和快捷方式,在各处使用定义,在错误的位置添加功能等。

我的问题是,其他人以前是否经历过这种情况,以及是否有人有与他交谈的技巧。


2
是否考虑过使用同行评审来发现丑陋的骇客和捷径,然后才到达存储库?

尽可能使用优质,公正的自动化工具。
工作

如今,编码标准基本上可以实现自动化。要求人们在签入文件之前通过您使用的任何工具来运行每个源文件,这对于防止大多数编码标准违规将大有帮助。我猜这些工具无法抓住的是骇客,他们的操作非常丑陋,例如OP的新人听起来像。看起来像代码审查和拒绝不良样式是修复黑客的唯一方法。
Dunk

Answers:


22

我与一个团队合作,该团队在不到一年的时间内从2个开发人员成长为10个开发人员。我是第三名,也是第一个提出编码标准问题的人。两位原始的开发人员并肩工作了几年,他们采用了一个对我来说似乎陌生的通用标准。我们遇到的问题与您描述的完全一样。

我们所做的是:

研究编码标准

我们花了几天时间检查已建立的开源项目。我们知道团队会迅速扩大,我们正在寻找基于实际项目而非某些通用准则的实际解决方案。同样,我们也不在乎最佳的编码标准,而是在意一些有意义的规则和准则,而不需要重构我们所有的代码库。如果您愿意,我们正在寻找编码标准技巧。

我们三个人决定,对于一个已建立的PHP项目,最好的编码标准就是Zend Framework遵循的标准。幸运的是,Zend Framework人员提供了非常全面的编码标准文档

建立我们自己的编码标准

当然,在我们的项目上应用另一个项目的编码标准是没有意义的。我们使用Zend Framework文档作为模板:

  • 首先,我们删除了不适用于我们项目的所有内容
  • 然后,我们将我们认为与样式有关的所有内容都更改为样式
  • 最后我们把所有东西都写下来了

因此,我们手上有一个相当大的文档,存储在我们喜欢的Wiki中,这是一本不错的书,得到了我们所有人的同意。并且完全没有用。

恪守我们的诺言

当时我们的代码库约为1 * 10 ^ 6 sloc。我们知道,自从采用正式的编码标准以来,我们不得不开始重构代码,但是当时我们面临其他问题。因此,我们决定只重构我们的核心库,仅5 * 10 ^ 3 sloc。

我们赋予我们的一个是编码标准主(我们用来代替本地亵渎)与检查和执行标准的责任。我们每隔几个冲刺就回收一次角色。我是第一个,这是很多工作,因为我必须监视几乎每个提交。

在我任职期间,我们对原始文档进行了一些新的讨论和小的附录,最后我们有了一个比较稳定的文档。我们会不时地对其进行更改,但是其中大多数更改都是在该语言的新功能上进行的,因为PHP 5.3是除名称之外的主要版本。

与新人打交道

下一个新人到来时,是时候对我们的编码标准进行测试了。在简短介绍了我们的代码库之后,我们请他评估我们的编码标准文档。他差点哭了。看来他所做的一切都不一样。

当时我是编码标准专家,因此我需要评估他的意见并相应地修订文档。他的建议是:

  • 个人风格事务(暂时被驳回)
  • 对他的Java背景有意义的标准,但对PHP却没有太多意义(已废除)
  • 他简短接触PHP时遵循的约定(有些被驳回,但很多事实证明是我们在最初的研究中从未想到或发现的流行约定)

在接下来的几周中,他被分配了一个简单的任务:使我们的代码库的几个部分与标准保持最新。我必须根据一些规则仔细选择那些部分:

  • 对于不熟悉我们的代码库(通常是PHP)的人来说,代码应该相对容易
  • 代码应该在他被雇用要做的事情上

我监控了他的过程,他做得很好。我们确定了无法适应我们文档的几部分代码,并进行了相应的修订(代码和/或标准,以较有意义的为准)

然后另一个新人到了。我们重复了该过程(这次是不同的主站),然后又再次起作用。然后再次。

结论

  1. 创建一个编码标准文档,但是要确保您的标准不是排他性的,而是在平台的更广泛的社区中能够反映通用的标准。
  2. 为我们的编码标准主管分配相似的角色。有人至少监视新代码,尤其是新成员的新代码。回收角色,因为它非常无聊。
  3. 始终评估来自新成员的输入。如果有意义,请务必修改您的标准。您的编码标准文档应该在不断发展,但是进展缓慢。您不想在每次迭代时重构您的代码库。
  4. 为每个新成员留出一些时间来学习并适应您的标准和约定。在这种情况下,通过做得最好的方法来学习。
  5. Wiki为此类文档创造了奇迹。
  6. 代码审查在任何情况下都可以创造奇迹!

建议在过程中的某个时刻,我们使用预提交钩子来自动检查标准。我们出于各种原因而决定拒绝它,关于StackOverflow的问题有一些有趣的讨论:

有些是特定于PHP的,但答案适用于所有平台。


如果所有开发管理实践都能得到很好的回答……谢谢!
jleach

3

是的,我以前曾经经历过。在团队中工作时,团队成员必须同意某些规则和约定,包括样式。

您应该让您的团队一起坐下来,草拟一套规则,编码标准,您将需要遵守所有检入代码。

您的规则集(至少是样式)的基础很可能是现有代码。完成后,每个人都必须遵守,并且应作为代码审查的一部分进行检查。不符合标准的代码不应被允许检入。

顺便说一句,这不一定要进行民主投票,这是团队领导者可以实际执行某些权限的事情之一。但是话虽如此,我认为您不能强加大多数团队拒绝的标准。您可以强加一个人,尤其是一个新人拒绝的标准。

关于如何与他交谈...每个有经验的程序员都知道每个地方和团队都有自己的约定和风格,应遵循这些约定和风格。您可以告诉他,他非常乐意提出改进建议,但是他必须遵守团队的规则,他不应该更改现有代码的样式,而应该在添加新代码时使用相同的样式。

另外,您可以告诉(如果您是经理,或者与经理讨论)该人不要做某些您认为不合适的事情(您提到了定义,命令,黑客和捷径等)。


这就是我们在团队中所做的工作:我们讨论并批准了编码标准文档,并且每次登录均使用代码审查。效果很好。
乔治

3
  1. 有人负责-他们需要像这样行事。
  2. 如果编码风格如此重要,为什么不向这个人解释这一点,并让他们知道在他们学习规则之前他们将无法访问任何代码。
  3. 代码审查-显然您没有任何东西,或者它很薄弱。参见#1。

在招聘过程中请注意,遵循接受的编码样式是招聘的要求。现在,您对不遵守规定的人怎么办?首先,删除他们对实时代码的访问,直到他们使用该程序。


1

可以执行以下操作:

  1. 编写说明所需编码风格的文档,并让团队中的每个人都学习。从每个团队成员收集信息。
  2. 以这样的方式划分任务,使每个团队成员都对自己的工作负责,并可以决定该部分代码的约定。如果发现任何问题,则由谁撰写将解决问题。
  3. 向版本控制中添加一个自动工具,该工具可在每次将代码提交到版本控制时修复缩进和其他内容
  4. 不同的程序员总是具有不同的编程风格,以后可能很难更改。处理此问题的最佳方法是在团队成员之间共享信息,以便每个人都能了解人们使用的样式。如果您的团队成员编写不同的代码,那么现有的团队成员就有机会学习新的样式。
  5. 一个好技巧是永远不要修改现有代码。不用修改代码,而是通过用新代码替换空行来编写新代码。一旦代码准备就绪,只需对现有系统进行最少的修改即可使用新代码。这避免了调整现有代码,可能会破坏已经正常运行的代码。

这里是避免的事情:

  1. 确定某人的代码比其他团队成员更好或更差。它不是那样工作的-每个人都足够了解该语言的某些子集,可以在代码中使用它。每个程序员都选择了不同的子集来学习,除非他们一起学习,否则它将看起来有所不同。
  2. 更改某人编写代码的方式。通过强迫人们编写不熟悉的样式,您所获得的全部就是,您在代码中得到了大量的错误。人们只是不知道他们第一次使用某些东西的足够细节。程序员总是选择一种语言子集并单独使用。如果您的程序员编写了成千上万个包含gotos的代码,那么gotos将为您提供错误数量最少的代码。
  3. 您也不应该认为您现有的代码库不错,干净,可维护。总有事情要改进。但是,每一次更改都会模糊原始的设计思想。旨在第一次编写完美的代码,以便以后不再需要更改。(如果新手第一次正确完成操作,则新手不需要“破坏”您的完美代码)

因此,要在OP的原始上下文中使用您的答案...有一个程序员会插入hack,使用宏并具有其他不良的编码习惯,因此建议您将产品的一部分拿出来,交给他,而不是打电话给他代码“坏”,将其称为“不同”。我不能再不同意这个。在团队合作中,不断的沟通,设计/编码讨论和评论是重要的组成部分,并且随着团队的成熟,您的团队成员都会提高自己的技能,因为正如您所指出的,我们都是从不同的子集开始的,但是通过彼此交谈,我们...
DXM

...互相教teach,因此整个团队的技能和能力都得到提升。否则,您将拥有一部分不错的产品,但您将有更多的零件变得难以维护,并且这些混乱的“所有者”将继续努力破解这些错误,以防它们进入。使用这种隔离模型,我已经看到人们花费多年的时间来处理从未正确完成的相同组件。
DXM

1
不,这里的问题不是有人习惯于不良的编码习惯。真正的问题是他们已经决定必须更改一个人编写代码的方式,而团队中的其他人则认为自己的代码是完美的。如果您给他们机会,人们会改善他们的编码风格,但是这些人决定强迫某人快速改进,而他们却再也不会费心去做。
tp1

@DXM以前从未看过或使用过的人都将许多很棒的语言功能称为“丑陋的骇客和捷径”。最好的事情是谈论标准,而不是仅仅确定新手是黑客。
柯克·布罗德赫斯特

我们可以根据这里的不同经验得出答案。OP表示,“除其他外,整个地方都在使用”。如果不是类型常量,那还不错,但是可以改进。但是我见过人们#define一段代码,因为他们太懒惰(或没有技巧)无法正确地重构类并将普通代码放入可以调试的函数中。绝对不可能,我会考虑那种“不同的风格”,并允许他们继续这样做。此外,所有其他答案都集中在使团队趋向共同的风格/惯例上。这个答案...
DXM

1

我们现有的代码库包含大部分可读,干净和可维护的代码

我多年来学到的一件事是,情人眼中的可读性。我已经看到很多情况下,某人的零起点编码风格被证明是“可读”的,并且我已经看到完全合理的人争论哪种编码风格最“可读”。也许这个人认为您的风格不可读?

也就是说,新人应该符合您的标准,而不是相反。


0

考虑使用对新代码的请求请求到存储库中。这为进行代码检查提供了方便的地方。未能通过代码审查的代码将不会合并到存储库中,直到它成形为止。

请注意不要使拉取请求太大。以我的经验,它们的大小不应超过半天到最多两天,否则合并冲突会太多。

诸如bitbucket或github之类的在线vcs系统都支持这种功能。如果您喜欢内部部署方法,则隐藏似乎是当前最好的选择。


0

您可以遵循一个简单的规则:如果使用代码修改文件,则使用该文件中使用的编码标准。如果创建一个新文件,则使用任何良好的编码标准。(加上:如果编译器可以发出警告,则可以启用所有合理的警告,如果可能,请打开警告=错误,并且不允许任何带有警告的代码。加上:如果您使用对文件进行批量更改(例如更改)的工具,制表符或空格之类的标签,请勿使用)。

关于编码标准之所以存在巨大争议,是因为一个标准并不比另一个标准好(或差)(通常),而只是不同。唯一真正的坏的是混合编码样式。

显然,我希望任何体面的程序员都可以遵循任何编码标准来编写代码,无论他们是否喜欢该特定标准。

另一方面,有质量标准。切勿接受不符合您的质量标准的代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.