166

我和一个程序员在代码质量方面经常发生分歧。他坚持认为,他的所有代码都是按照最高标准编写的(即,它看起来就像编码风格教科书中的示例),而不管这对功能有何影响。I、 另一方面,更重要的是,编写的代码要满足业务的需求,即它工作效率高,开发时间不长,并且可以合理地维护。

我们最近发生了一场争论,他写了一个特定的剧本很棒,风格完美,正如各种书籍所描述的最佳实践。我有一个替代版本,它是使用所谓的“反模式”编写的,他坚持认为这是绝对可怕的代码,不应该使用。然而,它也碰巧跑得快了大约五倍。

我一直在试图说服他,他需要使用这个反模式,即使它是“坏代码”,因为快速运行比好看更重要。他不同意,并直截了当地拒绝考虑编写任何不符合公认的“好”风格模式的代码,即使这意味着编写时间更长,性能也不好。

示例:他想使用ORM访问数据库。对于一个特别复杂的查询,ORM并没有很好地对其进行优化,它需要4个多小时才能运行。我直接插入了一些原始SQL,并将执行时间减少到30秒以下。他强烈反对直接编写原始sql查询是一种糟糕的做法,我们应该始终使用ORM。现在他拒绝处理程序的这一部分。

我曾试图解释,拥有一个运行良好的程序比拥有看起来不错的代码更重要,但他只是说“不,不是这样的”,然后继续编写他时尚、低效的代码,有时我不得不重写得很糟糕,然后才能使用。

目前,我们的处境很糟糕,因为他拒绝妥协他的标准,这意味着他做的每件事都必须经过我的检查,在某些情况下还需要修改,以确保它符合业务的需要,而不仅仅是他的审美标准。

我如何才能说服他重新确定优先级,并将业务目标置于其代码的美观之上?

编辑:Stephan Kolassa建议我包括以下内容:从技术上讲,我是他的经理,但我们是一家小公司(约10人),所以我也会进行编程,同时也是他的同行,这只会让事情变得更复杂,而且我们没有任何固定的组织标准或冲突解决程序。

25
  • 27
    这个程序员有什么经验?如果是初级开发人员,他可能只是需要了解现实世界和教科书是不同的。如果它是一个更高级的开发人员,它可能会是一个不同的方法。
    – 科西卡
    评论 2015年6月2日19:48
  • 112
    我注意到您说过,最差的代码运行速度要快五倍,这是一件好事。谁在乎它是否跑得快五倍?据我所知,运行时间为0.01秒的脚本和运行时间为1.0秒的脚本在相同的时间内运行,但其中一个比另一个快一百倍。您应该使用的指标是脚本是否满足记录的性能要求?,不是哪个更快.可能是这样也不足够快了。
    – 利珀特
    评论 2015年6月2日20:11
  • 4
    请在链接的聊天室进行讨论。这些评论稍后将被删除。 评论 2015年6月2日21:41
  • 9
    由于系统出现故障,我无法发布答案,我将在此处添加。另一个开发人员谈论代码质量。根据我的经验,漂亮的代码总是能产生高质量的系统。然而,在这种情况下,代码并不是在每个级别都很优雅。ORM无法为所需问题生成优雅的SQL代码,从而导致性能问题。我建议您向开发人员解释一下,如果他想纯粹地使用他的解决方案,那么他就会明白ORM有其局限性,并且不是最优雅的解决方案。如果他担心可维护性,那么添加单元测试 评论 2015年6月4日9:48
  • 15
    你愿意为每一个百分比的加速花费多少美元?当然,速度越快越好,但价格越便宜,功能越多越好。这些东西都是要花钱的,如果你没有在它们之间做出明智的权衡,那么可能有人超支了。
    – 利珀特
    评论 2015年6月5日4:21

19个答案19

重置为默认值
169

我不会试图规定他的编码风格,让他按照自己的方式来做。如果绩效是一项实际记录在案的业务要求,而他未能实现,那么就请他出面。

如果他继续没有达到业务要求,那么他就是没有做好自己的工作,开始给他正式的口头警告,然后是书面警告,如果你必须的话,就放他走。

2
  • 评论不用于展开讨论;这段对话移动到聊天.
    – 恩德兰
    评论 2015年6月4日10:29
  • 10
    @用户,您好。在Workplace上,我们寻找的答案也可以解释为什么?怎样通过这种方式,读者可以理解答案背后的推理,并可以对答案的正确性做出更有教育意义的解释。你能编辑这篇帖子包括了为什么这是最好的答案?谢谢您! 评论 2015年6月6日8:06
94

看起来你有一个首席女主角,甚至更糟,米歇尔·安吉洛,在为你工作。他从事编程工作多久了?我之所以问这个问题,是因为从事编程和编程业务之间存在巨大差异。那些我们在战壕里待了很长时间的人可以告诉他,完美可能是丑陋的。

他的代码可能是教科书上的好代码,但现实是,这段代码必须执行,运行时间为4小时,而不是30秒——这段代码很难被描述为执行。我从事软件工程,但来自众议院的Devops一方:如果代码不能扩展,那么无论代码编写和文档记录得多么好,代码都是不好的。而性能不佳的有弹性、可维护的代码是不好的。就我而言,要么他明白我的意思,要么他就走了。他有自由以自己的风格编写代码,但代码必须执行。

不要告诉他去反模式。告诉他你的要求是什么,给他一个最后期限,给他自由思考如何满足它。考虑到他对自己的代码被写成教科书的热情,他有充分的动机满足你的要求,同时尽可能保持他的代码是教科书,这不是一件坏事。

作为他的经理,你将不得不对他发号施令,制定法律。你必须告诉他,他对自己准则中的表现负责,你必须确保上级有权坚持这种责任制。我会鼓励他:作为他的经理,如果他的代码没有执行,你将被追究责任。把他放在现场,因为如果你不这样做,你的最高管理层将首先追捕的人就是你。

你说你“技术上”是他的经理。好吧,要么你是他的经理,要么你不是。下定决心(*)

如果你是他的经理,那么他对你负责,就像你对你的管理层负责一样。在这种情况下,做出他不愿听的解释的时间结束了。不可协商的要求是代码必须执行,他必须满足该要求。这就是一切。

