对于任何编程语言,数据结构和算法对于一个程序员重要到什么程度? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
keikeizhang
V2EX    程序员

对于任何编程语言,数据结构和算法对于一个程序员重要到什么程度?

  keikeizhang 2016-11-13 14:50:50 +08:00 15111 次点击
这是一个创建于 3255 天前的主题,其中的信息可能已经有所发展或是发生改变。

首先表达一个态度就是我认为数据结构和算法很重要,但是有一个前提。

最近一直和朋友探讨这个问题,也咨询一些其他程序员,如果排除装 X 因素,你自己有没有为项目特地的研究一下数据结构和算法。

而设计模式中,除了工厂和单例真的很少用到其他的。

我知道 V 站都是大牛,但是到底什么程度的项目会用涉及到数据结构和算法,或者说不懂数据结构和算法的人,怎么样的一个项目就是他的技术极限。

V 站也好,知乎也好,感觉数据结构和算法放佛神话一般,可是我知道很多根本不懂数据结构和算法。

而本人大学学习的数据库原理,网络协议,操作系统,计算机原理,到先在我不知道给我带来多少的帮助,也许我还没有涉及到更高层次的编程体验,感觉自己一直在增删改差,处理一些数据,然后输出渲染就好。

总结的一个问题就是,如果不懂不学习一些计算机的基础知识,他的技术极限是什么?

第 1 条附言    2016-11-13 21:33:47 +08:00
各位的回答都很好,但有一些跑题,并没有完全回到本人的疑问!

但是也稍微总结一下。

算法和数据结构很重要,在一些功能实现的时候,会算法和数据结构的可以找到更加优化的方式去解决,但是不会的人一样可以用较笨的办法解决。

看个人的目标,你是打算成为一个建筑设计师还是建筑师,如该想成为一个优秀的建筑设计师,那么需要很系统的去学习计算机底层的知识,数据结构和算法,操作系统,网络协议等等。然而你只想成为一个建筑师的话,那么熟练的解决业务代码中各种需求,熟练的使用各种工具和开源软件,以及开源程序,熟悉框架的使用等等,那么一样可以成为一个相对优秀的程序员。

不知道总结的是否正确。
58 条回复    2018-06-06 11:04:19 +08:00
mind3x
    1
mind3x  
   2016-11-13 14:54:40 +08:00 via Android
“如果不懂不学习一些计算机的基础知识”,极限是写了超过 500 行代码以后,自己便无法维护。
keikeizhang
    2
keikeizhang  
OP
   2016-11-13 14:55:16 +08:00
楼主起码大学已经学习了,所问的这种人是大学是其他专业,也许因为考证会点 C 语言,背过一些题目,例如工商管理专业的学生,或者工作很久的会计转行程序员,去一个培训班或自己看语言文档摸索学习,貌似除了语言本身其他都不知晓太多,如果还不学习,能走到什么程序。

这样的人写得了业务代码,不懂的地方自己搜索资料也可以搞定,可以看语言文档和框架文档,但是之外的一些知识掌握起来很费力!
keikeizhang
    3
keikeizhang  
OP
   2016-11-13 14:56:55 +08:00
@mind3x 我写过一个开源项目,用了一次位预算,然后分享给朋友,他问我这个代码什么意思,我说是异或,然后开始漫长的问答环节!
Senevan
    4
Senevan  
   2016-11-13 14:57:42 +08:00
功利一点讲的话,面试会挂
nagato
    5
nagato  
   2016-11-13 15:04:06 +08:00   2
刷完一遍题以后,就像打开一个新世界。它为我面对未来可能遇见的一些问题提供完全不同的新思路。 这种新思路,是没有学习过算法,数据结构的人在 99%的情况下都无法靠他自己的脑力想出来的。有的算法真的是精妙到,就算把解法摆在你面前,都得花上一两天的时间才能理解进去。
withqs
    6
withlqs  
   2016-11-13 15:05:53 +08:00   3
有的公司在招人的时候,喜欢问数据结构和算法的问题。往往目的不在于数据结构和算法本身,而是想筛选智商高的程序员。
keikeizhang
    7
keikeizhang  
OP
   2016-11-13 15:08:07 +08:00
