Yes, Virginia, Scala is hard
首先要说的是,我是一个Scala粉丝,我作为一个Scala语言的倡导者差不多有5年历史了。我写了不少Scala语言方面的书和文章。我曾在数十个公司里做过Scala和Lift框架项目的开发。我对很多的Scala项目进行过代码审查。
我过去以为Scala很简单。它过去确实很简单,而且一直很简单,它是治疗Java里很多问题的良方。从“有些使用Java显的异常的困难或不可能
的事,使用Scala却非常容易”的角度,Scala是一种非常简单的语言。Scala处理集合问题超级的容易。业务逻辑的相互独立会使程序变得更容易维
护,Scala相对Java来说更方便达到这样的目标。
那么,Scala难在哪里?下面是我能想出的最主要的几条:
- Scala想要的东西太多。你可以拿Scala像Java那样编程。这是一种福气,也是一种诅咒,但我从长远的角度看,更多的是一种诅
咒。关于它的面向对象vs
面向函数的争议太多。对于小的开发团队,这些争议和你所采取的选择关系不大,但当你的团队有相当的人数,你试图教会这些Java程序员使用Scala,而
他们又非真心的想学时,这成了相当讨厌的事。Scala语言的巨大优势会在你使用函数式编程时不言自明的显露出来,但如果你只把自己当成面向对象的程序
员,它的优势你是不可能看到的。对于这种情况,较少功能特征/可选性的语言(例如Java或Ruby)就显得容易些。你不用费脑筋去做出选择。 - 集
成开发工具对它的支持很弱,而且以后也不会改善。Scala的Eclipse插件很差劲。从此我开始使用Scala语言五年来一直很差劲,它总是让人感觉
“可以做的更好”,但却一直这样差劲。IntelliJ对Scala的支持还凑合。但在IDE里需要使用各种模式的人会找不到一个好用的。Scala的模
式各式各样又互不关联,如果你不讨厌使用Emacs或Vi或TextMate编程,那使用IntelliJ开发Scala是个不错的选择。如果你期待着一
个像Java
IDE那样的东西,你找不到,而且永远找不到,因为Scala的强大能力是不能通过简单的模板表现出来的,你需要提供太多的信息资源给IDE,它里面的类
型安全(TypeSafe)检查的复杂,即使你银行里有3百万美元,也没有公司敢出来担保。 - Scala的类型系统异常的强大,但它却让你茫然不知所措。在ScalaDocs里,类型符号复杂的让人恐怖。看着flatMap [B, That] (f: (A) ⇒ Traversable[B])(implicit bf: CanBuildFrom
[List[A], B, That]) : That,是不是会让你有想逃的感觉?这是一个初学者每天都会用,一天用20次的方法,很恐怖吧。Scala的文档须要一种调整来隐藏它的复杂度,让人们在实际使用中更容易的获取这flatMap的强大能力。类型系统以及相关的文档需要一种更简化的形式,把复杂性隐藏在程序包内,对最终用户要表现出简单的接口。 - 当
新程序员来维护老程序员写的Scala代码时,需要去理解代码中的风格和模式。Scala的代码会使业务逻辑直接表现在最外层(而不是循环语句或复杂IF
语句四处分布),如果代码中存在风格习惯,业务逻辑就不是那么直接。没有风格也是个问题,但最终,整个团队需要统一接受这样的风格模式。在Ruby和
Rails编程中也是这样,hashmap替代了所有其它种的编程方法。但在Rails里,风格是统一的(尽管没有类型检查),人们很容易理解,因为它就
是这种“方式”。在Java里,代码模板由IDE生成,程序员养成了很容易发现其中的模式的能力。但在Scala中却不是这样,各种风格迥异,每个开发团
队里都不相同。
我知道有很多的开发团队,在他们的团队组织形式里,采用Scala语言会比使用Java或Ruby或其它语言要合适的多,Twitter公司就是这样的
一个典型例子。他们需要一个简洁的,具有类型检查的,高性能的语言和运行环境。Scala满足了他们的这些需求。Foursquare公司以Scala的
难度作为一种过滤制度。你只有学好了Scala语言才能在这个公司立足。
但如果你的团队的技术水平很一般,Scala也许对你们公司来说并不是一个好的选项。Scala的难度导致很陡的学习曲线,会遭到原有的程序员的反对,形成不了统一的风格。你需要一个强有力的CTO或架构师来强迫这种风格,而不是让他们自己从书中学习。
那么,如何能看出Scala在你们的团队中会是很“简单”还是很“难”呢?
- 如果你的公司在JavaOne大会,或OSCON,Strangle Loop,或QCon大会上有出席发言的人:Scala对于你们来说会很简单
- 如果吃饭时间你们还在讨论如何从一个普通程序员成长成高级程序员:Scala对你们来说会很难
- 如果需要的话,你可以用NotePad编程:容易
- 当看到”Zed Shaw”时,你的程序员面无表情或连说3声“万福玛利亚!”:Scala==难
- 程序员在Twitter上关注Dean Wampler:Scala 简单
- 你的程序员9:15到公司,晚上不看有没有邮件:难
现在你们知道了。我完全同意这样的观点:对于水平一般的团队,Scala很难。并不是它本身很难,而是因为它在水平一般的团队中不会产生那种由技术很好的人组成的团队中产生的短期或长期的益处。
一些评论:
- 不错,Scala的类型系统很强大,由它产生了很多优美的程序代码,例如Scala的集合。参考See http://stackoverflow.com/questions/1722726/is-the-scala-2-8-collections-library-a-case-of-the-longest-suicide-note-in-histo 和 http://www.scala-lang.org/docu/files/collections-api/collections-impl.html。
但是,对于Scala,从一个语言设计者/程序库创造者的角度,和从一个普通程序员的角度,他们的需求是不同的。我个人认为,在开发Lift框架时,我认
为没有第二种语言能像强大的Scala语言那样让我准确的表达。所以,作为一个程序库的开发者,我喜欢Scala语言。我还慢慢认识到,Lift框架对于
一般程序员来说似乎太难。作为一个懂得类型标记(signature)的程序库使用者,我喜欢Scala。但我不是一个普通水平的程序员,大多数并不认为
Scala很难的程序员都不是普通水平。 - 不错,改进ScalaDocs,让它有“简单”视角和“架构”视角,这将带来巨大好处。但这些只是个开始,远没有结束。
- 我
明确的反对“那好,我们找更好的程序员”的做法。我们可以通过提高我们的程序员的水平来解决“Scala很难”的问题。但这不是问题的症结。症结在
于,Scala并不够足够的好,没有能力迫使在培训、教育、招聘领域产生变革,迫使广大的一般水平的程序员提高技术来适应Scala的难度。 - 我并不怀疑阅读这篇文章或看我的Twitter的人都是很有水平的程序员,Paul Snively,你水平这么高,Scala对你来说是小儿科了。
[本文英文原文链接:Yes, Virginia, Scala is hard ]
--laf com.jtattoo.plaf.aero.AeroLookAndFeel -J-Duser.language=zh -J-Duser.country=CN -J-Dscala.home=/home/lufax/scala-2.11.2
Yes, Virginia, Scala is hard的更多相关文章
- Scala很难!
Scala很难! 本文是从 Yes, Virginia, Scala is hard 这篇文章翻译而来. 首先要说的是,我是一个Scala粉丝,我作为一个Scala语言的倡导者差不多有5年历史了.我写 ...
- jdb调试scala代码的简单介绍
在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...
- scala练习题1 基础知识
1, 在scala REPL中输入3. 然后按下tab键,有哪些方法可以被调用? 24个方法可以被调用, 8个基本类型: 基本的操作符, 等: 2,在scala REPL中,计算3的平方根,然 ...
- 牛顿法求平方根 scala
你任说1个整数x,我任猜它的平方根为y,如果不对或精度不够准确,那我令y = (y+x/y)/2.如此循环反复下去,y就会无限逼近x的平方根.scala代码牛顿智商太高了println( sqr(10 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- Scala化规则引擎
1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...
- Scala快速概览
IDEA工具安装及scala基本操作 目录 一. 1. 2. 3. 4. 二. 1. 2. 3. 三. 1. 2. 3. 4. 5. 6. 7. 四. 1. (1) (2) (3) (4) (5) ( ...
- Scala Macros - scalamela 1.x,inline-meta annotations
在上期讨论中我们介绍了Scala Macros,它可以说是工具库编程人员不可或缺的编程手段,可以实现编译器在编译源代码时对源代码进行的修改.扩展和替换,如此可以对用户屏蔽工具库复杂的内部细节,使他们可 ...
- Scala Macros - 元编程 Metaprogramming with Def Macros
Scala Macros对scala函数库编程人员来说是一项不可或缺的编程工具,可以通过它来解决一些用普通编程或者类层次编程(type level programming)都无法解决的问题,这是因为S ...
随机推荐
- python 学习笔记十五 web框架
python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. Python的WEB框架分为两类: 自己写socket,自 ...
- linux -- nano
今天在git commit的时候碰到了一种编辑方式 -- 不会用 T.T,然后找了下相关的文档. ^G -- ctrl+g 帮助文档 ^O -- ctrl+o 写出,会出现下面的一行提示,是否保存,直 ...
- 注释声明:TODO HACK XXX FIXME REVIEW
注释有时候也可以用来给一段代码声明额外的信息.这些声明的格式以单个单词打头并紧跟一个冒号.可以使用的声明如下. TODO: 说明代码还未完成.应当包含下一步要做的事情. HACK: 表明代码实现走了一 ...
- 建立docker私有库(docker registry)(转)
建立docker私有库(docker registry) 博客分类: docker 我的目标还是无互联网安装,部署内部的docker私有库,目前docker镜像的获得还是需要互联网,将下载好的do ...
- Java selenium web页面的滚动条操作
摘录自:http://blog.csdn.net/iceryan/article/details/8162703 //移动到元素element对象的"顶端"与当前窗口的" ...
- Python3基础 列表之间+ 合并,不去除重复项
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- jquery.dataTables--插件使用方法
本文共四部分:官网 | 基本使用|遇到的问题|属性表 一:官方网站:[http://www.datatables.net/] 二:基本使用:[http://www.guoxk.com/node/jqu ...
- MySQL + Atlas --- 部署读写分离
阅读目录 1. 数据库用户配置 2. 主从数据库连接 3. Atlas配置 4. 读写分离测试 序章 Atlas是360团队弄出来的一套基于MySQL-Proxy基础之上的代理,修改了MySQL-Pr ...
- Ubuntu 修改 ssh 登录后的欢迎信息
/etc/update-motd.d/90-updates-available cd /etc/update-motd.d/ vi 10-help-text 修改或者注释掉里面的内容 vi 90-up ...
- html5画布基础
canvas 元素用于在网页上绘制图形. 什么是canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canva ...