激励同事采用更好的编码实践?


24

在“ 处理我过时的同事”问题中,许多人讨论了与不愿将工作流与团队的工作流程整合在一起的同事打交道的策略。

我想,如果可能的话,学习一些策略来“教”一位不了解现代技术和工具的同事,并且可能有些冷漠。

我已经开始与一位程序员合作,直到最近,他一直在公司的不同部门进行相对隔离的工作。他具有丰富的领域知识,最重要的是,他展示出了很好的解决问题的能力,而这是许多候选人似乎所缺乏的。

但是,我看到的实际(C#)代码是对VB6天的回顾。程序结构,匈牙利符号,全局变量(的滥用static),没有接口,没有测试,不使用泛型,抛出System.Exception...您就会明白。

这个程序员比我年龄大一点,至少从第一印象来看,他并没有积极寻求积极的改变。我不会说要抗拒变革,因为我认为这很大程度上是有关如何提出主题的问题,我想做好准备。

程序员往往是固执的人,大肆宣传,建立撕碎的代码审查和严格执行的政策很可能不会产生我想要的最终结果。如果这是一个新员工,一个初级程序员,那么我不会三思而后行地采取“导师”的立场,但是我非常谨慎地将有经验的员工视为无知的新手(他不是-他只是没有与该领域的某些进步保持同步)。

我如何通过柔和的说服力和非实质性的激励措施以Dale Carnegie的方式提高开发人员的代码质量标准?在不造成对抗性情况的情况下进行细微,渐进式变化的最佳策略是什么?

之前是否有其他人(尤其是首席开发人员)遇到过这种情况?哪些策略成功地激发了兴趣并创造了积极的群体动力?哪些策略没有成功,会更好地避免?


说明:

我真的觉得有些人是根据个人的感觉来回答的,而没有真正阅读问题的所有细节。请注意以下内容,这些内容本应暗示,但我现在要明确指出:

  • 由于年龄的原因,这个同事只是我的“高级”。我从未说过他的头衔,势力范围或在该组织的任职年限超过我,而实际上,这些都不是真的。他是一名LOB程序员,已经被主要开发部门所吸引。而已。

  • 我不是新员工,也​​不是初级程序员,也不是其他幼稚的白痴,他们都计划在一夜之间将公司转型。我基本上负责软件过程,但是正如许多作为“潜在客户”工作过的人所知道的那样,职责并不总是与组织结构图完全相关。

  • 不是在问别人如何走我的路,来死还是要高水。如果我愿意,我可以这样做,最终结果是这个人会变得不满和/或辞职。请尝试了解我正在寻找一种社交合作的方式来推动变革。

  • 提到“ ...全局变量...没有测试...抛出System.Exception是为了证明问题不仅是表面的或美学的。可能适用于相对较小的CRUD应用程序的做法不一定适用于大型企业应用程序,实际上,到目前为止,没有代码实际通过了集成测试。

请尝试从表面上看待这个问题,接受我实际上知道我在说什么,然后回答我实际提出的问题或继续前进。

PS对那些提供建设性建议而不是与前提争论的人,我表示由衷的感谢。我希望将其保留一段时间,因为我希望能从现实生活中听到更多。


9
我一直在这种情况下,从来没有看到它真的成功解决过。像您描述的许多人在多年前就放弃了编程的思考。目前,他们只对业务领域的解决方案感兴趣。我不会加入谴责这种人的这个网站的浪潮。的确,我认为它们是大地的盐。如果它们在您的代码中起作用,则应努力至少遵守您的约定。我毫不费力地推销说,如果对一个项目有所贡献,人们应该遵循现有的惯例。
杰里米

1
当您向他提出这种担忧时,您的老板怎么说?

2
@Aaronaught,因为他的代码有效,所以这不是技术问题而是政治问题,如果您想更改任何内容,可能需要从上面强加于此。换句话说就是你老板的话 准备好论点!

2
@Thor:因此,您认为他的风格完全是低期望,没有同行评议和忙碌的生活(不适合自己在个人时间内进行独立学习)的产物吗? 不关心不是硬性的个性特征,它是一个人的环境的产物,并且可以改变。知道更容易改变,但是仍然需要某种程度的外交手段来解决。
Aaronaught

1
@Aaronaught,或者您一次失败地失败了,不能成为一个灵感(不能排除),或者他不想被启发。如果有年轻的同事告诉您,这比您现在做的要聪明得多,您是否考虑使用Lisp或Haskell编写单元测试代码?

Answers:


10

起点是了解您的听众。您似乎已经了解了这一点,因为您知道指导初级同事和影响高级同事之间的区别。

您仍然需要弄清楚是什么激发了这个特定的人。适用于一个旧geezer(如我)的内容可能不适用于您的旧geezer。

如果他喜欢指导/教别人,您可以 “为什么要这样做”这样的问题来解决这个问题。这样可以进行对话,您可以要求他评估更新的方法并给出他的意见。

如果那不起作用,您可以指出可以通过使用您希望他采用的实践或样式来避免的错误。这需要做更多的工作,因为您必须查找错误并说明想要鼓励的行为将如何帮助您。

如果他似乎愿意帮助别人,您可以诉诸他帮助新手的愿望。解释说“今天的孩子”并不习惯于看到他的编码风格,因此更有可能破坏他的代码。

有时您可能只需要面对他并强迫问题。您需要仔细挑选这些战斗。确保您从一个主题开始,在此您可以向他证明自己有更好的方法。


这些似乎是一些好的通用策略。我应该清楚这只是VB6版本,而不是COBOL版本。可能比时代落后5-7年,而不是20-30年。所以不是geezer /恐龙。
2011年

1
我不会问“为什么要这样?” 这可能会产生不利影响-立即将他/她置于防守端。可能是该同事根本不知道,并且您不希望他感到无知。而是问“您是否考虑过这种方法?”
IAbstract

@IAbstract如果他喜欢教书,他不会防御,他将有机会教书。语气和态度会产生很大的变化。如果听起来您可以在问题的末尾轻松添加“白痴”,那么您是不是做对了?:-)以我的经验,大多数人都愿意回答真诚的问题。
jimreed 2011年

