我的软件研发套路

news2024/10/6 22:25:38

春节回来之后,调整到一个新的团队工作。

团队,是已有的;所用的技术栈,不熟悉;所做的业务领域,也涉猎甚少。挑战比较大。

管理层对团队的产出不满。我的首要任务,是提升团队的效能。

目前团队的软件研发管理没有套路,比较随性,出现的很多问题都是软件研发中常见的。

在这种情况下,我选择先把自己当成一个教练,梳理过去的经验教训,根据团队当前的情况,进行选择和裁剪,在个别项目中陪着团队用起来,形成适合这个业务、这个团队的干法。在这个过程中,必然会带来一些改变:习惯,规范,人,人和人之间的关系。公司有惯性,团队有惯性,要进行改变,不能下猛药,要慢慢调理,从小处入手,从接受意愿强的部分开始做起来,产生效果,再逐步推广。

同时,一边当教练,一边当学生,学习新的技术栈,学习新的业务领域,让自己尽早能下场成为队员。

在这个情况下,要求自己把软件研发的套路,提炼出来,成文,以便于团队内的沟通。

领域:应用系统的软件研发

主要内容,可以用下面这些关键词来概述:

  • 业务分析:对象关系图,状态图,活动图,用例图,外加报表需求。

  • 分析和设计过程:静态模型 => 动态模型;建模结果 => 存储结构、内存数据结构;前后端对接的restful API列表。

  • 项目scope:用例图 => 功能特性(叠加非功能特性)=> 任务拆分 =>工作量评估(前端、后端、测试)。

  • 项目过程:项目启动,项目计划,检查点,敏捷,复盘。

一、业务分析

做应用系统,是为了解决业务问题。

要解决业务问题,首先得理解业务,理解一个业务有哪些参与者(Actor),他们分别有哪些诉求、哪些问题。

所以,首先要从业务的理解和分析入手,进行业务建模。

这几年业界提得比较多的DDD,也是业务建模的一种方法。识别业务对象,划分子域,设计聚合关系,也是其重要组成部分。

我习惯从三张图入手:

  • 对象关系图

  • 状态图

  • 活动图

这里的对象关系图,接近于UML中的类图,目的是识别业务对象,以及它们之间的关系。状态图和活动图也基本上是UML中的定义。

对我来说,这三张图承担了Ubiquitous Language的作用,作为业务方、产品、开发、测试等项目成员之间用来沟通业务和方案的通用语言。

识别业务对象,是最基础也是最核心的。

对象关系图,可以帮助我们识别和梳理业务对象及其关系。一般需要多张图,才能把一个系统的业务对象及其关系都描述出来。对象之间的关系比较复杂时,还需要从不同的维度,分别用不同的图来描述对象之间的关系。

关系的描述,简单粗暴地,区分1对1、1对多、多对多就可以了。去年我发现飞书上画UML图的工具不错,可以用聚合、组成、扩展这些标准化的关系,效果更好。

样例1:1:n 关系

样例2:用 聚合、扩展等标准化的描述

系统的使用者,一般也会在对象关系图中进行分析。

对象关系图,属于静态模型。

动态模型,则用状态图和活动图来描述,两者可相互印证。时序图,用的比较少,一般只在调用关系比较复杂的情况下,或者跟第三方有比较多的调用关系时才画,一般在设计或编码阶段使用。

状态图:首先要识别对象是否存在状态。如果有状态,有哪些状态;是否存在多个维度的状态;对象之间的状态,是否存在关联性;

活动图,一般按泳道图的方式来画。如果业务比较简单,也可以简化。

业务建模一般就用这三类图。

在撰写这三类图的过程中,自然会形成名词表,以及各种枚举值等主数据。

除了业务建模,还需要梳理系统的需求边界,设计系统功能,所以还需要用例图,从业务目的出发,分解出功能点、特性。

每个功能点中,除了业务逻辑,可重点说明对关联对象的限制、影响。

报表需求,也是在这个阶段需要收集的重要信息。从报表中可以反推和验证业务对象及其关系。报表的统计需求,能帮我们发现一些维度、主数据,发现一些容易被忽略的东西。另外,报表对数据存储结构设计的影响也比较大,需要尽早收集。有的产品负责人会忽视这一点,认为报表需求可以在系统跑起来之后再做。在过往的工作中,多次遇到在做报表的时候,发现数据缺失,或者数据的颗粒度不满足需求,导致产生很大工作量。为了满足报表需求,调整数据结构,增加数据冗余这类工作更是常见。

