当前位置: 首页 > 编程日记 > 正文

CODING 最佳实践:快课网研发效能提升之路

快课企业移动学习平台是上海快微网络科技有限公司自主研发的企业级 SaaS 平台,提供移动学习、考试练习、培训管理、知识分享、统计分析等学习和培训功能,为员工、经销商及客户等全价值链合作伙伴提供全面的知识服务。
本文将详细介绍快课网的研发团队是如何使用 CODING 研发管理系统提高研发效能。

为什么选择 CODING

快课网从创立至今已有 4 年多,作为一个规模比较小的创业团队,我们一直在寻找和尝试各种能提升研发效能的管理方案,这样能够帮助团队节省时间,更加专注于业务。

第一步就是上云,我们一开始使用的是阿里云,通过容器化、弹性计算和可视化管理帮助我们节省了不少运维成本。但是仅有这些还不够,要开发还需要搭建很多服务,例如 BUG 跟踪管理、代码版本管理和同步、npm 私服、maven 私服、docker 私服等等。虽然后台团队通过使用 docker 让搭建服务方便了不少,但是我们还不满足。大量的服务为研发团队带来了极高的管理成本。再加上不菲的服务器成本、所使用的开源项目更新较慢等原因导致很多问题短时间内都解决不了,同时很多管理方案还不支持中文。所以我们决定寻找一个集成度比较高的国内的商业平台来帮助我们进行研发流程管理。当时的想法很简单,只要功能齐全,收费能够弹性一些就好。在尝试了很多平台之后,我们最后决定使用 CODING,主要是看中 CODING 的网络连接速度比较快,界面简洁,交互比较友好,功能齐全,反馈处理也非常及时,可以很好地帮我们解决代码托管和 BUG 管理等研发流程问题。

我们最开始使用的是 CODING 个人版的团队功能,在 CODING 推出企业版之后我们团队很快迁移到了企业版,相对于个人版来说企业版功能更完善,管理起来也更方便,后续还有持续集成和部署相关功能升级,这些功能正是我们团队所需要的。目前快微团队的整个开发是在 CODING 和阿里云上完成的,CODING 主要用来管理代码、里程碑和持续集成等研发流程。

版本规划与任务流程

里程碑是我们使用比较多的功能之一。最初,我们使用 CODING 的里程碑来规划版本,比如 1.0 版本对应的里程碑就叫做 1.0,每个任务都是版本中的功能点。后来由于新版本的重构采用了分布式服务化开发,由多个子项目组成。由于各个子项目地版本相对独立导致粒度太细不方便产品的规划,便做了一些调整。目前里程碑主要是用来做长周期的规划,每一个任务都是一个小的项目,由一个或多个人来完成,比如将课件服务 1.1 版本分就单独为一个任务。

快课技术团队目前的绩效考核也是基于 CODING 的任务管理和里程碑实现的:

  1. 由产品发布相关版本的产品说明书,包含原型图和功能点文档部分。
  2. 创建任务,分派给项目负责人,项目负责人需要评估任务的工作量。工作量给定的有参考标准,将最简单的帐号密码登录接口的工作量定为 1,最小为 1。评估工作量之后进行审核,确定起止时间和奖金。
  3. 进入开发阶段,开始倒计时。
  4. 开发完成之后进行验收,由技术审查代码(每次发起合并请求也有审查),产品检查 UI 交互,顺利完成验收则关闭任务,将工作量的值作为绩效值。对于不能按期完成的任务,进行惩罚措施,每逾期一天扣 10% 绩效。

对于工作量比较大的任务,可以由一个人主要负责,多人完成,负责人需要为每个人安排详细的工作内容,最终由负责人按贡献比例分配绩效和奖金。这样累计下来,每半年或一年可以根据绩效进行一次评定,给表现好的员工涨薪。

分支管理

快课目前的分支管理方案与 CODING 文档中的最佳实践比较接近,master 作为主分支只发布正式版本,新增一个 dev 分支作为开发中的分支,并且同时对这两个分支设置保护,禁止直接推送代码到这两个分支上。

