异地金融研发团队的敏捷实施策略-Top100Summit

通过重构提高组织灵活性-百度技术沙龙

重构到管道式函数-软件匠艺小组

全球敏捷之旅2015天津站花絮

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

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

继续阅读 More

Apple最新Swift编程语言之闭包

Swift作为苹果为开发者最新发布的编程语言,受到热烈的追捧。与2014世界杯同热。

作为一门动态语言,吸收了大量Python语言的特性和语法(我喜欢Python),当然也有些ruby、js和C#的痕迹,同时保持了对原objective-C库的兼容。

iBook推出了教程,中文翻译也完成了。

大家需要下载最新xcode,里面有交互式的playground可以用来学习swift。为了获得最好的体验,在 Xcode 当中使用代码预览功能。代码预览功能可以让你编辑代码并实时看到运行结果。 打开Playground

你需要知道Swift语言闭包函数 ()->()

定义一个函数

你可以用func关键字来定义函数。函数可以接收和返回0个、1个或多个参数(tuples列表)。返回类型在->符号后面。

1
2
3
func jediGreet(name: String, ability: String) -> (farewell: String, mayTheForceBeWithYou: String) {
return ("Good bye, \(name).", " May the \(ability) be with you.")
}

调用函数

1
2
3
4
let retValue = jediGreet("old friend", "Force")
println(retValue)
println(retValue.farewell)
println(retValue.mayTheForceBeWithYou)

函数类型

1
func sum(x: Int, y: Int) -> (result: Int) { return x + y }

上述函数的函数类型为 (Int, Int) -> (Int)
函数类型可以用于嵌套函数的参数类型或者返回类型。

传递和返回函数

下列函数将另一个函数作为结果返回,可以用于赋值给变量及调用。

1
2
3
4
5
6
7
8
func jediTrainer () -> ((String, Int) -> String) {
func train(name: String, times: Int) -> (String) {
return "\(name) has been trained in the Force \(times) times"
}
return train
}
let train = jediTrainer()
train("Obi Wan", 3)

可变入参函数

可变入参函数带有可变数量的入参(表示为参数类型后的...),其内容可作为数组来访问。

1
2
3
4
5
6
func jediBladeColor (colors: String...) -> () {
for color in colors {
println("\(color)")
}
}
jediBladeColor("red","green")

定义一个闭包

闭包被置于花括号{}中,且定义为()->()类型的函数。其中->分隔了入参与返回类型,其后的in关键字分隔了闭包头与闭包体。

1
2
3
{ (params) -> returnType in
statements
}

一个例子,map函数应用于数组。

1
2
3
4
5
let padawans = ["Knox", "Avitla", "Mennaus"]
padawans.map({
(padawan: String) -> String in
"\(padawan) has been trained!"
})

类型已知的闭包

当闭包的入参类型已知时,可以这样写:

1
2
3
4
5
6
7
func applyMutliplication(value: Int, multFunction: Int -> Int) -> Int {
return multFunction(value)
}

applyMutliplication(2, {value in
value * 3
})

闭包省略入参名

闭包入参可以不用参数名而是位置($0,$1,…)来访问

1
applyMutliplication(2, {$0 * 3})

甚至,如果闭包是函数的最后一个入参时,圆括号可以这样省略掉

1
applyMutliplication(2) {$0 * 3}

(翻译自 http://fuckingswiftblocksyntax.com/

管理3.0北京一天工作坊总结

有幸受到北京Agile1001社区的邀请,@申导 与 @王宇 从天津出发,一起在北京分享了一天的管理3.0。

在胡莱游戏公司举办的管理3.0工作坊那可真是人山人海,红旗飘扬。有好几位来自国内某著名电商和通信行业的朋友。

首先是开场(破冰)。破冰比较独特,首先是介绍了团队的最佳规模(大小),以及为什么是这个数字(5)。然后让大家自组织成5人的团队(设定了一个规则,根据多样性得分)。

继续阅读 More

J.P.摩根运用LeSS框架实施大规模敏捷

顶尖金融服务企业中的大型组织是如何采用大规模Scrum框架(LeSS)的?

背景

J.P.摩根的全球核心处理技术集团由Simon Cooper领导,是一个遍布全球的3000多人的组织。2013年集团决定要改变为(真正的)Scrum,并采用Large-Scale Scrum(LeSS)框架,这意味着在组织设计要做出相应改变。

之前他们曾零散地采用了”Scrum-But”及各种敏捷工程技术,主要是在开发团队中,但现有的权力和组织结构并无显著改变,与业务的交互也是一样——仍然是“合同谈判”而非“客户协作”。仍然存在负责交付“合同”的研发项目经理、团队主管、单一职能的专家角色,以及单独的组件团队和职能团队(比如测试团队)。

年初Craig与Simon Cooper及其直接下属的经理做了一次有力的对话,随后他们就决定将组织设计转变为基于LeSS的Scrum框架。

这次领导力对话认清了组织中目前“合同游戏”的动态,它阻碍了组织提高敏捷性和改善以客户为中心的特性交付。

这次领导力对话也针对真正的特性团队进行了探讨——跨组件和跨职能团队,它可以端到端地交付客户特性,不存在移交、依赖或延迟。这需要消除组织内的藩篱,比如职能部门和组件团队,以及相应的经理角色。


继续阅读 More