
ThoughtWorks首席科学家Martin Fowler,也是Agile领域的缔造者,今天在Qcon全球企业开发大会北京站上向与会者介绍了领域特定语言的发展与应用。
以下为其演讲全文。
Floyd Marinescu:所以现在我非常地荣幸向大家介绍Martin Fowler,他也是敏捷宣言缔造者之一,大家有很多人都听过他的名字,那么Martin Fowler请您过来,所以我今天感到非常的高兴。Martin Fowler很少去外面旅游,然后参加会议什么的,所以今天他能够来,是我们的荣幸。
Martin Fowler:非常感谢大家让我又回到北京了,因为我以前来过北京,来过好几次呢,而且以前我刚来的时候,我们在北京的办公室非常小,那么现在在北京已经有100多个人了,所以在我们的公司,这是一个非常有趣的一个项目,所以今天我要跟大家谈的主要是要关注一个在我下一本书要关注的这样的一个领域,也就是领域特定的语言,那么领域特定语言,实际上是一个非常常见的这样的一个技巧,对于软件的开发来说。那么如果你是写任何一种软件系统的时候,在过去几年当中,你肯定会碰见一些领域特定语言。你可能不一定能够认识它们,说它们是领域的特定语言,或者说认为它们有什么特别的,但是实际上,这一块是非常重要的一块,在软件的开发世界。
那么领域特定语言它的发展已经有很长的历史了,大概至少,我参与到软件开发中来就已经有这样一种领域的特定语言,但是人们一直没有太重视它。这样的话我想就导致了几个问题,尤其是我们应不应该更多地利用这个领域特定语言,比如说它可以提供给我们一些能力,这些能力我们可以更广泛地应用,尤其是更好地来建立这样的一种领域特定语言,这样的话我们可以更有效地使用它。所以这两个问题实际上都是一直在驱动着我的工作,因为我觉得这里有很多的机会可以更多地使用领域特定语言,而且更有效率地使用它们。
但是在我进一步地讨论这个问题之前,因为我能够在这么短的时间只能讲很少的内容,但是不管怎么样,我首先描述一下什么是领域特定语言。我们大多数人都知道我在介绍的时候,总是喜欢用例子,所以当我更年轻一点的时候,我花了很多的时间来看一些不好看的电影在电视上,但是有一个非常常见的,不好看的电影有一个特点,不管是东方还是西方,有一个情况,在这种情况下,会找到一些秘密的通道,这这个通道可能是在城堡里,你按一个杠杆,或者是按一个电纽,你在一个很怪的地方就按开了,我举一个例子,我想像一个公司,一个公司是销售安全系统,比如说他使用领域特定语言,比如说我可能会有一个,在我的家里,我有一个特殊的这样的一个控制板,这样的控制板我可能是需要有物理这样的一个密码,然后我们可能会以某一个顺序来开,开一个灯,然后再开一个抽屉,然后这就可以使我把这个秘密的们门板打开,就是你要遵循特定的密码程序,但是如果我给人们这样的一个秘密的门板的一个控制杆的话,他都有自己的这样的一个序列,如果要开这样的一个秘密的门板的话,要有一个特定的序列,所以要知道这个事件的顺序,保证这个门能够正确地按照正确的顺序来打开,否则它就不能打开。所以这个就是一个经典的例子,就是领域特定语言对我们来说有什么样的帮助,它可以去描述什么是合法的一个打开门的程序。
那么,对于这样的一个问题,这样一个广泛的问题,现在已经有一种方式来考虑这样一种表现,那么这是一种很自然的方式,也就是用一个STUCES机器,我们可以进行模拟,我们可以用一种过渡的这样的一种方式去模拟它,比如开始我们从初始阶段开始,然后从初始阶段,我们会转向比如说活跃状态,然后当我们进入这个活跃状态的时候,不仅不管是开灯,或者是在抽屉打开这样一个事件的时候,我们进入第三个阶段,也就是剩下的阶段,也就是门打开这样的一个阶段,所以这也是一个经典的实施的方案,也就是我们这样的一个图式。
那么,有一个在这样的一个程序里面,它的独特的特点是,每一次打开这个通讯门的时候,它就会回到原来这样的一个序列,那么这样一种表现它并不是我提到的最典型的一个方式。它是对于这个机器的这样一种变体。另外呢,如果我们是在一个软件的家庭开发过程当中,我们比如说用这样一种机器,通常我会考虑的步骤就是要建立某一种多目的的图书馆或者是框架,也就是说我会创造一系列的JAVA或者是CSHOP或者是其他的这样的一些编程的语言,然后要使用这种语言来建立一系列的程序。那么要想编程的话,比如说它就可以允许我们能够把一个STED机器进行虚拟和代表,可以把它移动起来,所以我们可以把它变成一个特定的这样的一些对象,这样我们可以创造出一系列的程序,然后把它们交织起来,并且去描述一个常见的STED机器,所以把它们交织在一起的时候,我们可能会有一些编码,比如说像这样的一些编码,然后STED机器要区别不同的部分,要求不同的部分去进行不同的操作。另外,在这个系统的不同STED之间会有各种各样的活动。
你在屏幕上所看到的这样的一些编码,它实际上你在做一个STED机器模式的时候是足够的。同时,如果大家对于这个模型的细节很感兴趣,你可以上我的网,就是Martin Fowler.com,你可以看到发展及其应用,你可以看到这一块,这里面有很多的内容是我下一本书里面所包括的内容,所以如果今天有一些细节大家没有听明白,或者是怎么的,大家可以去上网去看我的网站。
那么,这里的编码实际上是一个非常好,而且非常好也非常紧凑的编码,它可以帮我去描述,为新的客户去描述新的这样的一些机器,但是它确实也有几个缺陷,第一个缺陷就是表现在,或者我觉得也是它最大的缺陷。那也就是说,实际上它是一个STED机器,所以它在读配置语言的时候,不是特别明显,所以如果你要想解决这个问题,你可能是需要去了解它的一些模式来看一下是什么问题,但是其实在这里面要找出究竟在出现什么情况是非常困难的。所以,在把某一个编码它的功能是怎么样,去辨别的话,总是一个非常危险的信号,因为你必须要有你的程序,立刻告诉你,它在执行什么样的操作,越精确你就越能够来保证这个系统的稳定运行。
第二个方面就是关于这个编码,就是在技术方面的问题,但是,这是对于一些应用来讲是非常重要的,也就是说,这就是JAVA的编码,我们可以利用JAVA的编码,以便来控制这些机器,也就是说为了特定的客户来进行控制,在有些情况下,这些程序的编码,它们还是一个过程,那么我们就需要来使它,让它能够来改变我们的文件,然后重新开启我们的系统,然后给我们这个系统一个合适的行为方式,那么这也是比较普遍的方法,特别是在JAVA的这种系统里面。那么这也是比较普遍的,在通常我们可以看到这样的情况,也就是说我们把这个配置,把这个STVEP机器进行改变,进行编程,你可以比较熟悉这些配置。在这种情况下,我们在各种情况、各个过程之下来采用。
我们可以看到它这种能力能够来描述一下我们的这个系统。同时,也能给我们一个,在STEP启动的灵活性。在这里我们可以看到更多的这种STED机器的好处。但是我们认为还又可以改进之处,比如说在可读性方面还带来一定的负担,如果我们想要一种XML的描述,我们还要加很多的东西,使得更难以去追踪看一下发生什么情况,这是一个传统的方法,利用那种特定语言来做事情的。
那么我们再看一个例子,对这种领域特定语言,对于STED模式是一种什么样的情况,那它可以去提供同样的信息,就像我刚才在幻灯片里面显示的一样,我们可以另一种句法,这种句法是特定形式的,针对某一种形式的,大家知道这有两个后果,第一个就是我们在谈论这个机器的时候,它的机器可以说更多地被显示出来了,第二个结果更加地紧凑,我们需要更多的字节来描述发生的事情,这个紧凑型也是一个比较明显的东西,它并不是我们所关注的要点,关注的要点是清除性,但是你越紧凑,它就越清洁、越整洁、越明白。
在这里我们可以看到XML它有很少的字节,它并不会告诉你特定的问题,但是他会有足够的供XML使用,那么对这种领域特定语言的目的,就是说也可以来描述它的这个结构,当我在写这本书的时候,我也想到了一些特定的这种机器来处理这个XML,以及领域特定语言,我们有一定的工具,还有一些相应的这个领域特定语言的经验,我们可以把它们放在一起,这样的话能够来很快地加以应用。
这种语言可以说有更多的例子,来针对这个领域特定语言,那么还有一个不同的版本,就是说对于这种领域特定语言不同版本,如果我们来跟刚才的那个比较的话,我们就注意到这里面有一些区别的,但是我们还仍然有一个比较紧凑的编码,那么还有这种,它也可以很清楚,跟刚才那个案例一样,但是问题区别在于它有很多的,我对这个事件的描述有一些是基于编码的,我看到一些逗号和引号,我们有时候要去避免这些东西,但是总体来讲它的这个结构仍然是很不错的。但是对这种领域特定语言还是有所不同的,有特殊的情况,我们来看这里的情况,也就是说在这个Ruby的里面有经过论证的语言,看起来它像特定语言,但是实际上它是Ruby的过程,它结构很清楚,过程也很好,但是Ruby有一些切入性的句法。在使用Ruby跟领域特定语言之间就是有一个例子来看一下这个特定语言里面的它的这种形式,还有一种是内部和外部的这个领域特定语言,那么外部的这个特定语言特征它是一种比较纯粹的句法,是大家所开发出来的,然后你可以利用这些传统的计算机的这种方法来做一个句法,那么内部的领域特定语言就是,它实际上是一个比较通常的方法来使用这种,以便能够让这个特定语言能够进入到一个特定领域去,它和这种普通的这个特定语言是不一样的,利用这种内部的这个DSL的话,你在这个主机上采用特定语言,你的好处就是你不用去有传统的那种东西,在这种编程的环境之中,那么也就是说你自己可以去编程,使得它发挥这种特定的功能。
在计算机世界里面,这一种计算机特定语言也是起了很大的作用,可以说在我们业界是广泛使用的,在很多的也使用了很多小的配件,你可以看到在这个里面是一个很好的例子,这种内部的方法,它也有一个很长的历史,特别是LUNX的编程也使用得很多。
刚才我也谈到了我们如何来处理这些问题,特别是利用这种XML的问题,XML可以很有效地作为一种外部的程序,那么,我们必须要遵守一些已有的句法的系统,那么XML可以直接是可执行的这些程序,所以它的本质上还是一种外部的特定语言,XML的背景我使用这种术语,但是基本的概念就是类似的,它能够使得我们能够去除我们客户背景下的一些问题。
我个人认为,如果我们能够使用这种领域特定语言,那这样的话你就比使用XML好得多,因为它能在这种特定的背景下去阅读,实际上也是这样的。
我们内部的特定的语言在Ruby的情况下,导致另外的一个问题,当我们去看一下刚才的例子的时候,我们可以看到它的一些特定语言的问题,这个Ruby的编码我给大家显示的它实际上使用了Ruby的一些方法,比如说一些特定的Ruby的编码,它有什么区别呢?这些跟JAVA的例子有什么区别呢?特别是在配制这个系统里面有什么区别吗?我想这里面有一些重要的区别,一开始的那个配制编码它并不像这个领域特定语言那样会起作用,更好的作用,STED机器实际上会给你带来什么问题,这里面存在的编码,这个结构的话,它对它的功能来讲是明显的,另外一个明显的区别就是Ruby它跟JAVA也是不同的,这个时候,它也导致了一个问题,也就是我内部利用JAVA的程序编码语言能不能使用?这也是一个例子,对于这种DSL来讲,还有我们可以利用JAVA,但是有时候它是一种领域特定语言的形式,我们可以看到JAVA的编码,它是一个一种奇快的方式,它是一种很快的编码,在有的情况下,如果你用了它的编码,你可能会遇到一个很好的反馈,但是它并不是说按照我们通常的这种常规的JAVA的编程的程序,那么现在STED这种机器的本质被显示出来了,可以比Ruby这种例子更加紧凑,这种STED机器,它对于机器之间进行交流的时候,它会有什么样的情况,还有一个区别也是比较有价值的,那么我们看到一个Commannd WQuery的API,还有Fluent API,我们认为哪种API更有用,更利于阅读,这种API比别的API更加有用,那么在JAVA或者是其它的编程程序里面,我们有各种不同的目标,我们要识别出各种各样的方法。它们本身就是说是可以让人很好地理解的,我们可以看一下这种STED机器的情况,也就是说它的内部的含义和外部的含义都是不言自明的。那么每一种方法它单独地来讲,它一看起来好像没有什么意义,你要是单独看的话它好像没有什么意义,但是你把各种方法结合在一起,你可以把它结合成一种句子这样的话,整体看起来比较有意思。
我们在这里看到可以有两种这种领域特定语言,作为一种方法来讲,在这种转换里面,它有时候会很有意义。所以这种Fluent API它是安全不同的方法来运转的,许多的编程都是利用Commmand query这种API,但是特定的情况下,我们要考虑这种特定语言特别是一种内部的特定语言,这样就会导致Fluent API的产生。实际上的话有两种不同的领域的特定语言,特别是在这种例子里面,一种是用的客户的句法,另外有一些变化在它的内部里面,比JAVA有一些变化,在这里能够给大家一些感觉,就是说关于什么是领域特定语言的感觉,那么在一种特定的领域里面,我们可以更好地去看一下这种特定语言的概念,我的书也描述了这种特定语言,那么也给了一个义,那么有很多的因素的话需要我去指出来。
第一个就是基于语言的本质,那么这也是比较明显的,特别是关于这种Fluent API里面更可以看到的,这种Commmand query领域语言,这种编码的话,它的程序编码在跟这个Fluent是不样的,即使我在这种正常的这种程序的编码里面在这里我提到这种语言模式,这种特应该给大家一种特定的语言进行编程的这是一个比较模糊的定义,但是我这一点还是比较重要的,同时它也是一种语言,我们可以利用就是有限的表达性,这种特定语言的话,它并不能够很好地描述比较小的系统,用这种外部的领域特定语言的话,那么它也并不是完整的,它也没有一个系统来做出我们的这种EXPRESSIVENESS,我们用了很多的这种特定语言,它主要是聚焦特定的编码的程序。那么作为这个领域特定语言的一种有限表达力的这种情况的话,无论你是STED机器,还是一些正规的表达,它也会执行一些特定的任务。
刚才给大家看了一些例子,我目前没有详细地讲述,但是我认为的话,如果我们有两个元素在这里面,这个里面有两个元素是非常重要的,刚才我也提到,这种STED事件内部的据库,我们可以对这种领域特定语言去建立一个库,我们在这里可以看到,我们有一个基本的STED事件的一种模块,来描述我们所发生的事情,另外,我们还有一种利于特定语言的来建立这种模型,显然这种领域特定语言的作用就是要进行给好地表我们的领域的有益性。这个脚本可能会使用一些传统的方式,那么它也可能使用一个内部的DSL,那么在这种情况下,它可能是有一些间接的这样的一些分割,但是它仍然是用这种DSL,我们有一种特定的这种模型,大家就可以执行,大家知道在STED的机器当中,我们可以很容易地来提供必需足够的执行的依据。大家可以看我的网站上会有整个的这样的一个例子。但是,在直接利用这样的一个STED模型它并不是我唯一能够执行这样的方式,另外一种方式实际上是使用另外一种程序,这样的创造编码其实是非常流行的,尤其是对领域特定语言非常感兴趣的人们,对于很多人来说,这种编码的创造,其实是一种非常常见的领域特定语言的发展方式,但是对于我来是说是一个选择,有的时候你可以做这种选择,有的时候必须要做这种创造,但是有的时候并不是必须的,有一些时候只会使系统变得更加复杂,所以对我来说这个编码的创造,其实在使用特定语言的时候,只是可供选择的,有的时候很重要,但是并不是永远都需要。
但是,我觉得非常重要的其实是这样的一个观念,就是对于语意模型,要有一个非常明确的概念,那么这个通常人们没有这么做,而且至少没有说像我所希望的那样做,很多人他们喜欢编码的创造,他们会直接从DSL的脚本来创造编码,而没有在中间建立一个语意的模型,而我认为这并不是最好的方式,一个语意的模型可以把一个问题的这些语言,语意的问题和它的那个实际的脚本分开来,这个是非常有用的。同时,它还允许你去测试,独立地去测试这个语意是非常有用的,尤其像我一样,因为我们经常会使用这个系统当中的测试。
我到目前为止,所描述的实际上是一些老式的传统的这样一些领域特定语言。那么它们已经有了几十年的这样的一个应有的历史,在不同的环境当中,人们都开始使用,但是领域特定语言,它不仅仅是关于这些老旧的工具也不是在书里面我只关注老的,虽然我喜欢老的,但是我也没有完全忽视新的,因为我们确实在领域特定语言里面有一个新的东西,这个新的东西就要就是叫做Language WORKBENCHES,这个在几个不同的地区同时涌现,这个待会儿我可以给大家介绍,但是它的观念是提供一个特殊的软件工具,可以使得人们更加容易修改特定领域语言,同时,可以提供特定的这样的编程环境,就是你在DSL脚本上所编写的语言的更好的改编的环境,所以它不仅仅是把你的STED机器进行一种编程,同时它还有一个文本的编辑器的作用,因为人们现在经常会在一些比较复杂的软件的开发环境当中,他们希望会向什么方面发展,会成为什么样的模式。所以你需要一个模型,它不仅能够描述之前的这样的一些投入,而且能描述这个机器所编辑的情况,所以如果要实现这一点的话,你可能就需要一些间接的方式,而不是直接的方式,那么我们这里的Language Workbenches就是为了你提供这样一种工具,提供领域特定语言,同时提供文本编辑器。
在微软和其它地方都得到了接受,这种观念很早以前就产生过了,但是最近他比较出名的是叫MPS所创造出来的系统,这个系统之所以有意思,是因为它是以开发一些应用型的软件为出名的。它就是要使得这些软件,使得人们更容易获得,其他还有一些工具,一些成熟的工具。所有的这些关注实际上都是在提供一个更好的编程的环境。那么有很多的这些工具,它们是怎么做的呢?就是它们来改变我们去看待,我们去编辑代码的这样一种方式和态度,那么有一个我把它称为叫做原编辑系统,那么就是我们可能是有一个文本,然后对这个文本进行一些编辑,然后把这些编辑成一个可以执行的系统,那么这个文本本身,它是一个对代码进行编辑和存储的这样一个机制,那么人们怎么做?人们做,他们是采取一些不同的编辑的方式,我们把它叫做Projectional Editing,这里有一个编辑库,这里会描述你所在进行编辑的这样的一个系统,然后从你的图形库里面进行一个选择,进行匹配,也就是说要从你的语言库里面来提取相类似的模型,通过工具来选择,那么我们这里的模型库实际上是跟代码的创造相关的。但是现在它是被作为一种大多数的软件开发项目当中的一个基本的工具,因为它有很多的实用的这样的一些好处,比如说我们会有一些文本模式的控制,有更复杂的文本编辑系,但是有很多的Lanauge开发人员都在使用它,因为它可以使得它们更容易来描绘,来定义这样的一种智能的,领域特定语言的开发的环境,所以现在有好几种语言。
另外一个重要的,允许你可以画出STED机器的模型图,然后通过模型库的对比,来选择最佳的模式,那么这里其实也是有一个文本的输入,但是它是有特殊的文本编辑器对它进行编辑。那么,另外,它们可能是在一种人们比较受欢迎的模式,但是Projectional这个系统当中,你没有理由同时使用文本和图形,但是再一个语言系统当中你就必须要使用文本。
它其实是DSL的第三个支柱,那么前面我提到了内部的DSL和外部的DSL,刚才提到的这一点是DSL的第三个支柱,那么从外部的DSL已经存在几十年了,而且也是大家理解的比较明确的,而我们的这个是比较新的,我提到的这个在幻灯片上列出来的基本上大多数大家都还不熟悉,有很多都还是处在早期的开发的阶段。但是我想它们有非常大的潜力。而且他们所持的观点,他们以后可以改变我们根本性的对编程软件的想法,不知道这个能不能发生,但是我认为这个工具是非常有趣的,而且是未来非常有趣的发展方向。但是对我们现代来说,我们需要关注的是,如果说我们使用DSL,那么内部的和外部的DSL比较简单,已经有几十年的时间,但是如果我们需要考虑一下,为什么我们希望使用一个领域特定语言呢?使用那些基本的内部和外部的领域特定语言也就是DSL,为什么要使用它们呢?
第一个原因你可能会比较感兴趣,就是我要使用DSL,也就是最容易理解的,它实际上就是关于说一个非常经典的案例,这里我们看到一个公式,这是一种DSL的表达,也是最古老的表达,也是很多编程人员常用的,大家可以看到,这是一个非常常见的符合美国的电话号码,是四位数,如果大家要去看一下它能不能够符合你的一个文本的风格,那么这里就需要去了解怎么样去描绘它,但是一旦你了解了它常见的表达,你就会比较容易去理解它。那么如果你会比较熟悉,比较习惯于阅读它的这样一种习惯的表达的话,那么你就会明白你在寻找什么,那么你需要写的另外一种可供选择的编码,你就需要跟它进行一个对比和匹配。所以,使用DSL一个巨大的优势就是它可以改善你的效率,因为它可以把你的这些工作变得更加清晰,也变得更加紧凑,另外DSL对于我们其它方面也有很多的好处,比如说它可以把你更明确的和紧凑的简洁地来表达你要做的程序。
但是,DSL最有趣的好处还是在于我们需要不再仅仅地将我们的编程人员考虑为一个消费者、使用者,因为这里是一个常间的特定领域语言,这是CSS代码,CSS比较有趣的现象有很多人来做CSS编码,他们不认为自己是编程语言,他们认为自己是网络设计师,因为尽管他们使用了一些非常复杂的编程人员,他们实际上已经是一个领域特定语言的这样的一个描述了。有很多的这样的一些,他们所设计的CSS网页,他们本来就是网络设计师,他们使用JAVA或者是CSHOP,或者是其他的简单的像Ruby这样的一些网页设计人员,但是CSS非常有用,他们可以非常明确地表达他们的网络是什么样的,同时他们可以看到在他们的网页上发生了什么情况,这个会导致,我觉得CSS最有趣的方面,它可以提供给商业人员或者是其他的一些人员一些沟通的方式。
实际上你在听很多人在讨论DSL的时候,你可以听到人们谈论到这一点,但是你可以知道,也就是说在这个论点当中,可能有一个重大的缺陷,那么有很多人,他们可能从DSL来跟领域专家进行沟通的时候,获得了很多的好处的时候,那么他们就会梦想说他们可以写出非常重要的程序的一部分,CSS的网络设计师可能能做到这一点,但是描述一个计算机的系统,以特定的精确度来说永远都是一个困难,所以很多年来,我们都有各种各样的项目来创造一种很好的环境,就是说商业商务人士就能使用,不需要我们的编程。但是它之前设计出来是允许商务人士能够不用编程人员来自己进行一些简单的操作。
这样的话,我们就必须,当人们说一个DSL可以允许商务人士来不用编程人员自己来写程序,那么这个就是很值得怀疑的。实际上你可以从DSL当中得到很多的好处,也就是像商务人士能够读DSL就好了,尽管他不能写DSL,但是他可以读,他可以理解他们现在在进行什么样的操作,他们可以找出其中的错误,他们可以加入他们觉得一些合适的改动。那么这里最关键的一个问题就是说它改善了我们沟通的带宽,也就是在商务人士和编程人员之间增加了沟通的带宽,所以这现在也是我们软件开发的瓶颈,也就是这个沟通的渠道,所以如果我们能够改善这样的沟通的渠道的话,那么它肯定对于我们开发系统会有好处。
这样的话我认为这也是一个有趣的方法,如果你把DSL作为一个跟商务人士沟通也是一个很有趣的方式,商务人士不仅可以阅读发生什么,而且他们可以知道系统所容纳的限度是什么样的。那么,如果能有这样的一种语言,能够让那些领域专家理解的语言就非常重要,但是这一点非常难以达到,因为我们现在试图要做的就是你是从这样的一个增加的沟通渠道的方面来考虑的话,那么你会获得更好的效果。那么基本上我已经说得差不多了,如果你想知道更多的信息的话,你可以上我的网站去看,我的网站上有很多的细节的信息,那么这里我只是给大家一个起点,尤其是说它是给大家介绍一下我现在这本新书的进展,现在我的书有很多部分已经公布在网上,这个书里面还有很多地方没有连贯起来,因为这本书还在写的过程中,所以我今天所谈到的很多的资料都会在我的书的前几章当中有更多的更详细的这样的一个介绍,我希望它能够对大家有所益处,我现在还可以接受大家的几个提问,如果大家有什么问题,这里有提问的时间吗?如果没有提问时间就先到这儿。
非常感谢大家听我的演讲,我也希望这个演讲可以给大家一些关于DSL它究竟是什么,还有它的作用是在你的开发过程当中有什么作用,谢谢。
主持人:我们再次用热烈的掌声感谢Martin Fowler先生,谢谢他的精彩演讲,下面我们有十分钟的茶歇,然后大家十点半回到会场,在外面我们有一个公布栏,因为今天晚上我们在大概是晚上8:00-9:00会有一个自由的讨论,那个会场也是比较,就是为了更有效地组织讨论,我们就采用了一个方法,叫技术臭味相投会,大家愿意去发起一个小的讨论,你就可以在外面的海报上,在这样的一个黄纸上面写上你要讨论的题目,以及你的姓名,作为发起人,晚上我们会根据大家写的这些题目的情况,我们会明确地标注对这个题目感兴趣的人请到那个区域去参加讨论,这样的话,大家可以在我们这个会场茫茫人海里找到跟你“臭味相投”的伙伴。好,请大家享受你们的休息吧,谢谢! |