楼主: Lisrelchen
2933 15

【GitBook】Thinking in Scala [推广有奖]

  • 0关注
  • 62粉丝

VIP

院士

67%

还不是VIP/贵宾

-

TA的文库  其他...

Bayesian NewOccidental

Spatial Data Analysis

东西方数据挖掘

威望
0
论坛币
49957 个
通用积分
79.5487
学术水平
253 点
热心指数
300 点
信用等级
208 点
经验
41518 点
帖子
3256
精华
14
在线时间
766 小时
注册时间
2006-5-4
最后登录
2022-11-6

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
Thinking in Scala

记录我对Scala的思考,或许说零散的,但对于理解Scala会有极大裨益。

Scala有些特立独行,却又融合主要语言的风格,既是学院派,又烙着工程的印迹。它似乎想一统OO和FP的江山,因此在设计中有着诸多奇技淫巧,诸多妥协,诸多灵便的特性,复杂起来,会让人无所适从,强大起来,又让人爱不释手,赏心悦目。Scala于程序员而言,有些像唐末诗人李贺,奇诡飘忽,诗风偏向于晦涩朦胧而又精简,因此爱他之人膜拜到五体投地,厌他之人却又弃之如敝履。Scala遭人热捧,遭人冷眼,何尝不让人叹息其命运。

总算坚持住了。AKKA与Spark直接催生了Scala的大热,Twitter与Linkedin又在其中推波助澜,非但使得Scala站稳了脚跟,眼瞧着还有大步前进的可能。究竟如何,拭目以待。

关于作者

张逸,现为BigEye Tech公司联合创始人,架构师,主要从事BI、BigData方面的研发工作。主要基于Spark与NoSQL、RMDBS进行数据分析和建模,并提供分析结果的可视化。之前就职于ThoughtWorks,作为首席咨询师,主要为客户提供组织的敏捷转型、过程改进、系统架构监理、领域设计、代码质量提升等咨询工作。

本帖隐藏的内容

Thinking in Scala.pdf (1.48 MB)


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Thinking think SCALA Book Thin 学院派 程序员 风格 工程 记录

本帖被以下文库推荐

沙发
Lisrelchen 发表于 2017-2-21 03:29:27 |只看作者 |坛友微信交流群
  1. 快速了解Scala技术栈

  2. 若要了解Scala技术栈,并快速学习这些框架,一个好的方法是下载typesafe推出的Activator。它提供了相对富足的基于Scala以及Scala主流框架的开发模板,这其中实则还隐含了typesafe为Scala开发提供的最佳实践与指导。下图是Activator模板的截图
复制代码

那么,是否有渠道可以整体地获知Scala技术栈到底包括哪些框架或工具,以及它们的特性与使用场景呢?感谢Lauris Dzilums以及其他在Github的Contributors。在Lauris Dzilums的Github上,他建立了名为awesome-scala的Repository,搜罗了当下主要的基于Scala开发的框架与工具,涉及到的领域包括:

  • Database
  • Web Frameworks
  • i18n
  • Authentication
  • Testing
  • JSON Manipulation
  • Serialization
  • Science and Data Analysis
  • Big Data
  • Functional Reactive Programming
  • Modularization and Dependency Injection
  • Distributed Systems
  • Extensions
  • Android
  • HTTP
  • Semantic Web
  • Metrics and Monitoring
  • Sbt plugins

使用道具

藤椅
Lisrelchen 发表于 2017-2-21 03:30:31 |只看作者 |坛友微信交流群
  1. 持久化

  2. 归根结底,对数据的持久化主要还是通过JDBC访问数据库。但是,我们需要更好的API接口,能更好地与Scala契合,又或者更自然的ORM。如果希望执行SQL语句来操作数据库,那么运用相对广泛的是框架ScalikeJDBC,它提供了非常简单的API接口,甚至提供了SQL的DSL语法。例如:
  3. val alice: Option[Member] = withSQL {
  4.     select.from(Member as m).where.eq(m.name, name)
  5.   }.map(rs => Member(rs)).single.apply()
  6. 如果希望使用ORM框架,Squeryl应该是很好的选择。该框架目前的版本为0.9.5,已经比较成熟了。Squeryl支持按惯例映射对象与关系表,相当于定义一个POSO(Plain Old Scala Object),从而减少框架的侵入。若映射违背了惯例,则可以利用框架定义的annotation如@Column定义映射。框架提供了org.squeryl.Table[T]来完成这种映射关系。+

  7. 因为可以运用Scala的高阶函数、偏函数等特性,使得Squeryl的语法非常自然,例如根据条件对表进行更新:
  8. update(songs)(s =>
  9.   where(s.title === "Watermelon Man")
  10.   set(s.title := "The Watermelon Man",
  11.       s.year  := s.year.~ + 1)
  12. )
复制代码

使用道具

