可扩展可维护系统的经验

在开始做任何事情之前,您需要备份所有可能相关的内容,这样可以确保不管发生什么情况不会丢失数据。我们很难记得每天修改了哪些东西,特别是配置数据容易受到这种问题的影响,配置通常不会进行版本控制,如果能够进行定期备份,那则可以规避很多麻烦。把所有东西复制到一个非常安全的地方,除非它是只读模式,否则永远不会触摸到。每个程序员,项目经理或团队负责人的生命周期中至少发生一次,你接手一坨超过百万行代码的系统,原来的程序员很久以前就离职,现在也许正在某个阳光明媚的地方度假,文档(如果有的话)最有可能的情况就是与现有的系统不同步。
而你的工作则是带领团队脱离这个混乱。
在经历逃离的本能回应之后,您开始对项目进行了了解,公司高层领导是不能容忍项目失败的情况。然而,通过你手头现有的东西,失败是大概率发生的事件。那么该如何应对?
我有幸(或不幸)已经经历过若干次类似的经历,我和一小部分朋友发现,如果能够把这些垃圾代码变成健康的可维护的项目,实际上是非常值得一试的事情。以下是我们总结改进旧版代码库的一些经验(或者叫军规)。

操作方法

  • 01

    1、数据备份 在开始做任何事情之前,您需要备份所有可能相关的内容,这样可以确保不管发生什么情况不会丢失数据。我们很难记得每天修改了哪些东西,特别是配置数据容易受到这种问题的影响,配置通常不会进行版本控制,如果能够进行定期备份,那则可以规避很多麻烦。把所有东西复制到一个非常安全的地方,除非它是只读模式,否则永远不会触摸到。 2、重要的先决条件,构建一个真实的仿真环境 我之前的文章中错过了这一步,假设这个环境已经存在了,但许多 HN 网友指出了这一点,他们是绝对正确的。 第一步是确保你知道现在正在生产环境运行的是什么,这意味着您需要能够构建一个软件版本 —— 和您的真实环境保持一致 —— 相同的软件环境与二进制版本。 如果你找不到一个方法来实现这一点,那么如果你提交代码到生产环境,就可能会遇到一些令人不快的意外。确保新的代码在合适环境尽可能地被测试,然后你才会有足够信心将其运行到生产环境。上线时做好准备可以随时切换回老的代码,并确保通过日志记录了相关重要内容,以便在后续排查问题能派上用场。 3、冻结 DB 修改 尽可能冻结数据库修改,直到完成第一阶段的改进,直到团队对代码库已经有了彻底的了解,遗留代码已经弃之身后时,才考虑修改数据库结构。在此之前任何的数据库修改可能会导致一些棘手的问题,你失去了并行运行旧系统和新的代码库的能力。linux命令可在《Linux就该这么学》中查阅保持 DB 完全不变,您可以比较新的业务逻辑代码与旧的业务逻辑代码,如果所有这些效果都与预期一样,则应该完全没有区别。

  • 02

    4、编写测试 在进行任何修改之前,编写尽可能多的端到端以及集成测试,确保这些测试能够产生正确的输出,并覆盖所有潜在的情况。 这些测试将具有两个重要功能:帮助在早期阶段清除任何误解,另外一方面,一旦您开始编写新代码来替换旧代码,这些测试将可以更好保护您的系统。 自动化您的所有测试,如果您已经有 CI 的经验则尽快使用它,并确保您的测试运行足够快,以便在每次提交后运行全套测试。 5、Instrumentation 和日志 如果旧平台仍然可以增加 Instrumentation,在一个全新的数据库表中执行此操作,为您可以考虑的每个事件添加一个简单的计数器,并添加一个单个函数来实现此功能,以根据事件的名称来增加这些计数器。 这样,您可以使用一些额外的代码行实现带有时间戳的事件日志,您将了解到有多少事件导致另一种事件。一个例子:用户打开应用程序,用户关闭应用程序。如果两个事件应该导致一些后端请求,那么这两个计数器应该在长期上保持不变,差异是当前打开的应用程序的数量。如果您看到更多的应用程序打开,而不是应用程序关闭,你知道必须有另一种应用程序结束的方式(例如崩溃)。 这个简单的技巧可以将每个后端应用程序变成一个类似的簿记(bookkeeping)系统,就像一个真正的簿记系统那样,所有的数字必须匹配,确保它们在所有用到的地方没有问题。 随着时间的推移,这个系统将监控健康方面变得非常宝贵,并且将成为源代码控制系统变更日志的一个很好的伴侣,您可以在其中确定每个错误引入的时间点,以及对各种情况产生影响的计数。 我通常保留这些计数器的分辨率为 5 分钟(因此每小时记录 12 次),但如果你的系统有更少或更多事件,则可能需要修改这个时间间隔。所有计数器使用同一个数据库表,因此每个计数器只是该表中的一列。 6、每次只修改一个点 在添加新功能或修复错误的同时,不要陷入同时改进代码以及修改其运行的平台的陷阱。这会导致很多头大的问题。

  • 03

    7、平台更改 如果您决定将应用程序迁移到另一个平台,那么请先执行此操作,但要保持一切功能完全一样。你可以添加更多的文档或测试,但不能超过这一点,所有业务逻辑和相互依赖关系应该保持原样。 8、架构变化 接下来要解决的是改变应用程序的架构(如果需要)。在这个时候,您可以随意更改代码的较高级别结构,通常通过减少模块之间的水平链接数量,从而减少与最终用户进行任何交互时代码活动的范围。如果旧代码本质上是一体的,现在将是一个很好的时机使其更加模块化,将大型功能分解成较小的功能,但是保留变量和数据结构的名称。 HN 网友 mannykannot 指出,架构修改并不总是可行,如果特别不幸运,那么可能需要非常深入理解代码才能进行任何架构更改。我同意这一点,因此我做个小的补充,如果您同时进行高级别更改和低级别更改,至少需要将其限制在一个文件,或最坏情况下限制在一个子系统,以便尽可能限制更改的范围。否则你可能很难调试刚才所做的更改。 9、低级重构 到目前为止,您应该对每个模块的功能有很好的了解,并为实际工作做好准备:重构代码以提高可维护性,并使代码具备扩展新的功能的能力。这很可能是项目中耗时最多的一部分,文档需要随之进行,在完整编写文档介绍并彻底了解一个模块之前,不要随意更改模块。 这个阶段也可以修改变量和函数命名、修改数据结构,以提高代码清晰度和一致性。记得添加相关测试代码(根据需要,可进行单元测试)。 10、修复 bug 现在你准备好进行一些最终用户可见的变化,第一件事情将是修复多年来积累在队列中的 bug。像往常一样,首先确认 bug 仍然存在,然后编写一个测试并修复 bug,您的持续集成和端到端的测试应帮您避免由于缺乏理解或某些错误而导致的任何错误及外围问题。 11、数据库升级 如果上述工作都已经完成,你可以再次拥有可靠且可维护的代码库,您可以选择更改数据库 schema 甚至替换数据库。已经完成的上述工作都将有助于您以无负担的方式进行变革,而无需担心任何意外,您可以使用新的代码和所有的测试来测试新的数据库,以确保您的迁移没有任何问题。

