在处理极其糟糕的代码时,如何保持生产力?


63

我没有在软件行业工作的经验,没有自学成才的经验,并且在决定工作之前参加过开源。现在,我为钱而工作,我还必须处理一些不愉快的事情,这当然是正常的。

最近,我被分配将日志记录添加到一个大型SharePoint项目中,该项目是由一些显然正在学习编写工作代码的程序员编写的。经过2年的合作,客户转到了我们公司,但是造成了损害,现在我需要以某种方式维护此代码。

并不是说代码太难读。尽管存在问题-每个项目都有一个类,其中包含几种复制粘贴的方法,大量的if嵌套,匈牙利语的系统,未处理的连接-但它仍然可读。

但是,尽管进行诸如添加日志记录之类的简单操作,但我发现自己绝对没有生产力。基本上,我只需要逐步完成代码并添加一些跟踪调用。但是,代码的愚蠢到令人讨厌,以至于在开始的10分钟之内我就感到疲倦。最初,我曾经添加using结构,通过反转来减少嵌套if,将变量重命名为可读的名称,但是该项目很大,最终我放弃了。我知道这不是我应该做的任务,但是至少减少混乱使我获得了某种心理上的回报,所以我可以继续前进。现在,这个技巧停止了工作,我还有60%的工作要做。

我下班后开始头痛,而且不再有以前的满足感,通常这使我可以连续10个小时编写代码,但仍然感到新鲜。

这不仅是一个大麻烦,因为我确实有一个实际的问题:

有没有办法保持生产力而不与风车战斗?

是否有某种心理把戏保持专注的任务,而不是想着“如何愚蠢的是那个?”每次我在以前的程序员看到另外一个巧招时间?添加日志记录的问题在于,我实际上必须了解代码的作用,而这样做却以令人不快的方式伤害了我的大脑。


匈牙利
书写

14
我知道匈牙利人还不错。这就是为什么我写《Systems Hungarian》而不是《Apps Hungarian》(原始版本)的原因。我觉得在C#中使用Systems Hungarian没有意义,因为它具有出色的类型系统和IDE。在同一范围内拥有10个全部开头的变量obj是艰巨的,因为它基本上是不可读的。

2
我希望我可以给这个问题一票多!
o6tech '02


9
我通过在栈上提出脾气暴躁的问题而感到沮丧,这使我感到沮丧。
Erik Reppen

Answers:


32

很抱歉告诉您,但并非所有工作都充满阳光和魅力。大多数开发任务都涉及像这样的繁琐工作。伤心,但真实。

即使您无聊到观看油漆变干的程度,您也要承担一项重要的任务。这很重要,原因有两个:1.它向大型系统中添加了许多急需的日志记录,以便在出现问题时可以使用一个工具来查找它。2.使您熟悉代码库,以便在出现问题时可以进行修复。

您基本上是在这里创建自己的安全网。魅力,不,但重要的是!

那么,话虽这么说,你应该如何激励自己?当我有一个工作中的麻木任务时,我会为自己设定目标。在一周结束之前完成任务x。如果我实现了目标,我将获得回报。我想尝试新餐厅吗?如果我结束,去周五晚上。新电影刚出来吗?如果我结束的话,在周末见。

我发现与主管交谈并让他/她知道我在哪里以及我的进度如何使我负责。如果我告诉他们我会在周五之前完成,我更倾向于在周五b / c之前完成它,我告诉他们我会完成。

请相信,一旦您完成了这项任务并且做得很好,就可以按时按预算在预算上引起人们的注意,并且当新项目出现时,您的名字可能会被建议为获得此项目的人。:)


我特别喜欢关于星期五动机的观点。有趣的是,当前版本也计划在星期五发布。我认为值得一提的是,感谢动机是一个动人的动机。您需要确保有人会为您的工作表示感谢,否则将更改您的工作。真诚的“感谢您”经常回滚不安时。

1
@gaearon-我很高兴这些建议对您有所帮助。最终,以良好的动力完成繁重的工作将获得回报。去年,在我目前的工作中,我不得不做与您正在做的事情类似的事情。今年,我得到了一个全新的应用程序,可以从头开始编写。人们会注意到您的工作以及您的工作状况。
Tyanna,2011年

3
-1为什么将您的工作生活与个人生活联系起来?这听起来类似于持续加班I didn't finish my under-estimated task by Friday - so I need to stay at home and feel bad.
Vorac 2014年

