有人在愤怒中使用Scala(以及对Java程序员有什么建议)?

时间:2009-02-16 22:51:53

标签: java scala jvm-languages

自从Smalltalk开始以来,我已经成为Java程序员已超过10年了。我认为下一个大型语言很可能是在无处不在的Java虚拟机上运行的。我想利用Scala(以及其他语言)的一些特性 - 类case语句用于类层次结构,闭包,类型推断,因为它可以让我写得更简洁明了(我希望)码。更接近Smalltalk!

Java中所有具有第二性质的东西:

  • 使用ant
  • 构建
  • 将应用程序/库部署到逻辑jar s
  • 优秀的IDE工具支持
  • 编写GUI(或通过某种远程处理与Swing GUI对话?)
  • 第三方图书馆/框架
  • 配置(属性,XMLSpring等)
  • DB司机等

我担心玩一些宠物项目和实际上在工作场所愤怒地使用它之间的差异有点过分。

  1. 有人做过这个飞跃吗?
  2. 值得吗?
  3. 你学到了什么教训?
  4. (显然人们使用 Scala - 但是有人建立实际的,因为想要更好的词,企业应用程序?)

8 个答案:

答案 0 :(得分:11)

我在现有的Java基础架构上使用Scala来查询和操作大型xml文档。无法使用标准的Java xml库,也不是那么容易。

我很想将它用于投资组合性能计算,但已经完成了Java版本。 Scala版本更易于维护,因为将公式直接转换为代码更容易。

你可以潜入Scala的另一个领域是多线程。没有真正的经验,但在Scala中似乎更容易。

重点是,现在不要试图将其视为Java替代品,而是在可以利用现有Java代码旁边的强项的地方使用它。

我使用Intellij和Scala插件作为IDE,但它还没有。它可以与maven插件和控制台结合使用。

我也是Smalltalk程序员,并且喜欢在Scala中使用代码块。与Java相比,代码更少,但仍然不像Smalltalk代码那样可读。

BTW,由于Seaside框架,smalltalk社区再次增长,所以你可能想要返回

我学到的东西或者更好地理解了:

  • 使用构造函数
  • 不可变的概念
  • 使用列表和递归
  • 一般的函数式编程

所以是的,我认为这是值得的。

答案 1 :(得分:6)

答案 2 :(得分:5)

我在上一个项目中基本上用Scala代码击中了所有人,因为我厌倦了调试由于缺乏对Hibernate + JBoss的理解而导致的相同问题。 (真的很棒。编写原始系统的开发人员仍然在那里,但仍然迷失在Hibernate细节中。)

我们拥有什么 - >一个古怪的系统,主要由一堆无状态EJB bean连接在一起,一些hibernate代码与一些SQL一起抛出。 (我们基本上是ASP。生产集群相当小 - 只有大约100台机器。)

我做了什么 - >汇总了各种基于REST的服务,我们在其中重新定义了某些服务器之间的RPC。这使得一切都变得非常容易编码,并且在一个没有注意依赖关系的系统中实现公共API。

到目前为止,我们已经开始在JBoss实例中部署代码而没有真正的问题。第一次尝试在Java中使用Scala object时,你可能会皱起眉头。但除此之外,没有人真正注意到。

到目前为止,我们真的开始已经有5个月了。我们已经做了几次重大修改,后来又落后了,但系统远比过去好得多。因此,虽然我们在实际学习系统的过程中遇到了一些不好的想法,但我们现在已经能够将它们全部删除,并且非常接近生产部署。总而言之,我认为典型的家伙需要2-3个月才能像Java程序员一样停止编码,并且对大多数标准库“熟悉”。

编写JDBC代码而不是ORM系统基本上已经抛出了我们几乎所有的性能问题。速度实际上明显更好,但这主要是因为我能够用不太真实的应用程序代码完成我想要的一切。