@nagato 我比较擅长把问题抽象成一个数学题,然后用公式去解决,再用语言把公司实现,虽然我不知道这算个什么。
keikeizhang
    8
keikeizhang  
OP
   2016-11-13 15:10:55 +08:00
@Senevan 有的公司明明只是需要一个步枪,结果非要招一个榴弹炮,我感觉可以用就行,如果个人跟不上公司的发展淘汰即可,毕竟公司跟不上个人的发展,人家还会跳槽呢!
kukuwhu
    9
kukuwhu  
   2016-11-13 15:15:05 +08:00
不会数据结构,写个超市存物箱都只会用数组遍历,你觉得呢?
离开了数据库就不会对大量数据进行增删改查了
nagato
    10
nagato  
   2016-11-13 15:31:48 +08:00   2
@withlqs
@keikeizhang
其实算法考量的不是智商,反而是基础。因为确实很多算法都是前人科学家或者做学术的人花很长时间研究出来的,常人确实不可能短时间内想的出来。 我们能做的,只能是去理解熟悉并且应用它。
SpicyCat
    11
SpicyCat  
   2016-11-13 15:41:18 +08:00
1. 面试笔试会考。计算机基础知识牢固会让你拿到好公司的 offer 。这可是真金白银。
2. 你技术方向的职业生涯的高度取决于你对计算机基础知识理解的深度。我现在工作用的技术是大学里完全没有学过的,但我不认为我大学白上了。
xiaoxiaoming
    12
xiaoxiaoming  
   2016-11-13 15:42:36 +08:00
说实话,码了几年,算法还是比较菜的。但是常见数据结构还要多了解,程序写得好不好还是要靠它!
    13
depress  
   2016-11-13 15:49:53 +08:00 via Android
我一直认为数据结构和算法不决定一个程序员有没有工作,决定的是工资上限。
depress
afxcn
    14
afxcn  
   2016-11-13 16:02:33 +08:00
我认为关键在于知道与不知道的区别,如果解决某个问题,他知道有合适的数据组织方式和算法解决问题,就算他不精通这种数据结构和算法,只要用心,他也能解决得很好;但如果他根本就不知道,那就得上 v2/zh 发帖了,如果遇到合适的人指点一下,他也能解决问题;区别在于,一个需要指点,一个独立解决问题。
novaline
    15
novaline  
   2016-11-13 16:05:03 +08:00
算法还是有必要学习一下的,当然,先从日常问题入手。高级别的算法,数学要求很高,无底神坑,时间精力产出比有点划不来。
snnn
    16
snnn  
   2016-11-13 16:07:16 +08:00
我举个我工作中的实际例子吧:一堆整数,大约几万到几十万个,去掉重复的。这个整数是一些 key ,要发给远端的一个 Key-value store 做查询,为了节省带宽,所以先去掉重复的,再发送。
不懂数据结构与算法,也能解决这个问题,但是如果你懂,可以做的更好。

再比如搜索引擎中一个很常见的问题: phrase search 。假如已经有每个词的倒排表,想要查询某个词组是否在文档中出现,该如何?

这些问题都没有 best-answer ,正是如此,才需要解决问题的人精通数据结构与算法,以随机应变。
firebroo
    17
firebroo  
   2016-11-13 16:24:16 +08:00
程序的本质还是数据吧,保存数据操作数据依赖数据结构。。 linus 就一直强调设计数据结构的重要性。
ipconfiger
    18
ipconfiger  
   2016-11-13 16:39:05 +08:00   1
数据结构和算法不是编程的最根本的东西么?这个都要质疑的话, 可见 2 点
1. 现在的程序员对自我修养的要求有多低
2. 现在大多数公司的产品技术水准能有多低

说个亲验的例子, 之前招人面试的时候最后放了一道实际要写点代码的题, 炒鸡简单, 写个能跑的冒泡即可, 来面试的人实际能写对的不足 30%, 附加题是在这个基础上升级一下改成可以自定义排序条件的排序, 然后剩下 30%中的 2/3 又挂掉了.