@Vorac〜我说的是我这样做来激励自己。每个人都不一样。而且,我可以向您保证,我不会始终如一地工作。找到可以激发您使用动力的东西。我发现当我不想完成某项任务时,物质奖励最有效。
Tyanna 2014年

1
@IntegrityFirst〜对我来说,是的。我会待到很晚才完成我的待办事项清单。我将预算我的时间,以确保能按时完成。当我说要完成某件事时,对自己和我的同事来说,这是我的诚信。但是,如果我发现我所说的时间无法完成某件事,我会更改计划并告知主管。如果我迟到一点,电影/餐厅将在下周到那儿。:)
Tyanna 2014年

30

保留一份候选代码段文件,以提交给thedailywtf.com。即使您确实不打算提交它们,它也为您提供了一些比平均水平还差的代码。


我希望我能再投票一次。事实证明,这是一个非常好的建议,因为我发现这些家伙将更改日志存储在应用程序配置文件中,而这些设置恰好在实际设置之前。

24

我处于类似的情况,负责清理大量编写不佳,大量复制和粘贴的代码。

为了保持动力和理智,我编写了一个脚本current_score,该脚本对项目中的LOC进行计数(由于消除了重复并改用了更好的算法,该数量稳步下降),并在开始时将其与LOC进行了比较。每当我对面对的大量代码感到沮丧或沮丧时,运行current_score都会给我一种切实的进步,并使我想起我已经完成了多少。很高兴看到在处理一段特别糟糕的代码时我能获得多高的分数。

我会寻找类似的指标,您可以轻松地编写脚本以给自己一种进步感,并将其转变为一种游戏。代码行(仅运行wc -l),循环复杂度(当您清理那些令人讨厌的嵌套“ if”时应该降低),您而不是您的前任所碰到的代码行(我认为FishEye可以告诉您$ 10),等等。您甚至可以编写Perl脚本而不会很麻烦地计算尚无日志记录语句的代码块的数量。


我使用SourceMonitor
UmNyobe '16

13

我看过推荐的这本书:有效地使用旧版代码,但是幸运的是,没有必要阅读它。

像您所做的一样,重构所需的内容,以便您可以理解代码并仅记住要重新启动系统,这将在维护系统时得到回报。
希望这将为您的回家道路打下春天。


2
这本书是关于重构现有代码以使其可测试的。我认为这不会对动机产生太大帮助。
Billy ONeal

2
@Billy ONeal是一个好点,但是拥有可测试的代码和相关的度量标准可以显示可能会有所启发的进度。
StuperUser 2011年

1
我已经读过这本书。绝对值得一读。实际上,我确实发现WEWLC具有激励作用,因为很高兴知道那里有人知道我所遇到的各种挫败感,并且已经设计出有效的方法来减轻这些挫败感。
杰森·斯威特

1
那本书有点老而且过时了。如果您没有阅读过,为什么推荐它?
BЈовић

1
@StuperUser在阅读时,我可以说它已经过时,并且可以为新手用户提供一些有用的建议。
BЈовић

6

尝试将项目分解为多个块。每天学习特定块的工作方式。试图一次了解所有内容可能是让您感到压力的原因。

为使项目更好而感到自豪。您还可以和其他编码员聊天吗?它有助于站在水冷却器周围讨论/嘲笑您发现的最新逻辑。我尝试这样做是为了保持愉快的工作氛围。


是的,我按块工作,并且已经从事了一段时间,所以我对每个组件都有一个大概的了解。尽管如此,它并没有多大帮助,因为这是通常需要时间来理解的微小逻辑部分,当我意识到花了10分钟的30行方法实际上可以用2行重写时,我感到很生气。对于公司而言,不幸的是,我是该项目的唯一开发人员,并且我目前在客户办公室工作,所以没有人可以与我交谈。

@gaearon-是什么导致您无法实施2行解决方案?您需要弄清楚如何执行您要执行的任务,以后您不在客户办公室时,可以解决代码问题。您应该记录所做的事情,工作原理,以便将来以后再执行并进行更改,以便进行代码检查和集成测试。
Ramhound

@gaearon啊哈!您是唯一的编码员。因此,您之前的那个人是唯一的编码员。当您是唯一的编码器时,您可以从中学到很多(正如您从前任中注意到的那样)。在寻找下一份工作时,请记住这一点。;)
davidhaskins 2011-02-22

