我的2011年总结

老婆去买菜了,让我在家里写2011年的总结。转眼2011已经过去,在这一年发生了很多很多的事情。。。。。。

一、工作

2011,我离开了工作5年半的公司ThoughtWorks。我最年轻的时光24-29岁都是在ThoughtWorks度过。在此期间,工作去过的城市有:西安、厦门、悉尼、旧金山、深圳、伦敦、广州、北京等。我以前和朋友聊天,总结在ThoughtWorks有三件事情必须要做:1、开发。在TW,很多国外同事有非常丰富的软件设计、开发经验,公司也有专业和系统的设计培训。所以,要学会真正软件开发和设计,同时能够Coach自己的团队。2、国外工作。TW是一家为数不多没有完全本地化的外企(至少以前是这样),有很多去国工作的机会,去国外工作半年以上,是一段非常酷的人生体验,特别是和很多国外大牛们一起共事。3、咨询。没有做过敏捷咨询的Twer,不是一个真正的Twer。

以前,有个好朋友想找我去一起去创业,我拒绝了。我的理由是:我觉得自己是一个“挖井”的人。刚毕业之后,我在一家公司工作从来不超过1年,虽然学到了很多东西,但是不够深入,我讨厌这中状态,所以我下定决心,不要再做一个“挖井”的人。我必须要挖一口井,直到挖到泉水才会做新的打算。现在,这三件事情我都已经完全胜任。同时,厌倦了整天出差,为别人做项目的生活(为她人做嫁衣裳)。于是,下定决心离开,找一个做产品的公司,验证自己的能力和实现自己的想法。

我先去百度工作了三个星期,后来就去了腾讯──搜搜。在这里不想对百度做任何评论,它是一家很优秀的公司,但不是我喜欢的公司。去腾讯入职第一天,我能感觉到这是一家我喜欢的公司文化,“物以类聚,人以群分”。这时,职业生涯开始了一个转变。在腾讯,负责搜索部门的项目管理工作,堕落的不再写代码了。在腾讯的这大半年,最大的变化就是完全以管理的视角来解读软件这个行业,来思考敏捷开发方法。我的演讲《敏捷项目管理──如何改变软件思维模式》就是这方面的总结。

在腾讯,带了一支7个人的PM团队,经历了一个小小酸甜苦辣的适应期。欣慰的是,团队在项目中磨练和快速成长,现在慢慢的是一支很强的队伍了。2012,我们有明确的目标和方向,可以在公司一展伸手。我的理想是把团队打造成为国内互联网公司中最强的一支项目管理队伍!

二、知识传播和分享

2011,做过很多的分享和培训。擅长的领域从技术开始转变到管理。培训内容,也从敏捷方法方面转变到能力提升方面。下面简单的做个盘点:

  1. 为新员工定制的培训《腾讯–搜搜优秀开发人员的十个习惯》。是这些年我做开发的经验总结。在所有新员工的培训课程中,得分第一。

  2. 在2011 scrum gathering上海的演讲《进度的压力之下如何使用敏捷》。这是一个自己带项目的真实故事,一个遗留系统,在进度压力之下,如果搞定客户,如何快速上线,如何使用敏捷方法等。

  3. 敏捷中国2011的演讲《如果有效的提升团队的开发和设计能力》。这是对我咨询的时候,提升客户员工软件开发和设计能力的总结。敏捷开发实践分论坛听众反馈最好的一场演讲。

  4. 2011敏捷之旅,我的分享是《敏捷项目管理──如何改变软件思维模式》。里面是我在腾讯搜搜工作之后,对敏捷的新思考和观点。大家对演讲反馈也是杠杠的。

  5. 公司部门管理沙龙的分享《我们如何解决问题》,这是一个关于如何系统思考的分享。

  6. 腾讯TAM训练营,我的新课程《探索需求》,是对软件需求表达能力的总结和提炼。

  7. 还有一个重大的事件就是和北航计算机学院做了一个合作,为北航带了一门《敏捷工程实践课》。一共10次课,每次课程3个课时,周末授课。也就是说几乎连续10周我都是一个没有周末的人。呵呵,现在想想还有点小心酸。课程有100多学生,我采用的是苏格拉底式教学,其中每次课都有现场的练习、讨论,甚至是小游戏。有时间可以把授课过程单独的总结一下。

