重读《人月神话》(8)-为什么巴比伦塔会失败?(Why Did the Tower of Babel Fail?)
据《创世纪》记载,巴比伦塔是人类继诺亚方舟之后的第二大工程壮举,但巴比伦塔同时也是第一个彻底失败的工程。
巴比伦塔的管理教训
这个项目具备了几乎所有成功的先决条件:
-
有清晰的目标,尽管目标理想化到了近乎不可实现的地步;
-
人力资源非常充足;
-
材料资源丰富,如美索不达米亚地区的泥土和柏油沥青;
-
时间上也没有明显的限制;
-
技术方面同样不成问题,金字塔和锥形结构本身具备良好的稳定性,能够有效分散压力,砖石建筑技术经过了深入研究。
然而,项目在触及这些基本限制之前就已经宣告失败。
究其原因,项目欠缺的是两个至关重要的因素:有效的沟通与合理的组织。缺乏沟通意味着无法有效地协作,一旦合作受阻,工程便停滞不前。从历史记载中可以推断,沟通不足导致了大量的争论、沮丧情绪以及集体间的猜疑。很快,原本团结的部落开始分化,成员们宁愿选择孤立也不愿意继续无休止的争执。
大型编程项目中的交流
如今,类似的问题依然存在。由于团队内部缺乏有效的沟通,导致了进度延误、功能不合理和系统缺陷频出。各个小组在工作中逐渐调整了自己的程序功能、规模和速度,这些调整或明或暗地改变了输入输出约定。
例如,负责程序覆盖功能的团队发现该功能使用率低,于是降低了其执行速度。然而,这一变动直接影响到了正在设计依赖该功能的监控程序的其他同事。因此,这类变更需要从系统整体的角度来评估,并且应该公开透明地发布变更信息。
团队应如何加强彼此间的沟通?需通过一切可能的渠道进行:会议、电话、工作手册等。现如今我们有了更方便的文字处理和文档协作工具,但保持文档的更新和有效获取仍然很重要。
项目工作手册
项目工作手册并非单一文档,而是对一系列必需产出的文档进行组织的结构,涵盖了目的、外部规格说明、接口说明、技术标准、内部说明和管理备忘录等内容。良好的文档结构不仅便于追踪设计思路,还有助于未来产品的文档编制。合理设计工作手册,确保文档有序且信息更新及时,便于检索。
项目工作手册的另一个重要作用在于控制信息发布,确保信息准确传达至需要的人手中。通过编号备忘录和树状索引结构,可以提高信息检索效率。随着项目规模的扩大,文档管理难度呈指数级上升。采用活页夹和计算机编辑系统可以帮助实时更新文档,通过标记变更内容和附带变更摘要来减少理解障碍。
当文档量庞大时,使用微缩胶片可以有效减少存储空间,并简化归档工作。然而,微缩胶片不便标注与批注,作为补充手段较为合适。现代技术中,直接访问文件并记录修订日期和变更标识是可行的选择,用户可通过显示终端查阅更新,维护变更小结以便随时查看。
工作手册的本质并未改变,仍是项目文档的集合,但分发机制和查询方法的改进有助于提升工作效率。精确完整的接口定义能进一步优化文档管理,有助于预防和纠正接口错误。
大型编程项目的组织架构
团队组织的目的是减少不必要交流和合作的数量,因此良好的团队组织是解决上述交流问题的关键措施。如果项目有 n 个工作人员,则有(n^2 - n)/ 2 个相互交流的口子,有将近 2^n个必须合作的潜在团队。
减少沟通障碍的方法是通过人力分工和职能专业化。当实行分工和职能专业化时,树状管理结构所需的详细沟通就会减少。实际上,树状结构反映了权力和责任的分配,但沟通结构更加网状,不受此限制。
考虑一个树状编程团队及其有效运作所需的要素:
-
任务;
-
产品负责人;
-
技术主管或架构师;
-
时间表;
-
人力分工;
-
接口定义。
其中,产品负责人和技术主管的角色尤其重要。产品负责人负责团队构建、资源配置和进度管理,主要与外部沟通;技术主管则专注于设计和技术问题解决,确保设计的一致性和完整性,主要在团队内部沟通。
这两种角色需要不同的技能组合。在小型团队中,一人身兼多职较为常见,但在大型项目中,这几乎不可能实现,因为同时具备管理和技术能力的人才稀缺,且每个角色都需要全职投入。
另一种模式是产品负责人作为领导者,技术主管作为助手。此模式要求产品负责人支持技术主管的技术决策,并在团队中建立技术主管的权威。第三种模式是技术主管作为领导者,产品负责人作为助手,这种模式在大型项目中较为有效。
巴比伦塔可能是最早的工程失败案例之一,但它不是最后一个。沟通和由此产生的组织是成功的关键,管理者必须重视沟通和组织技能的培养,正如重视软件技术的发展一样。
相关文章:
重读《人月神话》(8)-为什么巴比伦塔会失败?(Why Did the Tower of Babel Fail?)
据《创世纪》记载,巴比伦塔是人类继诺亚方舟之后的第二大工程壮举,但巴比伦塔同时也是第一个彻底失败的工程。 巴比伦塔的管理教训 这个项目具备了几乎所有成功的先决条件: 有清晰的目标,尽管目标理想化到了近乎不可实现的地步&…...
STL源码剖析:Hashtable
hashtable 概述 哈希表是一种数据结构,它提供了快速的数据插入、删除和查找功能。它通过使用哈希函数将键(key)映射到表中的一个位置来实现这一点,这个位置称为哈希值或索引。哈希表使得这些操作的平均时间复杂度为常数时间&…...
spring-boot学习(2)
上次学习截止到拦截器 1.构建RESfun服务 PathVariable通过url路径获取url传递过来的信息 2.MyBatisPlus 第三行的mydb要改为自己的数据库名 第四,五行的账号密码改成自己的 MaooerScan告诉项目自己的这个MyBatisPlus是使用在哪里的,包名 实体类的定义…...
《案例》—— OpenCV 实现2B铅笔填涂的答题卡答案识别
文章目录 一、案例介绍二、代码解析 一、案例介绍 下面是一张使用2B铅笔填涂选项后的答题卡 使用OpenCV 中的各种方法进行真确答案识别,最终将正确填涂的答案用绿色圈出,错误的答案不圈出,用红色圈出错误题目的正确答案最终统计正确的题目数…...
新员工入职流程指南_完整入职流程解析
文章介绍了新员工入职流程的重要性、步骤及持续时间,并推荐ZohoPeople软件自动化管理入职流程,提升新员工入职体验,减少离职率,确保合规性,提升公司品牌形象。 一、新员工入职流程是怎样的? 入职流程是指一…...
mysql查看和修改默认配置
1.查看最大连接数 SELECT max_connections; 或者 SHOW VARIABLES LIKE max_connections;2.查看当前连接的客户端 SHOW PROCESSLIST;2.临时设置最大连接数 SET GLOBAL max_connections 500;3.临时设置连接客户端交互超时时间 SET GLOBAL interactive_timeout 1800;4.永久生…...
海外云手机:出海电商养号智能化方案
随着出海电商的迅猛发展,使用海外云手机进行养号已经成为越来越多商家的新选择。尤其在社交电商推广和短视频引流方面,海外云手机不仅提高了流量的精准度,还助力商家实现业务的快速增长。本文将探讨海外云手机养号相较于传统模式的优势&#…...
OpenAI Canvas用户反馈:并不如外界传言般“炸裂”,更不是“AGI的终极交互形态” | LeetTalk Daily...
“LeetTalk Daily”,每日科技前沿,由LeetTools AI精心筛选,为您带来最新鲜、最具洞察力的科技新闻。 Canvas作为一个独立的界面,通过与ChatGPT的结合来提升用户的协作能力和创作效率。尽管用户对其独立性与现有工具的整合存在不同…...
RiproV9.0主题wordpress主题免扩展可二开PJ版/WordPress博客主题Ripro全解密无后门版本
🔥🎉 全新RiPro9.0开源版发布 —— 探索无限可能🚀🌐 今天,我很高兴能与大家分享一个重磅资源——RiPro9.0开源版!这不是一个普通的版本,而是一个经过精心打磨、全面解密的力作。🔍…...
[LeetCode] 515. 在每个树行中找最大值
题目描述: 给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。 示例1: 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2: 输入: root [1,2,3] 输出: [1,3]提示: 二叉树的节点个数的范围是 [0,10…...
【分布式微服务云原生】《微服务架构大揭秘:流行框架与服务治理攻略》
标题:《微服务架构大揭秘:流行框架与服务治理攻略》 摘要:本文深入探讨了流行的微服务架构框架,包括 Spring Cloud、Docker Kubernetes、Dubbo、Service Mesh 和 Serverless 架构,详细介绍了它们的关键组件和服务治理…...
uniapp uni.uploadFile errMsg: “uploadFile:fail
uniapp 上传后一直显示加载中 1.检查前后端上传有无问题 2.检查失败信息 await uni.uploadFile({url,filePath,name,formData,header,timeout: 30000000, // 自定义上传超时时间fail: async function(err) {$util.hideAll()// 失败// err 返回 {errMsg: "uploadFile:fai…...
一个常见问题:TCP和UDP是否可以使用一个端口
TCP(传输控制协议)和UDP(用户数据报协议)做为两种被广泛使用的协议,它们在处理数据时采用不同的机制,那么有一个问题,在同一系统内,TCP和UDP的服务是否可以使用同一个端口呢…...
前端报错:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序(node_modules下载不下来)
原因:Vue CLI 没有被正确安装,或者其安装路径没有被添加到你的系统环境变量中。 一、确认 Vue CLI 是否已安装: 打开命令行工具(例如 CMD、PowerShell、Terminal),输入以下命令来检查 Vue CLI 是否已安装…...
白日门【鬼服无限刀】win服务端+安卓客户端+教程+GM后台
演示系统:Windows Server 2012 -------------------------------------------------------------------------------------------------------------------------- 把服务端上传解压缩到服务器D盘根目录:D:\【解压完成后检查路径是否正确:D:\】 安装基础运行环境&…...
如何迅速的了解一个人
目录 社会经济背景 生活满意度 爱心和同情心 如果你想迅速地了解一个人,问他问题是最快捷的方法。不论你是相亲、工作、而试、看医生还是为孩子找个学校,事先设计好你想提出的问题,想好你究竟要搜罗对方哪一方面的信息这样做会实现许多目…...
Window和Linux远程调度kettle
在windows和linux分别安装kettle,我的是pdi-ce-8.2.0.0-342版本,在windows中配置好之后,直接放到虚拟机的目录下 在cmd窗口中到kettle根目录下执行 (carte ip 端口 ),出现如下提示即启动成功 在远程端…...
设定义结构变量
在C语言中,可以使用struct关键字来定义结构变量。结构变量是由多个不同类型的成员变量组成的数据类型,可以在一个变量中存储多个相关的数据。 定义结构变量的语法如下: struct 结构名 {数据类型 成员1;数据类型 成员2;... };例如࿰…...
SSD |(七)FTL详解(中)
文章目录 📚垃圾回收🐇垃圾回收原理🐇写放大🐇垃圾回收实现🐇垃圾回收时机 📚解除映射关系📚磨损均衡 📚垃圾回收 🐇垃圾回收原理 ✋设定一个迷你SSD空间: 假…...
Swift 协议:深入解析与高级应用
Swift 协议:深入解析与高级应用 Swift 协议是 Swift 编程语言中的一项核心特性,它提供了一种定义接口和实现多态的强大方式。本文将深入探讨 Swift 协议的概念、用法和高级应用,帮助读者更好地理解和运用这一特性。 什么是 Swift 协议&…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
