有什么正确的方法告诉管理层我们的代码很烂?


70

我们的代码是错误的。它可能并不总是被认为是坏的,但它是坏的,而且只会走下坡路。我不到一年前刚从大学毕业,我们代码中的许多内容使我感到难以置信。最初,我认为作为一个新手,我应该闭嘴,直到我对我们的代码库有所了解为止,但是我已经看到很多知道它不好的地方。

一些亮点:

  • 我们仍然使用框架(尝试从查询字符串中获取内容,几乎是不可能的)
  • VB脚本
  • 源安全
  • 我们“使用” .NET-意思是说,我们有.net包装器,它们调用COM DLL,几乎不可能轻松调试
  • 一切基本上都是一项巨大的功能
  • 代码不可维护。每个页面都有多个文件,每次创建新页面时都会创建这些文件。基本上,主页做了很多次Response.Write()来呈现HTML(无法运行runat =“ server”?)。之后,客户端(VBScript)上可能会有很多逻辑,最后页面提交给自己(通常将很多东西存储在隐藏字段中),然后在页面上发布到处理页面,该页面可以执行诸如保存数据到数据库。
  • 我们得到的规格是可笑的。通常,他们会要求诸如“使用字段Y或字段Z自动填充字段X”之类的内容,却没有指示何时选择字段Y或字段Z。

我确信其中部分原因是没有在软件公司工作,但我觉得编写软件的人们至少应该在乎其代码的质量。我什至无法想象,如果我提出一些建议,那么很快就会发生任何事情,因为迫在眉睫的最后期限迫在眉睫,但是我们将继续编写不良代码并使用不良做法。

我能做什么?我什至如何提出这些问题?我的团队中有75%同意我的观点,并且过去曾提出过这些问题,但没有任何改变。


27
习惯它。90%的编写代码是在阅读代码。

7
出于相同的原因,什么都没有改变,因为它首先是错误的代码。很久以前,他们不再向任何人兜售书费。

11
这是题外话。但是简短的答案是:经济学。整理代码库需要花费多少开发者月,而整理代码库可以节省多少开发者月?
奥利弗·查尔斯沃思

89
最好的方法是退出面试。
kylben 2011年

32
与盲人谈论颜色无关紧要。他们不会理解你的。
ThomasX 2011年

Answers:


68

确保您没有反应过度。您很新鲜,可能没有在很多其他地方工作过,因此也没有为“现实生活中的代码”做好准备。现实生活中的代码是一件可怕的事情。就像您的学校代码很好,您对项目项目的强迫性调整使他们在核反应堆的地下室发生性关系,婴儿在下水道的有毒废物中长大。这是一个可怕的突变体。

但是,假设您是对的,并且代码与您所说的一样糟糕(即比通常的错误代码更糟糕),那么您就值得关注。与您的团队交谈,确定是否其他所有人都在旁边。需要采取工作来改善这种情况-如果团队中的其他成员都知道问题所在,但不在乎,那么您就是在浪费时间。

作为一名大三学生,您可能没有领导能力。如果您自己去管理,作为一个也是初级的新员工,您的意见可能会被忽略。让您的首席开发人员或最资深的人员之一参与进来。同样,如果没有一个高层人士对此感兴趣,那么您就是在浪费时间。

假设您可以让一些高级技术人员感兴趣,那么我将努力确定问题区域和可能的解决方案。例如,如果“一切基本上都是一个巨大的功能”,那么下次您使用该“巨型功能”时,也许您应该重构一下。同样,您需要让每个人都受益。如果您解决了小部分问题并逐步改进,最终它们将变得无足轻重。每次触摸一段代码时,请考虑是否可以对其进行改进。

您不会与管理层坐下来,说“一切都不好,需要重写”。这对他们来说毫无意义-成本高昂,而且风险很大。相反,应该让他们意识到存在问题,并且有计划随着更改的进行而逐渐改进。应该对他们进行有关可维护代码的好处的教育。这应该来自他们在技术和专业上都信任的高级人士,而不是您。

完成重写?几乎总是一个坏主意。

最终,因为您是新手,所以您无能为力。如果没有人想改善事情,那么您将积累经验并移到下一个地方。


10
+1为最后一行。人们通常不愿意听新手,即使新手提供了他们自己的经验和不同的观点,即其他人也被淹没在公司文化中而看不到。人们也听不见真相(例如,“一切都很糟糕,因为设置它的人是那些不知道自己正在做的WTF的白痴”),宁愿随船沉没,也不愿承认事情很糟糕并且需要是固定的。有时令人难以置信的是,企业主将冒着失去一切的风险,而不是花时间去修复不良的东西。
韦恩·莫利纳

