回答问题的尝试:为什么有的语言成功了,而其他的却失败了?

jopen 12年前
   <p> <strong>查看英文原文:</strong><a href="/misc/goto?guid=4958347511843889158">Trying to Answer the Question:Why Some Languages Succeed While Others Fail?</a></p>    <p> 来自 UC Berkeley 的两位研究人员从社会学的角度调查编程语言的推广情况。本文简要介绍他们的研究,然后对两位作者进行了专访。</p>    <p> <a href="/misc/goto?guid=4958347512638161476">Leo Meyerovich</a> 和 <a href="/misc/goto?guid=4958347513434733938">Ari Rabkin</a> 都是 <a href="/misc/goto?guid=4958347514231154963">UC Berkeley</a> 的研究人员,他们尝试回答“为什么有的语言成功了,而其他的却失败了”这个问题,提出一种基于社会学的编程语言理论,取名 <a href="/misc/goto?guid=4958347515023306507">Socio-PLT</a>。他们希望用“<em><a href="/misc/goto?guid=4958347515807348535">Socio-PLT: Principles for Programming Language Adoption</a></em>(PDF)”这篇论文令软件社群意识到,编程语言的推广不可以仅仅当作营销方面的题目,推广情况的背后有着社会学的科学理论,并据此提出继续深入研究各种语言接受现象的行动方案。</p>    <p> Meyerovich 和 Rabkin 的研究基础,包括针对数千名参与 Berkeley 在线课程的计算机科学专业学士的一次调查,包括超过 13,000名 Slashdot、Hacker News、Reddit 用户参与的为时两年的编程语言在线调查,还包括 SourceForge 超过 300,000个项目的仓库数据。研究者们目前还在消化收集回来的巨量数据,尚未给语言为何成功这个问题找到科学的答案。不过他们已经整理了一批问题和假说,希望有助于打开一条研究道路,运用社会学的研究方法,进一步探讨语言设计和接受问题。我们试举其中几条问题:</p>    <blockquote>     <p>问题 3. 具体是什么东西说服程序员接受一种语言?</p>     <p>问题 5. 语言设计者应该跟踪观察什么数据?</p>     <p>问题 9. 我们如何利用社交网络去说服语言的实现者以及程序员采纳最佳实践?</p>     <p>问题 11. 程序员可以精通和略懂多少种语言?是否存在一种语言上的“饱和”概念,程序员只能期望达到一个适度的水平?</p>     <p>问题 16. 程序员对较长的编译、解释时间的敌视程度如何?他们对于用更长的时间换取更完善的错误检查意愿如何?</p>     <p>问题 21. 语言社区的价值观怎样随时间变化?例如,当语言变得较为流行之后,其设计者是对性能的重视程度是更高还是更低?对降低实现负担的重视程度是更高还是更低?</p>    </blockquote>    <p> 这里还有一些假说的例子:</p>    <blockquote>     <p>假说 2. 编程语言的设计者和使用者都不能正确认识语言的性能和特性的实际表现。</p>     <p>假说 3. 开发者群体本身的人群分布会影响技术分析。</p>     <p>假说 4. 一种语言若不能紧追其竞争对手,及时解决对手已解决的用例,将被程序员抛弃。</p>     <p>假说 8. 相当比例的专业程序员知道函数式编程和并行编程,但并不实际使用。知识并不是接受的屏障。</p>     <p>假说 10. 用户更容易接受内嵌型的 DSL,更排斥非内嵌型的 DSL,且 DSL 与其所嵌环境越和谐,被接受的可能性越高。</p>     <p>假说 12. 测试一种语言的表达效果和能力,用它实现一个输入-输出库是好办法。</p>     <p>假说 13. 开源 codebase 往往可以代表性地反映其用户群体的整个世界。</p>     <p>假说 15. 许多编程语言特性,如模块化机制,与该特性的社会性用途紧密关联。</p>    </blockquote>    <p> InfoQ 联系了 Rabkin 和 Meyerovich,谈谈他们研究的这个语言接受问题。</p>    <p> <strong>InfoQ:你们从研究中得到了哪些主要观点?它们有何意义?</strong></p>    <p> <strong>AR:</strong>首先我应该说明这项研究还没完成,最多算刚起步。我们的确收集了不少数据,但分析工作才刚刚开始。</p>    <p> 我可以拿一些传统智慧来回答你的问题,答案的依据只是我本人不科学的个人理解,没有可靠的数据基础。</p>    <p> 我和同事 Leo 想搞清楚这么一个问题:语言设计者和编程语言研究群体,对于用户真正想要什么,是否有准确的认识。例如传统上一般认为静态类型的优点是善于捕捉错误,也有利于提高模块化水平。</p>    <p> 可是当你去调查程序员的看法,他们不见得认同。有些程序员喜欢静态类型,往往是因为静态类型能起到文档说明的作用,还有静态类型比较容易重构。现在调试一般都结合单元测试来进行。很多情况下类型信息并不是必须的。</p>    <p> 我们认为像这样的例子还有很多,程序员们关心的事情和设计者关心的事情有那么一点偏差。如果我们能找出这些情况然后记录下来,会是比较重要的贡献。</p>    <p> <strong>LM:</strong>还可以拔高一个层次来看:我希望从社会学角度去优化编程语言的研究和设计工作。</p>    <p> 我们有相当部分的工作是先找到一些社会学理论,然后对程序员做意见调查,对语言设计者做访谈,看看双方的意见是否脱节,从而确定我们应该如何看待语言的功用。我们已经有证据提示说,在 DSL、程序模块、类型安全、语言/API/程序演化等等基本的编程语言议题上,都存在着分裂的(社会性)基础。</p>    <p> 我的第二个目标是开创一种新类型的、能充分利用社会学现象的编程语言。举例来说,能不能让程序随着使用者的增长,自动获得更高的速度和安全性?如果让代码和执行踪迹通过互联网共享,我们能不能将现在花2~20分钟搜索 API 用法的行为变成只花1~2分钟的智能代码补全?我们并不想盲目出击,所以一直在验证社会学家对于技术的一些想法。工作做得越多,我们越觉得这方面大有可为: )</p>    <p> <strong>InfoQ:程序员和编程语言之间存在什么样的社会关系?</strong></p>    <p> <strong>AR:</strong>这个题目有一点特别吸引人,用户和语言之间的社会学关系不是单向的关系。程序员经常自创各种库,乃至自创各种专门用途的工具去改造手上的编程语言。大多数流行的语言都拥有一套完整的生态系统,可将语言改造为各种截然不同的面貌。例如 Python 配合 NumPy 库之后变成一种可承担高性能科学计算任务的语言,这种任务是 Python 语言本身完全不能胜任的。Ruby 如果没有后来发明的大量工具帮助它拿下复杂大型应用,尤其是 Web 应用的开发任务,它的吸引力不会有现在的那么高水平。</p>    <p> 语言设计可以不经意地塑造库和工具的形态,这一点也很有趣。动态语言很容易做测试用的仿真代码,而 Java 就难得多。从这些方面看,“语言原本设计的样子”和它的程序员之间的关系很值得研究。</p>    <p> <strong>LM:</strong>这个问题的答案是开发性的,其中牵涉的人和过程非常多。</p>    <p> 举个例子,我们应该把语言设计者和他们的资助者身份也纳入考虑。现在政府方面(如国家科学基金、国防部、能源部)的资助力度较弱,我们更多地看到企业界的影响(Microsoft、Intel 等等)。这种现象,影响了新语言的设计出来的特性。</p>    <p> 单独一种语言范围内表现出来的关系也十分有趣。语言设计者和程序员之间的沟通边界线,因为网络的关系被抹平。这一方面是好事,另一方面(不具备代表性的)早期用户和声音比较大的少数人,很容易被误认为代表了真实的情况。当语言设计者是语言所属专门领域的专家的时候,可以相对缓解代表性失准的问题。初涉语言设计的人因为缺乏历练,不可避免地会在一些基本的设计问题和性能考量上重新发明轮子,同样不可避免地会搞错一些重要的方面。像 JavaScript,安全/语义/性能专家不得不在事后大动干戈地改造它,而成效有限。世上不如人意的事情太多: )</p>    <p> 从我前面的观点可以看出来,我预料关系将会发生变化。例如当程序员之间的分享行为越来越普遍,可以想象语言和工具能做的事情也会更多。希望十年后,我们回过头来看今天上 Google 查开源代码,上 StackOverflow 问问题之类的行为,会觉得太幼稚。这样的变化将从社交和技术两个角度改变编程。</p>    <p> <strong>InfoQ:为什么有些语言比别的语言流行度高很多?</strong></p>    <p> <strong>AR:</strong>关于这一点,我手上真的没有数据,所以只能说说观点而不是事实。</p>    <p> 一种语言能流行,有的是因为出现了杀手级应用,有的是因为有深厚的业界支持。前一种情况的例子有 Ruby,因为 Rails 而取得成功。还有C,在很长一段时间里,C都是开发 Unix 和 Unix 工具最简单的高级语言。</p>    <p> 后一种情况的例子如 Java 和C#。这两种语言都没有什么特别创新的地方——只是在 Smalltalk 和C/C++之间找的折中。它们真正突出的特点是良好的文档、完善的类库和跨平台实现。这几项都是开发成本高昂的特性,如果没有 Sun 和 Microsoft 建立“现代”语言平台的战略决策,是建立不起来的。</p>    <p> <strong>LM:</strong>说得对,而且不存在什么成功的保证。用简单的生态原理推导一下就知道,事情绝不会那么容易:每一种新语言都是对社会资源的一次分流。程序员需要花时间精力去掌握语言,花时间精力去建立各种库,时间精力都是资源。</p>    <p> Scala 是一种设计的时候就考虑了接受问题的语言榜样。Java 的政治版图前景不明,于是 Scala 把自己定位成 Java 的替代者(历史会证明的!)。虽然 Scala 根本就是一种通用语言,他的开发团队却花很多时间去照顾财经领域和初创企业的早期用户。财经领域和初创企业都是能给 Scala 带来声望的垂直细分市场。而且我猜想这类开发者学习新语言没有障碍,更换语言的成本较低。支持原有的 Java API 和 Java 遗留代码对开发者很有吸引力。Scala 语言拥有一些在学术上领先的先进特性,但它并不去刻意强调,而是明智地选择于己有利的意识形态战场。大多数程序员都不会注意这些方面。诸如此类我还可以继续说下去:)</p>    <p> <strong>InfoQ:为什么有些语言寿命比别的语言长很多?</strong></p>    <p> <strong>AR:</strong>有个老笑话是这么说的,“我不知道 15 年后工程师会用什么语言,但他们管它叫 FORTRAN。”像 Basic、Fortran 这些古老的语言,从它们现在的模样已经完全认不出当初发明时的样子。很难回答“语言可以维持多长时间”。即便是C语言,自K+R 1.0 以来也经历了持续不断地改进。</p>    <p> 也许可以改为问人们什么时候开始不再在新项目里使用一种语言。很遗憾这方面的数据不多,我不知道怎么画一根曲线来回答“Modula-2的使用量高峰是什么时候”。我还没找到好的答案。</p>    <div id="come_from">    来自:     <a id="link_source2" href="/misc/goto?guid=4958347516607077698" target="_blank">InfoQ</a>    </div>