你见过一个有着11,000行的源代码文件吗? - Austin


很久以前,在我的第一份软件工作中,我收到了一份关于一个内部产品的错误报告,我甚至不知道这个产品的存在。

结果发现这是一个应用程序,基本上提供了公司内任何员工可能需要的所有表格。基本上是一个万能的资源。你需要向人力资源部门报告某人吗?这里有一个表格。你需要一个新客户的合同吗?有这样的表格。

多年来,维护项目的责任一直在团队之间跳来跳去。显然,它属于我的团队。我的团队,我指的是我。

哦,太可怕了。

这是一个单一的代码文件,有超过11,000行的VBScript。

多年来,无数人对这个文件进行了修改。但他们似乎并不是软件开发人员。他们的角色从IT支持到业务分析员不等。考虑到每天有多少员工使用这些表格,我对这个项目被赋予的价值如此之小感到震惊。

看起来整个文件会从上到下执行完毕,尽管我从未实际确认过。代码遵循一个粗略的模式:获取一些关于用户的数据,检查是否满足一些条件,然后做一些重复一千次左右的动作。这些条件通常很简单,比如。

if(usrrps = 5)and(wauth <> "")then

接下来通常是显示一个表单,访问共享驱动器上的文件,在谁的数据库上运行一个SQL查询,以及向一个硬编码的地址发送电子邮件。

现在,我以前从未使用过VBScript(从那时起也没有),但许多变量似乎没有被使用。名称难以辨认。同义词到处都是。

我觉得很搞笑的是,一个变量可能在第200-210行被使用,然后又在第8544行被使用。其他地方则没有。

很多逻辑都是多余的。可能是在某一时刻复制和粘贴,然后再分流。比如,在一个代码文件中需要对用户进行多少次认证?有一次,我敢于清理这些,并重新使用认证响应,但它破坏了一切。我一直没有搞清楚原因。直到今天,我有时躺在床上想,是什么原因导致了这种情况。

当时没有版本控制。关于代码修改的唯一背景是在错误跟踪器和代码注释中,尽管我学到了不相信这些的艰难方式。

这里没有测试环境。如果我做了一个改变,我必须在 "生产 "中测试它。所有程序的状态都是基于用户的权限,所以我们会冒充报告错误的人,这样我们就能看到他们看到的东西。

没有单元测试。如果我做了一个改动,导致其他的 "功能 "损坏,基本上我没有机会知道,直到一周后市场部的杰夫报告了一个错误。

这个故事的寓意是什么?

  • 用户并不关心技术或代码?
  • 开发人员关心?
  • 技术债务是真实的。而且,它可能是昂贵的。
  • 人们的聪明才智是令人震惊的。

网友:
1. 大约在 2006 年,我在上大学,被聘为大学部门编写 web 应用程序。我不知道 JavaScript 可以有类和捕获变量,所以我用完全全局变量和普通函数结合 `eval` 制作了这个应用程序。超过2000行,我之后没有人能看懂。


2. 在我曾经工作过的一家公司(非常短暂,因为质疑一切而被解雇),有一个C项目,有2万多行的类。这些类主要是用来生成报告的。

我记得,基本上每个客户的所有报告都存在于他们自己的类中。当一个新客户注册时,你会把文件复制/粘贴到它自己的类中,改变一个属性以匹配某种客户的ID,然后再部署它。这是因为客户经常会在报告中要求自定义指标,所以每个报告都需要稍作改动。

很明显,这里有很多问题:首先,每当一个报告在做它不应该做的事情时,我们就不得不翻阅成千上万的行。这些类并不都是自成一体的;有时它们会接触到其他客户的功能(这都是静态类)。删除一个客户(和他们的后续报告)会导致几十个编译错误,而且没有单元测试来确保正确的代码被保留下来。所以老客户被保留在代码中。

第二,每当要对报告进行改进时,你需要对每个客户都进行改进。每次项目经理要求对报告进行修改,我记得我都会听到开发人员的痛苦声。有一个特别的家伙,他所做的就是管理这些报告。他看起来绝对是个苦命人。

总之,我不记得其他的事情了。那家公司是一个噩梦。我不知道他们怎么还在做生意。


3. 由于害怕写出糟糕的面条状代码,我最终没有写任何代码。
这个话题让我意识到,有一个能赚钱的项目,但代码却很糟糕,这比一个完美的未完成的项目,以及精心选择的设计模式要好。

由于害怕被评判为糟糕的代码,在我有正确的架构之前,我不能开始。

4. 欢迎来到古代代码库。现在再加上一些excel工作簿的宏,这些宏基本上是作为完整的应用程序,通过ODBC直接调用数据库,在存储过程中触发真正重要的业务决策,并让他们在多个网络服务器上争夺一个DLL,因为许可......也使用一些早于SQL的数据库,没有外键。这对某些人来说是个星期二。再加上水晶报告,一些早于USB的打印机,以及大量可能被使用,也可能不被使用的代码,还有你已经超过了代码编辑器的行数限制,所以你现在到处都在使用名字相似的include文件,并且不得不根据运行代码的机器来猜测哪一个会在加载时符合你的范围层次。另外,在版本控制中只有一个分支,而这个分支在生产中是实时使用的。另外,一堆大型机器运行在这个代码库中,如果你破坏了什么,你可能会损失数万美元的原材料。FML我只是想编辑这该死的报告,鲍勃,为什么会停止车间机器的生产,英国的一个家伙想要我的个人号码,对他被毁坏的数控机床进行死亡威胁?这些都是我工作过的各个地方的真实故事。