Scala的抱怨

一篇博文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注:老外种族血统观点很强烈,如同我们过去的家谱血统一样,老外真的还活在我们古人时代啊,太落后了。)


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

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

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

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

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


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

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

欢迎多贴一些NodeJS资源。

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

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

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

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

@SpeedVan
能否有空贡献分享一下haskell入门方面的教程或资源,外国也可以,如果我觉得好,我来翻译一下,如果你能直接翻译就更好,毕竟你比我了解得多。谢谢。


2013-12-05 08:49 "@
SpeedVan"的内容
Scala,过去我很提倡,那是因为我还没有遇到Haskell。 ...

请问你拿haskell都用来做哪些方面的开发呢?我最近也想学学haskell

Scala事件持续发酵:
paul phillips在scala 2013年大会发言:
Pacific Northwest Scala 2013 We're Doing It All Wrong

paul phillips是跟随Scala公司typesafe成长,5年scala经验,但是现在退出这个梦想队伍。他认为最大错误是在scala的Collection,试图通过继承抽象可变性,在可变类中,内部状态不可共享,在不可变类中,内部状态应该可以共享,而继承会破坏这种规则。

Scala在摇摆,在兼容和性能之间摇摆。..

回复观点:
语言的设计是很难的

paul phillips可能不是一个伟大的演说家,但他说的是很重要的,而且在很多情况下都是这样。 我同意了批评,但不同意所提出的解决方案,他的错误在于他认为语言有四层:Ant XML, Java, and Scala.
写一个很纯粹Scala是不需要Java的..

hacker news的讨论:
https://news.ycombinator.com/item?id=6845585

C已被广泛使用长达40年,Java差不多20年 。你可以每隔五年左右的时间切换语言,但是这意味着你没有在“主流软件开发”潮流,而是在某种硅谷启动项目中(其中软件开发是极少数)。主流软件开发者不会每五年切换语言,并且在大多数情况下,甚至每隔十年都没有,所以他们有得到更好的语言的权利。

但是,是什么让大家选择一个好的编程语言,是市场的结果,无论该语言的固有优点。

Ruby是伟大的短命项目; Java是非常适合大型的,复杂的项目,几十个或几百个开发人员。

Scala 作为一种新的编程语言,是适合的研究,但不适合广泛采用。

关键是一个语言要有一个大优点,Java依靠GC实现内存管理,Clojure和Erlang解决了并发和容错,一些语言比如Ruby ,紧紧围绕“开发人员的生产力” 做文章,这往往意味着更快地获得有用的代码,同时保持良好的可读性。

每一种语言必须解决的一个大问题,大到足以驱动大家去切换语言。

@banq

haskell相关资源官网基本全有,至于译本,real world haskell和learn you a haskell,有人专门为后者翻译为中文网站(繁体,简体都有)。然后官网有实用的实践(那个倒可以考虑翻译)。

@lostalien

haskell是深坑,一旦下去要学很多东西,但学成后,会对传统编程方式产生影响。haskell我并没有拿来实际开发,但对于一些技术难点,我都尝试用Haskell实现一遍。

每种语言都有自己的特点,JavaScript,Java也都一样,更不要说Scala了。
Scala目前是复杂,但它目前是把OOP和FP结合最好的。