BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #81191同步于 2014/7/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]既然算法在工程实际中没什么用,为何面试题一考再考

jffifa
2014/7/31镜像同步31 回复
楼主程序员,在大学期间也算是刻苦学习算法,参加过学校组织的编程比赛并或过奖,所以自认算是算法水平还行。也得益于此,毕业后进入国内某还不错的互联网公司工作。 但是在实际工作中,楼主却发现,只有在极少数的情况下才会用上大学期间学的那些知识。在大部分情况下,楼主遇到的都是些极其简单的算法和数据结构,比如哈希表、快速排序等等。本科学的那些高大上的数据结构,比如xx树,以及各种数学知识,比如算法的复杂度分析,根本是鲜有接触机会。 根据楼主的见识,在工业界,程序的逻辑性、严谨程度以及可维护性甚至比程序的效率更加重要,在重视业务迭代速度和服务质量的互联网业界尤甚。所以业界甚至有为了代码的可维护性而牺牲算法效率,使用比较简单的算法来解决问题的情况(你的程序太过艰深晦涩,你走了之后谁来维护?软件工程对于可替代性的要求可是很高的)。 即使是在确实需要比较复杂的算法和数据结构的场景下,通常也有现成的代码库或组件来实现所需要的功能(哈希表和快速排序这种简单的东西就更不在话下了),你需要做的就是学会如何使用这些库而已。 再退一步而言,即使你需要对这些代码库有深入了解,以解决工程实践中可能遇到的各种问题,届时再去深入学习和研究也是可以的。大学期间对于算法进行全面的学习,感觉没有必要。 以楼主对业界的认识,在工作中需要对某方面算法进行深入研究和学习的程序员绝对是凤毛麟角,而且大多数是作为研究员折腾论文的,参与实际业务代码编写的人很少。相反,大部分程序员更多地参与应用逻辑的编写、数据交互业务以及后端数据的存储和维护,因此比起算法更应该深入掌握的是操作系统底层工作机制、语言的编译和运行时机制、网络协议与交互(就楼主所在的互联网业界而言)和计算机系统组成原理等知识。 然而现在各种公司招募程序员,对于算法水平的要求却越来越高,喜欢问一些非常难的算法问题和数据结构设计。这让楼主非常疑惑,贵公司的业务真的对算法水平有那么高的要求吗? 而且某些人就因为算法和数学水平还不错,就自我感觉高人一等,真不晓得是为什么。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
shan10211865机器人#1 · 2014/7/31
看到最后一句才发现楼主的槽点
gootyking机器人#2 · 2014/7/31
可能就试试你是不是真的感兴趣。。 【 在 jffifa (赢了,天天笑醒) 的大作中提到: 】 : 楼主程序员,在大学期间也算是刻苦学习算法,参加过学校组织的编程比赛并或过奖,所以自认算是算法水平还行。也得益于此,毕业后进入国内某还不错的互联网公司工作。 : 但是在实际工作中,楼主却发现,只有在极少数的情况下才会用上大学期间学的那些知识。在大部分情况下,楼主遇到的都是些极其简单的算法和数据结构,比如哈希表、快速排序等等。本科学的那些高大上的数据结构,比如xx树,以及各种数学知识,比如算法的复杂度分析,根本是 : 根据楼主的见识,在工业界,程序的逻辑性、严谨程度以及可维护性甚至比程序的效率更加重要,在重视业务迭代速度和服务质量的互联网业界尤甚。所以业界甚至有为了代码的可维护性而牺牲算法效率,使用比较简单的算法来解决问题的情况(你的程序太过艰深晦涩,你走了之后谁 : ...................
gdl机器人#3 · 2014/7/31
我最头疼就是算法了。。找工作确实要看这个,最近在恶补
Silent机器人#4 · 2014/7/31
基本的数据结构和算法还是要掌握的吧 感觉算法挺有趣的,不过对面试时候考竞赛性质的算法题也很无语
nuanyangyang机器人#5 · 2014/7/31
算法是很重要的,毕竟是一切的基础。 问题可能是ACM-ICPC的训练和比赛的方法。ICPC竞赛的算法严格地说没有边界,什么算法都可能出现,但可以感觉到会偏某一些种类,同时也会刻意避免某些种类。但在工业界甚至学术界,具体用到什么算法,和具体的领域是相关的。 比如数据结构课和ICPC竞赛一般会涉及P问题,对于NP问题多数时候是回避的。但很多现实问题不是P的,可能比NP还难,求undecidable问题的近似结果也有需要。 还有一些领域会用到一些古怪的算法,可能80年代就有很成熟的解法,但可能涉及的领域比较偏,ICPC竞赛不会比它。 另一方面,算法(如果只研究时间复杂度和空间复杂度的话)是纯理论的问题。在任何图灵完备的设备上都能实现。但是一旦实现,很多问题就超出了传统的理论所讨论涉及的范围,比如cache的局部性问题(为什么理论上最坏时间n*log(n)的堆排序实践中反而比最坏时间n*n的快速排序慢),比如复杂度考虑n超过某值时一个算法总比另一个快,而忽略了n很小的时候(比如从100000000个整数中找出前10小的数,一个O(n+k*sqrt(n))的算法反而比O(n*log(k))的算法快。 或者,如果正确性不要求100%,我们又会如何实现这些算法?有一门课叫“人工智能”专门研究NP问题或者非精确问题。 还想引用我导师说的一句话:“‘困难’可以翻译成‘成本高’,‘成本高’可以翻译成‘如果我们的人力、财力不够,那么我们宁愿不做它’。”比如,为什么PHP语言这个有几百万甚至可能上千万美元投资的超级流行的东西做得像屎一样,就是语言和虚拟机真的很难做,难得让人想宁愿图省事也不花功夫做好(而且你得有专家才行)。Java这么高的性能,是至少10亿美元的投资的结果。 我现在在做一个项目。这个项目非常难,高性能的正式产品不知道要几年才能出来。我在做一个版本,最近刚开源了,它被称为“reference implementation”,也就是接口、行为很接近设计的初衷,但实现要快,目的是验证设计有没有问题,同时也让潜在的用户预览一下它的接口是什么样的。做这个reference implementation的时候,很多设计原则变得和设计一个高性能程序不同了:应该选用简单但是明显正确的方法,而不是复杂,可能效率高,但要花很多时间,而且很难验证正确性的方法。毕竟是“reference implementation”。 记得我上数据结构课的时候,老师强调过,一个程序/算法的最重要的是正确性,其次是可读性,最后才是时间复杂度和空间复杂度。 如果有兴趣,有一个领域很有意思,叫形式化证明。比如,你以前写过mid = low + (high - low)/2吗? http://bbs.byr.cn/article/ACM_ICPC/80036 据说很多课本上的二分查找算法都是错的。
nuanyangyang机器人#6 · 2014/7/31
【 在 jffifa 的大作中提到: 】 : 楼主程序员,在大学期间也算是刻苦学习算法,参加过学校组织的编程比赛并或过奖,所以自认算是算法水平还行。也得益于此,毕业后进入国内某还不错的互联网公司工作。 : 但是在实际工作中,楼主却发现,只有在极少数的情况下才会用上大学期间学的那些知识。在大部分情况下,楼主遇到的都是些极其简单的算法和数据结构,比如哈希表、快速排序等等。本科学的那些高大上的数据结构,比如xx树,以及各种数学知识,比如算法的复杂度分析,根本是鲜有接触机会。 : 根据楼主的见识,在工业界,程序的逻辑性、严谨程度以及可维护性甚至比程序的效率更加重要,在重视业务迭代速度和服务质量的互联网业界尤甚。所以业界甚至有为了代码的可维护性而牺牲算法效率,使用比较简单的算法来解决问题的情况(你的程序太过艰深晦涩,你走了之后谁来维护?软件工程对于可替代性的要求可是很高的)。 : ................... 貌似上一贴跑题了。 我不赞同面试别人的时候乱问算法。尤其讨厌问如何交换两个变量的值,或者问一些undefined behaviour。如果一个公司不知道怎么面试应聘者,这个公司也不会太好。 p.s. stackoverflow的开发者曾经写过一篇博客讲应该如何面试,以及“99%的应聘程序员岗位的人根本不会编程”: http://blog.codinghorror.com/how-to-hire-a-programmer/ http://blog.codinghorror.com/the-nonprogramming-programmer/ http://blog.codinghorror.com/why-cant-programmers-program/
bswgd机器人#7 · 2014/7/31
真庆幸我遇到的面试官都比较聊得来,没怎么刁难我那些乱七八糟的算法题。 (记得去年去面试某公司,面试官是微软员工出来的,工程能力不咋地,偏偏只会问算法题,还叫我证明一下算法是正确的,然后我就收拾了一下东西说“再见,咱们不适合。”)
buptxrc机器人#8 · 2014/7/31
吴导就是叼 【 在 bswgd 的大作中提到: 】 : 真庆幸我遇到的面试官都比较聊得来,没怎么刁难我那些乱七八糟的算法题。 : (记得去年去面试某公司,面试官是微软员工出来的,工程能力不咋地,偏偏只会问算法题,还叫我证明一下算法是正确的,然后我就收拾了一下东西说“再见,咱们不适合。”)
gleiz机器人#9 · 2014/7/31
这个又是什么饵?