array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 数据说话,锅别都让程序员背 - 爱码网

背景

数据说话,锅别都让程序员背

如何提升组织效率一直是阿里巴巴追求的目标之一,云效作为企业一站式协同研发云,积累了丰富的研发活动相关数据,如何利用这些数据,来助力于组织的研发效能提升,也是企业一直思考的问题。从2016年开始,云效(在阿里内部叫Aone)就开始逐步的对组织的研发数据,从团队,组织,项目等各个维度,按照研发实践流程进行改进的思路,结合了敏捷和过程改进的理念,逐步沉淀出云效的度量产品。并且真实的在不少阿里的团队,通过数据驱动的方式,辅助了团队效能提升。

我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=n7gh3gne&utm_source=n7gh3gne

1. 效能度量的基本思路和理念

1.1 如何透明研发效能 - 主观预测 VS 确定分析
数据说话,锅别都让程序员背

云效度量产品的基本思路是: 透明研发效能,诊断研发瓶颈,辅助研发提效。 就像医生看病,首先得找到问题,才能解决问题。

我们追求的高效研发: 更好的质量,更短的交付周期,更高的效率,更准的承诺兑现。但往往我们都很难去定量的描述,我们的质量,效率,交付到底如何。 所以,就像一个镜子一样,将研发效能透明出来,通过数据化的方式来定性的分析,是我们研发效能提升的第一步,也是最重要的一步。
数据说话,锅别都让程序员背

通过数据化的手段,可以让我们从主观的预测转变成确定性分析。 那哪些指标对于我们定性的去分析是非常有效的指标呢?

1.2 有效的研发度量指标 - 质量,效率,进度,人员
数据说话,锅别都让程序员背

我们从度量的需求中会把指标分为4各大类:质量,效率,进度,人员。

(1)需求的吞吐量 – 大体反应出团队的产出趋势。

(2)需求的平均完成时长 - 需求从创建到终态的平均时长,时间越多,需求交付粒度越小效率越高。

(3)新增缺陷的数量 - 统计时间段内团队被新增指派的缺陷数量,结合存量缺陷以及缺陷平均解决时长,反应团队产品的质量以及对于缺陷解决的效率。

(4)缺陷的平均解决时长 - 缺陷从创建到解决的平均时长,表征解决缺陷的效率。

(5)线上发布的成功率 - 线上发布成功次数与总次数之比,越高证明产品上线质量越高。

(6)缺陷的reopen率 - 缺陷被reopen的次数与缺陷数目之比,该值越高证明修复缺陷的质量越差,reopen率是表征产品质量的一个重要指标。

2 怎么用数据 -- 一个案例分享

我们会用2016年张冠楠同学在阿里的某事业部内部通过Aone的度量产品推动效能提升的过程来给大家具体的介绍一下,拿到了这些数据,我们会怎么样去用数据来帮助我们分析瓶颈并找提升的关键的。

我们利用数据通常会有以下4个步骤:

1)通过团队效能趋势透明当前团队的效能现状

2) 通过具体的人员分析来定位效能瓶颈

3)针对具体的瓶颈给出改进策略

4) 通过持续的度量来确定是否改进生效

2.1 通过团队效能趋势透明当前团队的效能现状

阿里某研发团队,20+人问题:交付老Delay,团队士气不高,老加班,质量差。 让我们来看看当时他们的度量数据:
数据说话,锅别都让程序员背

上面几张图比较容易看出来这个团队明显特征是

(1)3月份完成需求数明显上升,且团队负载较重

(2)质量不高 - 缺陷数、reopen率以及线上发布成功率

(3)需求平均完成时长特别长 ,很多需求都是很久之前的3月份才完成

(4)突增故障

2.2 通过具体的人员分析来定位效能瓶颈

带着数据,走进了团队,和团队一线研发人员进行访谈,也对整个数据中的具体数据去做了细分,我们可以看到整个团队存在的问题:

1)到底需求时间长,是卡在PD,还是开发还是测试? 是否相应的团队可以去改进。

2)任务负载重,是否可以将任务分配更合理。 分配不均,单个人容易成为整个团队的瓶颈。

3)质量差,原因是什么?

通常这些瓶颈的定位是不能通过趋势来告诉我们,必须的深入到团队中,这个时候按照人员分布的度量报表就能方便的帮助我们定位到瓶颈人员。
数据说话,锅别都让程序员背
数据说话,锅别都让程序员背

2.3 针对具体的瓶颈给出改进策略

当我们发现了瓶颈和问题,就要针对性的进行改进。 具体的改进方法,敏捷有很多的实践,这里不做多阐述,文章的最后加了不少集团敏捷团队的最佳实践传送门,大家可以参考

数据说话,锅别都让程序员背

2.4 通过持续的度量来确定是否改进生效

最后,我们要持续的关注度量数据来帮助我们进行跟踪,是否我们的改进能够真正的解决问题。 如果我们改进得体, 团队整体效率和质量提升必然会在度量数据上有所体现。
数据说话,锅别都让程序员背

3. 关于数据的一些注意事项

3.1. 数据只是手段,是帮助我们去诊断,而不是衡量。

可能有的人会质疑,度量的数据是不是要去衡量一个人,其实,这个不是数据度量的目标,目标是找到我们怎么去做改进。所以轻易拿度量的数据来衡量人,尤其对于不同的团队和研发模式,其个人的研发数据往往会有较大的区别

3.2. 学会利用数据,不要被数据所利用

之前听云效的敏捷教练张迎辉分享在yahoo做的一个活动,为了调高研发质量,要求所有的研发必须在提交代码之前通过UT,结果就有的团队直接写空的UT,还有的无论UT是成功或者失败都直接在UT中返回成功。这个和数据度量是类似,如果大家都追求数据好看,肯定有各种方法把数据做好看,但是这不是我们所追求的,数据是面镜子,只是用来发现问题,所以,还是那句话,我们要利用数据,不要被数据所利用。
数据说话,锅别都让程序员背




阅读原文

相关文章: