2010年代,编程发生了什么?
前段时间,我读到 Fred Wilson(弗雷德·威尔逊)写的一篇题为《2010年代发生了什么》的文章。文章重点介绍了过去十年间技术和商业领域的重大变化。这启发我去思考一个窄得多的话题:2010年代,编程发生了什么?
🚓 我可能漏掉了实际发生的事情中的九成左右。请别起诉我。我希望通过回顾过去,帮助你更好地预测未来。
从哪里开始?
从极高层次来看,编程和十年前仍然一样:
- 把程序敲进编辑器
- 交给编译器(或解释器)
- 哔哔啵啵 🤖
- 获得输出
但如果仔细观察,就会发现我们周围发生了很多变化。如今我们习以为常的许多事物,在十年前还不存在。
之前发生了什么?
回到2009年,我们编写jQuery插件,把网站部署在共享主机服务上,并通过FTP上传内容。有时,代码来自可疑的论坛、博客上的教程,甚至是从书上手抄下来的。Stack Overflow(于2008年9月15日上线)当时还处于起步阶段。版本控制使用CVS或SVN——或者根本不用。我于2010年1月3日注册了 Github。那时甚至没人听说过Raspberry Pi(它直到2012年才发布)。

新编程语言大爆发
过去十年里,大量全新而令人兴奋的编程语言诞生了。
Crystal、Dart、Elixir、Elm、Go、Julia、Kotlin、Nim、Rust、Swift、TypeScript都发布了第一个稳定版本!
更令人兴奋的是:上面所有语言如今都以开放方式开发,源代码也可以在 Github 上自由获取。这意味着每个人都可以为它们的开发做贡献——这是对开源的一大证明。
这些语言中的每一种都引入了此前尚未广泛普及的新理念:
- Strong Type Systems(强类型系统):Kotlin 和 Swift 让可空类型成为主流,TypeScript 为 JavaScript 带来了类型,代数数据类型在 Kotlin、Swift、TypeScript 和 Rust 中都很常见。
- Interoperability(互操作性):Dart 可编译为 JavaScript,Elixir 可与 Erlang 对接,Kotlin 可与 Java 对接,Swift 可与 Objective-C 对接。
- 更好的性能:Go 推广了 Goroutine 和 channel,让并发更容易实现;它还凭借亚毫秒级的 Garbage Collector(垃圾回收器)给人留下深刻印象,而 Rust 则通过所有权和借用机制完全避免了 Garbage Collector 的开销。
这只是一个简短的列表,但编程语言领域的创新已经大幅加速。
老语言中的更多创新
成熟的语言也没有停滞不前。下面是几个例子:
C++从漫长的冬眠中醒来,在上一次重大版本发布(1998年)之后推出了 C++11。它为这门语言引入了许多新特性,例如 Lambda、auto指针和基于范围的循环。
上一个十年初,最新的 PHP 版本是5.3。现在我们已经到了7.4。(我们跳过了6.0,但我还没准备好谈论它。)在此过程中,它的速度提升到了原来的两倍多。PHP 如今已经是一门真正的现代编程语言,并拥有一个蓬勃发展的生态系统。
拜托,就连 Visual Basic 现在都有元组了。(抱歉,我实在忍不住。)
更快的发布周期
大多数语言都采用了更快的发布周期。下面列出一些流行语言的情况:
| 语言 | 当前发布周期 |
|---|---|
| C | 不规律 |
| C# | 约12个月 |
| C++ | 约3年 |
| Go | 6个月 |
| Java | 6个月 |
| JavaScript (ECMAScript) | 12个月 |
| PHP | 12个月 |
| Python | 12个月 |
| Ruby | 12个月 |
| Rust | 6周(!) |
| Swift | 6个月 |
| Visual Basic .NET | 约24个月 |
Null 的缓慢消亡
在上一个十年临近结束时,Tony Hoare(托尼·霍尔)在2009年8月25日的一场演讲中,将null指针称为他的价值十亿美元的错误。
Chromium 项目的一项研究发现,其严重安全漏洞中有70%属于内存安全问题(Microsoft 也一样)。幸运的是,内存安全问题并不是因为程序员水平差这一观点终于开始得到一些认可。
许多主流语言都采用了比null更安全的替代方案:可空类型、Option类型和Result类型。Haskell 等语言早已有这些特性,但它们直到2010年代才开始流行。
类型系统的复仇
与此密切相关的是关于类型系统的争论。过去十年里,类型系统重新回到了舞台中央;TypeScript、Python 和 PHP(仅举几例)都开始拥抱类型系统。
趋势是转向类型推断:添加类型,让其他人以及程序在面对歧义时更清楚地理解你的意图——否则就省略类型。Java、C++、Go、Kotlin、Swift 和 Rust 都是支持类型推断的流行例子。我只能代表自己说,但我认为过去几年里编写 Java 已经变得容易得多、顺手得多。
库和框架的指数级增长
截至目前,npm 收录了1,330,634 个包。也就是说,有超过一百万个包正由别人替你维护。再加上160,488 个 Ruby gem、243,984 个 Python 项目,最后再添上42,547 个 Rust crate。

别问我2019年 npm 发生了什么。
来源:Module Counts
当然,偶尔也会出现leftpad这样的情况,但这也意味着我们不必再自己编写那么多库代码,可以把精力集中在业务价值上。另一方面,潜在的故障点也更多了,审计变得困难。过时的包数量也很庞大。如果想深入了解,我推荐阅读 Linux Foundation 和 Harvard 的Census II 报告[PDF]。
我们在前端框架方面也有点疯狂:
没有免费的午餐
这样的回顾如果不顺便看看摩尔定律,就不算完整。过去十年里,它的表现出人意料地好:

不过,这里面有个问题。看看单核性能,曲线正在趋于平缓:

摩尔预言的新晶体管并不会让 CPU 变得更快,而是增加其他类型的处理能力,比如更强的并行能力或硬件加密。如今已经没有免费的午餐了。工程师必须寻找让应用变快的新方法,例如采用并发执行。
回调、协程,以及最终出现的 async/await,正逐渐成为行业标准。
GPU(图形处理器)变得非常强大,可以进行大规模并行计算,这促成了 Machine Learning(机器学习)在实际应用场景中的复兴:
深度学习变得可行,从而使机器学习成为许多广泛使用的软件服务和应用的重要组成部分。——Wikipedia 上的机器学习时间线
计算资源无处不在,因此在大多数情况下,能效如今比原始性能扮演着更重要的角色(至少对消费设备来说是这样)。
命运出人意料的转折
- Microsoft 现在成了酷孩子。它收购了 Github,宣布推出Windows subsystem for Linux(其实应该叫 Linux Subsystem for Windows),将MS-DOS和.NET开源。就连Microsoft Calculator现在也开源了。
- IBM 收购了 Red Hat。
- Linus Torvalds 为自己的行为道歉,并暂时离开了一段时间。
- 开源成为软件开发的默认选择(?)。
总结
如果你现在正在想:Matthias,你完全漏掉了 X,那我就达到目的了。这甚至远远不是全部发生过的事情。大致而言,你需要用整整十年才能把它们全部讲完。
就我个人而言,我对下一个十年感到兴奋。软件正在吞噬世界——而且速度越来越快。
随机一篇博客