干货 | 汽车行业研发效能提升的挑战与实践案例

在 9 月 15 日的第七届 CSN 大会上,思码逸研发效能专家王艳萍受邀分享了《汽车行业研发效能提升的挑战与实践案例》。演讲包含了思码逸对多家汽车企业服务过程中总结出的行业痛点、解决方案,以及实践案例。

以下为演讲实录:

思码逸与很多知名汽车企业都有合作。我们这次的演讲会先简单介绍一下思码逸,然后重点分享我们与汽车企业在研发效能层面的实践,汽车软件研发效能与传统软件研发效能的差异,以及在汽车行业中,软件研发效能度量的痛点与解决方案等。

思码逸成立于 2018 年,专注于软件研发效能度量与分析。基于深度代码分析技术,思码逸产品从代码和 DevOps 工具链中提取数据,呈现研发效率、软件工程质量、组织与人才发展等多视角数据洞察,提高研发过程可见性,辅助团队决策,推动开发者自驱成长。

思码逸独有的研发效能指标“代码当量”已经作为核心指标,被信通院采纳。我们也受信通院邀请,与京东、腾讯、百度、网易等等 40 多家公司,一起起草了《软件研发效能度量规范》

我们目前服务了上百家企业,其中来自汽车行业的包括理想、蔚来、宝马、保时捷、沃尔沃等。

汽车行业的软件研发效能特征与挑战

相比传统的软件研发,汽车软件的研发会更加复杂,主要体现在两方面,一方面是项目复杂,另一方面是人员复杂。

首先,项目方面存在以下特点:

体量大:规模大、交付周期长,子项目类型多

版本众多:为了适配各种硬件,需要更多版本,所以每个版本中的模块复用度高。一旦模块底层需要修改,那么带来的技术维护难度大,所以有更高的质量要求。

嵌入式开发:软硬结合的开发方式,在软件测试时,需要适应物理环境及硬件接口,所以会导致测试效率比传统软件开发要慢。

安全性要求高:相比传统软件开发,汽车软件对安全的要求非常高, 包括功能安全、网络安全等,一旦出现问题,就可能危及用户生命。

由于项目的复杂度高,所以相应地会在人员上带来更高的复杂度,主要体现在两方面。一方面是人员构成比较复杂,不仅有公司内部的研发团队,还有外包团队。在人员岗位上,除了传统的前端、后端、算法,还会包含嵌入式开发等硬件相关的研发人员。

基于以上特点,汽车软件研发对效能度量的要求会比较高。我们总结了一下我们客户经常遇到的研发效能度量的诉求。

首先由于研发项目体量大,所以即使效率提升一个百分点,也可以节省巨大的成本。所以第一个诉求就是“提升整体效率,做更准确的需求预估”。另一个诉求,就是“及时判断卡点,找到影响交付速度的关键因素”,从而提升项目整体的效率。

因为整个软汽车行业对安全可靠性的要求非常高,这就要求我们能在整个研发过程中及时地发现问题,保证可以在最终测试和交付之前解决掉关键问题,而不是在最后发现问题,再回过头去修改。

在人员管理方面,主要诉求就是“建立考核标准,制定研发流程规范”,通过科学的方法来管理复杂的团队。

最后从项目和人员管理两个角度综合来看,还有一个诉求就是“合理调配资源,避免忙闲不均或者资源错配带来的浪费”。

由这些诉求出发,结合我们与多个汽车企业合作的经验来看,我们可以看到汽车行业做研发效能度量的四个难点:

  • 第一,数据分散。研发数据可能分散在多个不同的工具中,整合数据是一个难点。

  • 第二,缺少可靠的数据基础指标。例如要统计这个工时内完成了多少需求、功能点,这些数据的填写大多是依赖个人主观判断的,所以没有统一的标准,那么这就给后续的数据分析带来难题。同时,还有大量的代码复用、功能点大小不一等问题,都是由于缺少基础的指标。

  • 第三,分析维度、视角多。一个项目可能会涉及到多个子项目、版本,每个子项目背后可能还有不同的团队、不同的人。在团队中,高层、中层对项目的关注点都不同,所以会涉及到非常多的维度和视角。我们有很多客户都是说“我们有很多指标,但就是用不起来”,其背后的原因就是因为你给出分析结果,并不一定是这个管理者或角色他想看到的。高管不希望看到那么多细节信息,而基层管理者却希望从细节中发现改进点。

  • 第四,定位问题困难。由于项目周期长、项目复杂度高,甚至可能还会涉及到较多的外包资源,所以很难快速地定位问题。

