Reading

书籍推荐 《Programming Languages: Application and Interpretation》

published on

正好赶上劳动节要放假了,在网上转悠的时候发现这本书。用来讲述编程语言特性的一门课程。这本书可以在线阅读,用plai作为关键词google一下就可以找到。

按照一般的作风,这里应该放一张封面的靓照,我就省去了。

今天简单的看了一下,非常喜欢,很快看到了第15章。书中的代码都是用的scheme实现的,不过为了教学目的,对scheme做了扩展,形成了专门为这个教学使用的语言。如果没有scheme经验的同学可以先看看《SICP》打打底。

书中的主要内容就是介绍语言的各种特性。方法就是通过编写具有这各种特性的语言的解释器。了解多种语言的特性可以帮助你理解在各种语言中,那些设计为什么要做成那样,哪些地方是好的设计,哪些地方实际上应该可以更合理。

说明: 后面关于书的内容的介绍是基于07版的,其网站上有2007版和 2012版两个版本的下载,而我是拿着07版在看,预计看完之后快速过一下新版的修改的内容完事了。

最开始,先是做了一些基本的介绍,说我们研究的不是具体的语法,而是语义。也就是区分不同语言的关键不在于看起来写成什么样,而是其具体有什么作用。所以用lisp有一个巨大的方便之处就在于不用在语法这件事情上纠结了,可以方便的得到ast,然后在上面做工作。

第二部分先实现了一个具有基本功能的语言,包括基本的计算和函数调用。同时会介绍static scopedynamic scope的区别。

第三部分讲惰性求值,举了两个例子,其一是Haskell,这个是很标准的惰性求值的语言。不多说,另一个是unix的管道的设计。管道的作用是将一个程序的输出作为另一个程序的输入。而输出会造成阻塞,只有另一个程序将这写输入了之后,前一个程序才会继续运算,所以这个设计就和惰性求值有着一样的特性:可以处理无限。例子比如命令 yes | head -n 5 就会输出5个y,而仅仅是yes的话,就会产生无穷的y,可以你要多少给多少。比如用在yes | rm * 这样的命令中就会很方便。

这里面提到unix的一个设计的哲学就是为10个元素提供10种工具,不如为1种元素提供100种工具,然后将这些工具组合起来就得到非常强大的力量。在unix中这个东西就是stream,但是最后这个东西有个缺陷,就是不便于表达结构化的数据,一切都为了内容是可读的。

这里其实隐含这再说lisp才是最牛逼的,这里什么都是用s表达式表示的,有大量操作s表达式的操作,所有的运算的输入和输出都是s表达式。多么美好啊。当然如果看前缀的算术表达式能习惯的话,是挺不错的。

这里扯多了,第四部分讲递归是怎么实现的。为了构造循环的Env,使用了初次使用了box功能。也就是说引入了非pure functional的部分,对已有的值进行了修改,否则很难想象怎么构造一个环:1.A引用B,2.而B引用A,1要求在你构造A的时候B已经构造好了,而2相反,所以只能先构造一个再改了。

第五部分简单的讲了一下我们不一定要用原生的类型来表示新语言中的值,比如你用C写一个解释器,解释的语言的整数在C中也可能是个string或者和struct什么的。在scheme里面我们甚至可以完全就靠闭包来当作数据结构使用,模拟各种值的行为(当然性能就很微妙了)

这只是一个简单的过场

第六部分开始为我们要解释的语言加入了副作用。显示加入了box和unbox这样的功能,类似C里面的指针,虽然没有赋值,指针不能变,但是我们可以改变指针指向的东西了。

之后要允许变量直接赋值了,修改变量的值相当于取出变量对应的地址,然后改对应地址的值。

出现变量赋值后,就又提出了一个问题,函数调用的时候就产生了两种方式传值和传引用。

整体来看这里已经涉及了比较丰富的概念了内容了。

后面的内容我还没有看,只是简单的过一下目录,下面概括一下,有机会以后再展开讨论。

第七部分讲延续(Continuations),通过web程序的特点引入的。然后提到了CPS转化,再引入延续,最后将怎么实现。不了解的同学或者听说过协程(Coroutines),其和延续关系非常大,具体不多转述。CPS的话可以参看一些node.js的资料应该会有个大致的印象。

第八部分讨论内存管理的思路,比较像C那样显式malloc free和函数式语言那样自动分配的区别。