快课的每个子项目都在项目配置文件里写有明确的版本号,后端 maven 项目写在 pom.xml 中,前端 node 项目写在 package.json 中。开发中的版本号一律带有 SNAPSHOT 后缀,以表示这是快照版本,会不断发生变化,不能在生产环境使用。比如正在开发 1.1 版本,此时 master 分支的版本号是 1.0.0(随着补丁的增加,最后一位也会不断增加,比如版本号有可能为 1.0.9),dev 分支的版本号是 1.1.0-SNAOSHOT。

当需要开发一个新版本的时候,首先基于 dev 分支新起一个分支,可以根据实际情况来命名新分支,比如可以叫 dev-v1.1 或者 dev-tom 等等,没有限制。在新分支上完成开发之后,在 CODING 上发起合并请求申请合并到 dev,此时合并请求的标题和内容必须写的详细一些,审核之后进行合并,合并的同时删除原分支,只在 CODING 上保留 master 和 dev 两个分支。

最终所有新开发内容都完整合并到 dev 分支后,测试通过,再从 dev 分支新起一个分支,更改版本号为正式版本号,进行推送并新建合并请求,合并到 master 分支上。

对于已经上线的版本,如果有 bug 需要修改,则从 master 分支新起分支进行修改,完成后将版本号最后一位 +1,然后推送并新建合并请求合并到 master。

持续集成

我们团队很有幸获得了 CODING 持续集成功能的内测资格,之前也有尝试过自建 Jenkins 服务,对持续集成有一定积累能很快上手,于是我们便开始转向 CODING,毕竟一站式的 DevOps 工具链服务更方便,可以给研发团队节省很多精力。

CODING 对 Jenkins 进行了封装,只需要在项目根目录下创建一个 Jenkinsfile 文件,配置好之后推送上去,推送完成之后在后台开启持续集成即可。持续集成主要用在后端 maven 项目上,来做规范检查(checkstyle 插件)、单元测试和代码质量检查(spotBugs 插件),这样当团队成员在创建合并请求时,管理者可以看一下代码是否规范并跑通了必要的测试,在 CODING 上构建成功后才能继续对修改进行审查。

自动化构建为研发提供了很大的便利,避免了一些人为的不稳定因素,也为项目管理者节省了不少时间。

目前快课的项目都是直接发布到 docker 私服上的,推送成功之后修改 k8s 中的镜像版本来完成自动部署。我们也期待 CODING 未来会上线的部署管理功能,能支持在目前的构建基础之上自动发布 docker 镜像,然后再自动更新 k8s 相关配置的镜像版本,补充 CI/CD 功能,这样的话就能更好的实现研发流程的自动化了。

点击立即体验一站式 DevOps 工具链

相关文章:

基于chyh1990/caffe-compact在windows vs2013上编译caffe步骤

1. 从https://github.com/chyh1990/caffe-compact下载caffe-compact代码; 2. 通过CMake(cmake-gui)生成vs2013 x64 caffe工程; 3. 从https://github.com/google/protobuf下载ProtoBuf,解压缩,编译ProtoBuf&#xf…

菜鸟学***——菜鸟的旅程

第一章.菜鸟的旅程作为一个典型的菜鸟,第一次去网吧上网我不知道怎么开机是很正常的事情,但是无论怎么菜怎么无知也无法阻止我对于***的崇拜,我喜欢他们的那种神秘和在我们普通人眼中的无所不能,在网络世界里他们就想鱼…

程序员假冒AI,印度公司竟骗取2亿元投资

作者 | 神经小姐姐来源 | HyperAI超神经(ID:HyperAI)人工智能界有句调侃的话——「有多少智能,就有多少人工」,今天,印度的一家人工智能公司就印证了这句话。据《华尔街日报》报道,印度创业公司…

Windows7上使用VS2013编译Caffe源码(不带GPU支持)步骤

1. 从https://github.com/BVLC/caffe/通过git clone下载caffe源码,master分支,版本号为09868ac:$ git clone https://github.com/BVLC/caffe.git ;2. 先使用cmake-gui构建生成vs2013工程,发现有很多错误,提示缺少各种依…

区块链之比特币的潜在激励

想知道更多区块链技术知识,请百度【链客区块链技术问答社区】链客,有问必答!! 比特币,这个建立在开放P2P(点对点)网络结构之上的货币(文献9),继续享受人们的追…