(*)早在1987年,我就遇到了一个类似的问题,当时有一位环境工程师,他并没有真正遵循您制定的最佳实践。由于我的头衔与他的头衔是同等的,他对我说的任何话都不予理睬。我在他、部门负责人和我之间安排了一次三方约会,我在会上明确阐述了不遵循我们的流程会产生什么影响。议长命令他服从,然后私下里对我说了几句话,说我很严厉。我不介意这种指责——对我来说唯一重要的是,我得到了遵守,他不再在我们的船底钻孔。高层管理层的升级看起来并不好看,但确实奏效了。这就是我所关心的。

8
  • 48
    我喜欢把它交给他挑战的想法。没有一个好的程序员能够抵抗挑战。“找到一种方法,让这段跑步时间不超过60秒,你可以让它看起来像你想要的那样漂亮,只要它能在60秒内跑完,就可以遵循你想要的任何最佳实践。” 评论 2015年6月2日17:29
  • 4
    @我认为发展挑战和智力挑战是有区别的。避免发展挑战是一个智力挑战。如果你做得好,乐趣来自智力挑战。听起来这家伙对自己没有智力挑战感到自满,这实际上使他成为了一个糟糕的程序员,尽管他声称自己掌握了风格和最佳实践。 评论 2015年6月4日11:48
  • 4
    +1代表“完美可能是丑陋的”——这是千真万确的,尤其是当你依赖别人不完美的软件时!出于兴趣,“在船底钻孔”是隐喻还是字面意思? 评论 2015年6月4日11:59
  • 2
    @然后我们只能同意不同意。根据我们所读到的内容,他似乎是一个糟糕的程序员,但我不会说他寻找智力挑战的野心就是其中之一。我不认为擅长编程需要你在任何层面上享受它。 评论 2015年6月4日16:24
  • 4
    米开朗基罗创作的作品至今仍为人们所铭记,那些希望他更快完成,或使用更便宜的颜料,更少人力等的人叫什么名字?当然,更有可能的是,这个人只是一个糟糕的装饰师。 评论 2015年6月8日7:20
76

作为高级开发人员,你们俩都是对的。它是找到你必须努力实现的平衡。

首先,从你的角度来看,你的要求应该明确。我建议使用行为驱动发展方法。这允许您详细说明您的需求,并确保软件满足这些需求。

这是当前应遵循的最佳实践测试驱动开发(TDD)实践。在这种情况下,开发人员编写“刚好足够”的代码来解决问题——编写失败的测试并使其通过。这些BDD定义将是起点。进一步的单元测试将退出,但一旦所有BDD测试都是绿色的,您就可以确保满足要求。

在整个过程中,您需要继续对话,通常是在开发的开始和结束时。这确保了双方都理解需求,消除了任何歧义。此外,此对话可以概述请求的重要性或价值。

对于未来的开发和维护来说,代码清晰易懂是很重要的。然而,应在持续抛光和交付价值之间取得平衡。

如果你和他都没有——我建议你读一读《干净代码:敏捷软件手艺手册》,作者:Robert C.Martin.

参考你的ORM辩论,ORM有其优点和缺点。正如您所强调的,他们可能速度慢、效率低,配置错误时此外,编写内联SQL可以在数据库和代码之间添加额外的耦合。为什么不直接打电话存储过程?

关于为什么应该使用ORM以及为什么不应该在web上使用ORM的文章可能很多。然而,运行查询需要四个小时,尤其是当它可以优化到30秒时,这是不可接受的。

最后想一想,这是你唯一的开发人员吗?也许他会从与其他人的配对编程中受益?也许他就是不适合在你公司工作?

2
  • 17
    伙计们,我知道这里有很多人是从Stack Overflow开始的,但你已经不在了。将技术讨论带到聊天室。 评论 2015年6月3日7:25
  • 2
    评论不用于展开讨论;这次对话移动到聊天.(抄送:Lilienthal)
    – 恩德兰
    评论 2015年6月3日18:15
41

首先,你们俩都错了。他坚持代码看起来不错是错误的,而你坚持使用反模式是错误的。开发软件的适当方法位于两种思想的中间。可以遵循最佳实践,但仍然有可以快速开发、具有良好性能和可维护的代码,这是双方都需要做到的。

有很多方法可以做到这一点。您的开发人员似乎是那种能够看到“最佳实践”并且从不偏离的类型,即使最佳实践发生了变化。解决这个问题的最佳方法是找到一个更好的最佳实践来满足您的需求,然后你们俩都必须遵循它。

重要的是不要拘泥于术语或精确的方法论,这听起来可能会给开发人员带来问题。如果您无法实现最佳实践,或者如果它导致代码性能低下,那么最佳实践就没有任何用处。与其和你的开发人员争论,你应该试着理解为什么他拒绝写看起来不好的代码,然后把他推向一个允许他写好看的代码和性能好的代码的实践。

如果您不认为格式是一个问题,只需在谷歌上搜索短语“空格或缩进编程”并对所有这些感到惊讶。代码的格式与它的长期可维护性有很大关系。此外,请查看一些这些书,由Jeff Atwood推荐。它们都很好,可以帮助您更好地理解为什么您和您的开发人员一样错误。

最终,您需要停止与开发人员竞争。你们是对立的,如果你们都说“我是对的”,你永远不会好起来。你必须试着了解他从哪里来,希望他能看到你的努力,然后试着了解你从哪里来。也许如果您尝试使用另一种看起来仍然不错的“最佳实践”来优化4小时查询,他会更好地理解。

几个开发方法的一些链接:

还有很多其他的。有些是好的,有些是坏的。有些是因为某种原因而不再使用的。我们的工作支付了敏捷研讨会的费用,在研讨会上我们概括地介绍了敏捷,并选择了这些原则的一个子集来实现。它在很多方面帮助了我们,也在一些方面阻碍了我们。这比我们以前做的要好得多,但在我们的案例中,问题都与流程相关。

我们发现,最大的帮助是学会专注于最低可行的产品。这意味着我们首先为客户提供最小的功能以满足他们的需求,并根据需要进行扩展。这样可以防止软件被客户从未要求的东西弄得臃肿不堪。

4
  • 2
    是的,在我能找到一本书或一篇权威博客文章来描述我想实现的解决方案的罕见情况下,他愿意这样做——我认为他的反对意见是,他不想使用任何代码模式或框架,除非他在别处见过描述。 评论 2015年6月2日12:33
  • 5
    特定的4小时查询本可以以不同的方式进行优化,这样他会很乐意使用它,但这将增加超过一周的工作(可能两周)的开发时间。考虑到除了那个查询之外的整个任务花费了不到一周的时间,我认为时间开销是不合理的。 评论 2015年6月2日12:33
  • 2
    @在这两种情况下,我都会说“是吗?”如果你知道如何让他明白原因,你应该这样做。但也许不那么具体。找到一种全面的方法,让他更快地关注好的代码。敏捷有一系列方法来帮助实现这一点。而且,适当的编程有时会提前花费更多的时间,这总是可以通过以后的生产力改进来证明。 评论 2015年6月2日12:52
  • 6
    “以后生产力的提高总是证明这一点的”-请小心使用总是; 我能想到很多例外情况。 评论 2015年6月3日3:24
40

我从未在任何领域遇到过一个称职的人,他重视严格遵守规则和形式,而不是结果和功能。如果用旗帜包裹自己是歹徒的第一避难所,那么用一套严格的规则包裹自己是无能者的第一避难所。

我会担心你被一个“Cargo Cult”或“cookbook”程序员困住了,也就是说,他不懂自己的手艺,只是模仿别人的例子。

他可能执着于模式和格式,如此顽强地伪装,以至于他实际上不知道什么时候使用哪些模式和实践的细微差别。他使用有关个人和职业诚信的道德论据,声称这些道德论据要求他以“唯一正确的方式”编写代码,以掩盖他不知道其他方式编写代码的事实。

我认为这很清楚,因为所有关于“最佳实践“总是带着警告,”对于以下情况或参数。“没有一套通用的“最佳实践”总是每个项目的最佳选择。

特别是,最佳实践在小型商店(如您的商店)和大型机构之间可能存在巨大差异。在较小的商店中,主要要求是速度、灵活性、执行力,最重要的是运输。如果你个子小,不发货,你就会死。格式和样式之类的问题并不重要,因为维护代码的人很可能就是编写代码的人。小商店做更多的交钥匙工作,手工调整性能是一个重要的附加值。

相反,在大型企业或政府机构中,主要需求通常是集成到大型项目中,再加上多年来没有编写代码的个人的长期可维护性。性能通常不是一个大问题,因为大公司通常可以在这个问题上投入更多硬件。

在我看来,你的程序员专注于大型机构编程的“最佳实践”,而不是小公司编程的最佳实践。如今,大多数书籍,甚至正规教育似乎都专注于这个市场,所以如果他真的只是模仿自己读过的东西,他可能不会真正理解“最佳实践”会随着环境的变化而变化。

我认为你需要对他进行测试,看看他到底是一个什么样的程序员,也就是说,他是一个傲慢、有技能的笨蛋,还是一个躲在表面完美主义背后的无能者。命令他生成一些手工优化的代码,就像你写的那样,看看他是否真的能做到。

如果他确实有技能,但只是注重形式而不是功能,那么你可能会让他意识到,不存在通用的“最佳实践”,也绝对不存在通用“最佳格式”

但我敢打赌,你会发现他缺乏技巧。充其量,他是一个烹饪书程序员,而不是一个牛仔黑客,如果必须的话,他可以在没有结构和规则的情况下工作(即使他不喜欢这样做)。我打赌你需要放过他。

7
  • 4
    希望我能投20次赞成票。我看到太多人把他们在学校学习的任何方法都视为“唯一正确的方法”——尽管也许我不应该抱怨,因为当我从他们的代码中获得几个数量级的性能改进时,这让我看起来很好:) 评论 2015年6月2日19:01
  • +虽然我确实遇到了不少人,他们既有能力,又完全是生意人。到目前为止,他们在实践中的能力取决于经理/团队领导——学会利用自己的优势,限制自己的弱点。这是成为一名领导者的重要组成部分。当然,他也可能只是一个笨蛋——但这真的不是OP可以自己决定的事情。但最终,您的目标是为公司和客户创造最佳价值——这通常意味着在良好的可维护性和性能/实现速度之间进行某种程度的折衷。
    – 六安
    评论 2015年6月3日14:31
  • 10
    +1个用于“他可能执着于模式和格式,如此顽强地伪装,以至于他实际上不知道什么时候使用哪些模式和实践的细微差别。”没有所谓的“最佳实践”。最佳技术和编码模式各不相同戏剧性地在不同的问题之间。为工作使用最佳工具;不要为了适应工具而改变工作。这是OP需要让程序员理解的关键。有时10000倍的加速并不重要,有时1%的加速非常重要。优秀的工程师知道区别
    – 雷拉布
    评论 2015年6月3日19:38
  • 1
    @卢安——我不确定我们这里所说的是“商业盲目性”。根据我的经验,编程技能和灵活性以及管理/业务组织之间的相关性知之甚少。他们的技能完全不同。事实上,让程序员担任经理是一个相对较新的发展。在90年代初,大多数自己管理程序员的人都没有编码经验,因为还没有足够的人参与其中。我不认为这个人对商业视而不见,他对编程视而不见,或者至少有狭隘的眼光。 评论 2015年6月5日22:02
  • @韦恩沃纳(WayneWerner)——我在大学里对我的一位教授说,这似乎是“无论你做什么,都是一种权衡。”在我年轻时的理想主义中,我不认为应该是这样,但我的教授说,“是的,热力学第二定律是一个比奇定律。”他说得对。它最终归结为第二定律的实际物理。如果你把精力放在一个特性或其他特性上,你就必须从另一个特性上窃取它。没有免费的午餐 评论 2015年6月5日22:05
30

如何向程序员解释业务优先级?

你不会,至少对这个不想听的程序员来说不会。他不是经理,显然不想被授权在没有改进业务的指导下做出决策或采取行动。

他希望以功能请求的形式输入,并希望以完美代码的形式提供输出。

你想把他训练成一个决策者,或者关心业务,这并不是一个坏愿望,但在这种情况下,你应该把这个愿望放在一边,把重点放在业务优先级上,让这个程序员富有成效。

当你有一个不工作的系统时,你可以打开它,修改它的内部结构,或者你可以修改输入直到它产生正确的输出。

在这种情况下,我建议您修改程序员的输入,而不是试图更改程序员。

我和一个程序员在代码质量方面经常发生分歧。

别再争论了。