2
为了继续讲到最后一点,我已经看到很多地方,当伪劣系统崩溃时,管理层宁愿冒着倒闭的风险,而不是真正动手解决问题,即使这些问题意味着拖延时间在新功能上。
韦恩·莫利纳

5
不幸的是,使用一种“游击战”方法进行重构有时会导致您用脚射击。除非系统针对它编写了一套好的单元/集成测试(如果不好的话,极有可能不会)将不可避免地导致引入错误,这些错误将需要通过QA进行整个系统测试来避免。
aceinthehole 2011年

1
@aceinthehole:完全正确。如果测试成本很高,即使没有可预见的将来,该系统也将变得难以维护,但管理人员也不会愿意冒险进行任何“不必要的”更改。
凯文·克莱恩

2
@WayneM,以及那些在项目开始时不了解WTF的白痴现在都是高级经理。永远不要忘记那部分!
HLGEM 2011年

58

阅读Joel On Software,这是您不应该做的事情。了解他的推理,然后阅读由管理人员(而不是程序员)撰写的有关不良软件及其修复方法的其他文章。有了这些信息,您就可以提出解决问题的理由,管理者可以理解和关心。提示:优秀的管理者不会仅仅根据程序员对必须完成的事情的看法和感受来花费时间和金钱。

即使您在技术上是正确的,“这些代码都是废话,需要重写”肯定会反驳您。

“我们可以将目前的项目计划缩短数月,降低成本并提高可靠性。” 将会引起他们的关注(注意,您在他的舞台上没有提到您打算如何做。

无论您说什么,都要确保自己是正确的。如果说不好,重写必须是血腥的,如果说要花一周的时间,那么最好确定要花一周的时间,并且要好。重做的代码中的任何缺陷都会使您个人付出高昂的代价,无论您是否进行了重做都可能会发生什么。如果有人在您之前到过那里,搞砸了或超卖了改写书,就放弃了,经理们就不喜欢被人愚弄,也不会让它发生两次。出于这种原因,不要为后续的家伙搞砸,您只能对此一枪...

寻找在一段时间或多个项目中分摊成本的方法。经理讨厌风险,投机性投资和负现金流-在经理的承受能力范围内工作。从一个小的,低风险,低成本的建议开始。一旦证明是正确的,就可以去钓大鱼。


2
好笑...我因建议乔尔的网站而被否决:-)
罗伯特·法兰西

6
@Robert French:您的经理正在阅读您的帖子……
Dave Markle

8
别开玩笑了 试图争辩说:“我是否可以有6个月的开发人员时间来重写所有内容?最终结果将完全是我们今天所拥有的,但可能会有一些新的错误。噢,我们将使用许多同样的开发人员,他们创建了当前的大量废话进行重写,因为他们现在知道得更多。”
JohnFx 2011年

3
@ joshin4colours:<quote>是的,我知道,这只是显示窗口的简单功能,但是上面已经长了一些毛发和东西,没人知道为什么。好吧,我告诉你原因:这些是bug修复。...这些错误在被发现之前需要经过数周的实际使用。...当您丢掉代码并从头开始时,您就是在丢掉所有这些知识。</ quote>
Martin York

4
抱歉,但是一年的经验不能保证向他的管理层提出任何这样的要求。
杰里米

14

首先,除非您是在初创公司工作,而且您是创建原始goofy遗留代码的人,否则您在作为程序员工作的任何地方都会发现goofy遗留的东西。如果您打算从事编程职业,则必须能够胜任这些工作。

其次,通常需要考虑成本来改进旧系统。例如,我已经看到多家拥有10年历史的VB6和经典ASP应用程序仍在运行的公司。在某些情况下,这是因为迁移.NET的大型项目严重失败。在其他情况下,原因是“如果没有破裂,请不要修复”。但是,在其他情况下,此举的成本是合理的,因为遗留系统引起的问题大到可以忽略。

在过去发生重大故障的情况下,几乎不可能进行更改。在这种情况下,请完善简历并开始寻找新工作。如果它没有被破坏,您可能没有理由抱怨代码本身,但是您没有走上充实而不断发展的职业道路。如果它坏了,听起来像是您的情况,那就是您有机会进行更改的时候。

我见过的最好的方法不是花太多钱,而是从将产生最积极影响的渐进式变更开始。根据您的描述,更好地管理变更请求将是一个起点。一旦得到控制,您就可以开始研究创建服务框架或其他增量设计/代码改进。

