领导力大挑战
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
该内容已经被标记书签!
标记书签错误,请重试!
作者 钱安川 发布于 2010年12月31日
犯错误是最好的学习方式
──莎伦·德雷珀
我们为客户提供咨询,刚开始做了很多敏捷的实践,包括:持续集成、测试驱动、用户故事需求分析、迭代开发等等之后,发现如果再想深入下去,就会面临一些“硬骨头”:遗留系统和开发设计能力的问题。在一些客户那里,他们产品有10多年了,但是很少有人新加程序文件,写代码习惯于复制粘贴,都是在已有的类和函数上修修补补。团队缺少追求好代码的品质和能力,到处是大函数,上帝类(超大类,任何功能变化都要修改此类),重复代码,混乱逻辑,开发和维护成本太高。作为一个顾问,如何才能从根本解决这样的开发设计能力问题呢?
在ThoughtWorks,如果招聘了一个没有经验的开发人员,会把他们送到印度的TWU(ThoughtWorks University)培养2-6个月,OO训练营是开发人员的主要课程之一。它专门用来训练开发人员如何使用面向对象,如何进行测试驱动开发。通过这样的训练之后,开发人员可以很快的掌握面向对象开发和简单设计能力,养成追求好代码的品质。所以,我们也为客户的团队引入了TWU的OO训练营活动。