所以我觉得现在市面上程序员不好招是有原因的, 写代码维生的人不少, 但是市面上合格的程序员其实并不多, 根据面试多年的体验来说, 成都 市面上 2/3 的"程序员"最好改行, 其中 1/3 甚至带毒, 我不知道那样的公司敢用, 另外 1/3 或许还有救, 然后市面上还缺 1/3 那么多的人来干活.........
changwei
    19
changwei  
   2016-11-13 17:33:08 +08:00 via Android
题主这个问题很有讨论价值。

我很早以前自学 php 的时候也一直在想这个问题,明明 php 给我封装好了那么多的 api ,为什么我还要去学数据结构,算法?或者各种网络原理?

直到我现在上了一所辣鸡专科学校,学软件开发(java)之后,才深有感悟。

首先就说数据库里面的密码存储吧,如果你没有学过计算机网络,没有讲到过 hash 算法的原理,你怎么也弄不懂为什么别人的代码里面都要求你注册用户的时候要把密码 md5 一下。

或者说最近在用 redis 的时候,到底应该是用列表还是有序集合还是什么,如果你不知道他们底层用的数据结构是链表还是什么,你根本就不知道该如何选择。相应的, mysql 为什么要建索引,数据库为什么要有范式,为什么 for 循环里面写++i 比 i++速度快,这些都是因为你多多少少有了解过计算机基础,各种编译原理,数据结构算法,你才能更加方便快速的通过原因来记住这些要点,而不是死记硬背。

这就是我自学这么久以来的一些感悟。
Terry309
    20
Terry309  
   2016-11-13 18:31:20 +08:00 via iPhone
@keikeizhang 太极生两仪,两仪生四象,四象生八卦。学过数据结构就知道这活脱脱就是二进制的二叉树....
waruqi
    21
waruqi  
   2016-11-13 18:42:36 +08:00 via iPhone   1
我现在连链表都不敢多问了
pyufftj
    22
pyufftj  
   2016-11-13 18:47:27 +08:00
@nagato 非常同意你说的。不过有的题目,别人的代码我看一天都看不明白,但自己仔细想想代码能写出来,真是奇怪 T_T
Sight4
    23
Sight4  
   2016-11-13 18:49:26 +08:00
@kukuwhu 说出了真理, RMDBS 可以是对算法的依赖变成了对 DB 的依赖,当然, DB 本身已经是一个集算法大成的系统
anubiskong
    24
anubiskong  
   2016-11-13 18:52:12 +08:00
编程一大误区: 算法能力=解决问题的能力
f1r1ng
    25
f1r1ng  
   2016-11-13 18:56:39 +08:00
可以把科班生和非科班生,或者说培训班量产出来的和真正热爱这方面的人区分开来
tomczhen
    26
tomczhen  
   2016-11-13 20:09:27 +08:00   1
野生半个程序员出来说一下吧。

很多情况下,确实用不到算法。这个跟工作内容有关系,毕竟现在分工这么细致了。算法能锦上添花,但是不会算法,也是能解决问题的,虽然会有一些“效率”的问题但很多情况下“效率”不是问题。

打比方说的话,扫地这个工作谁都能做,但是合理规划能提高效率,问题是上面验收的人只要你一天内完成,至于你是 3 个小时,还是 1 个小时,不好意思工资是一样的。

同样解决一个问题,写一堆 if else 和一个函数式,水平差距还是有的最简单的位运算,我这家公司开了 3 个小时会跟前后端开发讲,还有人弄不太明白,而且还有人说,用字符串判断也是一样,更容易做一些。

总的来说,如果你处于底层,那么算法对你的收益确实很低,远没有你学个框架,熟悉一下各种 API 来得高。但是,请看清楚一点,现在各种开源库,框架,工具,文档中文化,让进入这个行业的门槛越来越低,当你上升到一个阶段时,你会发现各种问题都要算法来解决。

总的来说,机会永远是留给有准备的人。
murmur
    27
murmur  
   2016-11-13 20:18:36 +08:00
做前端的
很简单的一个需求
若干个 n x m 的方块 排布在 w x h 的空间内,忽略方块的间隙(也就是紧贴着排放)
请想出一个尽可能美观的排版方式
这个代码找别人现成的可能 10 行就搞定了 js
你自己写写的出来么
我连思路都没有 所以我把这算法存起来了 每次直接复制
murmur
    28