三、生活和爱情

结婚,这是我2011年发生的最重大的一件事件。我认识一个女孩,我们相知相爱并且结婚。没有求婚,也没有任何的婚礼仪式,我们就这样做着一个小蹦蹦,去了民政局,领了结婚证。我还记得那天领证之后,做地铁从通州去东直门上班,一路还很恍惚,这就算是结婚了。当然,这半年婚后的生活还是小幸福的。感谢老婆,每天下班给我做晚饭,让我的体重从56公斤(自从大学毕业之后一直是这样的体重,从没有变过)变成了60公斤。

还有就是把完成了房屋的装修。2011的夏天都是在装修中渡过,周末基本上都是在跑建材市场,其中的体会,参与过装修过的朋友们都会懂的。以前,亮亮和我说:没有装修过的男人,不是真正的男人。那么现在我是真正的男人了!据说很多小俩口在装修的时候都会吵架,甚至闹离婚。我们结婚到现在几乎没有吵过架,有几次不开心都是因为她纠结于我以前的一些情史。哎,以前的邮件都没有删除掉掉,结果被老婆查到了。年轻的朋友,可以以此为戒,及时的毁灭证据,比如:邮件、图片、视频等。。。。。哈哈

附录

这是我2011一些演讲视频或录音:

从软件项目管理角度读——Steve Jobs

“不是杰作,就是狗屎!”

本人一向不喜欢阅读比砖头厚的书。但是,这几周每天早上在班车上或晚上回家吃过晚饭,都迫不及待的拿起《Steve Jobs》这本比转头还厚的书。刚开始看的时候,觉得不过就是另一本励志自传而已。可是,当给我看到乔布斯1997回归苹果之后,凭借自己对更好产品的偏执追求,一步一步把苹果公司从市值不到40亿美元,一直做到2011的3000多亿美元,14年的时间上涨了70多倍。这14年,乔布斯把自己所有的热情、心血和生命,都献给了自己热爱的产品和公司。

有人说成功是偶然的,乔布斯的成功是赶上一个好的时代,而我却说:成功是必然的,只是他在不同的时代,成功的方式不一样。我从软件项目管理的角度,思考和总结了乔布斯成功的八个要点,和各位同事共勉:

一、 用心——激情和想法

乔布斯的激情是要打造一家可以在世的公司,这家公司的人动力十足的创造伟大的产品,其他的一切都是第二位的。因为这样的激情,乔布斯会用心体验产品端到端的每一个细节:产品的硬件,外形,软件,零售店的装修和用户体验,广告,产品包装,甚至产品发布会的一个灯光细节,等等,每一个地方他都花费心思琢磨。2009年,乔布斯癌症复发,在医院做手术接受治疗。同事来病房向他汇报进展,他就情绪高涨,会花一个小时讨论新一代iPhone的命名——他们商定叫iPhone 3GS——以及“GS”两个字母的字号和字体,包括是否应该大写和是否斜体。

团队的成员是否用心,是一个项目成功的根本。你可以不用像乔布斯那样把所有心血甚至生命投入到项目和公司。但是,只要每天在班车上思考着如何简化业务流程,如何更好的用户体验;刷牙和睡觉的时候,想着如何优化一段代码,如何重现一个Bug。如果你用心工作,把心思都放在项目上,那么你就已经走在通往成功的路上。

二、 清晰的管理模型

乔布斯1997年回归苹果,大刀阔斧地砍掉了各种不同型号的产品,很快砍掉了70%的产品。他回归的第一年,裁掉3000多员工。在产品战略会议上,他在白板上画了一个四格表:消费级和专业级,台式和便携,他们的工作就是做这四个伟大的产品。

项目经理的主要职责是“Plan Good”。计划并不是Excel里面的任务和时间列表,真正的计划是想清楚项目的目标和方向,同时能把目标进行工作分解,然后让不同的成员配合完成。我们要求团队要有明确的:半年目标,季度目标,月度目标和周目标。项目管理的一个重要任务是范围的管理。一个团队要成功,首先就要必须要专注。如果只是追求数量和进度,那么结果就是做出了很多的山寨货,并且会成为自己的库存和累赘负担。

