闭包

在做程序设计语言作业时,用racket语言自己实现了一个新的语言,还带上了闭包功能,感觉终于深刻理解了闭包是个什么东西,虽然以前在C#中也无数次用到匿名函数,接触了闭包的概念,但是换了一种语言来看,好像找到了这种概念的源头。

一个函数中有很多变量,有一些是函数中定义的(这包含在函数体中),有一些是作为参数传入的,因此一个普通的函数调用,需要知道函数体,也需要知道传入的参数,我们可以称这些参数是不自由的,已经由传入决定了。

如果一个函数中有些变量不是由传入参数决定的呢?那么这些参数是自由的,它们由定义函数的环境所决定。可以简单的认为,函数与定义函数的环境就称为一个闭包,在racket等语言中,实际上所有的函数在底层都会用闭包形式表达,这个闭包包含一个环境,环境提供变量与值的映射,还包括函数体代码,在一些实现中,可以把传入参数的映射也放大环境中,说到这里,发现闭包没什么神奇的,只不过是一个函数体,加上一个变量和值的映射表而已。

在函数式编程语言中,闭包往往很重要,闭包作为值,可以像整数、浮点数一样传递,这个传递的值,如果被另一个函数调用,就像你租了一个餐馆自己做菜,原料(函数调用方待处理的数据)由餐馆提供,但是你自己带了佐料(环境中的变量与值的映射),也带了处理原料的方法(函数体),这里的佐料和处理方法可以千变万化,调用的函数都不关心,因此有了极大的灵活性,比如经典的map函数需要一个处理函数作为参数,只规定了这个函数必须处理列表中的元素,至于怎么处理,是否带上其他复杂的参数,都由这个处理函数蕴含的闭包决定。

闭包还和匿名函数的概念联系起来,匿名函数都是在某个函数中定义并就地调用,匿名函数如果能使用相关环境中的变量,那么就是一个闭包。比如C#中的匿名函数,可以使用定义它的函数所在的对象的所有字段。实际上C#的匿名函数是用一个类实现的,这个类就包含了这个匿名函数(会生成一个名字),还有它所引用的调用方的字段作为私有字段。可以说,C#是用类实现了闭包。

闭包这个词,可以拆开来理解。

  1. “闭”代表封闭,闭包对修改是封闭的,闭包中的函数一般来说无从修改,不像对象中的函数,一般是可以通过子类来重载修改的,这不便于扩展,但更稳定。
  2. “包”正如前面描述的,代表是函数及定义该函数的环境的包裹。

简单方法不简单

我还是是个小学生的时候,数学考试经常简单的题出错,复杂的题作对,因为简单的题往往考的是手工演算,比如两位数的乘法,很容易出错,而所谓复杂的题,往往有所谓的简便方法,比如125x64这种,我一看见就满心欢喜。

我对方法的迷恋一直持续到成年,做事情的时候总会想有没有捷径可走,如果找不到捷径,我会感到难受。这几年我在研究治学的方法论,看过古今中外很多高人的经验,然而发现要建立自己的治学方法依然非常困难。

对方法尤其是捷径的迷恋,似乎是当代人的常态,所以所谓的知识付费时代来临后,卖得最火的课程貌似还是成功学,尽管包装得更加精美,然而事实是学习这些东西的人,往往并没有什么变化,倒是卖课的人赚得盆满钵满,比如李笑来的《通往财富自由之路》课程,我也凑热闹交了一把智商税,也学到一些东西,但是倒是和菜头客串的一篇文章印象也很深刻,大概是委婉的说出了这种人生经验很难在经历之前真正学懂。

我的体会是,方法论是从自己的实践中生长出来的一棵树,你可以四处获取养分,然而不能把别人的木头拿过来当成自己的一部分。如果要形成自己的体系,必然需要很多实践方法,如果这些方法有用凑效,最终能不能总结出一套理论来,其实是无所谓的。

那么什么样的方法是好方法呢?对我来说,能够真正坚持下来的方法才是好方法,如果要极大的毅力去坚持,最终往往免不了三分钟热度的悲剧命运。那么什么样的方法才是能坚持下来的方法呢?对我来说,答案很简单,那就是简单易行的方法,比如每天晚上写一下成功日记,用流水账简单几个字就行,忘写了第二天也还能补,这种简单的方法就能让你回顾总结一天的活动,提振自己的士气。又比如看完一篇文章,用一到两句话总结一下文章的观点,不用长篇大论,不费很多精力,但是却能慢慢的形成吸收知识纳为己有而不是泛泛而都,甚至我在写的时候,常常不自觉的就和作者讨论甚至争论起来,所谓的批判性思维,这也算是一个好的开端吧。

