学算法不是最重要的。但是学好算法,参加面试,让自己的工资翻倍是最重要的。
因为大家都知道“中国式学习”是怎么回事。
绝大多数人的“学算法”实际上是这么回事:
——有个冤大头说他想招懂算法的人,让我们去糊弄他!
——对对!看看他要考什么题,我们背下来!
——还有这种题型?不行我得继续刷……
——好了,现在我有100%的信心糊弄过去……
——不!我不是糊弄!我真懂了!
嗯。糊弄多了,连自己都被忽悠瘸了。觉得自己不是背了些文本去糊弄人,而是真懂了。
骗子的最高境界就是连自已一起骗嘛。
很遗憾。
糊弄就是糊弄。一拉到实践上就原形毕露。
越是那些把自己糊弄的彻底的“高材生”,越是会造成更大的破坏。因为只有他“满怀信心”,却不知道自己只是个大忽悠。
在这个回答中,我提到的那800行代码,它有算法吗?
我一直以为没有。想到就写了,哪有什么算法。
但如果按你们的学法,那可不得了。
首先,XML本身就是一棵树,而且是多分叉的、数据类型多变的广义树。这可比二叉树“难”多了(这里的难指的是难糊弄,难混过考试,不是实际有多难——当然,对糊弄党来说,这玩意儿没有标准答案,自然是真的难)。
然后,我们要按文本顺序载入和分析它——最好从头到尾只读一遍,不做任何回溯,这样才能把复杂度降到最低。但这样一来,这就成了文本载入-分析-遍历的一条龙服务,你甚至都没法知道这究竟是先序后序还是中序遍历。
其次,因为每个节点都可能包含一堆下级节点,下级节点本身也可能有自己的下级节点;那么在分析时,遇到第一个<tag>标签我们就得把它压栈、然后把子节点、子节点的子节点统统压栈;直到遇到</tag>时才可以让它出栈——嗯,栈相关算法,对吧?
还不仅仅是栈相关算法。实践中,对端传来的xml可能是残缺的、或者传输中可能出现错误、也可能在封装时已经搞错了。那么,遇到不同的tag交错、tagB出栈时被它包含的tagA尚未出栈或者tagA出栈时才发现栈中没有tagA、或者一个节点分析完了才发现栈里“多余”了几个tag、或者某个tag出现了typo——你该怎么办?
最后,我们要如何把一个C结构体的类型、内部元素的类型数量位置等等信息表示出来?要如何自动生成这些数据?如何存储?如何解析?如何在单次遍历XML文本时,一边分析XML tag树一边重建C结构体?
再说一遍:当你学习的时候不糊弄别人更不糊弄自己时,这玩意儿实在太平凡了。平凡到完全不配叫什么技术、什么算法。想到即写而已。
但一旦你心存糊弄,你的二叉树能考满分、你的栈相关理论知识可以在任何场合对答如流;但别说让你写这种东西了,写完了给你看,你看得懂吗?
那么,这就是技术主管的意思:我们太熟悉你们的中国式学法了。你们用这种学法在算法上投入的一切心力都是无用功,因为你从一开始就志存糊弄。
相反,老老实实做你的项目,这时候你才没法骗人骗己。因为在工作中,一切装X都是在搬石头砸自己的脚。
那么,踏踏实实的,面对问题,解决问题,你才会知道算法究竟是什么,才会把它学成技能,而不是糊弄自己。
归根到底,三个字:稀缺性。
如果你是研究员,专门研究算法,那么你主管的说的话不对,你可以当他没说。但看题目描述,题主大概率是工程师。程序员的工作,并不是发明新算法,而是用已知的算法去解决已知或者未知的问题。
稀缺性这三个字怎么理解?
学算法可以让你找到一份很好的工作,无它,因为应届生都没项目经验,只能从算法能力方面考核。但工作后,你会发现,你大学时学的快排二叉树遍历等算法,在工作中基本不怎么需要用到。
况且公司不是慈善机构,公司聘请一个程序员,是为了创造价值。研究技术是很有意思,但技术的存在,是创造价值。但你算法的掌握水平,和创造价值的能力和并不是正相关的,创造价值的能力,可能和你过去解决问题的经验更相关。
总的来说,只学算法不能让你从现在的工作上快速晋升,接触更稀缺的资源。
学算法也不是不重要,至少在某些公司,即使你工作十年了,还是会考你那些leetcode上常见的题目,但刷题这事,对于工作了n年的人来说,不值得花太多时间,偶尔刷下,稍微熟悉下就好了。
普通编码中很少会用到算法。
主要还是了解你编程领域的各种概念。了解基本的解决方案。遇到问题的时候可以通过搜索和sof找到具体的参考代码。或者可以知道从哪里查阅文档。基本就能解决99%的编程问题了。也有非常难的领域。比如说图像识别、自然语音识别。你不会,我不会大家都不会。个别神级人才能搞得定。
因为是大实话。
我在Google那么久,没有写过一次递归,没有写过一次二叉树,没有写过一次快排,没有用到一次堆排序,没有用到一次动态规划。
不光是我,身边刷了几百道题的小伙伴,入职一年以后基本也都忘了精光,平时真不会用到。
Max Howell翻转二叉树都不会,照样能写出Homebrew。
算法这种东西,只是一张入门券,证明你头脑正常,有一定学习能力。本身有多大用,并不见得。
算法什么时候有用?跳槽的时候有用。
所以主管这么说,应该只是单纯的不想让你跳槽。
//---------------分割线---------------
本来只是吐槽,没想到这个答案突然火了,评论区基本两极分化。
关于算法有没有用,我之前的一个答案写的比较清楚。实际中,算法对于90%的工作是没有用的。
屠龙技有没有用?屠龙的时候当然有用,但现实中能有几条龙呢?
中途岛战役……