解决方案与实践案例

我们为汽车行业提供了这样一套解决方案,如下图所示。我们从数据采集、建模、指标体系,到分析,提供了一套全流程的度量与分析平台。我们已经把常用的代码仓库、项目管理工具、质量扫描工具和 CI/CD工具的数据接口打通了,可以通过简单配置就将数据接入进来。如果你使用的是我们还未支持的工具,也可以通过 CSV 的形式将数据导入到平台中。我们的平台会清洗数据,并基于数据建模输出事务管理、代码效率、质量管理等模型。

在平台中,我们根据对上百家企业的服务经验,默认预置了 100+研发效能指标,根据你的模型会推荐一些指标,并支持用户自定义指标。

在分析层面,我们支持根据不同角色进行多维度的数据展示和分析。如果是需要了解更多细节信息的管理者,还可以针对数据进行下钻分析,直至找到问题的根源。

另外,我们还提供一些行业基线和组织基线,让你可以知道目前团队的研发效能、项目质量在行业中所处的水平是怎样的,以及与自身相比是否在持续进步,甚至于公司内其他团队相比处于什么样的位置。为了让管理者更容易去分析数据,我们还在平台中提供了智能专家系统,来辅助解读数据指标和现状。

我们已经把大部分的高频指标都放在平台中了。我们简单介绍一下核心指标“代码当量”。大家可以将它理解为与“代码行数”对标的一个指标。但是代码行数可能会遇到空行、注释、第三方引用等。这让代码行数无法真实体现产出效率。“代码当量”是基于深度代码分析专利算法产生的,它会将代码书写过程中这些“水分”挤掉,而且这套算法的计算机制较为复杂,所以很难造假,可以提供更客观的度量数据。

下面我们举几个例子。我们平台提供了 30 多种图表的展示,图中的一些异常点都可以直接点击进去看更深层的数据,进行下钻分析。用户可以根据不同管理者的需求定制自己的看板。比如高层关注整体的指标,可以看 ROI、整体交付速度、交付效率,以及资源配置是否均衡等。

对于项目经理或团队 Leader,可以关注团队的项目进展等更细的数据。例如下图左边的交付效率中,处于右下角的“后端团队”的交付效率就比较低,那么点击它,就可以进一步下钻寻找原因。那这个原因到底是什么?有可能是某一个地方遇到了卡点,或者是这个需求涉及的产品设计时间比较长,也有可能是需求颗粒度不稳定,所以他交付的需求少,还有可能是遇到了比较大的 Bug 需要较长的时间修复。这些问题都可以从下钻分析中发现。

从质量层面,我们可以看整体项目上线的 bug、事故数量,代码的内建质量,以及bug 的修复工作量。我们也会推荐一些重点关注的函数,比如某些代码的圈复杂度比较高或被引用次数比较多,那么会优先推荐进行一些测试。

以上就是对于思码逸解决方案的一个大致的介绍。接下来,我们来看一个汽车行业的实践案例。

这个案例源自某个车企,他们的研发规模有 200 多人,他们有很大比例的外包人员,所以他们希望可以准确预估整体的工作量,并建立对外包供应商的评估体系。他们原先使用“事故点”、“工时”去评估需求颗粒度,这对于资源需求以及如何调配来讲,缺少客观参考信息。针对这个问题,我们基于代码当量,量化了需求颗粒度,保证需求颗粒度的稳定性,并且估算研发交付的带宽。

另一个问题就是,他们有大量的外包团队,他们对这些团队的管理不是很到位,缺少体系化的度量,无法准确判断外包整体的效率。针对这个问题,我们基于代码当量,帮助他们设计了一个供应商评分体系。

如下图显示,我们可以理解为这就是通过代码当量来计算出的研发产能。图中显示的是代码产能与需求个数的拟合曲线。拟合优度大于 60%的时候,就代表这个团队的工作产能是可预测的。对于不可预测的团队,我们可能要去找原因,为什么这周产出多,下周产出少。如果大家都处于比较稳定的水平时,就可以知道每个团队交付的贷款是多少。

