近期,公司为了锻炼开发人员技能,举办了一场涵盖多个技术线的技能大练兵,我有幸受邀负责java技术方向的出题和评审工作。下面从以下几个方面回顾下整个过程:

  • 题目设计
  • 程序要求
  • 测试方法

题目设计

题目设计主要考虑以下几点:

  • 技术演进需求:在公司系统云迁移的战略背景下,我们的应用即将从原来传统的虚拟机部署向PAAS云环境进行大规模迁移,需要开发人员掌握云环境的开发技能,应用开发框架需要从原来的SpringMVC+dubbo升级为SpringCloud服务治理框架。

  • 新老员工兼顾:目前公司的开发人员构成中,入职一两年的新员工超过一半,题目设计需要考虑到新员工的技能水平,不宜难度过大,否则会打消新员工参与的积极性。同时,还需要能体现正真的技术实力,不能因为题目过于简单而使得分数拉不开差距。因此,题目设计要使大家都能完成基本功能,同时拿高分的难度较大。

  • 解决生产难题:大练兵的初衷就是锻炼开发人员技术实力,提升企业级应用的开发技能,更好的完成日常任务,最终要解决生产难题,保障线上系统稳定。类似力扣网上的算法题,不适合作为此次大练兵的题目。

基于以上几点考虑,最终题目设计如下:

完成一个交易系统:

产品子系统(product)、订单子系统(order)、积分经验子系统(experience),3个子系统完成分布式部署和调用。

业务场景:

一笔交易过程中,产品子系统要扣减库存,订单子系统要新增订单,积分子系统要有相应的积分增加。积分规则为每消费1元增加1积分。

功能要求:

完成5只接口:下单、查询库存、查询订单、查询积分、个人交易信息概览

题目意在考察大家在完成基本功能的同时,如何保证数据的一致性。

程序要求

根据前期统计的报名意向来看,预计会有50人左右提交比赛交付物。这么多交付物如果要依靠线下演示评审打分的话,周期很长,而且需要人工部署调试,带来巨大的工作量。因此,必须使用自动化的方式进行打分。同时为了控制程序实现范围,防止开发人员无限蔓延开发需求,增加过多考察范围之外的扩展,因此对程序做了以下限制:

  • 中间件限制:由于本次大练兵意在为后续的云迁移做技术储备,因此中间件的选型必须控制在云上中间件的范围内,因此要求使用SpringCloud+consul的服务治理框架、Nginx软负载等中间件,不能使用Apache、Dubbo等云上不用的中间件。

  • 数据格式:题目提供3个子系统中核心的数据库表结构,例如产品信息表、订单信息表、用户经验表等。同时给出5个接口的上送和返回字段,所有人必须按照此格式对前提供服务。

  • 组包格式:由于决定要实现自动化的打分程序,就必须要统一组包要求,包括压缩包的目录层级结构、sql脚本格式、nginx配置文件、start和stop脚本等。题目要求必须实现3个模块(product、order、experience),同时提供了一个可选的其它模块(other),参赛者可根据需要自己实现,如网关、聚合服务等功能都可以放在other模块实现。other模块组包要求同其它3个模块一致。

本次题目主要的考察难点是如何保证数据的一致性。但是由于测试环境是同网段的机器,内网测试环境非常稳定,在正常的程序运行过程中,很难发生数据不一致的情况。如何产生使数据可能不一致的事件,是本次出题的重点。

因此除了以上几个限制,本次大练兵还引入了一个大杀器:chaos-monkey。

chaos-monkey:是由netflix开源的一款软件,它能在生产系统中随机产生异常事件,包括超时、程序异常、宕机等。chaos-monkey的想法源自于“混沌工程”。

混沌工程,是一门对系统进行实验的学科,旨在了解系统对应生产环境各种混乱状况的能力,建立对系统的信心。通过开展混沌工程方面的实验,可以测试出系统是否存在缺陷,从而了解系统在混乱的生产条件下如何表现。

chaos-monkey的原则,避免大多数失效的主要方式就是经常失效。通过经常在生产环境制造故障,以保证生产环境的弹性。

本次比赛提供了chaos-monkey的jar包和配置,要求参赛者必须引入,以模拟超时或者异常,从而引发数据不一致,测试程序的健壮性。

