今天,我通过一个积分兑换系统的开发实战,一方面给你展示一个业务系统从需求分析到上线维护的整个开发套路,让你能举一反三地应用到所有其他系统的开发中,另一方面也给你展示在看似没有技术含量的业务开发中,实际上都蕴含了哪些设计原则、思想、模式

需求分析

积分是一种常见的营销手段,很多产品都会通过它来促进消费、增加用户粘性,比如淘宝积分、信用卡积分、商场消费积分等等。假设你是一家类似淘宝这样的电商平台的工程师,平台暂时还没有积分系统。Leader 希望由你来负责开发这样一个系统,你会如何来做呢?

你可能会说,只要产品经理给我产品设计文档(PRD)、线框图,我照着实现就可以了。我觉得,这种想法有点狭隘。我认为,技术人员应该更多地参与到产品设计中。在 Google 工作的时候,我很明显能感受到,Google 工程师跟其他公司工程师有一个很大区别,那就是大部分人都具备产品思维,并不是完全的“技术控”。所以,Google 很多产品的初期设计都是工程师来完成的,在产品发展壮大到一定程度的时候,才会引入产品经理的角色

那你可能要问了,作为技术人,我该怎么做产品设计呢?首先,一定不要自己一个人闷头想。一方面,这样做很难想全面。另一方面,从零开始设计也比较浪费时间。所以,我们要学会“借鉴”。爱因斯坦说过,“创造的一大秘诀是要懂得如何隐藏你的来源”。你看大师都含蓄地表达了“借鉴”的重要性,我们也没有必要因为“借鉴”而感到不好意思了。

我们可以找几个类似的产品,比如淘宝,看看它们是如何设计积分系统的,然后借鉴到我们的产品中。你可以自己亲自用用淘宝,看看积分是怎么使用的,也可以直接百度一下“淘宝积分规则”。基于这两个输入,我们基本上就大致能摸清楚积分系统该如何设计了。除此之外,我们还要充分了解自己公司的产品,将借鉴来的东西糅合在我们自己的产品中,并做适当的微创新。

笼统地来讲,积分系统无外乎就两个大的功能点,一个是赚取积分,另一个是消费积分。赚取积分功能包括积分赚取渠道,比如下订单、每日签到、评论等;还包括积分兑换规则,比如订单金额与积分的兑换比例,每日签到赠送多少积分等。消费积分功能包括积分消费渠道,比如抵扣订单金额、兑换优惠券、积分换购、参与活动扣积分等;还包括积分兑换规则,比如多少积分可以换算成抵扣订单的多少金额,一张优惠券需要多少积分来兑换等等。

我刚刚给出的只是非常笼统、粗糙的功能需求。在实际情况中,肯定还有一些业务细节需要考虑,比如积分的有效期问题。对于这些业务细节,还是那句话,闷头拍脑袋想是想不全面的。以防遗漏,我们还是要有方法可寻。那除了刚刚讲的“借鉴”的思路之外,我还喜欢通过产品的线框图、用户用例(user case )或者叫用户故事(user story)来细化业务流程,挖掘一些比较细节的、不容易想到的功能点

线框图对你来说应该不陌生,我就不赘述了,我这里重点说一下用户用例。用户用例有点儿类似我们后面要讲的单元测试用例。它侧重情景化,其实就是模拟用户如何使用我们的产品,描述用户在一个特定的应用场景里的一个完整的业务操作流程。所以,它包含更多的细节,且更加容易被人理解。比如,有关积分有效期的用户用例,我们可以进行如下的设计:

用户在获取积分的时候,会告知积分的有效期;
用户在使用积分的时候,会优先使用快过期的积分;
用户在查询积分明细的时候,会显示积分的有效期和状态(是否过期);
用户在查询总可用积分的时候,会排除掉过期的积分。

通过上面讲的方法,我们就可以将功能需求大致弄清楚了。积分系统的需求实际上并不复杂,我总结罗列了一下,如下所示。

1. 积分赚取和兑换规则
积分的赚取渠道包括:下订单、每日签到、评论等。积分兑换规则可以是比较通用的。比如,签到送 10 积分。再比如,按照订单总金额的 10% 兑换成积分,也就是 100 块钱的订单可以积累 10 积分。除此之外,积分兑换规则也可以是比较细化的。比如,不同的店铺、不同的商品,可以设置不同的积分兑换比例。对于积分的有效期,我们可以根据不同渠道,设置不同的有效期。积分到期之后会作废;在消费积分的时候,优先使用快到期的积分。

2. 积分消费和兑换规则
积分的消费渠道包括:抵扣订单金额、兑换优惠券、积分换购、参与活动扣积分等。我们可以根据不同的消费渠道,设置不同的积分兑换规则。比如,积分换算成消费抵扣金额的比例是 10%,也就是 10 积分可以抵扣 1 块钱;100 积分可以兑换 15 块钱的优惠券等。

3. 积分及其明细查询查询
用户的总积分,以及赚取积分和消费积分的历史记录。

系统设计

面向对象设计聚焦在代码层面(主要是针对类),那系统设计就是聚焦在架构层面(主要是针对模块),两者有很多相似之处。很多设计原则和思想不仅仅可以应用到代码设计中,还能用到架构设计中。还记得面向对象设计的四个步骤吗?实际上,我们也可以借鉴那个过程来做系统设计。

1. 合理地将功能划分到不同模块
前面讲到面向对象设计的时候,我们提到,面向对象设计的本质就是把合适的代码放到合适的类中。合理地划分代码可以实现代码的高内聚、低耦合,类与类之间的交互简单清晰,代码整体结构一目了然,那代码的质量就不会差到哪里去。类比面向对象设计,系统设计实际上就是将合适的功能放到合适的模块中。合理地划分模块也可以做到模块层面的高内聚、低耦合,架构整洁清晰

对于前面罗列的所有功能点,我们有下面三种模块划分方法。

第一种划分方式是:积分赚取渠道及兑换规则、消费渠道及兑换规则的管理和维护(增删改查),不划分到积分系统中,而是放到更上层的营销系统中。这样积分系统就会变得非常简单,只需要负责增加积分、减少积分、查询积分、查询积分明细等这几个工作。

我举个例子解释一下。比如,用户通过下订单赚取积分。订单系统通过异步发送消息或者同步调用接口的方式,告知营销系统订单交易成功。营销系统根据拿到的订单信息,查询订单对应的积分兑换规则(兑换比例、有效期等),计算得到订单可兑换的积分数量,然后调用积分系统的接口给用户增加积分。

第二种划分方式是:积分赚取渠道及兑换规则、消费渠道及兑换规则的管理和维护,分散在各个相关业务系统中,比如订单系统、评论系统、签到系统、换购商城、优惠券系统等。还是刚刚那个下订单赚取积分的例子,在这种情况下,用户下订单成功之后,订单系统根据商品对应的积分兑换比例,计算所能兑换的积分数量,然后直接调用积分系统给用户增加积分。

第三种划分方式是:所有的功能都划分到积分系统中,包括积分赚取渠道及兑换规则、消费渠道及兑换规则的管理和维护。还是同样的例子,用户下订单成功之后,订单系统直接告知积分系统订单交易成功,积分系统根据订单信息查询积分兑换规则,给用户增加积分。

怎么判断哪种模块划分合理呢?实际上,我们可以反过来通过看它是否符合高内聚、低耦合特性来判断。如果一个功能的修改或添加,经常要跨团队、跨项目、跨系统才能完成,那说明模块划分的不够合理,职责不够清晰,耦合过于严重

除此之外,为了避免业务知识的耦合,让下层系统更加通用,一般来讲,我们不希望下层系统(也就是被调用的系统)包含太多上层系统(也就是调用系统)的业务信息,但是,可以接受上层系统包含下层系统的业务信息。比如,订单系统、优惠券系统、换购商城等作为调用积分系统的上层系统,可以包含一些积分相关的业务信息。但是,反过来,积分系统中最好不要包含太多跟订单、优惠券、换购等相关的信息

所以,综合考虑,我们更倾向于第一种和第二种模块划分方式。但是,不管选择这两种中的哪一种,积分系统所负责的工作是一样的,只包含积分的增、减、查询,以及积分明细的记录和查询。

2. 设计模块与模块之间的交互关系
在面向对象设计中,类设计好之后,我们需要设计类之间的交互关系。类比到系统设计,系统职责划分好之后,接下来就是设计系统之间的交互,也就是确定有哪些系统跟积分系统之间有交互以及如何进行交互

比较常见的系统之间的交互方式有两种,一种是同步接口调用,另一种是利用消息中间件异步调用。第一种方式简单直接,第二种方式的解耦效果更好。

比如,用户下订单成功之后,订单系统推送一条消息到消息中间件,营销系统订阅订单成功消息,触发执行相应的积分兑换逻辑。这样订单系统就跟营销系统完全解耦,订单系统不需要知道任何跟积分相关的逻辑,而营销系统也不需要直接跟订单系统交互。

除此之外,上下层系统之间的调用倾向于通过同步接口,同层之间的调用倾向于异步消息调用。比如,营销系统和积分系统是上下层关系,它们之间就比较推荐使用同步接口调用。

3. 设计模块的接口、数据库、业务模型

刚刚讲了模块的功能划分,模块之间的交互的设计,现在,我们再来看,模块本身如何来设计。实际上,业务系统本身的设计无外乎有这样三方面的工作要做:接口设计、数据库设计和业务模型设计。这部分的具体内容我们放到下一下节课中跟实现一块进行讲解。

思考

  • 如何合理划分不同的模块?

参考

23 | 实战一(上):针对业务系统的开发,如何做需求分析和设计?

针对业务系统的开发,如何做需求分析和设计1相关推荐

  1. 【设计模式之美 设计原则与思想:设计原则】23 | 实战一(上):针对业务系统的开发,如何做需求分析和设计?

    对于一个工程师来说,如果要追求长远发展,你就不能一直只把自己放在执行者的角色,不能只是一个代码实现者,你还要有独立负责一个系统的能力,能端到端(end to end)开发一个完整的系统.这其中的工作就 ...

  2. 针对非业务的通用框架开发,如何做需求分析和设计?

    项目背景 我们希望设计开发一个小的框架,能够获取接口调用的各种统计信息,比如,响应时间的最大值(max).最小值(min).平均值(avg).百分位值(percentile).接口调用次数(count ...

  3. 重构业务系统,我是这样做的

    重构,是任何一个技术团队都无法绕过和回避的话题. 重构的原因有很多,可能是伴随着业务的发展与升级,系统无法快速支持需求迭代,这时就有了重构的念头,一般情况下不建议对老系统进行重构,毕竟重构是有代价的. ...

  4. 【从零开始JavaEE课设】《影院系统》(一) 需求分析 数据库设计 后端model类

    前言 吼吼吼,紧张的JavaEE阶段学习结束了,刚学完SSM框架,转眼这就到期末课设了.时间过得可真快啊.(然而我的框架使用和前端技术可能还是老八心爱的奥利给) 但是不论如何,课设就这么来了,这倒是个 ...

  5. abap al设置单元格可编辑 oo_利用WPS做业务系统的超级编辑器

    业务系统中的数据很笼统的分可以分为两大类,一个是结构化的,通常用关系型数据库来存储管理:一个是非结构化的,在这类数据中,可能最多.价值密度最大的就是文档.如何更便捷高效的生成或分析文档,就是业务系统通 ...

  6. 开发复杂业务系统,有哪些设计思路

    简介: 结合DDD(领域驱动设计)和业务中台建设经验,沉淀复杂业务系统的开发和架构思路 最近参与了一些电商中台等复杂业务系统的设计和开发,结合对DDD和阿里业务中台的一些理解,有一些架构方面的思考和体 ...

  7. MSCode微服务平台框架基于SpringCloud、SpringCloud Alibaba、SpringBoot和Activiti7工作流,快速开发办公OA、CRM、ERP、电商、信息管理等业务系统

    MSCode微服务平台框架 mscodecloud.com 基于Spring Cloud.Spring Boot和Activiti7工作流,提供所有源码和详尽文档,帮助企业快速开发分布式业务系统. 企 ...

  8. 业务系统技术架构的方法论

    业务类系统(通常称为To B 类产品),一般包括crm,供应链,物流等.系统的架构设计非常具有挑战性. 面向用户的To C 类前台产品,无论产品经理还是用户都已经培养起了使用习惯,对功能有一定程度的理 ...

  9. 小区综合业务系统/小区管理系统

    摘  要 我国是人口大国,目前由于我国小区综合业务的规模较大,所以需求量也很大,由于业主的激增,房屋增长太快,进一步抑制了小区的提升,随着市场竞争的日益激烈,虽然许多开发商主动选用小区综合业务网络模式 ...

最新文章

  1. python 网络编程 问题记录
  2. BNUOJ 52325 Increasing or Decreasing 数位dp
  3. ajax跨域服务器404,Ajax和跨域
  4. 《Python Cookbook 3rd》笔记汇总
  5. mysql sysdate本周_oracle 、mysql 取昨天 前天 本周 数据
  6. vue全局组件中再创建多个组件
  7. ANSYS Maxwell 2D永磁体建模
  8. 【python初级】 ubuntu18.04下卸载Anaconda3
  9. JSP 页面缓存以及清除缓存
  10. window安装mysql默认密码忘记_MySQL忘记root密码的处理办法及安装windows服务
  11. 深度学习双显卡配置_更新深度学习装备:双(1080Ti)显卡装机实录
  12. 关于回溯法的递归与非递归-----N皇后问题
  13. 21秋北京中医药大学《有机化学Z》平时作业1
  14. HTML: 网页摇奖机(抽号机)
  15. 子组件调用父组件中方法的方法
  16. JavaWeb--RequestResponse
  17. 确定电气间隙和爬电距离
  18. 1美元从零开始训练Bert,手把手教你优雅地薅谷歌云TPU羊毛
  19. 闲人闲谈PS之二十四——着重聊聊网络和活动
  20. TP6框架--EasyAdmin学习笔记:Excel表单导入数据库

热门文章

  1. Pycharm连接Mysql问题: Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezon
  2. windows系统bat批处理 电脑换IP清空dns地址 清空缓存重新获取ip
  3. Android Studio如何去除界面默认标题栏
  4. python doc转docx_利用python中的win32com模块将doc文件转为docx文件
  5. 所有表单对象_表单太多汇总太累?请看这里,我们带你一键汇总
  6. php urledcode_php慎用urldecode函数
  7. neo4j 查询同一节点的两个上级_链表的魅力:两个单向链表的第一个交点
  8. 模板设计模式_23种设计模式之模板设计模式
  9. oracle12c asmfd,Oracle 12c新特性--ASMFD(ASM Filter Driver)特性
  10. java请求超时异常捕获_我异常了,快来捕获我,Java异常简述