事情是这样子的,前不久接到一个需求,为一个游戏开发礼包码功能

通常一款游戏运营期间会搞各种各样的活动吸引玩家,其中最常见的就是发放礼包,  玩家可以通过礼包码兑换礼包。

用礼包码兑换礼包有个一限制,游戏运营商不会让玩家无限制兑换, 针对某一次发放礼包的活动,一个账号只能兑换一次, 即使玩家手上有多个礼包码也不能多次兑换。 打个比方,某一款游戏搞活动向玩家发放礼包,这个礼包内总共有10000个礼包码, 玩家可以通过这些码去游戏中兑换。 参加活动的玩家每人手上只有一个礼包码,而某一个玩家通过某种方法拿到多个这次活动的礼包码,那么当他登录账号去兑换这批码时,是不会成功的,他只能兑换一次,其余的码只能通过不同的账号去兑换。

这是面向玩的客户端逻辑。

在后端呢,有一套针对礼包的管理系统供游戏运营的同事使用, 当要发放一个礼包时, 他们可以在表单内填写礼包的名称、礼包码的数量、使用礼包码兑换礼包的道具之类的信息生成礼包, 然后把礼包码分给玩家。

这很和谐,一点问题也没有。然而这只是假象,我做的这个功能,在只发放一个礼包时是没问题的,但是要同时发放多个礼包, 就会触发一个bug。因为每次在系统中添加一个礼包后,在游戏中并不能直接生效,而是要使用系统提供的同步功能将礼包同步至游戏中。

人有一个特点, 做事情喜欢分类。比如说我们小时候做作业,肯定是先做完某一门功课的作业,再去做另一门功课的作业,我们不可能以做一道语文题,接着做一道数学题,然后再做一道语文题的方式来完成作业。人脑不是电脑,没有多线程, 事情只能一样一样做。

这下问题来了

运营的同事有时候会需要同时发放多个礼包,碰到这种情况,他们的操作步骤是

添加礼包,添加礼包,添加礼包,同步礼包到游戏,同步礼包到游戏,同步礼包到游戏

而我开发程序时根本没有想到会出现同时添加多个礼包的情况,所以发放礼包只能按照

添加礼包,同步礼包到游戏,添加礼包,同步礼包到游戏,添加礼包,同步礼包到游戏

这个步骤来

否则,  这些新添加的不同礼包都会被按照同一个礼包来看待, 就算玩家分别拿到不同礼包的礼包码,  也只能领取一次。

这显然是个bug, 虽然按照第二种方法的步骤操作能得到正确的结果, 但是这即不符合人的直觉,我也没有在说明文档里注明这一点, 甚至刚开始的时候连我自己都不知道要通过这么繁琐的操作才能得到正确的结果,那我又凭什么要求系统的用户去这么做呢。

当我发现这个问题时,脊背上感受到一阵凉意,因为这个功能已经发布到线上使用,假如运营的同事一次性同时发布多个礼包,那这个bug会波及到很多玩家,直接影响游戏的口碑。要是bug真被触发,那就是运营事故,而且这个锅肯定是我的, 甩也甩不掉。

我心怀揣揣的把这个问题和游戏运营的同事说明,然后表示要修复这个bug, 然而他们的回应却是:“原来是个bug啊! 我们还以为是你开发的功能呢,这个bug挺好用的,我们需要它”

震惊,我百思不得其解,在平常bug可是他们最痛恨的东西。

原来, 他们发放礼包的时候有一种需求,同时发放两个礼包, 两个礼包的道具虽然不同, 但是价值确实相似的, 他们只允许一个玩家只能领取两个礼包中的其中一个, 也就是说就算玩家分别拿到这两个礼包的礼包码,  兑换的话也只能兑换其中一个。

歪打正着, 这个bug不折不扣满足运营同事的特殊的需求。

把 bug开发成feature,我内心隐隐有种自豪感,然而这个feature 却是个定时炸弹,一旦有不知道底细的新同学使用这个功能, 那这个bug还是一个bug,而且杀伤力巨大。

所以, 问题来了, 这个bug到底要不要修呢, 纠结。

 

