那些年我们de过的bug(1)

有人说,别把兴趣当做职业,因为职业会毁了兴趣。然而,对于众多对编程充满兴趣的 coder 来说,这恐怕没太多选择。从你成为一名程序员开始,你就不得不去面对需求、文档、用户、产品经理,以及永无止境的 bug。

在我的编程经历中,遭遇了无数的 bug。打算挑一些我还能想起来的且不那么低级的,跟大家分享一下。今天先抛个砖。也欢迎大家分享你遇到的奇葩 bug。

我目前所做的项目是手机游戏,后台是用 django。之前有这样一个需求:

假设已上线客户端 v1.0 配套服务器 server 1/2/3 都是 v1.0 一个游戏的新版本 v1.1 发布后,要提交给不同的渠道审核,审核通过后,他们会在平台上更新客户端至 v1.1。但在这审核的过程中,要保证审核人员连接到 v1.1 的新版测试服务器 server 0,而不影响真实玩家的老版本 v1.0 去连接老服务器 server 1/2/3。当审核通过后,则需要停服更新老版本服务器至 v1.1,之后新版本就连接到更新后的 server 1/2/3。 另外要注意的是,不同渠道的审核上线速度有可能不一致,所以需要能分开控制。

当时为了临时应对这样的需求,就在获取游戏可连接服务器列表的地方增加了这样一个配置:

TEST_CHANNEL = ('appstore', 'pp', 'ky', '91') TEST_VERSION = '1.1' TEST_SERVER_ID = 0

获取列表的请求里增加了一个判断:

if version == settings.TEST_VERSION and channel in settings.TEST_CHANNEL: server_ids = [settings.TEST_SERVER_ID] else: ...

解释一下,比如现在游戏在苹果appstore、PP助手、快用助手、91助手4个渠道等待审核。那么这几个渠道的 v1.1 版本在请求服务器列表的时候,就会拿到一个只有测试服 server 0 的列表。等到审核完毕,只要在配置里把对应渠道去掉即可获取正式的服务器列表。

为了防止对 TEST_CHANNEL 的改动,这里特意使用了 tuple。到这一步,其实并没有什么问题。

等到PP、快用、91都审核完毕决定上线的时候,配置被改成了:

TEST_CHANNEL = ('appstore') TEST_VERSION = '1.1' TEST_SERVER_ID = 0

然而,一会儿之后就接到反馈说,PP 的版本看到的仍然是测试服务器,请转到正式服。

我的第一反应是,难道服务器没有重启或者新的配置文件没有其效果?但是再次重启刷新之后,仍然没有效果。而同时被修改的快用和91则一切正常。

这真是奇了怪了。

各位先别急着往下翻。你们想一下会是什么问题?原因就在上面的这几行代码中。

...

...

...

...

...

...

...

...

TEST_CHANNEL = ('appstore')

bug就在这里。

(a, b) 是一个 tuple 类型,而当 tuple 类型只有一个元素的时候,需要写成 (a,)。否则,它就只是一个括号运算符。a 和 (a) 是等价的。

因此,条件

'pp' in ('appstore')

就相当于

'pp' in 'appstore'

它不再是判断一个字符串是否存在于一个序列中,而是一个字符串是否包含在另一个字符串中。'pp' in 'appstore' 的结果又恰好是 True……

所以,正确的写法应该是:

TEST_CHANNEL = ('appstore',)

建议今后养成好习惯,所有序列的元素后面都加上『,』,避免出错。

多余的话:只要你还在写代码,bug 将会一直存在。从某种角度来说,bug 也反映了你的编程水平。当你已经很少犯写错变量名、用错语法等初级错误,而更多出现诡异地、难以调试的 bug 时,说明你已经进步了。而解决 bug 的过程也是经验增长的重要过程。所以说,不要畏惧 bug,要拥抱 bug。

bug 是程序员的好朋友,但产品经理不是。

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2015-09-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构

Java就业指导

26020
来自专栏领域驱动设计DDD实战进阶

DDD实战进阶第一波(三):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架二)

了解了DDD的好处与基本的核心组件后,我们先不急着进入支持DDD思想的轻量级框架开发,也不急于直销系统需求分析和具体代码实现,我们还少一块, 那就是经典DDD的...

42660
来自专栏北京马哥教育

Python —— 一个『拉勾网』的小爬虫

本文将展示一个 Python 爬虫,其目标网站是『拉勾网』;题图是其运行的结果,这个爬虫通过指定『关键字』抓取所有相关职位的『任职要求』,过滤条件有『城市』、...

56450
来自专栏大数据和云计算技术

新数仓系列:MongoDB关键能力和特性梳理

最近看一本书,铃木敏文的《零售的哲学》,里面提到一个很有意思的观点,711核心使命是提供便利,围绕便利场景,提供一系列食品、ATM服务等,而不是和超市去PK货物...

31660
来自专栏牛客网

前端工程师:电信专业转前端是如何拿到阿里、腾讯offer的?

1.个人情况 ● 211本科 985硕士 电信专业 女生 ● 16年3月开始学习前端 ● 16年7月开始实习,共五家实习经历(不是特别厉害的厂) ● 秋招拿到两...

36760
来自专栏企鹅号快讯

浅谈php的优缺点与面试技巧

一、优点 1. 跨平台,性能优越,跟Linux/Unix结合别跟Windows结合性能强45%,并且和很多免费的平台结合非常省钱,比如LAMP(Linux /A...

21890
来自专栏铭毅天下

Elasticsearch词频统计实现与原理解读

有了分词,开发中会遇到,某个索引的文档集合中,共有多少XX关键词? 这就引发出了词频统计的问题。 社区问题:

40030
来自专栏禁心尽力

数据库设计

杨鑫奇数据库设计经验之谈 一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% ...

29280
来自专栏编舟记

架构整洁之道导读(二)

我是《架构整洁之道》(Clean Architecture) 中文版的技术审校者,在审校的过程当中略有感悟,所以希望通过撰写导读的方式分享给大家。

13220
来自专栏重庆的技术分享区

优化时间序列应用程序的数据查询

原文地址:https://dzone.com/articles/optimizing-data-queries-for-time-series-applicat...

24080

扫码关注云+社区

领取腾讯云代金券