在慧点科技的时候,到客户那里调研需求,除了到各业务部门访谈,索要组织架构、索要各种表单和报表,就是标准动作。拿着这些东西,结合访谈内容,结合每个业务流程进行梳理。二十年过去了,这招依然管用。

业务分析,是平时我最关注的,也是在实际工作中花时间最多的。

二、概要设计

设计文档,一般只做到概要设计。除非有特别复杂的业务逻辑,单独画流程图,做详细设计。

文档,缺少越好。

自己不看的文档,不要写;可写可不写的,不要写。

文档管理最难的在于更新维护,保持其up-to-date。写得越多,维护工作量越大。没时间维护,文档的有效性就变差,慢慢得就没人看,没人看就更不会有动力去维护,恶性循环。

概要设计,我主要关注两部分:

  • 数据库存储结构

  • API清单,目前一般是Restful API清单,用于前后端对接,或者服务之间调用。Restful API清单,只需要写到 method 和 url 就可以,不用详细描述参数和返回值。

除了这两类之外,还会就某些专题要求提供设计文档,例如部署拓扑的设计、特定模块的代码结构设计。

对于设计,我的观点:

  • 设计要解决的是结构性的问题。数据结构、代码结构、接口定义,都涉及结构,所以都要关注。不影响结构的细节,在设计阶段知其大概就可以。

  • 设计要回答为什么。为什么选择这个方案,为什么不选择另一个方案。我经常发现“为什么不”是一个好问题。在设计过程中,要找到影响设计的关键点,每个关键点,至少提供两个选项,并说明为什么选择A而非B,这样才能把设计决策说清楚。

文档的具体形式,不一而定。

可以用思维导图,可以用Excel表格,可以用ppt,也可以手写手绘拍照存档。数据结构的描述,可以单独写文档,也可以直接引用代码。

三、项目管理

工作中经常要面对一个问题:这个事情什么时候能做好?

很多时候,挺难给出一个简单的答案。

把过程拆解开来看。

首先是确认目标

业务方经常只是给出一个笼统的描绘,需要先搞清楚其真正的诉求,搞清楚目标。

目标的描述,要从业务角度来进行。结合场景,描述要在系统中让用户能完成哪些事情,并把这些事情排出优先级。实际操作起来会复杂一些,不只是比较实现A和实现B哪个更重要,很多时候的比较是类似A这件事的体验从60分升到80分,跟B这件事从系统不支持到能支持(60分)的优先级。需要进行拆解,拆成比较小的条目,以便于比较,即WBS(Work Breakdown Structure)。

画用例图把用户诉求细化为具体的功能点、特性点,有助于找到用户的关注点,有助于安排优先级。除了功能特性,非功能特性,业务规模、性能、可用性、安全性,这些也需要了解,加到工作任务里面。

需要注意的是,拆解之后,我们不能忘记真正的目标,是为了实现业务目的,不要让自己迷失在繁多的功能点里面,忘记了本谋。

其次是工作量评估

从在巴克莱开始使用Scrum之后,我觉得Story Point这个方法挺好。根据业务对象的属性多少和复杂度等因素,综合评估,根据基准任务来进行规模的评估。例如,把一个不超过10个属性的简单对象的CRUD功能,设为基准,对应2个SP,其他任务就根据和它的对比来估算。一个任务的工作量估算值只能从1,2,3,5,8,13,21,∞中进行选择。

前端、后端、测试,各自评估自己的。

评估的工作量,包括设计、编码、自测、集成测试和问题修复,包括过程中所需的沟通、文档编写,从接受任务开始,到完成交付目标为止,需要完成的所有工作。团队里每个人都要对每项任务提供评估。

如果不同的人,提供的估算值相差很大,例如 3 vs 8,就需要沟通,这种情况,常见的原因有两个:1. 对任务的目标和边界理解不一致;2. 实现方案有重大分歧。

尽早发现问题,尽早沟通解决。

第三,才是排期

如果积累了数据,每个人每周能完成多少个Story Point,排期就比较容易。

项目的时间和人员经常是固定的,这时就需要根据每个任务的客户价值和工作量,综合评估优先级,选择项目范围。

现实中比较麻烦的是一个人同时在多个项目中。有不少人,特别是不具备软件研发背景的,希望工程师并行工作。一个人同时处理多个项目,分时并发,看起来很高效。但一个人在多个任务之间来回切换,思路切换,环境切换,都会产生消耗,而且很容易影响质量。

