`

大型编程项目的组织架构

阅读更多
      如果项目有n个工作人员,则有(n2 - n)/ 2个相互交流的接口,有将近2n个必须合作的潜在团队。团队组织的目的是减少不必要交流和合作的数量,因此良好的团队组织是解决上述交流问题的关键措施。
      减少交流的方法是人力划分(division of labor)和限定职责范围(specialization of function)。当使用人力划分和职责限定时,树状管理结构所映出对详细交流的需要会相应减少。
      事实上,树状组织架构是作为权力和责任的结构出现。其基本原理——管理角色的非重复性——导致了管理结构是树状的。但是交流的结构并未限制得如此严格,树状结构几乎不能用来描述交流沟通,因为交流是通过网状结构进行的。在很多工程活动领域,树状模拟结构不能很精确地用于描述一般团队、特别工作组、委员会,甚至是矩阵结构组织。
让我们考虑一下树状编程队伍,以及要使它行之有效,每棵子树所必须具备的基本要素。它们是:
1. 任务(a mission)
2. 产品负责人(a producer)
3. 技术主管和结构师(a technical director or architect)
4. 进度(a schedule)
5. 人力的划分(a division of labor)
6. 各部分之间的接口定义(interface definitions among the parts)

      所有这些是非常明显和约定俗成的,除了产品负责人和技术主管之间有一些区别。我们先分析一下两个角色,然后再考虑它们之间的关系。
      产品负责人的角色是什么?他组建团队,划分工作及制订进度表。他要求,并一直要求必要的资源。这意味着他主要的工作是与团队外部,向上和水平地沟通。他建立团队内部的沟通和报告方式。最后,他确保进度目标的实现,根据环境的变化调整资源和团队的构架。
      那么技术主管的角色是什么?他对设计进行构思,识别系统的子部分,指明从外部看上去的样子,勾画它的内部结构。他提供整个设计的一致性和概念完整性;他控制系统的复杂程度。当某个技术问题出现时,他提供问题的解决方案,或者根据需要调整系统设计。用Al Capp所喜欢的一句谚语,他是“攻坚小组中的独行侠”(inside-man at the skunk works.)。他的沟通交流在团队中是首要的。他的工作几乎完全是技术性的。
现在可以看到,这两种角色所需要的技能是非常不同的。这些技能可以按不同的方式进行组合。产品负责人和技术主管所拥有的特殊技能可以用不同方式组合,组合结果控制和支配了他们之间的关系。团队的搭建必须根据参与的人员来组织,而不是将人员纯粹地按照理论进行安排。
      存在三种可能的关系,它们都在实践中得到了成功的应用。
产品负责人和技术主管是同一个人。这种方式非常容易应用在很小型的队伍中,可能是三个或六个开发人员。在大型的项目中则不容易得到应用。原因有两个:第一,同时具有管理技能和技术技能的人很难找到。思考者很少,实干家更少,思考者-实干家太少了。
第二,大型项目中,每个角色都必须全职工作,甚至还要加班。对负责人来说,很难在承担全部管理责任的同时,还能抽出时间进行技术工作。对技术主管来说,很难在保证设计的概念完整性,没有任何妥协的前提下,担任管理工作。
产品负责人作为总指挥,技术主管充当其左右手。这种方法有一些困难。很难在技术主管不参与任何管理工作的同时,建立在技术决策上的权威。
显然,产品负责人必须预先声明技术主管的技术权威,在即将出现的绝大部分测试用例中,他必须支持后者的技术决定。要达到这一点,产品责任人和技术主管必须在基本的技术理论上具有相似观点;他们必须在主要的技术问题出现之前,私下讨论它们;产品责任人必须对技术主管的技术才能表现出尊重。
      另外,还有一些技巧。例如,产品责任人可以通过一些微妙状态特征暗示来(如,办公室的大小、地毯、装修、复印机等等)体现技术主管的威信,尽管决策权力的源泉来自管理。
这种组合可以使工作很有效。不幸的是它很少被应用。不过,它至少有一个好处,即项目经理可以使用并不很擅长管理的技术天才来完成工作。
分享到:
评论

相关推荐

    人月神话.pdf.rar

    大型编程项目的组织架构 第8章 胸有成竹 第9章 削足适履 第10章 提纲挈领 第11章 未雨绸缪 第12章 干将莫邪 第13章 整体部分 第14章 祸起萧墙 第15章 另外一面 第16章 没有银弹 第17章 再论“没有银弹” 第18章 《人...

    毕业设计JAVA SMART系统-系统框架(源码+论文+使用说明)

    源代码全覆盖:提供完整的源代码,包括前端界面和后端逻辑处理,使学生能够理解每一行代码的作用,并学会如何组织和管理大型软件项目的代码结构。 使用说明详尽:附有详细的使用说明书,指导学生如何从零开始搭建...

    国科大 软件工程 期末复习题参考答案

    3. 基于计划-文档开发方法:是一种开发方法,强调计划和文档的重要性,通常用于大型项目。 4. DRY (Don’t Repeat Yourself) 无重复代码:是一种编程原则,强调避免重复代码,提高代码的可读性和可维护性。 5. MVC...

    征服大前端第二季(Node.js、Angular 4、Express 4、Keystone 4)

    众多新奇的概念、陌生的编程语言、复杂的项目架构使新手望而却步,这些正是本系列课程诞生的原因。 征服大前端系列课程第二季专注于前端工程师开发大型系统和混合模式移动应用开发,详细展示Angular和Ionic两款框架...

    spark介绍-蘑菇街.pdf

    RDD 是一个不可变的、分区组织的数据对象,可以通过各种操作(如 map、filter、groupBy、join 等)转换为另一个RDD。RDD 的数据来源可以是外部存储,如 HDFS,也可以动态生成。 Spark 的计算模型基于内存的调度和...

    本科软件工程方向(共27张PPT).pptx

    * 组织管理:软件工程师需要具备一定的组织管理能力,以便更好地管理项目和团队。 * 角色知识:软件工程师需要具备一定的角色知识,如项目经理、分析师、架构师等。 * 综合素质:软件工程师需要具备良好的综合素质,...

    2012版软件工程实验指导书.doc

    1.项目开发过程建议采用快速原型与增量开发相集合的模式,在基本明确需求的情况下建立系统整体原型供需求的讨论和确定,在需求和系统架构确定后,选取一个具有代表性或系统核心部分的子系统进行详细的设计开发。...

    Backbone.js应用程序开发 中文清晰完整版pdf

    微博:@TomXuTao),微软最有价值专家(MVP)、项目经理、软件架构师,擅长大型互联网产品的架构与设计,崇尚敏捷开发模式,熟悉设计模式、前端技术、以及各种开源产品,曾获MCP、MCSE、MCDBA、MCTS、MCITP、MCPD、...

    亮剑.NET深入体验与实战精要2

    此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习...

    亮剑.NET深入体验与实战精要3

    此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习...

    大数据开发工程师的岗位职责.docx

    3、具备良好的编程语言基础如:java/python/scala/c++/shell等 4、二本以上学历,计算机相关专业或者有相关培训经历者优先 5、 个人素质要求:目光长远、态度诚恳、岗位有稳定性,能够长期培养、具备很强的自学能力...

    我为何停止使用Spring

    Johannes一直在不遗余力地将敏捷原则应用到大型软件项目中,不过他真正感兴趣的是与全世界的程序员分享更多关于编程的有趣经验。目前,Johannes职于Exilesoft,担任首席科学家一职。近日,Johannes撰写了一篇关于他...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    在整个blog进行开发之前,要确定出整个项目的整体架构,包括系统的选型、运行环境的确定及系统结构设计。下面对这进行详细介绍。 在进行软件系统开发的最初环节,一般都需要进行系统的选型,即根据系统功能的实际...

    springCloud

    微服务架构 微服务(Microservices Architecture)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好...

    ASP.NET在线测评系统

    数据库管理系统选用SQL_server2000,SQL_server2000是Microsoft推出的高性能关系数据库管理系统,是Microsoft公司在大型数据库领域的最新版本和旗舰产品,也是Microsoft公司争夺电子商务领域最重要的核心部件市场...

    PHP和MySQL WEB开发(第4版)

    第13章 MySQL高级编程 13.1 LOAD DATA INFILE语句 13.2 存储引擎 13.3 事务 13.3.1 理解事务的定义 13.3.2 通过InnoDB使用事务 13.4 外键 13.5 存储过程 13.5.1 基本示例 13.5.2 局部变量 13.5.3 游标和控制结构 ...

    PHP和MySQL Web开发第4版pdf以及源码

    第13章 MySQL高级编程 13.1 LOAD DATA INFILE语句 13.2 存储引擎 13.3 事务 13.3.1 理解事务的定义 13.3.2 通过InnoDB使用事务 13.4 外键 13.5 存储过程 13.5.1 基本示例 13.5.2 局部变量 13.5.3 游标和...

    PHP和MySQL Web开发第4版

    第13章 MySQL高级编程 13.1 LOAD DATA INFILE语句 13.2 存储引擎 13.3 事务 13.3.1 理解事务的定义 13.3.2 通过InnoDB使用事务 13.4 外键 13.5 存储过程 13.5.1 基本示例 13.5.2 局部变量 13.5.3 游标和...

    lucasromerodb:生物

    嗨,我是卢克 :waving_hand: 我的真名叫Lucas ... 但是,我想将学习重点放在性能,软技能,项目架构和深层/核心语言行为上。 也许人工智能在未来。我在航空实验室 :red_heart: 目前在Aero工作。 与热情的人,开发人员

Global site tag (gtag.js) - Google Analytics