人们往往忽视了短时间内取得进步的困难,也低估了长时间取得进步的可能,用简单的方法开始治学,只需要很低程度的持之以恒,长期来看取得的收益是性价比超高的。

《摔跤吧!爸爸》:父母该怎么为子女铺路?

Dangal

人是一种动物,或许是因为生命在于运动,体育电影总是让人能够热血沸腾,相比战争电影,它的“燃”没有什么负面意义,《摔跤吧!爸爸》也是一部典型的正能量电影。

有部分人批评电影中的父亲独裁地为女儿们挑选了摔跤这么一个职业,要反驳很容易,因为导演在片中安排了一个新娘规劝了不服气地两个女儿,如果不去摔跤,只能早早嫁人,没有资格选择职业也没有资格选择老公。片中的父亲没有太多其他的本事,培养有天分的女儿们成为摔跤手是最优选择了。世上少不了何不食肉糜的感叹,然而也不能只是这么简单的批判一番,仔细衡量的话,父母该怎么为子女铺路是一个极其复杂的话题,其实这部电影谈到了很多因素:

  1. 父母的个人情结,无数的作品都描述过类似的故事,有悲剧有喜剧。片中的父亲想让子女圆自己的梦,这在很多情况下不见得是好的选择;
  2. 子女的天分,片中的父亲是发现女儿们有摔跤的天分后才着手培养的,这一点和前一点结合,才能变成喜剧。然而,怎样才算有天分,实在也是一个复杂的问题。片中的父亲也正是有情结才能发现女儿的天分。如果他是一个程序员,说不定还发现女儿们有写代码的天分;
  3. 家庭的眼界,片中的家庭应该算是比较穷,父亲似乎也不懂除了摔跤之外的太多东西,于是摔跤就成了他们能抓住的唯一稻草,如果家庭的眼界更开阔,自然可以有更多的选择,然而在没有选择的情况下,可能更有毅力,因为那是救命稻草。

给子女发现更多的道路是眼界,知道什么样的道路适合子女是智慧,能够坚持培养是韧性,而最终能不能成才还需要一点运气。最后,还有古话聊以自慰:儿孙自有儿孙福。

对传销的几点认识

这几天,由于某种原因,对传销有了比以前更深刻的认识,随便谈一下。

传销是一种心灵污染

为什么传销无法禁绝,因为人心的贪娈无法禁绝。一个传销头目就是一个污染源,传销作为一种诈骗模式,会迅速的在传销组织中传播,打击传销组织不可能对庞大组织中的人都用重刑,因此哪些处罚很轻或者免于处罚,但是心灵已经被污染的人,会成为新的污染源。因此我们很容易看到相似的传销手段,不断的死灰复燃,政府要想彻底打击基本上不可能,只有像除杂草一样,等长到足够高的时候,用打草机割掉一批。要想彻底除掉杂草,要斩草除根,改变土壤,即使这样,我们也很难看到彻底禁绝杂草的地方。传销也一样,不过总可以尽量减少它的危害,这需要社会人心的改变与国民智商的提高,如果浮躁拜金的社会风气没有改变,人们对投资理财的基本概念没有建立,那么传销的气焰也会始终嚣张。

金字塔模式是一种经典模式

传销的核心模式是金字塔模式。传销的金字塔模式的问题在于,金字塔的底层是不稳固的。如果能形成稳固的底层,金字塔模式就能一层层累积出塔尖来。金字塔模式本没有善恶之分,就看如何运用了。

虽然人们都喜欢平等的概念,但是金字塔模式一定程度上也是文明进步产生的助力,农耕文明的直接战斗力可能比不过游牧民族,但是最终高端一点的东西,无论是科技层面的还是文化层面的,基本上都来自农耕文明,最简单的一个解释就是,只有通过农名供养贵族的金字塔模式,才能造就一帮闲人研究一些温饱之余的问题。红楼梦里面林黛玉的诗写得好,但前提是她不需要下田干活,而是四体不勤五谷不分。

不过我想随着人工智能时代的来临,这个金字塔底可能会由机器人来承担。

跳出圈子的重要性

传销组织的一个特点是试图切断你和家人的联系,将你的社交关系逐渐局限到传销组织的人,然后再开启洗脑模式。无论多么荒谬可笑的东西,只要周围的人都是这么去做,人们就会觉得正常,这是人的社会属性本质决定的。因此,要想防止各式各样的洗脑,最重要的办法就是跳出圈子思考问题,不要把自己归到任何圈子,与各式各样的人建立联系,这里说的人,可能是生活中接触的人,互联网上交往的人,甚至可能是古人,也可以通过他们留下来的书之类的接近他们的思想。

我的知识管理工具