写了一个bug,最后却变成了feature,要不要修呢?的更多相关文章

  1. NDK中使用pthread多线程中自己写的一个BUG

    在使用pthread进行NDK中的多线程开发时,自己写了一个BUG, void *darkGrayThread(void *args) { ThreadParam *param = (ThreadPa ...

  2. 终于,帮开发写了一个bug

    写在文章的开头 最近项目比较紧,尤其前端的的需求比较多,作为一名测试,也会些vue,本着加快项目进度的美好想法,就自告奋勇的向组长承接了一部分开发的任务,其中有个需求需要在我们的广告管理后台新增一个上 ...

  3. 如何写出一个让人很难发现的bug?

    程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含bug. 那么如何写出一个让(坑)人(王)很(之)难(王)发现的bug呢? - 1 -新手开发+ ...

  4. 写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我

    写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我 1.HttpUtil工具类,用于模拟用户登录以及爬取网页: using System; using ...

  5. 浅谈如何写出一个让(坑)人(王)很(之)难(王)发现的bug

    该文章内容来自脚本之家,原文链接:https://www.jb51.net/news/598404.html 程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因 ...

  6. 实现一个最简单的VIM文本编辑器(可能有bug,随便写了一个)

    简单的写了一个文本编辑器,功能很简单,但足以把文件IO相关的操作熟悉了,可能功能或者分配的大小还不够完善.请参考参考: #include <stdio.h> #include <co ...

  7. Tomcat一个BUG造成CLOSE_WAIT

    之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...

  8. 搞了我一下午竟然是web.config少写了一个点

    Safari手机版居然有个这么愚蠢的bug,浪费了我整个下午,使尽浑身解数,国内国外网站搜索解决方案,每一行代码读了又想想了又读如此不知道多少遍,想破脑袋也想不通到底哪里出了问题,结果竟然是web.c ...

  9. MySQL关于exists的一个bug

    今天碰到一个很奇怪的问题,关于exists的, 第一个语句如下: SELECT ) FROM APPLY t WHERE EXISTS ( SELECT r.APPLY_ID FROM RECORD ...

随机推荐

  1. CyclicBarrier的使用之王者荣耀打大龙

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆,如果有什么错误或者不当的地方,欢迎大家斧正. LOL和王者荣耀的玩家很多,许多人应该都有打大龙的经历,话说前期大家 ...

  2. javaWeb正则表达式

    对于web来说,字符串的处理特别重要,而正则表达式是对字符串处理的利器,在字符过滤,验证方面都能看到她的身影. 今天需要处理一段json字符串,在用String.replaceAll的过程中,遇到了正 ...

  3. 当你的SSM项目中的springmvc.xml发生第一行错误解决方案

    当你新建了一个SSM项目,你复制网上的xml文件来配置或者你下载了一个SSM项目打开发现xml文件错误,打开是第一行报错的时候你是不是很懵逼 或者是这样 总之就是xml文件中<?xml vers ...

  4. jquery模板下载网站

    jquery模板下载网站 http://www.jqshare.com/

  5. ArrayList ConcurrentModificationException

    1.ConcurrentModificationException ConcurrentModificationException 出现在使用 ForEach遍历,迭代器遍历的同时,进行删除,增加出现 ...

  6. 基于Apache axis2开发Java Web服务

    1.安装配置axis2环境 1)下载axis2-1.4.1-war(发布webservice)和axis2-1.4.1-bin.zip(webservice调用使用的各种包) 下载好后把axis2-1 ...

  7. spring框架总结(01)

    1.spring是什么? sprint其实就是一个开源框架,是于2003年兴起的一个轻量级的java开发框架,是有Road Johnson创建的,简单的来说spring是一个分层的JavaSE/EE( ...

  8. java数据库编程之事务、视图、索引、备份、恢复

    第五章:事务.视图.索引.备份和恢复 5.1:事务 事务的概念:事务(transcation)是讲一系列数据操作捆绑成为一个整体进行统计管理. 如果某一事务执行成功了,则该事务进行操作的所有数据将会提 ...

  9. 一脸懵逼学习基于CentOs的Hadoop集群安装与配置

    1:Hadoop分布式计算平台是由Apache软件基金会开发的一个开源分布式计算平台.以Hadoop分布式文件系统(HDFS)和MapReduce(Google MapReduce的开源实现)为核心的 ...

  10. python读取命令行参数的方法

    1.sys模块 需要模块:sys参数个数:len(sys.argv)脚本名:    sys.argv[0]参数1:     sys.argv[1]参数2:     sys.argv[2] test.p ...