掌握多种语言是我的财富 —— 来自《高效程序员的45个习惯》作者
Venkat Subramaniam 博士是 Agile Developer 公司创始人,Jolt 图书大奖获奖作者,现在休斯敦大学计算机系兼职任教。作为敏捷开发方面的权威人士,他培训并指导了美国、加拿大、印度和欧洲多国的上千名软件开发人员,并 多次在各种大会上发表演讲。Venkat 是一位多产的技术作家,他著有《Groovy 程序设计》、《Scala 程序设计:Java 虚拟机多核编程实战》,以及 Jolt 大奖获奖图书《高效程序员的 45 个习惯:敏捷开发修炼之道》。
《高效程序员的 45 个习惯:敏捷开发修炼之道》作者
问:在《高效程序员的 45 个习惯》中,你告诉了我们很多绝妙的技巧。你是从哪里得到这些想法的?
大多数是通过对于软件项目观察和批判思考得来的。长年以来,通过在商业软件项目上的工作经验,我们观察到了哪些做法是有效的,而哪些做法并不管用。 我们真心诚意地想要分享所学到的知识,这就是这本书的写作动机。书中的想法来源自个人经历、观察、思考,以及讨论核心问题及其解决方案。当我们回想这些项 目的时候,通过我们俩人(Andy Hunt 与 Venkat Subramaniam)的个人经历,以及咨询对象的意见,一些最为基础的实践浮现了出来。我们意识到这些实践可以帮助到在软件开发道路上追求精益求精的 人。
问:Java 的特性越来越像 Scala 和 Groovy,考虑到 Java 在性能方面的优势,Scala 和 Groovy 的地位是否会有所动摇?这三种语言在未来会是什么样?
Java 正在向函数式编程看齐;这种思想在很多语言中都已经存在很久了,比如 LISP,Erlang,以及 Haskell。对于这门被很多人称为“世界上最受欢迎”的语言来说,这是正确的方向。但是我并不认为这对于任何其他语言是一种威胁。以前,和 Java 相比有些语言可以多做n件事。现在,我们仍然可以多做或用不同方式来完成n-1 件事。
如果真要发生的话,Java 的进化只会让其他这些 JVM 语言变得更强大。Java 对于 lambdas,streams 以及 invokedynamic 的支持提升了这个生态系统,使其更加支持函数式编程风格。JVM 的其他语言可以从中获益。那些因为编程风格而不愿意接触 Scala 或 Groovy 的程序员很快就会在 Java 中喜欢上这种风格。随着 Java 在正确的道路上不断前进,差距就变小了。这对于其他语言来说是好事,对于 JVM 程序员来说是好上加好。
问:Groovy 之父 James Strachan 曾经说过 Scala 会取代 Java,你同意这种说法吗?相对于 Scala 而言,Groovy 有什么独特的优势吗?
如果真要发生的话,那最好的时机就是在几年以后。但是看起来语言的应用应该会是分散的。当 Java 还在充当排头兵的时候,应该还有其他几种语言也应用在生产环境中。很难相信会有某种语言完全取代 Java,在 5 年内肯定不会发生。但是十年后呢?真希望我有这种预测能力。
语言吸引着我。Scala 很好玩,Groovy 也很有趣。Groovy 的真正魅力在于它的元编程能力以及轻易和 Java 集成的能力。Groovy 在大多数地方保留了 Java 的语义,并增加了流畅性。但是 Groovy 的制胜法宝是利用运行时间和编译时间的元编程进化程序,这也让 Gradle 和 Grails 这样的工具有了用武之地。
问:什么样的项目最适合应用 Groovy?
几乎所有需要 Java 的项目都可以用 Groovy。几年前,大部分人对 Groovy 还有性能方面的忧虑,但是随着静态编译的出现,这种忧虑已经很大程度消失了。
Groovy 对于各种各样的项目都适用,从小程序到企业级应用。
对于还不太熟悉 Groovy 的人来说,可以选择从 Spock 开始,这是一个用 Groovy 元编程写的很不错的自动测试工具。一旦我们习惯了 Groovy,就可以继续用 Groovy 完成自动化任务了,比如发送大部分邮件,运行背景任务,处理 XML 文件、字符串以及文件处理等等。
任何可以在 Java 里面做的事,我们都可以用更少的代码在 Groovy 更流畅地完成。接下来我们可以去创建 web 应用,在这里,我们还可以利用 Groovy 的元编程用代码合成行为,而不需要为不同类型的对象写多余的代码。
我自己已经为很多大公司采用 Groovy 和 Grails 进行过咨询和培训,他们都在生产力上有所提升,也能更轻松地开发和部署了。
问:Groovy 已经可以在 Android 上使用了,有人预测一旦程序员们尝试过 Groovy,就会抛弃 Java。Groovy 在 Android 上运行地如何?它会是革命性的吗?
我已经用 Groovy 和其他 JVM 语言完成了很多工作,在设备上说,我大多数时候都在为 iPhone 开发。我在 Android 上的经验仍然有限,所以无法更好地回答这个问题。
问:Scala 是一种能力很强的语言,但是很多开发者也说它是宇宙中最难的语言。有很多对这门语言感兴趣的程序员,对于他们你有什么建议吗?
我经常开玩笑说 Scala 就像一座城市,你应该知道哪个部分是可以拜访的,而哪个部分是应该避开的。话虽如此,如果我们只熟悉一门语言,那么学习一门完全不同的新语言通常都是很困难的。
我们不需要学会关于 Scala 的一切或者学习 Scala 的所有部分才能有效地使用它。如果发现 Scala 的某些领域比其他部分更难学,那么我们可以从那些不太吓人的地方开始。从语法上说,Scala 可以用很多不同的方法来完成同一件事。我们可以从最熟悉的地方开始,然后逐渐熟悉整个语言,我们可以探索用不同的方式来完成相同的动作。如果语法变得让人 迷惑,我们可以后退,给变量更有表现力的名字,避免一开始看起来就很神秘的运算符。
要想学习这门语言有很多可用的资源。比起读书,花时间写代码更加重要。只有写更多代码,我们才能更好地掌握语言。所以,把恐惧放到一边,让实践和激情指引我们吧。
问:你觉得让团队所有成员都接受一套语言和工具有必要吗?为什么?
有两类团队。一类是特定人在特定领域工作,其中某一个开发者会对特定部分的代码负责。另外还有一种团队,他们集体对代码负责,任何愿意和有能力修改代码的人都可以这么做。我是集体负责制和合作开发的倡导者。这样做可以降低很多方面的风险,比如降低单点失败的可能性。
在团队中存在大多数人无法理解的代码已经是一个很大的风险了。我们不想再加上大多数成员无法理解的语言和工具。另外,对于实践集体负责制的团队,拥有整个团队都能维护的语言以及共同的开发环境,是合作工作方式能够成功的唯一方法。
问:通过 scriptEngine,Java 调用 Groovy 的代码的方式性能比较差,Groovy 和 Java 配合有什么更好的方式?
Groovy 身上的一大好处就是用来编译的-j选项。通过这个选项,Groovy 的编译器 groovyc 会让 Java 编译器来编译.java文件,让 groovyc 编译器来编译.groovy文件。一旦这些文件由不同编译器编译,其最终结果就都是字节码。一旦我们把代码都编译成字节代码,不同语言写出的代码就没什么实际上的区别了。只要在类路径中还有必要的jar文件就没问题。所以其实没什么必要利用 scriptEngine 把 Java 代码调入到 Groovy 代码中。
问:对于你来说学习新语言和新工具意味着什么?最大的奖赏是什么?
我可以毫无压力地用十几种语言编程。学习前几门语言确实很难,后面的那些就容易多了。其背后的原因我认为在于一点一滴积累式的学习。我们并不善于一口气学习很多新概念。我们渐进式学习,每次知识的体量都很小。
我坚定地相信学习一门新语言的难度和我们所熟悉掌握的语言数量成反比例。如果仅仅熟知一门语言,那么要学习和第一门语言截然不同的第二种语言就会花 很多时间。另一方面,如果我们花时间研究不同的范式和呈现方式,思维就会迅速比对新语言中的特性。有可能我们可以在熟悉的特性中找到类似的。但是如果我们 只知道一种范式或呈现方式,那么这个可能性就很低,所以学习起来就很费劲。
十几年前,我用 Basic 和C编程。然后我又用C++, Java,以及 C# 编程。Ruby 对我来说是一个很大的改变,学习起来有些困难。我用 Ruby 编程了几年之后,再学习 Groovy 就变得很简单。随后我又开始对 Erlang 感兴趣。这也是一次大改变。但是在我用 Erlang 编程的几年之后,学习 Scala 变得非常容易,因为它们的角色模型、功能类型等方面都很相似。
在我看来学习语言和工具的收获是很大的:
首先,这让我拥有一个很大的客户基础。最近我帮助了一家大公司适应了关键性敏捷技术实践,比如测试驱动开发以及有效模仿。作为一家国际化的大公司, 他们拥有不同语言写成的应用。我需要在不同地点使用 8 种不同语言帮助他们。我无法想象如果不会这些语言,我将如何指导这家公司。
另外,由于接触了各种不同的语言,对于我来说学习新语言的时间成本已经变得很低。