我见过的最糟糕的方法是尝试直接从旧版系统飞跃到最新的最新版,例如,从工作正常但笨拙的VB6 / Classic ASP / COM +系统跳到MVC / Entity Framework系统。


3
“首先,除非您是在初创公司工作,而且您是创建原始的愚蠢遗留代码的人,否则您在作为程序员工作的任何地方都会发现愚蠢遗留的东西。” 我是创业公司的第一位程序员。后八个我经常发现自己在说“谁编写了这个愚蠢的代码?”,只是为了检查并发现我是有罪的一方。
吉姆在德克萨斯州2011年

迭代速度优于迭代质量。换句话说,经常进行许多小的更改,最终您将到达想要的位置。
杰森克2012年

11

“嗨,老板,在完成Big Project之后,我和团队希望有一段时间,最好是X个月来组织我们的代码。应该能够在几分钟之内完成的工作要花几个小时,因为它非常混乱。如果无法做,在大型项目结束后,我们希望制定一个切实可行的时间表。”

(部分解释自阿兹卡尔对这个问题的评论)


10
从理论上讲,这会很棒。实际上,答案可能是“不,CEO希望Another Big Project在X个月内完成”。或“我们有y个新功能需要立即完成,我们没有时间修复已经起作用的内容”
Wayne Molina

2
很少(如果有的话)起作用。尤其是如果您有一个已经待了一段时间的经理,因为他/她会在听到这条线之前就听到它炸毁了。
taylonr 2011年

1
这让我发笑。您将永远不会完全重写时间表。您可能要做的是在每个即将到来的项目中都有较小的任务来改进某些子系统,以便最终(在几年的时间内)使其符合规格。
马丁·约克

以我的经验,这种方法经常会被拒绝。另一种方法是将Big Project的估算值乘以1.5,然后花费1/3的时间清理代码。
JBR威尔金森2011年

2
一个非常常见的回答是“谁会为此支付薪水?” 如果您没有任务的直接赞助,则需要让公司进行长期投资。还是您会在此期间免费工作?

7

开始阅读关于软件的 Joel(Joel Spolsky / Stack Exchange的创始人)...

我要做的第一件事是执行Joel测试

这将使您可以将其表示为“当我正在寻找改善开发人员的方式时……我偶然发现了有关开发环境的12个问题测试,因此出于乐趣,我回答了他们关于我在哪里工作的问题。” ...反过来,这使它成为第三方,概述了您的代码而不是您个人的问题。

当您阅读有关“ 实用实践”的更多信息时,您将在改善自己并实现诸如红色/绿色/重构之类的内容,从而使您可以清理代码库,从而使其变得可维护。(随着时间的推移)

希望有帮助!欢迎使用编程(昨天的代码通常很烂);-)


4
我认为这不能解决他应该如何管理的问题。
2011年

3
看来Azbar知道问题并知道如何解决,但他不知道如何使球滚动以便解决。
2011年

1
是的...我建议在介绍第三者时使用其观点。我认为他没有在特别询问如何与老板交谈。
罗伯特·法兰西

4
这个答案几乎不值得那么多否定票。第一个句子应得+10。与管理人员接洽的问题是,了解对他们而言重要的是什么,乔尔(Joel),此答案通过从业务角度研究了为什么以及为什么不应该重写代码的原因来解决此类问题。
mattnz

1
@Robert French +1是一个很好的答案。对于Azkar来说,了解业务和技术至关重要。建议他从一位高素质的第三人的观察中形成自己的见解,这将有助于Azkar成为一名开发人员,而不仅仅是一名编码人员。此外,PB&J的故事很有趣。
bakoyaro 2011年

7

快速提示:如果你不提出与工作的原因列表管理,为什么你应该在代码不同,包括作为参数“提高士气/对程序员的工作条件”。

要明确的是,技术团队将比目前的混乱局面更多地编写和维护干净的代码,这肯定会改善您的工作态度。可能是一个有用的论点。


绝对是一个好主意,也非常真实
sdm350 2011年

5
  • 管理层实际上决定了设计吗?如果您有大部分团队支持,什么在阻止您?积极主动并集体决定。提出逐步实施的计划。然后去做
  • 管理是否规定您使用的开发工具?除非换掉时间,否则通常不关心工具管理。积极主动,并集体决定要使用哪些开发工具。如果您需要管理层的帮助,请向他们展示迁移计划和成本效益分析。然后去做
  • 管理层是否规定您使用的语言?积极主动,并集体决定使用什么代替VBScript。 提出一个计划,逐步实施它并加以实现。 如果您需要管理层购买,请向他们展示计划。然后去做
  • 我没有任何规格。这通常高度依赖您工作中的人员和流程。识别故障和修复流程所需的最小更改需要时间,分析和了解事物当前的工作方式以及它们应如何工作。如果您知道可以提出一个计划并尝试说服管理层。

