处理遗留代码是否能帮助一个程序员发展?[关闭]


18

我是一名Java开发人员,拥有超过一年的经验,这使我比初级人员高一些,但是还不是中级开发人员。最近,为我提供了一个长期项目,该项目涉及研究现有银行应用程序代码4个月,然后在需要时进行更改。作为一个经验不足的程序员,我正在寻找开发方法,我不知道这样的项目会给什么。

对于初学者来说,您是否认为处理大型且可能不太好的书面申请是一种好习惯?



1
从别人的错误中学习是获得经验的最安全方法……
Michael Borgwardt

最近,我研究了其他人的代码大约一个月。很棒的学习经验,但是很浪费时间。需要试验镇静茶。
usr

可能有不错的Java,但是很难找到一个jr。开发人员比其他大多数初始语言背景的开发人员要多,我会根据经验来想象,这主要是因为前端Web开发人员不再是通才,而他却接触了各种各样的后端。我认为的问题是Java语言可完美使用,而Java文化则是关于尽可能安全且无罪责地播放所有内容。
Erik Reppen 2014年

Answers:


34

对现有代码进行故障诊断是作为程序员进行开发的一种超级方法。如果代码不好,您将学到它们所犯错误的影响,并且在设计时可以避免其中的一些错误。如果代码不错,您将学到一些有关如何制作可维护应用程序的知识。

您还将学习如何处理实际业务应用程序的复杂性。由于这是在银行业,您将了解到您甚至可能从未想到的联邦法规和内部会计控制等内容。当您被要求设计金融世界中的其他内容时,这些都是要知道的好东西。金融编程可以是一个非常有利可图的行业,因此获得银行经验可能对您非常有益。

您甚至可能会发现,仅仅是因为15年前用您不希望使用的语言写的东西,不一定就不好。毕竟,它一直在成功运行。

如果像大多数旧版应用程序一样,该应用程序没有单元测试,那么您真的需要确保所做的更改不会影响其他任何事情,那么您可以了解如何添加该测试以及如何向管理层出售添加该测试的原因一个好主意。


2
的确,如果您要花4个月的时间学习代码,则应在那4个月中花大量时间添加注释,以记录所学内容,并编写测试以证明关键组件正常工作(正如人们希望的那样)。
罗斯·帕特森

1
@RossPatterson,既然这是银行业务,是的,我希望他们现在确实可以正常工作。无论如何,如果没有测试,那么在银行业进行更改的风险就很大,编写单元测试以帮助您了解系统应该是一件容易的事。
HLGEM

3
编程人员知道如何移动各个部分。了解系统就是知道如何玩游戏。从技能建设的角度来看,您不会后悔。为那些从寡妇和孤儿身上偷东西的公司工作是您良心不容忍的。
Meredith Poor

8

我认为对于任何人来说,这都是极好的实践。向他人学习经验可能非常有效。

真正的挑战不是发现错误,而是要吸引另一个开发人员的头脑,并试图找出why以这种方式编写的代码。有时是因为他们草率马虎,有时是因为他们有充分的理由。假设开发人员至少与您一样出色,但可能拥有更多的领域知识。


2
它还可以帮助您了解编写代码时认为不应该使用的方法。
HLGEM

在这种情况下,找到一些代码注释或项目文档将是很棒的。否则,实现功能的骇人听闻或怪异方式将仍然是一片混乱。该开发人员甚至可能不再在公司工作,因此您无法向他询问。
Radu Murzea

6

对于任何开发人员在职业生涯中的任何时候,这都是一个好习惯。如果您可以查看和分析现有软件并找到改进方法,那么您将证明自己是一名有价值的开发人员。您不仅将学习他人如何设计和开发软件,而且还将学习不该做的事情,这本身就是宝贵的知识。

如果您准备迎接挑战,请继续进行此项目并将其改进。


2

它绝对会为您提供帮助,但您需要小心。

您需要确保您从旧代码中学习。你怎么知道什么是好是坏?也许您可以认识到不同模式/方法的优缺点,但是如果您是刚起步的初级开发人员,则可能无法做到。

并且在第一份工作中待的时间太长,您可能没有学习或没有足够的技能,最终陷入了困境。


2

旧版可能意味着任何事情,但基于您“写得不好”的评论,我将假设旧版意味着“不好”或至少“过时”的技术和模式。如果旧代码很好,请不要停下来学习每行代码。

我认为到目前为止,还没有足够明确的警告来警告那些会改变您的职业并且使您陷于该线程无价的陷阱中的工作和项目。

体育类比预警:您认为NFL的线下支持者通过与表现最差或最好的球队一起比赛能学到更多东西并变得更有价值吗?我的回答:在为最好的球队效力时,他们不仅更有价值,而且他们可能会选择最佳实践和知识,并避免选择职业结局的实践和态度。

