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

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

Tennis Kata-编程练习

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

learning-go-lang

安装

由于墙,http://golang.org 国内无法访问,其它在线教程也一样
http://tutorial.golang.org
http://go-tour-zh.appspot.com/

可以在本机运行,
先安装Go 编译器 http://code.google.com/p/go/downloads/list

然后安装教程

1
go get code.google.com/p/go-tour/gotour

或者中文的

1
go get bitbucket.org/mikespook/go-tour-zh/gotour

最后执行安装产生的 gotour 执行文件,即可在http://localhost:3999 打开教程。
一些练习的答案

##46 练习:斐波纳契闭包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import "fmt"  

// fibonacci 函数会返回一个返回 int 的函数。
func fibonacci() func() int {
var a int = 1
var b int = 1

return func() int {
c := a+b
a = b
b = c
return c
}
}

func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}

##69 练习:等价二叉树

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
38
39
40
41
package main  

import (
"bitbucket.org/mikespook/go-tour-zh/tree"
"fmt"
)

type Tree struct {
Left *Tree
Value int
Right *Tree
}

// Walk 步进 tree t 将所有的值从 tree 发送到 channel ch。
func Walk(t *tree.Tree, ch chan int) {
if t != nil {
Walk(t.Left, ch)
ch <- t.Value
Walk(t.Right, ch)
}
}

// Same 检测树 t1 和 t2 是否含有相同的值。
func Same(t1, t2 *tree.Tree) bool {
ch1 := make(chan int, 10)
go Walk(t1, ch1)

ch2 := make(chan int, 10)
go Walk(t2, ch2)

for i := 0; i < 10; i++ {
if <-ch1 != <-ch2 {
return false
}
}
return true
}

func main() {
fmt.Println(Same(tree.New(1), tree.New(1)))
}

##57 练习:错误处理

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
package main  

import (
"fmt"
)


type ErrNegativeSqrt float64

func (e ErrNegativeSqrt) Error() string {
return fmt.Sprintf("cannot Sqrt negative number: %f", e)
}

func Sqrt(f float64) (float64, error) {

if f < 0 {
return 0, ErrNegativeSqrt(f)
}

x := f
for i := 0; i < 10; i++ {
x = (x + f/x) / 2
}
return x, nil



}

func main() {
fmt.Println(Sqrt(2))
fmt.Println(Sqrt(-2))
}

##44 练习:Map

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main  

import (
//"fmt"
"strings"
"bitbucket.org/mikespook/go-tour-zh/wc"
)

func WordCount(s string) map[string]int {
result := map[string]int {}
f := strings.Fields(s)
for _, v := range f {
result[v] += 1
}
return result
}

func main() {
wc.Test(WordCount)
}

敏捷之旅2012天津站活动组织心得

今年2012,是天津软件本地社区的第二次举办敏捷之旅活动。去年的破冰之旅还历历在目,经过一年的时间,天津有更多的朋友开始接触敏捷,实践敏捷,讨论敏捷,并加入软件社区积极参加和回馈,也使得天津软件行业更加繁荣和具有竞争力。

今年共有四位组织者@Eugene_Xerox@King费事 @申导 @柴阿峰 ,大家来自不同公司,但都愿意为组织软件社区活动贡献自己的一份力量,一直在张罗着“天津软件沙龙”线下活动。

9月份开始,大家开始着手研究敏捷之旅活动,经过几轮讨论,先要考虑赞助、场地等硬件问题。一次机会,得知天津软件评测中心要在11月举办一次天津测试大会,于是经过沟通,对方对我们的活动非常支持,愿意提供下午3点以后的时间段给免费活动,还赞助了一些门票供参加上午的活动。这样,拿下了假日酒店的场地,最大的一笔开支消于无形。

接下来是书籍,经过敏捷之旅支持小组的指点,成功联系上清华和图灵,拿到了一部分书籍。(ps:上周参加北京的敏捷之旅,有幸见到清华出版社的文工。文工表示继续支持天津的活动,还希望能有些读书会性质的活动,这点我们也会考虑的。)应该还有禅道软件的赞助。

其余现场需要的文具物品等就不说了。

宣传部分,首先是天津软件沙龙的微群和邮件列表,然后再扩散到各个公司。新浪微博也是重要的宣传阵地。事先申请了新浪大屏幕,另外还准备了现场要摆放的海报。

话题部分,大家突发奇想,为什么一定要演讲题目呢?有没有更加活跃的互动形式。于是我们联系上另一位嘉宾 @卡爾文_Q ,决定以对话形式来进行观点的碰撞,引发台下的讨论。今年敏捷之旅恐怕只有天津用了这个创新的形式。当然对话之前还是准备了两个闪电演讲来引出讨论。

