我是怎样成为敏捷教练的?

本系列文章分为三部分:

  1. 敏捷教练和ScrumMaster的职业现在有多吃香?
  2. 我是怎样成为敏捷教练的?
  3. 申请导师级Certified Team Coach认证的攻略秘籍

初识敏捷

2007年我加入诺基亚西门子通信,正好赶上3G Platform产品线全面推广敏捷,那个时候在全球真正敢于大规模推广敏捷的大型公司并没有几个。2008年时我获得了CSM认证。在诺西那几年我陆续担任过高级软件工程师、资源线经理、质量经理、项目经理、ScrumMaster、敏捷教练等职位,也和很多敏捷方面的专家共事过,不夸张地说,诺西真的可谓中国敏捷的黄埔军校。至于我个人,在管理方面,学会了更多授权、精益思想和系统思考。在技术和工程实践方面,全面地接受了XP中持续集成的理念,将自动化测试和重构融入到了日常工作中,认识到技术敏捷性的重要。后来的LeSS框架基本上就是诺西那几年在组织级大规模推广Scrum的经验教训的总结。

Read More

敏捷教练的职业真的很吃香

本系列文章分为三部分:

  1. 敏捷教练和ScrumMaster的职业现在有多吃香?
  2. 我是怎样成为敏捷教练的?
  3. 申请导师级Certified Team Coach认证的攻略秘籍

敏捷教练的职业发展?不必困惑!

敏捷教练是个新鲜头衔,敏捷转型的公司内都有人在做着一些事,其中很多人还是在过去的职位上,却做着全新的事情,于是就难免产生顾虑和疑惑:

公司让我做敏捷教练或ScrumMaster,到底有什么前途?我该如何发展?

Read More

远程协作大成功!台湾某Scrum虚拟项目团队的奇幻之旅

为什么转这篇文章

原文作者周龍鴻(Roger)是台湾敏捷与Scrum的推广者和践行者。去年与他合作过以Scrum方式组成远程虚拟字幕组,合作完成Spotify系列视频的中文字幕翻译,免费回馈给海峡两岸的敏捷社区。

最近,他和台湾的小伙伴再次出发。这次他们组成了多个虚拟Scrum团队(你可以称之为规模化敏捷部落:p),采用远程协作的方式共同对《ISO 21500 项目管理标准》进行翻译、修订,递交台湾”国家标准检验局”,成功通过审查成为台湾的”国标”(CNS)。

这些小伙伴没有报酬,全凭热情工作在一起,认真地践行Scrum和敏捷工作方式。从Roger的故事中,以及后半部分志愿者的心得中,整个过程的辛苦和收获,更能感受到他们的用心、严谨和喜悦!

征得原作者同意,我将此文《我在CNS Scrum專案的奇幻之旅》转到墙内,让大家了解到Scrum不仅仅限于IT软件领域。希望更多人能够和他们一起来享受这个敏捷奇幻之旅,用敏捷来改变大家的工作方式,改变世界。

原文Facebook链接:https://goo.gl/HqBXHn

Read More

XCode6 中XCTest支持异步的单元测试

过去因为每个测试是相互独立、顺序执行的,因此单元测试都是同步执行的。为了支持各种异步调用,XCode可以用来新的API和 XCTestExpectation 对象支持block,现在测试方法会等待调用完成或者超时。
一般的过程是,测试用例进行异步操作,并注册回调,然后等待expectation被满足。当异步操作结束时,通常会进入回调函数或者Block,测试案例在这里需要主动告知expectation已经被满足,从而结束run loop的等待,然后可以进行后续断言或操作。

Read More

javascript 单元测试覆盖率工具,及Grunt集成

js单元测试Unit Test的工具包括Jasmine, Mocha, NodeUnit, JsTestDriver等。

Jasmine最为流行,因为其良好的语义和丰富的Mocking机制。

无论使用Grunt.js或是Maven来作为项目构建工具,Jasmine都有良好的插件支持。

