程序员从拿到一个需求到这个需求上线,除了写代码还有没有其他必须要做的事情?
初出茅庐的程序员
提交代码才是王道,被扯那些虚头八脑的玩意。
我们已经采取敏捷开发模式了,还需要项目管理?
我就开发一个普通的需求,一个星期就能写完代码,需要了解项目管理的知识吗?
计划赶不上变化,还计划个啥,干了再说。
从业三年的程序员
PD要我做个需求排期,就改几行代码的事情,为什么我总是评估时间少了,搞点buffer又被挑战,时间都去哪了?
为什么每天都有那么多杂事骚扰我,就不能让我专心写代码吗?
完蛋了,提测后才发现有个关联系统忘记改。
每到上线就通宵,需求总是无法按期上线,前面都干嘛去了?
关联系统接口总是调不通,有心无力。
中高级软件工程师开始独立承担一些功能点的开发,在没有任何项目管理知识时,通常会成为“五拍”程序员。
虽然我们日常功能开发并不需要使用完整的项目管理工具,但需求上线流程依然离不开项目管理的本质。一个独立的需求开发任务就是一个微缩版的项目计划,一样会包含项目管理的过程和要素。
项目管理的四个重要的方面,即:范围(需要做什么事)、时间(什么时间做完这些事)、成本(花多少钱做成这些事)、质量(这些事做到什么程度客户才满意)。
专门立项的项目通常有项目工作说明书(Statement of Work,SOW),定位项目范围。日常开发任务范围通常由产品需求文档(Product Requirements Document,PRD)决定。没有明确的PRD就无法分析需求上线到底要如何实现业务需求,更加无法评估到底有多少工作量。
PRD并不完全等于开发任务,原因:
需求排期评估工作量时,需要对PRD进行分析后再做任务拆解,才能相对准确的评估工期。
不管是瀑布式开发模式还是敏捷开发模式,软件开发都包含以下任务,差别只是任务的并行情况和任务的轻重。所以拿到需求以后第一个计划评估时可以直接按以下任务做第一步的任务分解和评估。
新手程序员做需求排期最常犯的一个错误是只评估了编码开发的时间,其他分析、联调时间统统没有预估。导致需求上线投入时间与计划严重偏差。
开发任务是逐步细化和完善的,接到需求后,第一步按软件研发生命周期完成任务拆分,对需求做一个大致的计划安排。在需求分析和详细设计过程中会进一步丰富和完善开发任务。
如果需求分析和详细设计完成质量较高,详细评审后通常开发任务和测试任务就已经非常明确,任务分解告一段落,基本不会产生太大的偏差。
大型软件特别是历史遗留系统,通常会发生只改几行代码,但分析定位要在哪里改代码需要花一两天的情况。这时详细设计就显得非常重要,并且在需求排期时需要预留详细设计的时间,否则经常会出现提测后甚至上线后才发现改漏了,项目基本无法按计划上线。
PS:
如果这个情况在某个项目中是个普遍现象,一般意味着这个项目坑非常的深。
形成这个问题的原因一般如下:
- 架构不合理,没有做到高内聚,低耦合。
- 核心开发人员不足,没有熟悉这一套代码的中高级软件工程师。
- 技术债太重,经手N代程序员,每代程序员都在填别人的坑,然后给后人挖坑。
ԅ(¯﹃¯ԅ)
赶紧找领导要求做新系统吧。
即使是一个人自己独立完成的开发需求,也需要做基本的资源评估,也许这个评估只是花几分钟想一下自己手头还有哪些工作,近期每天能够投入几个小时到这个需求,这个基本能够知道这个需求自己大概可以什么时候完成提测。
而稍微大一点的需求,需要多人合作开发,这是就需要评估任务可以拆给多少人,这些人是否有时间。在涉及关联系统配合改造时,尤其要评估关联系统是否有时间配合开发。这个时候一定要做好充分的事前沟通,得到资源确认后才能够真正做需求排期,否则指定的计划没有可执行性,无法按期完成。
简单需求一般知道改什么后上手就开始撸代码了,但稍微复杂一点的需求涉及多个开发任务就需要对开发任务定一个优先级,确定各任务之间的依赖关系,评估每个任务的工期,发现关键任务,评估需求整体工期。
传统项目管理和敏捷研发流程在制定项目计划时会有些差异:
传统项目管理在制定项目计划时,会事先明确每个任务的开始时间,结束时间,资源依赖,任务依赖,每个任务按计划执行。而敏捷研发通常是一个任务做完再从任务池中领取下一个任务,所以事先不需要明确每个项目的开始时间和结束时间。但这样的方式通常无法面对需要高度协同的开发任务,比如大功能点无法拆分拆分提测上线,必须在一个版本由多个开发人员开发的需求;再有上下有接口联调依赖,需要关联系统排期的需求。这种情况下需要对这样的关键任务做明确的排期计划,而将一些离散的小功能需求作为buffer放在空闲时间点开发。
制定项目进度计划的技术和工具,其中一项是关键路径法(CPM).对于一个项目而言,只有项目网络中最长的或耗时最多的活动完成之后,项目才能结束,这条最长的活动路线就叫关键路径(Critical Path),组成关键路径的活动称为关键活动。其通常做法是:
1) 将项目中的各项活动视为有一个时间属性的结点,从项目起点到终点进行排列;
2) 用有方向的线段标出各结点的紧前活动和紧后活动的关系,使之成为一个有方向的网络图;
3) 用正推法和逆推法计算出各个活动的最早开始时间,最晚开始时间,最早完工时间和最迟完工时间,并计算出各个活动的时差;
4) 找出所有时差为零或者为负数的活动所组成的路线,即为关键路径;
5) 识别出准关键路径,为网络优化提供约束条件;
编码开发是程序员在项目中最熟悉也是最喜欢的步骤。实际上需求分析、详细设计、测试支持、部署上线等等都属于项目执行的范畴。在任务执行过程中会循环迭代更新任务计划。为了观察开发阶段项目执行效果,我们可以从提测阶段反推需求分析、详细设计、编码开发阶段执行需要注意的问题。
当需求进入提测阶段后,原则上需求不应该再投入开发资源,开发人员应该开始分析开发新的需求。但在实际项目执行过程中,功能提测后开发人员通常无法立即开始新需求开发。如果功能提测后开发人员大量时间投入到测试环境支持,通常说明项目存在极大质量风险,测试周期可能会很长。这其中有客观原因,也有项目执行不到位的原因:
冒烟不通过一般有以下原因:
环境问题和配置问题统一都是部署发布问题,严谨的部署说明以及严格的部署流程完全可以规避掉这些问题。
冒烟阶段发现的代码问题是极为恶劣的开发质量问题,反应了相关开发人员完全没有质量意识,也反应了相关需求负责人在开发阶段任务跟进上存在较大的问题。
开发阶段最有成就感的是写完了需求实现代码。但coding只占日常业务开发工作的一小部分,实际我们需要做更多其他事情:
新手程序员在项目执行过程经常犯的错误是只顾埋头干活,没有抬头看路。具体包括
温故而知新,可以为师矣。
普通程序员需求开完就完了,优秀的程序员会对刚刚做完的需求做一个复盘。做得好的给朋友传授一下经验,做得不好的找别人学习一下经验。
软件项目常见名词