写点什么

Scala 复合但不复杂,简单却不容易

2020 年 4 月 21 日

Scala复合但不复杂,简单却不容易

编者按:本文节选自华章科技出版的 《Kotlin 核心编程》一书中的部分章节。


Scala 是洛桑联邦理工大学的马丁(Martin Odersky)教授创造的一门语言。他也参与了 Java 语言的发展研究工作,在 Java 5 中引入的泛型就是他的杰作。事实上,在 Java 刚发布的时候,马丁教授就开始了 Java 的改良工作——他在 JVM 平台探索函数式编程,并发布了一个名为 Pizza 的语言,那时就支持了泛型、高阶函数和模式匹配。


然而,在随后的探索过程中,他渐渐发现 Java 是一门具有硬性约束的语言,在某些时候不能采用最优的方式来实施设计方案。因此,马丁教授和他的研究伙伴决定重新创造一门语言,既在学术上合理,同时也具备实用价值。这就是开发 Scala 的初衷。


学术和工业的平衡

Scala 是一门非常强大的编程语言,正如它名字(Scalable,可拓展)本身一样,用 Scala 编程就像拥有了哆啦 A 梦的口袋,里面装满了各种编程语言特性,如面向对象、函数式、宏。


Scala 不仅在面向对象方面进行了诸多的改良,而且彻底拥抱了函数式。因此 Scala 也吸引了函数式编程社区很多厉害的程序员,他们将函数式编程的思想注入 Scala 社区,如此将使用 Scala 进行函数式编程提高到了新的高度。


由于 Scala 设计者学院派的背景,以及 Scala 某些看似“不同寻常”的语法,使它在发展早期(甚至现在)经常被描述为“过于学院派”,以至于马丁教授在某次 Scala 大会的演讲时,自嘲“Scala 真正的作用是将人引向了 Haskell”。


然而,真实的 Scala 却是在不断地探索学术和实用价值两方面的平衡。不可否认的是:


  • Scala 已经成为大数据领域的热门语言,明星项目 Spark 就是用 Scala 开发的,还有很多其他知名的项目,如 Akka、Kafka 等。

  • 越来越多的商业公司,如 Twitter、PayPal、Salesforce 都在大量使用这门语言。


另外,Scala 也确实是一门有着较陡的学习曲线的语言,因为它强大且灵活,正如马丁教授所言,Scala 相信程序员的聪明才智,开发人员可以用它来灵活选择语言特性。但学术和工业的平衡始终是一个难题,与 Java 严格标准相比,Scala 的多重选择也常常因复杂而被人吐槽。


复合但不复杂

那么,Scala 真的复杂吗?我们不知听了多少次类似这样的抱怨。在搞明白这个问题之前,我们需要先弄清楚到底什么是“复杂”。在英文中,复杂一词可以联想到两个单词:complex 和 complicated。实际上它们的含义截然不同,更准确地说,complex 更好的翻译是“具有复合性”。


Nicolas Perony 曾在 Ted 上发表过一次关于“复合性理论”的演讲。


什么是复合性?复合并不是复杂。一件复杂的事物是由很多小部分组成的,每一部分都各不相同,而且每一部分都在这个体系中有其自身的确切作用。与之相反,一个复合的系统是由很多类似的部分所组成的,而且(就是因为)它们之间的相互影响形成了一种宏观上一致的行为。复合系统含有很多互动的元素,它们根据简单的、个体的规则行动,如此导致新特征的出现。


马丁教授曾发表过一篇名为《简单还是复杂》的文章,表达过类似的观点。如果对搭积木这件事情进行思考,摩比世界提供了固定的方案,而乐高则提供了无穷的选择。然而,前者的零件种类和数量都比后者要多得的。类似的道理,编程语言可以依靠功能累加来构建所谓的语法,同样也可以通过简单完备的理论来发展语言特性。在马丁教授看来,Scala 显然属于后者,它并不复杂,而且非常简单。


简单却不容易

事实上,函数式编程最明显的特征就是具备复合性。函数式开发做得最多的事情就是对需要处理的事物进行组合。如果说面向对象是归纳法,侧重于对事物特征的提取及概括,那么函数式中的组合思想则更像是演绎法,近似于数学中的推导。


“简单”的哲学也带来了相应的代价:


  • 这是一种更加抽象的编程范式,诸如高阶类型、Typeclass 等高级的函数式特性虽然提供了无比强大的抽象能力,但学习成本更高。

  • 它建立了另一种与采用 Java 面向对象编程截然不同的思维模式。这种思维方式上的巨大差异显然是一个极高的门槛,同时也是造成 Scala 令人望而却步的原因之一。


