贝壳的复兴?

2020-08-25 18:08:59

这是这本书每一节结束的“插曲”中的第一个。它们并没有教授任何具体的技能,而是提供了一些关于shell、Linux和现代计算世界的背景和趣味。

在第一个插曲中,我们将看看为什么外壳在现代IT时代正在经历某种复兴。

老实说,很难知道shell和命令行工具的使用是否普遍增加。有数据来源表明在技术社区中有更广泛的使用-Stack Overflow标签流行就是其中之一。另一个例子是LinkedIn上关于所需技能集的数据。然而,分离出对多样化技术技能的需求是否普遍增加,以及键盘和脚本操作系统的受欢迎程度是否具体增加,这是一个挑战。

出于本章的目的,我们将研究过去几十年来技术领域的变化,并考虑这些变化对shell、命令行和类似工具可能意味着什么。

这些发展中的每一个都对我们如何使用计算机产生了潜在的深远影响,并可能暗示着对外壳技能的长期需求。

因此,让我们来看看近年来技术版图中的一些关键变化,并考虑它们可能会如何影响shell的受欢迎程度和重要性。

多年来,已经出现了许多编程语言和平台。但近年来,物种多样性的增长速度可能比以往任何时候都要快。

随着互联网的出现和在线技术社区规模的扩大,编程在某种意义上已经变得更加民主化(这一点我们将在“公民编程”部分进行更多的讨论)。在过去,学习编程语言需要找到纸质书或教师和导师,现在学生可以在网上找到丰富的资源。

也许正是这种民主化导致了编程语言的惊人多样化。多年来,“通用”语言数量很少,而高度专业化的语言(以及相关平台)数量较多。

“C”和后来的“C++”是系统编程的首选语言(有时由汇编语言支持)。这是内核和编译器编写时使用的语言。

“Java”成为必须在许多系统上运行的应用程序的“通用”语言选择。“Basic”和后来的“C#”是Windows平台开发的标准。PHP是Web开发的主要工具。

与这些巨人并驾齐驱的是特定用例的主力。Erlang曾经是(现在也是)一种在电信行业非常流行的语言,在电信行业,高可用性和可靠性是最重要的。COBOL是金融行业的语言,任务关键型系统在大型机上运行(许多系统至今仍在运行)。

当然,还有许多其他语言,但这些其他语言中的许多都是高度特定的,在某种意义上,C、Java、PHP和后来的C#占据了主导地位。

过渡到写作的时候。在Stack Overflow 2020技术调查[^1]中,雇主最想要的十种语言是:

我们的一些老朋友在那里,但也有许多新的语言,正在迅速演变的语言。在后面的列表中,我们将看到Swift、Dart、Ruby、Haskell、Scala。现在有很多非常流行的编程语言。

为什么这对壳牌很重要?答案是,对于许多新的语言,开发人员工具并不像“主力”语言那样成熟(有些人可能会说是臃肿的)。Java开发人员可能非常熟悉Eclipse IDE,微软商店可能也非常熟悉Visual Studio。这些产品已经发展了数年(或数十年),以支持具有丰富集成开发环境的开发人员。

对于服务器端JavaScript、Golang、Rust、Python等语言来说,开发环境实际上就是shell。现代编辑器(如Visual Studio Code、Atom等)提供了大量支持和工具,如果用户需要,还可以包含功能齐全的IDE的功能。但是对于现代编程语言,用户常常不得不依赖shell来编译、传输、管理包、捆绑等等。今天的普通开发人员可能更有可能不得不使用shell-一天管理Python虚拟环境,另一天运行Node.js,另一天为Golang安装包。

随着时间的推移,工具很可能会迎头赶上,并在这些操作之上提供一个“友好”的界面,但许多工程师已经意识到(或一直都知道),直接访问简单的命令行工具在工作时会非常高效,而功能过多的IDE可能会妨碍工作并隐藏复杂性。

现代编程通常是多语种的-至少必须熟悉多种语言。对于开发环境和运行时环境,shell提供了一个通用的工具环境和接口,所有人都可以访问,而无需安装许多复杂的组件。

虽然编程语言和开发工具的多样性可能有所增加,但在许多方面,工程师使用的操作平台已经变得更加同质化。

在计算的早期,每个操作环境都是高度多样化的。有许多用于生产的系统,其中许多是高度专有的。即使是流行的应用程序服务器通常也是封闭源代码和高度专业化的。

