项目总延期?需求乱插队?程序员如何做好项目管理

  

  腾小云导读

  程序员对工作量评估不准确?日常临时问题打乱排期?怎么让大家对需求的理解一致?如何既保证开发效率又保证质量?项目管理是「把事情做对」的重要能力之一。知识型工作者包括程序员,在工作中都不知不觉中扮演着「非职业项目经理」的角色。具备项目管理能力,对程序员职业发展、个人生活都有重大价值。本文详细分析程序员如何进行进度管理、质量管理和风险管理。

  看目录

  1?为什么开发者需要懂项目管理

  1.1?项目管理是“通过别人做成事情”的能力

  1.2?项目管理能输出个人影响力

  1.3?项目管理对个人生活也有价值

  2?开发者在项目管理中会遇到哪些问题

  2.1 开发者的痛点

  2.2 怎么衡量项目管理的“好/坏”?

  2.3 开发者需要哪些能力

  3?开发者怎么做好项目管理

  3.1?如何做好进度管理

  3.2?如何做好质量管理

  3.3 如何做好风险管理

  4 总结

  本文由腾讯MoonWebTeam团队的赖文辉、蔡卓伦、刘冬、陈长吉协作完成

  01

  为什么开发者需要懂项目管理

  “动机”有时比“行动”更重要。了解一个事物的价值,能让事情做的更好。学习项目管理能带来什么好处呢?《项目管理精华》一书将项目管理视为「21 世纪独有的工作」,作者认为每一名知识型工作者都在工作中不知不觉中扮演着「非职业项目经理」的角色。开发者其实就是典型的知识型工作者。总体来说项目管理对开发者的职业发展和个人生活均有着很大的价值。

  1.1 项目管理是「通过别人做成事情」的能力

  古往今来,如何驱动一个人做成一件事情,一直都是一个人稀缺的能力。

  汉高祖刘邦有一句经典名言:“夫运筹策帷帐之中,决胜于千里之外,吾不如子房(张良)。镇国家,抚百姓,给馈饟,不绝粮道,吾不如萧何。连百万之军,战必胜,攻必取,吾不如韩信。此三者,皆人杰也,吾能用之,此吾所以取天下也。”正是刘邦具备协调张良、萧何、韩信三人协同工作的能力,才使得其能夺取天下,建立大汉王朝。

  反观刘邦的对手项羽,当初凭着个人英雄主义,势力一度增加。但势力增大、地盘扩大后,面对纷繁复杂的战争形势,他没能协调好手下的将领,没做到知人善用。最终落得“至今思项羽,不肯过江东”的下场。

  

  而项目管理正是使他人协同做成一件事情,达成目标的能力。试想一下,拥有这样能力的人,在哪个团队会不受欢迎?而且这样的能力并不会随着年龄而降低,反而越老越吃香。

  1.2 项目管理能输出个人影响力

  项目管理中很多做事情的方法都很符合「为人处事」之道,例如学会及时同步信息的能力。将各类信息及时且高效的以合理的渠道同步给对应的角色,就很容易成为别人眼中「靠谱的人」。

  《微权力下的项目管理》一书讲到项目经理往往需要有个人魅力去影响他人做事,进而达成目标。项目管理能提升与各类干系人打交道的能力,进而提升一个人在组织内的个人影响力。

  1.3 项目管理对个人生活也有价值

  其实生活中很多事情都符合宽泛的项目的定义。举个例子,房屋装修就是非常典型的项目:

  生活中处处是项目,掌握项目管理的能力,对于个人生活大有裨益。

  02

  开发者在项目管理中有会遇到哪些问题

  说了这么多好处,大家一定很关心开发者在工作中怎样做好项目管理。在讲怎样做好之前,我们先探讨一下在项目管理中有什么痛点,再分析下在开发项目中哪些部分涉及项目管理以及如何衡量项目管理成功与否,最终目的是提炼出开发者需要的项目管理能力。

  2.1 开发者的痛点

  作者在写文章之前调研了身边部分开发者同事在项目管理上的痛点,总结起来主要包括以下几类问题:

  2.2 怎么衡量项目管理的好与坏

  也许大家都做过项目管理,但是怎样知道做的好不好?为了回答这个问题,作者咨询了几位做项目经理的同事,他们讲述了很多要素。综合来看,以下三个要素是都有提到的:进度、质量以及成本。这三要素最终会影响到项目的目标。

  

  进度是否符合预期?

  这个很容易理解和衡量。你是不是按时完成了项目中每个里程碑阶段的任务?你是不是按照预期的时间交付了项目中所规划的功能点?延期往往也是项目中最容易出现的风险。

  质量是否达标?

  项目的质量是最为重要的要素。直接关系到各个利益相关者,直接影响项目目标的达成。作为开发工程师,质量是否达标也关系到个人及团队的技术口碑。

  成本是否

  可控?

  你是否设法在预算范围内交付某个项目?这个预算究竟是高还是低?和平均线偏差多少?对于开发人员而言,可以关注投入的机器资源及人力成本是否合理。

  2.3 开发者需要哪些能力

  在大家关注的边界里,基于衡量好坏的标准并以解决实际痛点为目标,可以提炼出我们需要的能力模型:进度管理、质量管理、风险管理。由于成本管理不是痛点,所以此处不提。下文我们展开讲述。

  

  03

  开发者怎样做好项目管理

  以下将从进度管理、质量管理、风险管理三项展开阐述如何做好项目管理。

  3.1 如何做好进度管理

  如何合理地利用资源、按时完成项目是做好项目管理最基本的要求。大多数失败的项目是由于不合理的进度规划导致的。所以做好进度管理是做好项目管理的关键。接下来将详细地介绍进度管理基本的概念和内容,以及做好项目管理的基本流程和思路。

  剖析在做进度管理中的重难点,主要从评估工作量、依赖管理、意外事项的处理三个方面进行分析。下面我们展开介绍。

  3.1.1 如何做好工作量的评估

  做好工作量评估是做好进度管理最关键的一步,合理地对需求进行分析和拆分,明确各个阶段具体的事项,再根据日常的工作经验,对各事项所花费的时间加以估算,才能将整个大的需求的工作量评估得更加准确。

  需求详细方案设计

  做好工作量评估的第一步,是做好详细需求方案的设计。一份完整的需求方案设计包括:概要设计、详细设计、监控、容灾等内容。前期有详细的方案设计,才能对项目整体上有更好的把控,同时也有助于任务拆解等工作。

  在做完需求详细设计方案后,再通过有开发经验的工作人员评审。一般经验丰富的开发人员能够通过设计方案发现背后的风险,能够及时将架构设计的不合理、兼容性未考虑等问题提前暴露出来,同时也能更加明确工作量。理论上来说,在完成需求方案评审后,后续的改动很少,整体的工作时长更加可控。

  这里需要重点关注的是,如果开发周期大于一个月,建议分成多个需求迭代,以降低迭代周期,小步快跑。

  合理拆解,明确职责

  在完成需求方案详细设计后,对任务进行合理拆解。怎样拆解才是合理的?首先我们详细介绍下4个拆解的原则。

  

  下面我们详细了解下如何进行任务拆解。以正常迭代一个 h5 项目的功能为例,一共有四个大的功能模块,三个开发人员。那么我们需要:

  

  估算工作,知晓预期

  在对任务进行拆解后,下一步是对任务进行工作量评估。这个过程在项目管理中,也是一个非常棘手的事情。工作量评估不准确,就会直接导致该任务项出现问题。评估的时间偏多,会存在着资源浪费的问题;评估的时间偏少,将直接造成当前任务延期完成,同时阻塞后面模块的开发,损失更大。

  接下来介绍两种工作量估算方式,一种是自上而下的估算方式,一种是自下而上的估算方式。

  3.1.2 如何做好依赖管理

  因为外部依赖而导致项目延期的情况在工作中屡见不鲜,常见的诸如:

  准备开始开发了,发现设计稿还未就绪。

  准备联调的时候,发现我们上下游的技术团队的接口还未就绪。

  可以联调的时候,因为上下游的链条很长,出现推诿甩锅。

  ...

  

  以下是一些针对外部依赖问题的解决方法。

  3.1.3 如何处理意外事项

  排期后进入开发,还是会存在各种事情影响项目的进展。例如:插入一些高优的需求,或者说发生一些不可控的因素如疫情等等导致人力不足,从而影响项目的进展。下面我们详细介绍几种情况及其处理方式。

  1. 需求的变更

  在设计详细需求方案中,如果考虑得不够周全,开发过程中就会产生需求变更。

  处理方式:

  2. 高优需求插入

  在业务的开发过程中,可能存在被高优需求插入的情况,如果被高优需求插入,直接带来的影响是延后当前的工作完成时间。

  处理方式:

  3. 不可抗力的因素

  不可抗力在项目的开发过程中也是不可避免的。如开发人员有急事需要请假,又或者因为疫情导致办公效率低下,从而影响项目的进展。

  处理方式:

  4. 内部依赖延后

  内部依赖延后影响到项目的进展也是项目开发中经常发生的事情。最好的做法是依赖前置。如果在规定的时间,没办法进行交付产物,则会给项目带来延期风险。

  处理方式:

  3.2 如何做好质量管理

  质量管理的价值就是保证项目质量以达成项目目标,降低因为产品质量问题带来的损失。

  3.2.1 通过流程规范提高质量

  研发流程是一个精细的过程。需要通过建立执行规范来实现工作标准化和程序化,确保产出质量稳定和高团队工作效率,降低人为因素导致的质量问题。

  1. 制定研发流程规范

  制定流程有时会让人反感,觉得降低了研发效率。但规范的流程可以大大提升项目的质量,好的流程都是在实践中不断总结出来的,是项目的最佳实践。

  当然流程也不是一成不变的,它需要根据我们的具体情况不断调整优化,才能适应当下的需要。另外应当尽量将流程变成 CICD 的约束,通过系统来约束、控制,减少其对人的依赖。

  具体到研发团队介入一般可分为需求评审、方案设计、需求开发、测试验收、发布上线、项目复盘六个步骤。这里提供之前所在前端研发团队的研发流程图用以参考:

  

  2. 严格执行Code Review

  code review 的好处不仅仅是能够大大提高代码质量,减少代码 bug,还能从心理上(自己写的代码要给别人审核)让自己更认真严谨些。另外 CR 交流也非常有利于提升团队的工程素养,可以针对性补强开发者的知识盲区,纠正不良习惯。

  3. 制定发布checklist

  每次发版上线都应当是如履薄冰。为了保证上线顺利,发布完善的 checklist可大大规避低级错误,减少不必要的事故。

  发布 checklist 一般可以分为服务、机器、流程三部分,通过日常工作中累计容易出错的地方,将其整理收集起来,持续完善。

  这里提供一份参考案例:

  很多时候不起眼的清单发挥着非常重要的作用。例如飞机起飞前的检查清单、手术前后的检查清单,都守护了无数的生命。更多清单相关内容推荐一本书叫作《清单革命》。

  3.2.2 管理变更影响

  变更是程序异常的主要原因。在需求设计阶段提前对变更进行评估、规划,可以确保在对程序最小负面影响的情况下实施这些变更。同时在团队内进行有效的协商和沟通,可以确保所有的变更都具有可追溯性。下面分别介绍下如何通过详细设计评审技术方案和通过架构设计上隔离变更。

  通过详细设计评审技术方案

  编写技术文档对部分工程师来说是反感的事情,但好的项目质量一定是设计出来的,而不是测试出来的。

  所以在正式编码前,详细思考、设计整体方案并编写成技术文档在组内评审,是规避质量风险非常好用的方法,也是非常好的开发习惯。它可大大减少编码阶段的质量风险。

  以之前笔者团队为例,我们还整理了团队详细文档模板,把大家做详细设计需要考虑的点都囊括了进去,避免大家遗漏。如性能设计、监控日志设计、安全风险设计、用例设计、容灾设计等,既是模板也是详细设计的 checkList。

  通过架构设计上隔离变更

  许多开发者在职业生涯中最害怕的莫过于修改老代码,有些老代码读起来云山雾罩,完全搞不懂业务逻辑和代码关系、也不明白这块代码为什么这么写、那块代码是什么意思。使得大家战战兢兢、寸步难行。

  与之相反的「好代码」一般都遵循软件工程概念中的高内聚低耦合原则,模块之间相互隔离。常见的隔离方式如下:

  3.2.3 功能回归的能力

  功能回归能力是指:通过自动化的回归测试,寻找原始设计中没有预料到的错误。这里需要考虑到2件事:

  第一,有效的测试是设计出来的。

  测试左移的意思就是说尽可能地在前期规避质量问题,以提高效率。大家都知道越早发现问题,修复 bug 的成本越低。例如在设计阶段发现 bug 只需要改写流程图,编码阶段只需要修改代码,测试阶段需要重新走 git 合并 mr 流程,要是到了上线后才发现问题将直接影响是线上用户,那么其修复成本和前面的这些相比可能会没有上限。

  第二, 接入自动化测试平台。

  DevOps 工具是目前最适合做测试的集成管理平台,从需求提交到产品迭代,从产品设计到代码构建、测试管理、持续集成,整个流程贯穿软件行业生命周期。在平台的基础上将各环节的数据收集、沉淀成量化指标。如在代码构建阶段的流水线集成代码规范检测、代码质量检测、单元测试、安全性校验等工具,能够产出代码重复率、单测覆盖率、安全问题数、页面性能等有效衡量项目代码质量的数据指标。

  3.2.4 发现问题和定位问题的能力

  研发阶段要尽量保证质量,不出现 BUG。上线后需要确保一旦出现问题,能快速通过告警发现,并快速定位找到原因,从而最大限度降低对现网的影响。下面我们将介绍如何利用监控告警发现问题、规范日志快速定位问题和利用智能化监控平台。

  第一,利用监控告警发现问题。

  在需要监控告警前,开发者需要先定义需要关注哪些问题?笔者主要涉及前端工作,这里提下前端团队一般需要关注的问题:

  然后再跟进对应指标配置所对应的告警策略。

  第二,规范日志快速定位问题。

  线上项目的程序出问题,程序本身不会说话只会安安静静的挂机。但导致这一现象出现一般就是业务代码写得有问题。

  如何让程序能够「说话」,并准确的说出有价值的信息,这就是日志的核心价值。日志要解决的问题是:程序是不是按预期执行?用户在系统上干了什么?程序有没有执行错误?问题是谁造成的?合理日志的要素如下:

  日志记录的时机如下:

  第三,智能化监控平台。

  每次排查告警问题对程序员而言都是体力活,都想能够轻松,快速的查看日志,更进一步还有监控平台能够直接告诉问题是什么、怎么解决。近年来就产生出一些智能数据分析平台,利用大数据技术及机器学习技术对 IT 基础架构及应用系统所产生的海量日志进行实时分析。

  能实现大量的日志模式发现并进行聚类,将大量的日志原文转化为少量的日志模式,并反应相应模式在日志原文中的占比,这大大减少了人工筛选时间,帮助运维人员更快的定位到故障原因。

  如果更进一步,那就是在发生告警的时候其可以提供一张监控大盘、影响范围、触发异常用户的全链路日志。信息密度的提高能够协助我们快速感知服务的整体状况、评估风险等级,全链路日志也能辅助开发者更快捷的定位问题,提高告警信息触达的效率和质量。

  3.3 如何做好风险管理

  如果用一句话来形容风险,应该是这样的:

  下面我们分别聊一聊风险管理管的是什么,以及在实际项目中我们要注意哪些。

  3.3.1?风险管理管的是啥

  风险的本质

  风险的本质是一种不确定性带来的损失。项目风险实质上是项目的三要素:进度、成本、质量中,一个或多个受到了影响,最终影响了整体项目目标的达成。

  

  风险的特征和构成要素

  风险具备以下特征:

  而风险的构成则包含三要素:风险因素、风险事故、损失。

  

  风险因素会引发风险事故,风险事故会进一步带来损失。

  例如:小 A 是某个紧急项目的研发负责人之一,项目既定的时间是 2022 年 1 月 1 日上线,此时正值解除疫情防控,身边越来越多的同事感染,小A所在项目组的研发成员也陆续感染,最后项目不得不延期。

  可以想想:对于小 A 所在的项目组,风险因素,风险事故,损失是什么?

  风险管理怎么做

  风险管理从流程上主要做四件事:风险识别、评估、应对和沟通。下面展开介绍。

  风险识别:

  核心是找出可能产生风险的“风险因素”,识别分析这些“风险因素”究竟有哪些特征,可能会影响项目的哪些方面。例如上述小 A 的例子,风险因素就是疫情的放开带来的感染风险,其特征就是会导致成员患病无法工作,影响就是项目的延期。

  上述小 A 的例子属于进度风险,通过「核对表法」是比较容易识别到疫情防控开放这个风险因素的。

  风险评估:

  对已识别出来的风险因素,进行系统分析和研究,评估其带来风险的概率,造成损失的范围和程度。

  风险评估一般有“定性分析”和“定量分析”两种:

  定量分析包括“蒙特卡洛法”、“敏感分析法”、“决策树”、“影响图”等,都是非常专业的分析方法。实际上,作为非专业项目经理的技术人员,一般通过定性分析就可以对风险进行评估了。

  如上述小A的例子如果不采取措施,疫情防控的解除带来的延期风险会随着时间推移不断接近严重度100%。

  风险应对:

  在评估完风险的概率和损失范围之后,就可以为风险应对提供参考依据了。

  风险应对主要以下几种方法:

  如上述小A的例子,从“规避风险”的角度,我们可以投入更多的备份人力,或者调整项目目标(如调整上线时间)。从减轻风险的角度,我们可以实施分散办公(居家办公),减少项目组成员被“一锅端”的风险。从接受风险的角度,如果项目因为疫情带来的延期是可以接受的,也可以不采纳任何措施。

  风险沟通:

  这也是最重要的,当风险出现时,及时的跟项目干系人做好沟通,以调整项目干系人的预期。

  3.3.2 实际项目我们要关注哪些风险

  以上是项目管理中,针对风险管理的基本手段。作为开发人员,大家日常参与的项目,又有哪些会遇到的风险呢?如何更好的应对呢?接下来我们介绍完几个最长出现的风险后,分别为各位分享性能风险、安全风险和容灾性风险的应对措施。

  1、最常出现的风险

  从风险的本质出发,最常遇到的风险:

  除了“进度管理”、“质量管理”中提到的解决方法。“进度风险”、“质量风险”,通过前文提到“风险识别”=>"风险评估"=>"风险规避"=>"风险沟通"这些通用的方法论也是可以解决的。

  除了“进度风险”和“质量风险”,研发人员,还有一些特定的风险因素需要关注。

  2.?性能风险

  性能是非常容易被忽视的风险。研发人员可能忙碌于功能的实现,保障项目正常上线,往往非常容易忽视项目中可能存在的性能问题。

  从风险发现的角度,开发者可以通过「性能检查清单」,梳理出可能带来性能风险的因素,并在项目开发过程中规避化解。

  从风险评估的角度出发,项目性能低下可能会直接带来项目转化率的下跌。例如一个支付页面如果没有做好弱网支持,在弱网打开慢,就会带来的支付转化率不高的问题,进而影响收入。

  从风险应对的角度来说,针对核心页面(例如上述提到的支付页面),需要采取措施规避风险。非核心页面(例如一个不重要的介绍页),可以采取一定措施减轻风险或者是接受风险(从成本角度出发,针对性能做优化可能需要花费更多时间)。

  3.?安全风险

  安全是互联网永恒的话题。在当下互联网环境中,安全风险可以分为“合规化”带来的法务风险,以及系统实现漏洞带来的风险。

  合规化风险

  是因为不符合相关的法律法规导致的政策风险,如 app 因为实现疏忽使某些场景未满足某个保法。

  从风险识别的角度出发,可以通过“专家调查法”来发现,通过请求公司的法务,对相关项目规划进行法务风险评估,并根据法务人员提供的建议进行调整。

  系统实现漏洞风险

  这则是因为技术实现的漏洞导致的风险。例如:活动没有做好防刷,导致奖品被刷;页面没有做好脚本过滤被 xss 注入攻击。

  以风险识别的角度来说,可以采用「流程法」,对每个环节可能带来的安全风险进行梳理,如:

  可以采用「核对表法」,整理常见的安全措施,并在项目研发阶段对照核对:

  针对一些重点项目(比如量级庞大的春节活动),也可以采用「专家调查法」,提交相关的技术方案给到业务安全的人员进行审查,以发现系统设计存在的潜在安全漏洞。

  从风险评估的角度出发,与安全相关的风险往往是无法忽视的,是第一优先级需要解决的,因此风险应对手段,往往是需要采取对应措施来规避风险。

  4. 容灾性风险

  缺失针对系统运行异常情况的处理,也是一种潜在风险。从风险识别的角度,同样也可以使用「核对表法」来核对潜在的异常情况是否都有对应的处理措施:

  服务可用性相关的核对表:

  逻辑实现相关的核对表:

  从风险评估的角度出发,需要根据服务/页面的重要性,采取对应的风险应对措施:

  一些核心场景(如支付场景),相关服务/页面一旦出现问题就是直接的经济损失,因此就需要采取措施规避风险。

  一些对用户感知不是很明显的场景,则可以采纳兜底降级的方案。例如信息流场景下,在面对突增流量冲击时,推荐系统所能承受的流量压力要远远低于接入服务的承受范围,这个时候,接入服务就需要保护推荐服务,通过返回兜底数据,减少流量对推荐系统冲击。

  04

  总结

  为什么开发也要懂项目管理?开发如何做好项目管理?相信各位读者已有一定感知。本文首先介绍了项目管理对大家在职业和生活中的价值,接着以项目管理中的痛点为切入点,整体介绍了项目管理中需要掌握的三大能力——进度管理、质量管理、风险管理。

  其中进度管理包含工作量评估、依赖管理、处理意外事项等;质量管理包含流程规范建设、管理变更影响、提升功能回归能力、提升问题发现和定位效率等;风险管理包含风险管理的基础方法论,以及实际项目中容易忽视的性能风险、安全风险、容灾性风险等。

  最后期望本文能帮助开发者提升项目管理技能,提升「把事做成」的能力,成为合作伙伴眼中「靠谱」的人。以上是本次分享的全部内容,欢迎各位开发者在评论区交流。如果你觉得内容有用, 欢迎分享、点赞、在看。感谢支持。

  -End-

  原创作者|赖文辉、蔡卓伦、刘冬、陈长吉

  技术责编|赖文辉、蔡卓伦、刘冬、陈长吉

  

  

  「变化」对程序员而言是个极大的挑战,这是万年老话题了。客户需求在变,老板要求在变,产品经理的需求也在变。有程序员表示,当我抱怨变化带来的加倍工作量,也许还会遭到吐槽:“你程序不怎么样啊,不能顺应我的变化。” 面对变化,你有怎样的经验和方法呢?你有什么评估工作量的妙计?当变动发生,日常杂事和临时问题出现打乱排期,你怎么解决?可以做些什么来减少「变动」?

  欢迎在评论区聊一聊你的看法。在3月24日前将你的评论记录截图,发送给腾讯云开发者公众号后台,可领取腾讯云「开发者春季限定红包封面」一个,数量有限先到先得。我们还将选取点赞量最高的1位朋友,送出腾讯QQ公仔1个。3月25日中午12点开奖。快邀请你的开发者朋友们一起来参与吧!

  最近微信改版啦

  很多开发者朋友反馈收不到我们更新的文章

  大家可以关注并点亮星标

  不再错过小云的知识速递