murmur  
   2016-11-13 20:21:21 +08:00   2
我们本科老师说过 现在的本科意义不在于你记住什么 是你有朝一日用到的时候曾想起有个东西可以帮你解决 你去查资料 知道查什么 这门课就没白学
可惜很多码农连用什么算法解决问题都不知道吧
现在的库别说是简单的数据结构了 各种高级算法你想要都有库而且都不差 就怕想都想不出来
bumz
    29
bumz  
   2016-11-13 20:31:38 +08:00   4
不懂不学习一些计算机的基础知识,他的技术极限是正无穷。

就像 Srinivasa Ramanujan 一样大量重复前人的工作,反倒有了过人的洞察力,从而有能力作出开拓时代的发现。

然而对大多数人而言,把前人的成果摆在眼前尚且不能立即掌握,要让他从零开始独自一人重复千万人的工作恐怕更是天方夜谭。

这样的结果恐怕只是,在技术上,独自一人被全世界丢在身后,奋起直追,然并卵。

然而现实是,这样被丢在后面的人很多。。。孩子你不孤独,就算没有能力理解和掌握一种算法,你也可以把它当作黑盒调用前人写好调好的程序;虽然你可能始终无法理解 i++ 和 ++i 在速度上的差别,没关系,现代的编译器始终为你优化,你无需再在意该使用哪一种;看到开源代码中出现 (i << 3) + (i << 1) 你或许一脸蒙逼,但其实就算老老实实写成 i * 10 ,开高优化,二者生成的代码也都相当于 ((i + i) * 4 + i + i) ……

相反,冒泡排序背到滚瓜烂熟,真到应用时始终不如语言标准库实现的快排;熟悉动态规划、递归递推之间的转化,你能写出时间复杂度只有 O(mn)、空间复杂度只有 O(m + n) 的 Levenshtein 距离的实现,却不如隔壁老王从维基百科、 Stackoverflow 上复制粘贴;熟悉 IEEE 754 的你借助位运算近似得到 1/sqrt(x) 的值再用牛顿法迭代造就传世平方根倒数速算法,然而机器性能的增长使得这一运算不再成为瓶颈,同时借助 GPU 和开源工具任何人都能写出更快更好的程序……

好了我写不下去了,神来之笔在计算机科学界比比皆是,没有坚实的跨领域基础在背后支撑,你玩不到光影绚烂的 3D 游戏,搜不到 Chris Lomont 发表的研究平方根速算法的论文,用不上带有多点触摸 Touchbar 的 nbmp ,甚至想写程序还要在卡片上打孔,不,计算机压根就不存在,算盘也不存在,数学也不存在,人类还在茹毛饮血……

话说回来,如果没有坚实的计算机科学基础,你也能灵活运用别人写好的算法、程序让周围的人、老板对你刮目相看;但是懂得原理终究是不一样的,只会调用别人写的 Levenshtein 距离而不懂得原理,如果想实现 Sublime Text 那样先筛选子序列再按编辑距离排序,你永远也想不到要怎样修改……
bumz
    30
bumz  
   2016-11-13 20:38:42 +08:00
简而言之,不懂计算机科学,你也可以成为自己小圈子中的佼佼者,胜任遇到的大多数任务;但是不学习计算机科学,你便永远也无法超越自己的小圈子,仅此而已。
tomczhen
    31
tomczhen  
   2016-11-13 20:45:06 +08:00   1
@bumz 哈哈,工程师和艺术家是两种职业。

建筑设计师总归是少数,砌墙工人的收入也比低级设计师高得多说不定当个包工头比设计院那些加班的那帮苦逼们要滋润多了。

只是为了赚钱,自然有着每个人的最优解,但是,最优不代表最有趣。给我来说如果做程序员却要放弃创造力这种可能,还不如回老家卖猪肉呢。:doge:
sheep3
    32
sheep3  
   2016-11-13 21:21:56 +08:00
算法上面都说了,对于设计模式这方面,当你阅读框架源码的时候你会发现大量的设计模式在其中处于非常重要的地方。当然如果你觉得程序员写一辈子业务代码就行了的话,当我没说= =
xiaoxiaoming
    33
xiaoxiaoming  
   2016-11-13 21:51:17 +08:00