简单整理一下自己使用的知识管理工具,其实自己的体系还建立得不是很稳固,所以这个清单只是一个草稿,希望在接下来的1~2年内稳定下来。本清单将不断更新。

1 信息源

  1. inoreader RSS阅读工具
  2. 微信订阅号
  3. 微博、Twitter
  4. 雪球
  5. 知乎
  6. 即刻
  7. Courera
  8. TED
  9. Pocket 稍后阅读工具

2 信息采集

  1. Evernote 备忘录的长期存储,其他内容的临时存储
  2. Onenote 主要使用手写笔记功能
  3. Pocket 长文章的临时存储

3 笔记整理与生成

  1. Evernote 简单笔记的写作
  2. Workflowy 结构化笔记的写作

4 写作与成果展示

  1. Github pages + Jekyll
  2. Typora

语言特性

程序员的老梗是讨论什么编程语言最好,标准答案有两种,一种是PHP,还有一种是取决于你要完成什么任务。那么主要谈谈第二种答案。

尽管这里讨论的编程语言主要指的是图灵完备的通用编程语言,然而每个语言设计的时候都会有自己的场景想象,于是语言设计者会选择一系列认为很有用的语言特性,静态类型还是动态类型?要不要垃圾回收?是否支持闭包?

有一些语言特性会作为语言的核心功能设计,然后在此基础上设计好用的语法糖,要理解一门语言的运作,必须对此有一定的区分,比如C#语言中,一个类中的核心概念是字段和方法,衍生的语法糖包括属性、事件、访问器等,不知道这些区分与运行机制也能写代码,但是可能会遭遇一些无法理解的问题。我知道C#有一本书《C# via CLR》对这些问题讲得比较透彻,其他语言相信也有类似的。

《代码大全》中说,程序员应当根据自己的需要选择语言特性,不要语言提供了的一股脑都去用,比如javascipt语言就有很多奇奇怪怪的特性,甚至还有一本书专门介绍它哪些特性好哪些特性最好不要用,这时候我们用的是语言的子集。还有一些情况,出于其他原因,我们必须使用某种语言,但是却缺乏我们需要的特性,这时候可以考虑自己实现,比如用C语言实现一个简单的对象系统,在Java 7中自己实现一个简单的的map reduce。

从这个角度来说,语言特性高于语言,要充分熟悉各种语言特性,可能要多学几门语言,它们各自有自己的侧重点,从而更容易理解,比如要学闭包,函数式语言就比C#更合适,虽然C#也算是有闭包。

《百鸟朝凤》:命题作文

百鸟朝凤

《百鸟朝凤》这部电影虽然没卖座,但也曾站上风口浪尖,大师绝唱这个词,甚至在吴天明导演身上不幸印证了。然而,我还是不得不说,这不是一部很好的电影。

如果以《百鸟朝凤》命题作文,那么我不得不对这部电影的音乐性充满期待,然而,让人遗憾的是,唢呐的演奏甚至都不是电影的重点,唯一有意思的一段是焦三爷喝醉后的唢呐,然而正当我要入戏时,唢呐演奏变成了混响,作为一部和音乐有关的电影,整部电影的配乐可以说比较失败。

看了一半才知道音乐不是电影的重点,重点似乎是要表现民间艺术的失落,然而电影并没有很认真的去介绍唢呐,似乎百鸟朝凤也只是为了导演心目中想要表现的某些命题的应景,这样即使要表达主题,观众看起来的遗憾度也不会太高。

创作者对民间艺术的失落的理解并没有什么新鲜的,只是像一个老人一样感慨过去的好日子,而当下的乐手,在电影中不是断了手指就是得了尘肺病,唯一对生活充满热情的人似乎是哪个师父瞧不上的蓝玉,然而他基本上放弃了唢呐。

好的东西会有人欣赏,然而苦情并不是好的出路。

我希望看到的是用热情浇灌的展现出唢呐演奏的美感的电影,可惜了。

如何学习一名新的编程语言

前几天为了学习吴恩达deeplearning.ai的课程,在coursera平台上进行了信仰充值,59美金包了一个月,坑人的是,吴恩达的课程只除了3/5,为了不浪费我的钱,我想再找个有认证的课刷一下,于是找到了据称比较难的programming-languages课程。

programming-languages这门课用到了ML、Racket、Ruby等三种语言,从语言的选择就可见不走寻常路了,我初步了解了一下,应该是一门偏向函数式编程的介绍编程语言范式的课程。用这个老师Dan Grossman的话说,这是像练武术的人搞一些挑水扫地蹲马步的活动。恰好函数式编程我也不是太熟,不妨一刷。第一次作业一次性拿了满分,看来我还是有写函数式编程代码的天赋么?

