项目 TO 的自我修养

最近作为项目 TO 在公司内完成了一个涉及面比较广的项目,对于如何推动项目上线有一些经验和大家分享。希望刚毕业几年、没有参与过大型项目的同学,从中能学到一些方法,为今后担任项目主力做一些准备。

所谓的 TO,是 Technical Owner 的缩写,是一个项目的技术负责人。互联网公司里,每个需求都需要确定一个 owner,他负责需求的方案评审、进度对齐、问题解决、整体上线。大一点的项目,就要强调 TO,PO(产品 owner)这些,当然这时一般会有 PMO 参与进来。TO 的职责包括但不限于分析业务需求和技术方案的可行性、确定开发所需的技术栈和工具链、制定系统架构和设计文档、跟进开发进度和质量、组织联调和测试,保证系统的稳定性和可靠性,以及跟进上线和后续维护工作。一个优秀的 TO 能够确保项目顺利进行,达成预期目标。

下面我从技术方案、进度管理两方面展开,总结从本次项目里积累的经验。

5b6017e42f91e937989b933ff267683f.png

技术方案

一般大一点的需求都需要在开发前做技术方案评审,也就是所谓的 trd(Technical Requirements Document)评审,它为后续项目的顺利进行打下基础。在技术方案中,不仅要考虑到功能的正确实现,也要考虑非功能性需求,也就是稳定性需求。

业界经常谈的所谓的稳定性三板斧:可监控、可灰度、可应急,这几点一般要在方案中讨论到。

实现功能是最基本的要求,否则不可能上线。但是稳定性同样不可忽视,区别初级工程师和高级工程的一个很重要的点是:能否给出稳定性方案。

总体视角

总体视角对 TO 来说是很重要的。

在一个大项目里,如果只是负责其中的一小块,例如你的服务只是提供一个接口,那可以只关注自己的服务。作为 TO,即使你自身负责的服务改动比较小,也必须关注整体的改动点,将全链路串连起来,包括上下游的依赖关系、数据的流动方向。否则,一个小问题可能就会阻塞整个项目。

梳理项目全貌

写技术文档的时候,需要理清项目全貌。

从 APP/Web 端,到网关,到后续的服务,整个调用链路需要理清。谁调用谁、谁依赖谁,这些都需要摸清楚,后续发布计划会用到。

另外,数据链路也需要理清,从数据源到途经的服务,到最后的落库都需要理清。代码逻辑的回滚相对来说很好做,但涉及到数据的回滚是很难的。因为数据一旦落库,用户已经感知到,或者老数据被覆盖,是很难回滚的。因此梳理项目全貌,提前考虑回滚方案是很有必要的。

把握关键技术细节

如果只是粗浅的了解了项目全貌,其实是不够的。关键地方的细节还要深入研究一下,魔鬼都在细节里。

例如有的服务只是调用接口进行页面展示,那只用了解到这一程度就够了,至于接口字段和页面内容的对应关系就不用深究了。

但是有些服务调用接口后,会根据结果做进一步的计算,那就要多问一步:我们的服务这样改动后,对你的影响是什么?你要做的对应改动是什么?为什么?

题外话,我自己就遇到过一次细节不清导致的事故。我弄错了接口对于不同类型的账户(例如子母账户)的不同表现,据此写的代码的计算逻辑全错了。一个接口的逻辑实现有非常多的细节,但可能关键的就那么几个,我们要掌握它们。

梳理全系统的改动点

技术文档里的一个核心要点就是梳理全系统的改动点。作为项目 TO,有责任弄清所有改动点。虽然不可能每个细节都弄清楚,但大致的依赖关系,数据流向还是得弄清。

识别关键人

如果涉及的系统非常多,而我们又不可能了解所有的服务,那应该如何快速理清改动点?

一个好的办法是找到关键人。每个服务可能会涉及 PM、RD、QA,有些是真正写代码的,有些是合周报的……我们要定位到核心负责人,通常是写代码的那一位,然后向他请教。

我通常的做法是先自己根据已有的文档做出自己的理解,过程中提出一系列问题,列在文档上,再约相关的人语音会议,会上对着文档依次讨论。必要的话,还可对会议进行录屏,避免遗忘。

分析上下游依赖关系

