如何推广和鼓励高质量代码?


16

我在一个由4人组成的小型外包公司中担任iOS开发人员。在我和另外两名开发人员加入该公司之前,我们正在进行的项目开始了几年。在此之前,该项目主要由一个人完成。

当我开始从事该项目时,那真是一团糟。有很多代码重复。我看到相同的500个代码处理了20个不同的文件,但有微小的变化。此外,它的组织方式也不是很好:所有UI创建代码都与逻辑一起混合在视图控制器中。

我尽力在这里和那里进行重构,消除多余的代码,改善项目的文件结构,等等。感觉就像以前的开发人员并不真正在乎所有这些事情,或者没有经验。曾经有一段时间,我一个人从事大型功能几个月。由于此功能的性质,我不得不在整个应用程序中触摸很多代码,因此我确实尝试进行一些改进。

当其他开发人员加入该项目时,我注意到他们使用不同的编码样式(有时是完全不同的样式),并且通常不使用诸如属性访问器之类的现代语言功能(这在Objective-C中相对较新)。有时他们会发明自己的自行车,而不是使用框架的类似功能,或者将他们学到的其他编程语言或模式的概念转移到我们的代码库中。通常,由于英语不正确(Objective-C是您使用长名称的语言),它们有时无法正确命名方法或变量。

有时候,我认为如果不是针对IDE,我认为他们会编写所有代码而没有缩进或格式化。

基本上,我讨厌他们编写的代码。它的格式/组织不好,有时与项目的其余部分完全不同。当他们将意大利面加到我的艺术品中时,我会感到非常沮丧,这会影响我的工作心情和工作效率。

感觉越来越像他们不被学习或不在乎的困扰:他们只是按照他们的要求去回家。有机会时,我尝试给他们一些提示(例如,评论他们的PR或在GitHub上提交)。我曾经很好地要求遵循大多数现有代码的编码风格和格式(很遗憾,我们没有正式的编码风格文档)。但这没用...

我如何解决这种情况而不仅仅是关注“糟糕的公司文化”,“没有经验的毕业生”等,而是开始改善这种情况。


3
您对团队负责人/高级开发人员/经理有什么看法?
菲利普·肯德尔

3
“给男人一条鱼,你就给他喂一天;教一个男人鱼,你就给他喂一辈子”-而不是“简单地做你的工作”,而是重构你控制的代码的小部分,开始教别人更好的编码风格。当然,请确保您得到了管理层的一些备份。
Doc Brown

Answers:


5

教导和练习您的讲道。

您知道这些东西很重要。如果做得不好,您就会知道不利之处。

现在的挑战是说服他人。这不能通过单个对话,会议,走廊对话,提示或在“拉取请求”中完成。

这需要:

  • 管理层公开承认这些项目很重要
  • 短毛猫,使人们可以聚在一起,进行讨论并就样式达成共识,然后让计算机执行警务工作
  • 领导开发人员,他们全力以赴并愿意教别人
  • 会议,演示,午餐和学习等,教这些方法
  • 根据您在评论中提及的质量项目对人们进行评估
  • 记录和发布的标准
  • 具有许多审阅者的拉取请求
  • 在代码质量高之前,不合并合并请求
  • 频繁的代码配对
  • 复杂公关的集团代码审查

换句话说,它需要

领导

好消息是,所有这些活动通常都被认为是好的做法,因此,当您去推广它们或获得管理层的认可时,您应该有很大的成功机会,并且应该能够捍卫正确的做事。管理层可能仍不买账,这是另一个话题和问题。


2

过去,我在SoftwareEngineering.SE上就此主题撰写过很多文章,而我本人也遇到过类似情况。因此,在阅读您的问题时,我将尝试给出一些提示和重点。

但首先,让我们谈一个重要方面:您在公司中的角色。

你的角色

您可能有老板的明确授权来增强功能,并且在层次结构中还需要其他开发人员来聆听您的命令。或者,您可能处于同龄人之中,具有相同的角色和相同的权限,您的选择仅是……好……一种意见

在这两种情况下,重要的是您在层次结构中的位置更少,而更多:

  • 其他开发人员对您的看法。如果他们把您当作一个讨厌的人问他们愚蠢的事情,您将不会走得很远。我见过很多情况,技术领导者和项目经理对团队绝对没有影响,因为团队知道(或认为)那些“领导者”不需要技术背景来做出决定。另一方面,我已经见过一些开发人员,他们实际上受到了同行的倾听,因为他们知道这些开发人员很熟练并且经验丰富。

  • 您的团队有多扎实,是什么激励他们。想象一家公司,每个开发人员每个月都要支付KLOC费用。您对同事说什么风格很重要吗?可能不是,因为很少有人希望得到较低的报酬。通常,如果这不是一个团队,而是只有一群人在同一项目上工作,那么您将无济于事。