短而甜:

  • 不要让他主导对话,谈论“代码质量”。
  • 不要告诉他他做错了,也不要浪费时间。
  • 不要相信他行为不专业,即使你很清楚他是这样。
  • 接受他“那不是我的工作”的解释并进行沟通要求给他。
  • 现在,所有未来的任务请求都需要以书面形式提出(电子邮件可以),并进行后续讨论。
  • 所有任务请求都有严格、客观的时间限制,限制了他在任务上的花费,以及任务的性能。

因此,下次您向他传达任务时,请按照以下方式进行:

描述:

我们需要在6月3日星期五之前实现、测试和部署功能X。

要求:

  • 必须包括一个捕获越界的测试用例和正确的操作。
  • 在生产数据库SOME_database上执行的时间不得超过180秒
  • 必须通过公司编码标准的LINT/etc测试。

然后在讨论过程中,找出他对这些要求是否有任何问题。如果他这样做了,那么你就完成任务或重新制定要求,以适应他的能力。把辛苦的工作从他身上移开,自己处理——你的工作和他的工作之间应该有一个清晰的界限。当他失败时,不要试图“修复”他——弄清楚他为什么没有达到你的期望,并设计一个有助于向他传达你对下一个类似任务的期望的要求。

在这一点上,我希望你能理解,你目前试图让他改变以适应你的需要的方式是行不通的。你需要了解他的能力,然后只给他分配他能做的工作。如果你到了他不再满足你需求的地步,那么你最好解雇他——如果他的利益和产出之间的商业关系对你来说不再有意义,那么就把它割断,找其他人来履行他的职责。不一定是这样。

在这一点上,我通常会对人们应该如何改变和不断提升技能发出一些和解的声音,但现在你只需要专注于了解自己的需求,然后与他清楚地沟通。一旦你明白了通信然后您可以继续帮助他提高技能,以便他能够及时编写ORM查询。在那之前,进行沟通、沟通、沟通,并接受有些任务你只需自己完成。

1
  • +1人们常常混淆需求和解决方案,尤其是当他们身兼两职时。很少有绝对和单一的正确解决方案,因此,如果需求不明确、不可测量且没有文档记录,那么争论哪个实现更好会适得其反。
    – 科琳V
    评论 2015年8月24日19:21
14

这更多的是关于代码实践,而不是业务优先级。

我是一个程序员,我的方式有点固定,但这个程序员太离谱了。我不明白为什么有人会把风格放在速度之上。ORM很方便,但效率不高。使用SQL的风格不错。为提高性能而非规范化数据库是一种不错的风格。过早优化是一种糟糕的代码实践,但优化瓶颈是一种良好的代码实践。我将检查任何需要2秒钟以上的查询。

我最讨厌的是自定义控件。业务部门会要求非常具体的外观,我会回应,但标准控件会提供信息。标准控件快速且经过测试。当我们升级时,我们不需要协调多个库。

为什么任何程序员都想使用运行4小时的ORM?测试需要4个小时。如果程序员正在努力使用SQL来减少8秒查询的4秒时间,而业务部门表示8秒足够好,我们希望保持ORM的可维护性,那么我会得到这样的争论。

至于如何说服程序员呢?我认为这更多的是一个代码实践问题,而不是业务优先级问题。企业不需要证明30秒的搜索比4小时的搜索更好。我只做ORM,因为编写原始SQL是一种糟糕的做法,这显然是不可接受的。如果语言和平台支持原始SQL,则可以接受。程序员需要参与纠正行动计划,人力资源部也需要参与其中。如果你不是他的老板,那么去找他的老板。

  • 7
    我完全同意。我是一名高级开发人员,调整技术以适应问题非常非常重要,而不是相反。。。!
    – 简·S
    评论 2015年6月2日11:27
  • 1
    当情况需要时,不编写SQL是最糟糕的做法。他太无知了,不知道这一点。在编写SQL代码时,任何人都不应该在没有全面背景知识的情况下接触ORM,因为如果你不了解数据库需要什么,那么你就是无知的,你会对系统造成伤害。数据从来都不是你不需要理解的黑盒子。数据的含义及其结构对获得正确答案至关重要。ORM在一个知道自己在做什么的人手中是一个好习惯,在一个新手手中是一场等待发生的灾难,。 评论 2015年8月24日17:14
  • 为什么任何程序员都想使用运行4小时的ORM?测试需要4个小时。仅此一项就得到了我的投票。如果程序员说风格可以节省维护代码的时间来维护自己的立场,那么关于效率如何能够减少维护成本的争论比任何“效率优于风格”的争论都要好得多。总是以对方已经承认的方式提出论点是很重要的。 评论 2017年7月31日21:00
9

根据第一原则进行辩论。

没有客户真正关心“最佳实践”。但他们当然关心质量最重要的是,他们希望问题得到解决,而且越快、越容易、越便宜越好。(从长远来看,他们还希望节省时间、金钱和精力,这是“质量”的重要组成部分。)

是的,一些客户使用“最佳实践”作为代理只因为他们的首要利益是质量、效率等。

因此,任何提供服务的人(甚至是为企业提供服务的程序员)都应该用这样的问题来评估他们的工作,比如“这是高质量的吗?”、“它交付得快吗?”

这些问题很难回答。回答诸如“我是否遵循编码约定?”、“我是否正确实现了规范?”和“我是否对每个方法都有Javadoc描述?”这样的问题要容易得多。但是一个好的程序员对他/她的代码提出一些棘手的问题。

最佳实践很重要。他们帮助从长远来看,创造出可以节省时间/金钱/资源的优质产品。当你试图做出决定,却几乎没有确凿证据表明哪种选择更好时,它们尤其有用。但是当你对备选方案有明确的信息(例如,它需要10分钟而不是4小时,以后很少有机会制造问题),那么常识胜过最佳实践!

如果你的程序员认为一段代码“很糟糕,不应该被使用”,让他从第一原则(而不是最佳实践)来证明这一点。它有错误吗?是否存在包含安全漏洞的风险?这可能会增加很多维护时间或新功能吗?它会让其他程序员感到困惑吗?它的问题真的值得花时间实现“更好”的替代方案吗?一定要听他说什么。如果他提出了强有力的论点,不要让你的自尊心推翻。

关于诚信和习惯的注释

好习惯是有价值的。如果您的开发人员不断练习和改进他们编写清晰、干净、文档化良好的代码的能力,他们将提高效率,并且不会太懒惰和偷工减料。这对你的代码库的质量很有帮助!