分析服务间的依赖关系非常关键。一方面有助于我们理清全系统的改动点,另一方面,有助于我们制定发布计划。被依赖的服务应该先上线,依赖服务后上线。如果没有弄清依赖关系,很有可能导致事故。

梳理依赖关系时可以用架构图来表示,在图上的连线里用 1/2/3/4 标出请求或都数据流向的步骤。当然也应该用时序图来梳理业务流程。

制定发布计划

项目最终是要上线的,我们在写 trd 时,就应该考虑到上线方案要怎么做。

当整体进行提测后,我们就应该把精力全部放到发布计划上了。

发布计划通常包含:各系统的发布顺序、中间件变更(如数据库的变更、新 topic 申请)、发布关键节点、稳定性三板斧……

首先,我们依据服务间的依赖关系,列出各系统的发布顺序,在发布当天,严格按照顺序进行发布。

其次,一些中间件的变更应该提前一天完成。例如创建新表,增加表字段;申请新的 kafka topic 等等。

另外,发布计划还应该考虑到时间节点。当涉及到的服务变动特别多时,可以考虑分批发布,例如某些旁路的服务提前一天发布到线上,这样可以给关键的服务留下充足的变更时间,出了问题也能有更多时间处理。

发布计划通常也要包含关键节点,例如 XX 服务发布后,系统某些地方就能感知到部分变更,这时应该设置检查项,发布当天对照这些检查项进行检查,没有问题后,再进行之后的发布流程。

最后,稳定性相关的问题一定要着重考虑:可监控、可灰度、可应急。

我个人的习惯是每个新需求开发之前都先想一下与之对应的监控项应该怎么定义。通过监控项,我们才能在服务上线后方便地判断变更的逻辑是否正确。例如,上线了一项功能是过滤掉不合规的用户,那么这时就可以增加一个过滤掉的不合规用户的 QPS,如果上线后观察到 QPS 与预期的不符,就要去排查。另外,如果变更会对性能带来比较大的影响,那就应该增加性能监控项,发布时关注性能是否有问题。

灰度其实在互联网公司里是很常见的思想。通常我们发布时会按小流量、中流量、全量的顺序推进。而当我们发布一个新功能时,对于灰度就要考虑地更多了。

灰度是为了控制发布失败时影响的范围。通常的方案包括按用户 ID 的尾号、城市进行灰度。例如我们先让尾号为 0 的用户看到最新的变更,即使发布过程失败,影响的也只是这一部分用户,损失会降到最低。

可应急指的是一旦出现问题,应该如何处置。如果服务只有逻辑上的变更,直接回滚代码就好了。但是通常逻辑的变更会带来数据的变更,涉及到数据的变更就没那么方便回滚了。这一块要详细设计回滚的流程,最好是在预发环境进行充分地验证。

进度管理

一般而言,研发做项目 TO 时,技术方案上不太会有大问题,但进度管理可能就不太顺畅了。即使项目有 PMO 把控进度,我们也应该学习一些进度管理的方法。毕竟不是所有的项目都会有 PMO 参与,而且了解各方的资源和进度也是 TO 要做的事情。

协同管理

在 prd、trd 时期,我们应该与各业务方,各协作方进行良好的沟通,确保各方的目标一致。在项目进行的过程中,对于可能存在问题的地方,也需要与他们密切沟通。

这里还是要强调:识别关键人是非常有用的一招。涉及到很多业务方的需求,我们不一定记得住所有人,但是关键服务的关键人一定要记在文档里,遇到问题可以第一时间找到关键人。有时关键人不一定能处理,但是他一定能帮助 TO 找到对应的人。

排期与关键节点

在 trd 评审完成后,排期时间就应该全部确定,包括提测时间、测试时间、预发布时间、正式发布时间。有些倒排项目,排期是先于 trd 时间确定的,这时就应该倒排法确定各个节点的时间了。

排期需要得到各方的确认。每个改动方都应该知晓关键的时间节点,例如提测时间、正式发布时间等。有些服务方改动点比较小,手上还有其他优先级比较高的项目,提测时间不一定能赶上,但经过沟通,只要能赶上正式发布时间就可以,那也没问题。

对于非常大的项目,还需要设立多个交付节点,分阶段提交成果。否则,都积累到最后一批提交,很可能就是灾难了。

风险识别

对于一些倒排项目,trd 提出的方案不一定是最优,如果存在一定的风险,要提前指出来,并且要做好应对方案。

