为什么刚入门的程序员没有感觉到算法和数据结构的重要性?

发表时间:2020-06-16 13:48

知乎爆红微软大神justin亲笔原文


最近邀我回答问题的小伙伴很多,新人入驻知乎,非常感谢认可,每一条邀请我都会看。


题主的问题,相信很多人至少在人生的某一个阶段都会有。首先先摆结论,至少在互联网的头部大公司,算法和数据结构对于实际项目非常重要,是判定一个程序员水准的重要指标,为什么这么说,我先卖个关子,看看这一道算法题:


—————————————————————————————————————


给定字符串,给定字符串数组,判断数组内的字符串是否是给定字符串的“子串”,子串的字符都必须出现在父串,且顺序保持一致,如“abc”,是“adbac”的子串。


————————————————————————————————————


抽象,枯燥,让人感受不到他的实用价值。

那么,如果我告诉你这样一个我在工作中实际遇到的一个问题,曾经让无数同事头大:


我们的搜索引擎爬虫收集到了大批量的新闻数据(数亿条),不少媒体对公司有简称但由于简写的不同,比如Microsoft 就有N多版本的简写: MS,MSFT,MCSFT,MCFT,然而这些都指向同一个品牌。在文本处理上,显然不能把他们当作不同的单词,否则就造成信息丢失。

1.jpg


无数同事为这个问题挠破了头,有说把简写穷举,把所有映射关系手动列出来,有说用“编辑距离”来判定,等等。


我却说了另一个解决方案。面对有挑战性的问题的时候,实应该冷静下来,观察总结这些问题内在的规律,而英文的简写本身的规律,结合我刚才说的例子,是不是发现了一缕曙光了呢?英文简写,一定是简写中的字母都取自于原字母,且顺序不能乱。抽象出问题后,问题就迎刃而解了。而运用这个算法,不仅可以判定是否是某个单词的简写,甚至可以发现新的简写方式,一劳永逸地解决了这个难题。


2.jpg


这个时候你的想法是否会有所改观呢?而面对数亿级别的数据量,O(n)和O(log(n))的差距又是多大呢(log(10^9)= 9 ),又能减少多少运算时间,节约多少计算资源呢?答案是显而易见的。


这些看似枯燥的算法题,实际上是工程师在生产开发过程中碰到的实际问题的抽象。这里不是先有鸡还是先有蛋这样摸棱两可的关系,而是:现有实际问题,再有解决方案的尝试,最后才有问题的抽象化:也就是我们看到的枯燥的算法题的样子。但是现在学校教育很大的问题就是,只是单纯告诉你问题、解法,但不会告诉你这些问题是从哪里抽象而来的。


类似的日常工作的算法应用不胜枚举,比如我们常见的分类算法:KNN,用KD Tree优化,现在更进一步有了Faiss等。


3.jpg


孔子说过,学而不思则罔,思而不学则殆。这句话套用在业界的实际项目和学校也同样适用, 正如”学“和“思”的关系,如果一味探究理论,那么容易失去方向,搞不懂学习理论的意义,从而茫然,失去动力。如果只追求掌握工具,没有理论深度,就会赶紧重复劳作身心疲惫,而且职业高度严重受限。


其实这样的问题存在于不少人的心中,甚至是有工作经验的同学不少还有类似的疑惑。其实这反映了不少学校教育的重大缺陷,就是和业界脱节,甚至不少名校的讲师、教授没有一天的工作经验。美国的斯坦福大学称霸世界的一个原因就是产、研结合,大学身在硅谷,课堂上时不时可以见到业界明星,和硅谷公司的合作也非常频繁,学校的研究院解决的是公司在开发上遇到的难题,而这些研究成果,未来的一天会成为低年级的教材。在我国,虽然一些头部高校已经有所意识,但要走的路还很长。


篇幅所限,对更多职场实战项目感兴趣的朋友可以加我的微信咨询:longswordMAN。



作者:田穆君
链接:https://www.zhihu.com/question/400503367/answer/1284201520
来源:知乎

-END-

【LeetCode面试交流进群

or

更多互联网大厂求职、实习咨询】

4.jpg


分享到: