教你如何做需求调研:忽略极端情况

开发 项目管理 前端
写accidental entities系列文章之初,我们跟着一个顾问公司为一个汽车租赁公司开发一套软件。当时他们已经完成了新车注册部分的功能。计划中的下一步是让顾客能在系统中预订。

写accidental entities系列文章之初,我们跟着一个顾问公司为一个汽车租赁公司开发一套软件。当时他们已经完成了新车注册部分的功能。计划中的下一步是让顾客能在系统中预订。

我们争取到了租赁公司的CEO抽出一小时时间给我们介绍预订系统流程。

CEO: 我想这个会议用不了一个小时。预订流程非常简单。你们对预订流程有什么看法?”

Us: “是这样,就我们的理解——也不是很复杂——客户下了订单,我们为车分配租赁期,用邮件通知客户,这就完成了。”

CEO: “等一下,可不是这么简单。我们收到订单后,首先要确认客户的信用卡。”

Us: “我们如何确认?”

CEO: “不是让你们确认。我们有一个第三方的电子认证系统,由它来做这些;这个系统会检查信用卡是否有效,是否有能力支付。”

Us: “如果信用卡被系统拒绝,会发生什么?”

CEO: “这简单,我们取消订单,通知客户。”

Us: “如果信用卡通过审核,会怎样?”

CEO: “那就预订成功。”

Us: “这里有个问题。在客户下订单时我们要立即分配车辆吗?”

CEO: “当然不是!信用卡的验证需要时间;如果最终信用卡被系统拒绝,我们会因此造成业务损失。”

Us: “哦,如果这期间另外一个人也预订了这辆车,怎么办?”

CEO: “这是一个很好的问题。在过去,这种问题很少发生,但确实有过;我们也许要注意这种极端情况。”

Us: “那发生这种重复预订情况后如何处理?我估计你们肯定不希望取消第二个订单,放弃这个客户,对吧?”

CEO: “当然不想,我喜欢你的思考方式!有几种做法;如果他们预订使用车的期间只重叠30分钟左右,我们什么都不做。当客户来取车时,我会向他抱歉,解释有一点 点延迟,我们会用一些措施安抚他。如果重叠期再大,而且有更大更好的车在空闲,我们会给他提供免费升级。当我们没有更好的车可用时,我们会让最出色的销售 员打电话给他,说服他。有时我们会给他打折,他们通常会很高兴再等几个小时,而不是去找另外的车。我们尽量避免订单被取消,我们希望树立一个有求必应的好 口碑。”

Us: “哦,有趣。如果让我自己琢磨估计会浪费不少时间才明白这个过程。你说这事情很少发生。看起来要想能正确的处理这种重复预订的事情并不是很容易,是否可以 目前不处理这种极端情况,让人工处理这种事情?我们可以把这辆车标识为重复预订,让系统给出提醒,请求人工处理。Backoffice有这种工具,他们对 处理这种重复预订的事很有经验。把这个问题放一放,可以使系统提前几个星期上线。”

CEO: “我很欣赏你的这个想法,让我们的***个版本尽量精简。真的没有必要立即让系统能够自动处理这种事情。这并不是说系统功能不够强大。系统还是要记录每个重复预订的情况,这是有用的信息。我们能做的这些吧?”

Us: “是的,这并不困难。”

跟CEO交谈之后,我们开发一个代码模型。

在我们的***次迭代中,一个订单有多个显示效果,每种效果表示一种订单状态。这样做的好处是,可以手工的在各种状态间切换,当信用卡被拒绝时,你不能接受预订….反之就是正常模式,或一些其他操作,这些不是我们这篇文章的重点。

  1. var booking = new Booking( 
  2.     bookingId, carId, 
  3.     new Customer(new CreditCard("343705171682875"), new CustomerName("Jef""Claes")),  
  4.     new Period(DateTime.Now.AddDays(1), DateTime.Now.AddDays(4))); 
  5.  
  6. var bookingWithVerifiedCreditCard = booking.CreditcardVerified(); 
  7. var doubleBooking = bookingWithVerifiedCreditCard.Double(); 

每次状态的改变都会触发一个事件。如果我们输出事件,运行下面的代码将会看到下面的信息。

  1. (EVENT) BookingCreditCardVerificiationPending 
  2. (EVENT) BookingCreditCardVerified 
  3. (EVENT) DoubleBooked 

BookingCreditCardVerified 事件触发我检查重复预订。

  1. public class BookingCreditCardVerifiedHandler : IHandle<BookingCreditCardVerified>  
  2. {     
  3.     private readonly IBus _bus; 
  4.  
  5.     public BookingCreditCardVerifiedHandler(IBus bus) 
  6.     { 
  7.         _bus = bus; 
  8.     } 
  9.  
  10.     public void Handle(BookingCreditCardVerified @event) 
  11.     { 
  12.         _bus.Send(new DetectDoubleBooking(@event.BookingId)); 
  13.     } 

如果发现重复预订,我让系统显示提醒,通知我们。可以通过邮件,或Backoffice里的一个提醒,或其他的。

  1. public class DoubleBookedHandler : IHandle<DoubleBooked> 
  2.     public void Handle(DoubleBooked @event) 
  3.     { 
  4.         NotifyHumans(); 
  5.     } 
  6.  
  7.     private void NotifyHumans() { } 

尽管技术上的实现并不是很特别,我想它已经向我们展示了事件系统如何起作用,如何将责任分发到相应的负责单位。

通常人们有个误解,认为我们有计算机,它们应该解决我们的所有问 题,甚至一些极端情况。极端情况——根据定义——只会发生在极端条件下,缺少一定的投入,用常规的方式很难处理。通过手工处理极端情况,用户可以进行人工 干预,决定什么才是应付这种问题的做好做法。这样做我们可以快速的让系统上线,减少了代码编写,最终能让客户更满意。通过统计这种极端情况的发生频率,我 们能够按照实际情况来决定是否值得去投资处理这些极端情况。

原文链接:http://www.jefclaes.be/2013/06/not-handling-edge-cases-making-them.html

译文链接:http://www.aqee.net/not-handling-edge-cases-making-them-explicit-instead/

责任编辑:陈四芳 来源: 外刊IT评论
相关推荐

2014-06-11 09:22:19

大数据

2023-03-07 17:53:00

NPS调研

2023-06-30 09:33:37

自动驾驶技术

2022-08-03 09:11:31

React性能优化

2022-08-29 08:08:58

SQLOracleCPU

2015-07-30 11:21:16

代码审查

2023-12-29 10:04:47

数据分析

2022-02-17 13:18:58

定价模型营销AHP

2012-03-12 16:42:54

测试

2012-05-07 08:49:57

Clojure

2013-07-24 10:01:24

产品设计产品经理新手做产品

2021-04-25 09:19:22

腾讯Code Reviewleader

2023-11-06 07:33:01

推荐策略数据分析

2022-10-19 14:16:18

样式隔离前缀css

2011-04-29 10:32:46

项目管理

2016-02-02 09:58:40

产品调研用户

2016-04-26 09:59:59

飞鱼星/无线网络

2018-07-18 14:39:29

2013-11-29 10:15:48

国产虚拟化

2017-11-02 08:54:13

数据存储架构
点赞
收藏

51CTO技术栈公众号