Archive ← Prev Next →

D5P323-200609

第 4 周,我在腾讯的实习终于有可观的产出了。现在我的任务是找腾讯和 N 路网之间的红绿灯数据差异。我看了 NavInfo 公司的网站,CTO 竟然是 Stanford 的 CS MS/PhD,厉害了。

在计算机中,路网是由一系列 nodes 和 links 组成的,nodes(节点)大致对应路口,links(连接)则对应道路,nodes 和 links 各有很多种属性,比如路口是否有红绿灯,道路的类型、方向、名称等。

找差异的任务并没有那么简单,主要是因为 N 的数据里没有 nodes 的位置信息,如果要取 node 的经纬度,需要取它对应的所有 links 的起终点的交集。得到位置以后可以通过一个 mentor 生成的匹配表格,和腾讯的 node 一一对应起来,然后比较它们的红绿灯信息。

由于已经构思过算法,6.9 晚上拿到数据以后,我两个小时就一气呵成地写出了差异分析的程序,6.10 继续燃烧大脑,把代码推广到了可以跑全国数据,这种感觉真爽啊。

爽过以后,就是蛋疼的小改进和 debug 了。6.11 我花了几小时才发现了一个 bug,由于程序越来越长,function 之间的关系错综复杂,所以 debug 起来非常难。那个 bug 的本质原因还是自己修改了之前的逻辑,逻辑链断了、不能跟上之前的逻辑,所以造成了逻辑不一致。Debug 时大脑思考得太慢了,如何更高效地 debug 呢?

截至 6.12,现在最大的问题是两个路网里,大约一半的道路节点都匹配不上,这样何谈分析差异呢。我想如果能知道匹配数据是怎么产出的,会对我的工作有帮助,正好 mentor 让我参与这个任务,于是我就开始看他做路网匹配的代码。

这个代码是 python 加 shell 写的,于是我自学了一点 shell,发现这真是个神奇的语言。他给的代码,我不谦虚地说,比我的“不规范”多了(哼,您还是高级工程师呢…)我的所有函数都有对输入、输出的简单描述,以及不少代码注释,如果必要的话我还会加上整个程序的输入输出格式描述,而他的代码都没啥注释,我怎么看哪。后来看了另一位程序员小哥文档,写得不错。

另外,由于使用中文可能造成文件编码上的问题,函数名、变量名,以及很多文档、注释都是用英语写的,而中国工程师的塑料英语啊…哎。

话说 mentor 周末时给了我一些路网匹配的细分任务,但我根本看不懂他想让我干啥,尝试理解他的代码也进展很慢。6.16 我回顾了一下之前红绿灯挖掘的代码,发现一个 bug,修复以后配对成功率从 31% 提升到了 49%。

组会汇报过后,mentor 打电话和我说,小组项目中,我需要对自己代码的正确性有数,他建议我好好再确认一下自己的逻辑。确实,这和我刷 LC 一般都尽可能确保代码无误再上传,原则是一样的(Leetcode 上我的接受 - 提交比很高,一般一道题我最多有一次错误然后就做对了,偶尔还会连续地一次性做对十几题)。

那之后,我灵光闪现,既然按一一对应的方法成功率这么低,为什么不直接按坐标匹配呢。于是构思之后进入疯狂肝代码模式;这种模式和我之前的生活状态很不一样,之前没事干时我喜欢看公司里的各种资料。可能是急于证明自己,我给了自己不少压力,这种现象在职场新人里应该挺正常的。

6.17 下午,我完成了代码,配对率一下子提升到了 96%,剩下的经过手动验证,大都是 2 个路网中确实存在的差异,好激动。