另外,任务之间的先后依赖关系,多人协作时的进度协调,关键路径和优先级的调整,这些都是日常要做的。小团队小任务,口头沟通就够了。中等规模的,甘特图这个古老的工具就挺管用。

这些都是常规动作。

在项目管理上,我看到的比较多的问题是两个。

一个是沟通不足,信息不对称。信息不对称的点很多,比较大的问题是一线员工只看得到眼前的具体任务,不了解背景和目标,对后续的工作安排没有预期。需要通过项目启动会、晨会、周会、部门月会等方式,一方面自上而下传递信息,另一方面也让一线员工有机会发出声音。这里有很多具体的工作要做,才能形成合力。

另一个是不复盘,不闭环。个人、团队,缺少复盘,没有从方式方法上进行改进,低水平重复。


我的套路,大体也就这些。

没有妙招,只是本手。具体的工具、方法,也非独创,都是业界十年前、二十年前、乃至更早就在广泛使用的,对很多人来说,基本功而已。

我的套路只是把这些基本功做到位,做扎实。

在现实中,无论个人、团队,只要把基本功做到位,就可以达到前20%,在市场上具备竞争力。

最后一点,无论流程、工具、方法有多好,承载研发体系的,是人。带团队,最重要的一条,是把人当人看,而不是工具或资源。关心队员的成长,关注他的喜怒哀乐,才能够真正建立信任,形成战斗力。

黄鹤

2023-03-18

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

左中右 三栏式 布局

一、中间 自适应&#xff0c;左右两边 宽度固定 方法1&#xff1a;box容器 Flex布局&#xff0c;center设置为 flex:1 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&q…

神经网络/深度学习(一)

感知机 多层感知机&#xff08;神经网络&#xff09; 误差逆传播&#xff08;error BackPropagation&#xff0c;简称BP&#xff09;算法 深度学习 卷积神经网络&#xff08;Convolutional Neural Networks, CNN&#xff09; 递归&#xff08;循环&#xff09;神经网络&#xf…

sonar覆盖率、代码覆盖率、分支覆盖率的计算方式

代码质量的覆盖率分为三种&#xff0c;覆盖率、代码覆盖率、分支覆盖率&#xff0c;那每一种的计算方式是怎么样的呢&#xff1f; 举例&#xff1a; 上面最有疑惑的是覆盖率&#xff0c;不知道怎么算出了来的&#xff0c;后面再说。 通过sonarqube可以分析出&#xff1a; 指标…

232:vue+openlayers选择左右两部分的地图,不重复,横向卷帘

第232个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目中自定义js实现横向卷帘。这个示例中从左右两个选择框中来选择不同的地图,做了不重复的处理,即同一个数组,两部分根据选择后的状态做disabled处理,避免重复选择。 直接复制下面的 vue+openlayers…

springmvc入门和两个配置类放置时的问题

springmvc 替换之前的servlet&#xff0c;用注解型标记进行操作的servlet类&#xff08;就是之前servlet类上面的Webservlet注解中参数&#xff1a;当前类的访问路径名&#xff09;&#xff0c;然后响应也用注解&#xff0c;据体如下&#xff1a; 先创建web项目 再导入需要的包…

边学边记——Java数据结构☞树和二叉树

目录 一.树 1.定义 2.一些基本概念 3.树的表示形式 二.二叉树 1.概念 2.两种特殊的二叉树 3.二叉树的性质 4.二叉树的存储 5.二叉树的遍历&#xff08;The traversal of A binary Tree&#xff09; 一.树 1.定义 树是一种非线性的数据结构&#xff0c;它是由n&#x…

1676_MIT 6.828 xv6中的CPU alarm_资料翻译整理

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 我觉得看了几个MIT的课程之后让我觉得我的大学四年有点浪费时光&#xff0c;看起来MIT的课程的确是很有饱满度。 这里&#xff0c;再整理一份课程中的作业要求。 …

每天分享五款工具,让你的工作办公更顺心

快乐不是在于拥有什么,而在于我们和别人分享什么。每天分享五款工具&#xff0c;让大家工作办公更顺心就是我最大的快乐。 1.绘画——Krita Krita是一款免费的开源绘画软件&#xff0c;适合专业和业余的绘画爱好者&#xff0c;支持多种画笔和图层。你可以使用Krita来创作各种…

HTTP与TCP区别

1、TCP对应与传输层、而HTTP对应于应用层&#xff0c;所以HTTP协议是建立在TCP协议之上的&#xff1b; 2、HTTP底层是利用TCP协议传输的&#xff0c;所以支持http也就一定支持TCP&#xff1b; 3、TCP是网络传输协议&#xff0c; HTTP是超文本传输协议&#xff1b; TCP是底层协…

Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例