另外一点是从需求的角度进行分析。如下图右侧所示,你可以看到一些稳定性较高的需求,我们可以通过他们来预估各个需求的工作量。根据刚刚的交付贷款和工作量的预测,就可以计算出应该怎么做资源的配比。

下面这张图是我们基于客户的需求设计的评分体系。比如在产能方面,我们不只是看代码当量的产出,还会看代码活跃度;在质量方面会看发版的质量、底层的质量,这样可以一目了然每个供应商的表现如何。

现场Q&A

提问  对于需求工作量的预测,你们是基于什么逻辑来做的?如果要预测需求的工作量,对我们的要求是什么?

回答  这里讲的需求更多是开发的需求。由于每个产品经理拆需求的时候大小不一。所以我们的逻辑是,基于代码当量,来度量一遍历史的需求,能看出每个需求的代码当量是多少,比如这个需求是 1000 当量,另一个是 500 当量。如果需求的当量相对稳定,那就可以预估之后这个需求大概是怎样的量级,它的偏差幅度在 10%-20%以内,是可以评估这个需求大概需要多少工作量。然后结合我们对团队交付能力的评估,比如一个团队一周能交付 500 当量,或 1000 当量的代码,那么这个需求就需要这个团队一周的时间来完成。

如果发现需求拆分的颗粒度大小不一,那么就需要溯源,查找原因,调节拆分需求的逻辑和方法。

可访问 链接 获取 演讲PDF

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

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

相关文章

spring的ThreadPoolTaskExecutor装饰器传递调用线程信息给线程池中的线程

概述 需求是想在线程池执行任务的时候,在开始前将调用线程的信息传到子线程中,在子线程完成后,再清除传入的数据。 下面使用了spring的ThreadPoolTaskExecutor来实现这个需求. ThreadPoolTaskExecutor 在jdk中使用的是ThreadPoolExecutor…

Python实现MYSQL蜜罐

1 LOAD DATA INFILE介绍 首先开启一个Mysql,看一下mysql是如何读取主机文件的。 1.1 linux搭建mysql 1)docker运行mysql 2)启动Mysql docker run -itd…

【开发工具】idea 的全局搜索快捷键(Ctrl+shift+F)失效

文章目录 前言1. 取消 输入法的快捷键(推荐使用)2.更改 idea的快捷键3. 热键占用总结 前言 当你发现在idea 中看到用于全局搜索的快捷键就是 CtrlshiftF,可是怎么按都不管用的时候,你就不要再执着于自己的操作继续狂点电脑按键了…

Lnmp架构之mysql数据库实战1