第九部分专门讨论语义,具体看后再说。

第十部分类型系统,最后会涉及自动类型推导,目测会比较有意思。

第十一部分搜索,实现一个prolog那样工作的语言

第十二部分DSL和metaprogramming,元编程,让人疯狂的宏

Read More...

番茄工作法快速入门

published on

这篇post是我从《番茄工作法图解》一书中抽取一些内容,简化而来,其有几个特性:

  • 干掉了很多内容,主要考虑怎么做,不研究脑的原理了
  • 只有个人实践的部分,无视别的内容,像什么PDCA循环,浅睡眠的方法,和团队一起的方法,这些都不是要点,需要结合实际并参考其它资料摸索比较好。

那么下面开始。

入门:启动一个定时器

这是番茄工作法最根本的地方,在进行一个工作前,开启一个计时器,在时间到达之前都坚持全心的投入到这项工作中。

该方法的要点在于让我们每次集中精力处理一件事情,如果有一个时钟帮你计时,那你就不用担心别的事情要处理,现在就做眼下这个事情!

这个方法有一些hint:

  • 将时间每次都设定为25分钟,这样有一个简单的好处,你不用每次都浪费时间和心思考虑接下来要定多久的时间,我们帮你选好了。使用固定的时间有助于培养习惯,这样对于改进很有帮助。当然还有其它的好处,之后再说。
  • 每25分钟之后休息5分钟,恩总之是要休息的,当然到我用的时候,每次休息都超过了5分钟,但是效率还是比不休息高很多!每4个25分钟之后休息15分钟,当然这个其实问题不大,我就不怎么在意。
  • 工作中可能会发生中断,比如自己想到了一个和这个工作无关的事情,那么写下来,时间到了再考虑。如果是别人来找你,那么就要变通的看了,要么协商推迟一点再来,要么考虑放弃这个番茄钟,下次重新开始。
  • 如果定时器的时间还没到,工作已经完成了怎么办?这个每个人可以有不同的选择,我倾向于确保之前做的工作的质量,将这些时间用于检查和回顾。并尝试总结一下看看有没有可以改进的经验。如果是写代码的时候就会考虑能不能补一些边界的test case。
  • 定时器可以用选择很多了,只要25分钟能停下就行。你会发现有物理版的厨房定时器(该方法名来自于此,不过这个钟走的时候有声音,可能会不习惯),电脑上的软件、在线程序、Chrome商店里大量的应用、手机上的app、乃至你用的文本编辑器都可能有相应的插件。

其实到这里,你已经学到很重要的方法了,可以试试将其运用一下。如果感觉合适,可以考虑下面的进阶内容。

记录和预估

现在开始,工作的时候,拿出一张纸,写下你的工作。当你在这个工作中花费了一个番茄钟之后,你就可以在后面划一个勾。

前面讲了每个时钟25分钟,有一个好处就是便于这里的记录了。当然你可以慢慢摸索适合自己的时间长度,要点就是固定住。

这是对你工作情况的记录日志。当收集了几天这个信息之后,你就有了下面两个信息:

  • 平均每天大概能完成多少时间片
  • 各种类大概要花费多长的时间

有了这两点后,我们可以进行预估,当我们写下一个任务的时候,我们可以先估计这个任务需要花费多少个时间片,在后面画上对应数量的方框。当我们执行的时候就用勾去填充这个方框,如果发现不够了就再估计一次用圆形补充,再不够再用其它图形。要点是通过记录我们估计的情况,我们就能拿到我们估计的准确程度。我们的估计一般是偏多还是偏少?在不同的任务上的表现是什么样的?通过类似的分析,我们就可以慢慢提高估计的准确度。当然无论如何估计都是利用条件来猜,永远达不到100%。

最后你每天的记录可能有这么几列:

  • 总预计工作时间
  • 总完成工作时间
  • 估计误差时间
  • 估计错误的项目数
  • 估计错误2次的项目数

或者任意从你记录的数据中能够分析到的都可以。

收集和安排

严格来说,收集并不算是和番茄工作法联系紧密的部分。对收集讲述的比较透彻的应该是GTD系统,可以参考Getting Things Done那本在时间管理中很流行的书。

