`
xzer
  • 浏览: 16222 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

我为什么放弃scala

阅读更多

说起来放弃scala已经快一年多了吧,今天早上突然心有所感,觉得还是写出来记录一下吧。

 

首先呢,所谓放弃,其实也不完全,我手上还有新作的代码仍然是选择scala的,因为scala支持多行字符串,而我的某些程序几乎80%的代码都是sql,scala代码只是作为胶水存在,这个情况下,scala显然比java方便。不过,因为多行字符串选择scala这样的理由显然太特殊了,所以从一般意义上说,我仍然是放弃scala了。

 

其次,我仍然觉得scala是非常好的语言,很多东西都非常漂亮,这里我只想用一句话来形容我的感受:“那都是很好很好的,可是我偏不喜欢”。嗯,今天早上就是突然想到了李文秀这句话,然后才觉得无论如何还是要写一篇文章来记录一下。

 

好了,言归正传,我为什么要放弃scala呢。细数起来可以数上很久,但根本的原因,还是对scala的函数式编程的思维方式无法认同吧。写到这里,大概有人要喷了,哦哦哦,你智商不够,所以理解不了函数式编程的美妙之处。我想说的是,其实我也认同这一点啊,智商不足的人的确很难理解函数式编程的美妙。不过智商这个说法略微有点不雅,我且换一个平和点的说法,不擅长数学的同学大概都不大容易理解函数式编程的内涵。那我是不是也因为不擅长数学所以无法理解呢?

 

事实是我还是很擅长数学的,但是呢,也没有擅长到学霸的地步,我的数学能力差不多可以算是踩在学霸的门槛上,一方面在学渣们眼中呢,我的地位就是学霸了,但在真正的学霸眼中呢,对我多少还是有些同情的,这家伙真可惜啊,总是差点意思。

 

不过这样的数学能力,或者更广泛的说,我在理工科方面的智力水平也差不多是同样的,踩在学霸门槛上接受学霸们的同情,这样的水平,倒是给我了一个独特的视角和感受,让我在接触和使用scala的一年多的时间中,有了一些跟一般使用者不同的体会。

 

一般对于函数式编程的评价,是很极端的,赞成的人,会大声疾呼,函数式编程才是王道和未来,一旦品尝了函数式编程的美味,你就没法再用其他方式写代码了。而另一方面,不赞成的人呢,一般的态度就是,哦,这玩意儿太难了,完全理解不了嘛,有必要把简单的事情搞这么复杂吗?

 

我的数学最搞不定的是什么呢,通常就是最后压轴的证明题,哦,我真的推导不出来那个结果啊,即使我看了答案之后会恍然大悟,但考试的时候,我真的就是想不明白,绕不过来呀,运气不好的时候,压轴两道题都是证明题,我基本也就拿点步骤分,好了,扣掉20,运气好的时候,最后会有一道复杂的计算题,哦也,我最喜欢计算题了,再复杂我都能算出来,哪怕整张卷子都被我写满了计算式,哪怕我的计算方法和过程跟标准答案差得老远,但我都能算出来,没办法,我就是擅长计算啊,这个时候我就能多拿10分,反而,很多同情我的学霸们,经常会在复杂计算题上栽跟头,哦也,我也同情他们。

 

说这么多废话想说明什么呢?我的感受就是,函数式编程类似于证明题,你已经知道答案了,你需要用数学的方式将这个结果推导出来,即使你已经做过无数的练习题目,但遇到一个难题,你可能就是推导不出来,而面向过程的编程则不同,更类似于计算题,只要做的练习足够多,你总能找到step by step的计算的路子。

 

我用scala的时候,其实我还是能享受到一些乐趣的,对于大多数日常的编程任务,用scala函数式编程,还是java过程式编程其实对我区别是不大的,而函数式编程的简洁优雅的确还是让我很享受的。但是问题是,对于一些稍微复杂的问题解决,我真心没法用数学的函数来进行推导,我觉得用面向过程的方式解决起来明显更加方便。当然,scala本身也支持java style的编程,但这不是问题的关键,关键是思维方式的切换,如果不用函数式编程,我用scala还有什么意义?多行字符串?

 

另外,我身边大爱scala的三个同事,两个是大学数学系出生,另外一个是计算机系做自然语言分析出生的,他的世界基本也只有各种函数了(他的代码也是最函数的,经常让我抠脑袋),我觉得这不是巧合而是必然,只有更习惯数学思维的人,才会更习惯和喜欢函数式编程。

 

综上,我放弃scala第一个原因就是,在函数式编程的过程中,我享受到的愉悦并没有超过我感受到的痛苦,所以,我并不介意放弃scala。

 

接下来,说第二点,稍微具体一些的理由,scala世界中的缩写和符号太多了,多到让人畏惧的地步,刚开始的时候我其实真的理解不了为什么有人会这么喜欢简短的变量名和符号,后来我发现我身边真的有同事从来不使用编辑器的代码提示功能,所有的类名,变量名,函数名都是全部手工输入的时候,我终于明白了,对于脑容量够大的人来说,使用代码提示等待的时间成本,是远远大于记住所有需要记住的东西然后以极快的手速输入的成本的。这里,我无意争论说谁更方便,我自己一直是不记任何东西完全依赖IDE的代码提示的,所以java世界的裹脚布一般的类名和方法名从来没有让我困扰过,而我那些完全依赖手工输入的同事们,一提起java就摇脑袋,太啰嗦了。这大概就是个人习惯的不同,或者说,人生哲学的不同吧。。。

 

这就是第二点放弃scala的理由了,简短的代码不但没有让我提高效率,反而因为IDE的不成熟代码提示功能的不完备加重了我的负担,我不得不额外记忆更多的东西,额外输入更多的东西,这让我不大舒服。

 

接下来,说说大概容易被喷的第三点,scala社区有一种高智商的傲慢情怀,在scala的官网论坛上,我经常会看到类似的帖子:某人问,这个问题用scala怎么解决呀,某人很热心的回答,说哎呀,这个用scala太简单啦,3行代码就搞定了,然后给出了3行天书。这些天书代码呢,我通常需要花一点时间才能理解过来,然后我就很在意回答者说,“这个太简单了”,简单你个妹呀,我这个算是站在学霸门槛上的人还能勉强应付一下,你让那些还没进门的人怎么办?割腕上吊么?老实说我搜到这样的帖子,一般来说,是因为我有同样的问题需要解决,我看到了3行天书,花了3分钟理解它,然后在自己的代码中使用它,对我来说,谈不上有多痛苦,但要说愉快,也是绝对谈不上的,我没法享受超过我智商水平的娱乐。

 

最后,说说我对函数式编程的未来的一些看法,纯粹的函数式编程模式或者语言,haskell或者scala是很难称为主流的,理由就是我的第一点,并不是所有人都习惯和擅长数学式的思维方式的。但另一方面,函数式编程语言,尤其是scala,在编程的效率和简介性方面的尝试,是非常有意义的,java8引入lamda我觉得很大程度上应该是来源于scala的努力。scala的未来仍然是光明的,java永远不会变成scala,而喜欢函数的程序员,仍然会更倾向于scala。

 

题外话,我经常跟同事描述我为何不喜欢scala和函数式编程,一个非常敏锐的同事立刻提出了一个让我为难的问题:你不喜欢函数式编程为啥那么喜欢javascript?哦,哦,哦。。。。这个。。。再议。。。。。

2
3
分享到:
评论

相关推荐

    web3j-scala:围绕以太坊的Web3J的轻量且惯用的Scala包装器

    2020年5月8日:我已经放弃了这个项目,并且不会对其进行更新。 如果有人想接管,请与我联系。 -迈克 Web3J-Scala库 web3j-scala是 for Ethereum的惯用Scala包装器。 Web3J是一个轻量级的,React性的,类型安全的...

    future.scala:堆栈安全的异步编程

    我们放弃了Stateless Future内置的async / await支持,转而使用了提供的更通用的monadic / each语法。 future.scala提供类似于scala.concurrent.Future或scalaz.concurrent.Task的API,但scalaz.concurrent.Task...

    sbt-ctags:SBT ctags是一个SBT插件,它将为您的Scala项目生成ctags

    除了项目本身的Scala / Java源代码外,它还为您的项目依赖项解压缩源jar,并为这些依赖项源生成ctag。 发行说明 只想了解最新版本中的新增功能? 查看。 设定 添加插件依赖 将以下内容添加到~/.sbt/1.0/plugins/...

    积分java源码-scala-collection-laws:为整个集合库部分自动生成测试

    这些测试被表达为一系列“法则”:单行(主要)表达的关系应该适用于某些或所有集合。 这些定律由代码生成器写入一系列特定于集合的测试中(以便还测试隐式解析等),这些测试可以通过方法调用运行,以便检查结果,...

    scala-2.11.8部署安装-附件资源

    scala-2.11.8部署安装-附件资源

    isodata的matlab代码博客-scala:所有▲算法在Scala语言中的实现

    什么是算法? 非正式地,算法是任何定义明确的计算过程,它采用某个值或值集作为输入并产生某个值或值集作为输出。 因此,算法是将输入转换为输出的一系列计算步骤。 一个算法应该具有三个重要的特征才能被认为是...

    try:尝试成功失败Scala API for Java的实现

    Scala的Java 8成功尝试失败 该API是的Java 8实现,最初由工程师实现,后来又添加到Scala标准库中... 请注意,我并不是在这里说必须放弃try-catch方法,而使用Try-Success-Failure 。 确实,在某些情况下,您会使用传统

    nine-cards-v2:在Android上使用Scala构建的开源Android启动器

    9张卡9 Cards是Android的开源家庭启动器,其代码全部用Scala编写。 它提供了将应用程序组织到集合中的功能,可以随意随意快速,轻松地访问更常用的应用程序。 自2019年1月起,9卡牌项目现在被放弃,该应用程序在...

    gradle-8.0.2-all.zip 快速下载

    +悄悄地放弃了对自定义编译器的支持JavaCompile 4. 在Gradle 8和7.6中,InstrumentingTransformer生成不同的类文件,这会导致远程构建缓存未命中 5. 扩展已经解析的配置不再正常工作 6. 更新某些插件的配置缓存状态 ...

    workbench-libs:工作台实用程序库

    工作台库有关更改工作台库的信息,请...添加Util2是因为util需要为firecloud-orchestration支持2.11,但是许多库开始放弃2.11支持。 Util2不支持2.11。最新的SBT依赖项: "org.broadinstitute.dsde.workbench" %% "w

    积分java源码-match-block:[ABANDONED]模式匹配块作为值

    注意:该项目已被放弃。 模式匹配块作为值。 ![数据所有的东西]() 将抽象转化为一流的值使我们能够对它们进行抽象和组合,并且通常会产生概念上更简单的模型。 一流的东西一直是 Clojure 的一个共同主题,在那里它被...

    jdk8解压版jdk-8.rar

    版权声明:本文为CSDN博主「从放弃到开始」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_30764991/article/details/80558708

    awesomo:以C,C ++,Clojure,Lisp,Elixir,Erlang,Elm,Golang,Haskell,JavaScript,Lua,OCaml,Python,R,Ruby,Rust,Scala等编写的很酷的开源项目列表

    AWESOM O是用各种语言编写的有趣的...执照awesomo通过 在可能的情况下,法律规定,谁与相关CC0人awesomo已放弃所有版权及相关或邻接权来awesomo 。 您应该已经与这项工作一起收到了CC0法典的副本。 如果不是,请参阅 。

    equals-hashcode-processor-1.0.0.zip

    retry.zip,用于异步重试scala futures的简单原语库,因为您不应该放弃,至少在第一次尝试时不应该放弃。

    Api-sangria.zip

    Api-sangria.zip,scala graphql实现sangria是scala graphql库。,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了...

    smircd:标量最小的IRC守护程序

    它能做什么 支持以下IRC命令: 缺口 放弃 离开 味精 注意 加入 离开 踢 话题 支持以下命令,但不完整: 列表 名字 它没有做的事情(还) 除了以上列表中缺少的命令外,值得注意的缺失功能包括: 密码-SmIRCd会...

    基于JavaEE的快速开发框架

    Hibernate是后来又补上的,最早的版本没有是因为第一个版本是为游戏服务器架构的,唯快不破的准则放弃了Hibernate,而后面增加回来是基于后台管理功能的需要。这一过程纠正了我一个开发框架中只能存在一个ORM的想法...

    JsonParserGenerator:(已放弃)我们有一个更好的方法来生成 JSON、protobuf、SQLite 数据库模式。 但我们没有时间开源

    但使用 Scala 原始值,如: lazy val Tag = ObjectType ( " Tag " , Seq ( Field ( " value " , " value " , StringType ), Field ( " category " , " category " , StringType ))) 一个小缺点是,如果数据是递归的...

    riff-raff:监护人的部署平台

    这些工件的路径格式为project-name/build-number 使用AWS SDK和进行资源发现将配置,历史记录和日志存储在PostgreSQL数据库和少量DynamoDB表中(最终目的是完全放弃DynamoDB)文献资料该文档可在应用程序中找到...

    Api-cornichon.zip

    Api-cornichon.zip,scala dsl用于测试http json api请参见http://agourlay.github.io/cornichon/以获取所有文档。,一个api可以被认为是多个软件设备之间通信的...通过提取实现并将数据放弃到对象中,api简化了编程。

Global site tag (gtag.js) - Google Analytics