每天超50亿推广流量、3亿商品展现,阿里妈妈的推荐技术有多牛?

作者 | 夕颜出品 | AI科技大本营(ID:rgznai100)随着深度学习、强化学习、知识图谱、AutoML 等 AI 技术出现更多突破,推荐系统领域的企业和开发者开始将这些技术与传统推荐算法相结合,使得推荐效果得到显著提升。不过,越…

常用的JQuery数字类型验证正则表达式

var regexEnum { intege:"^-?[1-9]//d*$", //整数 intege1:"^[1-9]//d*$", //正整数 intege2:"^-[1-9]//d*$", //负整数 num:"^([-]?)//d*//.?//d$", //数字 num1:"^([1-9]//d*|0)$", //正数&#xff…

Java多线程编程实战:模拟大量数据同步

背景 最近对于 Java 多线程做了一段时间的学习,笔者一直认为,学习东西就是要应用到实际的业务需求中的。否则要么无法深入理解,要么硬生生地套用技术只是达到炫技的效果。 不过笔者仍旧认为自己对于多线程掌握不够熟练,不敢轻易应…

Ubuntu中Atom编辑器显示中文乱码的处理方法

在Ubuntu14.04 64位机上安装Atom,依次在终端输入如下命令: 1. $ sudo add-apt-repository ppa:webupd8team/atom 2. $ sudo apt-get update 3. $ sudo apt-get install atom处理中文乱码的问题: 1. 安装文泉驿正黑等相关中文字体&#…

我的世界游戏安装

2019独角兽企业重金招聘Python工程师标准>>> Minecraft 是一款沙盘独立视频游戏,灵感来自于Infiniminer,使用Java编写,由Markus "Notch" Persson 所建立,现由Mojang AB 公司开发。 这里我们介绍如何在pcDuin…

RSA签名的PSS模式

本文由云社区发表作者:mariolu 一、什么是PSS模式? 1.1、两种签名方式之一RSA-PSS PSS (Probabilistic Signature Scheme)私钥签名流程的一种填充模式。目前主流的RSA签名包括RSA-PSS和RSA-PKCS#1 v1.5。相对应PKCS(Public Key Cryptography …

AI真人表情包、斗地主AI......DeeCamp学员做了50个好玩又实用的AI项目

8月16日,2019 DeeCamp人工智能训练营的结营仪式上,展示了600名DeeCamp学员的50个AI实践课题。 结营仪式上,由2019 DeeCamp学员组成的6个项目小组作为代表,现场展示了自己Demo成果,并由李开复、张潼等学术及产业导师现…

libcurl库的使用(通过libcurl库下载url图像)

1. 从http://curl.haxx.se/download.html下载libcurl源码,解压缩; 2. 通过CMake(cmake-gui)生成vs2013 x64位 CURL.sln; 3. 打开CURL.sln,编译会生成libcurl.dll动态库; 4. 在CURL.sln基础上&a…

SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径修改方法

2019独角兽企业重金招聘Python工程师标准>>> 一直想把数据库的默认路径修改一下,在网上找了一下,真的发现有办法 , 特拿 来与大家共同分享。 以下仅为参照,如果有多个实例,可能会有些许不同: …

Linux下多线程编程互斥锁和条件变量的简单使用

Linux下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基…

03基于python玩转人工智能最火框架之TensorFlow介绍

一句话介绍: Google开源的基于数据流图的科学计算库,适用于机器学习 不局限于机器学习,但目前被大多用于机器学习等。 TensorFlow计算流图的概念图 Tensor在图中流动。 TensorFlow的含义 拆字释义: Tensor 张量(tf中数据的表征) flow 流动 张量在图中流…

赴约北大,2019 CCF大数据与计算智能大赛正式启动

8月17日,以“数据驱动,智创未来”为主题的2019 CCF大数据与计算智能大赛(2019 CCF BDCI)全球启动仪式,在北京大学英杰交流中心阳光厅正式启幕。自2013年创办以来,大赛已成功举办六届,连续获得教…

Hadoop入门(10)_通过java代码实现从本地的文件上传到Hadoop的文件系统

2019独角兽企业重金招聘Python工程师标准>>> 第一步:首先搭建java的编译环境。创建一个Java Project工程,名为upload。 第二步:选中所需的Jar包。 选中JRE System Library 选择BuildPath Configure Build Path 选择ha…

Caffe源码中各种依赖库的作用及简单使用

1. Boost库:它是一个可移植、跨平台,提供源代码的C库,作为标准库的后备。 在Caffe中用到的Boost头文件包括: (1)、shared_ptr.hpp:智能指针,使用它可以不需要考虑内存释放的问题; (2)、dat…

漫画:5分钟了解什么是动态规划?

作者 | 调皮的阿广来源 | 视学算法(ID:z872561826)动态规划,英文是Dynamic Programming,简称DP,擅长解决“多阶段决策问题”,利用各个阶段阶段的递推关系,逐个确定每个阶段的最优决策…

小程序大转盘红包雨营销组件

前言 商城没几个营销活动能叫商城吗?所以就来几个组件吧,写的不好轻踩,对你有帮助记得给个小星星哦直接上链接github链接 运行例子 git clone https://github.com/sunnie1992/soul-weapp.git 微信开发者工具打开项目 营销组件 大转盘 "p…

Windows Server 2012 RDS系列:虚拟桌面化(5)

概述:本次将系列地测试Windows Server 2012 远程桌面服务(RDS),将过程进行分享,总的感觉比2008 R2更简单了,体现着2012的自动化。2012的RDS部署有标准部署和快速启动两种,快速启动就是自动快速配…

里程碑式成果Faster RCNN复现难?我们试了一下 | 附完整代码

作者 | 已退逼乎 来源 | 知乎【导读】2019年以来,除各AI 大厂私有网络范围外,MaskRCNN,CascadeRCNN 成为了支撑很多业务得以开展的基础,而以 Faster RCNN 为基础去复现其他的检测网络既省时又省力,也算得上是里程碑性成…

【跃迁之路】【725天】程序员高效学习方法论探索系列(实验阶段482-2019.2.15)...

实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长实验期2年(2017.10.06 - 2019.10.06)我将以自己为实验对象。我将开源我的学习方法,方法不断更新迭代&#…

C/C++各种数据类型转换汇总

以下是Windows/Linux系统中常用的C/C各种数据类型转换汇总&#xff1a;#ifndef FBC_MESSY_TEST_DATA_TYPE_CONVERT_HPP_ #define FBC_MESSY_TEST_DATA_TYPE_CONVERT_HPP_#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string>…

ASP.NET技巧:两个截取字符串的实用方法

两个截取字符串的实用方法&#xff08;超过一定长度自动换行&#xff09;1/** <summary> 2 /// 截取字符串&#xff0c;不限制字符串长度 3 /// </summary> 4 /// <param name"str">待截取的字符串</param> 5 /…

吃瓜腾讯平均月薪7.27万后,微信又出大招

腾讯最新财报一出&#xff0c;喜提热搜&#xff01;据腾讯第二季度财报显示&#xff1a;2019 年上半年腾讯有员工56310人&#xff0c;总薪酬成本为242.59亿元&#xff0c;腾讯员工平均半年薪为43.08万元。在第一季度里&#xff0c;腾讯员工平均季度薪资为21.27万元&#xff0c;…

回调函数在C/C++中的使用

回调函数就是一个通过函数指针调用的函数。假如把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数&#xff0c;那么就是回调机制。A函数就是回调函数&#xff0c;而通常情况下&#xff0c;A函数是在系统符合你设定的条件下自动执行。使用回调函…

excel单元格加引号及逗号,转换为sql需要的样式

A1 B1BXQY001 ------> BXQY001,BXQY001 -----> BXQY001 在B1中输入公式&#xff1a; ""&A1&""&"," 在B2中输入公式&#xff1a; ""&A1&"" 去掉了后面的逗号。其实就是 " "&A1&…

Win7/Win8 系统下安装Oracle 10g 提示“程序异常终止,发生未知错误”的解决方法...

我的Oracle 10g版本是10.2.0.1.0&#xff0c;&#xff08;10.1同理&#xff09;选择高级安装&#xff0c;提示“程序异常终止&#xff0c;发生未知错误”。1.修改Oracle 10G\database\stage\prereq\db\refhost.xml当打开refhost.xml 后会发现有</SYSTEM> <CERTIFIED…