英文原文:Our Polyglot Nightmare
人类语言的多样性几十年来一直在不断下降。随着全球化通信和商业的兴起,发言者越来越多地将精力放在那些能够提供最经济和最多社交机会的语言上,世界因此加速了其淘汰非流行语言的进程。这些在语言上的损失甚至引起了类似濒危语言项目(Endangered Languages Project)这样的机构来保护它们不至于消亡。
在初创企业社区,这种根本的力量甚至更胜一筹,因为初创企业团队经常要在世界各地跨时区工作。不过,编程语言作为人类语言的表亲目前还没有遭遇同样的命运。恰恰相反,在过去这几年,随着编程语言从理论走向实践,还出现了所谓黄金时代,新的和新近流行的被初创企业和大公司使用的编程语言都大有泛滥之势。
看到供程序员使用的新的编程工具总是令人兴奋的,它可以潜在地提高生产力,并且可以更快地给我们提供我们想要的产品。但是,语言的多样性对工程师队伍来说也有不好的一面,就为了推出自己的产品,大家必须在多语言环境中工作,更别提之后还要进行维护。
为了对我所说的有一个更好的理解,不妨设想一下,一个典型的初创企业打算为用户提供一款应用,可以在 web 和移动界面使用。对于前端来说,开发者将至少使用 HTML、CSS 和 JavaScript 等语言,并且有可能还会使用更多的语言而这取决于所选择的库。对于安卓和 iPhone 的应用,开发团队将不得不使用这两个平台的原生语言,它们分别是 Java 和 Objective-C(当然对于现在而言苹果使用的是新语言 Swift)。而为了将这一切连接起来,团队将不得不建立一个后端,这又可能涉及如 Python、Ruby 或者 Go 以及数据库查询语言。
但这种分析只是一种有趣的假设。RedMonk 公司开发出了一个编程语言排名系统,上个月发布了他们最新的排名报告,该报告显示“语言的多样性……仍然是常态。”他们的数据表明,尽管前几位的排名一直相对稳定,一些新的语言正变得越来越流行。
就像 20 世纪的“大科学”的兴起让独自做研究的科学家变成一个研究小组,开发环境不断增加的复杂性要求我们建立更大的工程师团队,拥有更多的专家。这种专业化对就业市场有着重要影响,特别是对像硅谷工程师这样比较局限的市场。这也意味着我们将研发的工作碎片化,这有可能延缓语言库和工具包的演变进程。而也许最不幸的是,这还会限制独立开发者和小型创业团队的贡献,因为由于人手所限,他们将很难为某些平台进行编程开发。
虽然还有很多问题要考虑(后面我将详细讨论这方面),但编程语言的多样性不一定都是负面消极的。显然代码的用途很多元化,无论用于嵌入式系统,还是高度可靠的系统比如空中交通管制,或者为初创企业的想法打造的简单测试环境。使用合适的工具进行工作一定能提高生产力。
但源代码只有两个目的。它让一位工程师能够向另一位工程师解释一个程序要做的事,同时它也让工程师能够决定一台电脑如何运作。语言越是丰富多样,第一种沟通就会越困难。
尽管如此,主要有三个根本原因导致了编程环境的日益碎片化。首先,新的语言采用的速度有所加快。这主要是由互联网本身所造成的,它让开发人员能够通过更好的教程、参考信息和代码示例来迅速传播新的编程语言。
此外,像 GitHub 这样的工具鼓励更多的工程师参与到库的开发中来,这让一个新编程语言可以用比过去快得多的速度获得可行性。企业对新编程语言的支持也是非常强大的,无论是谷歌对 Dart 和 Go 还是苹果对 Swift 都是如此。最后,相比过去工程师们似乎更愿意用新的编程语言。人们不禁怀疑保罗·格雷厄姆(Paul Graham)呼吁初创公司用外来编程语言找到更好的工程师的做法是否推动了人们去选择较鲜为人知的编程语言。
虽然更快地采用新语言保证了更强大工具的广泛使用,但这也对工程师构成了挑战,他们必须加速他们的教育进程以便能跟上潮流。由于多个环境中的多种编程语言分割了他们的时间,现在对一种特定语言的掌握变得更加困难。
以苹果的 Swift 语言为例,它很可能成为为 iOS 进行程序开发的标准语言。虽然从 Objective-C 中获得的知识不会完全被抛弃,但每一位的 iOS 工程师都必须学习新词汇来充分利用 Swift 的优势。
第二个主要的原因是出于在多个平台上进行开发的需要。高科技产业中的开发者现在为 Web、移动设备、云计算基础架构、多核处理器以及可穿戴设备等进行编程。这里的每一个平台都具有独特的性能特点和要求,这表示一种编程语言相比另一个在效用上可能会有很大的不同。举例来说,像 Go 和 Erlang 这样的语言对服务器群很有用,因为在那里并发性很重要,但很可能对一个可穿戴设备来说就没那么有价值,因为那里的处理能力可能会集中在单个芯片上。
第三,这种平台上的多语言性是与各种语言范式争夺开发者的关注相匹配的。函数式编程语言,作为一种让学者和一些发烧友好奇的语言,现在通过像 Scala 和 Haskell 这样的编程语言得到更加广泛的普及,而这在很大程度上是由于更多的人意识到这种语言在处理 Web 应用程序上的价值。
鉴于这些根本原因,多语言的噩梦似乎不大可能很快消失。
但是这样成本也是很高的。我们面临的挑战不只是语言的数量正在增加,各种编程环境的组合也正变得扑朔迷离。由于公司开始使用自己的一套独特技术,寻找到合适的完全拥有所需技能的工程师是很困难的,而工程师们则不得不花费更多的时间来让自己的技能具有通用性,这样才能保持在学科的前沿。可悲的是,创业公司很少会给新员工提供必要的资源进行培训,相反,他们希望程序员从一开始就具有生产力。
更广义来说,在编程社区里,我们越来越碎片化也意味着我们正在分散我们的精力去建立已有的库。我们的编程时间是有限的,特别是在为任何可用的语言提供基础的开源项目上。如果我们在多个项目上的时间和精力被摊薄,那么一开始我们就可能会失去拥有多种语言的生产力优势。
最终,我们会发现一个集体行为的问题,而这个问题,坦率地说,不可能被解决。虽然可能没有什么“解决方案”,创业公司仍然可以通过将资源集中到他们所需要的语言上来避免多语言的问题。项目经理应该对将新语言引入到现有基础架构中非常谨慎,同时也应对从现有的流行语言转到另一个更前沿的语言更加谨慎。有时,一点性能上的影响让团队中多点凝聚力是值得的。
如果我们继续问如何让技术变得更具包容性,方法之一就是确保让在行业表现良好所需要的知识尽可能得精简。虽然掌握多种语言肯定是对当今软件开发人员的要求,但我们每个人都可以尽一份力,确保技能要求不会不成比例地增加,不会超过我们的工程技术人才可以提供的范围。工程师不必成为联合国口译员才能创建自己的梦想。
图片来自 Flickr 用户迈克尔·科特(Michael Coté)