因此,您可以决定是否值得进行任何更改。如果您没有发言权,也没有团队凝聚力,那就去找另一份工作。如果您是一个有才华,受人尊敬的开发人员,并且拥有强烈的团队合作感,即使面对老板或其他团队的敌意,您也可以相对轻松地进行改进。

在所有情况下,至关重要的是不要对团队施加压力。工作他们,而不是打击他们。不要给他们命令,而是引导他们实现目标。

现在,提示。

样式

我曾经很好地要求遵循大多数现有代码的编码风格和格式(很遗憾,我们没有正式的编码风格文档)。但这没用...

当然不是,因为这不是应该做的方式。

  • 风格很无聊

  • 跟随风格很无聊

  • 编写编码样式的文档很无聊而且非常困难;除非您已经使用该语言十年以上,否则不要尝试这样做)。

  • 阅读风格的文件很无聊

  • 审查代码中的样式错误很无聊

  • 告诉我我的风格比你的风格更好,这是令人兴奋的,尤其是当一种风格绝对没有相对于另一种风格的客观利益时。认真地说,每个理智的人都知道正确的书写if (x)方式就是我的书写方式,不是if(x)if ( x )

因此:

  • 不要进行样式评论。这是样式检查器的工作。那些可爱的应用程序对您的大脑有一些好处:它们可以在几毫秒内(而不是数小时或数天)检查整个项目,并且它们不会犯错误并且不会遗漏样式错误。

  • 不要编写自己的样式标准。无论如何,您都会做错事情,而您的同事会告诉您您做出了错误的选择。

  • 不要强迫开发人员修复2000个样式错误。

  • 在提交时自动执行样式。样式错误的代码在版本控制中没有位置。

  • 从项目开始就做。在现有项目中设置样式控制是很难甚至不可能的。

有关更多信息,请阅读SE.SE上其他答案的第一部分。

也:

  • 不要太严格。例如,编写jslint兼容代码很烦人,因此应仅在绝对需要时(或者如果团队中的所有成员都乐于使用它)进行编码。静态检查工具也是如此。例如,.NET的最高级别的代码分析可能会非常压抑和令人沮丧,而带来的收益却很少。另一方面,同样的工具集在中等水平上被证明是非常有用的。

代码审查

既然您无需在代码检查期间费心处理样式,您就可以专注于更有趣的内容:增强(与修复)源代码。

不同的人对代码审查的反应不同。有人认为这是一个机会。其他人讨厌它。有些人会听您说给他们的一切,做笔记,甚至不讨论,即使他们可能是对的。其他人则试图就每一点争论。您可以根据自己的性格找到与每个开发人员打交道的方法。通常有助于:

  • 私下进行代码审阅,尤其是在开发人员初级且编写了非常糟糕的代码时。

  • 证明没有什么私人的:您正在查看代码,而不是个人的技能。

  • 显示代码审查的实际目标。目的不是要显示开发人员有多糟糕。目标是提供改进机会。

  • 永远不要争论。您并不是要说服您,而是要提供您的专业知识。

  • 永远不要以为受审者是唯一可以从评论中学到东西的人。您也可以通过阅读代码和询问有关您不了解的部分的说明来学习。

完成代码审查后,请确保该人实际上在改进她的代码。在某些情况下,开发人员认为在实际会议结束时代码审查也会结束。他们离开并返回其新功能,尝试将您与他们共享的内容仅用于新代码。拥有一个体面的代码审查跟踪工具会有所帮助。

请注意,与您在公司中的特定角色和与其他人相比的专业知识无关,您的代码也应接受审核。您也不应该是唯一查看他人代码的人。

在我担任技术主管的最近一个项目中,我很难向同事解释说,对彼此的代码(包括我的代码)进行审查是他们的职责。一旦找到代码中的第一个问题,对即将审核其技术负责人代码的实习生的恐惧就消失了,而我们中间谁编写的代码无懈可击?

训练

代码审查是教与学编程和软件设计某些方面的绝佳机会,但其他方面则需​​要培训。

