成为一名称职的Scala程序员需要你也是一名称职的Java程序员吗?

40

我对Scala的美学以及其类型系统和库等概念性工作非常喜欢。

然而,当我开始尝试使用Scala(并看到我的同事们也在使用它)时,我发现自己不得不深入了解越来越多的Java知识(特别是库方面)。

这给我带来了几个问题:

  • 我从未成为过Java程序员,所以对Java标准库或其他流行库(如Apache Commons)不熟悉或者不舒适。
  • 在Java领域中,我的搜索能力很弱。很难知道该搜索什么 - 这个问题由于针对编程新手的大量无关或基础的Java教程而变得更加严重。

此时此刻,我不确定是否应该咬紧牙关,尽力找到最快、最全面的Java之旅,以便对20年的Java发展进行补充,或者继续尝试增量式地了解Scala,这是合理的。

如果我们中的Scala专家能提供任何智慧,将不胜感激。

P.S. 我毫不怀疑自己熟悉Scala语法的能力,并且我对函数式编程和Scala社区中的范式感到非常舒适和满意。但是,程序员的能力不仅取决于自学能力,而且还取决于从其他人那里学习和采用工具和技能的能力。


5
是的,我想一个人可以学习/使用/编写Scala而完全不接触Java,但是......这里有几个原因,我认为了解Java可能会更好:1)如何创建可从Java中使用的对象(如果需要)2)利用Java API而没有Scala特定的接口或替代品(但是Javadoc可以帮助你)3)JVM的细节,如锁定语义4)尽管越来越少,但如何使用“Java生态系统”工具,例如Ant / Maven等。所以现在就行动吧: p http://scala-lang.org列出了许多出版物。 - user166390
1
第一次在SO上看到这么多大英文单词的帖子。 :) - Buhake Sindi
1
@TheEliteGentleman:哈,太遗憾了,这个没有成就奖励。 - knowtheory
1
-1 and vote to close. belongs on programers.stackexchange.com. Good question though.-1 投票关闭。属于programers.stackexchange.com。虽然问题不错。 - aaronasterling
4个回答

26
你应该采取一种“懒惰”的方式来学习Java,需要时再学习。
在我看来,很多旧的Java知识已经过时了,很多新的教程也是冗余的。例如,你肯定不想麻烦自己去学Java中古老的“集合”(Collections)框架。许多基于Java的框架可以放心忽略。而且,在你被迫使用JavaEE堆栈之前,可以安全地跳过它。
在Scala中,许多Java中常见的模式要简单得多,因为前者没有那么多样板代码。核心逻辑应该总是使用Scala实现。我相信,大多数工作都可以直接在Scala中完成,只有在构建Swing或与Spring集成等任务时才需要深入Java。
关于选择和使用Java库,我的个人指导原则是:
  1. 如果Spring能做到,就使用Spring
  2. 如果Spring太重量级,就使用Spring所使用的技术。
  3. 如果Spring无法做到,就查看GitHub项目
  4. 如果GitHub上没有,就查看Apache项目
  5. 如果Apache上没有,就查看SourceForge。
  6. 最后,随机搜索谷歌,或自己构建。
这可能有点玩笑,但这是我在过去12年中从事Java后对第三方库成熟度和稳定性的印象。

8
我不确定为什么你把Java的“Collections”称为“过时的”。它们是基本的数据结构,需要更新时仍会进行更新(虽然这种情况并不经常发生)。相反,“Vector”和“Stack”可以被称为过时的。 - erjiang
2
为什么首先要搜索Github?我会首先搜索Apache,因为他们一直是Java库/项目构建的“奠基人”。许多库至少包含一个Apache库。 - Buhake Sindi
1
@TEG 很好,这只是我的观点。@erijiang 我称它们为过时的,因为它们只有 Scala 集合的一小部分实用性。事实上,对我来说,使用 Scala 集合进行编程是一个美妙的新范式(我相信对许多其他人也是如此)。 - Synesso
@erjiang 通过Java API处理Java集合感觉有些过时,尽管包装器确实有所帮助,但与Scala(特别是2.8)集合相比仍然有些落后。;-) - user166390
7
不要从Spring开始学习!那样会使学习良好、符合惯用法的Scala变得更加困难。 - Kevin Wright
上次我使用时,Java集合比Scala更具性能。 - Dragonborn