@IAbstract:我很确定我是否问过类似的问题,“您是否在这里考虑过依赖注入?” 答案是“嗯?” 当然,我可能会感到惊喜,但是我认为吉姆是对的,问“是什么让您决定在Foo这里使用全局范围的对象?” 是一个更好的对话开始者。我不认为这被理解为攻击。这是我试图了解现有的设计。
2011年

@Aaronaught:足够公平;)虽然对DI的反应可能是“呵呵?”,但它可能引发有趣的对话,例如“嗯,我听说过,但是……”……我主要关心的是语气(正如吉姆雷德指出的那样)当然,正如吉姆雷德所说的,你必须选择自己的战斗-有时意味着背着大棍子,有时意味着一起玩沙盒。
IAbstract

4

我认为您的态度正确。只要确保指出您已经说过的所有好话-出色的解决问题能力,对业务的精明掌握等,然后请他花一点时间向他展示该小组的当前标准并给他机会问一些有关他们的问题。

当您聚在一起时,给他喝杯咖啡或其他东西,让他知道按照标准进行工作将使他更容易支持您现有的代码,并且如果有人愿意帮助他,也将使他更容易获得帮助,这将使他受益。被工作掩盖(对一直孤立工作的人来说是一大好处),等等。

确保他参与并获得很好的解释,以解释为什么您要做自己做的事情,而不是专注于为什么他不应该做自己正在做的事情,如果需要的话请其他人让他们向您解释。如果他有任何疑问和后续行动,请在之后的几个地方让自己有空,他可以参考一些地方作为您的标准示例。

如果此后他不感兴趣,那么您可以参考您链接的第一个问题。


4

确实是您经理的工作

  1. 意识到公司必须具有编码标准。不论公司规模大小,每家有些专业的公司都拥有这个。
  2. 让大家坐在一起,开始制定标准。这样,每个人都可以发表自己的意见,然后他们会更有动力去遵循标准。

如果您的经理自己没有意识到这一点,那么他们就没有工作资格。如果是这样,您应该在上述两个方面给他们一些微调。拥有一种编码标准的优点是如此之多,实际上并没有反对的理由。(如果某些程序员认为他们是“艺术家”,不应受到专业精神的限制,那么他们应该找一份从事美术的工作。)

编码标准本身应该首先集中于禁止危险的操作和危险的库功能。努力使您使用的语言更安全,更纯正。保持编码标准不受“编码样式”的影响,因为编码样式很难达成共识,而且不那么重要。公司决定制定编码标准,然后立即陷入关于{}括号放置位置的激烈讨论,这是非常经典的。

作为参考,请查看如何编写MISRA-C / C ++和CERT C / C ++ / Java标准。


