[转]创建敏捷团队
创建敏捷团队
作者 Darren Hale译者侯伯薇发布于 2010年3月24日 下午10时30分
简介
创建敏捷的软件开发团队并不像表面看起来那么容易。很多管理人员和团队主管会雇佣技术合格的人组成团队,扔给他们某种敏捷过程,然后就希望所有事情都像书上说的那样有效。这种方法不仅不现实,而且非常容易失败。本文将会描述成功团队的要素,并说明我们应该如何创建这样的团队。
成功团队的要素
成功的敏捷软件开发团队由技能熟练的开发者组成,他们已经确立了团队价值,拥有良好的沟通,并且总是寻找改善的机会。对于成功来说,尽管这些因素并非绝对必要,然而拥有全部因素会为我们铺就一条通往成功的捷径。
核心原则
对于想要为团队确立什么样的文化,每个人都有自己的想法。除非管理人员雇佣自己非常熟悉的人,否则就很难将文化的愿景变为现实。我们很早就发现以下重要特征:拥有客户的视角、有效地协作、通过事实管理,以及专注于执行等等。具体执行了这些原则的团队就具备了成功的条件。执行这些核心原则的团队成员会表现出大量良好的行为,诸如向客户提问、像客户那样思考、愿意请求帮助、愿意帮助他人、根据具体的事实而不是个人意见来做决定,以及努力交付完成的代码。
有效沟通
有效沟通对成功起着决定性作用。与人面对面交流是最有效沟通的方式之一。当人们聚在一起的时候,就更容易得到好主意。有效沟通另一个决定性因素是专注。如果没有一个定义好的主题能够让参与者集中注意力,那么谈话就不会有好的效果。有效沟通第三个重要因素是让谈话专注于事实和想法。当个人的意见取代了事实和想法,那么谈话很快就会变为为了个人胜负的争辩。
好的成员
成功团队最重要的因素就是人。软件开发团队需要有才能的人,需要熟练的开发者来使用新的技术创建复杂的系统。创建这样复杂的系统不可能由一两个人完成,因此一个团队是很必要的。这样,就需要开发者也必须具有良好的团队精神。
不断提升
我们知道,当创建新的团队来开发新系统时经常会失败。能否从发生的错误中学习到经验和教训,这就是成功团队和失败团队之间的不同。只有检讨过去的失败并且做必要的改善,团队才能够不断进步。
创建团队
关注沟通
从创建公司开始,我们就关注沟通。我们办公室的物理布局是开放的。开发团队坐在一个大的开放的屋子里。每个开发者都有自己的桌子,并且以方便沟通的方式分组。这个开放的环境使得沟通更加容易,因为人们不会藏在自己的小隔间里面,从而谈话都是"公开的"。(重要的是,每个人都要表现得谦虚和职业化,这样环境才不会变得不可忍受。)
确立核心原则
当创建团队的时候,我们就意识到需要确立团队所要表现出来的特征。开始我们认为日常的交互会为团队注入我们所寻找的特征。捕获到这些特征,并将其普及是很重要的,这可以保证所有团队成员都恰当地关注某些价值,而我们认为对成功来说这些价值是很重要的。对我们来说,确立想要团队表现的特征给了我们真实的体会,其中之一是当前某些团队成员不会表现出那些特征。我们和团队一起做了大量工作,以学习并展现这些特征。有些团队成员的反应很积极,而有些则不然。在一些情况下,我们需要让某些人离开团队。我们得到的另一个体会是:我们的面试过程并没有筛选出想要的人。早先的面试过程过于专注于候选者的技术能力。我们的选择过程寻找的是技术最熟练的人。这个标准帮我们得到了非常聪明而且能干的开发者,但是并不能总是为我们带来能够在团队环境中表现出色的人。
面试过程
寻找具备足够技术能力并且适应现有文化的人非常困难。一方面,客观衡量候选人的标准能够让我们对所有候选人进行快速筛选。另一方面,纯粹的客观标准不会找到具有"软技能"的人,而这样的能力有助于人们在团队环境中行使职责。我们在如何高效准确地探索这些领域做出了很多努力。当前的面试模型是一个多阶段的过程。过程中的第一步是电话面试。通过电话面试我们可以快速向候选者介绍公司,并且在较高的层次上调查候选者。在电话面试中,我们会涉及一些基本的技术能力、对于敏捷开发的想法和理解,以及某种层次上的个人反省。通过谈及这些方面,我们能够知道某人是否会在我们的环境中发挥作用。如果候选者通过了电话面试,那么我们会为其安排现场面试。该面试被分成三个部分:技术、过程、个人。对于每个部分,我们都会指定至少两个团队成员,从而团队的大多数人都会与候选者交流。面试的技术部分关注的是基本的技术能力,并且包括动手编程练习。过程部分会涉及测试、问题解决以及结对编程方面的思想,还有其他主题。个人部分会查看冲突解决、个人激励以及总体的心理稳定性。我们已经发现这个过程很有效。如果三个部分都完成了,而且我们对候选者的加入没有任何犹豫,那么这个候选者将会在我们团队中很好地工作。
过程改进
过程改进对于成功的软件开发团队也是非常重要的。我们不仅从用来编写和部署代码的角度检视过程的改进,而且会检视用于为工作安排优先级和雇佣新员工的过程。"3×3"的复审就是我们用于改进的一种机制。整个团队聚集在一起,每个团队成员都必须提出过去三个月中得到的正面的东西,以及过去三个月得到的负面的东西。然后针对正面组和负面组,每个团队成员都会各得到三张选票。这些选票会投给每个列出的项目。当复审完毕,我们会从高层次的视角看到团队认为哪些是正面的,认为哪些需要做出改进。这个视角有助于让团队与已明确的团队特征保持一致。过程改进的另一个方面是面试的过程。因为对于敏捷开发技术的理解已经成熟,所以我们需要找到的人不仅仅是技术高手,而且要具备很好的团队精神。经过大约十八个月的过程,我们修正了现有的面试过程并使其不断完善,所达到的效果是:难以适应我们的环境的候选者将无法通过。这个改进的过程让我们对雇佣的人更有信心。在执行现有过程和持续提升过程之间,我们已经找到了一个平衡。当过程中存在问题的时候,我们就会花费一些时间来评估它。如果是整体上的问题,我们就会试图找出所能做的增量式的改变来改进过程。如果不是全体的,那么我们通常会先采取观望的态度,然后再做出改变。
结论
通过很短的一段时间,我们已经学到了一些对于创建成功的敏捷开发团队很重要的知识。确立团队价值并坚持下去,这帮助我们创立了成功的文化,并且改进了我们的面试过程。促进好的沟通除去了很多团队的阻碍。改进我们的面试过程帮助我们识别合格的开发者,他们会很好地与现有团队融合。复审我们现有的过程帮助我们持续提升团队的水平。
ENG:
Introduction
Building an agile software development team is not as easy as it seems. Many managers and team leads hire technically capable people, throw some form of an agile process at the team, and hope that everything works as well as the literature says it does. This approach is not only unrealistic, but it is prone to failure. This article will describe the components of a successful team and how we built this team.
Components of a Successful Team
A successful agile software development team is made up of skilled developers , has established team values, has good communication, and is always looking to improve. While having every one of these components isn't absolutely critical for success, having all of them will make the road to success much shorter.
Core Principles
Everyone has an idea about what kind of culture they want to establish for their team. Unless a manager is hiring people that he knows well, turning the vision of a culture into reality is very difficult. We recognized early that the characteristics that were important to us included having a customer perspective, collaborating effectively, managing by fact, and focusing on execution. A team that embodied these principles would be well positioned for success. Members of a team that embody these core principles exhibit a number of good behaviors. Some of those good behaviors are asking questions of customers, thinking like customers, being willing to ask for help, being willing to help others, making decisions with concrete facts instead of personal opinions, and striving to ship finished code.
Effective Communication
Effective communication is critical for success. One of the most effective aspects of communication is to be face-to-face with people. It is much easier to work out ideas when people are located together. Another critical aspect of effective communication is focus. Conversations are not productive if they don't have a well-defined topic that the participants stick to. A third essential element of effective communication is keeping the conversation focused on facts and ideas. Conversations can quickly degenerate to fights and turf wars when personal opinions take the place of facts and ideas.
Good People
The most important aspect of a successful team is the people. A software development team needs talented people. Skilled developers are required to build complex systems using new technology. Building these complex systems can't be done by one or two people. A team is necessary. Therefore, the developers that are needed must also be skilled in working on a team.
Constant Improvement
We knew that we would fall down a lot as we built a new team and created a new system. The difference between a successful team and a failing team is the learning that happens from these mistakes. Progress can only be achieved by reviewing past failures and making necessary improvements.
Building the Team
Communication Focus
From the inception of our company, we have focused on communication. The physical layout of our office is open. The development team sits in a large open room. Each developer has his/her own desk, and they are grouped in such a way as to facilitate communication. This open environment makes communication much easier because people can't hide out in cubicles and conversations are "public." (It is important that everyone act civilly and professionally so that this environment doesn't become overbearing.)
Establishing Core Principles
As we built the team, we realized that we need to codify the characteristics that we wanted the team to embody. We initially thought that day-to-day interaction would infuse the team with the characteristics we were looking for. Capturing these characteristics and socializing them with the team was necessary in making sure all team members had the proper focus on the values we felt were critical to success. Codifying the characteristics that we wanted the team to embody was a stark realization for us. One realization was that some of the current team members didn't embody the characteristics. We went to great lengths to work with these team members to learn and exhibit the characteristics. Some team members responded very positively, and some did not. In some cases, we had to remove people from the team. The second realization for us was that our interview process wasn't filtering the types of people that we wanted. Our early interviewing process focused very heavily on the technical skill set of candidates. Our selection process looked for the most technically skilled people. This criteria brought us very bright and capable developers, but it didn't always bring people that thrived in our team environment.
Interview Process
Finding technically capable people that fit with an existing culture is tough. On one hand, having objective measures of a candidate helps to quickly filter a candidate pool. On the other hand, purely objective measurements don't capture the "soft" skills that help someone function in a team environment. We struggled with how to probe these areas effectively and efficiently. Our current interviewing model is a multi-stage process. The first step in our process is a phone screen. Phone screens give us a quick way to introduce our company to a candidate and to probe the candidate at a high level. In the phone screens, we cover some basic technical abilities, thoughts and understanding on agile development, and some level of personal introspection. By touching on these areas, we can tell if someone will not function in our environment. If the candidate isn't filtered out during the phone screen, we schedule an on-site interview. This interview is broken up into three segments: technical, process, personal. For each segment, we assign at least two team members so that a majority of the team gets to interact with the candidate. The technical portion of the interview focuses on raw technical ability and includes a hands-on programming exercise. The process portion gets into philosophies on testing, problem solving, and pair programming, among other topics. The personal section looks at conflict resolution, personal motivation, and general mental stability. We've found that this process works very well. If we get through all three segments and there is no hesitation about a candidate, the candidate will work well in our team.
Process Improvement
Process improvement is key to building a successful software development team. We look at process improvement not just from the processes used to write and deploy code, but also processes used to prioritize work and hire new employees. One mechanism that we use for improvement is what we call a "3x3" review. With the entire team gathered together, each team member must come up with something positive from the past three months, and something negative from the past three months. Each team member then gets three votes each for the positive group and the negative group. Those votes are distributed to each listed item. When the review is done, we have a high-level view of what the team sees as positive attributes and what the team sees as needing improvement. This perspective helps keep the team aligned with the stated team characteristics. Another area of process improvement for us has been the interview process. As our understanding of agile development techniques matured, so did our need to find people that were not only skilled technically, but skilled in functioning on a team. Over the course of about eighteen months, we refined and perfected our interview process to a point where we know we won't pass on a candidate that would not thrive in our environment. This improved process gives us a much greater confidence in the people that we hire. We have had to find a balance between executing our existing processes and continually improving the processes. Whenever we experience pain in our processes, we take a little time to evaluate the pain. If the pain looks systemic, we try to identify incremental changes we can make to improve our process. If the pain is not systemic, we usually take a wait-and-see approach before making any other changes.
Conclusion
Over a short span of time, we've learned some valuable lessons for building a successful agile development team. Establishing team values and adhering to them has helped us build a successful culture and refine our interview process. Facilitating good communication has removed obstacles that hinder many teams. Refining our interviewing process has helped us identify qualified developers that will mesh well with the existing team. Reviewing our existing processes has helped us to improve the team on a continual basis.