“初级开发人员应该很容易理解”的论点

时间:2009-01-22 04:43:36

标签: coding-style

有没有人真的认为这是“愚蠢”你的代码的一个很好的理由? 当经理要求您使代码变得简单(在理解它所需的技术技能方面)时,代价是更加冗长的混乱代码,您应该怎么做?

25 个答案:

答案 0 :(得分:63)

我非常不同意。初级开发人员最终将成为高级开发人员。怎么样?通过遇到未在学校教授的高级主题。

我的代码库现在大量使用反转控制容器。我会从不将我的代码恢复到原来的方式,因为初级开发人员遇到了IoC问题。相反,我会在下班后带他们去喝啤酒并讨论它。初级开发者学习的手越少,需要做的就越少。

这是一个讨论这个话题的blog post

答案 1 :(得分:21)

如果你不断减少你的代码或设计,这是一个很好的方法,以确保你的初级开发人员保持愚蠢。挑战他们并将其作为辅导机会。当然,有些人永远不会学习,但那时你遇到了更大的问题。

这也不仅仅是尖头发的老板。作为一名高级开发人员,通常很难抵制妈妈初级开发人员的冲动。 “哦,我只是做这个部分,因为这对他们来说太难了”,或者它会花费太长时间,或者它们会在杂草中消失。

最后,确保在使用语言的全部功能的惯用代码与滥用该功能的惯用代码之间取得平衡。没有理由需要覆盖||运算符只是在两个单独的线程中运行它的args。对于你年长,笨拙,未来的自我,至少愚蠢的代码。

答案 2 :(得分:19)

嗯,我认为避免使用“聪明”的语言结构是合理的,除非他们确实真正使代码更好 - 在这一点上,如果一个初级开发人员看到它,希望他们会问,而不仅仅是被弄乱。

以下是另一种表达方式:“编写代码,以便很容易理解如果你在凌晨3点被调用并要求修复其中的错误,仍然可以理解它“。

说真的,让它尽可能容易理解。 表示每隔一行注释 - 它表示注释,其中一段代码的目的不明显,只有那时“well make < / em>很明显然后“不起作用。

答案 3 :(得分:11)

拼图代码和复杂代码之间存在差异。

我发现最大的问题是“通过阅读易于理解”与“精心设计”之间存在很大差异,而且这两个目标往往彼此直接紧张。在良好的代码中,类和大量的虚拟调度之间存在更多的跳跃,因此通过代码的路径非常非线性。

答案 4 :(得分:8)

在我看来,可读性和能够轻松理解代码是可维护性的重要组成部分。

答案 5 :(得分:5)

好吧,如果你打算永远保持你的代码,永远不要换工作,永远不要感到有新事物工作的冲动,并且可以向所有人保证你永远不会被卡车击中,那么肯定没有必要愚蠢的拼图代码。

答案 6 :(得分:4)

您的目标不应该是让初级开发人员易于理解您的代码。相反,维护程序员应该很容易理解。

这意味着:

  • 当需要时,本地“复杂性”是可以的。如果他们看到复杂的代码,他们就会知道他们需要深入挖掘。
  • 隐藏的复杂性很糟糕。如果您无法看到更改一段代码会产生微妙的副作用,那么维护代码将是一场噩梦。
  • 可见的新技术也可以,但不会达到极端。

这是因为维护代码的人很少对系统有全面的了解。或者是开发它的时候。

答案 7 :(得分:4)

它是一种平衡行为......
如果您团队中的任何3个人可以“阅读”您的代码并知道它在做什么......无需更改。但是,如果你是唯一一个能够理解你的代码的人(不管你认为它是多么聪明或聪明)。也许你应该把它记下来几个。

另一个帮助指南是“尝试最简单的方法”。所有最新的流行语都很难知道然而更重要的是具备在不使用它们的情况下找到你可以获得的技能。您不需要使用IOC或框架或设计模式喷涂代码......

这个论点的经理方面在这个帖子中非常错过:)(并且为了记录......我不是一个)。他/她的主要关注点是他不想要一个其他人不敢冒险的代码的暗区......所以如果你能说服你的老板,团队中的其他几个人可以做出任意修复(或更好) ..显示由其他人修复的实际错误) - mgr应该让你摆脱困境。不同意你的老板是另一种艺术:) ..但你可以通常谈论事情 你不必一直向后退到最低共同点。取得平衡。

答案 8 :(得分:4)

没有。在过去,我从看到更有经验的开发人员的技巧中学到了很多东西。我宁愿有机会从他们那里学到新东西,也不会让他们为我愚蠢。

答案 9 :(得分:3)

是。这是一个非常有效的理由,可以将其提升一个档次。现实情况是,非常大量的开发人员(与大多数人一样)处于初级阶段。

至于你应该做什么......说“是先生”或“是女士”并做到这一点。在这种关系中只有一个老板。

<强>更新 由于有些人似乎认为让jr开发学习高级主题,同时涉及混淆代码,我想在这里再抛出一件事。

当任何开发人员(jr或其他人)遇到他们不理解的代码时,他们的第一种方法是将其重构为可理解的东西。这被称为“哇,代码是废话,我必须重写它!”综合症。我愿意打赌这个董事会的每个人都经历过这个。那么,作为一个企业所有者,我是否想要为每个新人来时开发的代码付费,或者我是否想要为要添加的新功能付费?

猜猜我要留哪个人的时间更长。

答案 10 :(得分:3)

我不同意经理:需要简单的是代码,而不是用来编写代码的技术。

但是,我会强加一个密切相关的要求:

  • 内部文档清楚地说明了理解这些代码所需的技术,并提供了可以学习这些技术的地方的参考。

例如,即使作为高级开发人员,我发现所有矩阵代码都令人费解。但如果有人给我提及Numerical Recipes的正确部分,我可以弄清楚细节。

答案 11 :(得分:2)

如果你愚弄你的代码,那么你将无法与那些永远不熟悉高级编码技术的虚拟初级程序员一起工作。如果有任何冗长的代码试图表达您编写的固有的复杂过程,那么前面提到的初级开发人员可能无法看到树的森林。如果他们所知道的只是基本的原始结构,他们可能会搞砸,如果他们知道如何简洁明了地表达他们的意思,那么代码就更有可能是正确的。

答案 12 :(得分:2)

斯科特·穆克说:

“我发现最大的问题是”通过阅读易于理解“与”考虑周全“之间存在很大差异,而且这两个目标之间往往彼此直接紧张。考虑周全的代码,类和大量的虚拟调度之间存在很多跳跃,因此通过代码的路径是非线性的。“

引用真相,我认为这是C ++代码最常见的问题之一。如果你是那个编写代码的人,很容易想出一个非常复杂的东西,这个东西是很好的因素,如果你已经知道它很有意义,效果很好,并且通常类似于钻石水晶等等。但是,从那些试图弄清楚你是如何到达那里的人的角度来看,以及为什么事情就是这样,事情是如何运作的,以及人们如何做出适合现有系统的变化并满足新要求的呢?完全不透明和难以穿透。

这种情况如何帮助维护?这种情况是我对C ++程序员的主要兴起之一。更好的是有一堆普通的C代码,这些代码可以被破解,而不是钻石晶体的超级代码,几乎没有人能够弄清楚如何在不破坏晶体结构的情况下进行合理修改。

答案 13 :(得分:2)

一种“哑巴”代码,我认为这是一种很好的做法,就是使用更长的变量名和更长的函数名。命名变量和函数使其目的易于理解是一项重要的工程任务,恕我直言,并且需要代码原始作者的额外努力。 Damian Conway在“Perl最佳实践”中有一些很好的例子。一些例子包括:首选“final_total" to "sum”;首选“previous_appointment" to "previous_elem",首选”next_client" to "next_elem"。首选“sales_records”为“数据”.等等。他还推动使用语法模板(名词 - 形容词)并保持一致。不要在max_displacement个地方使用VelocityMax,而在另一个地方使用sales_record[i] vs sales_record[cancelled_transaction_number]。索引变量也需要真实姓名:
{{1}}

我经常在开发周期结束时通过为所有函数和变量查找新名称来“重构”我的代码。在一个现代编辑器中,将它们全部改变是微不足道的,而且最后我才能弄清楚我用它们的用途。以这种方式“降低”代码并不是经典的C,但是当我几个月后回来问我做WTF时,它对我来说更容易吗?

答案 14 :(得分:1)

这取决于代码。这些东西是否在您的旗舰产品中出货,需要使用您的经理希望您出于性能原因删除的功能?如果答案是肯定的,我会尝试让您的经理让您保留代码,然后编写一份文档,详细解释难以理解的代码部分。如果它是一个需要由许多不同的人维护的内部应用程序,并且可以删除复杂的功能而不会对程序产生负面影响,将其删除并选择更重要的战斗来进行战斗。

答案 15 :(得分:1)

你应该提醒你的老板,你可以建造火箭船或鸡舍,他将不得不为任何一个支付相同的费用。做他们所说的话但通常这样的环境适合寻找新环境的人。

答案 16 :(得分:1)

旧的引用在这里是合适的:

  

让一切尽可能简单,   但并不简单。