测试方法

测试主要分为两步骤:自动部署和自动测试。

服务拓扑图如下:

自动部署

所有选手的交付物都提交到统一的ftp目录,因此从ftp中遍历文件并触发部署即可。

流水线步骤如下:

for(遍历ftp上的包)
清除redis缓存
执行题目提供的sql建表语句,初始化数据库
从FTP获取压缩包,并解压
If(有nginx配置文件)
替换nginx配置文件,并重载
else
分发默认的nginx配置文件,并重载
执行铺底数据脚本
For(遍历服务个数)
按规则将各个服务压缩包分发至各服务节点
if(存在额外的init.sql)
执行init.sql
执行服务的启动脚本start.sh
运行测试脚本,收集测试结果,计算分数,并输出到CSV文件
停止各服务

通常情况下,自动部署使用Jenkins实现。但是Jenkins不支持循环遍历,一个job只能完成一个参赛者的部署和测试。如果每个参赛者一个job,不能保证每个job配置的正确性,并且由于只有一套评审环境,每个人一个job的话,不能保证job的串行执行,多个job同时执行会相互影响。因此决定自己编写部署脚本,仅在部署完成后,需要测试时触发测试job,由测试job完成测试和打分。部署脚本监听测试job的状态,测试完成后,再开始执行下个参赛者的部署流程。

自动化测试

公司本来就具备完善的Robot Framework自动化测试基础设施,本次测试直接使用即可。由于部署程序已经在程序启动前完成了数据库和缓存的初始化,因此测试程序仅需读取测试数据并向Nginx发起调用即可。

由于要测试程序异常时,数据的一致性,因此要在测试开始之前开启chaos-monkey,在执行写入数据的逻辑后(即下单接口),关闭chaos-monkey,再开始查询,通过查询各个接口的数据并于写入的数据相比对,验证数据的一致性,并打分,步骤如下:

1.开启各服务的chaos-monkey功能;

2.执行写数据的测试脚本,即调用数百次下单接口;

3.关闭各服务的chaos-monkey功能;

4.执行单个数据查询接口,验证每个接口的可用性,并记录分数;

5.执行组合验证逻辑,验证多个服务的数据一致性,并记录分数。

每个参赛者的测试执行完成后,要将计算的分数写入汇总到csv文件中。拿到最终的csv文件后,即可利用excel实现按照成绩排序。

思考

通过本次大练兵,有以下几点思考:

  • 工具建设要持续投入:工具建设可使用最小的成本,获取最大的收益。此次练兵,开发部署流水线和自动化测试脚本各投入1人,仅在2周内使用业余时间就完成了开发和测试,比人工部署、演示、测试的成本要低得多。同时工具可重复执行,每次修改完后自动触发。日常的开发和测试过程应尽可能多的使用工具去做回归测试,避免人为疏忽引起的分析遗漏而没回归覆盖。
  • 环境问题不容忽视:每个人都能在自己的环境中跑通程序,但是在评审环境中,有些程序却无法运行。因此在日常测试过程中,我们除了程序本身的正确性以外,还需关注环境差异可能带来的问题。这里顺带吐槽一下,如果公司能使用docker等容器技术,将会提升我们的版本质量,降低因环境不同而出错的概率。
  • 规范意识有待提高:虽然题目中已经将组包格式、程序端口等做了要求,也已将注意点通知到所有人,但是还是有很多人没有遵守,导致测试程序跑分较低。这反映出大部分开发人员的特点,只管闷头写代码,却忽视了规范要求,导致日后返工,甚至产生线上故障,导致严重的后果。建议大家在日常编码之前,提前熟悉并遵守规范和要求,避免走弯路。

最后,感谢大家对我的容忍。2021,愿所有程序都不出bug!