如果想要做得更好更快更爽,引入设计模式是非常必要的!不管是业务代码还是框架代码!
但如果没有那个追求,也能凑合着过。。。
mko0okmko0
    34
mko0okmko0  
   2016-11-13 21:59:42 +08:00
我觉得会搜寻的比会算法的更重要.
不会搜寻.整个自己搞.最高水平就是自身状况了.
会搜寻.你会得到这个世界前 10 优解.
Yc1992
    35
Yc1992  
   2016-11-13 22:02:07 +08:00 via Android   1
日经贴,有意思吗?爱会会不会拉到
jackie9692
    36
jackie9692  
   2016-11-13 22:08:42 +08:00
软件工程 VS 计算机科学,同感软件工程专业貌似更强调解决工程问题,不够重视算法和数据结构,只有部分搞 ACM 的算法较强,同样为面试刷题。
ihuotui
    37
ihuotui  
   2016-11-13 23:24:45 +08:00
@withlqs 我也是这样认为,看人,两种,一是他的行动(基础知识体现),二是智商(算法,聊天,思考)
isbase
    38
isbase  
   2016-11-14 00:07:57 +08:00 via Android
凡事无绝对,还有人记得 homebrew 作者吗
SlipStupig
    39
SlipStupig  
   2016-11-14 01:33:37 +08:00
@snnn python 狗表示不懂算法,只懂轮子,如果轮子都没有,说明目前能解决的是极少数,所以我也解决不了.....
hackpro
    40
hackpro  
   2016-11-14 02:20:18 +08:00
FLAG 的面试基本都是算法题
所以题主你看。。。
huntzhan
    41
huntzhan  
   2016-11-14 02:37:04 +08:00
我觉得很多人都有个错觉:虽然我算法跟数据结构不熟,不擅长做题,但是我还是可以拿到好 offer 从事有前途的开发工作。
xcodebuild
    42
xcodebuild  
   2016-11-14 08:08:32 +08:00
面试会挂 2333
cs419
    43
cs419  
   2016-11-14 08:56:40 +08:00 via Android
仁者见仁,智者见智。 有人开车只是代步,有人开车超越极限。仅仅写个刷票的脚本,还是在写 Linux 内核呢。算法自然是很有用的,但是分人,工作几年了不会用 Linux 也是大有人在。
nicegoing
    44
nicegoing  
   2016-11-14 08:58:23 +08:00
@isbase homebrew 作者的态度问题,知道 google 会面试算法,连二叉树都不复习下,压根不重视这次面试机会。
zacard
    45
zacard  
   2016-11-14 08:59:57 +08:00
非常重要,可能一开始你没有意识到。
ilaipi
    46
ilaipi  
   2016-11-14 09:35:25 +08:00
错别字实在太多了
Email
    47
Email  
   2016-11-14 10:08:50 +08:00
@withlqs 游戏打的特别好, 能参加国内顶尖赛事 算智商高?
msg7086
    48
msg7086  
   2016-11-14 10:40:31 +08:00
设计模式本来就是从实际的代码结构当中提炼出来的。
就算你没有刻意去用设计模式,但是如果你写的代码维护性足够好,你会发现代码里或多或少会用到那些你甚至都没听说过名字的设计模式。
nbabook
    49
nbabook  
   2016-11-14 11:11:34 +08:00   2
为什么现在的程序员越来越觉得算法的意义和用处不大,是因为现在的框架大部分时候已经将很多算法进行了封装,你直接调用就行了,而不需要关注底层的实现,但是你程序中的每一次排序、每一个查找背后都隐藏着算法的精华。
因此,当你享用前人算法成果的时候,不要摆出一副算法无用的态度,嘲笑哪些辛苦研究算法的人。
几年前有个话题,是讨论为什么国内甚少出现大牛级的人物,就是认为国内技术人员缺乏对底层技术的深入研究,由于框架使用过多,所以导致国内技术圈出现一种思潮:底层技术(包括算法与数据结构、组成原理、编译原理甚至数学)无用论。然而,如果纵观国外技术大牛的技术发展史并打开各类框架的源码,才会发现其中所包含的大量所谓的『无用技术』的使用。
所以,如果你只是甘于当一位『技术使用者』,你可以无视算法这类日常看似无用的技术,但如果你对自己的技术有所追求,请拿起书好好学习。
YvesX
    50
