从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)

dsl 这是《从 Java 和 JavaScript 来学习 Haskell 和 Groovy》系列的第四篇。

首先来理解 DSL。

DSL(Domain Specific Language)指的是一定应用领域内的计算机语言,它可以不强大,它可以只能在一定的领域内生效(和 GPL 相比,GPL 是 General Purpose Language),表达仅限于该领域,但是它对于特定领域简洁、清晰,包含针对特定领域的优化。

当我们面对各种各样的特定需求的时候,一个通用的语言往往不能高效地提供解决问题的路径,相应的 DSL 并不是并非要解决所有的问题,但是它只关注于某一个小领域,以便解决那一个小领域的问题就好了。比如 HTML,只用

[……]阅读全文

想起那些听过的流行歌曲

lizongsheng

我们这一代人,很多都有一个不断演化着的音乐的梦想。

我们欣赏过很多音乐,听过很多歌,打开豆瓣音乐的时候,当我选择“八零后”频道,我确确实实感受到这些歌曲就是属于我的世界的,很难解释其中的原因。

虽然现在有时候依然去听那些新歌,但是就是很难再找到那根打动自己的神经。

我听张信哲的歌,最早最喜欢的是《别怕我伤心》,甚至在一些公众场合我都愿意拿出来唱一唱。

还有《爱如潮水》,当时买的是磁带,哪有什么 CD 啊。

后来看了《宝莲灯》,一遍遍听《爱就一个字》。

我听梁静茹的歌,从最早的《一夜长大》开始。我喜欢她那些有故事的歌曲。她有很多歌不只是曲子好听,歌词也越听越有味道。

有一首歌,《绿花》,词曲我都非

[……]阅读全文

从 Java 和 JavaScript 来学习 Haskell 和 Groovy(元编程)

metaProgramming

本篇文章的话题是元编程。首先来认识元编程,我在第一篇 《引子》 里面已经介绍:元编程,指的是在运行时改变“类”的定义,例如访问、增加或修改等等。一言以蔽之,就是“用程序来写程序”。在第二篇的 《类型系统》 里面已经借由继承和接口的实现,介绍了一些利用元编程特性来增加或改变子类行为的方法。回顾语言发展的长河,其实是经历了一个从“对象 -> 类 -> 元类”到“对象 -> 原型”的发展过程的。所以,无论是类,还是元类,这样的概念其实都不是非有不可的,只是因为我们思考的习惯,特别是抽象的习惯而顺其自然地产生了。这一点我在 《编程范型:工具的选择》 里面已经详细描述了,建议在往下阅读前移步。

[……]阅读全文

LeetCode 题目解答——155~226 题

[Updated on 9/22/2017] 如今回头看来,里面很多做法都不是最佳的,有的从复杂度上根本就不是最优解,有的写的太啰嗦,有的则用了一些过于 tricky 的方法。我没有为了这个再更新,就让它们去吧。

LeetCode 上面的题目更新很快,而且题目是越来越不好做了。我把最新的 155 到 226 题目的思考和解答过程放在下面,解法有好有坏,有问题我们可以讨论。老规矩,有一些题目是要买一个特定的电子书才可以在线做题的,我就跳过去了。

226
Invert Binary Tree[……]阅读全文

换组

group

最近在忙于公司内部换组的事情,在亚马逊等等很多公司都有这样的政策文化,就是,如果你在这一个组工作一年以后,并且绩效不太差的话,都可以自己去寻找觉得喜欢的团队加入。我在当前的这个大组干了两年多了,经历了一些成败和风波,我觉得是时候离开去寻找一个更合我胃口的团队了,增加阅历和体验,当然,也肯定是新的挑战。在思考自己的职业未来的时候,其实是有不少选项的。大约是最近这一年,我越来越感觉到,在 Amazon 工作,那么多内容里面,最有价值的大概是数据,我寻找的下一站,也是想多参与和大数据更紧密的工作。如果说以前我的工作更像是一个 full stack engineer 的话,接下去一段时间,我要更多地和数据、

[……]阅读全文

