美文网首页
千万不要做的事-从零开始重写旧有项目

千万不要做的事-从零开始重写旧有项目

作者: 本一和他的朋友们 | 来源:发表于2022-10-23 12:03 被阅读0次

    Netscape 6.0 终于进入了第一个公开测试版。从来没有 5.0 版本。最后一个主要版本 4.0 发布于近三年前。3 年在互联网世界是一段很长的时间。在这段时间里,当他们的市场份额暴跌时,网景却袖手旁观,束手无策。
    我批评他们在发行之间等待了这么长时间有点自以为是。他们不是故意那样做的,是吗?
    嗯,是的。他们的做法是犯了任何软件公司都可能犯的“最糟糕的战略错误”:他们决定从头重写代码。

    网景并不是第一家犯这种错误的公司。Borland 在收购 Arago 并试图将其做成 Windows 的 dBase 时犯了同样的错误,这是一个注定失败的项目,花了很长时间,以至于微软 Access 吃掉了他们的市场份额。然后他们又犯了同样的错误,从零开始重写 Quattro Pro,它的功能之少让人们震惊。微软几乎犯了同样的错误,试图在一个名为金字塔的注定失败的项目中从头开始重写 Windows 版本的 Word,这个项目被关闭、丢弃,并被掩盖起来。幸运的是,微软从未停止在旧代码基础上的工作,所以他们有东西可以发布,这只是一场财务灾难,而不是战略灾难。

    我们序员在心中自认为是建筑师,当他们到达一个地点时,他们想做的第一件事就是把这个地方铲平,然后建造一些宏伟的东西。我们对渐进式的翻新并不感兴趣:修补、改进、种植花坛。
    程序员总是想扔掉代码重新开始有一个微妙的原因。原因是他们认为旧的代码是一团糟。这里有一个有趣的观察:/他们可能是错的。他们认为旧代码一团糟的原因是一个基本的编程法则: 阅读代码比写代码难。

    这就是代码重用如此困难的原因。这就是为什么团队中的每个人都喜欢使用不同的函数来将字符串分割为字符串数组。他们编写自己的函数,因为这比弄清旧函数的工作原理更简单,更有趣。
    作为这一公理的一个推论,您可以向几乎所有程序员询问他们正在开发的代码。他们会告诉你:“这是一团乱麻。”“我最喜欢的就是把它扔了,重新开始。”

    为什么会一团糟?
    他们说,看看这个函数。它有两页长!这些东西都不该放在那里!我不知道这些 API 调用有一半是干什么用的。”

    在 Borland 面向 Windows 的新电子表格发布之前,媒体多次援引 Borland 的创始人菲利普·卡恩(Philippe Kahn)的话说,Quattro Pro 将比微软的 Excel 好得多,因为它是从头开始编写的。所有新的源代码!就像源代码生锈了一样。

    新代码比旧代码更好的想法显然是荒谬的。旧代码已经被使用了。它已经经过了测试。已经发现了很多 bug,并且已经修复了。这没什么问题。它不会仅仅停留在你的硬盘上就获得 bug。反之,宝贝!难道软件就像一辆老旧的道奇 Dart,在车库里就会生锈吗?软件是不是像泰迪熊,如果不是用全新的材料做的就有点恶心?

    回到两个页面的功能。是的,我知道,这只是一个显示窗口的简单功能,但它长了一些毛发和东西,没有人知道为什么。好吧,我来告诉你原因:这些都是 bug 修复。其中一个修复了南希试图在没有 ie 浏览器的电脑上安装这个东西时出现的错误。另一个补丁修复了在低内存条件下发生的错误。另一个补丁修复了当文件在软盘上,用户从中间拔出软盘时发生的错误。这个 LoadLibrary 调用很难看,但它使代码可以在旧版本的 Windows 95 上工作。

    这些漏洞都是在实际使用了数周后才被发现的。程序员可能已经花了几天的时间在实验室里重现 bug 并修复它。如果这是一堆 bug,修复可能是一行代码,甚至可能是几个字符,但大量的工作和时间都花在这两个字符上。

    当您丢弃代码并从头开始时,您就是丢弃了所有的知识。所有这些收集的 bug 修复。多年的编程工作。
    你正在放弃你的市场领导地位。你是在给你的竞争对手两三年的时间,相信我,这对软件来说是很长的一段时间。

    您将把自己置于一个非常危险的位置,您将在数年时间里交付一个旧版本的代码,完全无法做出任何战略更改或对市场要求的新特性做出反应,因为您没有可交付的代码。你还不如在这段时间内关门大吉。
    您正在浪费一大笔钱来编写已经存在的代码。

    还有别的选择吗?共识似乎是旧的网景代码库是真的糟糕的。可能是很糟糕,但是,你知道吗?它在许多现实世界的计算机系统上运行得非常好。
    当程序员说他们的代码是一团乱麻时(他们总是这么做),有三种情况是错误的。

    首先,存在架构问题。代码没有正确分解。网络代码从某个地方弹出自己的对话框;这应该在 UI 代码中处理。这些问题可以通过小心地移动代码、重构、更改接口逐一解决。它们可以由一个程序员仔细工作并一次性签入他的更改来完成,这样就不会扰乱其他人。即使是相当大的体系结构更改也可以在不丢弃代码的情况下完成。在 Juno 项目中,我们一度花了几个月的时间重新设计架构:只是移动东西,清理它们,创建有意义的基类,并在模块之间创建清晰的接口。但是我们在使用现有的代码库时非常谨慎,我们没有引入新的 bug 或丢弃可用的代码。

    其次,程序员认为他们的代码一团糟的第二个原因是效率低下。据传网景的渲染代码很慢。但这只影响项目的一小部分,您可以优化甚至重写。你不需要重写整个式子。当优化速度时,1%的工作可以让你获得 99%的效果。

    第三,代码可能非常丑陋。我参与的一个项目有一个数据类型叫做 FuckedString。另一个项目一开始使用成员变量以下划线开头的惯例,但后来改用更标准的“m*”。所以一半的函数以" * "开头,一半以" m_ "开头,看起来很难看。坦白地说,这是一种用 Emacs 中的一个宏就能在五分钟内解决的问题,而不是从头开始。

    重要的是要记住,当你从头开始的时候,“绝对没有理由”相信你会比第一次做得更好。首先,你甚至可能没有与第一版相同的编程团队,所以你实际上并没有“更多的经验”。你只会再次犯大多数旧的错误,并引入一些原始版本中没有的新问题。

    当应用到大规模的商业应用时,对旧有项目重构是危险的。
    如果您正在实验性地编写代码,那么当您想到更好的算法时,可能会想要删除上周编写的函数。这很好。您可能希望重构一个类,使其更易于使用。这很好。
    但是,抛弃整个程序是一个危险的愚蠢行为,如果网景真的有一些具有软件行业经验的成人监督,他们可能不会搬起石头砸自己的脚这么严重。

    翻译自:https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/

    相关文章

      网友评论

          本文标题:千万不要做的事-从零开始重写旧有项目

          本文链接:https://www.haomeiwen.com/subject/jseizrtx.html