场景 Java中创建线程的方式有三种 1、通过继承Thread类来创建线程 定义一个线程类使其继承Thread类&#xff0c;并重写其中的run方法&#xff0c;run方法内部就是线程要完成的任务&#xff0c; 因此run方法也被称为执行体&#xff0c;使用start方法来启动线程。 2、通过实…

盘点手机Type-c充电接口5个实用功能

目录 1、手机通过Type-c转HDMI&#xff0c;高清输出电视 2、通过OTG Type-c扩展手机功能 3、实现手机通过网卡有线上网 4、电脑通过手机Type-C有线上网 5、手机通过Type-C收听高清音频 今天给大家聊聊手机Type-c充电接口的5个实用功能&#xff0c;希望对大家日常使用…

Java每日一练(20230410)

目录 1. 二叉树的锯齿形层序遍历 &#x1f31f;&#x1f31f; 2. 从中序与后序遍历序列构造二叉树 &#x1f31f;&#x1f31f; 3. 平衡二叉树 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专…

UE4 Niagara 烟花制作工程

效果图&#xff1a; 第一个做的是网上射出的粒子&#xff1a; 用了事件&#xff0c;把ID给启用&#xff0c;不然会报错 第一个发射的炮弹粒子制作完成 第二制作炮弹的拖尾&#xff1a; 很明显会用到Ribbon 让宽度从宽到窄 让位置和颜色与第一个做的粒子一致&#xff0c;所以…

【分享】集简云审批支付助手,实现OA付款单自动到招商银行支付

场景描述 支付管理是企业财务管理中的重要一环&#xff0c;直接涉及企业现金流的管理和资金的运用。 在现代商业环境下&#xff0c;企业支付管理越来越复杂&#xff0c;许多公司都存在支付流程不规范、支付环节复杂的问题&#xff0c;导致企业支付效率低下。一方面&#xff0…

CocosCreator实战篇 |CocosCreator实现《飞机大战》

&#x1f4e2;博客主页&#xff1a;肩匣与橘 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由肩匣与橘编写&#xff0c;首发于CSDN&#x1f649; &#x1f4e2;生活依旧是美好而又温柔的&#xff0c;你也…

论文赏析——约翰·科斯塔斯:线性系统编码

© 1952 J. P. Costas © 2023 Conmajia 作者简介 约翰彼得科斯塔斯&#xff08;1923-2008&#xff09;&#xff0c;美国电气工程师&#xff0c;曾发明科斯塔斯环和科斯塔斯数组。科斯塔斯参加过第二次世界大战&#xff0c;并在战后进入麻省理工学院攻读博士学位&#…

Java反序列化漏洞及实例详解

目录 一、序列化和反序列化 序列化 用途 二、Java反序列化漏洞 数据出现 函数接口 漏洞发现 漏洞利用 三、Java序列化反序列化演示 四、靶场演示 一、序列化和反序列化 序列化 把 Java 对象转换为字节序列&#xff08;字节流&#xff09;的过程。 反序列化 把字节序…

WebRTC 系列(一、简介)

一、什么是 WebRTC WebRTC 全称是 Web RealTime Communication&#xff0c;是一个用于实时通讯的技术&#xff0c;Google 公司在 2010 年用 6829 万美元将其从 Global IP Solutions 公司收购&#xff0c;并于 2011 年开源&#xff0c;不得不说 Google 确实是一家伟大的公司&am…

uniapp 引入插件市场的echart插件,使用指南!+踩坑记录!!血泪史!!!

此文章适用于微信小程序中&#xff0c;在uniapp做的小程序中使用echarts 插件地址&#xff1a;echarts-for-wx - DCloud 插件市场 插件网页往下翻有详细的使用步骤&#xff0c;这里简短的贴上几张图片 以下是我 项目中的使用情况&#xff0c;分享给大家&#xff1a; 1.一键导…

网关和spring cloud网关技术Gateway

文章目录一、网关1.1 网关是什么1.2 API网关的作用二、Spring Cloud Gateway2.1 简介2.2 搭建步骤2.3 路由断言工厂2.3.1 什么是路由断言工厂2.3.2 Spring Cloud Gateway提供的11 种断言工厂2.4 网关过滤器2.4.1 介绍2.4.2 网关过滤器作用2.4.3 过滤器配置2.4.4 全局过滤器Glob…