yahoo实施Scrum敏捷方法的成果

Filed Under (Agile, Erlang) by mantian on 30-12-2008

Tagged Under : ,

今天例会的时候听到Lion将要介绍yahoo敏捷实践的东东,网上搜索了一把,发现yahoo其实已经实施3年多了,而且据说获得了比较大的成功,3年后,Yahoo!已经有了200多个开发团队在使用敏捷实践。明天记得找boots 要点资料哈。此外,这本书是yahoo人写的,可以考虑购买看看哦:敏捷估计与规划

Scrum 产生的收益在开发团队经验中体现在不同的方面。在Yahoo!公司,在上18 个月中将近50 个开发项目采用Scrum,一共近600 人参与,采用Scrum 的团队数量在快速发展。这些项目从客户界面,网页设计如Yahoo! Photos, 到后端基础构造服务如服务上百万客户的Yahoo!Mail;从全新的产品如Yahoo! Podcasts,其利用Scrum 作为从构思到发布的流程(并获得该年度同类产品的Webby 奖),到一些增量的项目,包括开发新的部件并维修bug 和其他的维护工作;我们也利用Scrum 来分配分布式项目。每一个季度,我们对Yahoo!公司每一位Scrum 的使用者进行调查(包括产品所有者,开发团队成员,ScrumMaster 和这些人员的经理),并让他们将Scrum 于以前的开发方式做一对比。我们正在准备Yahoo!公司的深入调查报告,以下是相关的资料显示:

  • 生产效率:68%回复显示采用Scrum 后生产效率提高(4 分或5 分在以5 分为衡量标准上);5%显示采用Scrum 后生产效率降低(1 分或2 分在以5 分为衡量标准上);27%显示采用Scrum 后无变化(3 分在以5 分为衡量标准上)。
  • 团队精神:52%回复显示采用Scrum 后团队精神加强;9%显示采用Scrum 后团队精神减弱;39%显示采用Scrum 后无变化。
  • 适应性:63%回复显示采用Scrum 后适应性加强;4%显示采用Scrum 后适应性减弱;33%显示采用Scrum 后无变化。
  • 责任性:62%回复显示采用Scrum 后责任性加强;6%显示采用Scrum 后责任性减弱;32%显示采用Scrum 后无变化。
  • 协作能力:81%回复显示采用Scrum 后协作能力加强;1%显示采用Scrum 后协作能力减弱;18%显示采用Scrum 后无变化。
  • 在产品所有者估算下,开发团队的生产效率平均提高了36%
  • 85%的开发团队成员表示如果其拥有决策权的前提下,将会继续使用Scrum。

ADTmag.com的编辑Kurt Mackie与Gabrielle Benefield(这些团队的核心组织者之一)就Scrum在Yahoo中的应用情况进行了对话

Kurt问到,是什么原因促使Yahoo!转向了敏捷和Scrum开发,Benefield说:

有些公司一起步官僚习气就很严重。可是,Yahoo刚开始时规模很小、发展很快,他们最开始的做法非常敏捷,几个创始人坐在一间屋子里面开发软件。然而当规模扩大到某种需要更加频繁交流的阶段后,他们提出了使用传统的瀑布流程……但是在我们这种创业型文化中,它很难实现。我们的员工都很聪明,富有创新能力,他们习惯于时时刻刻提出自己的想法。瀑布流程对他们来说太古板太做作了,它降低了他们的效率。于是,团队中的一名工程师开始给大家布道,他说:“嘿,我们应该更敏捷一些”……所以在2005年2月,我们就启动了一个敏捷开发的试点项目。

随后Benefield又谈到其在实施敏捷开发的过程中的一些心得体会:

…… 那些我曾参与其中的敏捷团队,尤其是那些对其进行过大量辅导的团队,他们的生产力很容易就提升了200~300%。有些团队做的尤为出色,因为他们真正地 实施了敏捷。某些团队可能由于没经过太多的辅导和训练,或存在系统性的阻碍,所以改进情况就不那么明显。但从整体来看——包括那些最差的情况——生产力的 提升幅度大约在35~36%之间。综合所有情况考虑,这个估算还是相当保守的。