手滑的故事

slippery

最近看到这篇文章 《小伙伴们手滑集》,觉得感慨很多,强烈推荐大家阅读。比如这样的例子:

UPDATE 没有 WHERE 条件

而我则经历过 delete 没有写 where 条件的惨剧,这个惨剧是某些 case 下面代码调用触发的,不是手动执行 SQL 发生的。

还有臭名昭著的,我没有经历过,但是我有不止一个同事干过这样的事情:

rm -rf

都只是手稍稍地温柔地“滑了一下”而已嘛……

这些事情我觉得一下子很亲切,似乎全世界的软件工程师都是如此得同一。

出的事故多了以后,变得战战兢兢,如履薄冰,尤其是回车键这样的敲击,似乎总是带着颤抖落指。

还有这篇文章 《让自家系统瘫痪,这事我也干过》,讲了一个关于使用 tr

[……]阅读全文

建立动态规划状态转移方程的练习

algorithm

大学里面算法课老师教导过动态规划,但是就像看书要把书看厚再看薄一样,要把动态规划彻底理解,还是需要一些时间的锻炼。解动态规划问题,每个人都有自己的习惯的套路,我的理解是最核心的过程有两部,一个是找出问题的一个一个子“ 状态”,再一个就是建立“ 状态转移方程”(就是所谓的“ 递推关系式”)。把这个过程搞定,基本上动态规划的题目就解了一半了,剩下那些代码层面的事情,是把思路和数学方程实现而已了。

在实现的过程中,可能会用到一些技巧,比如“ 循环还是递归”,这只是实现的办法而已,不是动态规划的本质;再比如空

[……]阅读全文

一点美中医疗的对比

med 最近耳道感染,左耳朵又堵又疼,在美国几次就医,本人虽非医学专业出身,但从局外人的角度,想到和国内那些求医的历史,还是有一些比较可言。

首先对于医生的划分,国内基本上就是根据科室来完成,一个医生在一个科室,时间久了,经验丰富,遂成为出名的医生。好处在于医生更能够专精于自己的一亩三分地,专科阅历容易积累。而看看许多国内的专家,有大量的机会见各种各样奇怪的病人,并且手术的机会也会非常多,因此我猜测经验会更加丰富。但不足之处在于,对于病人来说,疾病往往是复杂性全身性的,可能对要挂哪个科室并不清楚,即便到求医中后期,都有可能面临多科室一同合作的情况,这些情形都容易导致耽搁病情。

而美国的医疗体系,

[……]阅读全文

夏威夷游记

6 天 7 夜,仅游玩了 O'ahu 一个岛,后来总结如果高效率地行进,可能这个岛屿 4 天就可以玩的差不多了。我 很喜欢旅行 ,但是在旅行计划方面不太在行。夏威夷和我以前去过的菲律宾长滩岛比起来,更加现代一点,价格也贵了接近一倍。期间我们没有坐公交车,全程都租了车行进,并且我觉得花掉的钱里面,租车是最值得的。我把这篇文字记录下来,如果你也有夏威夷的出行计划,那么可以参考参考。

家人和我一起来,都说三个女人一台戏,至于四个女人嘛…… 反正一路上叽叽喳喳的。

IMG_2793

 

第一天:东线

海滩是夏威夷的重头戏,如果说论美丽的海滩数量,夏威夷可真是不少。当然,去多了可能觉

[……]阅读全文

读写模型整理笔记

读模型

1、主键读

最常见的读模型,说是主键,其实也包括其它索引键,或者联合主键。

常见实现:hash,时间复杂度可以接近 O(1);B 树或变种:时间复杂度接近 O(log(n))。

关于 B 树和变种:

B 树(B-树):本质上是二叉查找树的升级版,变成了平衡的 N 叉查找树,这个 N 的范围根据磁盘一次读取的块大小来调整,这样复杂度 log n 的底数就从 2 变成一个更大的数,减少了树的高度。除此以外,还有一些额外的优化,比如为了插入和删除的性能考虑,通常准备一些预留的空间,只要在当前块或者邻近块中找到空间写入,就避免了开销巨大的所有记录向后偏移的操作。

