3年前硕士毕业前夕,我担心找不到工作,一口气投了27个简历。遇到面试题时,总想如何表现自己,总是在寻找一个问题的最优解。每当给你一个N行M列的矩阵,N和M小于1000,那么就开始想怎么得到一个时间复杂度O(NM)的解法;每当给你一个包含N个数的数组,让你优化什么东西,那么就开始想怎么样做到O(N)或者O(NlogN);每当给你一个big number,那么一定有某种数学方法在O(logN)或者常数时间得到答案。

发现一个有趣的题目的最优解看似有趣,但有的时候会让你在面对复杂问题时把程序弄得更复杂。比方说,如何搭建一个user autocomplete service?从算法和数据结构的角度考虑,第一反应就是建立一个trie。当面试官让你对user按照follower多少排序的时候,你可以让trie每个节点多存一些数据。当面试官说她既想autocomplete user first name,又想autocomplete user last name的时候,你可能想按照first name, last name建造一个trie然后按照last name, first name建造一个trie。那如果用户名又有middle name怎么办?面试官想按照id autocomplete怎么办?面试官想personalize user autocomplete怎么办?

在你试图用最优解方法来解决一个问题的时候,这个方法渐渐变得不易扩展。可以想象那时面试官心里的表情,而我也在担心自己是不是会被那个公司reject。当我开始工作,完成的project越来越多的时候,我越来越意识到解决一个问题的有效方法更为重要,这个方法来自于你对问题更深入的理解和估计,很多美国本科毕业生常常表现的更好。你需要知道从memory里读数据大概要100ns,读SSD大概要16us,Disk seek可能要3ms,这比一个data center里的round trip(500us)还要慢,但是比CA到NYC的round trip(200ms)要快得多。AWS提供的机型有8x800GB的SSD硬盘,足够你将上题中提到的trie换为其他更简单的key value store存在硬盘上并且承担足够大的QPS。当面试官想让你设计一个系统来realtime回答每个地区实时有多少空出租车,有多少在工作的出租车,以及有多少用户在叫车。关注最优解的人也许会想到直接通过用户实时数据反馈来更新数字,这时你就会被面试官challenge一些奇怪consistency问题。如果你维护一个key value store,用户只需不断的update这个key value store,而你实时扫描这个key value store,2012年美国才有200k taxi drivers,现在也不超过400k,一秒钟你可以扫描上百次这个key value store。

有了这个有效的可行解,还需要什么优化呢?

如果你想面试一个更高level的职位,你可能要对某一领域很精通,说到这就要区分吹牛逼的人和做实事的人了。也许你在外演讲CAP,并且能清楚区分Linearizable consistency,Sequential consistency,eventual consistency,可是搭建出来的系统原公司里的人都不想用。也许你每天对着实验结果说这个significant,这个不significant,可是却说不出chi-square distribution的基本性质。这里的种种故事今天就不讲了…

吐槽到此结束,各位看官见笑了。

王 栋

来offer特约作者。清华大学姚班07级,信息学竞赛国际金牌。目前任职于硅谷电商网站Wish,专注搜索推荐算法及系统设计。曾任独角兽公司Pinterest搜索排名负责人,带领团队设计和实现了高度可扩展的搜索平台,以及机器学习搜索结果排名算法。

code-wang

图片来自网络,版权属于原作者