你的程序员显然是正直的。不要用它来杀死它!给他高质量的任务重要。例如,要求他清理其他人编写的乱七八糟的代码,这些代码变得很难维护。要求他在代码可维护的重要位置实现功能。

5

他坚持认为,他的所有代码都是按照最高标准编写的(即,它看起来就像编码风格教科书中的示例),而不管这对功能有何影响。I、 另一方面,更重要的是,编写的代码要满足业务的需求,即它工作效率高,开发时间不长,并且可以合理地维护。

你意识到你们都有相同的目标,对吗?

最佳实践之所以如此,是有原因的。它们的存在是为了使代码保持良好的组织和分离,以便有效地工作,不需要太长的时间来开发,并且具有合理的可维护性。

当然,您的开发人员可能会从少许实用主义中受益,或者更好地理解何时可以安全地改变规则。但从长远来看,代码库的质量如何帮助您实现业务目标,听起来您可能会从中受益。

你的问题是如何向程序员解释业务优先级,但听起来好像你已经做到了。你没有做的是程序员的业务优先级。你们两个需要妥协。解决这个问题的方法比“使用直接SQL”和“使用ORM”多得多。您可以改进ORM的性能。您可以将SQL隔离开来,这样程序员就不那么麻烦了。

简而言之,为了得到你想要的,你需要停止争论,开始合作。

8
  • 听起来他给了这个开发者很多机会来解释自己,而这个开发者却没有。倾听和理解程序员是一回事,让他们将应用程序结构控制到有害的水平是不可接受的
    – 齐博兹
    评论 2015年6月2日13:37
  • 1
    @Zibbobz-你怎么想的?很明显,程序员在说“代码整洁对我很重要”。他们可能无法表达为什么?好吧,但接下来要由经理来深入研究&他们应该是这个角色的熟练沟通者。我并不是说让他们发号施令,但强迫他们按照你的方式做事(微观管理)同样糟糕。 评论 2015年6月2日13:40
  • 2
    @Telastyn——你认为“代码整洁对我来说很重要”,但在我看来,这是我做的代码的结构,我拒绝使用不同的设计模式,因为我喜欢我正在使用的模式。尽管程序员使用的模式对于分配给他的任务来说效率低下。 评论 2015年6月2日18:13
  • 1
    @jamesqf-一些内部文档不是最佳实践。专家的普遍共识(如同行评审的SE答案)更为接近。 评论 2015年6月3日18:54
  • 1
    @Telastyn:我假设这里的“最佳实践”是指OP所说的编码风格的教科书、设计模式、各种流行的方法(敏捷在脑海中浮现)等等。所有人都声称自己的信徒是“最好的”,而没有AFAIK的客观证据。 评论 2015年6月3日19:23
5

老实说,我会惩罚这个家伙,如果需要的话,我会解雇他。这里已经发布的答案在解决问题的方法上有几个优点,所以我不打算重复这些。

听起来,您遇到问题的员工已经是或接近高级级别,并且了解很多有关如何编码的知识。但这并不是他的全部工作。如果你是他的经纪人,他需要倾听你的意见,无论他是否喜欢。显然,我们还没有观察到你们两人是如何讨论问题的,但肯定会变得相当紧张。是的,解决大多数问题的方法不止一种,你们都应该学会更灵活,但你所说的几句话表明,这个人是一个损害对公司而言,而非资产。

现在,他拒绝参与该项目的这一部分。

不可接受和幼稚,以及拒绝履行职责在你的工作中就我而言,这是终止合同的理由。

但他只是说“不,不是这样”,然后继续写他时髦、低效的代码,有时我不得不重写得很糟糕才能使用。

彼此彼此。

我只能想象(并希望)在你的沮丧中,你做了一些修饰,而我希望作为他的“技术上的”经理,你能够让自己达到更高的标准,并且不会与这个人产生幼稚的分歧。然而,如果情况正如你所说的那样,那么该员工对某个错误缺乏灵活性。你可能需要一些教育和指导来了解如何与难相处的人打交道,但最终,这位员工完全拒绝根据深奥的标准改进产品。只有一种方式可以影响你的客户,这很糟糕。无论这个程序员有多优秀,他们都会在某个时候成为公司的负担(也许已经是了)。

归根结底,你是在雇佣他们来生产一个有效的产品,而不是漂亮的代码。如果他们不能做到这一点,那么他们就没有做好自己的工作。

说了我的作品,试着记住它不是黑白的,而是一定地不是你反对他们,只是你对什么是对的有不同的看法。我在这里的评论是基于你的理解尝试解释业务优先级时,对方似乎并不在意,在我看来,这意味着他们不适合你的公司。也许这个家伙会在一个教授最佳实践或其他东西的网站上做得很好。

4
  • 不幸的是,这不是一个修饰——今天早上我正试图向他解释这件事,他戴上耳机,在我说话的时候转过身去。他说(引用)“我是一名程序员。我的报酬是为了编程,而不是为了考虑业务”。问题是,他的大部分代码都很好,我们真的支付不起招聘人员寻找新员工的费用,也支付不起培训他们所需的数周时间。 评论 2015年6月2日14:16
  • 4
    那么,你要做出一个艰难的决定:那种态度是完全错误的。纪律处分很可能不会让他进一步憎恨你,这也不好。你必须决定是只想和他打交道,还是经历寻找新人并训练他们的痛苦。很明显,从长远来看什么是最好的。。。贵公司是否使用激励措施?也许你可以将某种奖励/惩罚直接与企业目标挂钩。 评论 2015年6月2日15:04
  • @Benubird从长远来看,你的公司有能力留住这位拒绝听从老板意见的固执程序员吗?如果没有,他们应该开始投资招聘现在.
    – 齐博兹
    评论 2015年6月2日18:41
  • @DrewJordan谢谢你的帖子。当我开始阅读这个问题时,我立刻想到了这一点。在回答了这么多问题之后,我看不出自己的印象有什么改变。 评论 2015年6月5日7:59
4

你可能需要找出他认为重要的东西。“好风格”就是这样,风格。它需要弯曲以满足业务需求,他需要知道这一点。然而,可能存在一种潜在的恐惧,即他正在处理的问题需要解决。

