最近看到 《构建之法》的“8.6 计划和估计”这一节,颇多感触。这些年来,不同的阶段,对项目计划都有不同的认识和掌握。

邹老师提到了制定计划的几个概念:目标、估计和决心。

  • 目标:表明一个希望达到的状态。例如,软件“五一”之前要投放市场!在建校一百周年之时把我校建成世界一流大学!不论这类目标如何重要,它们未必能够实现。
  • 估计:以当前了解的情况和掌握的资源,要花费多少人力物力时间才能实现某事。
  • 决心:保证在某个时间之前完成预先规定的功能和质量。例如:我们跑步前进,全民炼钢,两年超英赶美!

大二的暑假的时候,从学校BBS上接了个私活,帮人做个办公OA系统,第一次独立的去做项目,雇主给了我一个别人的办公系统,让我模仿着做一个,功能界面样式都一样,给了一个月的时间,结果就是我最后一周连续在机房熬了好多天通宵,在时间点之前赶出来了。现在回头来看,这其实只有目标和决心,而没有任何估计,如果目标再大一点,如果不是年轻的时候身体好能熬夜,是不太可能完成的。

但就算有估计,也不代表就能制定合理的计划。毕业后刚参加工作,在一个项目中,项目经理给我分配了一个比较复杂的功能,让我估计一下时间,我乐观的估计了一下,觉得三星期就能搞定,项目经理不放心,给我按一个月时间算上了,结果由于我急于在项目中应用一些不熟悉的新酷技术,沉迷于技术细节中,导致一个月时间到了还是没能按时完成,导致整体项目延误,最后项目经理挨了批评。

类似的错误我不止犯过一次,也看到很多程序员犯过类似的错误:过于沉迷技术,忽视进度,导致计划不能按期执行,所以后面我尝试作出了一些改变:

  • 对于不熟悉不成熟的技术,尽可能不要应用到项目中,利用项目之外的时间去学习试验,验证后再应用。
  • 将项目计划细化,不能说一个功能模块一周,争取把计划的力度细化到天,这样能及早的发现问题。
  • 设置关键的时间点,在这个时间点的时候,需要交付一定的东西出来,这样就逼着自己不敢在某一个细节上浪费太多时间。

后来在自己开始去做项目管理的时候,在做项目计划的时候相对有了经验,其实自我管理是最难的,管理别人要相对容易得多。但即使如此,在做项目计划时也遇到很多问题。

遇到的第一个问题就是如何做团队的项目计划,以前自己给自己做计划,相对容易,但如果整个项目的计划要一起做就比较麻烦了,每个人的能力水平不一样,预估项目的乐观程度不一样,要协调起来可不容易。

最开始的时候,我尝试按照自己写代码的经验来给大家分配任务和定计划,比如说这个用户注册模块我觉得我需要三天,给张三做,张三经验不如我丰富,那么张三应该四天能搞定,给他四天时间。这样计划是很快做出来了,但是问题马上来了:

  • 首先是准确度不高,误差比较大,每个人实际上在做的过程中都会遇到各种各样的问题,比如前面提到的让张三四天完成注册模块,可能他以前没做过,而且正好环境不熟悉,那么可能四天根本完不成。还有可能是他直接用一些现有第三方模块,一两天就完成了这个功能。
  • 然后是当发生计划不准确的时候,项目成员会有情绪。比如注册模块让张三四天完成,结果功能比预计要复杂,导致张三加班加点才勉强完成,张三就会想,这个功能我当时就觉得四天不够,你只给四天,这不是故意为难我吗?

于是尝试做出调整,对功能模块进行划分和分工后,让团队成员自己去预估时间,在实行一段时间后,大家积极性是提高了,自己定的计划,含着泪也要按时完成,但又有新的问题:

  • 以前计划都是项目经理一手包办,而现在需要自己去制定计划,很多人在定计划的时候才去了解项目需求,在需求不了解的情况下做出的计划不靠谱
  • 有的人的计划过于乐观,完全没有预估到项目的复杂性,导致最后项目计划难以完成;有的人比较偷懒,定的计划总是很松散。

