当前位置: 首页 > news >正文

如何让项目准时上线?

项目为什么容易延期?

1、软件研发是一项创造性工作

项目延期是一种普遍现象,管理者最为头疼的一个问题。但是外人并不理解。明明是你们自己做的计划,怎么总会出现这么多问题。说到底,这是由于我们的工作特性决定的。我们做的是一个创造性的工作,他不像建房子,有特定的步骤。我们实现一个功能,怎么写,有多少行代码,我们在写之前是不知道的。

基于我自己的经验,我觉得项目延期还有以下两个方面的原因:

‍2、工作中的突发事件多

我们在评估工作量的时候,都是基于过往的经验。这种经验性评估在真实环境中并不可靠。你无法应对突发问题。而我们真实开发的过程中突发问题太多了。

3、协作之间的耦合性高

技术人员工作的耦合性太高。从最开始产品经理提出需求、UI设计原型、UE设计体验、程序员做系统设计,写代码、测试人员编写测试用例。环环相扣,其中一个环节出了“意外”,时间就得往后延。

工作中常见的延期原因

我这里列了工作中常见的延期原因:

  • 需求变更,一般指新增需求或者需求细节一直在变;
  • 需求评估的工作量不足,低估了功能实现的难度;
  • 需求理解不对,功能做错了。等最后测试或对接的时候才发现;
  • 有临时需求插入。比如线上突然出现了一个bug,需要修复;
  • 新需求本身存在逻辑问题,做之前都没发现,在做的过程中才发现。
  • 自测不仔细,测试发现问题太多,bug越改越多;
  • 临时人员变动;
  • 偏离计划后没有做好应对措施;
  • 技术难点调研出了问题,实现方案得改;

......

那是不是我们就没办法了呢?也并不是。方法总比问题多,只要所有出现的问题都有应对方案,准时上线也是可能的。当然面对复杂问题,想一次性解决很难,但好在我们可以迭代。每一次项目结束都应该对项目做一次复盘。

如何解决项目延期问题?

这是我应对项目延期的解决方案:复盘 —— 找问题 —— 拆解问题 —— 制定解决方案 —— 迭代 —— 复盘

1、复盘,找问题

复盘:上一次我们延期的原因是什么?把问题原因找出来。比如上次是需求变动导致的。

2、拆解问题,制定解决方案

接着就是拆解问题。为什么需要变动?因为这个功能更重要。这是答案是真的吗?这个功能真的很重要吗?好,是真的。那么评判标准是什么?如果没有。那么我需要制定出来。有了标准,下次遇到新增需求,我们就能很快决定是否加入到这个版本里。好,我们还可以继续拆,是新增需求导致的延期?对,因为新增需求而且并没有修改上线时间。那我们下一次面对新增需求是不是可以对外争取更长一点的开发时间?

这个方法的优点是,每次进步都能感受的到。缺点是,时间周期太长。但好在,我们别人的经验是可以学习的。别人趟过的坑,我们没有必要再趟一次。

解决项目延期的关键三要素

基于我多年的项目管理经验,我认为要解决项目延期问题,必须做好三件事。

一、项目开始前:需求管理

项目开始前的需求管理有四个关键步骤

1、达成需求优先级排序的共识

首先,我们要达成给需求优先级排序的一个共识。什么样的需求是最重要的,一定要完成的?每个公司可能不一样。我自己是基于商业价值和用户价值两个维度来排序的。

商业价值,就是那些直接给公司带来利润,能够降低运营成本、完成公司长期战略目标等功能。而用户价值是,那些能够提升用户体验、提高用户使用效率,解决用户痛点问题的功能。

基于这两个维度,我们可以画一个四象限图,把我们所有的需求按照商业价值、用户价值两个维度给归类到不同象限里。对于商业价值高、用户价值高的产品。我们应该马上去做。至于优先级排第二的是商业价值高、用户价值低的需求;还是商业价值低、用户价值高的需求,要根据公司实际情况来定。

为什么要给需求分优先级?时间有限,要做的功能太多。如果根据商业价值和用户价值拆解后,还有很多需求,我们还可以继续用重要紧急两个维度来拆。

2、弄清楚需求的目的

达成了共识后,第二步就是在需求评审时,要求产品先讲解需求的目的。不只是说明我们要做什么,还要说明我们要达到什么目标。这样做有两个好处。

  1. 让所有人参与其中,发挥团队所有人的价值,通过集体共创可以获得更好的解决方案。
  2. 在事后,我们可以很清晰的看到,我们做的功能是不是往目标更前进了一步。如果没有。那么复盘的时候,能更有指向性的去找问题的原因。