对于我做的这次项目而言,涉及到了数据的变更,在正式发布前,我们对生产数据进行了预计算,发现其中的某项数据有问题,不合预期。于是在发布前我们找到业务方、PM 进行协商,并对方案做了一定的更改,最终项目得以顺利上线。

当然,有同学可能会说,这应当是在项目初期就做的事情。具体到这一件事情确实是这样,但是有些倒排项目不一定给你留了足够的时间,所以最后一道关就是在正式发布前做一下验证,确保万无一失。

周会与日会

一旦项目进入正式开发后,应当召开周会或日会,及时同步各方进展、遇到的问题、风险。

作为 TO,在对齐进展的时候,应当化身 PMO,假装我们不知道任何项目的细节,只问进度。我自己的经验是,因为我不是一个能必安理得 push 别人的人,而且有时候会默认考虑到项目的细节,觉得他这块会比较麻烦,所以就不太好意思追问进度。但在会上,需要抛开自己的研发身份,纯粹以一个 PMO 的视角来问进度,如果进度不理想,那就要追问解决措施是什么。一旦“切换”了身份,会发现问进度是最简单的事情。

一个小细节是会前要准备好文档。不要直接上来就尬聊,当你有准备的时候,一定是会给其他人好印象的,对方大概率也会认真配合的。

其他

前不久,我在 Go 夜读分享了自己使用 things3 管理项目的经验[1],其中讲到的需求开发模板可能会对你有帮助:

2de87f03bad40a471422c78900c3f6fe.png

最后

工作这几年下来,开发一个需求并推动上线早已不是问题,但涉及到众多合作方并作为项目技术 TO 的项目还是第一次。过程中,不仅要考虑自身所负责项目的开发,还需要整体考虑所有业务方的改动点,还是有一些挑战的。做完这个项目之后,自觉执行层面就没啥大问题了。

参考资料

[1]

things3 管理项目的经验: https://www.bilibili.com/video/BV1p24y1g7A6/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/7041.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java和mysql进行排序和排名

目录 一、基于java排序和排名 1、数值相同,排名相同,排名连续 2、数值相同,排名相同,排名不连续 3、数值相同,排名不相同,排名连续 二、基于mysql排序和排名 1、准备一张表 2、插入数据 3、设置临时变量,方便后续查询 4、数值相同,排名相同,排名连续 5、数值相同,排名…

天猫食品饮料数据分析:2月份茶饮料品牌销量TOP10排行榜!

近年来,茶饮料品类逐渐丰富,也在潜移默化中激发消费者的购物欲望,茶饮料行业的整体市场规模也不断增长。 根据鲸参谋电商数据显示,2023年2月份在天猫平台上,茶饮料相关产品的月销量将近149万件,环比增长约…

ADAS-GPS定位原理概述

前言 “GPS传感器在无人机、室外物流车以及诸多机器人应用中经常出现,它们机器人的定位、导航中发挥着重要的作用,而今天的L2~L5级别自动驾驶系统更是离不开它们,今天我们走进它们的世界,探索其背后原理以及本质。” …

MySQL之事务和锁机制

文章目录一、事务1.1 事务特征1.2 隔离级别1.3 开启事务二、锁机制2.1 读锁、写锁2.2 全局锁、表锁、行锁2.3 记录锁、间隙锁、临键锁提示:以下是本篇文章正文内容,MySQL 系列学习将会持续更新 一、事务 在数据库里面,我们希望有些操作能够以…

leaflet实现波动的marker效果(131)

第131个 点击查看专栏目录 本示例的目的是介绍如何在vue+leaflet中显示波动的marker效果。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共76行)安装插件相关API参考:专栏目标示例效果 配置方式 1)查看基础设置…

chatgpt 变现思路

教学 为用户提供ChatGPT的培训课程,教授如何使用和掌握ChatGPT的基本功能和高级技巧。课程可以通过在线平台或实体培训形式进行。 各种设计 ChatGPT可以为设计师提供创意灵感,包括平面设计、UI/UX设计、建筑设计等。此外,它还可以协助设计…

MySQL主从复制之多主多从部署流程—2023.04

文章目录一、多主多从实现架构图二、准备工作三、MySQL多主多从搭建流程1、修改2个主节点配置文件2、修改2个从节点配置文件3、2个主节点相互复制4、2个从节点分别复制主节点5、测试记录:一、多主多从实现架构图 这里是2主2从,下图基本例举出来的实现的…