简单来说,就是要有一个系统,把你想做的要做的事情都记下来。你可以把它们记录到一个本子上,或者存在电脑里(使用文本文件、excel或者某些专门的软件比如MLO),还有很多网站提供服务让你把这些玩意存放在网络上,如Google Task、Wunder List等。这样做的主要意义是让记事这个工作从你大脑中抽离出来,让它更容易专注于眼下的事情。

收集的话一般会选择随身带笔和本子,或者是使用手机记下来。现在手机可以手写和录音还是蛮方便的。之后整理到电脑里或本子上就是了。

有了这样一个list,你就可以把里面的内容和番茄工作法结合起来了。每天早上,从中选择今天要完成的工作,估计好时间,主要选出来的工作的时间不要比你一天能完成的多,今天把这些事情处理好就行。如果完成的快,可以再考虑接下来的事,或者反思一下最近的工作。

快速小结

如果想要采用整套内容,可以参考下这个简单的提示方案:

  • 早上: 设定一天的任务,预估时间
  • 工作: 定时-休息循环
  • 晚上: 整理工作数据
  • 一周: 回顾数据,思考改进的方法
Read More...

设计原理快速入门

published on

这是我在阅读 《写给大家看的设计书》 一书之后的笔记。

该书讲述了非设计人员进行设计工作的时候可以参考的依据。要点概括起来主要就3个方面:

  • 4个基本原则
  • 颜色的原理
  • 字体的设计

4个基本原则

此乃本书最重要的一个部分,怎样做出好的设计,怎样找出现有设计中的问题?

非常简单,对照下面4个基本原则,并加以训练,便能够把握到设计中的缺陷。加以调整改进便能得到更好的设计。

这些基本原则是:

亲密性

亲密性表现在应该要将相关的内容放在一起(比如标题和副标题,一段的标题和内容,问题和答案,这些相关的内容应该放的比较紧密),无关的内容尽量分开(比如上一段的内容和下一段的标题之间就可以空多点)

对齐

整个项目尽量采用一致的对齐方式,统统左对齐或右对齐,尽量避免居中对齐,左右对齐时有明显的基准线的感觉。不要让一些边界靠的很近,却又没对齐,会有不舒服的感觉。

重复

重复出现的内容使作品具有整体感,字体、字号、对齐方式、插图、等等各种元素都可以作为重复的素材。

对比

对比的概念最简单:如果两个元素不同,那么就让它完全不同。对比需要加以突出,如果两个元素很相近却又不完全相同的感觉会很别扭。

这4个原则应该算是最重要的内容,后面的颜色和字体都是设计的工具,使用的时候也是由这些原则加以指导。

颜色

色轮 是在挑选设计的颜色时的一个重要的工具。

整个项目的颜色风格可以事先选择好,制作成色表,之后再从里面挑选。

字体

字体部分比较有意思,书上讲了5个字体族

  • OldStyle 从手写演化来的字体,适合阅读
  • Morden 产生较晚的字体,比较醒目,可以做标题
  • Slab serif 简洁,可读性好,可用于大段文字(儿童图书中常用)
  • Sans serif 无衬线字体,比较典雅
  • Script 手写字体,不适合做阅读
  • Decorative 装饰字体,可用于名人名言

之后讲了一下在实际上用的时候这些字体的搭配方法,大致也是按照前述的4个基本原则来的。

看到这里顺便在wiki上学到了字体分衬线字体(如宋体)和无衬线字体(如黑体),字小的时候衬线字体表现一般比较好,往往用于书籍的正文等等位置,而无衬线字体往往用在标题等位置。而现在慢慢发现在电子设备屏幕上,无衬线字体用于大段文字表现不错,所以慢慢演化了。比如微软雅黑的出现,取代了原来的默认字体宋体。

关于本书

这本书内容不多,我在豆瓣阅读上,大概花了1天在公共汽车上的时间读完。核心内容就是上面总结的3个方面(颜色部分被我省略的较多),不过作者还花了很多的篇幅来指导你在不同的产品中使用这些要素,比如名片设计、海报、传单、媒体广告等等。内容主要是偏向于印刷品的设计,而我本来是想学习技巧使用在ppt制作之中。当然由于正好学到了很多基本性的原理,用在各种地方都是非常合适。

另作者还有一本书《写给大家看的ppt设计书》也是写给大家看系列中的一本,我准备找机会再看掉,本来这套书好像都挺薄的,看上去也没什么压力。

Read More...