YvesX  
   2016-11-14 11:17:36 +08:00
不是神话,重要程度因人而异。
如果想要精进,学好总是没有错的。
但精进并不总是好的。
coderluan
    51
coderluan  
   2016-11-14 11:44:51 +08:00
个人认为程序员的出路大概分三个方向
算法之类的专业基础不好的话
技术方向基本走不下去。
行业方向走不到前边去。
管理方向并不会有太大影响。
上边的回答基本都是从技术方向考虑的。
当然大部分程序员确实没有管理能力,如果能在一个行业坚持下去,自己不擅长就去用擅长的人做好的,那样工作也不会有太大问题。最可怕的就是专业基础不好还各个行业乱换的人。
jswh
    52
jswh  
   2016-11-14 12:11:18 +08:00
把程序员比作传统工匠的话,比如木匠?那么编程语言、各种库就是你刨子、凿子,工具掌握的好,可以保证做出东西,掌握得多可以做出更多的东西。但要有美感的东西、甚至艺术品,则要求必要的审美、造型的原理,数据结构之类的知识就是编程的审美、原理。工具决定能力的下线,而审美决定上线。
CS 的学校教育像学院派的,教的是审美,附带的教一些工具,而就业市场更多的职位是要求会工具。所以专业出身的人就很困惑,有点像美院油画系毕业去画插画的感觉。而我们这种野路子出身的,则是先熟练了工具,再努力提高艺术修养。
v9ox
    53
v9ox  
   2016-11-14 12:14:52 +08:00
你从事的工作涉及到算法 /数据结构, 就有用. 涉及不到, 就没有.
jswh
    54
jswh  
   2016-11-14 12:20:03 +08:00   1
@jswh 而谁能走的更远则取决于谁能更好的有工具把自己的审美表达出来。至于只研究审美的那是 XX 家的事,而不是工匠的事。我一直觉得,所谓程序员不过就是信息时代的工匠而已。
keikeizhang
    55
keikeizhang  
OP
   2016-11-14 13:26:42 +08:00
@jswh 这个比喻好
xjbeta
    56
xjbeta  
   2016-11-14 14:05:00 +08:00
初中级还行 毕竟在自己水平不行的情况下 为什么不用用简单无脑的第三方库
等第三方库满足不了你的需求了 算法什么的重要性就体现出来了。。。
Evovil
    57
Evovil  
   2016-11-14 14:21:12 +08:00
我觉得数据结构, 算法 , 程序抽象逻辑这三个是互帮互助综合的一体的东西, 单拿出来比较难分析。因为短板不一定是数据,可能是程序也可能是你的算法。
如果单拿数据结构出来说
这个分三种
1 对数据结构完全不熟悉或者入门
结论就是 你的程序就是个屎, 别人看不懂, 自己也不可能维护。 因为你自己都不知道怎么回事, 找不到你需要的数据。程序的重点并不是能跑而是能跑易维护方便开发, 而数据结构正是 结构化程序的一个核心, 还有块是抽象逻辑。
2 对数据结构有一定的经验
结论就是, 你的程序能跑也能维护的不错,所有的东西都能正常进行, 相信程序代码也是在这个层次。 然而阻挡不了需求和客户的增长。 简单说 我拿个 mysql 就写写 select 也能做个淘宝出来。但是一天 50 万人买东西, 才真正体现出优秀的分库分表, b 树,各种查询优化模块以及负载性能的重要性
3 大神。
适应日益增长的需求,鲜见性的开发优秀的可复用搞维护性的结构,不管是升级分布式,并行计算,各种奇怪模块部署都能有条不紊,稳定,且保证支持高性能算法和抽象程序的结合
LenonZeng
    58
LenonZeng  
   2018-06-06 11:04:19 +08:00
@Terry309 二叉堆也是可以的
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5417 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 32ms UTC 01:22 PVG 09:22 LAX 18:22 JFK 21:22
Do have faith in what you're doing.
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-11940834-2', 'v2ex.com'); ga('send', 'pageview'); ga('send', 'event', 'Node', 'topic', 'programmer'); ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86