Scala 在选择彻底拥抱函数式的同时,也意味着它不是一门容易的语言,它无法成为一门像 Java 那样主流的编程语言。事实上,即使很多人采用 Scala 来进行开发,也还是采用类似 Java 的思维模式来编程。换句话说,Scala 依旧是被当作更好的 Java 来使用的,但这确实是当今主流编程界最大的诉求。


在这种背景下,Kotlin 作为一门 JVM 平台上新兴的编程语言,悄悄打开了一扇同样广阔的大门。


图书简介https://item.jd.com/12519581.html?dist=jd



2020 年 4 月 21 日 10:031099

评论

发布
暂无评论
发现更多内容

编写令人愉悦的API接口(二)

陈云轩

Java APi设计 接口规范

阿里巴巴首发架构师必知必会的必备SpringMVC实战架构文档,你不来了解一下?

Java成神之路

Java 程序员 架构 面试 编程语言

就这一次,学习完包括 Java这些知识点,必拿大厂50W年薪offer

Java成神之路

Java 程序员 架构 面试 编程语言

从中心到边缘,IoT正变为互联网之上的一张大网

华为云开发者社区

物联网 IoT 网络

如何阅读别人的源码

熊斌

学习 Code Review 源码阅读 七日更

大神带你一睹为快!阿里技术官亲自码了“2000页的Spring全家桶笔记”真牛逼!

比伯

Java 编程 程序员 架构 计算机

区块链数字货币多币种钱包开发案例

系统开发咨询:I76-883I-5I52 邓森

阿里P8整理出Nginx笔记:Nginx应用与运维实战核心篇

996小迁

Java nginx 架构 面试

波场智能合约系统开发技术方案丨智能合约DAPP系统开发源码

系统开发咨询:I76-883I-5I52 邓森

SpacePX挖矿系统APP开发|SpacePX挖矿软件开发

开發I852946OIIO

系统开发

ECS实践案例丨逻辑卷的创建和扩容操作指导

华为云开发者社区

数据库 数据 服务

顶会两篇论文连发,华为云医疗AI低调中崭露头角

华为云开发者社区

人工智能 医疗 华为云

你不好奇 Linux 网络发包过程吗?

小林coding

Linux 操作系统 网络

程序员必看的Redis6.0多线程性能测试结果及分析 你看懂了嘛?

比伯

Java 编程 架构 面试

应对游戏业务的四大“崩溃”场景有妙招,安全畅玩不是梦!

华为云开发者社区

游戏 场景 崩溃

用 JavaScript 实现寻路算法 —— 编程训练

三钻

Java 算法 前端进阶训练营 七日更 寻路算法

饿了么刚给我确认了p7的职位,对自己的经历,做一个面试总结。

Java成神之路

Java 程序员 架构 面试 编程语言

阿里p7耗时10个月整理出这些微服务、Nginx、Kubernetes核心技术知识点,真香

Java成神之路

Java 程序员 架构 面试 编程语言

APP专项测试 —— 弱网测试

行者AI

测试

滴滴Java后台3面题目:网络+内存溢出+各种锁+高性能+消息队列

Java架构之路

Java 程序员 架构 面试 编程语言

Nice!有了这份Alibaba内部 “Java面试宝典”,跳槽面试稳了

Java架构之路

Java 程序员 架构 面试 编程语言

真香!阿里P8耗时半年著作660页Java高并发与网络编程实战总结

Java架构之路

Java 程序员 架构 面试 编程语言

高性能MySQL

田维常

MySQL

滴滴内部框架手册:Spring5+SpringMVC3+MyBatis3.X

Java架构追梦

Java spring 架构 mybatis springmvc

使用LL算法构建AST —— 编程训练

三钻

Java 算法 前端进阶训练营 七日更

传统数仓如何转型大数据

数据社

大数据 数据仓库 七日更

软件测试的方法

测试人生路

软件测试

用 JavaScript 实现一个 TicTacToe 游戏 —— 编程训练

三钻

Java 算法 游戏开发 前端进阶训练营 七日更

从根上理解高性能、高并发:深入计算机底层,理解线程与线程池

程序员小毕

Java cpu 多线程 高并发 线程池

架构师训练营第 1 期 第 13 周作业

李循律

极客大学架构师训练营

四年Java开发,刚从美团、京东、阿里面试归来(已拿offer),分享个人面经

Java架构之路

Java 程序员 架构 面试 编程语言

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

Scala复合但不复杂,简单却不容易-InfoQ