操作系统框架选择:供应商锁定框架的七大罪恶


了解更多关于框架供应商锁定的七宗罪。

当选择开源和企业软件框架时,总会有供应商锁定的风险。

框架很容易添加,但是很难移除。有些框架比其他框架更难;这需要特别的努力来确保它们在你的代码库中的位置,并且以后几乎不可能移除。这是你应该尽量避免的框架。

所有框架都有某种供应商锁定。重要的是锁定的程度。要了解更多信息,请阅读Lock-In: Let Me Count the Ways

在选择过程中,您应该评估框架的供应商锁定程度。以后摆脱它是不可能的、困难的还是容易的?

替换总是需要努力的。例如,SQL数据库可能是世界上最好的标准化框架,但是要替换它,您总是需要进行修改并运行导入/导出脚本。这从来没有换灯泡那么容易。所有这些都有独特的特性、语言方言以及字段原语、日期时间限制、错误处理和blob长度等方面的差异。

以下是你应该时刻注意的供应商锁定的七大缺点:

  1. 侵扰性
  2. 供应商地缘政治
  3. 供应商冠军
  4. 不必要的语言
  5. 维修插头
  6. 云销售
  7. 沉浸感

#1:侵扰性

侵扰性是供应商锁定的最常见和最丑陋的形式,选择一个侵扰性框架应该是一个主要的“不”,除非没有其他选择。

如何快速检测入侵

当你阅读文件的时候,你的直觉中会发现第一个侵犯的迹象。你感觉到自满、绝对、傲慢和/或骄傲自大了吗?这些都是入侵的直接迹象。

此外,当框架在其产品名称或标语中使用弗洛伊德的最高级词如“棒极了”、“确定的”和“最终的”时,要保持警惕。

发现侵扰的具体方法

以下是文档中需要注意的一些其他事项:

  • 声明单字母全局变量,如g,Z,$,或_
  • 宣称在另一个环境中对标准对象的独占控制
  • 声明全局或共享命名空间或不使用name_prefixes
  • 声明常用的关键字或名称
  • 强制您的网络应用程序使用它们的网址结构
  • 专门声明众所周知的TCP/IP端口号
  • 控制您需要控制自己的资源、数据或功能
  • 控制标准目录,例如/tmp或者~
  • 模型视图控件名存实亡;在较低的层次上,这些是紧密纠缠在一起的
  • 文档大胆地陈述了与某些软件的不兼容性
  • 声明整个超文本传输协议文档的根,并将您指向它们允许您工作的地方,而不是相反
  • 多租户使用是不可能的;某些数据被硬编码为一个单独的空间
  • 仅预定义的字段名,迫使您对数据使用错误的字段名
  • 假设没有类似的框架或技术会在同一个空间使用

为什么侵扰如此危险?

虽然这看起来似乎是一个小得不用担心的概念,但是侵入性的框架可能会破坏其他框架任何的升级或安装于任何的未来的时间。这将迫使你做出大的和仓促的修复,因为两个框架互相阻挡。这从来都不是一件好事。

侵入性是一个设计问题。
如果制造商愿意,这是可以避免的。

#2:供应商地缘政治

所有的企业都试图让进入变得容易,离开变得困难。但是软件巨头有时会将这一原则提升到一个新的层次,成为一个全新的游戏。

供应商地缘政治是利用社区对抗竞争的权力策略,锁定开发者用户,最终锁定竞争对手。

让我们举一个老例子:21世纪初的大浏览器战争。JScript是JavaScript的一个不兼容版本,它旨在将开发人员锁定在某个品牌和操作系统的浏览器上。因此,它也锁定了最终用户,因为使用JScript的网站在其他浏览器上失败了。

目标是让公众停止使用竞争浏览器,因为“网站总是在这一点上被破坏。”这个巨人非常友善,他用“最佳浏览”徽章来“帮助”公众,开发者应该在他们建立的网站上贴上徽章,建议如果网站看起来坏了应该使用什么浏览器。

因此,厂商奖励自己创造的浏览器与免费广告的不兼容性,以使公众将其视为“标准”浏览器。狡猾而精明。后来,欧盟为此事对他们罚款7.31亿美元,相当于他们净利润的3.3%sourcesource)。

