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