内卷情况下,工程师也应该了解的项目管理
简介:大家好,我是程序员枫哥,🌟一线互联网的IT民工、📝资深面试官、🌹Java跳槽网创始人。拥有多年一线研发经验,曾就职过科大讯飞、美团网、平安等公司。在上海有自己小伙伴组建的副业团队,目前业余时间专注Java技术分享,春招/秋招/社招/跳槽,一对一学习辅助,项目接活开发。
🌈更多学习内容, 欢迎👏关注👀【文末】微信公众号:IT枫斗者
🌟🌟程序员找工作,就上Java跳槽网:www.javatiaocao.com
内卷情况下,工程师也应该了解的项目管理
背景
- 作为研发工程师,我们的工作时间大部分时候都是在某一个项目上。一些较大的公司或比较注重项目管理的团队中会有专门的项目经理负责项目进度的把控,也有一些团队是由产品经理来负责。
- 作为研发人员,我们应该了解一些基础的项目管理概念,尤其是在当前更内卷的情况下,以便更好的与其他同事合作,提高自己抵御风险的能力。
项目管理基础概念
- 项目管理的三大关键要素
- 时间
- 资源/成本
- 范围/质量
项目计划
列出项目的工作分解结构
-
按照职能,时间阶段,主要交付物,列出项目的工作分解结构。要一直分解到能估量出单个任务的责任、预算和计划等,并确定交付标准。
工作分解参考原则:
- 对业务足够熟悉才能够更好的工作分解
- 确认是否有模板或先前类似的项目用来帮助识别活动,确定风险点等
- 需要考虑公司休假及国家法定节假日
- 任务尽量分解在一周内完成的粒度
- 任务需要考虑等待时间
- 一个任务尽量分解为一个人可以完成的粒度
- 任务历时的估算要以小时为单位
- 任务量的分配以工作时间的85%为宜
- 人员分配以后要确认人员使用率
- 缓冲时间不要分配到各个任务上,可在阶段后或整个项目后留出缓冲
-
具体到我们的工作中,一个需求首先是产品输出PRD文档,而后设计同学输出具体的设计稿。当研发收到需求后,会针对这个需求排一个开发内部的计划(我们内部管这个叫拆单)。
-
在我们的这个拆单中,我们会将一个需求的开发任务拆分成以小时为单位的任务,并以此确定最终的交付时间。例如经过拆单我们评估大致要一个人开发20个工作日,安排一个人从6月3日开始开发,去除端午节以及周六日的影响是在7月1日可以开发完成提测。
明确关键时间点或里程碑点
- 列出计划后,我们需要设置几个关键点,确定好每个时间点的交付物。同时在计划中预留出一定的缓冲时间,且缓冲时间最好是放在项目最后,而非切分到每个阶段。
- 回到我们的项目中,最终交付可能涉及到以下时间点:
- PRD输出时间点
- UX设计稿输出时间点
- 客户端开发完成时间点
- 服务端开发完成时间点
- 客户端与服务端提测时间点
- QA一轮测试时间点
- QA二轮测试时间点
- 上线:客户端发版,服务端发布
明确涉及的人以及所负责的内容
- 责任落实到个人,每一项任务分配一个且只能是一个负责人,负责计划、估算、监控及报告任务数据;负责人不一定需要亲力亲为,但必须对交付负责。
- 回到我们的项目中,整个项目的负责人可能是产品经理。具体到研发这里,假设客户端内部参与这个需求有三位同学,将这个需求划分为三个部分,每位同学指定负责开发其中一部分,但最终我们一定要指定一位同学负责整体客户端的技术方案和需求的落地,以及对外沟通协调。
- 这位同学可以是技术Leader,也可能是虚线汇报的Leader,也有可能就是有owner意识的开发同学。这样指定整体的客户端才能按时高质量交付,而不会出现客户端内部互不关心对方实现、出现遗漏功能、边界不清等问题。
输出项目进度计划
- 指定项目计划时需要考虑各种情况,例如
- 假期
- 跨部门合作
- 各个任务依赖关系等等
- 例如前面我们确认开发完成提测的时间时,就需要将端午节假期考虑进去。
- 不过前面没有提到的是,提测之前应该先和服务端确认联调时间,确保联调的时间要在提测时间之前,所以最终确定时间点时,一定是要考虑好各种依赖关系。
沟通确认
-
与各相关责任人就计划进度进行沟通和确认,对计划中不合理的地方进行修正,并达成一致。
项目进度得到确认承诺后,更能有效执行:
- 确认关键时间节点(不断与干系人进行确认沟通)
- 明确各自承诺的内容
-
确认好计划后,各个环节都要确认时间点没有问题,算是针对此给出了承诺。这里面有几个小点可以扩展聊一下。
-
做出承诺后,一定要做到
-
作为研发同学当我们给出承诺之后,我们是一定要做到的。否则不但会影响整个项目的推进,个人以及团队的信誉也会收到较大的挑战。
-
如果连续出现这种情况,那研发给出的承诺大概率都不会被信任,信誉也就破产了(如果需要裁撤人的话,这样的同学大概率也会被优先裁撤了)。
-
开发内部估时一定要相对准确
-
开发内部估时一定要相对准确,否则就是在坑自己。
-
在给出估时的之前,一定要先做好技术方案。整体的技术方案内部过一遍,可能还要再和服务端确认一遍接口协议等,大家都比较认可之后,再基于此来拆工作时间,这样可以做到相对准确。
-
不同能力侧重点的同学负责模块也应该不同
-
擅长复杂UI动画的同学,不让他去负责最复杂的动画实现,这样的安排一定是有问题的。能力强的同学就要去啃项目中最硬的骨头,处理最难的问题。
-
当然这样安排也会使部分同学的能力得不到锻炼,这里面最终会有一个取舍平衡的问题。如果是一个紧急且重要的项目,就要以能够快速高质量交付为目标来安排。
计划的复核与修正,发现问题、解决问题
- 计划执行过程中,肯定会发生各种各样的问题(下一节我们会详细讨论项目风险管理)。我们需要注意的是要让风险尽早的暴露出来,而不是项目即将交付了才反馈存在问题,此时想要挽救可能也无力回天了。
- 过程中也要回看制定的计划是否是合理的,如果最初制定计划时,由于比较急切或者经验不足,确实制定了一个不太可能完成的计划,那么也要做好及时的修正以及预期管理。
项目风险管理
正确认识风险
- 风险与不确定性相关,不确定性越多,风险越大
- 负面的风险称作威胁,正面的风险称作机会
- 具有风险管理意识则项目有序,没有风险管理意识,则项目无序、状况不断
- 具体到项目中,首先是制定技术方案时尽量考虑完善。其次在拆单时,尽可能将单子拆的比较细,一个任务4-8小时会比较合适,这样就控制住了不确定性。
- 可能在制定技术方案时我们识别到了某个点存在技术上的不确定性,例如客户端开发不确认此处是否能够实现,需要调研;或者此处可能存在厂商兼容性问题,需要做兼容性测试。
识别风险
- 识别出那些当真实发生时会对项目造成影响具体的不确定性,需要注意的是:项目风险必须是具体的,而不是空泛的担忧或疑虑。
- 前面我们提到可能某个点不确定能否实现,此时上报时间点时就要具体说清楚是哪个点。这里千万不能有担心我提出这样的点会不会被认为技术不行,而隐瞒的心里。
- 开发需求时技术能力的差异可以通过调整为组内其他同学来负责的方式补足,或者给时间去调研、反编译竞品App的方式学习补齐。如果因为隐瞒,而最终导致项目延期,这样的问题实际上会更加严重。
- 所以在识别出风险后,一定要及时提出来,上下游都要清楚,同时要言之有物。
确定风险发生的概率
- 评估风险出现的概率来确定一个特定时间或场景出现的可能性,可以用数字或次序值来评估概率。
风险评估分级
- 风险 = 影响*概率
风险应对措施
- 避免:改用其他方法消除风险
- 缓解:降低风险概率或风险影响
- 转移:转嫁给第三方
- 接受:接受风险和结果
- 针对不确定的点,明确提出来需要调研的时间。可以在制定项目计划时反馈,先确认其他部分的时间,不确定的这个点给出一个预估时间,例如大致要一周时间,也要明确说出来这个预估时间不准,调研后可能立即就可以解决。或者一个预估的时间也给不出来,那么可能要看看是不是要安排其他同学针对此专门去调研,不占用这个项目的同学,这个项目先正常推进开发。
- 甚至可以协调产品经理看看这个点在产品设计上做好调整的准备。在一个成熟的团队,这种情况是有可能发生的,产品经理的想法也许是天马行空的,他(她)在确认需求之前可能不会从如何落地的角度去考虑,具体如何落地是开发需要考虑的事情。
风险管理要点
- 培养自己的风险管理意识,提升项目控制能力
- 控制粒度越弱,风险越高
- 了解项目的主要风险及应对方案
- 提前指定风险应对计划
- 手上要有一定的缓冲
- 手上要有备选方案
项目执行与控制
项目跟进的频率
- 确认好时间节点之后,提前告知对方需要配合的地方。
- 制定技术方案时,就要确认好前后端需要联调的点,即将到达联调时间点之前也可以与服务端沟通一下,看看可以先联调哪个点,后联调哪个点,确认好顺序。
- 千万别出现重来不沟通,客户端等着服务端找他,服务端等客户端找他的情况,直接死锁了。
- 认可对方的努力,及时给出正面的反馈
- 比较成熟的做法是,当对方的工作做的非常好,也要学会夸夸模式。
- 例如服务端同学考虑的非常全面,弥补了你的技术方案上的漏洞,或者联调时接口逻辑都是通的且没有Bug,沟通时积极正向,整体体验非常棒。
- QA同学测试的比较全面,测试过程中考虑到了很多逻辑边界,涉及其他模块的影响,以及资源占用如内存泄露等问题,让你觉得非常靠谱安心。
- 在项目群中,启动夸夸模式,没有人是不喜欢赞美的,尤其是对方主管也在群中,效果更佳。及时正向的反馈,会让后续的合作更加顺畅,其他同事也会更加喜欢与你合作。
- 当然夸人也是有一些小技巧的,别夸的太尴尬。一般从专业性、工作主动性、沟通与团队协作几个方面入手就行了。别太假,更别两个人约好在群里互相夸对方,那画面不敢想象。
- 沟通中存在的问题,采用逐渐设计的方式提醒
- 私下沟通
- 项目群中沟通
- 与对方主管沟通等
- 已经到了联调的时间点了,但是服务端的同学还没有准备好接口,客户端可以通过其他方式先好自己的逻辑,但是没有联调过终归是不能提测的,此时你可以先私下来沟通。
- 如果对方不回复你(已读不回),也不说他到底啥时候好,你可以再提醒一至两次,结果还是没有改善。此时就要将问题上升了,例如在项目群中反馈给项目经理或者产品经理"本该昨天甚至上周联调的接口还没好",后续交给项目经理去沟通。
- 注意此事不是为了甩锅,也不要觉得不好意思。可能这位同事存在其他问题,主动PUSH问题的解决就是在保证项目能够按时去交付,何况你已经提醒过几次了。
项目跟进要点
- 项目控制过程中最大的问题就是没有问题
- 踢皮球的根本原因是没有落实跟进
项目协调会议
- 发现问题,立即拉会沟通,少开长会,开高效会议。 针对会议需要考虑一下几点
- 会议一定要设置会议议程,具体讨论哪几个点
- 要有会议记录
- 会议最后要有结论以及具体的行动项
- 明确行动项的负责人
相关文章:
内卷情况下,工程师也应该了解的项目管理
简介:大家好,我是程序员枫哥,🌟一线互联网的IT民工、📝资深面试官、🌹Java跳槽网创始人。拥有多年一线研发经验,曾就职过科大讯飞、美团网、平安等公司。在上海有自己小伙伴组建的副业团队&…...
【解锁未来:深入了解机器学习的核心技术与实际应用】
解锁未来:深入了解机器学习的核心技术与实际应用 💎1.引言💎1.1 什么是机器学习? 💎2 机器学习的分类💎3 常用的机器学习算法💎3.1 线性回归(Linear Regression)…...
1-3.文本数据建模流程范例
文章最前: 我是Octopus,这个名字来源于我的中文名–章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的…...
【FFmpeg】avformat_alloc_output_context2函数
【FFmpeg】avformat_alloc_output_context2函数 1.avformat_alloc_output_context21.1 初始化AVFormatContext(avformat_alloc_context)1.2 格式猜测(av_guess_format)1.2.1 遍历可用的fmt(av_muxer_iterate࿰…...
Flask 缓存和信号
Flask-Caching Flask-Caching 是 Flask 的一个扩展,它为 Flask 应用提供了缓存支持。缓存是一种优化技术,可以存储那些费时且不经常改变的运算结果,从而加快应用的响应速度。 一、初始化配置 安装 Flask-Caching 扩展: pip3 i…...
基于weixin小程序农场驿站系统的设计
管理员账户功能包括:系统首页,个人中心,农场资讯管理,用户管理,卖家管理,用户分享管理,分享类型管理,商品信息管理,商品类型管理 开发系统:Windows 架构模式…...
JAVA将List转成Tree树形结构数据和深度优先遍历
引言: 在日常开发中,我们经常会遇到需要将数据库中返回的数据转成树形结构的数据返回,或者需要对转为树结构后的数据绑定层级关系再返回,比如需要统计当前节点下有多少个节点等,因此我们需要封装一个ListToTree的工具类…...
设计模式——开闭、单一职责及里氏替换原则
设计原则是指导软件设计和开发的一系列原则,它们帮助开发者创建出易于维护、扩展和理解的代码。以下是你提到的几个关键设计原则的简要说明: 开闭原则(Open/Closed Principle, OCP): 开闭原则由Bertrand Meyer提出&am…...
代码随想录算法训练营第59天:动态[1]
代码随想录算法训练营第59天:动态 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。 示例: 输入: …...
jvm性能监控常用工具
在java的/bin目录下有许多java自带的工具。 我们常用的有 基础工具 jar:创建和管理jar文件 java:java运行工具,用于运行class文件或jar文件 javac:java的编译器 javadoc:java的API文档生成工具 性能监控和故障处理 jps jstat…...
ISP IC/FPGA设计-第一部分-SC130GS摄像头分析-IIC通信(1)
1.摄像头模组 SC130GS通过一个引脚(SPI_I2C_MODE)选择使用IIC或SPI配置接口,通过查看摄像头模组的原理图,可知是使用IIC接口; 通过手册可知IIC设备地址通过一个引脚控制,查看摄像头模组的原理图ÿ…...
HTTP协议头中X-Forwarded-For是能做什么?
X-Forwarded-For和相关几个头部的理解 $remote_addr 是nginx与客户端进行TCP连接过程中,获得的客户端真实地址. Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后…...
Linux高并发服务器开发(八)Socket和TCP
文章目录 1 IPV4套接字结构体2 TCP客户端函数 3 TCP服务器流程函数代码粘包 4 三次握手5 四次挥手6 滑动窗口 1 IPV4套接字结构体 2 TCP客户端 特点:出错重传 每次发送数据对方都会回ACK,可靠 tcp是打电话的模型,建立连接 使用连接 关闭连接…...
力扣第220题“存在重复元素 III”
在本篇文章中,我们将详细解读力扣第220题“存在重复元素 III”。通过学习本篇文章,读者将掌握如何使用桶排序和滑动窗口来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述…...
Qt实战项目——贪吃蛇
一、项目介绍 本项目是一个使用Qt框架开发的经典贪吃蛇游戏,旨在通过简单易懂的游戏机制和精美的用户界面,为玩家提供娱乐和编程学习的机会。 游戏展示 二、主要功能 2.1 游戏界面 游戏主要是由三个界面构成,分别是游戏大厅、难度选择和游戏…...
Windows 10,11 Server 2022 Install Docker-Desktop
docker 前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 docker-compose Compose 是用于定义和运行…...
C++中的RAII(资源获取即初始化)原则
C中的RAII(Resource Acquisition Is Initialization,资源获取即初始化)原则是一种管理资源、避免资源泄漏的惯用法。RAII是C之父Bjarne Stroustrup提出的设计理念,其核心思想是将资源的获取(如动态内存分配、文件句柄、…...
【机器学习】Whisper:开源语音转文本(speech-to-text)大模型实战
目录 一、引言 二、Whisper 模型原理 2.1 模型架构 2.2 语音处理 2.3 文本处理 三、Whisper 模型实战 3.1 环境安装 3.2 模型下载 3.3 模型推理 3.4 完整代码 3.5 模型部署 四、总结 一、引言 上一篇对ChatTTS文本转语音模型原理和实战进行了讲解&a…...
ubuntu22.04 编译安装openssl C++ library
#--------------------------------------------------------------------------- # openssl C library # https://www.openssl.org/source/index.html #--------------------------------------------------------------------------- cd /opt/download # 下载openssl-3.0.13…...
百度Agent初体验(制作步骤+感想)
现在AI Agent很火,最近注册了一个百度Agent体验了一下,并做了个小实验,拿它和零一万物(Yi Large)和文心一言(ERNIE-4.0-8K-latest)阅读了相同的一篇网页资讯,输出资讯摘要࿰…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
