“复杂性会致命,”Lotus Notes 的创建人和微软资深人士 Ray Ozzie 在 2005 年的一份内部备忘录中写道,“它榨干了开发者的生命,使产品难以被规划、构建和测试,它带来了安全挑战,并且会令用户和管理员感到失望。”

如果Ozzie认为当时的情况已经很复杂了,那么他又该如何看待软件开发者在云原生时代所面临的复杂性?

从在你可以触摸到的服务器上托管的单体架构中构建应用程序,到将它们分解为多个微服务,打包进容器,与 Kubernetes 协调并托管在分布式云环境中,这个转变标志着软件的复杂程度显著提升。再加上人们对功能丰富和对良好消费体验的期望,这些体验还需要设计成安全且有弹性的。过去,开发者从来没有遇到过如此多的要求。

亚马逊的CTO Werner Vogels在2019年AWS峰会期间表示:“当你进入非常普遍的微服务环境时,复杂性在明显增加。把一切都放在一个整体中的做法会让事情更容易嘛?对于某些方面来说肯定会更好。”

又或者像Werner的同事、AWS 的 DevOps 产品营销主管Emily Freeman 在2021年所说的那样——现代软件开发是“一项关于无序状态的研究,它并没有变得更简单。”

另一方面,复杂的技术从未如此简单地使用现成的方式实现,只要通过一个 API,就能实现从基本的库和框架到图像识别功能,甚至整个支付堆栈,你只需在上面组装和构建业务逻辑。但真的有那么简单吗?

“做软件开发者从未像今天这样困难,”迪士尼(Walt Disney)公司企业技术战略顾问兼前总监Nigel Simpson说,“虽然我们已经看到功能的升级,使开发者能够通过使用高级框架进行应用程序开发和机器学习来做更多事情,但这需要付出代价。选择的爆炸式增长和开发速度使开发者很难跟上时代潮流,许多开发者都因此陷入了困境。”

本质复杂性与偶然复杂性

软件代理公司Simple Thread的联合创始人Justin Etheredge对于区分本质复杂性和偶然复杂性提出了建设性意见。他表示:“基本复杂性是指你所工作的业务领域的复杂性,事实上,企业本身就是个极其复杂的环境,所以他们试图解决的问题在本质上都是复杂的。另一方面是偶然复杂性,就是我们使用的工具所带来的复杂性,也是我们在解决问题时最重要的一环。”

云原生时代带来了比以往任何时候都更多的偶然复杂性,这形成了开发者和老板之间的冲突,开发者希望利用他们可用的完整工具包,而老板则希望他们专注于为客户提供价值。

Etheridge说:“鉴于当今对软件开发者的需求,公司没有能力推动开发者建立一种主要为客户提供价值的思维模型。让更多工程师去考虑这件事是一个挑战。”

选择的缺点

云计算和开源软件的流行,意味着开发者在构建和运行更具可扩展性、弹性、模块化和可更新性的应用程序上有更多的选择,且可选项在以不可阻挡的速度增加。

Humanitec是一家帮助公司构建开发者平台的初创企业。Humanitec的创始人Kaspar von Grünberg在接受采访时表示:“以前一切都简单得多,不是因为我们这个行业犯了错误,而是因为我们必须加快上新速度,以应对这些系统需求的急剧增长。”

云原生计算基金会 (CNCF) 在维护一个交互式图形项目,其中包含构成云原生生态系统的近 1,000种独特服务,其中许多是免费且开源的。此外,三大云提供商:亚马逊云、微软云和谷歌云也都为客户提供了大约200种独特的服务,涵盖计算、存储、数据库、分析、网络、移动、开发者工具、管理工具、物联网、安全和企业应用程序。

RedMonk分析师Stephen O'Grady在2020年的一篇博客文章中写道:“在这一点上,应用程序开发过程过于分散。每个企业架构都是三层的,每个数据库都是关系型的,每个业务应用程序都用 Java 编写并部署到应用服务器的时代已经结束了。当今的基础设施是多种多样的,它的一个最具决定性的特征就是没有一个决定性特征。”

或者,正如Tumblr前CTO Marco Arment在2015年写的那样,“由于大多数现代网络开发环境中涉及大量的工具数量和快速的变化,网络开发从未像今天这样复杂或混乱。”

利用小型、独立和两个比萨原则来构建服务,以响应客户需求,是云供应商对产品开发采取的久经考验的方法。这种方法使开发者有权去选择如何组合大量的构建模块,以提供业务价值。

金融服务公司Two Sigma平台工程主管Camille Fournier在接受采访时表示:“你就像一个在云端糖果店里的孩子。当你成大并试图把‘糖果’融合在一起,复杂性绝对会成倍增加。”

这也让许多人质疑,这种选择水平对普通软件开发者来说是否有利。或者,正如 O'Grady 在2020年的博文中总结的那样,“在某些情况下,庞大的可用服务所带来的复杂性可能不再是一种优势,而是一种负担。”