三、 开放的产品文化

读这本书,我最喜欢的一句话就是“不是杰作,就是狗屎”。很多人都知道乔布斯的缺点:对人苛刻,经常骂人,脾气暴躁。我到不觉得这是缺点,他把自己所有的心血都投入到了公司和产品,对大家期望很高,他发脾气是因为他很在意(当然,表达方式可以更友好,如果那样他也就不是乔布斯了),愿意表达自己真实的感受和情绪。

他自己也在传记里面说过:“我不认为我对别人很残暴,但如果谁把什么事搞砸了,我会当面跟他说。诚实,是我的责任。我们相互诚实到残酷的地方,任何人可以说我是一坨狗屎,我也可以这样说他们”。

Nice并不是开放的文化。如果有不同的观点,但是因为照顾对方的感受,为了表示nice而不去指出别人的错误,这才是失败。开放的产品文化,允许任何人,在任何时间和地点,谈及产品的任何好与坏。可以在会议室里面,激励的争论,互相吼叫,只要确保大家是讨论具体的事情,而不是相互指责。

四、 反馈作用

苹果有一个神秘的设计工作室。伟大产品的设计都是在这里完成的。房间有几台铸型机,可以把电脑屏幕上的设计制成发泡材料模型,可以喷漆,让模型看起来更逼真。乔布斯有时间就会去工作室看一看。当时设计iPhone的时候,乔布斯会搬一个凳子做在那里,把玩桌子上不同的模型,用手去感受他们,评价哪一个才是他最喜欢的。他不喜欢看复杂的图纸,他需要亲眼见到并感受这些模型。这样才能得出正确的反馈。

软件开发,更像是在打一个活靶。目标是一个动态的过程,如果要能够打重靶心,必须及时从各个层次获得反馈,调整自己的方向和步伐。项目开发过程中的迭代计划游戏,灰度上线,界面原型,功能演示,自测,回顾会议,甚至是单元测试,都是在进行反馈。是否能驾驭自如一个项目,关键是看团队的反馈和调整能力的强与弱。

五、 简约设计

iPod项目开始,乔布斯每天都投入其中。他最主要的要求就是:“简化!”他会浏览用户界面的每一个页面,并且会作严格的测试:如果要找某一首歌或者某项功能,按键次数不能超过3次,而且按键的过程要自然。如果他觉得导航不清楚,或者需要按3次上他就会非常生气。乔布斯不喜欢幻灯片,因为他觉得:如果你一定要用幻灯片来讲,那说明你不知道自己想讲什么。

简洁不仅仅是视觉上的,也不仅仅是吧杂乱无章的东西变少或者抹掉,而是要挖掘复杂性的深度。要想获得简洁,你就必须挖得足够深。打个比方,如果你是为了在产品上不装螺丝钉,也许最后可能会制造一个极其繁琐复杂的东西,这不是简洁。真正的简洁是理解产品的每一个部分,以及它是如何制造的。你必须把握产品的精髓,理解它的本质,从而判断出哪些部分的部件是可以拿掉的。

现在互联网应用,技术早已不再是瓶颈。产品开发其实是一个解决问题和复杂度的过程。这是为什么要做软件的设计,为什么要做自动化测试,为什么要做自动化的构建、部署等。任何一个团队都可以做一个产品,但优秀团队做出的产品,一定是简约有力──有内而外。

六、 不要听客户

乔布斯开发产品时没有做任何的市场调研。因为他觉得,有时人们不知道自己想要什么,直到你把它摆在他们的面前。福田曾说过:“如果我最初问消费者他们想要什么,他们应该是会告诉我‘要一匹更快的马’”。所以乔布斯的理念是:我们的责任是提前一步搞清楚用户将来想要什么。

我非常认同乔布斯的观点,不要听客户的。如果要开发出一个客户满意的产品,一定要想的比客户深,比客户远。用心思做好产品,能打动自己的,也一定能打动客户(当然,先要确保自己要有更高的品味)。

七、 部门合作