但是,现代执行环境通常是相当统一的。一个类似Linux的系统,几乎没有定制,开发人员或操作员可以根据自己的需要进行调整。

越来越多的企业用户已经从专有的Unix平台转向Linux平台(无论是商业性的还是非商业性的)。最早的云环境使用开源Linux发行版作为可用的操作系统。

甚至Windows也以Linux的Windows子系统的形式增加了对类似Linux的操作的支持。

也许这一领域最伟大的运动是迅速采用Docker作为一种通用的容器技术。容器,或类似容器的系统已经存在很长时间了,但Docker将容器带给了大众。有了Docker,工程师们希望操作环境更统一,更像Linux。

这使得对贝壳的了解变得非常有价值。对于任何集装箱化的工作负载,Linux和shell技能都是至关重要的。Kubernetes(作为执行环境)更加标准化了。

虽然仍有许多工作负载在专有系统上运行,但现代解决方案通常构建为在Linux的容器中运行。从历史上看,shell一直是管理Linux系统的最常见方式,围绕Linux或类似Linux系统的操作环境的标准化使得shell技能变得更加关键。

爱也好,恨也好,DevOps已经大受欢迎。DevOps工程师、现场可靠性工程师,这类角色在不久前在公司中可能是闻所未闻的,现在正变得无处不在。

从本质上讲,DevOps代表了一种组织和文化变革,一种试图统一软件开发和运营目标的变革。不是让一个团队专注于功能开发,让另一个团队专注于可靠的软件操作,而是由一个团队同时负责这两个方面。理论上,这会鼓励软件工程师也考虑安全性、可靠性、可维护性等,而操作员也会考虑交付速度。

在实践中,无论团队是否真正合并,或者是否添加了专门的角色,或者即使团队仍然是分开的,开发和运营之间的界限都有点模糊。软件开发人员应该利用执行环境的知识来构建和规划,操作员应该与开发人员合作来构建支持可靠性的功能。

这两个角色的交集通常在自动化领域。测试后的自动部署、出错时的自动故障转移、发现潜在问题时的自动警报、环境的自动调配、负载增加时系统的自动扩展。

自动化的世界与shell的世界紧密相连,尤其是shell脚本。使用shell脚本可以轻松完成许多需要自动化的任务。现代环境(如云环境)的许多方面都支持通过脚本提供和管理服务。事实上,不能通过shell脚本或简单接口管理的服务正变得越来越过时。如果不能编写脚本,就不能实现自动化,我们构建的日益复杂的系统需要自动化。

在实践中,这意味着软件工程师更有可能不得不构建shell脚本(或者至少了解如何通过shell与系统交互)。同样,操作员更有可能不得不编写自动化例程来管理高可用性等。同样,shell和shell脚本是管理这一点的常用方式(即使它们只是更复杂系统的入口点,比如执行程序的脚本)。

这种增长鼓励软件工程师也要考虑安全性、可靠性、可维护性等,操作员也要考虑交付速度。

在实践中,无论团队是否真正合并,或者是否添加了专门的角色,或者即使团队仍然是分开的,开发和运营之间的界限都有点模糊。软件开发人员应该利用执行环境的知识来构建和规划,操作员应该与开发人员合作来构建支持可靠性的功能。

这两个角色的交集通常在自动化领域。测试后的自动部署、出错时的自动故障转移、发现潜在问题时的自动警报、环境的自动调配、负载增加时系统的自动扩展。

自动化的世界与shell的世界紧密相连,尤其是shell脚本。使用shell脚本可以轻松完成许多需要自动化的任务。现代环境(如云环境)的许多方面都支持通过脚本提供和管理服务。事实上,不能通过shell脚本或简单接口管理的服务正变得越来越过时。如果不能编写脚本,就不能实现自动化,我们构建的日益复杂的系统需要自动化。

在实践中,这意味着软件工程师更有可能不得不构建shell脚本(或者至少了解如何通过shell与系统交互)。同样,操作员更有可能不得不编写自动化例程来管理高可用性等。同样,shell和shell脚本是管理这一点的常用方式(即使它们只是更复杂系统的入口点,比如执行程序的脚本)。

DevOps作为一套实践和信念越来越受欢迎,这可能使shell比软件工程中的任何其他最新发展都更受欢迎,也更重要。

由于这些和更多的原因,学习如何有效地使用外壳从未像现在这样相关或实用。