对软件开发流程的一些思考
本周通过对开发管理的学习和思考,反思了在以往的开发流程中存在的问题和不足,我把整个开发流程分解成了四个部分,分别是需求处理、目标拆解、时间预估、进度把控,并依次分析了各个部分中存在的问题。
1 需求处理
在软件开发的过程中我们会遇到各种各样的需求,这些需求有来源于产品经理的、客服人员的、运营人员的,甚至是直接来源于用户的,同时这些需求的信息载体和表达方式同样也各种各样,而这些原始的需求表达并不能直接用于技术开发,因此必须对这些需求进行统一的处理,使其转化成可执行的任务,在此过程中有两方面需要特别注意:1 需求识别 2优先级排列。
1.1 需求识别
需求识别包含识别需求的真正主体和识别需求的应用场景,需求的传播路径有可能是十分复杂的,作为技术人员如果只站在自身的角度上思考需求,没有向上溯源发现需求的真正主体,必然导致大量的无用功,其次,抛开应用场景单纯的讨论需求本身也是没有价值的,必须结合需求主体和应用场景思考需求的本质和逻辑。
1.2 优先级排列
凡事必有轻重缓急,需求亦是如此,因此需要从重要程度和紧急程度两个维度上对需求进行划分,同时,针对某一个具体需求的软件开发过程越紧密越流畅效率越好,如果在多个需求之间频繁切换,总体的效率必然是下降的,因此也需要在需求优先级和开发效率之间找到平衡点,找到最为适合的开发节奏。
2 目标拆解
凡事预则立不预则废,没有拆解的目标大多数都没法完成,就如同行军打仗一样,如果连行军地图都没有结果必然失败,在进行目标拆解的时候我认为至少有两个纬度:1 空间纬度2 时间纬度。
2.1空间纬度
从空间纬度上的拆分我认为包含两个方面,其一是对开发的问题域的拆分,例如,某一个需求可以被拆分成几条流程线,而每一条流程线又能被拆分成几个功能点,最终能够把需求本身拆分成一个树状图,其二是人和任务之间的匹配,需要对每一个人的优缺点进行分析,寻找每个人工作效率最高的擅长领域,并以此为基准对开发任务进行拆分,让正确的人做正确的事,提升总体的开发效率。
2.2时间纬度
从时间维度上对任务进行拆分最重要的是需要识别任务和任务之间的相互关系,是串行的?还是并行的?开发流程的并行性越高效率越高,反之越低,同时,在时间维度上对任务进行合理的拆分也会有效的降低每个人在开发周期内负载的剧烈波动,也就是说可以避免有时累死有时闲死这样的情况发生。
3 时间预估
“结果”这个词的本意是:在一定的时间和空间范围内,事物发展的最终状态。因此对时间的把控本身就是结果导向主义的重要组成部分,软件开发管理最容易出现问题,最容易失控的也是时间预估,软件开发的特殊性导致其在时间预估上也越加复杂多变,目前我认为应该将所有的开发任务分成两大类:1 陌生任务 2 常规任务,对待不同的开发任务有不同的时间预估方案。
3.1陌生任务
陌生任务是指以前没有实现过,解决方案不成熟,实现路径模糊的任务,这类任务往往由于“坑”比较多导致时间预估失败,因此对于陌生任务需要从三方面入手:1 在允许的范围之内为试错预留充足的时间 2 找出任务实现中的难点和盲区并提前进行技术储备和方案制定 3 梳理流程,加强复盘,总结文档,让复杂的东西简单化,让陌生任务成为常规任务。
3.2常规任务
常规任务是指那些实现过多次,解决方案成熟,实现路径清晰的任务,这类任务时间预估往往比较准确,因此,对于常规任务来说最重要的是不断地细化标准,优化流程,实现简单的东西流程化,直至达到流程的东西自动化。
4 进度管控
进度管控我认为可以分为两个方面,一个是进度追踪,一个是进度调整,进度追踪的目的在于时刻了解当前的开发进度,其中可以细化成某个功能点的开发进度,某个人的开发进度,某一天的开发进度,并且以此自底向上汇集出整个开发流程的开发进度,进度调整则是基于当前的开发进度并综合当前的时间、人力、物力等种种资源对下一步的规划方案进行调整,这就像一个在荒野徒步的人,他不仅随时随刻要知道自己身处在荒野的哪个位置,还必须综合自己所有的可用资源制定下一步的方向和规划,如若像一只无头苍蝇一样乱跑乱撞必然会死在荒野中。