Kurt又问道:“在敏捷/Scrum的世界里,变化是好事吗?”Benefield坦然道:

我 们 的想法发生变化是很自然的事情。当你开始构建一个产品并看到一些结果后,你就会想做出一些改变。我们不会说“你不能改它”,我们是在拥抱变化。在互联网上 面,你不得不拥有快速变化的能力。举个例子来说,当我们搭建Yahoo邮件的大规模存储后端时,中途有一个竞争对手提供了容量更庞大的邮箱存储空间。我们 当时必须迅速做出响应,假如当时我们用的是传统的瀑布模型的话,我们势必无计可施,但最终我们成功地对抗了对手的威胁。在开发产品的过程中,我们曾一次又 一次面临这样的局面。

当其被问到开发中想法常常变化所带来的影响时,Benefield说道:

敏 捷有着严格的纪律。对于类似所有的代码都有全方位的测试这种事情,我们是纪律严明的,所以你有勇气去尝试变化,理解变化所造成 的影响。这里不会出现那种所有人都在尝试自己念头的无序状态。我们允许团队进行自组织,各种想法从团队中源源涌出。但管理层和产品所有者对选用哪种想法来 实施有着最终决定权,会从业务层面上来制定优先级,因为他们对其了如指掌。他们从根本上控制着何时发布产品、发布哪些功能,而团队自己决定如何完成工作。

在最后,Benefield以下面这段话结束了本次访谈:

在Yahoo,我们永远不会命令别人使用这个过程。我认为过程的优点要靠它自身体现出来,人们也应该有选择的自由。敏捷正在Yahoo中慢慢取得主导地位……我相信,随着时间的推移,为了能够在竞争中真正胜出,敏捷会是公司最佳的选择。

迎接 Erlang盛宴

Filed Under (Erlang) by mantian on 19-12-2008

Tagged Under : ,

1、Erlang是什么;

Erlang是什么是我们最先要面对的问题,只有清楚了它是什么,我们才能做出我们的决定。可见这个问题的重要性,它决定了很多读者是否会继续看下去!非常紧张。

Erlang最初是爱立信为开发电信相关产品而产生。

Erlang是一种面向并发 (Concurrency Oriented),面向消息( Message Oriented)的函数式 (Functional)编程语言。

面向并发说明 Erlang支持大规模的并发应用,我们可以在应用中处理成千上万的并发,而不相互影响。面向消息,其实是为并发服务!我们应该都熟悉多线程,熟悉加锁解锁操作,熟悉可能出现的资源竞争与死锁。在 Erlang的世界里,我们可以将轻轻的抹去这些令人苦恼的词汇。 Erlang的世界,每个处理都是独立的个体,他们之间的交互仅仅靠消息!因此不会有死锁,不会有那种痛苦的编程经历。

Erlang中一个非常重要的名词: Process,也就是我们前面提到的“个体”。它不是我们操作系统中的进程,也不是线程。它是 Erlang提供给我们的超级轻量的进程。为了适应大规模并发的特性, Process需要能够快速创建,快速销毁。之间通信的唯一方法就是消息,我们只要知道一个 Process的名字即 pid,就可以向其发送消息。 Process也可以在任何时候,接收消息。我们这样做只有一个目的:让我们的系统更加简单,用一种朴素的做法,实现一个高效的语言。 Process

Erlang是种函数式编程语言,对此我没有很深刻的理解,最明显的特征就是, Erlang中到处都是函数,函数构成了我们的产品的主体,把这些函数放到一个个的 Process中去,让他们运行起来,那么就组成了我们朝气蓬勃的产品。

Erlang支持对数据的位操作,拥有丰富的数据持久化机制。

同时需要说明的是 Erlang内建垃圾回收机制( GC)。

2、 Erlang的语言特性

1.简单小巧

Erlang中只有 8种基本的数据类型:

integer float atom reference fun port pid bitstring

同时提供 2种复合结构: tuple list,这就是 Erlang的所有数据类型。