那里有很多可怕的反模式代码,它们实际上可以为企业服务,并支付大量开发人员工资。我建议未按正确方法完成足够代码的开发人员可能会将反模式代码误认为是问题的合法解决方案。企业可能会说该解决方案有效,但它不是您想要的简历上的内容,也不是您要吹嘘给其他开发人员的解决方案。仅当您的个人成长道路包括赢得工程同行的尊重,而不仅仅是暂时增加您所工作的任何公司的收入时,这也才有意义(听起来很糟糕,但最终,最好的工程绝对会让IMO赚钱最多) 。

不幸的是,在揭露技术债务之前,有很多代码和大量时间可以过去。而且通常是在为时已晚时才准确地识别出技术债务。以前可能曾试图阻止技术债务或反模式的任何人,都可能因为感觉到的额外费用或缺乏对可伸缩性的了解而被淘汰。作为工程师,我们有责任立即消除技术债务。没有经验丰富的工程师的项目有时会碰壁,即使是有才华的开发人员,实际上都是所有项目。大多数企业认为“某个地方”有很多时间可以在以后进行修复。这使得新来的开发人员的工作选择非常复杂。它还指出了开发人员和企业之间完全不同的目标和心态,以及缩小差距的复杂性。

工程师的目标是“包括”实际的科学工作和设计考虑,而业务的目标是“排除”不必要的成本和时间。由于工程师通常不知道在实际完成最终状态之前需要花费多少精力和时间,因此软件开发就像任何一部出色的戏剧一样发挥出来,而诸如敏捷,scrum和看板等角色则扮演着主要角色。

一种收获可能是远离不良代码,直到您看到足够好的代码而不会被“破坏”。我喜欢高级开发人员为复杂问题创建简单解决方案的说法。同样,初级中级开发人员可以为复杂的问题创建复杂的解决方案。

另一个收获可能是您需要在不同的地方处理好坏代码,以便获得理解。如果您都没有做过,那么请继续尝试并准备好在遇到更好的系统时完全不学习。我认为这对于大多数开发人员来说可能是更常见的轨迹。

我今年有偏见,因为我感觉自己正在攀登极其复杂的“秘密调味料”山。尽管我将增强破译我所见过的一些最糟糕模式的能力,但这种“习惯”和“一劳永逸”以至于我不认为自己的努力会增加我的适销性或未来的可用技能。

为了保持理智,我一直在稳步前进,拥抱所有障碍,以此作为课程的标准。在刚刚与老板一起回顾了我的年度目标(包括挖掘出这个遗留漏洞)之后,我觉得这可能是一个牺牲的攀登。我可以通过差评和察觉到的缓慢来生存下来。对于那些想做什么工作的人来说,这是一个现实的,预兆性的警告。

免责声明:这篇文章的生存期将比我的观点长得多,因此请加一点盐。明天我可能会喜欢旧代码!(对此感到怀疑)。


1

这在很大程度上取决于您在这种情况下如何定义“传统”。让我给你一个C和C ++的例子。许多C ++程序员称在C ++应用程序中使用C字符串是一种不好的做法,其他一些人则不需要混用,而其他人则声称,使用C代码的任何旧部分都是纯粹的,毫无意义的,因为它们太旧了,即“旧版”代码。有些人走得更远,避免使用C ++ X之前的版本(用适当的数字替换'X')标准惯用语,即语法,因为它是“旧式”样式。

抛开C ++流和字符串的性能问题以及一些STL的特殊性,看看您如此受人喜爱的预处理器指令中的内容是一个不错的实践#include <string.h>。如果您遵循实现的路径,并在以下位置使用unix / linux机器/usr/include/string.h(并从gnu.org获得libc实现源)并阅读strcmp.cstrlen.cstrtok.c,我敢打赌,您会听到“多么美丽的世界逐步升级。

但是,该散文有一个警告:即不赞成使用的类和方法。在Java中,仍然可以从最近的环境中访问很多旧的东西,但是如果我没记错的话,并不是所有的东西。根据我自己的经验,在IB领域中,并非所有软件都是由优秀的程序员编写的。在开始担任分析师/开发人员职位之前,许多毕业生对现实世界编程的接触几乎为零。但是,请不要对此说法一概而论。我认识很多在高吞吐量,低延迟环境中使用Java和C#的人。我不同意他们的观点,但是好在这是他们的事。如果他们没有进行真正的HFT,他们将被排在后面。但是再说一次 从这句话很容易推断出Java代码是高度可优化的假设(在许多情况下是事实)。而且,如果您擅长优化(如果需要),不仅可以解决此问题,那么作为一名开发人员,您将变得无价。认识到您的贡献是多么令人满足。我会去的。

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.