($width) AND $width .= 'px';
$style = " style=\"width: $width\"";
}
$value = $value ? $value : date('H:i');
$s = " ";
return $s;
}
// form_date('start', '2018-07-05') 为空则当前日期
function form_date($name, $value = 0, $width = FALSE)
{
$style = '';
if (FALSE !== $width) {
is_numeric($width) AND $width .= 'px';
$style = " style=\"width: $width\"";
}
$value = $value ? $value : date('Y-m-d');
$s = " ";
return $s;
}
/**用法
*
* echo form_radio_yes_no('radio1', 0);
* echo form_checkbox('aaa', array('无', '有'), 0);
*
* echo form_radio_yes_no('aaa', 0);
* echo form_radio('aaa', array('无', '有'), 0);
* echo form_radio('aaa', array('a'=>'aaa', 'b'=>'bbb', 'c'=>'ccc', ), 'b');
*
* echo form_select('aaa', array('a'=>'aaa', 'b'=>'bbb', 'c'=>'ccc', ), 'a');
*/
?>组保留的标签 余下为需要删除的标签
unset($oldtag[$key]);
}
}
}
if (!empty($oldtag)) {
$tagids = array();
foreach ($oldtag as $tagid => $tagname) {
$tagids[] = $tagid;
}
well_oldtag_delete($tagids, $tid);
}
$r = well_tag_process($tid, $fid, $create_tag, $tagarr);
return $r;
}
// 删除标签和绑定的主题
function well_oldtag_delete($tagids, $tid)
{
$pagesize = count($tagids);
$arrlist = well_tag_find_by_tagids($tagids, 1, $pagesize);
$delete_tagids = array(); // 删除
$tagids = array();
$n = 0;
foreach ($arrlist as $val) {
++$n;
if (1 == $val['count']) {
// 只有一个主题
$delete_tagids[] = $val['tagid'];
} else {
$tagids[] = $val['tagid'];
}
}
!empty($delete_tagids) and well_tag_delete($delete_tagids);
$arlist = well_tag_thread_find_by_tid($tid, 1, $n);
if ($arlist) {
$ids = array();
foreach ($arlist as $val) $ids[] = $val['id'];
well_tag_thread_delete($ids);
}
!empty($tagids) and well_tag_update($tagids, array('count-' => 1));
}
// 标签数据处理 $arr=新提交的数组 $tagarr=保留的旧标签
function well_tag_process($tid, $fid, $new_tags = array(), $tagarr = array())
{
if (empty($tid)) return '';
// 新标签处理入库
if ($new_tags) {
$threadarr = array();
$tagids = array();
$i = 0;
$size = 5;
$n = count($tagarr);
$n = $n > $size ? $size : $size - $n;
foreach ($new_tags as $name) {
++$i;
$name = trim($name);
$name = stripslashes($name);
$name = strip_tags($name);
$name = str_replace(array(' ', '#', "@", "$", "%", "^", '&', '·', '<', '>', ';', '`', '~', '!', '¥', '……', ';', '?', '?', '-', '—', '_', '=', '+', '.', '{', '}', '|', ':', ':', '、', '/', '。', '[', ']', '【', '】', '‘', ' ', ' ', ' ', ' ', ' '), '', $name);
$name = htmlspecialchars($name, ENT_QUOTES);
if ($name && $i <= $n) {
// 查询标签
$read = well_tag_read_name($name);
if ($read) {
// 存在 count+1
$tagids[] = $read['tagid'];
} else {
// 入库
$arr = array('name' => $name, 'count' => 1);
$tagid = well_tag_create($arr);
FALSE === $tagid and message(-1, lang('create_failed'));
$read = array('tagid' => $tagid, 'name' => $name);
}
$tag_thread = array('tagid' => $read['tagid'], 'tid' => $tid);
$threadarr[] = $tag_thread;
$tagarr[$read['tagid']] = $read['name'];
}
}
!empty($threadarr) and tag_thread_big_insert($threadarr);
!empty($tagids) and well_tag_update($tagids, array('count+' => 1));
}
$json = empty($tagarr) ? '' : xn_json_encode($tagarr);
return $json;
}
?>return $r;
}
/**
* @param int $page 页数
* @param int $pagesize 每页显示数量
* @return mixed
*/
function link_find($page = 1, $pagesize = 100)
{
$arr = link__find($cond = array(), array('rank' => -1), $page, $pagesize);
return $arr;
}
/**
* @param $id
* @return bool 返回FALSE失败 TRUE成功
*/
function link_delete($id)
{
if (empty($id)) return FALSE;
$r = link__delete(array('id' => $id));
link_delete_cache();
return $r;
}
//--------------------------kv + cache--------------------------
/**
* @return mixed 返回全部友情链接
*/
function link_get($page = 1, $pagesize = 100)
{
$g_link = website_get('friends_link');
if (empty($g_link)) {
$g_link = link_find($page, $pagesize);
$g_link AND website_set('friends_link', $g_link);
}
return $g_link;
}
// delete kv and cache
function link_delete_cache()
{
website_set('friends_link', '');
return TRUE;
}
?> $v = implode(",", $v);
$temp[] = $v;
}
// 去掉重复的字符串,也就是重复的一维数组
$temp = array_unique($temp);
// 再将拆开的数组重新组装
$output = array();
foreach ($temp as $k => $v) {
if ($stkeep) $k = $starr[$k];
if ($ndformat) {
$temparr = explode(",", $v);
foreach ($temparr as $ndkey => $ndval) $output[$k][$ndarr[$ndkey]] = $ndval;
} else $output[$k] = explode(",", $v);
}
return $output;
}
// 合并二维数组 如重复 值以第一个数组值为准
function array2_merge($array1, $array2, $key = '')
{
if (empty($array1) || empty($array2)) return NULL;
$arr = array();
foreach ($array1 as $k => $v) {
isset($v[$key]) ? $arr[$v[$key]] = array_merge($v, $array2[$k]) : $arr[] = array_merge($v, $array2[$k]);
}
return $arr;
}
/*
* 对二维数组排序 两个数组必须有一个相同的键值
* $array1 需要排序数组
* $array2 按照该数组key排序
* */
function array2_sort_key($array1, $array2, $key = '')
{
if (empty($array1) || empty($array2)) return NULL;
$arr = array();
foreach ($array2 as $k => $v) {
if (isset($v[$key]) && $v[$key] == $array1[$v[$key]][$key]) {
$arr[$v[$key]] = $array1[$v[$key]];
} else {
$arr[] = $v;
}
}
return $arr;
}
?>
从汽车之家效能平台建设看汽车行业研发数字化之路-软件玩家 - 软件改变生活!
在促消费优惠政策、新能源汽车产品日臻成熟等多方利好下,国内汽车行业正处于持续增长:截至2022年9月底,全国机动车保有量达4.12亿辆,其中汽车3.15亿辆,连续三个月新增量超200万辆,每月汽车产销量亦同比增长显著。 汽车主机厂通过自建研发及整合外部技术供应商协作推进汽车营销、生产的数字化进程。在这一数字化进程中底层基建是各企业技术高管对研发团队的质量和效率把控,从研发过程把控、研发结果评估、研发资源评估三维对内部研发团队、外部技术供应商进行控制,推进主机厂数字化进程。 汽车主机厂在建设数字化转型过程中研发面临的挑战涉及到多端、多平台、软硬件结合等多样技术组合。
在营销侧与广告供应商协作多平台技术对接投放广告,通过自建大数据在中心追踪广告数据效果,与主机厂呼叫中心、门店销售验证邀约线索有效性,评估广告投放价值。 在销售侧多端APP和微信小程序的线上车主服务、品牌宣传、销售在线沟通需要主机厂研发团队整合经销商系统协作完成品牌、销售环节的数据交换和UI、UE的标准统一。 在生产侧,通过整合供应链管理系统、生产制造流程系统、车辆测试数据与车辆产品设计侧的车型数据、仿真数据,营销侧用户试驾反馈、购车意向收集等数据结合实现需求、设计、生产、验证闭环的数字化生产过程。
在面向数字化转型过程中,汽车之家逐步深化布局,服务链条覆盖看车、买车、用车多场景,定位从垂直媒体转变为衔接 C 端消费者、B 端主机厂、经销商等各汽车主体的汽车交易及服务平台。有着和主机厂车企相同的理解——向内看,规模与业务扩张意味着更高的组织复杂度,更高的信息沟通与协作成本;向外看,既有业务需要用更细分的场景和更高频的迭代保持用户粘性,新业务则需要在现有平台的数据与技术能力支持下快速起步,这对研发团队又快又好交付产品价值的能力提出了更高的要求。 在内外因素的共同影响下,汽车之家研发团队开始积极寻求组织级的效能提升,希望发挥整体效应,可以为整个行业提供参考借鉴。
汽车之家的研发工具演进
在研发工具的使用方面,汽车之家经历了以下几个阶段: 第一阶段:公司起步期,业务发展的速度最重要。研发各部门业务研发团队根据各自需求,采用不同厂商的工具或开源方案。 第二阶段:随着公司业务更加复杂,希望将部分管理逻辑在工具中实现,减少手动操作。为此,汽车之家尝试做了一些特定场景的自研工具,譬如项目管理工具、看板工具、OKR工具。但工具之间互相独立存在,以点状式铺开。 在这个阶段存在的问题:
各事业部研发工具不统一 先前,研发工具链由各事业部或从属于事业部的部门团队各自建设。 这一方面造成了极高的协同成本,有部分团队的任务分配和状态追踪,还在用相对原始的人工、邮件或会议等方式进行;若涉及到跨部门/团队的项目,则沟通协作更加困难。另一方面,优秀的研发实践也难以走出部门,在组织层面进行推广。 业务产研协作链条长 由于业务属性,汽车之家内经常存在同一业务服务 BC 两端或需要与其他业务协同的情况。需求来源多,反馈周期长短不一。研发部门往往被动接受需求,抱怨需求变更频繁、质量不高、数量不稳定;而业务方则常感到产研支持不足,进度难以感知。 效能现状说不清 工具不统一,意味着大量研发数据分散在不同工具中,且维度不一致。度量缺乏可信的数据基础,研发管理者便难以客观判断整体效能现状,并做出改进的决策。 现阶段,汽车之家效能平台团队开始主要聚焦做一站式平台化建设,完善研发的整体流程和效率的同时,也有效的形成了研发与业务部门的打通和数据关联 ,也为后续效能数据的提取和分析提供了一致性保障。
一站式协作效能平台的整体建设思路
一站式协作效能平台的建设不是简单的系统集成。汽车之家的效能平台建设围绕以下三个特点展开:标准化、可视化、可度量三个特点。
标准化:沉淀各团队共识,保障工具平台能用且好用
既然效能平台最终要让各个业务研发团队用起来,从建设的第一天起就不能关起门闷头干。汽车之家效能平台团队对各研发团队进行了调研,梳理当前研发流程,进而复盘抽象出标准化研发流程。这套标准化研发流程需要获得一线研发团队的认可,才能保障最终交付的工具平台可用。 汽车之家效能平台团队首先在协作效能平台上沉淀了一套覆盖业务、产品、研发、测试多环节的研发标准流程,通过流程规范和流程模板,能够让业务研发团队快速上手。
为了推动业务团队顺利迁移到研发效能平台上,汽车之家做了以下两方面工作:
汽车之家协作效能平台引入了传统瀑布式、敏捷 Scrum 等框架,以满足不同阶段、不同属性、不同大小项目的需要。同时,鼓励各团队根据实际情况,在基础规范之上进一步细化流程规范,例如二手车团队优先规范了需求阶段的评审物料完整度、研发阶段的任务拆解口径和 bug 率的定义。 在各业务研发团队使用过程中,效能平台团队也持续收集使用反馈,沉淀最佳实践,提炼共性需求,让平台更加规范、更加好用。
汽车之家以先前已经在组织层面推广使用的看板工具为切入点,带动各团队逐步将需求管理、项目管理、看板管理、文档管理等能力迁移至协作效能平台上。 为了让业务研发团队快速感受价值,协作效能平台也接入了 A-one 发布平台,方便团队管理从需求进入到发布的全生命周期,站在全局视角下改进交付效率。借助统一的工具平台,优秀的研发实践也能够走出部门和业务线,在整个组织范围内传播推广,并在其他团队快速落地。
可视化:以“事”为中心,让业务、产品、研发看到彼此
在协作效能平台的建设中,汽车之家以需求的标准化管理为抓手,以“事”为中心串联起业务、产品、研发三方。从OKR制定,到相关需求进入研发,到功能上线互相挂钩,使价值流动可视化,业务侧、项目侧和产品侧的同事都能直接感知到研发整体进度和关键状态进展。 这不仅解决了业务产研协作链条长,信息不透明导致协作体验不佳的问题,也有助于产研团队自身直观了解研发资源投入在哪些事项上,用精益思路合理调配有限的研发资源。
业务方面:OKR关联项目,产研进展透明
为了提高从业务到研发交付全流程的信息透明度,汽车之家的协作效能平台打通了项目管理系统和OKR系统。在分析O(目标)时,不只可以看到支撑的KR(关键结果),还可以看到哪些项目在支撑着组织目标的达成,在这些项目投入了多少资源、项目进展到哪一步、是否遇到瓶颈。业务侧对研发进度的感知加强了,协作体验也随之提升。
产品方面:需求归于一处,标准化、线上化
无论零散需求或项目需求,用户需求或产品规划需求,各类型需求统一汇总入需求池,统一排期、分类、整合、分发。并且业务团队可以通过需求查看该需求所花费工时、投入资源以及整个进展情况。 这一机制能够带动产品人员主动优化需求质量,邀请研发 Leader 左移提前沟通,减少变更和反复澄清,提升产研配合效率。
研发:统计任务与工时,合理匹配供需
一方面,统一约定任务拆解和估时口径,用任务数和任务大小来量化需求量级;另一方面,统计研发人员的有效编码产出时间,量化供给端的研发资源。 通过供需两端的标准化度量,能够以小时为颗粒度,精准了解研发资源投入在哪些需求上。 这带来了三点好处:第一,产品及研发双方可借此了解研发团队当前工作重心是否符合预期;第二,研发团队可综合考虑研发带宽和需求优先级,合理规划和分配任务;第三,零散的小任务可以穿插排期,提高研发资源的利用率。
可度量:度量不是目的,改进才是目标
基于统一的协作效能平台,汽车之家采集了维度一致、可信度较高的过程以及结果数据,开始逐步建立研发效能度量体系,量化评估分析效能现状。目前汽车之家主要关注研发的交付能力、效率与成本。
度量建设分步走
第一步,打通协作系统、业务系统、支撑端、基础系统数据链,在研发工具进行全流程埋点,收集效能相关数据。 第二步,建立汽车之家研发指标库,按交付效率、交付质量、交付成本、交付能力、持续改进等不同维度进行分类展示,对每个指标的口径、图形做了可视化展示。 第三步,度量分析,首先按照组织、项目维度、人的维度做了分析报表及优化建议,另外有的团队想看一些更细致和个性化的指标,后面会建设做自定义报表,可以快速查找放在自己的看板上,自行进行统计分析。以报告形式呈现给各团队、各业务方 第四步,避免为度量而度量,让度量驱动洞察改进。研发团队发现需要重点关注的指标后,会下探定位到存在较大改进空间的单点,例如某团队或某段时间,并组织分盘分析会议,讨论优化建议及改进方向。
指标选取与实践
关注指标组合
现阶段汽车之家比较注重交付效率、交付过程质量和交付能力、需求吞吐率等指标。在度量指标体系的设计过程中,需要留意不同类型指标的搭配组合:选取全局结果指标用于评估能力,局部过程指标用于指导分析改进,滞后性指标进行事后复盘。 比如:
需求交付周期、需求吞吐量是全局结果指标,可用于对交付效率进行整体评估。 交付各阶段耗时、需求变更率、需求评审通过率、缺陷解决时长是局部过程指标,可用于指导分析改进。 线上缺陷密度是滞后性指标,线上缺陷已经发生了,我们能做的就只有复盘、对缺陷根因进行分析,争取在下个统计周期内能让质量提升、指标好转。
通过研发成员的复盘,把经验和知识沉淀下来,就能够有针对性地扩展度量指标体系。 例如,我们通过分析复盘发现,需求吞吐量偏低,常常来自于同一时间处理的在制品(Work in Progress)过多,成员需要在频繁切换上下文,导致效率下降;而在制品过多的先行指标是需求积压上升。因此,当我们试图解决迭代实际完成的需求数量少于计划这一问题时,可以将在制品数量与需求积压数量也纳入度量。
引入代码当量
除了项目管理过程中的工时、需求、任务等常规数据,汽车之家通过思码逸引入了行业先进的编码环节工作量指标——代码当量,作为基础指标。 一方面,代码当量指标可以挤掉代码中的水分,避免代码移动、增删等行为带来工作量的大幅波动,比起行数指标更加科学合理,可用于统计周期产出、人均产出、缺陷密度等。 另一方面,代码当量指标直接解析代码的逻辑复杂度与重要性,不依赖规范成熟的研发流程,不受手工记录数据不全不准不及时的影响,健壮性较强。由于汽车之家正在建设并迁移至统一平台,研发实践有所调整,代码当量指标可用于及时发现数据偏差,牵引各团队关注研发流程规范,保障效能度量可信且健康。 例如,当代码当量显著偏低或偏高时,需要结合需求吞吐率和工时,下钻分析编码工作量是否合理。编码工作量不合理背后,可能是需求数量与质量问题,可能是有效编码工时不足,可能是技能栈不到位,也可能是提交不及时等研发流程规范问题。 试点团队下钻分析后,发现有效编码工时与需求数量存在优化空间。通过在研发全员参与需求评审前增加一轮产品与研发 Leader 的沟通,提前对齐信息,试点团队推动每季度人均会议时长减少 20+ 小时,多个产品的需求一次通过率提升,降低了产研的协作成本,使研发人员能够更专注于编码工作。 当前汽车之家的研发效能分析还处于初级阶段。效能指标数据越来越统一、丰富和标准化,同时也支持数据的下钻;通过协作效能平台,我们可以辅助业务团队提效降本,同时也可以促进我们的工具生态和研发方式不断迭代,这正是我们的价值。
写在最后
为应对日益严峻的内外部形势,汽车之家将持续深耕研发数字化升级,用先进研发工具武装团队,打造效能管理驾驶舱,数据驱动,降本提效,以在接下来的竞争中博取更大的主动权!
本文标签:
之家 之路 效能 汽车行业 汽车
更多相关文章 笔记本计算机待机后显示器,笔记本电脑休眠后一直黑屏怎么回事_笔记本休眠后屏幕一直黑屏无法唤醒如何解决-win7之家... win7系统自带有休眠功能,如果人不在电脑时会自动进入休眠模式,节省电源,如果要用电脑直接移动鼠标或键盘即可唤醒了。一位用户遇到一件奇怪事情,win7休
ddns客户端_NAS之路篇三:公网IP配合腾讯云DDNS实现外网访问NAS 前言 之前弄了一个矿机,里面放了1.5T的硬盘,然后完成了基础的配置,可以在内网中实现文件存储、家庭影院、设备同步与备份、照片共享、备份数据等几个较为基础的功能,这些在我的篇1和篇2中可以看到。链接如下: NAS之路篇一:矿机入门以及系统安
《黑神话:悟空》闪退、黑屏与错误代码全解:保姆级快速修复指南,在此恭迎天命人!让你重返取经之路! 作为一名程序员,我深知玩家在游戏过程中遇到的种种困扰,尤其是像《黑神话:悟空》这样的高品质游戏,对电脑配置和运行环境的要求更为严格。取经有八十一难&am
Linux 学习之路(一):Windows系统连接Linux系统云主机 引言 从今天开始,我会每天分享学习Linux的过程。我为了方便,就没有在电脑上安装虚拟机搭建linux系统。我采用的是购买云服务器,然后在windows电脑上远程链接。下次再介绍在虚拟机上安装CentOS. 工具 腾讯云Putty
西门子学习之路-01-WinCC软件与STEP7 软件安装 SIMATIC 学习-01-WinCC软件与STEP7 软件安装 提示: 安装WinCC工控软件与STEP7 软件不建议安装到本机电脑上,防止在后期操作不当导致电脑故障。使用虚拟也有助于后期虚拟机
苹果win7系统无线网络无法连接服务器,苹果电脑不能连接wifi怎么修复_苹果电脑wifi连不上解决步骤-win7之家... wifi是现在许多用户都很喜欢在电脑中连接使用的无线网络,不过近日有苹果电脑用户反映说有时候会遇到不能连接wifi的情况,这是怎么回事呢,可能是系统网络组件出现问题&
php汽车门户源码,discuz仿汽车之家门户带论坛源码 discuz仿汽车之家源码已新增整站源码直接在线安装 本模板采用蓝色调,使网站看起来更显专业和科技感。 模板有门户资讯频道和论坛页面,框架代码以及大部分模块代码手工编写,从而
荣耀手机wifi信号如何连接服务器,荣耀路由器怎么设置方法_荣耀路由器用手机怎么设置-WIFI之家... 下面给大家详细介绍,使用手机设置荣耀路由器上网的方法。 不管你用的什么型号的荣耀路由器,用手机设置它上网的时候,建议都按照下面的步骤来操作。 路由器进行线路连接 手机连接路由
系统之家xp服务器系统怎么安装,windowsxp系统之家系统详细安装步骤 网友们都深爱windowsxp系统之家,因为windowsxp系统稳定,兼容性好,运行速度快,是非常适合我们玩游戏使用的系统,那么
计算机怎么无线连接网络地址,笔记本在哪里连接wifi_笔记本电脑如何连接wifi-win7之家... 现在wifi随处可见,只要有wifi的地方,都可以连接wifi实现上网,那么就要先将电脑跟wifi进行连接,可是有不少笔记本电脑用户不知道在哪里连接wi
笔记本电脑找不到计算机配置,笔记本电脑收不到wifi的解决步骤_笔记本电脑搜不到wifi怎么设置-win7之家... 大家在使用笔记本电脑的时候,都会喜欢搜索无线wifi来连接网络上网,可是有不少笔记本电脑用户却反映说收不到wifi,导致无法连接上网,这该怎么办呢&am
苹果无线笔记本怎么连不上win服务器,苹果电脑连不了wifi如何解决_苹果电脑连不上wifi怎么回事-win7之家... 近日有苹果电脑用户在使用电脑的时候,反映说wifi明明是没有问题,可是就是连不了wifi网络,导致无法上网,想必很多用户也遇到过这样的问题吧&#
记C#学习之路(MSDN学习心得) HX 记C#学习之路 回首四年前,高中毕业步入大学校园,那时候的青涩贪玩,四年大学生活浪浪荡荡,到现在踏入职场,走进新的征程。
计算机工具栏变宽怎么还原,win7工具栏变宽了怎么办_win7工具栏大小调整方法-win7之家... 有时我们在操作电脑的时候,会出现一些误操作,比如不小心把工具栏给变宽了,那么win7工具栏变宽了怎么办呢,这是你没有把工具栏给锁定造成的
系统之家xp服务器系统怎么安装,系统之家教你如何用u盘装xp系统 现在有很多老电脑越用越卡,最后只能重装系统来解决一下,然而去修电脑的地方重新装要花好几十块钱,自己用光盘装又麻烦,所以小编来教大家如何用u盘装系统 工具
【爬坑之路一】windows系统下更新升级node版本【亲测有效】 前言 一定要看到最后!!! 项目开发中,需要升级 node 版本。本着不想卸载 node 再重新安装的原则,因为node 的环境配
[架构之路-177]-《软考-系统分析师》-17-嵌入式系统分析与设计 -2- 系统分析与设计、低功耗设计 目录 1 7 . 4 嵌 入 式 系 统 开 发 17.4.1 开发平台 1 . 交叉开发环境 2 . 交叉编译环境 17. 2 开发流程 1. 过程模型 2 . 分析与设计方法 17.4.3 软硬件协同设计 1 . 软 硬
联想拯救者Y7000系统安装之路(Win10系统) 最近新购得联想拯救者Y7000,到手的第一件事情就是重装系统,这个大家都懂的~~ 使用F2进入BIOS界面,使用F12可进入快速启动选择U盘启动。接下来问题来了&#
我的python学习之路 更多内容请见: python3案例和总结-专栏介绍和目录 文章目录 1. 入门阶段1.1 学习基础语法2. 进阶阶段2.1 数据结构2.2 文件操作2.3 异常处理3. 高级阶段3.1 面向对象编程(OOP)3.2 模块和包3.3 标准库4
服务器win10虚拟内存设置方法,win10虚拟内存怎么设置最好_win10虚拟内存设置多少好-win7之家... 当我们在使用win10系统的时候,可能会遇到内存不足的情况,这样就会导致无法正常运行一些软件和游戏,其实我们可以通过设置虚拟内存来缓解这个问题,那么wi
发表评论