如何组织一场JAVA技能大练兵的更多相关文章

  1. 一句话了解JAVA与大数据之间的关系

    大数据无疑是目前IT领域的最受关注的热词之一.几乎凡事都要挂上点大数据,否则就显得你OUT了.如果再找一个可以跟大数据并驾齐驱的IT热词,JAVA无疑是跟大数据并驾齐驱的一个词语.很多人在提到大数据的 ...

  2. 1月中旬值得一读的10本技术新书(机器学习、Java、大数据等)!

    1月中旬,阿里云云栖社区 联合 博文视点 为大家带来十本技术书籍(机器学习.Java.大数据等).以下为书籍详情,文末还有福利哦! 书籍名称:Oracle数据库问题解决方案和故障排除手册 内容简介 & ...

  3. Java转大数据开发全套视频资料

    大数据在近两年可算是特别火,有很多人都想去学大数据,有java转大数据的,零基础学习大数据的.但是大数据真的好学吗. 我们先来了解一下什么是大数据. 大数据是指无法在一定时间内用常规软件工具对其内容进 ...

  4. java filechannel大文件的读写

    java读取大文件 超大文件的几种方法 转自:http://wgslucky.blog.163.com/blog/static/97562532201332324639689/   java 读取一个 ...

  5. Java查询大文本

    但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差,难以实现高效的并行处理. 使用免费的集算器可以弥补这一不足.集算器封装了丰富的结构化文件读写和游标计算函数,书写简单 ...

  6. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

  7. java处理大文本方案

    转载自:http://langgufu.iteye.com/blog/2107023 java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类, ...

  8. java读大文件最快性能【转】

    java读大文件最快性能 完全引用自: 几种读大文件方法的效率对比测试 据说1.88g只要5秒左右,未亲测. /** * 读大文件 * BufferedReader + char[] * @throw ...

  9. Java技能提升之路

    James收集Java技能提升方面的资料,分为:基础篇.提高篇.高级篇… 给出“入口”,自我提升 1. Java工程师成神之路:http://www.hollischuang.com/archives ...

随机推荐

  1. Codeforces Round 665 (div2)

    2020.8.22 装修完了我的博客,喜欢这个造型,挂上友链就更好了 昨天cf就是一个彻头彻尾的悲剧,本来能上蓝,结果因为在A题耽误时间过多导致掉了30分,不过没关系,这算是一个小波动吧,影响不了什么 ...

  2. python核心高级学习总结3-------python实现进程的三种方式及其区别

    python实现进程的三种方式及其区别 在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.f ...

  3. 《MySQL慢查询优化》之SQL语句及索引优化

    1.慢查询优化方式 服务器硬件升级优化 Mysql服务器软件优化 数据库表结构优化 SQL语句及索引优化 本文重点关注于SQL语句及索引优化,关于其他优化方式以及索引原理等,请关注本人<MySQ ...

  4. 第2.2节 Python的语句

    上节已经介绍了极简的Python代码编写,已经用到了赋值语句,本节对Python的程序语句进行介绍. 一. 常用命令 在介绍Python语句之前,先介绍一下几个有用的Python命令. dir(模块名 ...

  5. PyQt(Python+Qt)学习随笔:布局控件layout的layoutSizeConstraint属性

    在Qt Designer中布局控件有4个,分别是Vertical Layout(垂直布局).Horizontal Layout(水平布局).Grid Layout(网格布局).Form Layout( ...

  6. 【Home Page】本博客使用指南

    [关于] 坐标:ZJ.HZ.XJ. 高一现役 OIer,经常被吊打. Luogu:_Wallace_ [近期] 浙大 ICPC-ACM 2020 部分题解: 关键字「ZJU-ICPC Summer T ...

  7. ST 表练习笔记

    P2048 [NOI2010]超级钢琴 首先按照 前缀和最大值 建立 \(ST\) 表 对于每一个 \(i\) 维护一个以他为起始点的最大的 "超级和弦" (\(ST\) 表 \( ...

  8. AGC039D 题解

    题目描述 给定在笛卡尔坐标系的单位圆上的\(N\)个点(圆心为\((0, 0)\)).第\(i\)个点的坐标为\((cos(\frac{2 \pi T_i}{L}), sin(\frac{2 \pi ...

  9. oracle 时间段查询

    <select id="selectByRzrq" resultMap="BaseResultMap" parameterType="java. ...

  10. nginx学习之——CentOS6.0下安装nginx

    1.下载对应nginx版本 #注:下载地址:http://nginx.org/download/ wget -c http://nginx.org/download/nginx-1.10.3.tar. ...