3、弄清楚需求细节

第三步,就是开发者需要弄清楚需求细节。每一个开发人员都应该养成这样一个看透细节的能力。

代码的世界里只有0和1,没有随便。产品在给我们讲需求的时候,并不知道系统的具体实现。有些细节他也不知道。这会导致很多需求在做的过程中有很多细节需要反复确认,如果做的不好,很多细节问题都会在测试的时候体现出来。举个例子,当产品说我们这次做一个活动,用户下单满29包邮。看起来很简单的一个需求,但如果你系统足够复杂,开发人员应该要想到,跨店的情况怎么办?含虚拟商品怎么办?如果店家设置了其他活动,冲突了怎么办?需求后期会不会变成49包邮?如果这些在评审的时候没有想到,那么在做的过程中一定要和产品保持沟通。有些新人刚来的时候不好意思问,其实没啥,每个人都是这么过来的。这种能力是需要时间积累的。

需求理清了也有两个好处:

  1. 评估的工作量会跟精准。
  2. 更早的发现需求里潜藏的问题。
4、输出完整的项目上线计划表

第四步,就是上下同步需求,生成需求计划表。首先我们拆解需求,大需求变成小需求。然后评估小需求的工作量。输出自己的个人计划表。然后部门内部整合需求,输出部门的计划完成表。最后是与团队其他成员生成整体的项目计划表。一般会做成甘特图。这样在做的过程中更容易发现问题。

异常情况

这四个关键步骤,说起来简单,但要真正做好不容易。如果能做到,那需求管理基本不会存在大的问题了。当然也会有一些异常情况。比如需求确定后,能不能变动?一般需求确定下来后,最好不要做临时变动。除非特殊情况。

那什么是特殊情况?这就是制定需求优先级规则的好处了,如果确实有更紧急、成本低的高商业价值、高用户价值的需求。我们可以变动。只要团队内成员都认可这个规则,做需求变动就会比较好实施。

那如果是领导不按规则变动需求怎么办?

谁担责谁决策。因为站的角度不一样,我们认为的高价值任务不一定对。这是一条职场通用原则,在需求确定做不做之前,作为项目组成员,你可以表达自己的建议,但如果最终负责人拍板要做,那就坚决执行。

二、项目开始中:过程管理

过程管理的关键是要解决信息不同步的问题。我的解决方案是:

1、每天都开站立晨会。

很多人说早上开晨会没有用,是管理者没有其他办法,只能通过会议来推进工作的一种表现。我倒不觉得,晨会并不复杂,也不会花费很多时间,但正是因为有了这样一个固定”沟通“事项,每个人心里都会想着这件事,自然会把当下的工作按计划推进。这里我介绍一下我公司开站立晨会的具体步骤:

  1. 首先团队之间达成共识。明确晨会的目的是协同,而非汇报。每个人时间就2分钟。控制发言时间。
  2. 确定汇报的内容。每个人讲讲当天的计划和实际进度是否一致。是否遇到了什么问题,是否需要什么支持。
  3. 固定发言顺序,发言过程中,其他人不评论,不解答。具体的问题等到会后在找相关人员一起讨论。
  4. 晨会的主持人很关键,他需要控制流程和时间,对于偏离主题的发言要给予提醒。
  5. 最后就是要做会议纪要,只记录某人遇到的问题或请求以及整个项目的进度是否正常。

开会时间推荐在正式上班时间30分钟后,比如9点上班。9点30开始。10点前结束。备注:我公司弹性上班可以9点半到公司。

晨会能很好的解决团队内部信息不对称的问题,大家能更好地了解到彼此的项目进度并做好配合。而且人都要面子的,如果自己制定的计划未完成,还要自己当众说出来没按计划完成的原因,是很有压力的,这种压力会在潜意识里影响到自己每天任务的完成度以及专注度。

很多公司把晨会开成了汇报会,最后就变成了一个没有太多信息量的务虚会议。并不是这个工具不好用,而是你没有用对方法。记住上面我说的几个原则,相信你能组织好一场适合团队的晨会。

2、如果是跨部门协作,每日要进行"对表"

如果是跨部门协作。我们每天也要进行”对表“,也就是同步信息。

3、关键节点的跟进。

千万不要等到上线了在来看项目进展,这样即使发现问题,你也没有时间来解决。

4、制定异常问题的处理机制。

所有的异常情况,都需要设计一个应对的应对方案,有了应对方案,至少解决问题的流程有了,心理就不会慌。解决起来就容易很多。

5、建立自己的问题清单库。

