在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合。

有限的因变量与自由发挥的自变量

先设定一下业务场景,假设我们要做电话套餐系统。

一个电话套餐里直接影响客户使用体验的是:

  • 价格

  • 通话

    • 每月免费接听时长

    • 每分钟接听收费

    • 每月免费拨打时长

    • 每分钟拨号收费

  • 短信

    • 每月免费条数

    • 每条收费金额

  • 流量

    • 是否降速无限流量

    • 流量包购买价格

    • 套餐内包含流量

本文称呼上述的内容是一个套餐系统中的因变量,是最终结果,其值由多个自变量联合确定。电话套餐的因变量可能不止于这些内容,但其总是有限可枚举的。

对应的,本文将以下内容称为 自变量:

  • 地域(这个无限流量的套餐只能给广东省客户的)

  • 身份(看在他还在读书的份上,套餐费用给他减几块钱吧)

  • 公司(这个是合作公司,整个公司都用我们的短号,这个套餐必须要优惠点)

  • 客户画像(这货看起来很有钱,对他展示一些高价套餐,同时象征性给他多一点通话时长吧)

  • 营销入口(这个从我们的活动链接进来薅羊毛的,还是给他减点价吧)

  • 使用的客户端(最近在推广APP,在APP申请的套餐给他送点流量吧)

  • 基础套餐定义(这个套餐叫 无线流量卡,客户申请这个套餐时,我们给他一个基准内容吧)

  • ......

导致因变量变化的自变量很多,同时多个自变量也有可能联合使用触发新规则:

  • 地域为广东地区身份为学生的客户购买套餐时 额外送1G

  • 公司为 X 的 领导岗位 免话费

  • ......

相对于因变量,自变量及其组合的数量可能难以想象的庞大。

如果每个自变量的组合等情况都要在我们的系统中通过代码来定义,这是一个难以想象的灾难。

此时此刻产品、渠道等自变量究竟是什么

一个人,在公司里是员工,在父母前是儿子,在老婆前是丈夫,在车里他是司机。

人是多面的,在每个不同的场景有不同的表现,并且在特定的场景也只需要有特定的表现,而不能串场。

我们业务系统里的渠道可能是 APP,小程序,H5,桌面应用等,这些渠道自身有很多其他的特性,但在套餐系统关心的渠道仅仅是:

  • 当渠道为APP时,额外赠送1G流量,减免5块钱

  • 当渠道为小程序时,送100M流量

  • ......

这些对套餐的影响,定义了在 套餐场景下,一个渠道是什么。

同理,我们依然可以通过同样的形式,定义套餐系统里 地域的含义,身份的含义,营销入口的含义,这与NLP中的词向量有异曲同工之妙。

自变量类型 自变量值 流量 免费通话时长 套餐价格 赠送彩铃
营销入口 合作公司A + 1G null 95折
营销入口 合作公司B null +10min 95折
渠道 APP +1G null -5元
渠道 公众号 +100M null null
基础套餐定义 流量霸王套餐 5G 30min 58元
基础套餐定义 通话大咖套餐 1G 180min 58元

通过自变量确定因变量

要通过自变量(外部套餐,渠道,营销入口等)计算出因变量(最终面向客户的套餐内容),首先要确定的是 计算规则。

一个可供的参考的形式如下:

  • 为每个自变量类型确定整体的执行优先级

  • 为每个因变量类型确定计算的形式

如上一节的表格中,我们可以定义各类自变量计算优先级:

  • 基础套餐定义 低

  • 渠道 中

  • 营销入口 高

那么 合作公司A引流的客户在App中 选择了 流量霸王套餐 ,那么它的流量是

5G + 1G + 1G = 7G

上面的规则很简单,就是简单的加减操作

而赠送彩铃可以选择另外的规则,只要出现过“是”,那就“是”

否 + 是 + 否 = 是

多自变量联合确定的操作内容的场景

如果出现了

“当 营销入口为 A 公司 渠道用的是 APP时,
给我再额外送2G流量”

又或者

“我不管你什么设计,我的这个套餐就是不允许
其他乱七八糟的 渠道、营销入口修改内容”

等需求时,就会打破上述简单的按照单个自变量优先级排序的规则

我们可以额外新增一个更高优先级的自变量,以实现特定的需求

自变量类型 自变量类型优先级(数字越大越优先)
基础套餐定义 10
渠道 20
营销入口 30
营销入口 + 渠道 50
特殊不可修改套餐 100

这样我们就可以解决业务的特殊需求。

优缺点分析

我们分析一下,该种解决方案的优缺点。

优缺点是通过比较而得到的,我们对比的解决方案假定上述的套餐最终定义是通过Hard-Code实现的,那么:

优点:

  • 自变量定义显式化

    • 我们可以快速地知道所谓的 渠道、营销入口、省份等概念,在套餐系统中起到的作用是什么

  • 最终套餐表现显式化

    • 只要确定了自变量的值,我们就可以从,配置表中抽取出特定配置,构建出一个按照行优先级排序的矩阵,从而快速得到最终套餐的表现

  • 节约开发资源

    • 在确定套餐内容过程中,可以统一处理所有自变量对应的属性

    • 在没有新增 因变量时,开发工作量极少,甚至免于开发

  • 业务获得了其最大的灵活度

  • 特殊逻辑外置化

    • 业务有时会像上面提出的“这个套餐不能被任何其他自变量配置修改”的需求时,我们可以让其自行通过配置实现,而不用污染我们的代码

    • 至于后续这个业务配置变得怎么乱,其都是由于业务自身思考不合理导致,配置信息由业务主管,其需要为自己的配置负责。