如果您能够培训您的同事,那就去做。如果您的管理层对培训的想法怀有敌意,请非正式地进行。我以非正式会议的形式进行了此类培训课程,有时甚至只是简单的讨论,有时会被管理层打断,以后再讨论。

除了直接培训之外,请确保您对麦康纳尔的Code Complete之类的书了解得足够多,并与同事讨论这些书。建议他们阅读开源项目的源代码,并为他们提供高质量代码的特定示例。而且,显然,您自己可以编写高质量的代码。

专注于背景,而不是人

我如何解决这种情况而不仅仅是关注“糟糕的公司文化”,“缺乏经验的毕业生”等。

这些毕业生的目标是:获得经验,学习知识,变得更加熟练。如果他们年复一年编写糟糕的代码并且对编程一无所知,那可能是因为您的团队或您的公司没有给他们这个机会。

如果您关注的是团队中没有毕业生的事实,那将无济于事。相反,请专注于为他们以及与他们一起可以做什么。代码审查和培训是改善情况的两种技术。

糟糕的公司文化是另一种野兽。有时可以更改。有时,它不能。在任何情况下,请记住您该公司的一部分,因此您是公司文化的一部分。如果您无法更改它,或早或晚发现其本质上不好,则必须离开。

正确制定指标

您现在如何准确地测量代码?您是否衡量每个开发人员每天的提交次数?还是每个程序员每个月的KLOC?还是代码覆盖率?还是发现并修复了许多错误?还是回归测试发现的潜在错误数量?还是Continuous Deployment服务器完成的还原次数?

您衡量的事情很重要,因为团队成员正在使他们的工作适应所衡量的因素。例如,在几年前我必须工作的一家公司中,唯一可以衡量的是一个人在办公室花费的时间。不用说,这并不鼓励提供更好的代码,或者更聪明地工作,或者……好吧,根本无法工作。

弄清楚正面和负面的加强并随着时间的推移调整测量的因素实际上是您对团队成员的影响。如果正确完成,则可以实现简单的层次结构无法实现的结果。

困扰您的事情,使它们可以衡量。测量它们,并将结果公开。然后与其他团队成员一起改善结果。

例如,让我们考虑团队成员在类,类成员和变量的名称中犯了太多的拼写错误。真烦人 您如何衡量?使用解析器,您可以从代码中提取所有单词,然后使用拼写检查器确定包含错误和错别字的单词的比例,即16.7%。

下一步是与您的团队就目标比率达成一致。下一次冲刺可能是15%,下一次冲刺可能是10%,六周内为5%,两个月内为0%。这些指标将在每次提交时自动重新计算,并显示在办公室的大屏幕上。

  • 如果您没有达到目标比例,您的团队可能会决定花更多的时间来解决拼写错误。或者您的团队可能会认为最好计算每个开发人员的比率,并在大屏幕上显示此信息。否则您的团队可能会发现目标过于乐观,因此您应该对其进行审查。

  • 如果达到目标比例,下一步就是确保错误和错别字的数量不会随着时间的推移而增加。为此,您可以在构建中创建另一个任务,该任务检查拼写错误,如果发现至少一个错误,则使构建失败。现在您已经摆脱了这个问题,可以重新使用大屏幕来显示新的相关统计信息。

结论

我相信,您问题中提到的每个方面都可以通过我在回答中包括的技术来解决:

  • 当其他开发人员加入该项目时,我注意到他们使用了不同的编码样式(有时是完全不同的样式)

    您必须在提交时自动实施样式

  • 并且通常不使用属性访问器之类的现代语言功能(这在Objective-C中相对较新)。

    这两个代码审查培训来这里是为了转移你的语言知识。

  • 有时他们会发明自己的自行车,而不是使用框架的类似功能

    这两个代码审查培训来这里是为了转移你的框架的知识。

  • 或将其他编程语言的概念或从他们那里学到的模式转移到我们的代码库中。

    这是一件好事。似乎是您向他们学习的机会。

  • 通常,由于英语不好,他们无法正确命名方法或变量

    代码审查还应侧重于正确的命名。一些IDE也具有拼写检查器。

  • 有时候,我认为如果不是针对IDE,我认为他们会编写所有代码而没有缩进或格式化。

    当然可以。风格很无聊,应该自动化。

  • 基本上,我讨厌他们编写的代码。

    请记住,在代码审查部分中:“目标不是显示开发人员有多糟糕。目标是提供改进的机会。”

  • 它的格式/组织不好,有时与项目的其余部分完全不同。

    自动样式检查。

  • 当他们把意大利面条加到我的艺术品上时,我感到非常沮丧

    等等,什么?艺术品吗?你猜怎么了?有些人(包括六个月内的您在内)可能会发现您的代码远非一件艺术品。同时,请务必理解,将您的作品视为艺术品,而将视为垃圾作品不会帮助任何人。包括你。

  • 感觉越来越像他们不被学习或不在乎的困扰:他们只是按照他们的要求去回家。

    当然,他们会按照他们的要求去做。请记住:情境而非人员,正确制定指标。如果情境要求他们做到最好,那么他们会做到的。如果上下文需要每月产生尽可能多的KLOC,仅此而已,那么他们也将这样做。