OO训练营的培训方式和我们传统的“填鸭式”教育完全相反。它采用的是苏格拉底式教学法,顾问不会给你任何标准答案,而是通过问题的引导,让学员自己一步一步找到最佳的解决方案。我的OO训练营的组织方式一般是:
顾问在训练营活动会扮演着客户的角色。活动一开始的时候,会以客户的身份提出一个需求,让大家去完成。例如:要求建模一个长方形。
以分组讨论方式做一个简单设计,一般从如下三个方面进行设计。
讨论结束之后,每组介绍一下各自的讨论结果。通过分组讨论和顾问的引导,对建模一个长方形需求一般会得到如下的设计结果:
这些测试用例完全是由学员自己设计出来的,没有标准答案。作为顾问只是引导大家,让每组的测试用例更具体和全面。假设没有一组学员没有考虑到异常情况的测试用例,这时也也不用指出来,等后面代码展示的时候,再指出这个问题,因为犯错是最好的学习方式。
学员根据设计和讨论的结果,用测试驱动的方式进行结对编码开发。要求先写单元测试,写完一个单元测试之后,运行测试失败,然后再去写业务代码。如果没有失败的测试,不允许写一行业务代码。这样严格的要求,让大家养成测试驱动开发的好习惯。
两个人一组使用结对方式进行开发,要求使用乒乓式的结对方法。假设是A和B进行结对开发,A先写一个测试用例,编译通过但是测试失败。然后把键盘和鼠标交给B,B写业务代码,让测试通过,然后为A再写一个失败的测试。通过这种乒乓的方式,一个人写测试用例,一个人实现业务代码,并且不停的变换角色。这样两个人可以很好的进行配合,互相给对方出“难题”,一个人在写实现的时候,另一个人会思考下一个测试用例会是什么。
有的时候,我们会对团队提出一些更高的要求。比如编程过程中不允许使用鼠标,一切都是快捷键操作,这样能提高开发的效率。编程过程中不允许使用复制和粘贴功能,如果是相同的功能或者代码,第一应该考虑到的是如何进行功能重用,而不是复制一遍,这样可以杜绝这样错误的编程习惯。
写完代码之后,每个人开始展示自己的代码。这时,顾问就开始从代码里面寻找代码怀味道(Bad smell),告诉大家什么样的是好代码,什么样的是坏代码。坏代码会有哪些危害,让后让大家重构。
例如:在实现长方形周长的时候,有人实现了getLength了getWidth方法,把长方形的长和宽的数据暴露出来了。那么这就是一个代码坏味道(Bad smell),顾问会指出这个问题,告诉大家面向对象最重要的一个特征是封装,不应该把数据直接暴露出来。因为数据暴露出来之后,一方面造成数据的依赖和耦合,另一方面其它代码在调用长方形这个对象的时候,也许会拿到长和宽的数据自己进行运算,这样就破坏了封装,对象之间耦合增大,并且容易产生重复的代码。然后提问大家,正确的做法应该是什么?
答案应该会是长方形不应该把长和宽的数据暴露出来,所有长方形相关的运算和逻辑都应该在长方形这个领域对象里面进行。这也正是面向对象设计的一个重要原则:Tell don’t ask的体现。通过这样的引导的方式,带领大家一步一步找到正确的面向对象设计方法和原则,同时纠正那些错误的编码和设计习惯。
每次活动就是类似这样的流程。顾问提出需求,然后是讨论和设计,结对开发,最后展示代码和点评。一轮结束之后,顾问又给大家一些新的需求,进行第二轮,如此一直的循环下去。
我多次为客户的团队组织过类似的训练营活动。最长的一次坚持了3个月,每周2次,每次两个小时,完成了OO训练营的所有课程。坚持参加完这个活动之后,开发人员和技术Leader的都能真正的全面掌握面向对象设计方法和原则,并且把这些用到自己的项目中。下面是我的一些经验和教训:
如果你也想在自己的团队或者公司引入这样的活动,下面一些资料可供参考:
为了做好OO训练营这样的活动,需要事先设计好一些练习和案例。下面的书籍里面就有一些很不错的例子,可以直接拿来练习。比如:《测试驱动开发》这本书里面的Money例子,《重构》这本书的影评出租店例子等等。也可以去网上找到一些训练营的资料,我这里为大家提供一个咖啡机的案例,它有现成的用户故事,可以直接拿来做OO训练营。它的网址是:http://agile.csc.ncsu.edu/SEMaterials/tutorials/coffee_maker/index.html 。
顾问点评是一个很重要的环节。要求顾问首先自己是一个优秀的程序员,有丰富的开发和设计经验,这时候才能去很好的指导别人。精通和掌握下面几本书,是对顾问最基本的要求:
关于作者
钱安川,ThoughtWorks公司高级软件咨询师、敏捷过程教练、资深讲师、Team Leader、开发者、 BeiJing Open Party组织者和主持人。个人博客:敏捷开发训练。
很多团队,推行敏捷后会不适应,因为敏捷剥去了以往开发人员的保护伞,“快速设计”、“持续重构”并非没有开发人员都能具备。
在人的能力不行时,甚至连一个类的设计都不清晰的时候,敏捷,是死路。
原有CMM,能够让开发人员有一个自学习和引入外部专家协助的过程,而敏捷没有了这个过程,让新兵直接面临实战的炮火,基本上等于送死。
TW这个“OO训练营”,说白了,实在帮助雇主补课,具备一定的技能基础后,才会有下文。
其实敏捷和OO没有关系。
感觉文中说的方式挺有用的,这种方式可以和新人的其他培训深入结合起来。
“敏捷没有了这个过程,让新兵直接面临实战的炮火” ,不论是不是敏捷,从团队来讲都需要让新兵进行一定训练和“被严打” 才能让他们更好的融入团队,团队才能更快地scale up,而不是任其自生自灭。
敏捷重要的是思想,而不是套路上东西。我现在最关注的是如何更快更有效的提升团队的能力和管理者的思想,这才是根本。
新兵不是独自面对炮火,他旁边还有一个老兵。
敏捷重要的是思想,而不是套路上东西。我现在最关注的是如何更快更有效的提升团队的能力和管理者的思想,这才是根本。
同意,那思想这么难改变?或者说团队的能力和管理者的思想难以快速有效提升的障碍都有哪些?
一直以来,我总觉得国内软件行业的生存环境还不够恶劣,再加上源源不断的“生力军”,"浮躁"的社会真的太难让程序员静下心来,稳稳的成长.
TW这个“OO训练营”,说白了,实在帮助雇主补课,具备一定的技能基础后,才会有下文。
其实敏捷和OO没有关系。
在某种程度上同意,很多雇主或管理者宁愿花钱请TW来做培训,也很难在公司内部真正重视OO设计。当然那些重视的也就不用请TW来咨询了。
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
论道WP第三篇专栏,以应用程序栏的使用为中心,包括了软键盘带来的问题、应用程序栏介绍、如何绑定应用程序栏的属性等几个方面的具体话题,为开发者顺利使用应用程序栏开发提供了具体指导。
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中对于锁的性能优化,以及锁的存储结构及升级过程。
本次分享将首先介绍现代富文本编辑器的组成和实现,然后结合UEditor的开发过程,与参会者分享UEditor在设计和实现的过程中,所涉及到的核心功能的细节实现。
本次演讲视频录制于百度技术沙龙。
我们所开发的应用程序大多都需要提供一个图形用户界面(GUI)。关于GUI应用的架构设计,已经有了Form & Control、MVC,、MVP、 Passive View等多种模式。模式可以帮助我们建立优雅的架构,但前提是弄清楚模式的应用场景。弄清楚GUI应用面临的设计上的问题,有助于我们正确的挑选设计方案。
MongoDB是一种非常易用的NoSQL方案,Brian C. Dilley在这篇文章里介绍了MongoDB的优劣势,并介绍了MJORM项目。MJORM用于MongoDB,是一个没有注解的Java ORM库。
随着网络基础设施的逐步成熟,从RPC进化到Web Service,并在业界开始普遍推行SOA,再到后来的RESTful平台以及云计算中的PaaS与SaaS概念的推广,分布式架构在企业应用中开始呈现出不同的风貌,然而殊途同归,这些分布式架构的目标仍然是希望回到建造巴别塔的时代,系统之间的交流不再为不同语言与平台的隔阂而产生障碍。
6 条回复
关注此讨论 回复