软件项目管理–人月神话

软件的设计是降低熵的过程,而开发是增加熵的过程,任何决策都有后果。


增加人手不能加快进度

项目延期

项目延期的原因有很多,最大的原因可能是产品经理这个人不够熟练,亦或者是需求在变更

如果项目延期,那么增加人手或许并不能加快进度,新人加入项目里面,需要有熟悉项目的时间,熟悉项目就需要技术骨干去带新人,而技术骨干去带新人就会使技术骨干的工作时间减少,工作时间减少就容易去拖延项目的进度,一般这种时候就是工作流程出现了问题,出现工作流程的问题需要去对工作流程去做优化,或者就是增加工作时间,也就是加班,在很多情况下,加班比加人要靠谱

如果必须要加人,那么应该去指定一个老成员去当新人的导师,所谓老带新,避免一个集体的沟通成本,并且要让新人去负责一个相对来说比较独立的模块,让新成员去熟悉代码或者做一个独立的功能,这样新人也就能快速上手项目,并能够给项目带来一些贡献

人月的非线性

随着团队的人员增多,每个人负责的工作也就越少,而沟通成本却是指数级别上升,为了尽可能去避免沟通成本,那么最好的方法就是去解耦合,互相依赖越少越好,这也就要去做好并行和先后的管理,

小的开发团队能够保持一个小的沟通成本,超过规模的话需要分成小组,每个组只有四到六个人,让项目经理去进行协调,如果你们项目发生延期,如果你们软件发生延期而甲方又没有需求变化的话,大概率是一个事情,那就是项目经理是个废物

团队沟通协调

团队之间的沟通成本是指数级增长的,对于n名成员的团队他们的团队沟通路径是$n^2. -n /. 2$

每天需要开一个短会,不要超过十五分钟,同步一下项目的进度和困难。

需要文件化的沟通,任务需求,沟通,需要有v文档,减少口头沟通引发的的歧义

敏捷开发的时候,赶紧把能做的需求做出来,之后慢慢改,

结构化与阶段化

把项目拆成具体的方案,今天做什么,明天做什么,每个阶段都需要设定目标,和可交付的成果,每个阶段需要有可交付的成果。如何check这个阶段完成了,我妈需要一个需求文档去交付,去查看需求文档和软件满不满足需求,满足的话这个阶段的需求就结束了。

每个阶段的需求做完以后要去回顾一下,查看是否有遗漏。

概念完整性

需要有一个首席架构师,指派一个主设计者负责全局设计,其他人员提供支持,避免设计风格和实现逻辑的分散化,确保所有代码遵循一致性原则,命名规范和模块化划分,平衡功能性和一致性,如果功能扩展会破话整体设计,优先保留一致性

原型设计

原型设计是开发过程的一个探索阶段,用于严重核心功能的可行性。验证用户需求,原型通常需要快速迭代,允许出现错误,最终要为主系统的设计。

原型设计的目的是为了验证特定的问题,比如核心算法,用户界面

不可能的银弹

软件开发中不存在一种通用的方法或者工具能够显著的提高生产力 ,或者解决所有问题,软件的进步来源于对需求的管理 ,技术工具和团队协作的一个综合优化,而非单一技术团队协作很重要 ,即便是有一些不太熟练的程序员,有一个好的团队协作工具, 可能会比一群精英程序员要强得多。

敏捷开发 Devops

文档与知识管理

文档是开发时的核心工具,团队协作,知识传承都靠这个东西 ,需要制定一个模板的文档,需求文档,接口文档,用户文档,功能性非功能性,架构设计,接口定义,部署流程,终端操作说明,每一个东西都需要以文档的方式记录下来,在做项目的时候要记录文档

文档需要有一个文档负责人,在每次需求变更的时候去修改文档

文档需要一个版本号管理,并且公开出来确保每个人拿到唯一的一个