答案 17 :(得分:1)

我认识的开发人员编写了高度混淆的代码,他们觉得这些代码已被提升,但团队的其他成员认为这些代码难以理解且无法维护。其中一部分涉及过度使用高级语言功能(在C中,三元运算符和逗号运算符),并用一种​​模糊的个人习语写作(例如,用(* ptr).item替换ptr-&gt;项目)其他人将永远能够维持。作者试图超越优化器(这是公平的,远非好的)。

注意:我不是建议“x =(p == NULL)?”默认“:p-&gt; value;”很复杂,但是当有人使用跨越多行的三元运算符,嵌套并大量使用逗号运算符时,代码很快变得不可读。

在这种情况下,“减少”代码本来是个好主意。问题不是高级算法,也不是高级语言功能,而是过度使用和不恰当地使用高级语言功能,以及一种模糊的个人习惯用语。

但是,在您询问的情况下,经理的更改会使代码更难以阅读和维护,我同意您和其他已做出回复的人。我只是想指出其他人没有提到过的替代方案。

答案 18 :(得分:0)

如果不做别人不理解的事情,任何行业都无法取得进步或创新。创新必然是亵渎神明的。为什么?因为如果你做的事情对你周围的其他人都有意义,那么你很可能不是第一个这样做的人。 ;)

话虽如此,做一些难以理解的事情之间存在显着差异,因为这是一个新的或复杂的问题而不是做一些难以理解的事情,因为你试图炫耀或者你认为混淆的人会以某种方式获得工作保障(我从未见过工作,但我听说有人在尝试)。

你应该容易理解吗?是绝对的,尽可能的人性化。然而,一个有效并且工作良好的计划是更高优先级。

经理的抱怨永远不应该是“不要这样做,因为我们的初级人员不理解” - 它应该只是“在可行时做x而不是y,因为x更容易阅读/理解”。这也假设x和y是等价的(接受相同的输入并产生相同的结果)。

当经理这样做时,我无法忍受......我有三个不同的经理让我用完正常的代码按照设计的方式工作,而不是因为我做了任何复杂的事情,而只是因为他们觉得我们团队中的其他人用我们使用的语言转到RTFM是太费劲了。作为一种管理策略,这完全是倒退的。这就像是神圣罗马天主教会,坚持认为外行人太愚蠢,不值得信赖。

如果你想知道其中一些经理真的多么荒谬,试试这个:我让一位经理哄我将一个变量称为“布尔”,因为他觉得其他程序员无法处理它。实际上,当我问为什么时,他的答案是“因为我们不在这里做”,这是一个非答案,但我把它解释为“愚蠢”。他们也因为这个和类似的做法而指责我,好像很明显好的编程习惯实际上是“糟糕的”,我应该已经知道为什么即使他们从未表达过一种首选的编程风格(正式或非正式)。不用说,这是一个糟糕的工作。

答案 19 :(得分:0)

确保你可以在6个月后了解它的作用。

如有疑问,请注明您的代码。这就是评论的意思。

答案 20 :(得分:0)

我在谈论使用“不寻常”的技术。在这种情况下,它是JQuery。 当我编写用于用户注册的向导控件时,出现了此问题。 导航菜单需要自定义,向导中的当前步骤必须在菜单中具有不同的css类。这意味着我需要在生成菜单时访问当前选定的步骤。我的解决方案是在隐藏的html字段中输出当前步骤索引,然后由JQuery读取以便自定义css。

我认为这比使用ASP.NET中的数据绑定语法更好,更清晰,它没有编译时检查并且会混淆html的布局。

数据绑定解决方案是“标准”,而JQuery是“不寻常”,这意味着它不太可能被大三学生理解。

我现在越来越多地尝试为UI提供所需的数据,而不是通过数据绑定将其破解到UI中,这就是我将隐藏字段添加到当前步骤索引的原因。

答案 21 :(得分:0)

我同意100%的论点。还有一个主要的补充:训练你的初级开发人员,直到他们理解你的代码; - )

答案 22 :(得分:0)

我以艰难的方式学习它,回想起来,发现这是更好的方式。让循环重演。

答案 23 :(得分:0)

我认为这是经理礼貌地告诉你你的代码太混淆/复杂/混乱/拼图代码......无论你想怎么称呼它。有时我们会如此参与编写我们的代码,以至于我们忘记了其他人必须在以后阅读它。

答案 24 :(得分:0)

我建议将代码保持在“Geeky级别”并对其进行评论,以便大三学生能够理解代码背后的意图并同时学习更好的方法(或正确的方法)来编写代码,这样我们就能做到最好两个世界。