作为一个案例研究,我在一个团队中工作,该团队始终以低于客户需要的速度生产软件。管理层一直对我们感到愤怒。我们有充分的理由解释这种缓慢。管理层建立了一个敌对的开发环境,在这个环境中,如果没有客户的明确命令,任何代码都无法更改。不幸的是,我们明确要求将此软件维护数十年,而很少有客户会提前一个多月考虑,这使得我们无法说服他们任何长期ROI。我们被赋予了对软件的巨大责任,但几乎没有权限对此做任何事情。我们的口号是“向客户展示的第一个工作原型将是您的最终实现”。我们从未解决过这个障碍。管理层从未与我们合作,以与我们的责任相称的方式支持该计划(实际上,我们被命令不要试图解决该问题,因为仅仅提出该问题就有可能继续获得资金)。然而,该计划最终夭折了,因为没有人会解决潜在的商业失败。

在这之后,作为开发人员,我们花了很多时间,试图找出到底出了什么问题,以及下次我们可以做些什么来避免它。我们从这次练习中得到的一个收获是,有多种方法来解决问题的价值。他喜欢ORM风格,而你用一两个SQL命令节省了无数次计算?使其能够并肩存在。通常,一种方法的价值对另一方来说并不明显,直到它完成后很长时间。允许这两种风格在野外共存,并找出哪一种能够经受住商业的严峻考验。培养方法之间的和谐感,而不是试图指定一种方法来统治所有方法。也许他用自己的极端风格完成了所有最初的开发,但最终的产品需要添加黑客。他可能能够充分隔离这些黑客,使其不会危害软件的其余部分。

如果他不接受这一点,那么他实际上错了。他不是公司的代言人,他只是一名员工。他的声音是整体的一部分,而不是整体的中心(除非你雇他做中心)。如果一名员工因为坚持原则而违反了公司的需要而不能灵活变通,那么他确实需要被解雇。但相反,开发人员对软件的看法在其他任何地方都找不到。当开发人员指出其他人很难看到的问题时,业务确实需要灵活处理。

我们的目标是找出如何让这两种观点共存足够长的时间,以便正确地探讨它们。然而,如果其中一方特别陷入泥潭,最终可能会失败。这时,你需要举行一次礼貌的讨论,解释他的编码风格不是世界的中心,如果它妨碍了业务,他将被分配任务,这使他在允许采取的方法中越来越没有自由。或者,他可以自由地同意在“工资数额”等问题上让步,以换取工作的自由。

我不想再创建一个建议迭代开发的答案,但我确实想把它附加到我的答案末尾。迭代开发使他有机会在一次迭代中探索“好的风格”,然后让您应用业务缩略图将其转化为有用的产品。你可能不知道一项任务可以在30秒内完成。然而,在第一次迭代之后,您应该有时间感。这种时间感应该允许您在第二次迭代中提供时间需求。

如果你给了一个业务要求,要求查询时间不超过5分钟,而他说无法完成,那么礼貌地把任务从他那里拿走,自己做。让他摆弄自己的大拇指,直到他开始意识到自己的薪水在jeprody。

4

我读过的关于这个主题的最佳答案来自C++常见问题解答。

https://isocp.org/wiki/faq/big-picture#biz-主导技术

你可能不喜欢这样,但简短的回答是“不”(但要注意,这个答案是针对实践者的,而不是理论家。)

成熟的软件设计师根据业务标准(时间、金钱和风险)以及技术标准(例如某个东西是否是“良好的OO”或“良好的类设计”)来评估情况这要困难得多,因为它涉及到业务问题(日程安排、人员技能、找出公司想要去哪里,以便我们知道在软件中设计灵活性的位置、是否愿意考虑未来变化的可能性——可能发生的变化,而不仅仅是理论上可能发生的改变,等等)除了技术问题。然而,它导致的决策更有可能带来良好的业务结果。

作为一名开发商,你对雇主负有受托责任,只以合理预期投资回报的方式进行投资。如果除了技术问题之外,你不去问业务问题,那么你的决策将产生随机且不可预测的业务后果。

不管你喜不喜欢,实际上这意味着你最好还是不定义“好的类设计”和“好的OO”之类的术语。事实上,我认为对这些术语的精确、纯粹的技术定义可能是危险的,可能会让公司蒙受损失,最终甚至可能会让人们失去工作。这听起来很奇怪,但有一个很好的理由:如果这些术语是用精确的纯技术术语定义的,那么善意的开发人员在实现这些纯技术定义的“好”时往往会忽略业务考虑

“好”的任何纯粹技术定义,例如“好OO”或“好设计”,或任何其他可以评估的内容,而不考虑时间表、业务目标(以便我们知道投资方向)、预期的未来变化、关于未来投资意愿的企业文化,进行维护等工作的团队的技能水平是危险的。这是危险的,因为它欺骗程序员,使他们认为自己正在做出“正确”的决策,而实际上他们可能正在做出具有可怕后果的决策。或者,这些决策可能不会产生可怕的业务后果,但关键是:当您在决策时忽略业务考虑因素时,业务后果将是随机的,并且有点不可预测。那太糟糕了。

一个简单的事实是,业务问题支配着技术问题,任何对“好”的定义如果不承认这一事实,都是不好的。

考虑以下陈述:

  • 作为一名程序员,创建合理高效的代码是你工作的一部分,就像打字员的工作是打字速度相当快一样。

然后向他展示如何大幅改进代码的示例。

如果他不能(或不愿意)把这句话和你的例子联系起来,你需要除掉他。这就像有一个客户服务代表拒绝使用他们的手机,因为他们更喜欢给客户发电子邮件。

2
  • 2
    听起来OP已经尝试过了,程序员已经多次拒绝“改进”版本。 评论 2015年6月2日13:56
  • 然后答案的第二部分适用:“……你需要摆脱他。” 评论 2015年6月2日15:26

实际上有两个不同的问题:一个是软件开发人员(可以理解)想要创建最高质量的代码,而企业希望他创建的代码能够同时提供尽可能多的功能。

有一个必须采取的折衷方案:在某种程度上,对代码的过度润色不再提供任何优势。另一方面,如果代码质量不够好,您将得到生成错误结果、崩溃、速度太慢或无法维护的代码。

您需要说服开发人员不要做得过火,他们需要说服您,不遵守某些有限的标准有时在短期内代价高昂,而在长期内往往代价高昂。另一方面,如果只在短时间内交付,业务的长期成本就可以接受。如果您无法说服开发人员生成正确的数量的质量,它花费你的钱,你可能需要分开。(显然,如果有人在八小时内生产出低质量的产品,而另一个人在八小时内生产出高质量的产品,而不能在六小时内生产出低质量的产品,你仍然更喜欢第二个开发人员。或者,如果该开发人员乐于创造高质量和高生产力,并迫使他放弃质量,你会让他不高兴和不受欢迎uctive,这也不好)。