您是第一个提及代码审查的人,并且刚刚获得+1的奖励-被迫捍卫公开场合对代码库造成的混乱可能是很有教育意义的。但是,代码审查依赖管理级别的人员来真正关心,如果缺少人员,那么您注定要恕我直言。
tofro

@tofro:谢谢。但是,代码审查只是各个方面之一。自动化样式检查更为重要,但之前的任何答案均未提及。指标也未提及。同样,没有人强调OP将其代码称为“艺术品”这一事实,尽管这是非常重要的方面。
Arseni Mourzenko '16

@tofro:“但是,代码审查完全依赖管理层的人,如果有人失踪,那么您注定要失败”:根据我的经验,管理层的支持并不是先决条件。我不得不在团队中工作,因为他们的管理实际上对代码审查怀有敌意,认为这是浪费时间。我们仍然在做这些事情,它在代码质量(减少错误和减少解决错误的时间)方面带来了可衡量的收益,以及团队成员的幸福和经验所带来的不可衡量的收益。一个好的团队即使在管理不力的情况下也可以做得很好。
Arseni Mourzenko '16

我确实同意,当团队与CR共同感兴趣时,您不需要管理支持-显然,这里不是这种情况。
tofro

0

实施编码标准并遵守它们,设计模式,可以用作指南的代码段库等。

编码标准的范围包括决定是否使用空格或制表符,尝试使用的设计模式,命名约定等。即使每个人的编码不同,这也将有很长的路要走。


0

如果可以,请实施编码标准和代码审查-开始对每个签入进行审查。如果团队规模很小,对于不了解在代码上额外花费2倍或3倍的代码可以节省20倍或30倍的总体开发时间的人来说,这将是很难的选择,但这是另一个值得买的概念-在。

我不会尝试一次实现所有事情,并且会尽我最大的努力使他们也提出标准-不仅是缩进,还试图让他们考虑他们在代码中遇到的事情。使他们的生活更轻松或更艰难。

考虑每周召开一次会议,回顾每个人在那一周中是对还是错的事情-您也可以让每个人都有机会说别人在那一周最有帮助的事情-像这样。您可以查看XP / Agile书,以获得更多类似的想法。同样,作为一个小团队,这可能很难。

您提到了语言问题。如果这些工人是本地工人(无论是现场承包商还是全职员工),这都不是什么大问题,但是如果他们是在国外工作的远程承包商,请允许我以我的个人经历说,要修复,要么解决问题,直到管理层发现它行不通,要么考虑离开公司。不要陷入对他们的工作负责的情况,也不要浪费时间试图修复团队的开发实践。您的工作很可能会演变成花费100%的时间来使代码正常工作。顺便说一句,许多海外承包商都是优秀的程序员,我只是指承包商公司向您发送您所描述的人才类型的情况。


0

您强烈描述的症状表明缺乏团队凝聚力

在这种情况下,编码标准,培训,程序或工具将不是能够显着提高质量的灵丹妙药。首先,您必须培养团队合作精神,开放和建设性的沟通以及对产品的共同所有权。

症状:

  • “他们随便做什么,然后回家”:听起来他们很沮丧。他们抵达时不是更热情吗?
  • “他们”反对“我们” /“我” /“我”:缺乏相互信任?
  • “我给了一些提示:我对Git进行了评论”:尽管有建设性的意图,但书面批评的语气有时会被误解为侵略性或自大的。为什么不面对面讨论呢?

您是一个小团队:利用这一优势!开始的一些想法:

  • 集体做出重要决定。公开讨论分歧。“讨论”不是强加一个观点,而是倾听并试图找到共同点。
  • 您已经重构了代码的重要部分,因此拥有非常强大的所有权。让他们买进。让他们说一句话。
  • 对于非常敏感但高度主观的主题,例如代码格式化,只需将职责外包给一台自动漂亮的打印机,该打印机将根据标准重新格式化,而不用担心每次入住。