缺点:

  • 可能需要给业务提供一个友好的配置界面,需要点开发工作量

上面的电话套餐只是一个举例,我们可以很容易地将这个简单的设计迁移到其他类似的场景,如汽车定制套餐,贷款套餐等。

关于作者

作者曾在两家排名前三的股份制商业银行工作过,目前在一家排名前二的互联网银行工作,做过业务,做过中间件,做过架构,也带过小团队。

公众号会定期分享个人关于 技术、架构、业务 等的思考,欢迎关注公众号。

同时欢迎添加个人微信skyesx探讨技术相关问题,请备注名字+公司。

本文有任何不妥欢迎留言斧正,若本文能带给你收获,请不吝分享!

推荐阅读

从分治的思想到架构的设计

谈复用的成本与中台的建设

基于优先级配置矩阵的套餐系统相关推荐

  1. SysTick系统定时器(功能框图和优先级配置)

    SysTick系统定时器(功能框图和优先级配置) SysTick-系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中.系统定时器是一个 24bit (2^24)的向下递减的计数器,计数器 ...

  2. python dlib caffe人脸相似度_基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表...

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  3. 基于stm32Cubemx的矩阵键盘配置

    矩阵键盘的选择 我这里使用的是某宝一块四包邮的4*4矩阵键盘,感觉对大部分简单工程的实现绰绰有余 Cubemx工程的配置 新建工程,配置RCC,SYS,时钟树等基础功能 一般设置为最大速率,之后点击O ...

  4. android9彩蛋小米,外媒曝光小米9外观配置 运行基于Android P的MIUI 10系统

    每年高通旗下骁龙旗舰移动平台的上市都会引发一波抢购狂潮,而随着骁龙855的发布,谁会是第一款搭载该平台的国产手机成为大家关注的焦点.以小米和高通紧密的合作关系来看,小米下一款旗舰机肯定会搭载骁龙855 ...

  5. 诊断网络层和应用层交互_基于SoC的数据采集与交互系统解决方案

    引言 Internet的快速发展和成功促进了以太网(Ethernet)技术的发展和应用的扩展,所涉及的领域十分广泛,如传统的工业控制.信息家电.智能家居.安全监控.楼宇自动化.医疗.环境监测等.大多数 ...

  6. 路由器snmp配置_基于keepalived配置数据库主从实现高可用

    基于keepalived配置数据库主从实现高可用 使用keepalived来监听端口,实现数据库的高可用.实现效果,其中一台数据库服务器突然出故障或关机时,应该不影响应用正常运行,等待服务器启动之后, ...

  7. 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  8. 基于DE2的开源片上系统Freedom E310移植

    引言:伯克利大学于2014年发布了开源指令集架构RISC-V,其目标是成为指令集架构领域的Linux,应用覆盖IoT(Internet of Things)设备.桌面计算机.高性能计算机等众多领域[1 ...

  9. Nachos进程数量限制128、ID号分配以及基于优先级的调度算法详解

    文章目录 写在前面 运行环境配置 最大线程限制 实现可回收的线程ID机制 基于优先级的先来先服务调度算法 修改完毕的nachos我已经上传了,需要的话可以点击这里下载,积分不够可以私信我,CSDN设置 ...

最新文章

  1. linux-glibc内存管理小结2(内存相关系统调用的实现)
  2. Django中配置自定义日志系统
  3. 对 Linux 新手非常有用的 20 个命令
  4. EventLoop 与Channel 的关联
  5. win10子系统ubuntu图形界面_win10系统中安装ubuntu子系统及图形界面
  6. 2. PHP 编译安装
  7. 让博客园博客自动生成章节目录索引
  8. 和包支付的钱哪里来_老瓦发问国际乒联:道理我都懂!问题钱从哪里来?
  9. jdk 各版本官网下载
  10. doc 问卷调查模板表_Word制作电子版问卷调查模板表「教你方框内打钩」
  11. 控件ShowWindow(SW_HIDE)不起作用
  12. QQ号大规模被盗与你我有什么关系?你我该如何做?
  13. IEEE 802.3av 10Gbits EPON 中文翻译(一)
  14. vivox5l的Android是5.0,步步高Vivo X5 X5L刷机教程(官方固件rom升级教程)
  15. C++病毒——鼠标乱飞
  16. Docker push命令推送镜像到远端仓库
  17. Emgucv摄像头使用
  18. 从源码角度了解react工作原理
  19. 在线网络考试系统源码
  20. 高等代数_第8章:证明_商空间的维数公式

热门文章

  1. 手机第一次怎么充电?
  2. spring中pagehelp的使用方法
  3. 项目经理如何做好项目管理中的风险管理
  4. 断言(assert)--学习
  5. Image steganalysis with convolutional vision transformer
  6. 2019全球汽车品牌销量排名
  7. TriCore 基础知识-个人笔记
  8. Safari浏览器自动化测试(Python脚本测试)
  9. 漏洞利用exploit ——跳板技术 静待春暖花开之时,你我相见 听你说一声 好久不见
  10. 在线家装平台的设计与实现目的及意义