另一个问题:似乎您的开发人员坚持使用一些低效的正式方法,而不是使用非常高效的非正式方法(当低效实际上是业务的问题时)。我认为这是一个严重的问题。如果企业有一个需要解决的问题,那么任何不能解决问题的技术都是不可接受的,并且在知道解决问题的不同技术的情况下坚持使用这种技术,我觉得这是不可接受的。

如果有必要,开发人员可以自由地在代码中添加注释,并大声斥责为什么他使用的技术比其他技术差得多,但这需要提高效率。(如果有人问他为什么在两年内使用这种方法,那么写下原因可能是一个好主意。)然而,需要做的事情还需要做。

2
  • 我不同意程序员“想要创建最高质量的代码”。相反,他内在化了一个质量定义,这个定义遵循抽象的学术(我甚至会说准宗教)标准,但与雇主所需的标准没有任何关系,也就是说,代码在实际时间内运行,并且是可维护的。(对于不熟悉这些标准的人来说,按照特定学术标准编写的代码有时难以理解。) 评论 2015年6月2日23:23
  • 我的一句话是“最佳实践并非图灵完全”。
    – 约书亚
    评论 2015年6月5日3:59
2

这是他的态度的问题,需要改变。

他的意图似乎很高尚——他试图实现他在学校学到的代码,他学到的代码对程序来说是安全和卫生的,并且坚持编码的最佳实践。这是你想从程序员身上得到的东西。

你怎么了不要希望他能感觉到,他可以就应用程序应该如何运行做出顶层决策。我想他是一个年少者他还没有学会适应特殊情况,更不用说你自己的应用程序的复杂性了。

如果这是一个重复的事件,我建议你和他谈谈最佳实践,尽管遵循起来很好,但并不总是正确的解决方案。同时提醒他他的老板,你不会容忍他拒绝你的决定或背着你去规划“他的”方式。

在个人层面上,你的团队应该在你提交之前进行代码审查——因此,利用这个机会检查一下他格式良好但效率极低的代码,并一步一步地列出为什么它效率低下。

如果他拒绝改变,就把改变交给别人,或者接管自己。不幸的是,这可能是一个迹象,表明他在团队中绝对表现不好,你可能最终不得不放过他,或者找到一个与他“总是严格”的编码风格更好的团队。

9
  • 我试着解释说,最佳实践并不总是最佳解决方案,但他就是不明白——我一定没有很好地解释。我想你不能给我提供一些资料来解释它,也许比我能做的更好? 评论 2015年6月2日13:38
  • @Benubird我会给你指出这个问题投票率最高的答案虽然如果你想要更具体的个人问题,有一整个SE都致力于这类事情
    – 齐博兹
    评论 2015年6月2日13:41
  • @Benubird——我建议你不要再挑战“最佳实践”,相反,我建议他需要找到一种方法,以商业上合理的方式应用这些最佳实践。 评论 2015年6月2日13:52
  • 1
    @Zibbobz-我同意。但是,当你挑战某人坚定的信仰时,他们会立即感到需要捍卫自己的信仰,因此,任何对该信仰的挑战都是需要捍卫的,而任何其他观点都会被忽视。因此,与其直接挑战这些信念,不如让程序员自己决定还有其他的方法来做事情。如果效率低得多,那么程序员很可能会滥用最佳实践。 评论 2015年6月2日13:59
  • 1
    @Zibbobz-如果问题是“我应该除掉这个程序员吗”,那么这将是一个有效的答案。OP问他如何与程序员沟通。就像OP希望程序员有效率一样,OP也在问他如何才能成为更有效率的管理者。因此,与其建议他以不同的方式撞墙,不如建议他绕开墙。(你的比喻不是我的) 评论 2015年6月2日14:24
2

在你的问题中,你没有谈论代码的工作正确地。也许你的程序员花了太多时间让代码看起来很漂亮,但也许他正在彻底检查错误。好的代码有几个要求:

  • 它必须在可接受的时间内工作
    • 可接受可能意味着至少95%或永远不低于100%——这是你的定义
  • 它不能在其他代码/系统中产生副作用(参见第一点)
  • 它必须是可维护的
    • 格式良好的代码比格式不良的代码更容易维护
  • 它必须在截止日期前交付(无论何时交付,并记住截止日期可以根据业务需求重新设置)
  • 必须负担得起
  • 可能还有很多其他方面

作为整个企业的管理者/代表,您需要高质量、低成本和快速开发的代码。不幸的是,经验表明你只能得到其中的两个。高质量、快速开发的代码代价高昂。快速开发、廉价的代码质量很低。开发高质量、低成本的代码需要很长时间。

一些程序员不会在质量上妥协(我承认我就是其中之一),因为在排除故障、修复错误和重写之后需要大量额外的时间。我不会故意让一个新的bug上线。

我曾经做过一个巨大的、写得很糟糕的项目。代码是从第三方继承的,我们有非常优秀的开发人员在开发它。业务部门不断要求它更好,我们一直说“这是最好的”。我们最终确实让代码表现得更好,但这需要6个月到一年的时间才能实现,而且我们当时还不清楚如何让代码运行得更快。当我们说“这是最好的”时,我们真正的意思是“我们已经用尽了我们目前的所有想法”。

您的程序员可能也处于类似的情况。他确实在尽自己最大的努力,想不出任何更好的做事方式。他可能不喜欢被强行灌输某些想法,并会自动拒绝这些想法。如果他独立提出相同的想法,你们都会赢!作为一家小公司,意味着他可能没有太多机会向其他人征求意见,或者从与项目关系不大的人那里获得横向思考的想法。

在研究过其他人的代码之后,我可以告诉你,有时我需要花半个小时重新格式化代码,然后才能开始理解它。格式化代码对程序员的效率至关重要,尽管它可能运行相同。

不要试图说服程序员接受“坏代码”。解释为什么做同一件事有多种方法,仅仅因为其中一种是“好代码”,它不会自动将其他方法变成“坏代码”。你需要向他表明你支持他。你也想要好的代码!但接下来要定义什么是好代码。如果性能很重要,那么就给他一个挑战,让它具有性能!明确说明预期结果。例如,我们需要每小时运行1000次这个查询,这意味着它必须能够至少每3.6秒运行一次(这可能是糟糕的性能!)

