亚马逊AWS官方博客
为您的初创公司选择合适的编程语言 | AWS 初创公司博客
作者:Joseph K. Ziegler,前 AWS 亚太地区初创公司业务拓展经理
“Java 是有史以来最伟大的语言,是互联网的基石”;“Ruby on Rails 是成为 MVP 的最快方法”;“Python 是最精密的”;“我只用 Scala 编程,多范式最棒,这是我们的荣耀!”
诸如此类,不一而足。但事实是,作为一家初创公司的技术联合创始人,您需要最先想清楚的问题之一是:最适合我的初创公司的编程语言是什么? 要立足较高的层面回答这个问题,您可以专注于与编程体系相关的三个方面:语言的特征、您本地的生态系统以及您致力于解决的问题范畴。
语言的特征
许多使用 Amazon Web Services (AWS) 的初创公司客户告诉我们,他们选择 AWS 的原因在于我们以开发人员为中心,并为多种热门编程语言提供了一套全面的开发工具包 (SDK),这些语言包括:.NET、Java 和 JVM、Python、Ruby、PHP 和 Node.js。虽然程序员工具箱中有许多不同的语言,但我们的讨论仅限于刚刚列出的语言,因为创建基于云的应用程序的开发人员主要使用的就是这些语言。在做出选择时,应该考虑到每种语言都有不同的特征、社区、支持和生态系统:
.NET
运行 Microsoft Windows 操作系统的商业应用程序广泛采用了 Microsoft 的 .NET 平台。对于 Linux 用户来说,有一个端口通过 Mono 项目提供了其功能子集。虽然 C# 和 .NET 的其他各部分均奉行开放标准,但从某种程度上来说,.NET 仍然属于由 Microsoft 控制的封闭式生态系统。但由于这种语言得到了企业的广泛采纳,因此拥有全面的文档和支持服务。由于 .NET 是在称为公共语言基础设施 (CLI) 的虚拟化平台上运行的框架,因此用户可以选择要使用的语言,如 C#、VB.NET、C++ 甚至是 Python 和 Ruby。C# 是迄今为止最热门的语言,位居第二的是 VB.NET,但热门程度远低于 C#。此外,.NET 也是用于创建 Windows 移动应用程序的技术,并且与在 Windows 上运行或通过 Web 服务运行的企业系统集成良好。
值得注意的是,虽然 .NET 提供了一些免费工具和库,但其生态系统仍然基于许可式软件模型。这意味着,当需要第三方工具时,某个地方的某个人需要付费购买许可证,而这笔费用最终要由您承担。此外,如果您计划使用 Windows 作为 .NET 的操作系统,还会增加成本(与大多数 Linux 版本的免费许可证相反),不过 Microsoft 有一些计划可以抵消或推迟这些成本的产生。最终,选择 .NET 的成本可能要远高于开源平台。
最后一点,许多 .NET 程序员都有企业背景;负责开发内部系统,有些程序员可能会发现自己很难适应初创公司环境的节奏和生活方式。
Java
Java 于 1995 年前后问世,自 J2EE 出现以来,它一直是创建企业应用程序的核心工具。Java 长久的商业寿命和广泛采用使之形成了一个强大的文档、库和框架生态系统,其中许多内容均针对电子商务、安全性和复杂的事务处理架构。无论在地区还是全球层面上,都有许多经验丰富的 Java 开发人员随时待命,包括承包商和全职员工在内。开源社区很早就接受了 Java,并形成了一个欣欣向荣的自由市场,提供各种 Java 解决方案和工具。
Java 最初的目标是“一次编写,随处运行”,但对于这一目标是否确已实现,仍然存在一些争议。自 Oracle 收购 Sun 以来,对许可权利的额外关注引发了人们对于该语言未来的一些疑问,甚至有许多人声称“Java 已死,但 JVM 仍会存续”。这推动了像 Scala 这样的语言的采用,它基于 JVM 运行,并且仍然可以利用第三方库。与其他语言相比,Java 还可能具有资源密集的特点,例如需要更多内存。Java 用于 Android 设备,如果您的部署战略中考虑采用该平台,则应考虑使用 Java。
Python
Python 是一种开源解释性语言,它易于学习掌握,而且拥有大量的科学库,因此已经得到科学界许多用户的接受采纳。Django 是一个为在线报纸出版商创建的 Python 框架,为 Pinterest、Instagram 和 EventBrite 等热门初创公司提供支持。Django 和 Python 相结合,大体上可以实现独立于平台,但开发人员仍然必须专门设计独立的程序,才能在 Windows 和 Linux 平台上运行。Python 社区中有这样一种趋势,即通过指定编写 Python 的“正确方法”来提高代码质量,Python 增强建议书 (PEP) 索引拥有相应的记录。
在这方面有一个众所周知的问题,那就是 Python 在单台机器上很难实现跨多核扩展。原因在于全局解析器锁 (GIL) 的限制。但是,它非常适合跨无状态服务器水平扩展的应用程序,因此成为利用云的应用程序的优质解决方案。Boto、IPython 和 Fabric 等库也将其用作管理脚本工具,从而支持自动化和“基础设施即代码”。这为人手有限的团队提高了工作效率。
Ruby
Ruby(特别是 Ruby on Rails 这种 Web 框架)也是广受初创公司欢迎的解释语言。Ruby 在网上提供了一些全面的培训内容,包括适合无编程经验的新手和相应领域专家的内容。新手可以访问试用 Ruby,经验丰富的程序员可以访问 Rails for Zombies。高采用率意味着它拥有许多基于 Web 的库和工具,可以帮助 Web 开发人员快速创建应用程序。Ruby 拥有可重用库的存储库,可以轻松地以 RubyGems 的形式维护和部署。与 Python 一样,Ruby 也适合使用 Puppet 实现自动化,Puppet 是一种以该语言原生编写的开源配置管理工具。Ruby 为许多流行的网络资产提供支持,包括 Airbnb、Github 和 Groupon。
但担忧仍然存在,Ruby 在服务器端无法很好地扩展,以支持发送给应用程序的大量请求。根据 InfoQ 的报告,Twitter 在 2010 年完成了从 Ruby 到 Scala 的迁移,以满足其爆炸式增长的后端需求,这一举措举世皆知。此外,由于 Ruby 采用开源形式,由社区驱动,因此更难以获得高质量的文档和支持。您可能需要依靠 Ruby 专家来完成复杂的解决方案。业界也对其有一定的担忧,因为随着库和代码行数量的增加,Ruby 的维护难度与日俱增。
PHP
PHP 是早期十分流行的一种互联网应用程序和网站编程语言,拥有庞大的开发人员、框架和库生态系统。包括 Facebook、WordPress、Twitpic、Flickr 和 Imgur 在内的许多大公司都是 PHP 校友会的成员。由于 PHP 的发展历程和长久历史,PHP 代码的质量千差万别。PHP 没有像 Python 那样的编译语言或严格标准等规则,而是由开发人员社区提供指南。因此,没有严格结构的大型项目可能难以理解、难以维护,形成了人们称之为“无头绪代码”的问题。
Node.jsDev
Node.js 是最新加入编程框架列表的成员。Node.js 是一种事件驱动型语言,它从 JavaScript 发展而来,也是这个列表中唯一从最初起便设计为利用服务器端 JavaScript 来处理 Web 请求的语言。无阻塞 I/O 可生成高性能的服务器端应用程序。程序员会发现,他们的客户端 JavaScript 技能可以移植到服务器端开发任务之中。Yahoo 和 LinkedIn 等领军企业已经基于 Node.js 实施了部分应用程序。
由于 Node.js 尚属新生事物,因此可能很难找到技能娴熟的专业人才,而且相应人才的收费也较高。文档和库很少,而且项目往往混合使用 Node.js 与其他语言和框架以完善功能集,这一事实带来了更多挑战。但是,随着 JavaScript 开发人员逐渐过渡为采用后端架构,这种情况可能会有所改善。
动态、静态、解释和编译
上述所有语言都可以分为两类:一类是静态编译、强类型化语言;另一类是动态解释性语言。较为陈旧的传统企业语言通常归入第一类。以这种方式创建的代码为开发人员提供编译时错误而不是运行时错误,从而确保获得具有干净的接口的更为安全、记录翔实的代码。但是,使用静态编译代码的应用程序需要更长的构建时间。在最初引入这些语言时,这种权衡折衷确有意义。当时的计算能力十分稀缺,成本高昂。但时至今日,AWS 提供的云计算能力能够带来即时可用、即用即付的计算能力,已然彻底改变了整个行业的格局。
现在,计算能力速度更快、成本更低,而集成开发环境 (IDE) 随时可用于简化使用解释性语言进行的开发工作,而且还支持精密的调试和重构功能。与前几年的情况相比,相对于动态语言,编译式语言的优势已然减少,而且事实证明,动态语言可以造就高质量的代码,并且天然适合快速开发周期。正因如此,许多成功的初创公司在选择开发语言时会倾向于选择动态/解释型语言。
本地生态系统
外包非常适合执行概念验证工作,或者是公司内部不具备需要一次性使用的特定技能的情况,但要获得成功,您需要来自您本地生态系统的娴熟人才。寻找优秀的团队、加快项目速度并将工作延伸到海外需要一定的时间,而相比之下,如果您能投资在内部培养必要的专业技能,就能缩短开发周期,提高初创公司的敏捷性。技能娴熟的劳动力的可用情况因地理位置而异。例如,某些地区有很多 PHP 开发人员,但只有很少的 Node.js 开发人员或者根本没有这类开发人员。为了更好地了解您所在地区内各语言的盛行程度,以及获得所需技能的最终成本,请访问 langpop.com,查阅全球语言使用情况统计数据,并在 meetup.com 上搜索,看看近期有哪些会议,了解哪些会议吸引到了最多的与会者。这能让您更好地了解您本地劳动力的技能情况。此外,您还可以参加聚会、用户组或是前往共享办公室,与当地人才交流互动,了解您的员工可以获得的支持水平。最终,如果您需要的技能不易获得或者需求量很大,您就必然要承担更高的开发人员成本。
问题范畴
有些语言显然更适合解决不同的问题,这可以让您的决策过程更加简单直接。例如,如果您要广泛集成 MS Office 和其他 Windows 应用程序,那么您应该将 .NET 纳入备选语言列表。如果您要执行函数,例如预测天气模式,那么 Python 可能是更好的选择,因为它具有精确的数学库和能够使用 Hadoop 实现良好扩展的能力。如果 B2B 应用程序的企业级安全性对您至关重要,那么您或许应该考虑采用 Java。无论如何,您的评估都需要考虑需要解决的问题以及您的业务用例和客户类型。
那么哪种语言才是最好的?
这是个好问题! 本文介绍了可以为您的决策过程提供助力的三个主要决策点。
• 语言特征:如果您正在为云环境开发,那么应该坚持使用解释性、动态、开源的语言,以实现更为经济高效的快速开发。对于具有严格的安全性要求或者必须与传统环境集成的企业应用程序,编译式语言或许更为适用。
• 问题范畴:看看他人曾经使用过哪些语言解决与您相似的业务问题,了解各种库提供了怎样的支持。或许已经有人解决过您的问题中 80% 的部分,而且有通用许可证可供您使用。
• 本地生态系统:研究您当地的社区,了解您当地是否有现成的娴熟技术工作者,能够让您通过经济高效的方式获得相应人才。
AWS 开发人员经常告诉我们,他们会根据上述三点列出一份备选清单,然后确定那种语言能让他们实现最快的迭代,并据此作出最终决策。他们认为,快速迭代是最重要的方面,因为初创公司的本质就是快速失败,然后汲取教训,快速进步。快速迭代让您能够测试各种想法、确定问题领域,并为您提供解决方案,在您朝着 MVP 稳步推进的过程助您一臂之力。不必在当下为纵向扩展过度担忧。如果您的初创公司有幸遇到了与 Twitter 类似的问题,需要确定如何扩展 Ruby 以满足呈爆炸式增长的用户需求,那么您就已经走上了成功之路。
在 Twitter 上关注 Joseph:@jiyosub