类似的试图一次性学习所有编程语言的还有之前见过的一本书《代码之髓》,日本人写的,大概翻过一下,把编程语言中一些主要的概念拿出来对比着讲。愤怒的大牛王垠也写过一篇如何掌握所有的程序语言,值得一读。

Dan Grossman也总结了语言学习中的五个要素:

  1. 语法,代码怎么写的,这部分肯定是要学会的,但也没什么难度,没什么意思;
  2. 语义,这些语法代表什么含义,代码是怎么运行的,理解到这部分,代码才能在脑子里跑起来;
  3. 惯用法,如何使用语言特性表达计算,很多语言都有cook book,比如C#,你不用Linq而老是用for循环,那是很暴殄天物的;
  4. 库,一般来说,只是学“语言”跟库关系不大,但是要做实际项目,库可能就很重要了;
  5. 工具,每种语言可能都有一系列的衍生工具,帮助你更好的完成工程。

这其中第1项是基础,2、3两项,是理解一门语言的关键与难点,而4、5两项,则是衍生品。

我的目标也是掌握所有的程序语言,如果借这次机会学透了函数式语言,我觉得问题不大,因为所有的语言几乎都是C和Lisp之间的光谱分布。核心语法一般1~2天能学会,而语义、惯用法或者说语言特性无非就是一些核心概念里面打转,而库和工具可以在使用中熟悉。

骗子的美好时代

前两天给老爸下驾考的软件,发现需要实名验证,以后,我们除了在注册账号时要记得自己的身份证号码外,还要记得一件事情,就是骗子的美好时代来临了。

一个人注册的网站越多,那么某个网站泄露他的个人资料的可能性就越大,那些大大小小的网站真的有能力有操守保护我们的隐私吗?匿名化其实是给了注册的人一定的自我保护能力,而在实名制前面,这种保护能力将化为乌有,原本就很严重的个人资料泄露有了实名制后将会如虎添翼,可能不久的将来,更多的人会接到诈骗电话,轻松的报出你的家人的身份证号码和住址,每个人防骗的神经必须绷得更紧才行,你要时刻记住,在这个时代,你和你家人的资料对于骗子来说,基本上已经等同于完全透明了,想明白这一点,或许在接到诈骗电话的时候,反应能机敏一点。

从理论上来说,实名制也对打击各种诈骗、拿钱发帖的水军等有很大的益处。但事实是道高一尺魔高一丈,电话号码的实名制丝毫没有降低诈骗的嚣张程度,估计网络账号的全面实名制也不会有什么区别。实名制的约束只会约束到普通良民,而坏人们总是会想到各种钻空子的办法。

我感觉近几年来黑色产业有一次明显的产业升级,诈骗这种有一定技术含量,风险低收益高的犯罪方式,已经在全面替代盗窃和抢劫。而诈骗的受害者,甚至都得不到大众的同情而是会被嘲笑,因为似乎被骗等同于傻或者自己太贪婪,包括我在内的很多人可能自负的觉得自己一定不会被骗,然而当个人资料越来越多的被泄露后,说实话我的信心也没有那么足了,只能提醒自己提高警惕。

服务业的消费升级

一般来说,现在从事服务业并不是很赚钱,也没有什么门坎和太高的技术含量。

比如说,商场的导购员和餐馆的服务员,往往素质都不会太高,如果遇到了素质高的,是一件值得庆幸的事情,原因很简单,素质高的人不回去做这些工作,即使做了这些工作,也是临时性的,或者很快升迁了。一个人素质很高,又做了大半辈子的服务生,那简直不可想象。又比如说驾校的教练,其实文化素质很高的就不多,原因跟上面一样。所以大部分人学车的体验很难好得起来,且不论教练是否和颜悦色,见钱眼开,就说很多教练其实都讲不清楚基本原理,只能是教学员一些死板的方法搞好应试教育。又比如说月嫂,你说素质很好高的怎么可能去给人当月嫂呢?稀有。所以很多人花了高价请高级月嫂,也不见得有多高级。

当然我们很容易看到,这些服务行业的消费升级,可能是一个想象力无限的市场,首先是经济水平上升后的必然要求,其次也将是人工智能时代的特点,如今看起来有些技术含量的工作,比如开车,以后可能都会被人工智能取代,而一些需要人的亲和力的职业比如销售却可能依然存在。

不过我想到更多的是,一个社会公平的意义,如果不注重社会的整体进步,富人们赚再多的钱也可能享受不了太好的生活,因为谁都避免不了跟服务行业的人打交道,如果始终认为这个阶层的人不值得拿高工资,那么永远也享受不了好的服务。更恐怖的是,如果贫富差距过大,各种悲惨的结局都写在历史书上了。所以说,为富不仁,即使从功利的角度来看,也是不对的。