很多大公司都有这样一个产品问题清单库。客服同事在处理用户问题时候,通过关键字搜索就能找到通用的解决方案。这极大地提高了客服处理问题的效率。同样的方式其实也可以用在开发上。也许很久之前某个同事遇到的问题,其他同事也能遇到。这种情况下,通过关键字搜索,原来要花半天才能解决的问题,可能一分钟就给解决了。需要注意的是在做这个问题清单库的时候,一定要先定义好格式。这样才好管理。

那是不是做到上面这些就能保证项目能准时上线了?也不一定。因为这里面最关键的是执行的人。人的管理是一门艺术。这里以后再详细讲。

三、项目结束后:对项目做复盘。

复盘会:全员参与

做的好的,要想办法将其标准化、可复制。

做的不好的,要想办法制定应对的方案。

防止项目延期的几个方案

最后,说一下我在防止项目延期上的个人经验。

1、大项目要分阶段转测试。

不要把测试和设计工作都集中在一个时间段。版本迭代的时长也不要超过一个月。

2、预留测试时间

开发人员每次做完一个任务后,都要预留测试时间。同时和开发人员要达成一个共识,如果开过程中出现延期,要自己通过加班时间赶上进度,不能影响其他同事的进度。

3、制定常见异常情况的处理标准。

也就是最开始讲到的,如果真的有需求变更,那么就一定要做好变更需求的标准。需求可以变,变了之后如何处理。这个也需要明确。有些是可以直接放到版本里通过加班解决,有些可以舍弃掉一些需求。尽量不在要发布的时候做变更。

4、做好PLAN B计划。

遇到一些突发时间的预案是什么。比如有人员临时请求,怎么办?有技术难点攻克不了怎么办?作为管理者需要提前想好备选方案。

5、制定两个发布计划。

一个计划是对内的,根据大家工作计划整合之后的发布时间,还有一个是对外上线的计划。我们团队要追求对内时间上线。但如果出现问题,预留出的时间就是我们的缓冲带。当然也可以对外给出一个模糊的上线时间,比如对内9月10号上线,对外9月中旬上线。

以上,是我应对项目延期的一些经验。希望给大家带来一些启发。

相关文章:

如何让项目准时上线?

项目为什么容易延期? 1、软件研发是一项创造性工作 项目延期是一种普遍现象,管理者最为头疼的一个问题。但是外人并不理解。明明是你们自己做的计划,怎么总会出现这么多问题。说到底,这是由于我们的工作特性决定的。我们做的是一…...

ChatGPT 和 Elasticsearch:APM 工具、性能和成本分析

作者:LUCA WINTERGERST 在本博客中,我们将测试一个使用 OpenAI 的 Python 应用程序并分析其性能以及运行该应用程序的成本。 使用从应用程序收集的数据,我们还将展示如何将 LLMs 成到你的应用程序中。 在之前的博客文章中,我们构建…...

不使用辅助变量的前提下实现两个变量的交换

package operator; //不用第三个辅助变量,实现两个数的交换 public class Demo08 {public static void change(int a, int b){a ab;b a-b;a a-b;System.out.println(a);System.out.println(b);}public static void main(String[] args) {change(900,3000);} }后续…...

SV-DJS-i13电梯对讲网关

SV-DJS-i13电梯对讲网关 DJS-I13 是一款主要应用于电梯场景的对讲设备,可以将电梯原有模拟通话器的模拟信号转换成数字信号,不仅有稳定性好、电信级音质的优点,且完美兼容当下所有基于SIP的主流IPPBX/软交换/IMS平台,如Asterisk, Broadsoft,…...

论文解析-基因序列编码算法DeepSEA

论文解析-DeepSEA 参考亮点功能 方法数据集来源数据 实验评估评估DeepSEA预测染色质特征的性能评估DeepSEA在变异序列上的DHS预测性能数据集结果 参考 Zhou, J., Troyanskaya, O. Predicting effects of noncoding variants with deep learning–based sequence model. Nat Me…...

计组与操作系统

非科班出身的程序员,还是得补一下相关理论课程,最近看了下九曲阑干关于CSAPP的视频,学习了一下计算机组成原理,这里列一下相关知识点。 计算机组成原理: 数的表示与运算:CSAPP第二章 指令系统&#xff0…...

Pytorch中张量矩阵乘法函数(mm, bmm, matmul)使用说明,含高维张量实例及运行结果

Pytorch中张量矩阵乘法函数使用说明 1 torch.mm() 函数1.1 torch.mm() 函数定义及参数1.2 torch.bmm() 官方示例 2 torch.bmm() 函数2.1 torch.bmm() 函数定义及参数2.2 torch.bmm() 官方示例 3 torch.matmul() 函数3.1 torch.matmul() 函数定义及参数3.2 torch.matmul() 规则约…...

