Scala的抱怨

         
banq 13-12-04

一篇博文Scala — 1★ 不再想编程了的狂哮引起Scala社区轩然大波。Scala创始人Martin在google group回复了:Martin Odersky about the recent scala rant on scala-debate google group

该博文是一段引用名言开始:

当你使用Scala感觉自己非常聪明,是以一种美丽的方式编程时,你环顾四周,告诉你的clojure同学你是多聪明,你却发现他已经在三个小时以后离开了,并且发了一个如何使用Map的帖子。---Daniel Worthington-Bodart

我认为它是一个不人道的语言,我惊奇竟然有人创造它还让其他人使用它。 --Clinton Begin

博文作者是从六年前开始接触Scala,使用Scala作为内部构建脚步,选择Scala是糟糕的:
1.每次改变后编译构建要花去3分钟。
2.语法不透明,有时它是def,有时它是一个val,有时是=,有时还是一个括号,总体上感觉有人在我的脚本周围走来走去,随机丢下一些标点符号。

不过,我可以接受,也是是自己错误地使用了一个好的语言。当我在使用Haskell时,真的很享受类型推断。

但是, 在过去的两个星期,我为一个复杂的数据集使用Scala建立了一个简单的RESTful API以后,我再也不想再触碰Scala。

1.编译时间
在Scala中实现TDD几乎不可能,因为它的编译时间,一个很小的代码库仍然需要1分钟20秒。

2.库包和社区
过去三年的主要Javscript的开发经历中,我一直恼火于不断重新编写的库包,可怕的文档以及无视向后兼容。随着npm决定他们已经有足够好的依赖管理,他们从Bundler 从lvy等待学习了不少,当然这个过程还在进行中。

Scala社区方面,文档要么可怕要么不存在,库包从milestone 版本到candidate ,然后又快闪到milestone。

有人认为,Scala的灵活的语法和方法调用语法意味着它是用于创建DSL的一种伟大的语言,这是荒谬的,使用~将程序粘合在一起通过灵活的DSL?选择这样一个视觉特征非常明显的符号?象一个小黄瓜。

这些库包难以适应,无法想象他们是如何发布的,要是我会重写。

总体来说,我是希望一个语言社区把稳定作为一个目标。

下面关于魔术语法。

简单性是很难定义,它不一定是柔性,应该接近常规认识,比如Lisp Ruby和HyperTalk都是好例子,而applescript和perl是可怕的。

Scala是我见过最糟糕的,当你盯着Scala代码块时,你只能看到60%的代码,这个感觉我已经在CoffeScript中碰到过,你需要你的脑袋自动将CoffeeScript转为JavaScript,所以,你必须首先掌握Javascript。对于一个简单语言还算能接受。

但是Scala不是一个简单语言,比如一个HTTP抽象核心框架,我们无法搞清楚使用Spray到抽象的途径,通过那些组合的语法,其中到底发生了什么神奇的反应呢?

在剩余的几小时我们总算搞明白了。魔法语法的文档很差,这改变了我们的编程习惯,再也不能随便的复制粘贴代码了,我们进入了一个黑暗时代。

一切都是类型
Scala程序员真的很喜欢类型,我们碰到Http方面不只是一两个对象,而是大量,如一个请求上下文, 请求 响应, 大量的Http头部的指令和类型。

Http头部信息本身就被定义为简单的键值Map数据结构,你可以任意添加条目,不应该被框架约束着做这些事。

当然,这不是Scala语言关键,但是尊重共同习惯也是是一件易事。

本地类型推断
这是Scala真正的丧钟,Hindley-Milner Type Inference是一个奇妙的事情,任何程序员都应该学习一下。

但是Hindley-Milner Type Inference在Scala中可能由于JVM使用类型原因导致感觉好像被放了风筝。

当我们结束编程工作,一个函数因为没有任何类型,编译代码时输出有关警告:忽视返回类型(Long => Int),我只好将(Long => Int)复制到代码中再次编译。

相信我,我甚至使用过比这简单的代码但是也碰到这种情况,非常感谢Scala,你让我花力气去区别long和int。

问题是Scala你就不能在程序中知道执行完整的类型判断吗?还需要人去协助编译器工作,我真的不喜欢粘贴一些不透明的咒语,我是讲对于人,对于电脑则无所谓。

那些DevOps的计算机专家大概在网上聚会时,会哈哈大声嘲笑我们了。

我注意到Scala的抱怨主要来自于它是一个人迹罕至的语言,它的主要优先目的是尝试类型和函数语言的结合,其次才是可能会成为被广泛使用的语言。

在我脑海中,它没有一个保证使用的足够好的血统(banq注:老外种族血统观点很强烈,如同我们过去的家谱血统一样,老外真的还活在我们古人时代啊,太落后了。)












2
banq
2013-12-04 11:53

我提供了Scala入门教程来帮助了解Scala:
http://www.jdon.com/idea/scala/functional-programming.html

看来类型推断这事Scala做得还不够智能,这可能由于其是静态语言造成的,它不是动态语言,但是有动态语言很多特点,是动态语言+函数语言+;类型语言的四不像结合体。大家接受确实需要时间,但愿Scala的创新别成了先烈。

brighthas
2013-12-04 17:21

我不会scala,以前是教Java的,现在主要培训node.js和html5了。看到Banq大哥的这篇文章,才理解我的一个北京朋友说的意思。

他大概是说:Java让我很类,scala让我很无奈。

呵呵,这个老外大概也是这个意思吧。
[该贴被brighthas于2013-12-04 17:22修改过]

banq
2013-12-05 06:33


2013-12-04 17:21 "@
brighthas"的内容
现在主要培训node.js和html5了 ...


怪不得你能开发NodeJS开源CQRS框架呢,献丑一下我写的NodeJS教程:http://www.jdon.com/idea/nodejs/tutorial.html

欢迎多贴一些NodeJS资源。

SpeedVan
2013-12-05 08:49

终于看见抱怨了,这种抱怨还不够彻底。Scala真正弊端在其混合了函数和对象后,没有一个完整的逻辑系统。我只能说Scala是对函数和对象整合的一种尝试。

Haskell之所以用起来觉得是享受,是因为它的纯粹性和严谨性。

文中说Scala没有使用足够好的血统,我猜想其意思是:Scala没有一个完整的理论根基,就像函数式大多的血统是lambda。

Scala,过去我很提倡,那是因为我还没有遇到Haskell。

2Go 1 2 下一页