显然项目经理想当甩手掌柜是不现实的,所以后来在定项目计划的时候,我一般会分成以下几步:

  1. 第一步,在目标(项目需求)明确后,开始预估项目计划,这时候精确度不需要太高,精确到周为单位即可。
  2. 第二步,对项目需求和团队成员进行同步,确保项目成员充分理解项目需求,将任务分配下去后,让项目成员自行评估各自项目计划
  3. 第三步,对项目成员的计划进行一一核查,参照第一步预估的时间,对过于乐观的和过于宽松的,都要一起把计划细化,细节仔细推敲探讨,确保计划科学合理
  4. 第四步,完成最终计划,并确定几个关键里程碑,确保在里程碑的时候能交付一定的内容

这样下来,制定的计划相对要合理多了,保持进度的跟踪,尤其是里程碑时间点的把握,基本上不会有太大的问题。

但项目计划还是很容易受到外部影响的。在《构建之法》里面提到了软件项目的时间估计可以从两个方面来看:

  1. 自底向上。团队成员各自估计底层模块和单个功能(及单元测试)所需的时间,再加上集成及基本测试的时间,就是大概的开发时间。这还没有考虑各个模块之间的相互依赖性。
  2. 回溯。团队从整个项目最终交付之日往回倒推。

很不幸,我见过的绝大多数项目都是采用的回溯法来制定计划的,比如客户说,这个功能我下个月必须上线;比如就算你按照自底向上制定好的2个月项目计划汇报给老板说,老板说2个月太长了,希望1个月就能看到。

这个问题其实在软件工程中是个非常典型的问题,有的比较滑头的项目经理会在上报给老板的进度加个比较大的Buffer,例如本来两个月可以做完的,报上去是三个月,那么老板压一压,还有两个月时间,这不是皆大欢喜了!不过这毕竟只是“术”,玩多了被揭穿了以后就没得玩了。

那么什么是“道”呢?在构建之法中有一张“功能/资源/时间的平衡图”,非常形象的说明了这几个项目要素的关系。

项目管理也是一种平衡之道,现在在资源不变,时间缩短的情况下,要么去牺牲功能,要么去牺牲质量。一般在这种情况下,如果不是一次性产品,我通常会选择牺牲功能,质量上欠的债终究是要加倍还的,功能可以通过版本的迭代来完善。

除了被缩短时间导致计划更改,还有个计划更改的重要因素是来自需求的变更!据说因为需求老变,产品经理或老板被程序员砍的例子不少!其实需求的变更在软件项目开发里面是常态,没必要太过抵触,但是需要科学的去管理。一般来讲,如果项目的周期越长,需求变更带来的影响越大!所以现在一般互联网的项目,都比较追求功能精简,快速上线,上线后持续迭代。

在遇到一些影响项目计划的问题时,我一般处理原则如下:

  1. 对于需要缩短计划时间的,根据情况减少一些功能或牺牲质量,并承担相应的后果
  2. 对于需求变更的,评估是否对整体进度有较大影响:
  • 如果影响不大,则不改变整体项目计划,只做局部调整
  • 如果影响较大,则对重新制定整体项目计划,走相应的需求变更流程

同时,为了能及时相应需求的变更,需要对每一期项目功能进行合理筛选,合理搭配核心功能和外围功能,让项目周期在一个相对可控范围。

项目计划是项目管理中非常重要的一环,不计划无管理。不同的项目不同的团队,项目计划的方式也各有不同,不过万变不离其宗,根本还是在于对软件工程构建之法的掌握和运用。

