《编程匠艺》读书笔记之十六


第十七章 团结就是力量——团队合作与个人程序员
  • 在大多数行业中,优秀的产品都是优秀团队的杰作,软件开发也不例外。
  • 在现实中,任何规模较大的软件开发公司都会具有很多团队合作的层次,可以从公司、业务单位、项目、团队到个人。
  • 虽然公司是一个有效率的大型团队,但是你却常常发现各个部门和各种集体之间,人们会在心里称呼对方和自己为“他们和我们”,从而使公司内部出现断层。这并不是一个高效产品开发的理想环境。
  • 开发团队的大小不仅规定了它在整个组织食物链上的位置,而且决定了它的运作方式以及它所分享的软件构建工作。
  • 不管是与开发团队内的人还是与外界的人互动,都会影响你创建的代码,要注意他们是如何影响你的工作的。

    对于不同的团队,可以从以下方面看出不同:
  • 管理方法。一个项目的管理可以建立在平级管理的基础上,即所有程序员的地位都相等,不存在领导与被领导的关系。程序员可以独立工作,负责系统的一部分,也可以通过“结对编程”的方式合作,以分散责任并传播知识。
  • 责任划分。1. 垂直型的团队组织,会构建一个可以胜任很多角色的全才型团队,优点是开发人员可以学到各种各样的技术,并且在整个软件开发过程中变得更有经验,为了让这种团队运转良好,必须定义公共的标准和守则,必须及早对公共的体系结构达成一致意见,否则结果将使一个混乱和随意的系统;2. 水平型团队,由一组专才组成,所有开发任务都在这些专才之间进行分配,每个人的特长都在恰当的时候得到发挥,由于每个开发过程都有很多人参与,所以这种团队更难以管理,工作流程也更多。
  • 组织和代码结构。康威定律:让4个团队分别开发一个编译器,你就会得到4种不同的编译器。
  • 围绕着你要构建的代码来组织你的团队,而不是围绕你的团队组织代码。

    团队进行合作时需要的工具:
  • 源代码控制。不论是对于100人的大团队,还是一个人的项目,你都需要它。
  • 缺陷数据库。缺陷跟踪系统是测试和开发之间的枢纽。
  • 协同工作系统。团队需要有效的沟通手段,一种共享和协同操作文档的机制。
  • 方法。你必须选一种恰当的方法,要考虑团队的大小,你要创建的代码的类型,以及团队成员的天分、经验和动态等。
  • 项目计划。为了切实有用,项目计划必须基于可靠的估计,并且在需要进行任何更改的情况下必须保持及时更新。

    以下是一些常见的团队类型:
  • 巴别塔。一种无法进行有效沟通的团队。因为无效的沟通会使人们作出错误的设想。巴别塔的最初建造者们由于讲多种不同的语言而支离破碎,不同的背景、方法、编程语言甚至不同的个性都会造成团队成员彼此误解。这种问题不仅会出现在单个软件团队中,也会在多个相互协作的团队之间出现。对待这个问题,最有效的策略就是鼓舞团队的士气,将开发人员之间的距离拉近。
  • 独裁制。一个团队由一位意志坚定、个性强硬的人来领导,这个人通常是一位技术高超的程序员,其他程序员都被要求为追随者,遵从独裁者的命令,而不能有任何怀疑。这种团队的危险包括:当来自外部压力迫使独裁者更多的向管理人员转化时,他的技术专才几乎保证了他管理技能的缺乏。
  • 民主制。这是一种人人平等的团队,程序员具有相似的技术水平和互补的个性,他们以非层次化的形式组织在一起。人人生来平等,但成长方式各异。在最糟糕的情况下,团队最终会就一个问题不停的讨论,视图达成一致,却永远不能取得任何结果。由于没完没了的会议和周而复始的讨论,团队将处于一种“分析瘫痪”的危险之中:注意力聚集在过程上,而不是项目交付上。在松散的开发民主制下,即使面对最小的决策,团队也不得不召开委员会会议,而且要花几天时间才能得出结论。民主的目标是要消除一种特定的瓶颈,即所有的决策都必须由老板来作出,而他却不一定总是做出这些决策的最佳人选。你可以通过表现出坚强的意志,去试着改变优柔寡断的民主,不要满足于看着事情越来越糟。
  • 卫星站。从主开发团队中分离出来的卫星团队有着自己的苦与痛。卫星也许是一个辅助部门,或者是一个与主要开发团队地理位置相离很远的部门。分离的团队不是随便就能很好的合作的。将开发人员分隔在不同的房间中,甚至以走廊相隔,都是一种人为的分隔,这种分隔会妨碍合作。这种形式的开发团队需要更加细致的监控和管理,最根本的生存之道,就是让所有团队成员在项目初期尽早召开面对面的会议,尽早定义不同地点的工作之间的接口,以避免代码互动的问题。
  • 大峡谷。团队中存在明显的技术差距,高级程序员和初级程序员之间的鸿构没有任何桥梁连接,这样就会慢慢出现两个截然不同的小集团。所以我们应该监视你团队中的动态变化,不健康的团队会发展出许多小集团。我们要平等的对待每一个人,把他们当做同事。
  • 流沙。要想组建一个优秀的团队,需要一组优秀的程序员,但是只要有一个糟糕的程序员,就足以让一个团队变得糟糕。在这种类型的团队中,一个成员的弱点就会很快毁掉整个团队的效率。对于这种情况,我们要做的,最重要的就是自己不要做流沙。
  • 旅鼠。这种团队由非常信赖别人、忠心耿耿的成员组成,他们在技术上无可挑剔,但是除了具体的指示之外,他们什么也不关心。对待这种局面,我们不要停止工作,但是要不时的抬头看看,要从客户需求阶段到最终的交付,我们要质疑分配给你的工作,了解这些工作的目的。

    要想称为一名高质量的程序员,你必须是一个高质量的团队合作者。需要具备以下技能:
  • 沟通。最有效的沟通应该是让所有相关人员都参与进来,它应该足够详细,但是不应该耗费太多的时间和精力。对于运行良好的团队来说,清晰的有效沟通途径非常重要,必须建立并培养这些途径。
  • 谦虚。这是一种必需的品质,也是我们的行业中常常缺少的品质。
  • 处理冲突。我们必须很成熟,要对我们自己的态度负责,并且药学会避免冲突,冲突和敌对会严重的损害团队的绩效。控制得当、正确引导的冲突却可以称为你的团队的一个主要成功的因素。
  • 学习和适应能力。你必须不停的学习新的技术技能,同时你必须学会如何在团队中工作。
  • 了解你的不足之处。

    团队的合作原则包括:
  • 集体代码所有制。高效的团队合作要求我们在进入软件工厂之前,要先忘掉自己,任何程序员都不拥有代码库的任何一部分,团队中每个人都有权访问所有代码,并可以在恰当的时候作出修改。
  • 尊重别人的代码。意味着你应该尊重现有的式样风格和设计决策。
  • 编码准则。为了使协作制作出合理的代码,你的团队必须有一套编码准则。
  • 定义成功。为了使大家感觉到有所成就并且合作愉快,团队成员需要有一套清晰的防线和目标。
  • 定义责任。所有高效的团队都具有定义良好的组织结构,并有清晰的责任划分。
  • 避免倦怠。任何团队都不应该有不切实际的目标。避免将所有困难的工作和所有高风险的工作分配给少数几个人。不要让某个人一直重复不停的做同样的任务,直到他厌倦并放弃,让每个人都有机会学习并掌握新技术。

    团队的声明周期:
  • 团队的创建。1. 确定团队在公司的食物链中处于什么位置;2. 要想成为高效的团队,必须要有一些能力强、有天赋的成员,他们有可能变成一个高效的单位;3. 选择并运用一种恰当的团队合作方式。
  • 团队的成长。团队在成立初期将确定整个项目的基调,因此要注意那些怀疑态度或者不好的意愿。
  • 团队合作。团队必须养成一种开发习惯——找到合适的工作节奏,在前进途中的每一步上都符合目标。
  • 团队结束。在团队组建的开始,就必须有一个清晰的结束点。在每个人离开团队时,确保他或她的所有重要知识和工作产品都留了下来,不要因为人员离开团队而丢失信息,执行一个移交过程,将团队成员的重要知识流下来,这包括所有的代码文档、测试用例和维护指令。

    关于团队合作的过程中,会议的有关原则:
  • 会议很重要,而且也不可避免。
  • 提前足够的时间通知人员参加会议——提前几天,而不是提前几个小时。
  • 安排会议在合理的时间举行。
  • 设定一个严格的时间限制,并事先声明。
  • 确保每个人都知道会议的主题,以及邀请他们参加的原因。
  • 确保每个人都知道会议召开的地点,确保会议室中有适当的设备。
  • 在会议召开之前定义好会议角色,至少包括:1. 主席,引导会议的进行,确保讨论没有跑题,并且做适当的结论;2. 秘书,负责记录会议的进程,整理会议记录;3. 决策者,对每个问题都有最终的发言权。

    一个高效的软件开发团队,必须满足以下这些因素:

  •  人员分布正确,拥有适当的技术能力范围。

  • 团队成员的经验要有一定的差别,他们每个人都能从其他人身上学到东西。

  • 团队成员的个性必须是互补的。 

  • 一个清晰并且现实的目标。 

  • 激励。

  • 尽快提供适当的规范,以便让所有的成员都清楚他们要构建什么,并确保各个成员的工作能够很好的契合在一起。 

  • 良好的管理。

  • 让团队的规模在现实的范围内尽可能的小,但是也不要太小。 

  • 一个清晰并且被普遍理解的软件开发过程,让整个团队有据可依。

  • 公司会提供后备支持,而不是阻碍和不必要的官僚体制。


    一个失败的团队,通常有以下问题:

  • 不切实际的日程表,在团队还没确定工作内容的情况下,就确定了截止日期。

  • 不清晰的目标,并且缺乏项目需求。

  • 无效的沟通。

  • 糟糕或不称职的团队领导。

  • 定义糟糕的个人角色和职责——到底由谁来负责哪些事情呢。

  • 糟糕的个人态度和日程表。

  • 能力欠佳的团队成员。

  • 管理层不要把大家当做工程师,而是对待大家像对待奴仆一样。

  • 评价个人的标准与团队的目标不相符。

  • 团队成员快速流动。

  • 管理过程一成不变。

  • 缺少培训或指导。



  • 优秀的程序员:1. 对自己编写的代码没有领土意识;2. 只要对软件系统有好处,就愿意执行任何开发任务;3. 为团队贡献的同事,自己也在不断的学习和成长,他们有自己的目标,但不会牺牲团队的利益;4. 擅长沟通,经常听取其他团队成员的意见;4. 谦虚,为团队效力,尊重并珍惜其他团队成员。
  • 糟糕的程序员:1. 试图建立代码王国,并使自己称为无价之宝;2. 想做自己的事情,并需求最优魅力的任务;3. 按照自己的日程表工作,而以牺牲团队的效率为代价;4. 总想坚持他们的个人意见;5. 认为团队是为他们服务而存在的,而且他们是最棒的团队成员——是上天赐予的这个编码团队的礼物。
posted @ 2008-11-16 21:20  李潘  阅读(378)  评论(0编辑  收藏  举报