板凳
Lisrelchen 发表于 2017-2-21 03:31:56 |只看作者 |坛友微信交流群
  1. 测试

  2. 虽然我们可以使用诸如JUnit、TestNG为Scala项目开发编写单元测试,使用Cocumber之类的BDD框架编写验收测试。但在多数情况下,我们更倾向于选择使用ScalaTest或者Specs2。在一些Java开发项目中,我们也开始尝试使用ScalaTest来编写验收测试,乃至于单元测试。
  3. 若要我选择ScalaTest或Specs2,我更倾向于ScalaTest,这是因为ScalaTest支持的风格更具备多样性,可以满足各种不同的需求,例如传统的JUnit风格、函数式风格以及Spec方式。我的一篇博客《ScalaTest的测试风格》详细介绍了各自的语法。
  4. 一个被广泛使用的测试工具是Gatling,它是基于Scala、AKKA以及Netty开发的性能测试与压力测试工具。我的同事刘冉在InfoQ发表的文章《新一代服务器性能测试工具Gatling》对Gatling进行了详细深入的介绍。
  5. ScalaMeter也是一款很不错的性能测试工具。我们可以像编写ScalaTest测试那样的风格来编写ScalaMeter性能测试用例,并能够快捷地生成性能测试数据。这些功能都非常有助于我们针对代码或软件产品进行BenchMark测试。我们曾经用ScalaMeter来编写针对Scala集合的性能测试,例如比较Vector、ArrayBuffer、ListBuffer以及List等集合的相关操作,以便于我们更好地使用Scala集合。以下代码展示了如何使用ScalaMeter编写性能测试:+

  6. import org.scalameter.api._

  7. object RangeBenchmark
  8. extends PerformanceTest.Microbenchmark {
  9.   val ranges = for {
  10.     size <- Gen.range("size")(300000, 1500000, 300000)
  11.   } yield 0 until size

  12.   measure method "map" in {
  13.     using(ranges) curve("Range") in {
  14.       _.map(_ + 1)
  15.     }
  16.   }
  17. }
复制代码

使用道具

报纸
Lisrelchen 发表于 2017-2-21 03:33:07 |只看作者 |坛友微信交流群
  1. 根据场景选择框架或工具

  2. 比起Java庞大的社区,以及它提供的浩如烟海般的技术栈,Scala技术栈差不多可以说是沧海一粟。然而,麻雀虽小却五脏俱全,何况Scala以及Scala技术栈仍然走在迈向成熟的道路上。对于Scala程序员而言,因为项目的不同,未必能涉猎所有技术栈,而且针对不同的方面,也有多个选择。在选择这些框架或工具时,应根据实际的场景做出判断。为稳妥起见,最好能运用技术矩阵地方式对多个方案进行设计权衡与决策。+

  3. 我们也不能固步自封,视Java社区而不顾。毕竟那些Java框架已经经历了千锤百炼,并有许多成功的案例作为佐证。关注Scala技术栈,却又不局限自己的视野,量力而为,选择合适的技术方案,才是设计与开发的正道
复制代码

使用道具

地板
Lisrelchen 发表于 2017-2-21 03:35:13 |只看作者 |坛友微信交流群
  1. 大数据

  2. 大数据框架最耀眼的新星非Spark莫属。与许多专有的大数据处理平台不同,Spark建立在统一抽象的RDD之上,使得它可以以基本一致的方式应对不同的大数据处理场景,包括MapReduce,Streaming,SQL,Machine Learning以及Graph等。这即Matei Zaharia所谓的“设计一个通用的编程抽象(Unified Programming Abstraction)。
  3. spark architecture

  4. 由于Spark具有先进的DAG执行引擎,支持cyclic data flow和内存计算。因此相比较Hadoop而言,性能更优。在内存中它的运行速度是Hadoop MapReduce的100倍,在磁盘中是10倍。
  5. 由于使用了Scala语言,通过高效利用Scala的语言特性,使得Spark的总代码量出奇地少,性能却在多数方面都具备一定的优势(只有在Streaming方面,逊色于Storm)。下图是针对Spark 0.9版本的BenchMark:
  6. 性能比较

  7. 由于使用了Scala,使得语言的函数式特性得到了最棒的利用。事实上,函数式语言的诸多特性包括不变性、无副作用、组合子等,天生与数据处理匹配。于是,针对WordCount,我们可以如此简易地实现:
  8. file = spark.textFile("hdfs://...")

  9. file.flatMap(line => line.split(" "))
  10.     .map(word => (word, 1))
  11.     .reduceByKey(_ + _)
  12. 要是使用Hadoop,就没有这么方便了。幸运的是,Twitter的一个开源框架scalding提供了对Hadoop MapReduce的抽象与包装。它使得我们可以按照Scala的方式执行MapReduce的Job:
  13. class WordCountJob(args : Args) extends Job(args) {
  14.   TextLine( args("input") )
  15.     .flatMap('line -> 'word) { line : String => tokenize(line) }
  16.     .groupBy('word) { _.size }
  17.     .write( Tsv( args("output") ) )

  18.   // Split a piece of text into individual words.
  19.   def tokenize(text : String) : Array[String] = {
  20.     // Lowercase each word and remove punctuation.
  21.     text.toLowerCase.replaceAll("[^a-zA-Z0-9\\s]", "").split("\\s+")
  22.   }
  23. }
复制代码

使用道具

7
astar55 发表于 2017-2-21 05:37:13 |只看作者 |坛友微信交流群
谢谢分享!

使用道具

8
neuroexplorer 发表于 2017-2-21 06:55:20 |只看作者 |坛友微信交流群
Cool!!!!

使用道具

9
franky_sas 发表于 2017-2-21 07:12:26 |只看作者 |坛友微信交流群

使用道具

10
smartlife 在职认证  发表于 2017-2-21 11:20:29 |只看作者 |坛友微信交流群

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-23 23:57