13

如果你想学习西班牙语,就应该开始学习西班牙语,而不是拉丁语。对于编程语言也是如此。想要了解Java的两个重要方面:

第一件事是API。但你只需要对现有的内容有一个概述即可,即使是长期从事Java编程的程序员也不会知道所有的细节。通常情况下,找到解决问题的正确API或lib都很容易,因为Java非常常见,即使你的Google能力较弱,你也不应该有任何问题。

你需要了解的第二件事是Java和JVM的一些基本原则和限制(包括如何构建和运行),这将有助于你理解Scala的一些问题和设计决策。其中一个典型的例子是“类型擦除”:如果你不了解Java泛型的这种限制,在使用Scala中的泛型时会遇到问题。

正如你所看到的,你真正需要了解的内容是有限的。其他所有的内容可以在你学习过程中逐渐掌握。


具有讽刺意味的是,我在高中学习了拉丁语,所以也许这不是最好的比喻,因为我认为了解拉丁语在各种方面对我的生活都有帮助。;) 话虽如此,我已经被说服应该继续在Scala上前进,而不是通过Java绕路。但我还是很好奇人们认为从Java中需要了解什么。(我会查一下类型擦除)谢谢 :) - knowtheory

8
有很多人从Ruby/Python、Lisp/Scheme、C#转向Scala和Clojure,需要了解以下内容:
原始数据类型、自动装箱;
JVM启动选项、HotSpot的工作原理、32位与64位、使用OpenJDK?
基准测试、性能分析、如何读取堆栈跟踪信息;
各种各样的测试库,以满足各种需求。

java.util.concurrent

Swing API调用;类路径;Maven,Ant;Hudson,接口
命名空间/包/目录布局,以及所有由以下自动化的其他内容:
IntelliJ、NetBean或Eclipse

http://news.ycombinator.com/item?id=1508609

http://www.mired.org/home/mwm/papers/simple-clojure.html

+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:, EscapeAnalysis等。 http://groups.google.com/group/clojure/browse_frm/thread/c8f69037b26e2856#

压缩指针(compressed oops), http://blog.juma.me.uk/2009/10/26/new-jvm-options-and-scala-iteration-performance/

http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html

http://groups.google.com/group/jvm-languages/topics

Clojure用户的Java入门指南

学习Clojure - 我需要了解哪些Java相关知识等

http://copperthoughts.com/p/clojurists-guide-to-java/


2
啊,这很有用。那么,为什么我应该了解java.util.concurrent而不是scala的actor库呢?了解JVM是我正在努力掌握的知识,还有所有的classpath魔法和启动选项。最后,我绝对对复杂的IDE过敏。如果我不能通过在REPL中加载它并用棍子戳它或编写隔离的脚本测试来弄清楚它的作用,我会感到担忧。 - knowtheory
1
@knowtheory,我认为如果你正在开发消息或线程应用程序,你应该熟悉scala actors和akka、j.u.c、clojure和haskell中的STM、erlang进程以及zeroMQ。还有C#/F#异步框架的演变(我对此不是很了解)。另外,也可以学习一下node.js,只是为了好玩。 - Gene T
@knowtheory:IDE不需要你使用任何功能,只需使用你理解/喜欢的功能。至少对于IDEA来说,您可能需要重新调整堆和permgen(显然是向上的),并且可能要切换到32位JVM才能运行像lift这样的大型repo,但它运行得相当不错。还有很多博客和列表活动:http://www.delicious.com/tag/scala+intellij; http://dir.gmane.org/gmane.comp.lang.scala.tools - Gene T

8

这完全取决于你对“熟练的Java程序员”的定义。

对Java内存模型和垃圾回收策略有很好的理解会有所帮助。同时,熟悉各种第三方库也是必要的。

另一方面,如果你深入使用像Spring这样的库中的getter/setter依赖注入,那么在正确处理不可变性之前,你将需要放弃许多不良习惯 - 在这种情况下,之前的Java经验可能会阻碍你学习Scala。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接