What Happened To Programming In The 2010s?

Matthias Endler

2010年代,编程发生了什么?

原文由 Matthias Endler 发布,订阅该博客

前段时间,我读到了 Fred Wilson 的一篇文章,标题为“What Happened In The 2010s”。这篇文章梳理了过去十年技术与商业领域的关键变化。这让我想到一个更聚焦的话题:2010年代,编程发生了什么?

🚓 我大概已经忘了实际发生的 90% 的事情。求别告我。我的目的是回顾过去,以便你能更好地预测未来

从何说起?

从宏观角度看,编程和十年前并无二致:

  1. 把程序敲进编辑器
  2. 丢给编译器(或解释器)
  3. 哔哔啵啵 🤖
  4. 得到输出

但如果仔细观察,我们周围已经发生了翻天覆地的变化。许多如今被视为理所当然的事物,十年前还根本不存在。

此前是什么样子?

回想 2009 年,我们还在编写jQuery 插件,把网站跑在共享主机上,通过FTP 上传内容。有时代码是从来路不明的论坛、博客教程里复制粘贴来的,甚至是从书上手抄下来的。Stack Overflow(于 2008年9月15上线)当时还处于起步阶段。版本控制用的是CVSSVN——甚至根本不用。我于 2010年1月3注册了 Github。当时还没人听说过Raspberry Pi(它要到 2012 年才发布)。

<a href='https://xkcd.com/2324/'>xkcd #2324</a>
来源:xkcd #2324

新编程语言大爆发

过去十年诞生了大量令人兴奋的新编程语言。

CrystalDartElixirElmGoJuliaKotlinNimRustSwiftTypeScript 都发布了首个稳定版本!

更令人振奋的是:所有这些语言如今都是开放开发的,源代码都托管在 Github 上。这意味着任何人都可以参与贡献——这是开源精神的有力证明。

这些语言每一门都带来了此前并不普及的新理念:

  • 更强的类型系统:Kotlin 和 Swift 让可空类型成为主流,TypeScript 为 JavaScript 带来了类型,代数数据类型在 Kotlin、Swift、TypeScript 和 Rust 中已十分常见。
  • 互操作性:Dart 可编译为 JavaScript,Elixir 可与 Erlang 互操作,Kotlin 可与 Java 互操作,Swift 可与 Objective-C 互操作。
  • 更好的性能:Go 通过 Goroutine 和 channel 让并发更简单,并以亚毫秒级垃圾回收器令人印象深刻,而 Rust 则通过所有权与借用机制彻底避免了垃圾回收的开销。

这只是一份简短的清单,但编程语言领域的创新已大大加速。

老牌语言的更多创新

老牌语言也没有原地踏步。举几个例子:

C++ 从漫长的冬眠中苏醒,在上一次重大版本发布于 1998 年之后推出了 C++11,为语言引入了 Lambda、auto 指针、基于范围的循环等众多新特性。

上一个十年初,最新的 PHP 版本还是 5.3,如今已经到了 7.4。(我们跳过了 6.0,但我现在还不想谈这个。)期间,它的性能提升了一倍多。如今的 PHP 已经是一门真正的现代编程语言,拥有蓬勃发展的生态。

就连 Visual Basic 现在都有元组了。(抱歉,没忍住。)

更快的发布周期

大多数语言都采用了更快的发布节奏。以下是一些主流语言目前的发布周期:

语言当前发布周期
C不定期
C#约 12 个月
C++约 3 年
Go6 个月
Java6 个月
JavaScript (ECMAScript)12 个月
PHP12 个月
Python12 个月
Ruby12 个月
Rust6 周(!)
Swift6 个月
Visual Basic .NET约 24 个月

空值的缓慢消亡

在上一个十年接近尾声时,Tony Hoare 在 2009年8月25的一次演讲中,将 null 指针称为他的十亿美元错误

Chromium 项目的一项研究发现,其 70% 的严重安全漏洞都属于内存安全问题微软的情况也一样)。好在内存安全问题并非因为程序员水平差这一观点终于得到了重视。
许多主流语言开始采用更安全的 null 替代方案:可空类型、OptionResult 类型。像 Haskell 这样的语言早已具备这些特性,但它们直到 2010 年代才真正流行起来。

类型系统的复仇

与此密切相关的是关于类型系统的争论。过去十年,类型系统强势回归;TypeScript、Python 和 PHP(仅举几例)都开始拥抱类型系统。

趋势正朝着类型推断发展:为了让意图对他人更清晰,或是在存在歧义时加上类型——否则就省略。Java、C++、Go、Kotlin、Swift 和 Rust 都是支持类型推断的热门例子。就我个人而言,我觉得过去几年写 Java 变得顺手多了。

库与框架的指数级增长

截至目前,npm 上托管着1,330,634 个包。这意味着有一百多万个由他人维护的包可供你使用。再加上160,488 个 Ruby gem243,984 个 Python 项目,以及42,547 个 Rust crate

热门编程语言的包数量。<br />别问我 2019 年 npm 发生了什么。
热门编程语言的包数量。
别问我 2019 年 npm 发生了什么。
来源:Module Counts

当然,偶尔也会出现leftpad 这样的闹剧,但这也意味着我们需要自己编写的库代码更少,可以更专注于业务价值。另一方面,这也带来了更多潜在的故障点,审计也变得更加困难。还有大量过时的包。想深入了解,推荐阅读Linux 基金会与哈佛大学发布的 Census II 报告 [PDF]。

我们在前端框架上也有点疯狂:

  • Angular 发布于 2010 年
  • React 发布于 2013 年
  • Vue 发布于 2014 年
  • Svelte 发布于 2016 年
  • ……接下来是 Yew

没有免费的午餐

这样的回顾如果不看一看摩尔定律就不算完整。它在过去十年中依然表现得惊人地坚挺:

<a href='https://en.wikipedia.org/wiki/Moore%27s_law'>Wikipedia</a>
来源:Wikipedia

不过,这里有个陷阱。如果只看单核性能,曲线正在趋于平缓:

<a href='https://www.youtube.com/watch?v=Azt8Nc-mtKM&'>Standford University: The Future of Computing (video)</a>
来源:Standford University: The Future of Computing (video)

摩尔所预言的新增晶体管不再让 CPU 变得更快,而是带来了其他类型的处理能力,比如更强的并行性或硬件加密。已经没有免费的午餐了。工程师必须寻找让应用更快的新方法,例如拥抱并发执行

回调、协程,乃至最终的 async/await,正逐渐成为行业标准。

GPU(图形处理器)变得极其强大,使得大规模并行计算成为可能,这也让机器学习在实际应用中迎来了复兴:

深度学习变得可行,进而使机器学习成为许多被广泛使用的软件服务和应用的核心组成部分。——维基百科《机器学习时间线》

算力无处不在,因此在大多数情况下,能效比单纯的性能更为重要(至少对消费级设备而言)。

意料之外的命运转折

启示

如果你现在在想:Matthias,你完全漏掉了 X,那我就达到目的了。这甚至远未涵盖所发生的一切。想把所有事情都讲完,大概需要花上十年。

就我个人而言,我对下一个十年充满期待。软件正在吞噬世界——而且速度越来越快。

本文章由 muse-spark-1.2-contributor 进行翻译

评论