如果提出不涉及大量专用时间,没有任何(或软性)业务价值的变更方法,您就会获得更多的变更和尊重。


否/是/是。语言和工具的选择很少是出于技术原因而做出的选择。(请参阅:parashift.com/c ++-faq-lite / big-picture.html#faq-6.5)这是公司自成立以来一直使用的工具。由于生产力下降,不太可能对公司或团队进行重新设计。
马丁·约克

1
+1计划并逐步实施。重写一切只是在要求失败。随着时间的推移,小胜利会建立信心。至于规范...作为程序员获得的大多数规范将缺乏我们的工作来完善它们。每隔一段时间,您就会被写好的规范的人宠坏。通常,就程序员而言,通常会很快地将其调动/晋升/找到更好的工作。
SoylentGray 2011年

@Loki Astari:在我工作过的大多数公司中,我都进行了一些变更,包括版本控制系统,框架,开发过程甚至语言。您所需要的只是一个合理的计划,而不是概述更改的成本和收益。仅仅因为它很少完成,并不意味着它不能完成。
Dietbuddha

4

从经验上来讲:这并不容易。这几乎是不可能的。管理层不在乎代码是否糟透了,而且很可能是完全无知的和/或毫无头绪的问题,或者他们很早以前就已经解决了它,而您今天就不会陷入困境。您能做的最好的事情是列出代码烂掉的原因,然后列出为什么烂掉的原因,以证明重构/重写代码的实际业务价值。

例如“代码不可维护”的示例:

当前代码由于XYZ而无法维护(列出其无法维护的原因)。这使得更改请求和新功能非常困难,因为XYZ(造成更改困难的原因)。由于更改很困难,因此开发团队无法轻松地对错误修复和改进做出响应。

您唯一的希望是您的老板和高级管理人员不要太愚蠢,以至于无法理解代码的后果,并愿意停止提出新的功能要求来解决这些问题,否则您的工作将徒劳无功。从过去的经验来看,很可能他们不会发现代码有什么问题,并且/或者您的同事们太精干了,无法将他们的疑虑带给管理层。

祝好运。您将需要它。


2
同意和“不可维护”也仅在某种程度上起作用。对于许多经理(尤其是没有技术背景的经理),工作代码等同于可维护的代码。如果您提出其他要求,您甚至会被视为他们眼中的无能。
2011年

3

“我刚从大学毕业就开始了”-应该回答您的问题。

管理层可能知道那里的代码不是最优的。除非您雇用了Ray Gosling,Guido Van Rossum或其他真正写实且昂贵的人,否则大多数代码都是这样。

管理层还知道,只要使用适用于您公司的“工作”的任何定义即可工作(不崩溃,出售,交付报告等)。

他们希望您以最小的成本保持代码“运行”。他们不希望有一个昂贵的项目提案来重写所有内容。


您的第一行完全反对初级人员。首先,您不了解HIS的经验,因此无法得出他的问题的答案。概括地说,这样对初中生极有偏见!我从事这项工作已有20年了,可以保证我比“高级无知者”看到的是知识渊博的“新手”。
2011年

并非完全偏爱初级人员,但也许他应该承认已经工作了一段时间的同事的经验和丰富的知识?他们不可能都是无能的老沃利斯。
詹姆斯·安德森

2

商业案例几乎是不可能的,因为您的交付物是有效的软件(他们已经拥有的)而不是优雅的代码。

再加上一个事实,即在软件中,首先具有功能就进入市场存在巨大的机会成本。如果您真的考虑过,则不能保证长期投资的回报。

话虽如此,仍然是一个好的计划,以可管理的方式重构和修复小问题(例如获得良好的VSS)。归根结底,这是一个技术问题,而不是管理问题。只要做需要做的事情,同时仍然兑现您的承诺,就可以了。即使您有充分的理由,管理层也可能对代码质量的细节一无所知。


2

只要尽快就可以离开(也许不要因为不想像工作漏斗而离开得太早)。他们编写的代码很乱,人们一直呆在那里,这意味着您可能正在与贫穷的开发人员一起工作。任何关心他们的工作的体面的开发人员都不会为这种胡扯花很长时间。

除非您能非常清楚地证明它值得进行投资,否则重写的几率很小。


最后,这是唯一的实际行动。我之前已经说过,我会再说一遍: 聪明的开发人员为聪明的公司工作,他们理解为什么始终对编写好的代码很重要,并花费必要的时间来确保好的代码。糟糕的开发人员在糟糕的公司工作,每个人都太专注于“完成任务”,以至于他们只是在堆里增加更多的泥土,甚至认为与当前任务没有直接关系的重构代码“正在浪费”。时间”。如果您认为自己很聪明,那么这些地方就不值得工作。
韦恩·莫利纳

1

管理层不在乎代码。他们关心要出售的产品。

如果遗留系统真的非常糟糕,并且给整个团队的大多数人增加了可笑的开销(我说大多数,因为总有人会编码大块代码或全部代码,并且像后面那样知道它。他的手)然后接近他们,并说这在开发时间上花费了业务金钱,并且会对客户满意度产生影响。

但是再一次,他们仍然不在乎代码,而是在乎产品,因此尽管答案可能会让他们“同意”,但您也可以在无需经理同意的情况下整理代码。不要太过分,确保您首先与团队交谈,没有人喜欢来使用该功能,该功能花了您3个月的时间编写而成,但现在似乎已失效,因为该功能已被黑客入侵。


正如您所暗示的那样……他必须做些事情来改进代码。如果这是一项巨大的功能,那么您可以为此做些事情。他甚至抱怨Source Safe的事实有点可笑。Source Safe没什么问题,它已经使用了很多年,它可能有几件事在当今世界上毫无意义,但事后看来。
Ramhound,2011年

我认为SourceSafe本身不是问题,当有更好的免费工具可用时,它会继续使用SourceSafe,只是大声疾呼:“我们对盒子外面的一切一无所知”,“平庸是日常的习惯,因为我们会坚持低调产品而不是学习高级产品”。大多数SourceSafe用户的态度就是问题所在。
韦恩·莫利纳

“未经许可,整理代码” –听起来像是在修复没有损坏的东西。
詹姆斯·安德森

1
我的客厅对健康无害,但我仍要确保定期清洁房间。与其说是修复一些没有损坏的东西,而是要做一项必要的任务,不如说是一种情况。
尼古拉斯·史密斯

0

以这样一种方式来进行管理:表明您了解对代码进行重大更改的预算影响和不进行更改的预算影响。我喜欢Emilio的措辞。

重要的是要记住,尽管“旧”代码总是很糟糕。我的意思是,我们每个人都随着开发人员的不断成长。我们编写好的代码,然后学习稍后编写更好的代码,以前的“好的”代码似乎很糟糕。从长远来看,太多的开发人员陷入了不断努力使其变得更好并浪费更多资金的困境。这是一种平衡的行为。话虽这么说,如果您能不断改善它总是很棒的。当您修改该巨大功能时,将其拆分!最终您会到达某个地方。



-1

我从未想过要告诉经理特别是项目经理有关错误代码和重构的内容很容易。首先,他们必须信任您,即使您是高级人士,您仍然需要时间来获得信任。其次,他们根本不了解问题有多严重。如果今天是发布新版本的最后一天,并且该版本失败。他们知道它有多严重,但是他们从来不知道构建会因为很多问题而失败,例如错误的代码,测试不足等。

我已经完成了Web项目中的配置和部署任务。每次部署新版本时,通常都需要花费很多时间来解决意外问题。大多数问题是安全性和集成性(在多个Web / Windows应用程序之间)。我们的代码很烂,其他人的代码很烂,它们完全是意大利面条式的代码。

我们正在计划一个新版本,我强烈要求进行一些重构,只需将详细日志添加到经常发生错误的登录/身份验证代码中即可。经理们同意了,但是后来被列入了一个不错的清单,我不知道是否会完成,因为我们已经有了很多功能,而且时间紧迫。


-3

经理有两种:一种是假装了解您的工作的经理,另一种是不了解的工作。那些假装了解软件的人会对您怀有敌意。那些不只是让您烦恼。

无论如何,经理都是骗子,因此他们有很强的性格去假设其他人都是。

我的意思是,如果您说软件已过时,他们只会以此为借口。他们不在乎。


+1关于“经理都是骗子,因此他们有很强的承受能力假设其他所有人都是”
ZJR 2012年

-1相同;既不真实又无益
Jaap 2012年

@Jaap有许多研究将权力和社会阶层与不诚实联系起来。这是否意味着您将收回-1?例子: msnbc.msn.com/id/35836844 blogs.discovermagazine.com/notrocketscience/2010/04/27/... news.sciencemag.org/sciencenow/2012/02/shame-on-the-rich.html

第二项研究特别证明了我的确切观点。
2012年

1
@Joe:您的链接没有(开始)证明您的观点是“经理都是骗子”。
2012年
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.