js单元测试其实并不为前端开发者重视,近年开始node.js以及单页面web app流行起来后,越来越多的js项目也开始采用了单元测试,至于单元测试覆盖率,对于很多js开发者还很新鲜。

笔者所在项目采用grunt.js作为项目工具。之前使用了grunt.js v0.3,采用grunt-jasmine-runner插件来运行测试,但一直苦于没有合适的覆盖率插件,后来发现了grunt-istanbul,然而两者不能够直接集成,需要对源代码进行改动,以使运行测试的浏览器(比如phantomjs)将生成的覆盖率数据,从内存中传递到grunt的上下文中。

于是,笔者在github上fork了项目,自行将两者整合成为完整的一步式插件grunt-jasmine-coverage,并发布到NPM上。

近期,grunt升级到v0.4, 官方的jasmine插件也换成了grunt-contrib-jasmine。经过笔者一番探索和讨论,发现该插件支持模板系统用于扩展功能,而且已有热心人制作了用于覆盖率的模板grunt-template-jasmine-istanbul。经过与其作者的讨论,现在该模板已经可以很好的支持同时生成多份覆盖率报告。比如,cobertura格式的报告,可以用于Jenkins集成,而lcov格式的报告,可以用于Sonar集成(需要sonar-javascript插件)

有一个小技巧,项目中除了包括自己的源代码,肯定也会包含其他第三方的库,比如jquery。而对于计算覆盖率,我们可能希望将第三方代码踢除出去。这时,在grunt-contrib-jamine的配置中,记得将第三方代码置入vender一节中,这样grunt-template-jasmine-istanbul在做instrument时会忽略掉这些代码。

此外,grunt.js对于nodeunit也有很好的支持

每日站会说什么?

经常听到有人抱怨说,敏捷实践中会议太多,形式主义严重。在真实了解实际情形后,我们会发现并非这些敏捷实践本身没有价值,而是因为没有正确地领会会议的目的,采取了不恰当的会议形式,或其它深层次的问题,导致会议不能产生预想的结果。每日站会就是一个例子。

首先必须明确,每日站会的目的:基于迭代目标的团队协作和快速反馈。更详细点地说,每日站会提供了在达成迭代目标过程中的团队协作同步点,以及快速反馈循环中的检查和调整点。它的目的不是汇报状态,不是要知晓每个团队成员昨天把时间花在了哪里,不是要知道每个人将要把时间投入在什么地方,而是对目标的跟踪和校准,以及加强在达成目标过程中的协调和合作。

Read More

用户故事使用中的十大错误

1) 在用户故事中,将开发中的相关人员作为系统用户角色

比如 As a po/apo/ppo/developer/tester/manager/integration engineer, I want 。。。

必须注意,As a 中的role是运行时实际使用该系统的用户角色,不是开发时干系人的角色

包括客户文档相关的用户故事,也要以实际使用该文档完成某项任务的视角来描述:什么角色,什么情况下使用该文档用来做什么,达到什么样的可衡量的目标等,而不是某经理要求该文档。

2) 把系统的发布版本放入用户故事标题中

Read More

Python中的注解:Decorator (Annotation)

python’s decorator is like Java’s annotation, but more flexible and easy to implement because of python’s syntax. Both is to use a time way to realize AOP, to insert job of other aspect and make you class/func concentrate to bussiness logic.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

def anna(fn):
def new_func(*args):
print 'by anna args=%s' % args
return fn(*args)
return new_func

def annie(ar):
print 'by annie1 ar=%s' % ar
def _A(fn):
def new_func(*args):
print 'by annie2 args=%s' % args
return fn(*args)
return new_func
return _A

class ccc():
@anna
def __init__(self):
print 'ccc'
@anna
def ff(self, a):
print a

 

@anna
def test1(a):
print a

@annie('hi')
def test2(a):
print a

test1((1,2))
test2((3,4))