这是在(错误的)假设下,我为垂直结构的软件发布者工作。不到10%的开发人员为软件发行商工作,执行人员或中层管理人员对开发人员进行微观管理并不一定是他们的责任。
亚伦诺特,2011年

2
@Aaronaught好吧,那才是您问题的真正根源。如果您所在的团队没有编码标准,并且没有至少一名资深程序员来领导和指导其他人,那将是一个糟糕的组织。每个人都会随机编码,以为他们是“艺术家”,得出平庸,不稳定,无法维护的结果,而不学习如何改进。

2

首先,您需要澄清为什么要更改此人的工作方式。如果仅仅是出于美学原因,我认为您应该重新考虑,因为这个人已经证明了他的工作方式确实有效。

但是,如果有技术原因,则应考虑通过以下方式与所述人员联系:

我对如何为您节省繁琐的时间和为公司节省金钱提出了建议。你感兴趣吗?

请注意,这应该是低落的果实,因为它们很可能需要改变现有的习惯,而这总是需要额外的努力。

即使您有成千上万的建议,也只需选择一两个,然后证明这将是一个更好的改变。

要么行得通,然后询问您是否有更多建议,否则将不行,然后将损害限制为一个或两个建议。

请注意,成功并迅速完成非常重要。

另外,您需要小心。有可能是非常做事他们这样做的方式很好的理由,但你是太新,所看到的原因。因此,请尊重您的长者,并在您认为您的建议更好之前先提出询问。您可能会学到一两个东西。


感谢您的建设性回答-尽管我认为没有第一段就可以做到。
亚伦诺特,2011年

@aaronaught,对不起,但这实际上很重要。

不,这真的不重要。它回答的是一个完全不同的问题,我已经提供了一些澄清的注释和编辑,以表明它不相关。用户在该站点(大多数情况下仅是本站点)无法将“我应该”“我如何分开,这会严重损害此处论述的整体质量和连贯性。您的警告是有效的,但无关紧要,并且有些冒犯。关于这个确切的主题,甚至还有一个非常受关注的meta问题
亚伦诺特,2011年

1
@aaronaught,您要更改此人员的编码样式的唯一原因是因为它与团队中的其他成员不同,然后您隐瞒了他的样​​式,表明您的样式更好。因此,我的评论。如果您不能在代码库中接受他当前的编码风格,请与他举行个人会议并说出这一点,并且您愿意付出很大的努力来帮助他学习如何编写他的代码。

1
@Aaronaught,对于一个没有第一段就可以做到的人,我发现您的措词选择令人反感。您是否认为可以效法别人?

1

我要严重劝阻您不要面对他,因为这会使情况迅速恶化。我意识到它是作为最后一种措施提出的,但是根据我的经验,在这一点上,开发人员已停止参与功能。

强迫问题可能会使个人变成敌人,他们将在您采取的所有行动中进行战斗。这确实会对团队产生负面影响,并且直到有人退出或被解雇才结束。

如果此人确实拥有您需要/想要的领域知识,则请他们记录该知识。


1
-1问题已经表明,OP无意以对抗的方式来解决这个问题。请彻底阅读OP的问题并回答该特定问题,而不是一般地讨论该主题。
HedgeMage 2011年

1

从轻轻地给他打断开始:我不知道您在提供反馈方面有多丰富的经验和精通。您可能已经知道,雇用甚至拒绝了以下内容,但是无论如何都可以进行。有一些准则可以在您要更改某人的行为时提供反馈。我一直在考虑以下对话结构,并且在我想提供反馈(因为它们起作用)的情况下仍然尝试使用以下结构:

  1. 描述您看到的行为。这必须是具体的行为。示例:“我发现您在代码中使用了很多静态变量”
  2. 描述这对您/您的团队有何影响。示例:“我发现这样的代码难以维护”
  3. 提供合理的解决方案。(其他答案中提到了可能的解决方案,稍后我将自己涉猎到该答案中。)
  4. 给他机会讨论解决方案。问他对解决方案的看法。以他的回应为荣。您已经给了他您的意见,他可以自由地接受或拒绝。*

例如,可以在http://managementhelp.org/communicationsskills/feedback.htm上找到有关反馈的快速资源(尽管网络上有大量这类东西)

现在在解决方案部分,根据我在您的回答中看到的内容,我发现他非常聪明,并且心态正确,但是在现代良好实践中他仍然落后。除了首先了解它们之外,这些还需要时间和精力来掌握,因此您必须为他提供这样做的机会。这可能意味着收集学习资源(网络,杂志,书籍等)作为起点,并为他提供空闲时间进行学习。我可以想象每个星期五下午都给他,以拓宽他对编程风格的了解,他可以做任何他认为可以促进实现这些目标的事情。人们天生希望提高自己。提供材料和时间,他们将充分利用它。

