有人说,别把兴趣当做职业,因为职业会毁了兴趣。然而,对于众多对编程充满兴趣的 coder 来说,这恐怕没太多选择。从你成为一名程序员开始,你就不得不去面对需求、文档、用户、产品经理,以及永无止境的 bug。 在我的编程经历中,遭遇了无数的 bug。打算挑一些我还能想起来的且不那么低级的,跟大家分享一下。今天先抛个砖。也欢迎大家分享你遇到的奇葩 bug。 我目前所做的项目是手机游戏,后台是用 django。之前有这样一个需求:
当时为了临时应对这样的需求,就在获取游戏可连接服务器列表的地方增加了这样一个配置:
获取列表的请求里增加了一个判断:
解释一下,比如现在游戏在苹果appstore、PP助手、快用助手、91助手4个渠道等待审核。那么这几个渠道的 v1.1 版本在请求服务器列表的时候,就会拿到一个只有测试服 server 0 的列表。等到审核完毕,只要在配置里把对应渠道去掉即可获取正式的服务器列表。 为了防止对 TEST_CHANNEL 的改动,这里特意使用了 tuple。到这一步,其实并没有什么问题。 等到PP、快用、91都审核完毕决定上线的时候,配置被改成了:
然而,一会儿之后就接到反馈说,PP 的版本看到的仍然是测试服务器,请转到正式服。 我的第一反应是,难道服务器没有重启或者新的配置文件没有其效果?但是再次重启刷新之后,仍然没有效果。而同时被修改的快用和91则一切正常。 这真是奇了怪了。 各位先别急着往下翻。你们想一下会是什么问题?原因就在上面的这几行代码中。 ... ... ... ... ... ... ... ...
bug就在这里。 (a, b) 是一个 tuple 类型,而当 tuple 类型只有一个元素的时候,需要写成 (a,)。否则,它就只是一个括号运算符。a 和 (a) 是等价的。 因此,条件
就相当于
它不再是判断一个字符串是否存在于一个序列中,而是一个字符串是否包含在另一个字符串中。'pp' in 'appstore' 的结果又恰好是 True…… 所以,正确的写法应该是:
建议今后养成好习惯,所有序列的元素后面都加上『,』,避免出错。 多余的话:只要你还在写代码,bug 将会一直存在。从某种角度来说,bug 也反映了你的编程水平。当你已经很少犯写错变量名、用错语法等初级错误,而更多出现诡异地、难以调试的 bug 时,说明你已经进步了。而解决 bug 的过程也是经验增长的重要过程。所以说,不要畏惧 bug,要拥抱 bug。 bug 是程序员的好朋友,但产品经理不是。 |
|