有人说,别把兴趣当做职业,因为职业会毁了兴趣。然而,对于众多对编程充满兴趣的 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 是程序员的好朋友,但产品经理不是。