你应该留意你可能被地缘政治所吸引的迹象:

  • 不支持相关和明显的开放标准
  • 这个框架只能在你采用他们更大的生态系统或语言时使用
  • 争夺硬件或操作系统限制
  • 偏离已知开放标准的特定于供应商的变体或方言
  • 选择它们会迫使你说再见
  • 扩大使用的指数定价
  • 暗示与标准不兼容的营销是一个新标准

地缘政治可能无关紧要,因为在你的情况下“另一个大陆”是不存在的。但是你应该先了解所使用的策略,然后才能判断它是否对你有问题。

被一个大供应商锁定是一件危险的事情:这看起来太牵强,不值得担心,而且可能需要几年才能生效,但一旦生效,代价就很高了。

#3:供应商冠军

大供应商通常建立框架,使它们成为整套产品的一部分;如果你选择一个供应商的框架,你会得到其他依赖它的产品的整个连锁反应,你也需要使用它,否则它不起作用。

这些供应商为宇宙中的每一个编程挑战提供了广泛的产品和解决方案,所以在他们看来,你没有真正的必要走出泡沫。

理论上,你可以用其他品牌的框架来代替,但是从来没有人测试过。在实践中,不忠受到的惩罚是,在它最终奏效之前,你不得不无休止地修补,最小的改变又会打破一切,让你每次升级都要经历修补周期,不断为你的不忠后悔。

如果冠军过时了,你就过时了,因为你做的一切都是基于他们的框架。您的创新能力仅限于您的供应商拥护者所能提供的。

#4:不必要的语言

如果一个框架做了完全不同的事情,那么用一种新的语言来表达它的全部潜力是有意义的。

但是有时候,框架供应商引入他们自己的编程或控制语言,没有别的原因,只是让它很难进入竞争。框架本身没有什么不同,所以语言增加了价值。当你看到它时,你会认出它。

#5:维修堵塞

商业框架,无论是开源的还是企业的,通常都是通过专业服务赚钱的。没关系,总得有东西来付账。只要确保它没有被设置好,这样你就可以在不一次又一次地请他们的顾问的情况下什么都不做。

一个明显的迹象是,该应用编程接口有一个非常模糊的结构,就像数百个按字母表排序的函数和许多名字非常相似但没有解释区别的函数。或明确未记录的高级功能,例如:

FFGGHH模块非常先进。向我们的顾问寻求帮助。

信息技术代表什么:

FFGGHH模块充满了错误,我们不会告诉你,所以你一直需要我们的顾问为你制定变通办法。如果我们记录下来,你可以自己修理,否则你会因为质量差而解雇我们。

如果你只需要他们的顾问来让它工作,好吧...算是吧。但是有了一些商业洞察力,供应商的目标是一个经常性的依赖。即使你不介意费用,你所付出的代价也是一直在等待和乞求他们的顾问,破坏你的发布时间表,违背对客户的承诺。你付给他们很多钱,他们为你做的只是保持一个不健康的循环。

6:没有数据可移植性的云服务

对于云服务,缺乏可移植性是一种特定的厂商锁定策略。

云框架将你的数据存储在他们的云中,但是没有合适的应用编程接口来再次获取它,这是一个很大的障碍

无论你选择什么样的框架,如果它存储了数据,那么这些数据必须随时都可以到达和携带。在研究云解决方案应用编程接口时,您必须能够找到调用,以机器可读的格式获取您的数据,并具有永久的、唯一的标识。

关于加入社区的时髦话题已经敲响了警钟,我们的应用编程接口很简单,很时髦,但是如果你在文档中寻找数据可移植性,就没有明确的提及。

这样的框架属于解散名单。

#7:沉浸式框架

沉浸式意味着一个框架想要你做所有的事情他们这样,你就必须完全“沉浸”在他们的方法中,否则就没用了。

注意区别:

  • 侵入式框架要求命名空间并阻碍其他框架的运行
  • 身临其境想让你按他们的方式做任何事情,没有办法绕过它

