PHP 能创造成功:旧代码不一定是遗留代码

本文转载自公众号“读芯术”(ID:AI_Discovery)

过去的一年里,Vimeo 开发人员用多种编程语言编写了后端代码——PHP、Go、Ruby、Python、NodeJS、Java、C 语言、C++ 和 Rust。

2004 年,Vimeo 开始使用 PHP。对于像 Vimeo 这样的初创公司来说,PHP 无疑是一种理想编程语言。PHP 的解释器使企业家可以快速开发原型,它附带一个大型标准库,可以省去一些常见任务步骤,如发送电子邮件、访问数据库等。

大多数初创公司都中道崩殂,但一些基于 PHP 的创业公司在十年后依然屹立不倒,有些甚至增长飞速、跃居前列。其中有的公司 (最著名的当属 Facebook) 认为 PHP 是阻碍公司发展的瓶颈,开始从 PHP 迁移出去。这种小规模迁移的主要原因有两个:一是 PHP 的性能不佳,二是维护大型 PHP 代码库困难较大。

2014 年开始,PHP 的性能发展渐渐跟不上所需,数组内存的消耗超出必要。由于缺少可以大规模检测错误的静态分析工具,维护大型 PHP 代码库变得愈发困难。

自 2004 年以来的十年中,Vimeo 的规模已经扩大了很多倍,PHP 代码库也随之扩充,但是还没有大到妨碍自身发展的程度。但当 Facebook 公开放弃 PHP 时,一些开发人员就认为 PHP 即将成为互联网时代的 FORTRAN。新一波后端工程师计划如何将 50 万行 PHP 分解成一系列设计更好、速度更快、可测试性更高的 Go 服务。

一时间,此事似乎迫在眉睫,但实际上我们从未放弃 PHP。原因显而易见——重写整个代码库会占用大量资源并且容易出错; 但也有一个不太明显的原因,那就是 PHP 变得更好了。

在过去的六年里,PHP 执行时间减少了一半以上,社群发展迅速,现在有一种流行的驱动程序可以利用静态分析获得的见解来改进 PHP 代码库 (旧的和新的)。

PHP 的改进花了一段时间才在 Vimeo 应用。首先,我们必须弃用旧版本 PHP5.4,该版本在过期多年后仍在生产。迁移到 PHP 7 可以使后端响应速度更快,除此以外,PHP 7 改进后的语法使开发人员编写代码更简洁,并对返回和参数类型提供全面的语言级支持。

PHP 一直在创新——不久前发布的 8 版本在语言级别方面做了诸多改进,使开发人员可以更简洁地表达业务逻辑。我们期待明年年初的升级。

PHP 入门非常容易,但是“好上手”并不能保证无反噬。多年来,无数开发者尝试过速成 PHP,不小心就搬起石头砸了脚,然后就放弃了。我也偶尔被 PHP 折磨的痛不欲生,但我没有放弃,而是决定构建一个可以提高准头的工具。就这样,Psalm(PHP 的静态分析类型检查器) 诞生了。

Psalm 的核心功能与 TypeScript 检查器大致相似,借鉴了 Facebook Hack 语言 (源自 PHP 的) 的一些想法。当 PHP 代码在生产中导致类型错误以及语言逻辑不通时,PHP 会发送通知。Psalm 增加了一些额外功能,如未使用的类和方法检测,同时可以自动修复检测到的许多问题。

过去几年,我们将 Psalm 用作 CI 管道的一部分,这对我们在 Vimeo 编写 PHP 的方式产生了变革性的影响:Psalm 使我们有信心进行大规模更改,而不用担心会破坏所有内容。这些更改 (将现代 PHP 编码标准引入了我们的代码库) 有助于消除旧代码的痕迹:当可以安全地更改代码时,它就不再是真正的遗留代码了。

我创建 Psalm 是为了解决我自己的问题,但现在 Psalm 已经开源,它也帮助解决了许多其他人的问题。Psalm 最近还帮助我们识别了代码库中大量的安全漏洞,以免被恶意利用。

顺便说一下,如果你害怕对一个大型遗留 PHP 项目进行较大更改,那么我强烈建议使用静态分析类型检查工具。Psalm(及其他类似工具) 可以解决代码库中的现有问题,帮你慢慢提高代码质量。

在 20 世纪中期,还没有完善的 PHP ORMs,所以我们建立了自己的 PHP ORM。PHP 提供了大量构建基块,用于创建简单的 ActiveRecord 风格的 ORM,包括 MySQL 支持、查询参数绑定以及神奇的获取器和设置器,而这也有助于我们聚集一批优秀工程师来完成这项任务。

我们的 ORM 最后一次重大升级是在十年前。进行了一些小的改进——Bug 修复、类型升级以及一些新特性——但基本结构没有改变。多年来,我们也尝试过使用不同类型的 ORM,但这些尝试提议都不是为了响应新的业务需求,而是出于对 ActiveRecord 模式的不满。

最终,这些提议都没有得到落实。事实证明,如果旧代码能够有以下优点,那它们比新代码更好:

  • 工作高效
  • 静态分析简洁
  • 测试运行良好
  • 是常用代码

谢天谢地,我们现有的 ORM 满足上述四个要求。

保留可靠的旧代码也让我们有机会将精力集中在为业务带来实质利益的事情上。而且我负责任地说,Vimeo 近来一直不断发展,有大量像 Vimeo Record 这样很棒的新产品。

十年前,许多开发人员编写了一部分 PHP 后就转向了其他更受欢迎的语言。他们经常热切地告诉别人不要再编写 PHP。我想告诉大家,PHP 可以成功。Vimeo 在 PHP 上的持续成功证明了它是 2020 年公司快速发展的一大利器。

PHP 的崛起至少让一个反对者改变了看法。我的一位同事,之前一直批评 PHP,有一天他把我拉到一边,非常真诚地感谢我告诉了他“用 PHP 工作并不一定很糟糕”。