乔布斯带领苹果,从计算机公司进军到到数字领域。发布了数字产品iPod,后来又开创了在线出售音乐的服务。一致处于数字领域领先地位的Sony,这时却为苹果提供了一个典型的反面教材:他们的消费电子部门能制造出时髦的产品;音乐部门也签约了当红的艺人。但是每一个部门都在竭力保护自己的利益,它的硬件部门、软件部门以及内容部门永远无法统一步调,所以整个公司无法合作推出端到端的服务。

乔布斯没有把苹果公司分割成多个自主的分支,他紧密的控制着他所有的团队,并促使他们作为一个团结而灵活的整体一起工作,全公司只有一条“损底线”。乔布斯的一个商业原则是:永远不要害怕内部相残。他说:“与其被别人取代,不如自己取代自己”。所以,即使iPhone的出现会蚕食iPod的销售,或者iPad影响了笔记本电脑的销售,都没有阻碍他的想法。

从项目管理角度看,索尼的反面教材就好比是模块团队(甚至是一个系统的前台和后台团队)。乔布斯走的是功能团队的路线。现在公司很多的抱怨都是来自各个团队或者部门的配合方面,一个项目/产品应该是一个完整的端到端的交付。模块团队,或者前后台的分割让都是在削弱公司的战斗力。

八、 真正的敏捷

乔布斯刚接管苹果的时候,产品的库存期超过两个月,库存周期对利润造成5亿美元的威胁。到1998年初,乔布斯把两个月库存缩短到一个月。后来雇佣了熟悉精益制造蒂姆.库克(康柏计算机公司的采购和供应链经理),同年9月底,库克把库存期缩短到6天,下一年的9月,这个数字已经达到了惊人的2天──有时,仅仅是15个小时。另外,库克还把苹果计算机的生产周期从4个月减少到2个月。

IT公司的库存就是没有上线使用的代码。敏捷并不是庸俗的快。敏捷是一种能力──消除所有不必要的冗余和浪费。敏捷是通过提升组织和团队的能力,让过程和测试完全自动化,在保证质量的前提下,减少软件产品的生命周期。

总结

这本书让我最有感触的一句话是:“不是杰作,就是狗屎”。我会用这一句话来要求自己和团队,在自己的团队中建立开放的产品和工作文化氛围。任何人都可以走过来,评论我的工作是狗屎,只要他能给出Reasonable的理由。当然,我也可以用这样的话来评论他们!!

敏捷十三

我们通过自己在项目和产品中实践敏捷方法,和帮助其它公司和团队使用敏捷,我们总结了什么是真正的敏捷(为什么叫敏捷13,你是懂的):

  1. 敏捷是整个团队围绕着圆桌一起工作,没有任何沟通障碍
  2. 敏捷是正确理解和挖掘需求,按照业务进行分解,并且有优先级的排列
  3. 敏捷是所有的需求和开发任务都全部贴在墙上,完全可视化管理。需求和任务的细节部分统一在Wiki上记录、维护和整理
  4. 敏捷是每个人都可以自由去墙上领取工作,大家只有一个目标,那就是把项目做好
  5. 敏捷是业务被合理的建模,同时代码被很好的设计
  6. 敏捷是代码每个方法在10行左右,能够表达业务意图,没有重复,遵循开闭原则,修改尽可能在一个地方
  7. 敏捷是代码集体所有制,每天早上做Code Review,大家都有能力修改所有的功能模块
  8. 敏捷是大部分功能都有自动化测试保障,如果测试失败,那么必须第一优先级修复
  9. 敏捷是系统界面简洁,好的交互设计,稳定可靠,良好的性能
  10. 敏捷是自动化编译、打包、部署、升级
  11. 敏捷是不断交付可用的软件,周期从几周到几个月不等,越快越好
  12. 敏捷是团队每周一次learning session,大家追求卓越,互相学习提高,对技术精益求精,对设计不断完善
  13. 敏捷是大家肩并肩地工作,互相尊重、信任、欣赏和协作

交付项目 check list-管理篇

1. 从第一天开始就要告诉客户,如果要做好一个项目一定需要你们的配合、支持和反馈,否则项目一定会失败

2. 有规律的给客户做项目Show case,频率最好保证在1-3周左右

3. 如果想要引导客户,首先团队要有自己的主见。要主动思考和琢磨,想的比客户远,思考的比客户深,看的比客户全

4. 每次客户开会的时候,需要整理会议记录。讨论问题的时候,尽可能在现场决策。如果现场无法决策的问题,指定一个具体的Owner