《构建之法》读后感之项目计划相关推荐

  1. 【week2】 构建之法 读后感及问题

    上一次读后感涵盖前五章的内容包括个人技术,结对合作,小组项目等.本周作业的燃尽图以及站立会议是关于<构建之法>第六章的内容,所以关于这一章的读后感涵盖在上两篇博客中. 第七章 MSF 介绍 ...

  2. 软工实践(二)——构建之法读后感

    一.前情提要 在完成软工实践第一次作业之后,老师在我的博客中评论布置了一个任务,用一周的时间通读构建之法,然后提十个问题.本来我还担心这本书会不会很枯燥,能不能按时间看完,没想到这本书看起来妙趣横生, ...

  3. 构建之法读后感part6

    这个星期看完了构建之法的第六章,看了第六章之后了解到敏捷开发以用户的需求进化为核心,采用迭代.循序渐进的方法进行软件开发.在敏捷 开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测 ...

  4. 0320 关于构建之法前三章的读后感

    0320 关于构建之法前三章的读后感 构建之法前三章读后感 读完了第一章后,开始对于软件工程的重要性有了一些必要的认识了.何为软件工程,这个问题一直在我的心头萦绕,做软件无非就是把代码写出来,将分支语 ...

  5. 《构建之法》读后感5

    软件工程涉及的范围很广,对于即将投身IT业的学生而言,软件工程的内容又非常重要.读构建之法,尽管本书介绍了不少IT业正在使用的理论和技术,但是,这本书的主要思想并不是介绍所有的新思想和新技术,而是从这 ...

  6. 构建之法:1、2、3章阅读后感

    第一章 第一章中主要说的是软件工程的一些概论.阅读完<构建之法>的第一章,初步了解了开发软件的大致过阶段,了解了软件工程的特性,明确了开发软件的目标.在这章节中,解析了软件工程的概念,从实 ...

  7. 《构建之法》第4章读后感

    代码规范: 我们写的代码不仅是给我们自己看,也是给其他人看.看代码本来就是比较一个枯燥的过程,如果你的代码格式乱七八糟,命名不规范,那么别人也不会想看你写的代码,即使看了也不懂你的代码是想表达什么,而 ...

  8. 《构建之法》 读后感 —— there is no silver bullet

    接触到<构建之法>是因为我在找两个答案,怎么规范一个软件开发的流程,以及怎么去管理一个技术团队完成软件开发中的一环.带着这两个问题,我开始拜读邹老师的构建之法.(开始 2017.2.16 ...

  9. 《构建之法》第4.17章读书笔记

    <构建之法>第4.17章读书笔记 第四章 原文语句: 异常不能跨过DLL或进程的边界来传递信息,所以异常不是万能的. 提出问题: 1.什么是DLL?DLL是来解决什么问题的? 网上说法: ...

最新文章

  1. Mysql高级调优篇——第三章:Sql实战调优场景剖析(上)
  2. Mysql ID重新排列
  3. 排列与组合的一些定理(二)
  4. windows10上运行linux,在Windows 10上原生运行Linux
  5. ORA-19809: limit exceeded for recovery files问题解决
  6. Mysql ORDER BY用法的一点理解
  7. kettle将excel导入数据库_Kettle从excel导入数据到sql server
  8. ProGuard详解 - Java代码混淆
  9. 记忆术: 记数字 (110数字图像编码)
  10. VTP技术及相关配置
  11. word制作多级标题目录
  12. Apache Calcite介绍
  13. 没有鸿蒙HarmonyOS,用这个软件也可以实现华为的多屏协助互动!
  14. CAD怎么设置十字光标大小?CAD十字光标设置
  15. c语言打铃器单片机程序,基于单片机的自动打铃器的设计
  16. 大数据平台技术——Scala+Hbase学习
  17. 反向迭代器---迭代器适配器
  18. python字典键盘添加元素_对python字典元素的添加与修改方法详解
  19. 【HNOI 2012】永无乡
  20. 工商管理专业知识与实务(初级)【4】

热门文章

  1. 历经8年双11流量洗礼,淘宝开放平台如何攻克技术难关?--转
  2. zookeeper源码分析之三客户端发送请求流程
  3. java 开源缓存框架--转载
  4. Lesson 16.4 卷积遇见深度学习
  5. 【反欺诈】互金欺诈与反欺诈
  6. Spring Cloud Alibaba - 18 Nacos Config配置中心加载相同微服务的不同环境下的通用配置
  7. Redis进阶-Redis缓存优化
  8. 白话Elasticsearch39-深入聚合数据分析之案例实战_搜索+聚合: 统计指定品牌下每个颜色的销量
  9. python 删除链表中倒数第N个节点
  10. 超简单-用协程简化你的网络请求吧,兼容你的老项目和旧的网络请求方式