每日报价:

如果您想快点走,那就一个人走。如果你想走远,一起去


0

您可以通过“更改公司或更改公司”来回答您的问题。对于那些不知道的人,这意味着您要留下来并努力为您带来希望在公司中看到的改变,或者改变您工作的公司(即离开并在其他地方工作)。

第二部分是最简单的。您离开并找到一家拥有与您相同的价值观的公司。第一个不是那么简单,因为...人。

您需要做的就是换人。认为它们已损坏,您需要对其进行修复是行不通的。人是情感的存在。在个人战争中,这很容易退化。所以...

首先,您需要找出为什么情况如此。与大家交谈。找出。您现在看到的是多年来做出的决策的结果(或者可能是在正确的时间没有做出一些重要的决策)。不要判断,也不要下结论。

这是由经验不足的开发人员造成的吗?是由于管理层试图通过雇用廉价的毕业生而不是经验丰富的昂贵的开发商来降低成本引起的吗?这是关于人们的懒惰和恶意,还是被破碎的系统击败的人们?是最后期限迫使您“必须做些什么”才能使它正常工作,还是人们只是在浪费时间而不在​​乎他们在做什么?等等

这个软件开发领域的问题是人们在工作中学习。如果他们在恶劣的环境中工作,他们会养成不良习惯。习惯往往会坚持并且很难动摇。然后他们不会更好,因为这就是他们所知道的全部。并非所有的开发人员都热衷于为投入时间来改善或寻求改善而做的事情。有些人由于其他各种原因而从事这项业务。因此,找出人们为何如此。

然后是管理。管理层是否不了解情况或只是不在乎?找出。如果要改进,您绝对需要管理的支持。如果花了3个月才能完成的工作突然花了4个月,因为您现在需要编写测试,进行代码审查,与团队在白板上讨论以决定好的解决方案,配对程序等,那么您可以确保管理层会注意到时差。从3个月到4个月的变化很容易观察和测量。具有扎实的代码库,可维护的产品,良好的稳定体系结构以及使产品结构更好的要素,很难衡量。从长远来看,最佳实践能为您带来多少时间,甚至在事后也无法预先衡量。另一方面,一个月的延迟是没有道理的。因此在这方面有管理支持。准备进行艰难的销售。

还要看业务环境。这会影响您的工作方式吗?您是否有机会不惜一切代价进行跟进,包括牺牲代码质量或最佳实践?

让我们暂时改变观点。

当他们将意大利面加到我的艺术品中时,我会感到非常沮丧,这会影响我的工作心情和工作效率。

对不起...你呢?艺术?我知道我们大多数人都是在这里得到同行的认可,并且只有当您是一个优秀的开发人员时,您才能明白这一点,但是您的代码是否显示在绘画旁边的博物馆中?它是否必须引起人们的关注?喜悦和幸福的眼泪?是的,我很讽刺,我故意夸张,因为我想说要保持现实感。不要在情感上迷恋您的代码。

我曾经和一个会乐于将团队,项目和公司扔在公共汽车下的家伙一起工作,只是为了将他的“艺术”强加于所有人。他是“真相持有者”,从定义上来说,每个人都只是经验不足,盲目,不愿学习,不在乎或者只是愚蠢。不要成为那个家伙。作为软件开发人员,您的工作是编写良好的代码,经过测试的代码,可维护的代码,可增加业务价值并可以在未来不断变化的情况下继续这样做的代码。而且您必须在预算和时间限制下完成所有这些工作。这就是成为专业软件开发人员的意义。除非您是美术馆,否则艺术品对企业不利。务实,对事物保持平衡。“ 如何忽略我的同事编写的错误代码,而只专注于工作”是因为您采用了解决问题的方式,所以问题得以解决。

我如何解决这种情况而不仅仅是关注“糟糕的公司文化”,“没有经验的毕业生”等,而是开始改善这种情况。

TL; DR:仔细查看情况,以找出导致这种情况发生的原因。接受这种情况,然后看看如何从那里得到改善。找出大家对此的看法。选择你的战斗。强制更改无效。合作进行更改。您应该尝试说明如何进行改进,而不要指出它们有多糟糕。说服所有人,从长远来看,您想做的是为了更大的利益。让他们上船。

并逐步进行。

如果您一次带来太多改变,人们会感到灰心和放弃。更改需要时间。更改您的公司或更改您的公司。祝好运!

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.