1、mysql数据库编译 编译成功 2、mysql数据库初始化 配置数据目录 全局文件修改内容 生成初始化密码并进行初始化设定 3、mysql主从复制 什么是mysql的主从复制? MySQL的主从复制是一种常见的数据库复制技术,用于将一个数据库服务器(称为主…

解决Permission is not allowed后基于Ubuntu23.04安装配置docker与docker-compose

参考:Docker官网-Install Docker Engine on Ubuntu 虚拟机里安装ubuntu-23.04-beta-desktop-amd64,开启SSH(换源、备份),配置中文以及中文输入法等 基于CentOS7安装配置docker与docker-compose 一、 Install using the Apt repository 1.…

线性代数的本质(七)——特征值和特征向量

特征值和特征向量 本章特征值和特征向量的概念只在方阵的范畴内探讨。 相似矩阵 Grant:线性变换对应的矩阵依赖于所选择的基。 一般情况下,同一个线性变换在不同基下的矩阵不同。仍然以平面线性变换为例,Grant 选用标准坐标系下的基向量 i…

fastjson远程命令执行

fastjson远程代码执行 漏洞原因:fastjson在对json字符串反序列化的时候,会读取到type的内容,将json内容反序列化为java对象并调用这个类的setter方法。 1、搭建rmi服务 直接利用jndi-exploit工具 2、抓包改为POST。开启nc监听、发包 PO…

贸易战的影响:跨境电商的“黑洞”风险与机遇

当今全球贸易局势充满了不确定性和动荡。贸易战的阴云笼罩下,跨境电商企业面临着前所未有的挑战,但与此同时,也蕴藏着巨大的机遇。本文将深入探讨贸易战对跨境电商的影响,以及企业在这个新现实中如何应对风险并寻找机遇。 贸易战的…

快手商品详情数据API接口【关键词搜索商品列表数据】APP端商品详情数据

快手商品API接口是快手电商平台为开发者提供的一组接口,允许开发者通过程序代码访问快手电商平台的商品数据,实现商品信息的获取等操作。以下是快手商品API接口的一些常用功能: 获取商品列表:通过该接口可以获取店铺或分类下的商…

npm常用命令系统介绍

npm常用命令系统介绍 npm helpnpm initpackage.json 文件package.json 文件属性说明默认 package.json 文件--参数[-yes|-y]设置 package.json 中字段的默认值package-lock.json 文件 npm [config|c]设置源 npm [install|i]可选参数:全局安装的特性 包的删除npm uni…

Vue3 - 实现动态获取菜单路由和按钮权限控制指令

GitHub Demo 地址 在线预览 前言 关于动态获取路由已在这里给出方案 Vue - vue-admin-template模板项目改造:动态获取菜单路由 这里是在此基础上升级成vue3和ts,数据和网络请求是通过mock实现的 具体代码请看demo!!! 本地权限控制,具体是通过…

(总目录)springboot - 实现zip文件上传并对zip文件解压, 包含上传oss

全文目录,一步到位 1.本文概述1.1 本文简介 2. 功能实现2.1 统一文件校验2.2 普通(多)文件上传[服务器]2.2.1 controller层2.2.2 service层2.2.3 业务impl实现类2.2.4 FileIOUtils工具包代码 2.3 zip文件的解压2.4 图片文件的压缩2.5 oss文件后端上传2.6 oss文件前端上传2.7 后…

matlab读写json文件

Background 通常,在matlab中使用mat文件进行数据存储。MAT文件是MATLAB中用来存储数据的二进制文件格式。MAT文件可以包含各种数据类型,包括数字、矩阵、向量、结构体、字符和函数等。但是,当和其他语言有交互时,mat文件会不太方便…

golang实现远程控制主机

文章目录 ssh原理使用golang远程下发命令使用golang远程传输文件 ssh原理 说到ssh原理个人觉得解释最全的一张图是这张华为画的 Connection establishment 这一步就是建立tcp连接 version negotiation 这一步是ssh客户端(连接者)和被ssh服务端(连接者)进行协议的交换&#xf…

Jetpack Compose 的简单 MVI 框架

Jetpack Compose 的简单 MVI 框架 在 Jetpack Compose 应用程序中管理状态的一种简单方法 选择正确的架构是至关重要的,因为架构变更后期代价高昂。MVP已被MVVM和MVI取代,而MVI更受欢迎。MVI通过强制实施结构化的状态管理方法,只在reducer中…

控制台日志打印console的封装,加入美化、行显示与打印开关,支持node.js环境

控制台日志打印console的封装,加入美化、行显示与打印开关,支持node.js环境 为什么要写这个? 封装这个控制台日志打印工具,主要是在项目中自己做的SDK需要提供给其他开发人员使用,加入了日志美化和打印打开&#xff…

【数据结构】顺序表与ArrayList

作者主页:paper jie 的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精…

【云计算】虚拟私有云 VPC

虚拟私有云 VPC 1.前言1.1 基本介绍1.2 VPC 的作用1.3 VPC 的适用人群 2.VPC 基本概念2.1 VPC 相关基本概念2.2 其他相关基本概念 3.VPC 通信场景3.1 VPC 内部互通3.2 VPC 间互通3.2.1 对等连接3.2.2 Transit Gateway 或者云联网 3.3 访问 Internet3.3.1 Internet 网关3.3.2 NA…

【HCIE】04.网络安全技术

端口隔离 在同一VLAN中可以隔离二层与三层通信,让同VLAN内的设备可以通信或者不可以通信。 定义一个端口隔离组,在一个组内无法互访,不在一个组里面可以进行互访 port-isolate enable group1 //使能端口隔离功能 port-isolate mdoe all //全…

B : DS顺序表--连续操作

Description 建立顺序表的类,属性包括:数组、实际长度、最大长度(设定为1000) 该类具有以下成员函数: 构造函数:实现顺序表的初始化。 插入多个数据的multiinsert(int i, int n, int item[])函数&#…