2.模式匹配

Erlang的函数中,某些语法中,我们可以使用 Pattern匹配,这是一个非常好的特性,我们可以让代码自己去决定如何执行

比如,我们定义一个函数,其告诉我们某种水果的价格 :

price(apple) -> 2.0;

price(banana) -> 1.2.

我们随后调用 price(Fruit),会根据 Fruit变量的内容返回具体的价格。这样做的好处就是节省了我们的代码量,我们不用 if…else…或者 switch…case的来伺候了。也便于代码的扩展:加一个新的水果品种,我们只需要加一行就可以了。

学习 Erlang一个非常重要的内容就是模式匹配,但是请不要混淆,这个匹配和正则表达式没有任何干系。

3.变量单次赋值

这个是一个匪夷所思的特性,变量竟然只能单次赋值!是的 Erlang中变量一旦绑定某个数值以后,就不能再次绑定,这样做的好处是便于调试出错(更深层次的原因是 Erlang为并发设计,如果变量可以修改,那么就涉及到资源的加锁解锁等问题),当发生错误时,某个变量是什么就永远是什么,不用顺藤摸瓜的查找谁修改过它,省了好多事情。唯一的麻烦就是需要一个信的变量时,你必须再为它想一个名字。

4.丰富的 libs

Erlang中提供丰富的 libs

stdlib中包含大量的数据结构如 lists array dict gb_sets gb_trees ets dets

mnesia提供一个分布式的数据库系统

inets提供 ftp client http client/server tftp client/server

crypto 提供加密解密相关函数,基于 openssl相关实现

ssl 实现加密 socket通信,基于 openssl实现

ssh 实现 ssh协议

xmerl 实现 XML相关解析