(0)

相关推荐

  • 可扩展可维护系统的11条经验

    在开始做任何事情之前,您需要备份所有可能相关的内容,这样可以确保不管发生什么情况不会丢失数据.我们很难记得每天修改了哪些东西,特别是配置数据容易受到这种问题的影响,配置通常不会进行版本控制,如果能够进 ...

  • WinPE只能用来维护系统吗

    微软对WinPE的本意:企图让用户将WinPE系统仅仅用于维护,并设置了种种限制。但在广大电脑爱好者的努力下将这些限制不断被突破。如果你坚持认为WinPE系统仅仅用于维护,那么请稳步,不用再往下观看了 ...

  • 如何用急救盘组维护系统

    急救盘组是电脑中的重要工具,可用于独立启动和运行完整的Linux系统.实际急救盘组中的第2张盘中,有一个完整的Linux系统,包括root文件系统,而第1张盘则存放了可启动的内核. 使用急救盘组维护系 ...

  • 让Windows XP能够全自动维护系统

    Windows XP的日常维护是件既耗时又无聊的事情,如果Windows XP能够聪明一点,进行自动维护就好了。下面,就为大家介绍一种通过.inf文件让Windows XP进行自动维护的技巧,自动维护 ...

  • Windows XP能够全自动维护系统

    Windows XP能够全自动维护系统

  • Linux系统分区方法经验分享及意见建议

    Linux分区方法,不同的人有不同的方法,反正没有统一的方法.在分区方面,我觉得根据自己的实际情况来分是最好的.玩linux也有好几年了,下面说一下,我在分区方面的一些经验. 一.个人用 如果是个人用 ...

  • 《武斗乾坤》猎符系统进阶经验分享

    操作方法 01 坐骑进行猎符并装备符印,可大幅提升坐骑的战斗力,助您在斗兽中取得佳绩!当角色等级升至37级后,开启坐骑猎符系统,可通过猎符获得符印.在坐骑界面的右下角点击"猎符"按 ...

  • 硬盘如何安装PE维护系统

    先在网上下载一个PE。 1、准备一个U盘。将所需文件edit.com和网卡驱动复制到闪存根目录下。比如,这里的是8169网卡,可以在闪存新建一个名为8169目录,把驱动文件全部复制到该目录。下载到的P ...

  • 电脑硬件使用和维护方面的经验

    电脑硬件使用和维护方面的经验