论现代Web应用程序的稳定性

2020-09-17 00:53:39

我不喜欢现代Web应用程序的构建方式。许多Web应用程序太不稳定了,你无法想象如果没有团队的支持,系统就会运行。事实是,我们试图使手动过程自动化,然后自动化需要人工干预,这与目的背道而驰。有些公司有一大批开发人员,如果他们用手工做生意,他们会比编程系统做得更好。造成这种情况的原因有很多。原因之一是过度使用第三方依赖项。

让我们来看看一个基本的现代基于Web的系统,机器上运行着几层软件,从固件到您的业务逻辑。

我不认为这对理解情况的严重性有很大帮助,有很多演员在这张照片中没有被考虑到。层也是如此,因为它们隐含在其他层中。让我们展开这些隐藏层和演员。它将帮助我们更好地理解为什么我们编写小型NodeJS或RubyOnRails应用程序不只是图中的一层。

您的应用程序的第三方代码依赖于ORM、模板引擎、分页库、一个用空格填充字符串的库。

位于处理http和响应压缩…的代码前面的服务器应用程序。等。

再一次,我们错过了这张照片中的其他层次和人物。大多数应用程序都使用外部SAAS提供程序进行日志记录、监控或错误移植,或者提供部分系统功能,而这些功能可能需要公司团队花费更多时间来构建。让我们把他们和他们的队伍一起加到照片上。

这张图是针对一个应用程序的,我不会把它扩展到有不同服务和程序的整个系统,这是所有公司的现实,为了简单起见,让我们只使用一个应用程序。

所以我想说的第一点是:对于你使用的每一项服务,你不仅仅是一个用户,这项服务现在是你的应用程序的一部分,你要为它的行为和行为负责。你将继承他们系统中的错误。当这个服务团队受到新冠肺炎的影响,沦落到无法解决问题的地步,你也会受到影响。当它们变慢时,您的应用程序也会变慢。当他们的服务中断时,你的应用程序也会出现故障,你的系统和他们的系统现在已经连接起来了。因此,请谨慎添加外部服务集成。通过添加外部系统,您可以信任这个服务团队以及他们在现在和未来交付服务承诺的能力。这不是一个容易的决定,应该这样对待。

现在,让我们转到应用程序的直接依赖项。如果您正在使用任何现代编程语言,它将有办法将代码打包成可重用的格式,以供其他应用程序重用。一个包可以使用来自母包的代码,这些包可以使用其他包,以此类推,就像树一样。

对于此树中的每个包,我们都依赖于此包中的代码和维护它的团队。一个新生成的Rails项目依赖于74个Ruby和Yarn包列表,该列表列出了JavaScript依赖项输出3102行,即3176个包,团队一直在维护这些包、bug和新版本。

这是错误的,原因有很多。为了清楚起见,我将在这里列出其中一些。

您已经信任了至少3176名其他开发人员。你从来没有见过他们,从来没有和他们说过话,不能保证他们会继续保留这个包裹。不能保证他们不会在包里放代码,在你的终端上显示广告,或者偷走你的比特币钱包的代码。

您并没有真正使用所有这些代码。当有人在编写开源包时,它迟早会受到特性覆盖的影响。您可能正在使用这个包的几个特性,并不需要其他的功能,但是您现在想要香蕉,却得到了整个森林。

在每次软件包更新时,您都在为自己发明不必要的工作。新版本的软件包一直在发布。更新您的项目以获取最新的错误修复和功能通常是人们所做的。大多数时候,由于特性的蔓延,这些版本的更改与您毫无关系,但您只有在阅读更改日志后才会知道。如果它与您的项目相关,则需要进行更新。如果某些内容已弃用或更改,则需要更改代码。所以突然有人在某个地方命令你更改密码。这是您对代码的控制权的一部分,交给了一个您从未交谈或认识的人。

当您的编程语言有了新版本时,除非您的所有依赖项都是最新的,否则不能更新。例如,对于Ruby2.7.0,一些语言语法现在已被弃用,并在您运行项目时显示警告。因此,要修复此问题,您可以将其修复到包中,然后使用更改打开PR,或者等待维护人员更新它。

当你在依赖中遇到错误时,你必须理解这个包的代码,分叉,分支,修复,清洗和重复。这需要库维护人员的合作,而这在大多数情况下是不可能的,因为大多数开放源码项目都是自愿维护的。

开发新功能或修改现有功能的难度要大得多。您需要深入研究依赖项的文档,以寻找对您想要添加的这个小功能的支持。也就是说,如果该部分代码有任何文档的话。否则,您将不得不对库代码执行Digin操作。

这是我要说明的第二点:使用外部库意味着您信任维护人员,并且您还继承了他关于使用其他库的决定,等等。这个决定应该根据库的好处和你要使用的特性的多少以及其他因素来权衡,比如成熟度和维护者的响应速度,请不要把GitHubstar作为你的决定的一个因素,这是误导性的。如果您从库中使用的部分不是太大,我建议您使用该库来节省一些时间,并且预先准备好,但是一定要去掉它并实现您需要的部分。例如像Rails“Kaminari”这样的分页库,如果您使用它来节省一些时间,那么一定要这样做。但是在您的待办事项清单上保留一项任务来删除它,并自己实现该功能。一个很难摆脱的库的例子是“OpenCV”,重新实现你需要的部分可能是一项巨大的任务,所以它可以保留下来。你需要用你最好的判断力在光谱的这两个方面之间做出选择。

我想我所做的就是建立一个自动化系统,我希望这个系统能自己运行,保持它自身的清洁和健康,不需要人工干预。如果整个团队消失了,我希望这个系统能够在没有任何监督的情况下运行很长一段时间。

更多的代码意味着我需要修复更多的错误,也就是更多我没有编写的代码意味着更多我可能无法解决的错误。这很危险,不能掉以轻心。使用外部库或系统扩展代码可以减少工作量,从而降低开发成本。但如果对此掉以轻心,就会适得其反。