可能最重要的是,不要指望一夜之间就能改变。他做了很长一段时间的事情,并且可能已经做得很好。在一种新的做事方式上变得很出色将需要一些时间,而且有一段时间,他可能不会在新的方式上看到太多的价值,因为在开始时,没有任何价值。他的旧方法可能会在一段时间内更有效。

*注意:关于对话的有趣之处在于很难建模。他们有自己的生活,因此尽管在纸上看起来不错,但往往会有点混乱。


0

在项目开始时,请让他进行工作,向其解释您希望如何完成工作,并向他展示如何与您为该项目做出的设计和建筑选择一起工作。一对一地(私下)坐下来,并解释您在他以前的编码中看到的问题,以及为什么它们是该项目的问题。问他要变得更好需要什么,但要明确指出,不变得更好是不可行的。

然后使用代码审查作为一种工具,让他调整自己的工作方式。为第一个计划好一段很长的时间,然后真正谈论为什么你更喜欢这个,然后让他解释他的理由。确保真正听到他的声音,当人们感到自己的担忧已解决时,他们更容易改变。在您的计划中期望(但不要告诉他)对第一个任务进行重做,并且在达到您的团队标准之前不要接受它。一旦他知道了您的期望并且您不会为了时间利益而让它滑倒,他很可能会改变您的工作方式。但是您可能不得不将代码审查作为教育工具进行多次迭代。您不必讨厌在工作达到标准之前不接受工作,但您必须坚定并保持一致。不要


-1

$ 64,000的问题是他是否按时交付项目并满足功能要求。如果是这样,他做对了。在软件开发中,没有客观的对与错。最终,它与解决问题有关。并且,如果解决了客户/客户满意的问题,那么根据定义,软件开发就可以正确完成。

如果他的项目没有完成,这当然将变成完全不同的问题。此时,您的主管可能需要进行更改,也许需要您的输入。但是,仅仅因为他违反了您对代码美学的个人观念或当今的传统观念,并不意味着他正在做的事情是“错误的”。您不是“好代码”定义的提倡者。毕竟,他可能对您的代码不满意。

所以...除非他的工作确实有问题(您尚未指出有问题),否则请不要做任何事情。成为一名成功的开发人员的一部分是学习将您的代码与其他开发人员的样式合并。

毕竟,他可以在这里发表一个类似的问题,即与经验不足的开发人员打交道,后者比起完成项目更关心赶时髦。这全都是关于视角的。


2
出于这个原因,我指出他来自公司的不同部门。他完全可以满足他们的要求,但是他们的要求不是我们的要求。具体来说,他们的要求没有比CRUD先进得多。是的,还有就是与代码中的问题; 它可能孤立地工作正常,但不会通过集成,性能或可靠性测试。我不相信XP或TDD等严格的方法,但这不是美学或传统知识的问题,而是维护要求的问题。
亚伦诺特,2011年

3
我也不是出于上述原因,而是因为您做出了一些不必要的假设。(a)我经验不足,(b)我所谈论的事情都没有被合理地称为“时尚”,并且(c)这是最可笑的假设-他不是最有生产力的开发商团队,当然并没有比我更有生产力。
亚伦诺特,2011年

如果他生产的产品确实存在问题,那么正如我所说,这对您的主管或您的共同主管而言都是一个问题。但是您没有显示出他交付给客户/客户的东西有问题,只是您不喜欢他交付给您的东西。我要说的是,他不是为您编写软件。因此,在您引起轰动之前,我要确保他的重要性不亚于您。
GrandmasterB

至于时尚,在业界徘徊了一段时间,您会意识到,是的,今天的最佳实践是明天的VB6风格的不良实践。至于投票,请放心。我只是在回答发布的问题。我无法回复您未提供的详细信息。
GrandmasterB

1
我不知道您的简历,也不知道您的同事的简历。我只知道你的问题。如果这是重要信息,则应将其包括在内。根据您对其他答案的回答,您可能会认为您遗漏了很多内容,因此回答者需要做出很多假设。但是,如果您想得到一个答案,那么假设您不希望其上司,其上司或您的共同上司的问题担心如何不引起骚动。只需拒绝在测试中引起问题的代码,然后向您的同事报告问题所在。
GrandmasterB