如何在matlab绘图的标题中添加变量?变量的格式化字符串输出浅析

文章目录 matlab的格式化输出控制符字段宽度、精度和对齐方式的控制matlab的格式化输出总结 matlab的格式化输出控制符 Matlab在画图的时候,采用title函数可以增加标题,该函数的输入是一个字符串,有时候我们想在字符串中添加一些变量&#x…...

Spring MVC 八 - 内置过滤器

SpringMVC内置如下过滤器: Form DataForwarded HeadersShallow ETagCORS Form Data 浏览器可以通过HTTP GET或HTTP POST提交form data(表单数据),但是非浏览器客户端可以通过HTTP PUT、HTTP DELETE、HTTP PATCH提交表单数据。但…...

@Change监听事件与vue监听属性:watch的区别?

change 和 watch 是 Vue 中用于处理数据变化的两种不同方式。 1. change: - change 是一个事件监听器,用于监听特定DOM元素的变化事件,通常用于表单元素(如输入框、下拉框等)的值变化。 - 它在用户与表单元素交互并提交了变化时触…...

C++面试记录之中望软件

上次面试体验不好,记录了,这次同样记录一次体验不好的面试,中望软件…直接写了名字,因为真的很无语😓 记录一下我不知道的问题 忘记录音了😢 1. main函数之前做了什么? 我:实话我…...

多功能翻译工具:全球翻译、润色和摘要生成 | 开源日报 0914

openai-translator/openai-translator Stars: 18.1k License: AGPL-3.0 这个项目是一个多功能翻译工具,由 OpenAI 提供支持。 可以进行全球单词翻译、单词润色和摘要生成等操作提供三种模式:翻译、润色和摘要支持 55 种不同语言的互相转换支持流模式允…...

在 Vue.js 中,使用 watch 监听data变量如:对象属性/data变量

watch 监听对象属性 在 Vue.js 中,使用 watch 监听对象属性的变化时,应该将属性名作为字符串传递给 watch 选项。 示例如下: javascript watch: {addform.isCheck1: function(newValue) {console.log(newValue);var quantity this.addform…...

vue中预览xml并高亮显示

项目中有需要将接口返回的数据流显示出来&#xff0c;并高亮显示&#xff1b; 1.后端接口返回blob,类型为xml,如图 2.页面中使用pre code标签&#xff1a; <pre v-if"showXML"><code class"language-xml">{{xml}}</code></pre> …...

MFC中嵌入显示opencv窗口

在MFC窗体中建立一个Picture Control控件,用于显示opencv窗口 在属性中设置图片控件的资源ID为IDC_PIC1 主要的思路: 使用GetWindowRect可以获取图片控件的区域 使用cv::resizeWindow可以设置opencv窗口的大小,适合图片控件的大小 使用cvGetWindowHandle函数可以获取到ope…...

金鸣识别网页版:轻松实现表格识别的神器

来百度APP畅享高清图片 金鸣识别网页版是一款功能强大的在线识别工具&#xff0c;它可对图片或PDF中的表格文本内容进行识别&#xff0c;还支持各种证票的结构化识别。以下是以表格识别为例&#xff0c;对金鸣识别网页版的操作说明进行详细介绍&#xff1a; 首先&#xff0c;打…...

DasViewer可以设置打开指定文件吗?

答&#xff1a;会员可以。工具里面选择坐标转换&#xff0c;输入源数据&#xff0c;设置好源坐标和目标坐标以及路径。根据两张坐标系的性质选择转换方式。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑…...

uniapp微信小程序用户隐私保护指引弹窗组件

<template><view v-if"showPrivacy" :class"privacyClass"><view :class"contentClass"><view class"title">用户隐私保护指引</view><view class"des">感谢您选择使用我们的小程序&am…...

Java的反射应用(Method和Class)

记录&#xff1a;473 场景&#xff1a;使用java.lang.reflect.Method和java.lang.Class类&#xff0c;根据Java反射原理实现使用指定字符串类名和方法名称&#xff0c;调用对应对象和对应方法。 版本&#xff1a;JDK 1.8。 1.使用Java反射调用指定类的指定方法 (1)参数说明…...

Java之泛型系列--Class使用泛型的方法(有示例)

原文网址&#xff1a;Java之泛型系列--Class使用泛型的方法(有示例)_IT利刃出鞘的博客-CSDN博客 简介 本文用示例介绍Java在方法前加泛型的使用。 类类型的写法 对象所对应的类的泛型写法 Class classAClass<T> classAClass<?> classB Class与Class<?&g…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...