他被聘为技术专家,而不是商业专家。因此,他的职业目标可能不是你所希望的。你需要解释他所做的事情如何影响其他业务,同时还要了解其他业务如何影响他的工作。除非你打算解雇他,否则我不建议对他进行绩效管理。

您还可以研究自动代码格式化程序的可能性。这样,他可以专注于编程,并使用宏或小实用程序以他喜欢的方式在不到一秒钟的时间内重新格式化代码。对于SQL,我同意他的观点,即直接编写查询是不好的,但是,例如在PHP中,您可以使用PDO来执行完全相同的查询,并对输入进行清理。这是很好的实践!应该有一个折衷方案,你可以获得你想要的速度,而他可以获得他想要的“好代码”。

我还建议让他分析代码,找出瓶颈,并将其作为效率的优先事项。最后,如果他漂亮的代码工作得很快(而且他写得很快),你不介意吧?你想让他看到你的观点,从而证明你俩都能看到和价值他的观点。你必须修复对你的职业关系造成的损害,重要的是你们要相互信任。

1
  • 编写SQl代码并没有本质上的坏处,事实上,在许多情况下,这是正确的做法。数据库更喜欢编写良好的SQl(在非数据库专家的眼中,这通常并不优雅),因为这是它们设计的最佳性能。写得不好的代码,特别是当它被设计成可以进行SQl注入时,这是不好的,编写得好的SQl代码是好的,而且通常是必要的。ORM的问题是,你失去了培训某人如何解决ORM不适合解决的难题的能力,因为他们从来没有学习过SQL基础知识。 评论 2015年8月24日17:26
2

这可能很棘手。这在很大程度上取决于他的行为会对什么产生负面影响。


程序性能

一个好的程序员应该理解接口和实现的分离。就项目而言,需求就是“接口”和良好的设计

我想你至少要对这个项目的要求负部分责任。您可以为该脚本创建一个在6分钟内运行的要求。

只要他符合要求,你就不在乎什么他正在做。(这是实现。)

这可能有助于他从其他人的角度来看这一点(那些看不到源代码的人)他的节目很糟糕.


开发时间

这有点棘手。一方面,你可以腾出时间来完成一个项目的“需求”,但估计完成一个工程的时间则(适当地)留给构建它的人。

这与他的工作表现有很大关系。你应该像对待其他工作表现问题一样对待它。这可能意味着要开一次严肃的会议,在会上你要表达你对他是否有能力及时完成工作的担忧等等。这里没有简单的解决方案。

0

这个程序员拒绝处理这个组件的事实对我来说是一个明显的信号,表明这是组件的责任问题。

从客户的角度来看,您的优化是正确的:程序的黑匣子执行得更好,而您的公司作为实体负责整个黑匣子。

在您的公司内部,每个人都要对单个组件负责,每当组件损坏时,责任都落在该组件的维护者身上。

你不能将责任与决策权分离开来。

作为管理者,否决决策是你的特权,但同时你也要对决策承担全部责任,其中包括一份书面记录,记录程序员的反对意见及其被否决的原因,并给每个人一份副本。

你的程序员预测这将带来负面后果,并试图掩盖他的下半身。

2
  • 4
    这并不是对问题的回答,而是对问题的重新分析。。。已经有很多了。 评论 2015年6月2日18:09
  • 2
    @答案是为这个决定承担责任。其他答案都没有谈到这一点。 评论 2015年6月2日19:39
0

告诉他他的工作不是写程序就其本身而言,他的工作是编写代码,为公司增加利润。

提醒他,为了让他作为一名员工在商业上可行,他编写的代码必须在商业上切实可行。如果他不能做到这一点,那么他将成为公司的商业责任,并将被视为商业责任。你说你是一家小公司,所以他有可能把整个公司搞垮。

此外,你可以解释说,他可以在自己的空闲时间写一些有趣的程序(或提高自己的技能),很多程序员都这样做。但在公司时间写的程序需要为公司带来利润。

如果他拒绝改变自己的风格(可能是为了让代码看起来不那么漂亮,但却大大提高了性能),问问他如果公司也以同样的方式支付他的工资,他会怎么想:只支付他工资的10%,但使用的是非常漂亮的彩色支票。一件艺术品,由首席执行官亲笔写下并亲笔签名,他可以把它挂在墙上:-)

是的,务实的解决方案有时会积累技术债务-- (维基百科)为业务提供价值。

拒绝接受技术债务和拒绝接受金融债务是一样的:有时有效的解决方案是借钱交付产品(即使以后需要偿还债务)。

拥有不太理想的可维护性但性能更好的代码类似于支付循环贷款:它允许公司继续经营。

如果他需要10倍以上的时间来解决问题,那么他只应得到工资的10%。如果他不能为企业带来价值,那么他应该被这样的人取代。(我相信这会让我投下一些反对票,因为这是一种纯粹的胡说八道,而不是热情模糊的语言——哦,生活太短暂了。是的,反对票正源源不断地涌入。这就是为什么我不再为这个论坛做贡献的原因)。

10
  • 5
    这并不是对问题的回答,而是对问题的重新分析。。。这种情况已经很多了。 评论 2015年6月2日18:07
  • 如果你把这个改成“告诉他……”这将是一个很好的答案。他需要知道,他的工作依赖于他编写商业上可行的代码。 评论 2015年6月3日9:36
  • 1
    OP的问题是:如何向一个确信自己是被雇来编写优秀代码的程序员解释业务优先级,而无视性能?我的第一句话怎么没有回答这个问题? 评论 2015年6月3日16:46
  • 1
    “这一句话总结了其他人用这么多单词说的话,以及所有需要说的话。案件结束。”——这对我来说并不是解释。参见备份,不要重复其他内容
    – 蚊虫
    评论 2015年6月3日21:13
  • 2
    嗨,彼得,虽然你可能会在第一句话中提到这一点,但OP正在寻找怎样来处理这种情况。一句话告诉他做某事而不解释OP应该如何做,这对他们来说并不是很有用——正如其他人所说的那样,问题是“我如何解释业务优先级?”
    – 恩德兰
    评论 2015年6月4日10:32

你必须登录来回答这个问题。

不是你想要的答案吗?浏览标记的其他问题.