我们有一个小的开发团队(只有3个开发人员),最近我们有了一个新的团队成员。虽然他是一个聪明的编码器,但是他的编码风格与我们完全不同。我们现有的代码库主要包含可读,干净和可维护的代码,但是新团队成员正在迅速更改许多文件,引入难看的hack和快捷方式,在各处使用定义,在错误的位置添加功能等。
我的问题是,其他人以前是否经历过这种情况,以及是否有人有与他交谈的技巧。
我们有一个小的开发团队(只有3个开发人员),最近我们有了一个新的团队成员。虽然他是一个聪明的编码器,但是他的编码风格与我们完全不同。我们现有的代码库主要包含可读,干净和可维护的代码,但是新团队成员正在迅速更改许多文件,引入难看的hack和快捷方式,在各处使用定义,在错误的位置添加功能等。
我的问题是,其他人以前是否经历过这种情况,以及是否有人有与他交谈的技巧。
Answers:
我与一个团队合作,该团队在不到一年的时间内从2个开发人员成长为10个开发人员。我是第三名,也是第一个提出编码标准问题的人。两位原始的开发人员并肩工作了几年,他们采用了一个对我来说似乎陌生的通用标准。我们遇到的问题与您描述的完全一样。
我们所做的是:
研究编码标准
我们花了几天时间检查已建立的开源项目。我们知道团队会迅速扩大,我们正在寻找基于实际项目而非某些通用准则的实际解决方案。同样,我们也不在乎最佳的编码标准,而是在意一些有意义的规则和准则,而不需要重构我们所有的代码库。如果您愿意,我们正在寻找编码标准技巧。
我们三个人决定,对于一个已建立的PHP项目,最好的编码标准就是Zend Framework遵循的标准。幸运的是,Zend Framework人员提供了非常全面的编码标准文档。
建立我们自己的编码标准
当然,在我们的项目上应用另一个项目的编码标准是没有意义的。我们使用Zend Framework文档作为模板:
因此,我们手上有一个相当大的文档,存储在我们喜欢的Wiki中,这是一本不错的书,得到了我们所有人的同意。并且完全没有用。
恪守我们的诺言
当时我们的代码库约为1 * 10 ^ 6 sloc。我们知道,自从采用正式的编码标准以来,我们不得不开始重构代码,但是当时我们面临其他问题。因此,我们决定只重构我们的核心库,仅5 * 10 ^ 3 sloc。
我们赋予我们的一个是编码标准主(我们用来代替本地亵渎主)与检查和执行标准的责任。我们每隔几个冲刺就回收一次角色。我是第一个,这是很多工作,因为我必须监视几乎每个提交。
在我任职期间,我们对原始文档进行了一些新的讨论和小的附录,最后我们有了一个比较稳定的文档。我们会不时地对其进行更改,但是其中大多数更改都是在该语言的新功能上进行的,因为PHP 5.3是除名称之外的主要版本。
与新人打交道
下一个新人到来时,是时候对我们的编码标准进行测试了。在简短介绍了我们的代码库之后,我们请他评估我们的编码标准文档。他差点哭了。看来他所做的一切都不一样。
当时我是编码标准专家,因此我需要评估他的意见并相应地修订文档。他的建议是:
在接下来的几周中,他被分配了一个简单的任务:使我们的代码库的几个部分与标准保持最新。我必须根据一些规则仔细选择那些部分:
我监控了他的过程,他做得很好。我们确定了无法适应我们文档的几部分代码,并进行了相应的修订(代码和/或标准,以较有意义的为准)
然后另一个新人到了。我们重复了该过程(这次是不同的主站),然后又再次起作用。然后再次。
结论
建议在过程中的某个时刻,我们使用预提交钩子来自动检查标准。我们出于各种原因而决定拒绝它,关于StackOverflow的问题有一些有趣的讨论:
有些是特定于PHP的,但答案适用于所有平台。
是的,我以前曾经经历过。在团队中工作时,团队成员必须同意某些规则和约定,包括样式。
您应该让您的团队一起坐下来,草拟一套规则,编码标准,您将需要遵守所有检入代码。
您的规则集(至少是样式)的基础很可能是现有代码。完成后,每个人都必须遵守,并且应作为代码审查的一部分进行检查。不符合标准的代码不应被允许检入。
顺便说一句,这不一定要进行民主投票,这是团队领导者可以实际执行某些权限的事情之一。但是话虽如此,我认为您不能强加大多数团队拒绝的标准。您可以强加一个人,尤其是一个新人拒绝的标准。
关于如何与他交谈...每个有经验的程序员都知道每个地方和团队都有自己的约定和风格,应遵循这些约定和风格。您可以告诉他,他非常乐意提出改进建议,但是他必须遵守团队的规则,他不应该更改现有代码的样式,而应该在添加新代码时使用相同的样式。
另外,您可以告诉(如果您是经理,或者与经理讨论)该人不要做某些您认为不合适的事情(您提到了定义,命令,黑客和捷径等)。
可以执行以下操作:
这里是避免的事情:
考虑使用对新代码的请求请求到存储库中。这为进行代码检查提供了方便的地方。未能通过代码审查的代码将不会合并到存储库中,直到它成形为止。
请注意不要使拉取请求太大。以我的经验,它们的大小不应超过半天到最多两天,否则合并冲突会太多。
诸如bitbucket或github之类的在线vcs系统都支持这种功能。如果您喜欢内部部署方法,则隐藏似乎是当前最好的选择。
您可以遵循一个简单的规则:如果使用代码修改文件,则使用该文件中使用的编码标准。如果创建一个新文件,则使用任何良好的编码标准。(加上:如果编译器可以发出警告,则可以启用所有合理的警告,如果可能,请打开警告=错误,并且不允许任何带有警告的代码。加上:如果您使用对文件进行批量更改(例如更改)的工具,制表符或空格之类的标签,请勿使用)。
关于编码标准之所以存在巨大争议,是因为一个标准并不比另一个标准好(或差)(通常),而只是不同。唯一真正的坏的是混合编码样式。
显然,我希望任何体面的程序员都可以遵循任何编码标准来编写代码,无论他们是否喜欢该特定标准。
另一方面,有质量标准。切勿接受不符合您的质量标准的代码。