snmp 实现 SNMP协议( Simple Network Management Protocol

observer 用来分析与追踪分布式应用

odbc 使 Erlang可以连接基于 SQL的数据库

orber 实现 CORBA对象请求代理服务

os_mon 提供对操作系统的监控功能

dialyzer提供一个静态的代码或程序分析工具

edoc 依据源文件生成文档

gs 可以为我们提供某些 GUI的功能(基于 Tcl/Tk

还有很多朋友提供了一些开源的 lib,比如 eunit,用来进行单元测试。

5.灵活多样的错误处理

Erlang最初为电信产品的开发,这样的目的,决定了其对错误处理的严格要求。 Erlang中提供一般语言所提供的 exception catch try…catch等语法,同时 Erlang支持 Link Monitor两种机制,我们可以将 Process连接起来,让他们组成一个整体,某个 Process出错,或推出时,其他 Process都具有得知其推出的能力。而 Monitor顾名思义,可以用来监控某个 Process,判断其是否退出或出错。所有的这些 Erlang都提供内在支持,我们快速的开发坚固的产品,不在是奢望。

6.代码热替换

你的产品想不间断的更新么? Erlang可以满足你这个需求, Erlang会在运行时自动将旧的模块进行替换。一切都静悄悄。

7.天生的分布式

Erlang天生适合分布式应用开发,其很多的 BIF(内建函数,相 API)都具有分布式版本,我们可以通过 BIF在远程机器上创建 Process,可以向远程机器上的某个 Process发送消息。在分布式应用的开发中,我们可以像 C C++, JAVA等语言一样,通过 Socket进行通讯,也可以使用 Erlang内嵌的基于 Cookie的分布式架构,进行开发。当然也可以两者混合。分布式开发更加方便,快速。 Erlang Process的操作, Error的处理等都对支持分布式操作。

8.超强的并发性

由于采用其自身 Process,而没有采用操作系统的进程和线程,我们可以创建大规模的并发处理,同时还简化了我们的编程复杂度。我们可以通过几十行代码实现一个并发的 TCP服务器,这在其他语言中都想都不敢想!

9.多核支持

Erlang让您的应用支持多个处理器,您不需要为不同的硬件系统做不同的开发。采用 Erlang将最大限度的发挥你的机器性能。

10.跨平台

如同 JAVA一样, Erlang支持跨平台(其目前支持 linux mac windows 19种平台),不用为代码的移植而头疼。

我们仅仅需要了解平台的一些特性,对运行时进行优化。

11.开源

开源是我非常喜欢的一个词汇,开源意味这更加强壮,更加公开,更加的追求平等。开源会让 Erlang更好。

3、 Erlang与外界的交互

Erlang可以与其他的语言进行交互,如 C C++, Java。当然也有热心的朋友提供了与其他语言的交互,如果需要你也可以根据 Erlang的数据格式,提供一个库,让 Erang与您心爱的语言交互。

Erlang支持分布式开发,您可以创建一个 C Node,其如同一个 Erlang节点,前提是你遵照 Erlang的规范。

当然最常用的交互还是再同一个 Node上,比如我们要调用某个 lib,调用一些系统提供的功能,这时候主要有两种方式: Port和嵌入式执行。

Port Erlang最基本的与外界交互的方式,进行交互的双方通过编码,解码,将信息以字节流的方式进行传递。(具体这个通道的实现方式,根据操作系统的不同而不同,比如 unix环境下,采用 PIPE实现,理论上任何支持对应 Port通道实现的语言都可以与 Erlang进行交互)。 Erlang为了方便 C JAVA程序员,提供了 Erl_Interface Jinterface

采用 Port,您的代码在 Erlang的平台之外运行,其崩溃不会影响 Erlang

嵌入式执行,通过 Erlang平台加载,因此这是非常危险的,如果您的程序崩溃,没有任何理由, Erlang也会崩溃。

4、 Erlang应用场景

分布式产品,网络服务器,客户端,等各种应用环境。

Erlang也可以作为一种快速开发语言,进行原型开发。

5、 Erlang的学习过程

1. 安装首先从 Erlang官方网站,下载安装 Erlang http://www.erlang.org/download.html

linux:获取源代码,根据说明编译; windows:直接安装

2. 认真阅读《 programming erlang》(中文版图书已经问世),并不断动手练习书中的例程。

3. 遇到问题时,不要退却,坚持下去找到解决办法

4. 对语言熟悉时,浏览一些好的开源项目

5. 有信心时,开始动手做一个小项目

6. 不间断的与大家交流,共同提高

可能遇到的困难:

a) 对于语法的不适应?

坚持看下去,代码继续写下去,我相信 1个月,你会喜欢上 Erlang的语法

b) 有些数据类型不清楚?

认真看资料,或者询问朋友,比如我

c) 中文资料的缺乏?

Erlang中文的资料会越来越多,此外, Erlang的相关的英文资料也比较容易理解,还是那句话,别怕麻烦

6、 Erlang开源项目

排名不分先后

  • couchdb 基于文档等非结构化数据的数据库,提供HTTP接口
  • disco Map-Reduce 框架,Erlang + Python
  • ejabberd 性能出众,使用广泛的Jabber开源服务器
  • mochiweb 轻便,高效的HTTP应用框架
  • rabbitmq 中间服务器,实现AMQP协议
  • yaws 高效的web server
  • etorrent Bittorrent 客户端
  • scalaris 分布式的key-value存储

7、遇到问题

参看 Erlang官方文档 http://www.erlang.org/doc/

订阅 Erlang maillist http://www.erlang.org/mailman/listinfo/erlang-questions ),进行提问

Nabble提供的 Erlang maillist存档中搜索( http://www.nabble.com/Erlang-f14095.html

Google中搜索答案

8、推荐阅读

Erlang Design Principles http://www.erlang.org/doc/design_principles/part_frame.html

Erlang Efficiency Guide http://www.erlang.org/doc/efficiency_guide/part_frame.html

Erlang Programming Rules http://www.erlang.se/doc/programming_rules.shtml

9、推荐网站

http://www.erlang.org

http://erlang-china.org

http://trapexit.org (国内封锁,可以使用 http://trapexit.org.nyud.net:8080/ 或其他代理登录)

http://toquick.com

http://blog.socklabs.com/

http://www.planeterlang.org/

FireStats icon Powered by FireStats
MC Inside