知名计算机图书出版公司 O"Reilly 近日根据其在线学习平台生成的数据发布了一份技术行业发展趋势的分析报告。
报告指出,Python 已经成为了最受欢迎的语言,而 JavaScript 的使用量只有 Python 的 20%。低代码和无代码编程将不可避免的改变编程语言的性质。
另一方面,人工智能领域和 Web 开发的增长仍在继续。有关云的使用和安全隐私也都是重点发展的趋势。
调查背景
O’Reilly 对技术行业的趋势分析是基于其平台生成的数据。O’Reilly 在线学习的使用量一直在稳步增长,考虑到 COVID-19 的爆发对技术行业带来的变化,这样的增长趋势并不令人意外。
对技术行业发展趋势的分析并不是从哪一技术领域在短期内迅速受到关注和流行来看的,而是通过长期的表现得到的观察。“趋势”和“潮流”不同,潮流通常是一闪而过的,但趋势是在更长的时间范围内展现出来的,在这个过程中甚至可能会有倒退的表现,但趋势的发展是不会停止的,表象的背后有更多参考因素。
从编程语言的使用情况来看,Python 的使用量是最高的,与去年相比还上升了 27%。排在第二位的是 Java,比去年下降了 3%,第三是 C++,比去年上升了 10%。第四和第五分别是 C 和 JavaScript,使用量分别上升了 12% 和 40%。
令人惊讶的一点是,JavaScript 虽然排名前五,但使用量却远远落后于 Python 和 Java,只能达到 Python 的 20% 和 Java 的 33%。在后面的排名中,Rust 的增长非常明显,达到了 94%。不过,从一个较小基数开始的 Rust,增长 94% 并不是很难。
从统计数据可以看出,反而是 增长 16% 的 Go 语言已经清楚地确立了自己的地位。作为一种用于并发编程的语言,Rust很可能建立自己的“系统编程”地位:为云操作构建新的操作系统和工具。作为一种为数学计算而设计的语言 Julia 是一个有趣的未知因素。虽然在过去的一年里,它略有下降,但是我们对它的长期机会持乐观态度。
我们不应该将专门用于学习编程语言的标题与应用该语言或使用基于该语言的框架的标题分开使用。毕竟,许多 Java 开发人员使用 Spring,搜索“ Java”会遗漏内容,而标题中只有“ Spring”这个词。对于 JavaScript 也是如此,它包括 React、 Angular 和 Node.js 框架。在 Python 中,使用最多的库是 PyTorch 和 scikit-learn。下图显示了将 Python、 Java 和 JavaScript 的内容添加到这些语言最重要的框架中时所发生的情况。
结果相似是不足为奇的,但是有一些关键的区别。为 Spring 添加使用和搜索查询数据(增长7%)扭转了 Java 的明显衰退(净增长为零)。进一步来看 JavaScript,如果把最流行的框架 React、 Angular 和 Node.js 的使用加进去,那么 JavaScript 使用率就上升到了 Python 的 50% ,只比 Java 及其框架略低一点。然而,当 Python 被添加到大量使用的框架 PyTorch 和 scikit-learn 中时,它仍然是明显的领先者。
我们正在尝试建立一个更全面的语言使用图景,其中包括各种框架的使用。我们并不是假装这些框架本身具有可比性。Spring 主要用于后端和中间件开发(尽管它包括一个 web 框架); React 和 Angular 用于前端开发; scikit-learn 和 PyTorch 是机器学习库。尽管它被广泛使用,但我们并没有将 TensorFlow 分配给任何语言; 它有 Python、 Java、 c + + 和 JavaScript 的绑定,并且不清楚哪种语言占主导地位。此外,我们还忽略了所有这些语言的成千上万的小型平台、框架和库。一旦它们超过了前几名,就陷入了混乱。
我们不提倡使用 Python、 Java 或任何其他语言。尽管随着软件行业的发展,它们的使用量会有不同程度的上升和下降,但这些顶级语言没有一种会消失。但是,在进行比较时,我们需要注意到更多因素。
如果竞争并不重要,那么编程语言的重要趋势又是什么呢?我们发现有几个因素在显著地改变着编程:
- 多范式语言
自去年以来,O’Reilly 在线学习的函数式编程内容使用量增加了 14% 。然而,Haskell 和 Erlang 这两种经典的函数式语言并没有得到应有的重视,它们都没有大量的使用,并且都呈下降趋势(与去年同期相比下降了大约20%)。面向对象编程比函数式编程的发展更快: 自去年以来增长了 29% 。这表明,实际情况是将函数特性集成到过程语言和面向对象语言中。从 2008 年的 Python 3.0 开始,到 2014 年的 Java 8,编程语言增加了高阶函数(lambdas)和其他“函数式”特性。一些流行的语言,包括 JavaScript 和 Go,从一开始就具有函数特性。这种趋势开始于20年前,(与 C++ 标准模板库一起),我们希望这种趋势继续下去。
- 并发编程
用于并发性的平台数据显示,其年增长率为 8% 。这不是一个很大的数字,但是不要因此错过这个趋势。Java 是第一个被广泛使用的支持并发的语言。在 90 年代中期,线程支持是一种奢望,摩尔定律有很大的发展空间。现在情况不同了,对并发性的支持,就像对函数式编程的支持一样。Go、 Rust 和大多数其他现代语言都内置了对并发性的支持。不过,并发性一直是 Python 的弱点之一。
- 动态类型与静态类型
动态类型语言(如 Ruby 和 JavaScript)和静态类型语言(如 Java 和 Go)之间的区别可以说比函数式语言和面向对象语言之间的区别更为重要。不久前,在动态语言中添加静态类型的想法引发了一场争论。不过,现在已经没有这种争论了。将各种范式结合起来形成一个混合体也在这里占据了主导地位。Python 3.5 增加了类型提示,最近的版本增加了额外的静态类型特性。将静态类型添加到 JavaScript 中的 TypeScript 也实现了增长,年增长12%。
- 低代码和无代码计算
对于一个学习平台来说,很难收集关于一种趋势的数据,这种趋势最大限度地减少了学习的需要,但是低代码是真实存在的,而且势必会产生作用。电子表格是低代码计算的先驱。当 VisiCalc 在 1979 年首次发布时,它使数百万人无需学习编程语言就可以进行重要的计算。全民化是许多技术领域的一个重要趋势,编程自然也是如此。
重要的不是不同语言之间的竞争,而是语言所要获得的功能,以及为什么具有这种特性。鉴于我们似乎已经走到了摩尔定律的尽头,并发性将成为未来编程的核心。我们不能只是得到更快的处理器。我们将在很长一段时间内在云中使用微服务和无服务器/功能即服务——这些都是固有的并发系统。函数式编程并不能解决并发性的问题,但是不变性的原则肯定有助于避免陷阱。随着软件项目不可避免地变得更大和更复杂,语言通过混合函数特性来扩展自身是非常有意义的。我们需要正在考虑如何一起使用功能和面向对象功能的程序员。在构建企业级并发软件时,哪些实践和模式有意义?
低代码和无代码编程将不可避免地改变编程和编程语言的性质:
- 将会有新的语言、新的库和新的工具来支持无代码或低代码的程序员。无论它们采取什么形式,都需要程序员来构建和维护。
- 复杂的计算机辅助编码可以帮助经验丰富的程序员。这是否意味着“与机器结对编程”,或者可以自己编写简单程序的算法,还有待观察。这些工具不会淘汰程序员,它们会使程序员更加高效。
- 可以预见,会有一部分反对的声音,请忽略这些,因为低代码可以将计算的能力交到更多人的手中。程序员不会被淘汰,而是变得更有效率,并且写出别人会用到的工具。
对于让伟大的下层人士进入程序员的领域,可以预见到会有强烈的反对声音。忽略它。低代码是民主化运动的一部分,将计算的能力交到更多人的手中,这几乎总是一件好事。意识到这种变化意味着什么的程序员不会被非程序员赶出工作岗位。他们会变得更有效率,并且写出别人会用到的工具。
无论你是一个技术领导者还是一个新的程序员,请注意这些缓慢的长期趋势。他们将改变整个行业的面貌。
DevOps vs SRE
在过去的十年中,IT 发生了根本性的变化。关于运营文化(通常称为 DevOps)、持续集成和部署(CI/CD)以及站点可靠度(SRE)),已经有了很多讨论。云计算已经取代了数据中心、托管设施和内部机房。容器允许开发人员和运营部门之间进行更紧密的集成,并且在标准化部署方面做了很多工作。
没有 NoOps 这种东西,像功能即服务这样的技术(又名 FaaS,又名 serverless,又名 AWS Lambda)只是改变了它的本质。管理一个给定规模的基础架构所需的人数已经减少,但是我们正在建设的基础架构已经扩大,聚集数以万计的节点来训练或部署复杂的 AI 应用程序很容易。即使这些机器都在亚马逊巨大的数据中心,并且使用高度自动化的工具进行批量管理,运营人员仍然需要保持系统平稳运行,监控,故障排除,并确保不会为不需要的资源付费。无服务器和其他云技术允许同一个操作团队管理更大的基础架构,它们不会使运营消失。
过去一年中,以 DevOps 为标题的内容的使用量下降了 17%,而 SRE(包括“网站可靠度”)上升了 37% ,“operations”一词上升了 25% 。虽然 SRE 和 DevOps 是截然不同的概念,但对于许多客户来说,SRE 是谷歌规模的 DevOps ——谁不想要这样的增长呢?SRE 和 DevOps 都强调相似的实践: 版本控制(GitHub 增长了 62% ,Git 增长了 48%)、测试(使用率很高,但没有逐年增长)、持续部署(减少了 20%)、监视(增加了 9%)和可观察性(增加了 128%)。Terraform 是 HashiCorp 用于自动化云基础设施配置的开源工具,也显示出强劲的增长(53%)。
有趣的是,从数据来看,Docker 几乎没有变化(每年下降5%) ,但是关于容器的内容使用率却飙升了 99% 。所以,容器化显然是一件大事。Docker 本身可能已经停滞不前了,但是 Kubernetes 作为容器编排工具的主导地位使容器处于中心地位。Docker 是使能技术,但是 Kubernetes 使得大规模部署集装箱成为可能。
Kubernetes 本身就是另一个超级明星,一年增长了 47% ,同时也是这个群体中使用率最高的(也是最多的搜索查询)。Kubernetes 不仅仅是一个编排工具,它还是云的操作系统(或者,正如 Kelsey Hightower 所说,“ Kubernetes 将是分布式系统中的 Linux”)。但是数据并没有显示我们与认为 Kubernetes 太“复杂”的人们的对话次数。我们看到三种可能的解决方案:
1.一个“简化”版本的 Kubernetes 虽然不那么灵活,但是却在很多复杂性之间进行权衡。K3s 是朝这个方向迈出的一个可能的步骤。问题是,这样做的代价是什么?这是我对 Pareto principle 的看法,也被称为 80/20 法则。给定任何系统(比如 Kubernetes),通常可以通过保留最广泛使用的 80% 的功能并削减其他 20% 的功能来构建更简单的东西。并且某些应用程序将适合保留的80%的功能。但是大多数应用程序将至少需要牺牲一些功能以简化系统。
2.一种全新的方法,尚未出现的某些工具,目前我们还不知道该工具是什么。
3.来自云供应商的集成解决方案(例如,微软的开源 Dapr 分布式运行时)。不是那些提供 Kubernetes 服务的云供应商。如果云供应商将 Kubernetes 的功能集成到他们的堆栈中,使得这些功能消失在某种管理控制台中会怎么样?然后问题就变成了,你失去了哪些功能,是否需要它们?围绕着 Kubernetes (Istio、 Helm 和其他)的丰富的工具生态系统显示了它的价值。但是我们接下来该怎么办呢?即使 Kubernetes 是管理运行在云中的现代应用程序的复杂性的正确工具,对更简单解决方案的追求最终将导致更复杂的需求,它们足够吗?
可观察性在过去一年中增长最快,达到了 128%,而监测只增长了9% 。虽然可观察性比监测能力更丰富、更强大。但这种转变在很大程度上只是表面上的。“可观察性”有可能成为监测的新名称。如果你认为可观察性仅仅是一个更流行的监测术语,那就失去了它的价值。运行在云中的复杂系统需要真正的可观察性才能管理。
基础设施就是代码,我们已经看到了很多自动化配置的工具。但是 Chef 和 Puppet,均大幅下降(分别为 49% 和40% ),Salt 也是如此。Ansible 是这其中唯一上升的工具,上升了 34%。有两种趋势造成了这种情况,Ansible 似乎取代了 Chef 和 Puppet,这可能是因为 Ansible 是多语言的,而 Chef 和 Puppet 与 Ruby 有关。第二,Docker 和 Kubernetes 改变了配置。数据显示,Chef and Puppet 在 2017 年达到顶峰,当时 Kubernetes 开始了几乎一个指数增长的爆发。容器化部署似乎可以最大程度地减少可重复配置的问题,因为容器是一个完整的软件包。假如有一个容器,你可以多次部署它,每次得到相同的结果。实际上,它从来没有那么简单,只是这种表面上的简单性减少了对 Chef 和 Puppet 等工具的需求。
未来,运营团队面临的最大挑战以及数据工程师面临的最大挑战将是学习如何有效部署 AI 系统。在过去的十年里,DevOps 运动产生了很多想法和技术,源代码库快速的自动化部署,不断的测试等等。它们非常有效,但是人工智能打破了它们背后的假设,而且部署经常是人工智能成功的最大障碍。
人工智能打破了这些假设,因为数据比代码更重要。我们还没有足够的工具来对数据进行版本控制(尽管 DVC 是一个开始)。模型既不是代码也不是数据,而且我们也没有足够的工具用于版本控制模型。频繁部署假定软件可以相对快速地构建,但是训练一个模型可能需要几天时间。有人建议模型训练不需要成为构建过程的一部分,但这确实是应用程序中最重要的部分。测试对于连续部署是至关重要的,但是人工智能系统的行为是概率性的,而不是确定性的,所以很难说这个测试或那个测试失败了。如果测试包括公平性和偏见这样的问题,那么测试就特别困难。
虽然有一个新生的 MLOps,我们的数据并没有显示人们正在使用(或搜索)这些领域的大量内容。在许多领域中,内容还不存在。但是无论内容是否存在,用户都会搜索内容,因此少量的搜索表明我们大多数用户尚未意识到问题所在。运营人员过于频繁地认为人工智能系统只是另一个应用程序,但他们错了。人工智能开发人员认为,一个运营团队将能够部署他们的软件,并且能够继续进行下一个项目,但是他们也错了。随着新一代工具的出现,这些问题最终将得到解决。事实上,这些工具已经在开发之中,但我们还没有做到这一点。
人工智能、机器学习和数据
人工智能的健康发展仍在继续: 机器学习上升了 14% ,人工智能上升了 64% ; 数据科学上升了 16% ,统计学上升了 47% 。虽然人工智能和机器学习是两个截然不同的概念,但是它们的定义却经常被混淆使用。我们非正式地将机器学习定义为“人工智能中工作的部分”,人工智能本身更多的是面向研究的和有抱负的。如果你接受这个定义,那么关于机器学习的内容被广泛使用也就不足为奇了: 它是关于将研究带出实验室并付诸实践。我们看到人工智能的稳步发展也不足为奇,因为这正是前沿工程师们寻找新思路,将其转化为机器学习的地方。
确实有一些指标可以说人工智能已经停滞不前了,许多项目从未投入生产。虽然去年在自然语言处理方面取得了惊人的进步,上升了 21% ,比如 OpenAI 的 GPT-3,但像赢得 Go 游戏这样的惊人结果却越来越少。人工智能(以及机器学习、数据、大数据和他们所有的同伴)可能正在进入低谷。但我们认为,要把当前的研究成果应用到商业产品中,还需要多年的努力。
人工智能的未来与其说是惊人的突破和令人毛骨悚然的面部或语音识别,不如说是小巧平凡的应用。人工智能在 COVID 疫苗的开发中发挥了巨大的作用。人工智能正在扮演一个重要的支持角色。它使研究人员能够浏览数以万计的研究论文和报告,设计可能有效的药物和基因,并分析数以百万计的健康记录。如果不能使这些任务自动化,那么很难组织疫情的扩散。
因此,我们看到了人工智能和机器学习的未来:
- 自然语言一直是(并将继续是)一个大问题。GPT-3 改变了世界,我们将发现人工智能为我们提供了最好的工具来检测什么是假的,什么不是。
- 许多公司在使用人工智能来自动化服务客户,我们在合成语音、生成现实的答案和寻找解决方案的能力上取得了巨大的进步。
- 我们将看到许多微小的嵌入式人工智能系统应用于从医疗传感器到电器到工厂车间的各个领域。任何对技术未来感兴趣的人都应该非常仔细地观察 Pete Warden 在 TinyML 上的工作。
我们仍然没有正视人类和人工智能协作的用户界面问题。我们不止希望人工智能代替人类做某些工作,而是希望人工智能能够与人协作,产生比人类或机器单独所能产生的更好的结果。
TensorFlow 是机器学习平台中的领导者,搜索次数最多,使用率稳定在 6% 。Python 的机器学习库 scikit-learn 的内容几乎同样被大量使用,年增长率为 11% 。PyTorch 位列第三,但是 PyTorch 内容的使用量同比增长了 159% 。毫无疑问,这种增长是受到 Jeremy Howard 的《面向程序员的实用深度学习》课程和基于 PyTorch的fastai 库的普及的影响。看起来 PyTorch 在研究人员中更受欢迎,而 TensorFlow 在生产中仍占主导地位。但是随着 Jeremy 的学生进入工业领域,随着研究人员转向生产岗位,我们希望看到 PyTorch 和 TensorFlow 之间的平衡发生转变。
Kafka 是构建数据管道的一个重要工具,它很稳定,增长率和使用率与 Spark 相似,为6%。Kafka 的“下一代”竞争对手 Pulsar 还没有出现在排名中。
在过去的一年中,用于自动化AI和机器学习开发的工具(IBM 的 AutoAI、谷歌的 Cloud AutoML、微软的 AutoML 和亚马逊的 SageMaker)受到了广泛关注。但是我们没有看到任何迹象表明他们正在市场上取得重大进展。可能是 AutoAI 相对较新,或者用户认为他们不需要搜索补充训练材料。
那么数据科学呢?这份报告《什么是数据科学》已经出版了10年。但令人惊讶的是,对于一篇 10 年前的论文来说,该报告的浏览量比 2019 年增长了 142% 。但是工具已经发生了变化,十年前,Hadoop 是数据科学世界的中心,现在它仍然存在,但是只是一个遗留系统,自 2019 年以来下降了23% 。Spark 现在是占主导地位的数据平台,而且它肯定是工具工程师们想要了解的。Spark 内容的使用大约是 Hadoop 的三倍。但即使是 Spark,自去年以来也下跌了 11% 。Ray 是新出现的,有望让构建分布式应用程序变得更加容易,但是还没有显示与 Spark(甚至 Hadoop)匹配的使用情况,但是它显示了 189% 的增长。还有一些其他的工具即将出现,比如,Dask 比 Ray 更新,并且增长了近400% 。
另外,诸如道德、公平、透明度和可解释性等主题并不会对我们的数据造成影响。可能是因为很少出版这些方面的书籍,也没有提供培训课程,但这本身就是一个问题。
Web 开发
自从 2 0世纪 90 年代初发明了 HTML,第一个 Web 服务器和第一个浏览器出现,Web 已经成为了各种平台。这些平台使得网络开发变得更加灵活,它们使得支持大量的设备和屏幕尺寸成为可能。它们使构建在浏览器中运行的复杂应用程序成为可能。
那么 Web 框架的世界是什么样的呢?React在内容使用方面处于领先地位,并且也显示出显着增长(同比增长34%)。尽管有传言说 Angular 正在衰落,但它是排名第二的平台,增长了10% 。而服务器端平台 Node.js 的内容使用率仅次于 Angular,增长了15% 。
更令人惊讶的是,Ruby on Rails 在经历了几年稳定的性能之后,显示出了非常强劲的增长(年增长率为77%)。同样,Django(与 Rails 出现的时间大致相同)显示了大量的使用和 63% 的增长。但这种增长并不适用于所有较老的平台。尽管近 80% 的网站仍在使用 PHP 的内容,但 PHP 的使用率相对较低,而且还在下降(下降了 8%)。虽然 jQuery 显示了18% 的健康增长,但是 jQuery 内容的使用率比我们看到的任何其他平台都要低。
令人惊讶的是,Vue 和 Flask 表现得很弱,对于这两个平台,内容使