Dr.VenkatSubramaniam是AgileDeveloper的创始人,JoltBookAward获奖作者,现兼职教授计算机科学系休斯顿大学。作为敏捷开发的权威,他在美国、加拿大、印度和许多欧洲国家培训和指导了数千名软件开发人员,并在各种会议上发表演讲。Venkat是一位多产的技术作者,是《Groovy 程序设计》、《Scala 程序设计:Java 虚拟机多核编程实战》和获得Jolt奖的书《高效程序员的 45 个习惯:敏捷开发修炼之道》的作者。《高效程序员的 45 个习惯:敏捷开发修炼之道》作者问:在《高效程序员的 45 个习惯》中,您给我们讲了很多绝招。你从哪里得到这些想法的?大多数来自对软件项目的批判性观察和思考。多年来,通过我们在商业软件项目上的工作经验,我们观察到了哪些可行,哪些不可行。我们真诚地想分享我们所学到的东西,这就是写这本书的动机。书中的思想来源于个人的经验、观察、思考,以及对核心问题及其解决方案的讨论。当我们反思这些项目时,一些最基本的实践从我们两人(AndyHunt和VenkatSubramaniam)的个人经历以及我们咨询过的人的意见中浮现出来。我们意识到这些实践可以帮助那些在软件开发方面追求卓越的人。Q:Java的特性越来越像Scala和Groovy。考虑到Java的性能优势,是否会动摇Scala和Groovy的地位?这三种语言未来会是什么样子?Java正在与函数式编程保持一致;这个想法在LISP、Erlang和Haskell等语言中已经存在了很长时间。对于一门被许多人称为“世界上最好的”的语言来说,这是正确的方向。但我不认为这是对任何其他语言的威胁。曾经有比Java做得更多的语言。现在,我们仍然可以做n-1件事情,或者做不同的事情。如果真要发生,Java的进化只会让这些其他的JVM语言更加强大。Java对lambdas、流和invokedynamic的支持促进了这个生态系统支持更函数式的编程风格。JVM上的其他语言可以从中受益。由于编程风格而不愿接触Scala或Groovy的程序员会很快喜欢上Java中的这种风格。随着Java继续在正确的道路上前进,差距正在缩小。这对其他语言有好处,对JVM程序员也有好处。问:Groovy的创造者JamesStrachan曾经说过Scala将取代Java。你同意这个说法吗?Groovy与Scala相比有什么独特的优势吗?如果要发生的话,最好的时间是几年后。但似乎语言的应用应该是去中心化的。虽然Java还在前列,但应该还有其他几种语言也在生产环境中使用吧很难相信一种语言会完全取代Java,而且这肯定不会在5年内发生。但是十年后呢?希望我有这种预测能力。语言吸引我。Scala很有趣,Groovy也很有趣。Groovy的真正魅力在于它的元编程能力以及它与Java的轻松集成。Groovy在大多数地方保留了Java的语义并增加了流畅性。但Groovy的制胜法宝是元编程在运行时和编译时的演变,这也使得Gradle和Grails等工具变得有用。问:什么样的项目最适合使用Groovy?几乎所有需要Java的项目都可以使用Groovy。几年前,大多数人对Groovy有性能担忧,但随着静态编译的出现,这种担忧在很大程度上消失了。Groovy适用于各种项目,从小程序到企业级应用程序。对于还不熟悉Groovy的朋友,可以选择从Spock入手,Spock是一个非常优秀的用Groovy元编程编写的自动化测试工具。一旦我们习惯了Groovy,我们就可以继续使用Groovy来完成自动化任务,例如发送大部分电子邮件、运行后台任务、处理XML文件、字符串和文件处理等等。任何在Java中可以完成的事情,我们都可以在Groovy中以更少的代码更顺利地完成。接下来,我们可以创建Web应用程序。在这里,我们也可以利用Groovy的元编程,将行为与代码综合起来,而不用针对不同类型的对象编写冗余代码。我本人曾就采用Groovy和Grails为许多大公司提供咨询和培训,他们看到了生产力的提高以及更容易的开发和部署。问:Groovy已经在Android上可用,有人预测一旦程序员尝试使用Groovy,他们就会放弃Java。Groovy在Android上的表现如何?它会是革命性的吗?我用Groovy和其他JVM语言做了很多工作,比如在设备上,我大部分时间都在为iPhone开发。我对Android的经验仍然有限,所以无法更好地回答这个问题。Q:Scala是一门非常有能力的语言,但是很多开发者也说它是宇宙中最难的语言。有很多程序员对这门语言感兴趣,您对他们有什么建议吗?我经常开玩笑说Scala就像一座城市,你应该知道哪些地方该去,哪些地方该避开。话虽如此,如果我们只熟悉一种语言,往往很难学习一门完全不同的新语言。我们不需要学习所有关于Scala的知识或学习Scala的所有部分来有效地使用它。如果发现Scala的某些领域比其他领域更难学习,我们可以从那些不那么令人生畏的地方开始。从句法上讲,Scala可以用许多不同的方式做同样的事情。我们可以从最熟悉的开始,逐渐熟悉整个语言,探索不同的方法来完成同样的动作。如果语法变得混乱,我们可以回退,给变量赋予更具表现力的名称,并避免一开始看起来很神秘的运算符。有许多资源可用于学习该语言。花时间写代码比看书更重要。只有编写更多的代码,才能更好地掌握这门语言。所以把恐惧放在一边,让实践和热情引导我们。Q:你认为有必要让团队的所有成员都接受一套语言和工具吗?为什么?有两种类型的团队。一种是特定的人在特定的领域工作,由某个开发人员负责特定部分的代码。还有一个团队集体负责代码,任何愿意并且能够修改代码的人都可以这样做。我提倡集体责任和协作发展。这样做可以从很多方面降低风险,例如降低单点故障的可能性。在大多数人不理解的团队中编写代码已经是一个很大的风险。我们不想添加大多数成员不理解的语言和工具。此外,对于实践集体责任的团队,拥有整个团队可以维护的语言和通用开发环境是协作工作方式取得成功的唯一途径。问题:Java通过scriptEngine调用Groovy代码性能比较差。Groovy和Java有更好的配合方式吗?Groovy的一大好处是用于编译的-j选项。使用此选项,Groovy编译器groovyc将让Java编译器编译.java文件并让groovyc编译器编译.groovy文件。一旦这些文件被不同的编译器编译,最终的结果就是字节码。一旦我们将代码编译为字节码,用不同语言编写的代码之间就没有实际区别了。只要您在类路径中也有必要的jar文件就可以了。所以实际上不需要使用scriptEngine将Java代码转成Groovy代码。Q:学习新的语言和工具对你来说意味着什么?***奖励是什么?我可以毫无压力地使用十几种语言进行编程。学习前几种语言真的很难,后面的就容易多了。我认为背后的原因在于一点一滴的积累学习。我们不擅长一次性学习很多新概念。我们循序渐进地学习,每次的知识量很小。我坚信学习一门新语言的难度与我们知道的语言数量成反比。如果您只精通一种语言,那么学习与第一语言截然不同的第二语言将需要花费很多时间。另一方面,如果我们花时间研究不同的范例和表示风格,头脑会很快比较新语言的特征。我们很可能会在熟悉的属性中找到类似的东西。但是如果我们只知道一种范式或者表示方式,那么这种可能性就很低,所以学习起来非常困难。十几年前,我用Basic和C编程。然后我用C++、Java和C#编程。Ruby对我来说是一个很大的变化,学习起来有点困难。用Ruby编程几年后,学习Groovy就很容易了。然后我又对Erlang产生了兴趣。这也是一个很大的变化。但是我用Erlang编程了几年之后,学习Scala就变得非常容易了,因为他们的角色模型,函数类型等等都差不多。在我看来,学习语言和工具的好处是很大的:首先,它让我拥有了庞大的客户群。我最近帮助一家大公司采用关键的敏捷技术实践,例如测试驱动开发和有效模拟。作为一家大型国际公司,他们有用不同语言编写的应用程序。我需要在不同的地点用8种不同的语言帮助他们。我无法想象如果不懂这些语言,我将如何领导这家公司。此外,由于接触过各种语言,学习一门新语言的时间成本对我来说变得很低。当我教授软件设计和编程语言课程时,我给学生100%的自由来选择他们想学习的语言。我很容易解释概念,比如设计模式,我可以用他们知道的语言举例。作为培训师,我在这方面也受益匪浅。掌握多种编程语言的感觉就像用不同的自然语言进行交流一样。原文链接:http://www.ituring.com.cn/article/131909