5. 团队需要维护一份需求列表和Issue列表。对每一项需要有来源、优先级和Esitmate

6. 实体的卡片墙是效率最高的项目管理工具,但还是需要维护一套电子版的需求和Issue列表

7. 当团队规模大了,或者有分布开发团队的时候,物理墙也许无法满足要求了,这时候需要选择Mingle之类的工具

8. 每次迭代或发布,一定要制定一个目标。比如:第一个次发布的目标是:销售经理职位可以在线提交简历和考试。

9. Share responsibility,让每个成员Take一部分责任,让他们感受到自己在团队中的价值,这才是最重要的激励

10. Share responsibility的前提是Share information。把项目邮件抄送所有的成员,和大家分享每一个项目的决定。

11. Iteration 0是有必要的,让团队搭建开发、测试的框架和环境,熟悉技术和业务,做一些开发和Spike

12. 项目开始的2-4周会比较紧张,因为这时候大家对技术和业务都不熟悉,必须要很多额外的付出才能保证团队有一定生产率

13. 开发节奏很重要,一般原则是先紧后松。当然,如果团队每个人都很牛,确实可以一直很从容,但这样的团队也是非常昂贵的。

14. 回顾会议是很有效的Team Building,让每个人敞开心扉的交流。一般2周左右举行一次

15. 成功的项目,一定要有5顶帽子:客户的帽子、PM的帽子、Tech Leader的帽子、QA的帽子、公司的帽子。每顶帽子对项目的成功都有各自的定义,他们互相牵制和影响,配合得当,项目就会很健康并且容易成功

敏捷咨询工具箱(三)──结对辅导

发表于Infoq: http://www.infoq.com/cn/news/2011/01/qac-agile-tool-box-counseling

My mind to your mind. My thoughts to your thoughts…

– Mr. Spock

什么是结对辅导

在前面的两篇敏捷咨询工具箱中,我分享了如何做读书写代码活动OO训练营。认真的做好这两项活动之后,团队的开发设计能力会提升一个台阶。对于有经验和有能力的团队,他们可以直接把这些技术和思想直接应用到项目中。但有一些团队还需要进一步的跟进。那我们如何进一步的跟进,保证大家能把这些技术应用到项目中呢?

这 对一个敏捷咨询顾问是一个很大的挑战。在很多人眼里,顾问就是那些能说会道,把事情说得天花乱坠,但都是只会纸上谈兵,站着说话不腰疼,为团队带来麻烦, 却不解决实际问题的人。我承认,顾问的好名声就是曾经被这样的人给败坏了。那顾问如何才能深入团队,解决他们的真正问题呢?答案是把顾问放到一个具体的项 目团队里面,为团队成员提供结对辅导。那什么是结对辅导呢?

结对辅导来源于极限编程的一个开发实践──结对编程:
结对编程,就是两个开发人员用一台电脑一起编程。一个人操作键盘和鼠标,充当驾驶员的角色。另一个人在旁边观察和思考,提出建设性的意见,充当着领航员的角色。同时,两个人会频繁的进行角色互换。
我 们把这项实践运用到咨询中,我会去一个项目团队,和大家一起工作,用结对的方式对团队中不同角色的人进行辅导。我会和开发人员一起结对,指导他们如何做开 发和设计;我会和业务分析师一起结对,指导他们如何做写用户故事,如何做需求分析;我会和项目的经理一起结对,指导他们如何管理项目和团队,如何系统思 考,如何主持各种会议等等。下面分享我是如何对开发人员进行结对辅导,指导他们在真实项目中进行TDD开发和设计。

如何辅导一名主开发人员做TDD开发和设计

我在一个客户那里,结对辅导了一个主开发人员。我们一起用了三周时间,完成了一个完整的用管理功能模块,这个功能大致分为6个左右的用户故事。我们是在C语言的开发环境下,使用TDD的编程方式。下面将分享我是如何做的结对辅导。

梳理需求

