蔡学镛([email protected])
之所以认识这位仁兄是因为看过他的《Java夜未眠》和几本译作,感觉文笔顺畅言之有物,没想到也被淘宝挖去作架构师了。初见此人很是有眼前一亮的感觉,T-Shirt、牛仔裤加运动鞋,面相很是青春。没想到会场里和我一样八卦的人也不在少数,有好事者问他的年龄才知道实际已近不惑,遂慨叹其驻颜有术保养得真好。所主持的两个Session:“尼古丁加咖啡因--不瞌睡的PPT制作秘诀”和“DSL设计与实践”内容都相当不错,为人也很大方,找他copy幻灯片也欣然应允,给人留下很好的印象。
(一)DSL设计与实践
Domain Specific Language(DSL),是近几年才兴起的一个新兴的软件工程领域,我们可以将其理解为一种抽象的语言。该语言与我们日常使用的C/C++、Java等编程语言不同,DSL是面向问题域的,是用来描述某领域问题和解决方案的工具。举个例子来说,在音乐的领域,通用语言是五线谱,各种乐曲都可以用五线谱来描述,五线谱就是DSL;数学家解决数学问题,数学公式就是他们的DSL。说白了DSL更像是一种领域相关的脚本语言,该语言用该领域的知识进行描述和解决,最后如果想要在计算机上得到结果,需要把这种用领域知识写成的“脚本语言”翻译成一种计算机可以支持的语言(如C++,Java),并编译执行以得到最终结果。这里,DSL对应的计算机可以支持的语言称为Host Language。一个DSL可以对应多个Host Language,类似于我们既可以用C写的程序去计算数学公式,也可以用Java。以上只是我对DSL的一个粗浅的理解,对于DSL更精准定义和说明jerry说他也在等Martin Fowler(不认识此君?赶快去面壁)的书,他的书出来之后DSL才能算是有了真正意义上的理论基础。不过请记住两个关键点就够了:1 DSL是一种抽象程度更高的语言,2 它是以脚本语言为核心设计的
现在我们已经大致了解了什么是DSL,那么它有什么好处呢?如何在工作中使用DSL呢?这是必须解决的两个关键问题。
首先,我们已经知道,DSL是一种领域相关的抽象语言,在语法上肯定要比Java/C++这些具象的语言来的简练。更关键的是,DSL作为某一领域的“方言”,可以方便领域的专家用其更为熟悉的方式来描述和解决问题,避免了通常情况下领域专家也必须学会编程语言才能利用计算机工作的尴尬。比方说一个数学家想要利用一个复杂的数学模型(一个或一堆数学公式)解决一个数学问题,问题是他不会C语言,没办法直接写程序。但是他可以使用Matlib的脚本这个更贴近原来的数学公式的方式来描述问题和解决方案,Matlib软件会把脚本编译成机器某种语言书写的代码病编译执行,这里的Matlib脚本就是DSL。
虽然DSL威力强大,但是使用起来还是有不小的门槛,只有我们能够回答下面几个问题的时候,才可以真正动手构建DSL
1. 使用在那个领域?
2.使用者(及其知识背景)为何?
3.有没有模仿与参考的对象?(SQL,CSS...)
4.是否有制作工具的必要?
5.使用何种Host Language?
正如你所料,构建一个DSL是复杂且代价颇高的,下图就给了我们一些这方面的启示。首先我们需要定义一套对应领域的语言规范,但是创建一个新东西是很困难的,这也是上面第3点提到的要看看是否有模仿与参考对象的原因。有了语言规范之后,就需要一个解析器和代码生成器来将DSL翻译成一种我们熟知的程序设计语言,最后再将生成的源码编译成机器语言并执行。
这里我们可以看到,由于涉及了多个中间环节,且每个环节的产出物的构建过程都是相对较复杂的,所以一般来说自定义一个DSL是相当麻烦且极易出问题的。那么如何降低复杂度、提高效率呢?简而言之两个字:方言。所谓方言可以粗浅地理解为某一个Host Language(比如Java)的功能子集。举例来说,Java语言是一个功能强大的Host Language,但是数学家并不需要知道gui怎么做(即不需要swing),也不关心网络和线程(即不需要IO、NET、Concurrent API)等等,他只需要做算术计算的部分。于是对于数学领域的DSL,我们只需给出一个类似Java的语言,去掉数学家不关心的功能,剩下的就可以作为该领域的DSL。
这样做的好处显而易见,既避免了自己定义语言规范,又可以省去翻译和解析的过程,领域专家写的DSL几乎可以直接翻译成目标代码。此外,如果DSL需要扩展功能的话只需要把这个Host Language的相应部分取出来用就可以了,方便快捷。即增加了弹性又可以减少自定义DSL与Host Language之间的阻抗。
JerryTsai在最后给出了一个支付宝后督系统的实例。由于支付宝中每天有海量的支付单需要处理,每单又可能需要与多个外部系统打交道,这就需要一个系统来记录每一单目前的状态以及下一步骤应该进行什么操作。但是由于定制支付单流程和规则的人可能并不是程序员而是相关的业务人员,如果每次都由产品获业务人员定义规则、提交给技术开发、完成后再调试,整个过程就会相当繁琐且容易出错,而且对于某些易变的业务采取这种策略也不合适,这时DSL就可以派上用场了。
经过一系列参考和权衡之后,选定了状态机语言作为作为这个领域的DSL,于是业务人员只需要掌握简单的状态机语言就可以完成整个流程,而无需程序员的参与。更进一步地,我们知道由穷状态机用状态转换图来表示是最直观的,如果有一个状态机GUI,只需要拖拖拽拽就可以完成DSL的编写,连状态机语言都不需要了。不过由于为DSL构建专门的GUI工具是比较麻烦的,我们在实际工作中需要评估提供GUI工具是否合算,对于重点业务且直接写DSL脚本容易出错的情况下提供GUI工具自然是很理想的,但如果重要性不高的话也没必要花很多时间去实现GUI。
小结:
1 DSL的本质是抽象
2 DSL是以脚本语言为基础的
3 决定使用DSL之前需要做足够的调研
4 虽然DSL威力强大好处多多,但是创造一个DSL是很复杂的,尽量使用方言和已有工具简化中间过程
(二)尼古丁加咖啡因--不瞌睡的PPT制作秘诀
自学生时代起,讨论论文、毕业答辩、分享经验、演讲….PPT成为了生活中不可或缺的一部分。虽然演讲技巧因人而异、演说内容千差万别,唯一不变的只有一点,那就是有吸引力的、内容丰富的PPT是成功的一半。而与此相对地,内容单调、满篇文字、冗长拖沓的PPT则是打瞌睡的幕后推手。想要做成一份精彩的PPT,我们确实还是需要一些技巧。
首先我们要知道PPT简报主要包含材料、结构和修饰三个基本要素,有的放矢地针对要素进行优化,才会有事半功倍的效果。
1 材料
简报选材首先要确定目标听众,只有目标明确,才会在演讲中与听众产生共鸣,促进交流。其次就是要精简,简洁明了、 不拖沓是放之四海皆准的道理。对于所讲述的内容最好要以类似说故事的方式来陈述,避免死板地堆砌概念名词,或者讲述的经过枯燥无味。最后,一份简报的内容最好不要超出一本书中一章的长度,因为据统计,一份简报的时间长度应以90分钟为限,超过这个时间打瞌睡的指数就会成倍增加,所以简报内容不易过长。
2 结构
简报结构尽量结构化、扁平化,不要采用树状结构,而应以链式结构为宜。在每一页的内部,应慎用单字页面,多用句子页面,少用段落页面,不用小节页面。
3 修饰
PPT中最好的修饰就是图片,好的图片不但美观,而且可以起到视觉刺激、加强解释和加深记忆和联想的效果。在使用图片的过程中要适当留白以减缓心理压力,要注意画面布局会影响阅读次序与重点判断,图片的“噪声”会影响欣喜地接收;颜色,配色会产生心理作用。既然图片这么重要,那么如何找到切题且美观的图片呢?主要可以通过以下下4个步骤:
概念的图片相对好找一些,对于实物的找到对应物品的图片即可,抽象的就得使用下面的联想方式了。联想指我们看到某个事物之后头脑中的抽象反馈,例如看到维纳斯雕像的时候我们会反映出“美”,而太极图所表达的含义则为“平衡”,不过按照这种方式找图属于逆向查找,得平时积累很多素材才行。关键词就比较简单了,一旦联想出抽象概念之后就将其转化为关键字,然后问问无所不知的google和baidu就行了。本Session后半段就是一堆演示的实例,最主要还是强调图片与内容完美结合,我们回去可以多攒一些素材,以后说不定作PPT就用得上哦 :)