领导力大挑战
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
该内容已经被标记书签!
标记书签错误,请重试!
作者 Werner Schuster 译者 胡凯 发布于 2007年4月16日
Software-Engineering Radio(一个向资深软件开发者提供音频节目的站点)最近就DSL(特定领域语言)和Ruby语言如何使得编写内部DSL变得更加方便等问题采访了InfoQ的专家Obie Fernandez,摘要如下:
DSL是一种专注于某一特定领域的语言,使用通用语言(如C或者Java)当然可以得到与DSL相同的功能。但是这样会产生大量繁琐的代码并导致大量的领域知识被隐藏在通用语言构造中(如for循环,if条件,方法调用,import声明等等)。
生成以及维护通用语言编写的代码本身也是问题所在:专家们必须将他们的知识变为代码。通常这些专家(销售人员,经理或者园丁)缺少编程知识,这意味着他们必须与程序员进行协作。当然,这也意味对代码的任何一次修改都包括许多繁琐的步骤:如果一个领域专家需要改变某些功能,她必须首先与程序员进行交流,由程序员实现这些修改,然后领域专家检查这些代码是否表现出期望的行为,诸如此类。
对于上述问题,其中一个可能的解决方案是开发一种适应特定环境的语言,非技术人员可以用它来解决问题。这种语言较通用语言更简洁并且仅仅提供目标领域所需要的类型以及特定的语言构造。
在访谈中,Obie将DSL类比为自然语言中的俚语或者行话。全世界喜爱咖啡的人对下面这句话一定非常熟悉:
Venti half-caf, non-fat, no foam, no whip latte
在正常的对话中,上述语言不能传递正确的语义。并且世界上大多数的咖啡馆里可能仅仅提供最普通的牛奶加咖啡。但是在合适的场所使用上述语言(例如,星巴克),它将让你使用最少的词语喝到想要的饮料并且很少会造成误解。
有多种方式可以实现DSL。其中一个选择是定义一种语法并使用解析器生成工具(如ANTLR或者YACC)来生成解析器。通过它可以将DSL代码转化为某种可以被解释的数据结构(语法树)。其中一个例子是Make文件,它被用来定义构建过程(编译,打包,部署)。另一种方式是使用XML而不是解析器,它将对于解析器生成工具的依赖变为对于XML解析器的依赖,有许多工具可以用来支撑XML处理(使用DOM解析器可以得到类似语法树的数据结构,同时使用XPATH来提取数据,等等)。Ant,是一个基于XML的DSL, 构建过程被定义为XML格式。Make和Ant就是外部DSL最典型的实现。
另一个解决方案是内部DSL,它不需要使用任何解析器生成工具以及XML解析器,取而代之的是使用现有的合法的通用语言的构造,很明显,这种语言的构造必须非常灵活才可以容纳各种简练的DSL代码。
内部DSL的终极解决工具非LISP以及类LISP语言莫属,原因是LISP灵活的语法,它可以被概括为:
foo,:::bar:::甚至加号都是合法的原子LISP宏特性使得开发者可以很轻易的在LISP中定义DSL并且将其解释或者展开为可以执行的通常的LISP代码。
另外一种适于使用内部DSL的语言是Ruby, 没什么可惊奇的,想想Ruby丰富的语法吧,它是Ruby得以支持内部DSL的部分特性。下面是Obie在PPT上所使用到的观点以及相应的示例代码:
order = latte venti, half_caf, non_fat, no_foam, no_whip在上面的例子中,latte(拿铁咖啡)以及我们所需要的特别的口味儿都是方法调用的一部分。latte方法返回一个将咖啡各个属性进行了初始化的对象。
class RuleSet < ActiveRecord::Base has_many :commends, :dependend => :delete_all # ... more... end这是一个内部DSL在Rails的ActiveRecord中的例子。has_many调用会在类第一次被载入时执行。这个调用被用来设定类的关联以及行为,例如,它可以通过define_method调用向类添加一些方法。这样这段DSL代码的用户可以使用非常简洁,描述性的方式来定义类某些方面的行为。事实上,这与LISP宏有很多相似的地方,他们都在代码被载入时进行工作。
task :default => [:test] task :test do ruby "test/unittest.rb" end上面的类使用了我们在这里提到的所有的三种概念。task是一种方法调用,但是没有圆括号让它变的更具描述性。task调用在载入时被执行,对内部数据结构进行设置。test任务的逻辑在块中进行定义(在do和end之间的代码),并在适当的时候被执行。
在Ruby中,内部DSL使得编写简洁和描述性的规范变得非常容易。正如我们从has_many例子中看到的,内部DSL也可以很容易的与通常命令式的Ruby代码进行混合。
译者简介:胡凯是InfoQ中文站的志愿者翻译。2006年加入ThoughtWorks,通过在ThoughtWorks多个国家和多个项目的敏捷实践,坚定地站在了敏捷阵营中,目前在进行CruiseControl相关的敏捷开源项目。他和许多敏捷开发者一样活跃在敏捷中国和CruiseControl-China社区中。
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中对于锁的性能优化,以及锁的存储结构及升级过程。
本次分享将首先介绍现代富文本编辑器的组成和实现,然后结合UEditor的开发过程,与参会者分享UEditor在设计和实现的过程中,所涉及到的核心功能的细节实现。
本次演讲视频录制于百度技术沙龙。
我们所开发的应用程序大多都需要提供一个图形用户界面(GUI)。关于GUI应用的架构设计,已经有了Form & Control、MVC,、MVP、 Passive View等多种模式。模式可以帮助我们建立优雅的架构,但前提是弄清楚模式的应用场景。弄清楚GUI应用面临的设计上的问题,有助于我们正确的挑选设计方案。
MongoDB是一种非常易用的NoSQL方案,Brian C. Dilley在这篇文章里介绍了MongoDB的优劣势,并介绍了MJORM项目。MJORM用于MongoDB,是一个没有注解的Java ORM库。
随着网络基础设施的逐步成熟,从RPC进化到Web Service,并在业界开始普遍推行SOA,再到后来的RESTful平台以及云计算中的PaaS与SaaS概念的推广,分布式架构在企业应用中开始呈现出不同的风貌,然而殊途同归,这些分布式架构的目标仍然是希望回到建造巴别塔的时代,系统之间的交流不再为不同语言与平台的隔阂而产生障碍。
没有回复
关注此讨论 回复