电脑安装Ubuntu系统(非虚拟机)步骤简述

由于我的笔记本电脑比较古老(近10年),已经过了质保期,甚至续保时间都过了,所以本着能用则用的想法就在上面改安装Ubuntu系统。下面简单介绍下安装过程,自己留笔记,如果有碰到同样问题的能参考更…

信息收集之WAF绕过

信息收集之WAF绕过前言一、工具进行目录扫描1. 工具的下载2. 工具的使用二、Python代码进行目录扫描前言 对于web安全无WAF的信息收集,大家可以查看如下链接的文章: web安全之信息收集 对于有WAF信息收集,看如下所示:(…

opencv学习(二)图像阈值和平滑处理

图像阈值ret, dst cv2.threshold(src, thresh, maxval, type)src: 输入图,只能输入单通道图像,通常来说为灰度图dst: 输出图thresh: 阈值maxval: 当像素值超过了阈值(或者小于阈值,…

(数字图像处理MATLAB+Python)第四章图像正交变换-第一节:离散傅里叶变换

文章目录一:一维离散傅里叶变换(1)定义(2)实例二:一维快速傅里叶变换(1)定义(2)实例三:二维离散傅里叶变换(1)定义&#x…

Python入门教程+项目实战-7.4节: 程序实战-计算次大值

目录 7.2.1 计算四个中的次大值 7.2.2 使用循环计算次小值 7.2.3 系统学习python 7.2.1 计算四个中的次大值 假设有四个整型变量,该怎么计算四个中的次大值? 初学者解出这道题并不困难,但是将代码写得简洁优雅却是一个不小的挑战。 直接通…

aspnet016计算机组成原理精品课程shfw程序

2网站项目范围 计算机组成原理精品课程系统从两种用户角度进行功能划分。 1、学生部分: 1.1:新闻查看; 1.2:课程公告查看; 1.3:用户注册; 1.4:在线留言; 1.5&#xf…

Spring Boot 配置文件配置自动提示 Configuration Processor

效果 在使用Idea等开发工具时,配置文件中输入前缀就有对应的补全提示,使开发者可以很方便配置相应属性,效果截图如下: 元数据说明 这些提示来自于 spring 自动配置规范中的源数据文件 spring-configuration-metadata.json 和 ad…

百度储瑞松谈智能驾驶:极个别车厂才能做全栈自研

百度集团副总裁、智能汽车事业部总经理储瑞松在百人会论坛表示,汽车智能化系统不同于车企所熟悉的以金属件为主的车辆其他部分的系统,是一个以硬件为载体、由算法软件驱动的大规模动态系统,它的复杂性比起以金属件为主的系统是指数级增长的。…

【环境与工具】IDE配置——vscode配置

配置vscode的 Python , C 的编译环境 2. Python 2.1 Python解释器 2.1.1 安装python环境 2.1.2 创建vscode-python文件夹 裸配置 如图,与在命令行运行无区别 2.1.2 安装vscode-python插件 2.1.3 code插件运行.py 添加配置文件 program 设置启动文件 "progr…

多线程进阶学习12------ConcurrentHashMap详解

JDK 7 HashMap 并发死链 注意:要在 JDK 7 下运行,否则扩容机制和 hash 的计算方法都变了 import java.io.*; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.StringTokenizer; import java.util.concurrent.*; import java.…

AR”将会成为“更加日常化的移动设备应用的一部分”吗

目录 1:AR是什么 2:AR给人类带来的贡献 3:人们在生活中可以遇到许多 AR 技术应用 4:AR 技术的未来发展的趋势: 大学主攻VR,从大一就对VR的知识,设备,已经所涉及的知识伴随我的整…

AI工具(ChatGPT)常用指令,持续更新...

要国内使用AI工具,关注:码视野,回复:1002使用VensiGPT时,当你给的指令越精准,它回复就会越完美,例如,如果你要请它协助撰写文案,如果没有给与指定情景与目标,…

作为大学生,你还不会搭建chatGPT微应用吗?

目录 引言ChatGPT是什么?背景:ChatGPT敢为人先,打破全球僵局示例演示:基于ChatGPT微应用实现的条件及步骤(1)整体框架(2)搭建前的准备工作(3)实际搭建步骤&a…