-1

作为初级开发人员与高级开发人员进行交流,您尝试以比他自己的想法更好的想法来接近他的风险太大。

解决此问题的最佳方法是尝试说服您的老板更好的做法,并查看他/她是否会下令所有代码必须遵循特定标准并通过对等代码审阅来强制执行这些标准。

即使他们完全不了解自己的潜意识动机,也有相当一部分人(即使在潜意识层次上)是斗气,自负和防御的,如果您试图改变他们或暗示自己在错误中是错误的,他们将受到攻击。任何方式。

指挥链是最安全的方法,因为他必须听老板的话,也不必喜欢他。让老板当坏人,这就是他的目标。

如果您不能卖掉老板或他是老板,那么只需处理他的错误,而是以您的代码中的示例为先导。


1
这回答的问题与我提出的问题完全不同。(a)我不是初级开发人员,(b)我的老板已经将大多数重要的设计和代码决策委托给我,(c)众所周知,他的代码没有漏洞,只是对于C#的OOP而言结构不佳/功能混合范式,(d)我的问题的实质是如何以一种不会冒犯他人的方式来对待主题。
亚伦诺特,2011年

1
@ Aaronaught,a)“我比我大一岁”,我从这句话中假设你是他的“初级”。b)听起来像是您的技术负责人,那么您应该将这些信息放入您的问题中,它会大大改变事情。c)如果他没有遵循最佳实践,并且他的代码不是越野车,那又是什么问题呢?为什么要向他询问任何事情?不要修复未损坏的内容。d)同样,如果他没有引起代码质量差的错误,请不要接近他。真正的问题是您没有每个人都必须遵守的编码和开发标准。
maple_shaft

我认为这很明显是由我的提述(而不是)“闯入枪支并制定切细的代码审查和严格执行的政策”-为什么我什至会提到如果我是初中?谁说我们没有标准?他以前从未与我们的团队一起工作过,而我正在尝试引入这些标准,而不会对它有所顾忌
亚伦诺特,2011年

-1没有回答所提问题。
HedgeMage 2011年

-1

你不能

您不能激发人们去做他们在软件开发中不知道的事情。我的经验是我在职业生涯中经常尝试这样做的结果,每次最终结果都是我的地位在公司眼中消失;一无所获,我什至被解雇或沮丧,仅仅是因为试图将我周围的发展文化改进为现代实践。

如果您的同事不懂事,可以给他们看。但是,由于它们无能为力,因此您无能为力,因为它们没有能力或对软件的工艺水平缺乏足够的重视,无法尝试采用更好的编码实践。如果您尝试的话,他们可能会忽略它,或者在没有真正理解的情况下搞乱,从听起来这就是他们已经在做的事情(“尝试和错误开发”,即只是在代码中乱搞,直到错误停止为止) 。


4
我很感激我的回答,但是,我很难相信这主要是因为几年前我正是这种类型的“随便完成”程序员。没有人向我展示-我必须自己发现所有这些-但我敢肯定,如果一位有说服力的领导者(如果有的话)能够实现同样的改变。仅仅因为一些人了解这一切独立并不一定意味着每个人别人是一个失败的事业。
亚伦诺特,2011年

2
没错,但是根据我的经验,如果人们关心改善,他们几乎不需要激励就可以激发灵感,因为渴望已经存在-他们可能需要轻推或提出建议,但是他们理解并想要改善,只需要指导即可。我也是一样。我学到了不良的做事方​​式,并认为“必须有更好的方式”,并开始进行研究。但是我所看到的是那些不进步或不愿意进步的迷失了原因,因为他们不想进步。话虽如此,但最好的运气是证明我做错了:)
韦恩·莫利纳

1
我认为这些是需要证实的声明。关于您尝试失败(以及尝试失败的原因)的过程,我当然会对聆听(并且更愿意提出意见)感兴趣。
亚伦诺特,2011年

1
有时候这是对的,例如“ 老狗,新招 ”-尝试向某人解释技术如何将数据检索效率提高了800%,而同事只是耸了耸肩。
IAbstract

2
关键是,您可以做到这一点,并且人们会跟随您,但是您需要在层次结构中排名更高。作为大多数团队中的简单开发人员,您无法做到这一点。许多同事只能听取上级领导的未征求意见。如果您处于同一水平,他们会感到受伤和攻击。请记住,赢得尊重。如果您很好地对待他们,并愉快而愉快地进行交流,那么即使您处于同一水平,它也可以工作。
猎鹰
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.