B 树的阶:

  1. 一棵 m 阶的 B 树最多有 m 棵子树;
  2. 根节点至少有

[……]阅读全文

从 Java 和 JavaScript 来学习 Haskell 和 Groovy(类型系统)

Haskell 接上文 《从 Java 和 JavaScript 来学习 Haskell 和 Groovy(引子)》

首先搞清几个概念:

  • 动态类型(Dynamic Typing)和静态类型:区别的核心在编译期还是运行时。静态类型的语言系统在编译期就明确知道每一个变量的类型,如果发现不合法的类型赋值就在编译期报错;动态类型则直到运行时才会报错。
  • 类型推导(Type Inference),类型推断是指可以在上下文中,编译器来推导实际的类型,也就是代码使用隐式类型指定。比如一个简简单单的“var a=1”,a 就被推断成整型。
  • 弱类型(Weakly Typed)和强类型:指的是语言系统对类型检查,或者是类型之间互相转换

[……]阅读全文

从 Java 和 JavaScript 来学习 Haskell 和 Groovy(引子)

compare 我记得刚接触计算机的时候,我就受到了两个非常巨大的错误观念的影响,这个观念最初是来自于老师的传授还是学长的教诲已经记不清了,但是直到我工作几年以后,才慢慢有了实际的体会:

  1. 学习和使用什么编程语言不重要,重要的是算法和设计;
  2. 程序员学习的精髓是面向对象的设计模式,掌握以后,一通百通。

简直就是是胡扯啊。也许在某个极其狭隘的上下文中还能这样说,但是泛泛而谈,这样的态度无疑是误人子弟的。

就说第一条,编程语言不但重要,而且太重要了。换句话说,学习一门新的编程语言,可能学习的是背后的范型和思考问题的方式。如果这个部分能带来新的东西,那就是值得花时间投入的。

可能很多人和我的背景一样,熟悉 Java 和

[……]阅读全文

生活的鱼和熊掌

f-b 前方鸡汤高能预警。

读书的时候,曾经听到这样的说法,最近几个月,则又听到了两三次,人生选择论,鱼和熊掌说,或者生活跷跷板理论。跷跷板的特点就是,一头摁下去,另一头就起来。本人向来鄙视鸡汤,不过这个理论还是比较赞同的,看来今天破一次例。选择了 A,就失去了 B;选择了 B,就无法得到 A。所谓鱼和熊掌无法兼得便是如此。

生活总会值得吐槽

毕业后在南京工作的时候,觉得气候还算过得去,吴侬软语听起来也顺耳,但是地方实在是太小了,很不甘心在这个小地方一直耗下去;到了北京,确实见了世面,确实是我所说的“ 更大的盒子 ”,但是又觉得环境太过糟糕,交通无法忍受;现在来到西雅图,平日里吐槽

[……]阅读全文

系统设计典型问题的思考

CAP 系统设计方面的问题问题是非常考验经验和思维过程的,而且和常见的算法问题、语言基础问题不同,涉及的面很广,还没有比较一致的判别标准。但无论如何,还是可以归纳一些常见的思路和典型问题的线索。

首先,反复沟通和澄清系统需求。只有把需求澄清清楚了,才可以开始思考并落到纸面上。但是需求的沟通应该是持续和循序渐进的,问题很难从一开始就思考全面。最重要的条目包括:

  • use cases,通常问题只需要 2~3 个 use cases 需要考虑,其他的部分会晚些考虑,或者不考虑。这样就可以简化问题。
  • 用户数量(用户可以是下游系统或者人)、数据数量,澄清这个事实无疑非常重要,对系统设计的决策有重大意义。
  • 请求模型,

[……]阅读全文

一道随机数题目的求解

random 有这样一道算法题:

给定一个能够生成均匀 1~5 随机枚举数的函数,请设计一个能够生成均匀 1~7 随机枚举数的函数。