这种结合也会发生,而且是邪恶的。

此外,请记住供应商冠军之间的区别:供应商冠军是所有框架的组合,沉浸式框架是所有框架的组合。

通常,通过他们交流视觉的方式,很容易在早期识别身临其境,这可以归结为:

“我是太阳,你是小行星。”

实际上,我们经常用这样的框图来看这个:

沉浸式框架如何呈现自己

然后,在实践中,你将成为一个小行星;你会绕着全能的太阳转圈。不通过这个框架什么也不会发生。你将不得不调整你世界的其他部分来保持沉浸式框架的运行。

沉浸式框架的技术特征

通常,框架规定了应用程序的上层结构,并为您指定了放置代码的位置:/* your code goes here */

服务器端框架决定了应用程序的文件结构;它们告诉你把哪些代码放在哪里,把数据放在哪里,在某些地方代码文件夹的存在通常也有意义。

在web应用程序中,沉浸式框架经常声称拥有整个DOM树或者整个httpd文档根,或者任何你的世界中的中心资源。

身临其境如何变成邪恶?

沉浸式框架植根于针对具体问题的优雅原则,而错误在于将这种优雅原则应用于其他一切。

通常,沉浸式框架的1.0版本优雅简单,但功能强大。后来,现实世界突然出现了。世界的愿望太多了,不可能用一个原则来实现。为了保持优雅,框架必须为许多远离最初目标或范围的问题提供解决方案。

这有严重的后果:

  • 这个框架变成了臃肿的软件,充满了各种不成熟的解决方案
  • 作为一名开发人员,你总是被剩余的限制所束缚
  • 你试图通过增加新的框架来创新,这会导致技术冲突
  • 停留在沉浸式平台上比对抗这些冲突更容易
  • 你别无选择,只能忍受框架的限制
  • 你和他们一起过时了

因此,沉浸式框架剥夺了你创新的选择。

错误在于没有内置选项来隔离框架工作的区域,并且在隔离之外,让其他框架来隔离它们。

不要误解我,基于优雅原则的框架是好的,应该有更多这样的框架。

如何发现行为良好的非沉浸式框架

总的来说,我更喜欢那些充分利用坚持其优雅原则的框架,没有让自己沉浸其中:你们决定它的工作领域,它有办法绕过它优雅的原则,这只会使事情变得不必要的复杂。

你可以在你想要的地方使用它

该框架明确地避免了代码文件的固定位置,或者代码文件中您可以放置您的东西的位置。或者,提供了一种简单、美观且符合逻辑的方法来告诉框架它的代码树从哪里开始,而不使用全局变量。

寻找钩子

对于面临复杂性增长风险并需要在高负载下良好执行的应用编程接口调用,您应该寻找“钩子”:传递函数指针、函数对象或另一段代码,以做任何您想要的不属于该框架的疯狂事情,从而使实际的应用编程接口调用保持简单。

您可能需要深入应用编程接口来找到它,或者在应用编程接口文档中搜索“回调”、“钩子”、“补丁”等词。

我承认钩子不会产生漂亮的代码,但是最终,沉浸式代码会变得更加丑陋。

寻找可扩展参数接口

对我来说,处理应用编程接口硬部分的最优选方式是可扩展的输入控件,例如,可扩展的JSON字符串或自由顺序可选参数(如kwargs或者是一个可以传递的动态创建的对象结构或函数。然后,您和框架开发人员都可以自由扩展您喜欢的任何东西,并且“常规”使用保持简单和干净。

你付出的代价是一些解析开销。

但是提供可扩展参数结构的事实本身就是一个好的迹象。框架开发人员是现实的,并且承认即使最丰富的控制集也不能覆盖所有可以想象的用例。他们明智地选择不要让少数人的需求成为多数人的负担,而是让框架专注于它最擅长的方面。

结论

选择框架时,避免供应商锁定的七大缺点。替换一个没有的框架已经够难了。取而代之的是,选择目标狭窄、范围适度、并为更复杂的用例提供充分可扩展性的框架。

进一步阅读

Lock-In: Let Me Count the Ways

Five Things That Can Go Wrong With Vendor Lock-In