我正在使用的工具:

  1. Restlet:对此框架非常满意。我们的restlet层是非常简单的代码。
  2. JDBC - >注意:我们已经调整了维基中的基本内容
  3. XML(很快,JSON)
  4. buildr,maven在几个我不想转换的项目上(加上​​Nexus和Hudson)。我正在尝试使用sbt,这对于scala项目来说已经非常了。
  5. 我们在重用任何旧的Java库时完全没有问题,但我们确实倾向于将它们包装在scala-fied层中。主要是为了编写更少的代码。

    pimp my library模式是迄今为止最熟悉的模式。 “蛋糕”模式很好,但你必须控制实例化,这有时不太有用。我也在混合环境中使用Guice,也不是很难。但我发现混合代码没有我原先想象的那么有用,尽管这可能是因为我正在替换很多非常非常糟糕的Java代码。

    我的编辑环境主要是OS X上的TextMate,但我们部署在Linux服务器上。

    P.S。是的,我知道这是大约4个月大,但无论如何。这是相关的,特别是现在我们有一些经验。

答案 3 :(得分:2)

我已经在Kepler任务科学运营中心使用的软件基础设施中添加了clojure。现在它在那里进行交互式调试;运行REPL,加载一些类并以临时方式执行方法。

编辑:好的,所以“加载一些类和执行方法”是模糊的。例如,我们可以加载我们的crud类,然后执行方法将一种航天器时间转换为另一种。

user=> (import '(gov.nasa.kepler.hibernate.dr LogCrud))
user=> (def crud (new LogCrud))
#'user/crud
user=> (def shortCadences (.longCadenceToShortCadence crud 0 2500))
user=> (prn shortCadences)
#>

可以调用其他方法将此时间转换为其他类型的时间格式,这可能对调试很有用。我们可以创建命令行工具来封装所有这些功能,但是没有必要,因为clojure可以提供所有内容。

答案 4 :(得分:2)

答案 5 :(得分:2)

我在相关的链接上看到了这一点,并且认为我已经插话了,现在我们已经过了几年了。

IDE支持已经有了很大的改进,IntelliJ 11在这一点上有很好的Scala支持。语法突出显示效果很好,虽然调试仍然有点烦人。

SBT看起来很快就会取代maven或者蚂蚁/常春藤,感谢上帝,SBT比Maven更容易使用,并且更适合Scala。 IntelliJ for one也有一个SBT控制台,结合交互式调试可以使Scala中的调试确实非常快,虽然说实话,语法高亮现在变得非常好,我发现我需要的调试量大大减少了。 Scala的流程比Java好得多,并且似乎导致更容易出错的代码。

数据库交互似乎仍然有点悬而未决,但是有一些框架可以让你以一种或那种方式快速地使用数据库。

此时第三方库和框架比比皆是,当然你仍然可以使用任何普通的旧的第三方库。

此时,我还在问这个问题:为什么不为项目使用Scala或其他下一代JVM语言?虽然简单的答案是,许多开发人员今天还没有准备好与Scala打交道,但是老实说,他们需要得到他们的集体评估并进入游戏,并且公司要求它的使用将会持续很长时间实现这一目标的方法(我们所有人都需要推动有时回到游戏中)。此外,如果您正在进行任何类型的“企业”或大批量开发,并且您不了解函数式编程并且无法弄清楚,请帮我们一个忙,放下您的IDE或者上帝 - 禁止vim,坚持脚本或寻找新的职业道路。

今天有许多知名公司利用Scala,其中最公开的可能是Twitter。他们也将一些框架贡献给了开源世界。

答案 6 :(得分:1)

是的,人们正在使用Scala(和Clojure)构建实际的“企业”应用程序。就这么做。

当然,人们也在使用Smalltalk,所以如果你喜欢Smalltalk,为什么不使用呢?

答案 7 :(得分:0)

我曾在“试用愤怒”中使用过一次,加载了几千兆字节的数据(我们所做的工作量相当轻松)。我希望它比PyPy具有更高的性能和更少的内存开销。在内存使用方面,它失败了。非常糟糕,我感到非常震惊,不好意思谈论它,再也没有看过它。