在结对开发开始之前,我和她花了一天的时间,从下面几个方面对需求进行了梳理:

  • 以前是否有用户管理功能,它的业务流程是什么样的?
  • 为什么要做一个新的用户管理功能?
  • 新的用户管理流程会是什么样的?
  • 每个需求的内容是什么?它的功能范围是什么?背后的价值是什么?
  • 有哪些验收用例,这些用例是否全面和具体?
  • 测试人员如何验收?这些需求是否可以端到端的进行完整测试?

通过这样的提问和交流,我们完整的把这些需求梳理了一遍。同时也把遇到的一些不合理用户故事做了重新划分。

纠正错误的编程习惯

第 二天,我们开始结对编程。刚开始结对的时候,发现她已经从别的地方拷贝了一堆代码,修改了一些,可以编译通过。她想在这碓代码的基础上开发,这也是典型的 复制&粘贴式的开发方法。我们花了很长时间讨论了这个问题。复制和粘贴是邪恶重复代码产生的根源之一,这显然是错误的编程方法和习惯。可是她却习 以为常,并不觉得有什么错,按照她的话说:有现成的代码,拷贝过来修改一下有什么错。激烈的讨论之后,最终以双方的妥协和各自让步达成了一致:

  • 这些代码是有价值的,它只是用来做Spike,验证一些功能是否可以实现
  • 但是Spike之后这些代码需要扔掉的,作为妥协,她愿意把这些代码全部注释起来(舍不得这些破烂)
  • 用TDD的方式写代码,先写测试后写代码,没有测试失败就不要写代码,重构代码除外

真正的TDD开发

我 要求她使用TDD开发即测试驱动开发。先写一个测试,运行测试失败,然后再写业务代码。可是,她上来就反对:“费那事干吗,一次把所有的测试都写完了再写 实现代码,这样岂不是更快?”。我先是无语,然后便开始说服她,告诉她这叫小步前进,就是把复杂问题分解开,从最简单问题的开始,一步一步的前进,这样开 发才有节奏,每一小步都会有反馈(测试失败,实现业务代码,测试通过),整个开发过程可控可驾驭。我苦口婆心说了半天,她还是坚持自己的意见。于是我问 她:“你为什么要一次写完所有的测试?”。她的回答让我恍然过来:“因为我想到了很多测试场景,如果没有写下来,我担心自己后面会忘掉”
啊 哈!我终于搞明白了她的顾虑。这个好办,我们拿了一张卡片,然后把想到的测试场景全部写到卡片上。实现完一个小功能,就在上面做个标记。这样在做TDD开 发的时候,就可以专注写一个测试,有了一个失败测试之后,让测试通过是压倒一切的任务。这样的开发过程很专注,思维不容易发散,任何时候想到了其它相关的 问题,就及时的纪录在卡片上,等后面再实现。

在 我的严格要求之下,她开始了TDD方法,先写一个测试再写业务代码。我的目标是把她培养出来,所以我们采取了是教练式的结对方法:我提出想法,她操作键盘 和鼠标写代码(有时候我会为她写一些测试代码)。结对也是一个引导的过程,有了一个新的测试之后,第一步是要让测试通过,这时不用去追求代码的优雅,只要 测试通过就可以了,然后我会提出代码中的坏味道,和她一起讨论,问是否有更好的方法?如何让代码更能表达业务意图?如何在同一个层次上编程等等?引导她一 步一步的进行重构。

下面这张图是一步步用TDD方式产生的用户登录功能的测试用例:

就这样,用了三周左右的时间,我们一起完成了这个功能模块的开发。三个星期的结对下来,我也有了一些心得体会。

心得体会

  • 在同一个经验丰富的开发人员进行结对辅导的时候,前面会有一个挑战的磨合期。因为他们一般都积累了自己的一套成功的编程方式和习惯,这样导致他们对新的TDD开发和简单设计有抵触的情绪。这样就需要顾问一步一步的引导说教,让他们切实体会到新开发方法的好处。
  • 结对辅导需要两个人紧密的协作,刚开始肯定会有一些工作方法和习惯上的冲突。如果对方不认可敏捷的开发方法时,不要一味的说教,一定要先沟通和交流,询问为什么不愿意这样做,了解清楚对方的顾虑和担忧之后,对症下药,提供一些实践解决对方的顾虑。
  • 有时候我们的建议遭到拒绝,往往并不因为是建议本身的问题,而是因为我们还没有建立好信任和领导力。
Next Page »