就是说,有一个生成随机数的函数 rand5,可能返回 1、2、3、4、5 这 5 个枚举值,其中每个值被返回的概率都是严格的 1/5,现在需要设计一个类似的随机数函数 rand7,可能返回 1、2、3、4、5、6、7 这几个枚举值,每个值被返回的概率都是严格的 1/7。

先掩卷思考,脑海中浮现的思路包括:

  • 调用 rand5 的结果除以 5,再乘以 7,这样的结果范围为 7/5~7,并非所希望的结果;
  • 反复调用 rand5 函数 7 次,结果再除以 5,这样的结果范围为也为 7/5 ~ 7,并非所

[……]阅读全文

再谈程序员学英语

english

2012 年的时候,我曾经写了一篇 《程序员学英语》,总结了一些我对于英语学习的看法,包括为什么英语对于程序员来说如此重要,还有一些自己总结的英语学习的方法。时过境迁,在西雅图待了半年多了,于是在这些内容基础上,我现在有了一些新感触,以 tips 的记录在这里,希望对于像我这样对于英语学习天赋平平的程序员来说有所帮助。

先说明一点,通常情况下我不太赞同高强度的语言训练,譬如连续地花时间背诵红宝书,我没有 GRE 的迫切压力,自然也不会像那些莘莘学子一样花数周的时间反复强力地背诵和巩固红宝书词汇。当然,话说回来,这可能还是最佳的单词记忆方式,因为可以做到高密度的反复。在一周内记诵的词汇得到反复,比每天零零

[……]阅读全文

A page widgetization practice

widget

I was working on the page reconstruction recently, and here is how I divide a page into widgets and how do they interacts in this new attempt.

Core Concepts

Page and widget: A page is composed by several widgets, and a widget is the minimum unit for reuse.

Widget controller: Accepts multiple widget

[……]阅读全文

Java 容器类型复习笔记

data_structures 最近抽空把 java.lang 下面常用的那些容器类型(数据结构)复习了一下,这些东西是基础,平时使用的时候也可以很容易查得到,有些方法大概知道,但是总是弄混,如果可以记住那些重要方法,并且能够熟练使用的话,还是可以让编码过程变得容易很多。另外一个是实现机制,对于常用数据结构的实现机制,应该说是必须要熟知的。

另外,并发容器我之前整理过,放在 这篇文章 里。

Queue

  1. add 和 offer 的区别在于达到上限时 add 抛出异常,offer 返回 false;
  2. remove 和 poll 的区别在于,队列为空时前者抛出异常,后者返回空;
  3. element 和 peek 都返回队列头部元素,但是前者失败不抛出异常,后者返回

[……]阅读全文

直面歧视

discriminate

最近在知乎上面看到不少关于歧视讨论的帖子,大部分人的观点都是,歧视是负面的,要避免歧视,尤其是在公众场合歧视的人,要惩戒。这条观点展开来的话题,大部分我都认同,只是我想补充的是,其实歧视没有那么遥远,不要把歧视的事情全部看做多么罪恶深重的事情,事情要一码一码分开来看,有轻有重,我向来厌恶鸡汤,统一的道德帝是可恶的。

首先,来澄清“歧视”的概念:歧视,是针对特定族群的成员,仅仅由于其身份或归类,而非个人品质,给予不同的对待。好,就针对这样的定义,有那么多人跳出来说,“我不歧视任何人”,“我不歧视任何事”,说说如此容易,可这样的话经得起考验么?从最简单的分类例子看起,知乎“歧视”话题下面的几个子

[……]阅读全文

LeetCode 数据库十道题解答

之前做算法题 的途中发现,LeetCode 上面推出了数据库解答,有十道题,于是这两天晚上时间就给做了。解答是次要主要的好处是,正好复习复习 SQL 一些查询语句的写法,比如自定义变量和常用函数。题目都比较简单,少做解释,以贴题目和答案为主。

 

175 Combine Two Tables 32.5% Easy 176 Second Highest Salary 23.8% Easy 177 Nth Highest Salary 14.1% Medium 178 Rank Scores 20.7%[……]阅读全文

back to top