@Ramhound我敢打赌,不会有任何代码评论。我敢打赌,不会进行任何正式的集成测试。我已经在这些职位上工作了几次。通常,人们只希望代码能够运行良好,并且希望尽快。解释“最佳做法”就像在墙边聊天,恕我直言。
davidhaskins,2011年

@Ramhound,该项目没有测试,我不想为了更简洁的代码而破坏系统。在许多情况下,当前代码暗示吞下了异常,或者依赖于其他不明显的不良行为。顺便说一下,这就是我添加日志记录的原因之一。

6

大量笔记以组织您的问题,想法和对系统的理解。当处理大型遗留系统时,这为我创造了奇迹。它有助于巩固您的理解力,帮助您将开放的问题转化为文字,并且因为您的想法已经被整合在一起,所以可以更轻松地与他人就问题/问题/想法/等进行自发交流。

例如,当我浏览一段代码时,我会不断给自己做笔记。这是我和自己的谈话。单纯的写作行为可以帮助更多的想法浮出水面,并帮助我更好地理解事物。过了一会儿,我可能会有一个尤里卡(Eureka),需要在纸上画一个带有“更大图片”的小图,以说明我的想法或组装的内容。我总是只在纸上进行此操作,摆脱了计算机的所有干扰。这使我对自己的工作更加有条理和考虑周到。

这基本上是与领域专家进行永久对话的便捷方法:)


3

我知道您可能会觉得无用,因为您实际上是从“我仅添加日志记录”的角度来看的,而实际上您正在添加日志记录并进行了大量的重构。您的主管可能知道代码情况。每个人现在可能都不喜欢它,但是当您请求添加一个非常有趣且具有挑战性的功能时,您会很高兴自己清理了代码。


恐怕最终将要重写该项目,我们已经讨论过了。尽管我更喜欢此选项,但在处理一次性代码时并没有增加工作效率。我知道在下一个版本中需要记录日志,然后我可以使用我的东西,但这仅仅是因为我要运行此代码,这使我发疯。我感觉自己在理解了之后变得哑了:-)

1
“它不会在处理一次性代码时提高生产力” Suuure会做到。在执行低风险任务(日志记录)的同时,您将遍历大部分代码以了解它。如果要进行重写,您所获得的知识将极大地帮助您。如果没有重写,请尝试期待您在清理大量应用程序后所能获得的回报,由于您持续不断的努力,代码库会变得更好。
2011年

2

在这些情况下,我倾向于重写一段代码。为了减少一个区域的吮吸,然后我在其他地方添加日志记录。然后清理更多代码。错误的代码只有在您将其留在那里的情况下才是错误的。


系统严重依赖不良做法,因此要正确地重写方法,我将不得不重写整个项目(最终可能会这样做,但是当前版本的发布日期有一定限度)。

是的,我知道相信我。我只是摘下一个可以清理的部分,让我的生活痛苦不堪,清理它,然后清理下一个区域。修复代码是一个过程,您永远不会花时间,但应该总是花时间。
艾琳(Erin)

2

游戏化。例如,每次对代码提出一个好的问题时,给自己5分,每次回答时给自己10分。每次重构方法或添加新功能时都要给自己一个徽章。一旦累积了足够的积分,您就会获得诸如茶歇或饼干之类的特权。一旦完成了整个项目,您就可以享受到自己真正想要的东西的特权。


0

不感到无聊或生气以保持生产力的诀窍是接受代码设计不良。接受必须理解和更新代码的立场将使您不必继续评论“那是多么的愚蠢”,而是安静地接受它并继续前进。

另一个窍门是在一天结束时拥有美好的家庭生活。女朋友,朋友,游戏等所有东西都可以使用,给您一个目标,度过一天,使糟糕的代码变得值得一游。


0

迈克尔·费瑟斯(Michael Feathers)的“有效地使用旧版代码”可能会有所帮助。

如果担心更改时会破坏功能,请先编写一些测试,并确保在更改前后都通过了测试。编写测试应有助于您总结和理解给定代码段的功能,并使您放心地进行编辑。


不幸的是,这是SharePoint项目,这意味着它几乎不可测。过去,我使用Microsoft Moles为SharePoint编写了一些很酷的沙箱,但是它还需要做很多额外的工作。
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.