最后,台上嘉宾分为两组,一组代表敏捷派,一组代表传统派,由主持人来引导话题和台下讨论:

  • 15:00-15:30,闪电演讲:《敏捷测试》
  • 15:00-16:30,对话:《敏捷转型让测试人员很受伤?》
  • 16:30-17:00,闪电演讲:《实例化需求》
  • 17:00-18:00,对话:《自动化测试 传统 vs 敏捷》*
    最终战况,假日酒店200人会议厅,上午的天津测试大会基本坐满,下午一部分领导和听众提前退场空出的座位,被来参加社区活动的50多人重新填满,整个会场座无虚席。粗略统计,一线开发测试人员与管理人员大约1:1.

和上午的商业学术气氛相比,敏捷之旅一开场,首先是新浪大屏幕进行微博滚动,现场气氛一下子不同了。

台上的观点碰撞,强烈的引发台下听众的参与的欲望,纷纷提问、发微博互动。台下的一位项目经理提了一个非常尖锐的问题:“我觉得PO、PM不要和团队走的太近,这样团队容易将责任都推给PM”。这个话题很有代表性,于是我们将他请到台上和嘉宾一起互动,全场讨论热情达到一个小高潮。

可以看出,天津还是有很多软件从业人员,而且非常愿意参加此类活动的,只是缺乏组织者的缘故,大家不太能聚集起来。

事先联系的《今晚报》记者也来了,虽然由于担心报道的方向和主旨不清的原因没能见报,但毕竟意味着报社今后还会有机会进行报道的。

晚饭自理,然后的OpenSpace没有预期那么多人。在水游城的costa咖啡,10来个人又继续进行讨论,从7点多一直说到10点多,仍然意犹未尽。

个人一些总结:

其一,有钱好办事,场地、宣传都是砸钱的事情,如果像北京那样管饭,或者从外地请讲师,也都需要费用。期望随着影响的扩大,会有更多人关注,更多人参与,更多公司来赞助。没钱的话,也要善于借力打力

其二,即使今年4位组织者,仍然力不从心,精力、人脉都有限,而且不能持续。今后要吸收更多志愿者进来。

其三,宣传力度,各种渠道的宣传未能形成猛烈攻势。

其四,组织形式可以多样,更多的互动内容和参与者之间的讨论,有时比单纯的演讲来的更实际。

参加敏捷之旅北京2012的一些记录

作为敏捷之旅2012天津站的组织者,和老曹一起去了北京去学习一下。

参加了几个session的心得:

 

段念的《生长出来的敏捷》

敏捷提升效率:更多的活?还是组织集中精力做有意义的事情?

核心价值观-》原则-》实践

敏捷生长的土壤(自发的) vs. 规划好的敏捷架构(缺乏感情)

 

douban.com团队 120开发人员,5专职测试(实际上是技术很好的,有大量CI、自动化经验)

豆瓣团队的自发实践:

1. happy day,比赛写代码解决某个问题

2. 资源池(仅fix bug)<—> 机动队A(新开发) + 机动队B(新开发)

3. pull request of GIT. CI先跑pull request,成功后才能提交到master,中心CI只跑master。因为人工review是静态的,不能保证发现所有问题。

4. git enterprise 不好用,于是二次开发自己的code管理工具,还能发徽章,及内部问答系统。

5. 60%喜欢用trello

 

生长的阳光土壤空气:

1. 工程师文化、吐槽文化 vs. 公司文化、规划

2. 季度目标(避免提到绩效):哪三件事情最需要做?为什么要做?如何衡量?

3. 对老板的一些介入和要求:“挺好的,我先考虑一下”。直到他再而三的找你。


 

种子:

不招对代码不负责、不认可甚至阻碍改进文化的开发人员

 

 

 

伍斌:担水砍柴皆能悟道

中国式管理:曾仕强

日本一分法,集体主义,长官意志

美国二分法,制度+个人主义

中国三分法,太极,情绪好的时候讲道理

==》 先由情入理,再依法办事

==》解决冲突:给双方面子,再化解。比如:“A的想法不比B差,为了锻炼,可以让他去试试”

 

驱动敏捷:中国人的专业精神。生于忧患死于安乐

南怀瑾。世上苦难根源:贪痴(无明)嗔

项目中的无明

1. 浪费

2. 先作对(道)还是先做好(术)? 目标vs.方法

先改变理念,再改变方法。

 

Mike Long & Juven – Code Retreat

题目: Tic-Tac-Toe

四个简单设计的原则

pair programming + TDD

 

3x 45min sessions, each of those need to switch pair and delete all code

 

Retro:

even I’ve TDD experiece, still I found different ideas(tests, design etc) when pair with different people

a good female programmer surprised me (we’ve rushed out a PHP test framework!)

need to prepared well for computer and common languages, better with WIFI in the room