我很可能答不出或者答错这类问题,但是幸运的是,不可能再有人用这类问题来面试我了。
面试我的时候宾主双方会在亲切友好的气氛中就未来技术发展趋势中几个共同关心的问题彼此充分交换意见达成共识。
在实际工程实践中,高速缓存,SIMD指令和某些内存访问特性会颠覆你从书本上学到的关于算法数据结构的时间复杂度的认知。
O(n)不一定就比O(logn)慢,顺序搜索数组不一定比二叉树查找慢。
内存,网络和外部存储的IO性能对算法和数据结构的选择起决定作用,cpu速度不一定是最大影响因素。
这就是我们所谓的“高科技”企业只能电信诈骗、联手莆田系做局以及拿钱砸小贩的原因了。
就这点水你还能指望他们搞别的什么?对这些本质上不过小贩水平的家伙,什么高科技不是神话?
算法有没有用?
当你做局诈骗卖白菜时,那是真没用。
但只要你稍微有点追求,稍微脱离菜贩子这样的底层眼光,你就会知道,真有用。
在这个案例里,起初我压根就没意识到自己化用了树、链表、递归等诸多“算法”——注意是化用,只会刷题死路一条——远比很多据说完全是“钻无用的牛角尖”的hard级算法题目难得多。
但最终做了个什么?仅仅是一个不侵入编译过程的、简化版的protobuf而已。
就这么个入门级的、低水平的库,你就得有这么多的技术储备。
效果也是立竿见影的。上百号人天天996写出几十万行代码搞两年满是bug还没搞定的东西,换这个,一个人,955,三周不到,800行代码,一劳永逸的搞定,0bug。
业界那些诈骗做局卖白菜之外的项目,这类“高级程序员效率高过一般水平的程序员十倍”的案例比比皆是;甚至同是程序员,强者效率百倍于弱者都是司空见惯——尤其是,就不用多高了,就protobuf这种糙货,水平不够的程序员熬到下辈子都写不出来。
问题在哪?
其一,应试教育,教出来的绝大多数人只会做题不会做事。能熬夜加班google百度到处抄、把很简单的东西凑合出来已经很不容易了——大多数人还没这水平呢——你还想他巧做、有创意的做、做成基础性支柱性的库、提供精巧高效稳定的API、支持未来几十年里的所有同类需求?做梦都不敢想。
其二,普遍的低水平、普遍的价格战、普遍的垄断压制了“向上突围”的可能,只能“下沉”下去,和小商贩们打价格战、和民间骗子携手共进——这样才能来钱啊。
你做别的,一个是普遍水平偏低,导致“向上看”的项目绝大多数只能招一些南郭先生混你的钱然后可耻的失败;另一个是,你好不容易做成功了,“能人”就出来了,又是反编译又是源码泄密或者带项目跳槽的,手里大把票子的大鳄轻松把你抄死——抄死你别人都不知道是你先搞出来的。人家有钱砸舆论,你呢?还指望靠这个好不容易成功的项目回本呢,哪来的底气和人家拼烧钱。
你看,低水平的现状使得想搞“高水平项目”的公司举步维艰、使得任何“技术突围”成功者马上就被“商业歼灭”,重新陷入低水平竞争;低水平竞争的现状又限制了需求,反过来强化了“程序员不需要懂算法反正都是CRUD”的风气;这种风气回过头来再次限制了那些试图“向上走”的公司、也把学有所成的程序员拖死在996的泥潭里——于是就“候选人答对比例差不多不到两成,工龄越长,比例越低”:反正都在CRUD,996那么多年,那点绕口令能不忘吗?
这就是所谓的内卷。
怎么办?
还是那句陈词滥调:尽量往上学,提高自己的技术水平;拒绝996,寻找更能体现自己价值的工作——你有能耐比普通程序员效率高几倍,何必和他们一切吊死在一棵树上呢——哪怕不得不996,那也要相伴磨洋工、腾出时间提高自己,等待质变的那一刻。
毕竟,国家已经布局,在中小学就引入编程了;将来高水平的程序员会多起来的。当时机成熟、有了足够的人才储备、整个行业可以往高处走时,您是想“像被用破了的抹布一样被丢掉”呢,还是想“像久经磨砺的宝石那样显露光华”呢?
对公司来说也一样:为什么要考算法?明明我们只是在卖白菜!
答案很简单:技术精湛的程序员效率更高、更不容易搞出错误——卖白菜你们的服务器都更稳定、更能应对冲击、更不容易丢单;尤其是,将来市场风向变了、需要往上走时,公司不至于抓瞎:“俺们公司里都是些小贩……你突然说要玩高科技……俺们牙齿还没刷呢”。
今天又陆续收到了一些评论和赞同,我想在原答案的基础上补充一些原来没有提到以至于被评论区某些朋友误解的内容。
即如果你在工作之余有精力,时刻巩固算法解题能力仍然是推荐的,当然除了巩固算法能力外,一些持续的技术产出也是推荐的,例如开源项目、学习笔记、论文阅读等等,这些东西都会构成你技术影响力的一部分,它和你所在的工作单位、部门、负责的项目、担任的角色、项目周期(上升、平稳、下降),以及你所遇到的机遇一起,构成了你程序员生涯的上下限。
以下是原答案:
我想从另一个角度回答一下这个问题。
全国高考刚刚结束,我有一个习惯,就是每年高考结束都会去简单地看一下陕西省的高考理科数学和理科综合,当然,我会发现我会做的题越来越少了,即是是化学和生物这种强势科目(可能更多地依赖机械记忆),我能写出的反应方程式和记住的实验细节也会越来越少,直到今年我已经写不出银镜反应方程式了。甚至,即使是数学这种平时还会或多或少用到的科目,一些考察较少用到的知识点的题目,我也会忘记解题套路,对,是解题套路。
我想表达什么呢?即,如果你的工作不会直接地和你学到的这些知识打交道的话,至少是我,会遗忘的很快。我们都做过学生,学生的任务就是熟悉各种知识点,然后通过反复大量练习举一反三,学会解题套路,然后考高分,在这个过程中你会反复地使用这些知识,但是当我们不再是学生,这些知识由于疏于使用,会渐渐被遗忘。
同理类比于工作中也是一样的,我们不考虑成功人士,绝大多数应届毕业生,毕业后进入互联网公司,大家的工作无非是,写界面的写界面,写增删改查的写增删改查,少部分运气更好的,他们可能可以写一些基础组件,例如手Q的消息收发、消息缓存等等,注意是少部分。然而这样的工作我们至少要重复1-3年,才可能有机会去做一些更高级的事情,例如某些事件、绘图引擎等。
在这1-3年所做的工作中,除了面试,真的很少用到LeetCode程度的解题套路,在我前前后后实习和正式工作经历了3家互联网公司,可以坦白地说,用到了栈和队列、哈希表程度的数据结构。
或者更具体一些,我们一旦通过了学校的数据结构与算法考试、大公司的校招笔试、面试的算法题,你还会用你学到的算法知识去解题吗?或者更具体一些,我们刷烂LeetCode,是为了学得一手好算法,还是为了拿Offer?
我不是圣人,我对算法,尤其是用算法解题几乎没有任何兴趣,我也没有任何解算法题的天赋,我得到的正反馈激励是很弱的,往往需要经历大量的TLE,WA,看题解才能看到一个AC,实话说我刷算法题,就是为了拿Offer,跟我小升初、中考高考,学奥数,刷53是一样的,更何况,在我工作的1-3年中,除去跳槽,几乎都不会用到呢?
我有朋友,最近辞职准备跳槽,他开始刷算法题了,你说他是为了巩固数据结构和算法的知识吗?
最后回到题主的问题,怎么看待程序员普遍缺乏数据结构和算法的知识?
你相信我,只要是临近面试需要,我们会立刻尽自己所能学会你说到的所有算法,尽自己所能尽可能多的做算法题,这个周期通常是7到14天,一般不会不让你失望,但是如果你问到我恰好不会的,那只能怪我没有复习到了,毕竟真的很久没用了。
我觉得计算机还有很多比解题套路更有趣的东西,希望能理性讨论,请务必不要向我宣泄情绪,非常谢谢各位观众姥爷。
这是现实啊,你以为码农每天都在写算法改变世界……实际上都在写CRUD(create read update delete)没毛病吧,对DB的CRUD然后包装一层service,service里对多个实体CRUD,再返回给api层。80%的代码不都在干这些嘛?
这被戏称为CRUD boy,码农都是CRUD boy,我也不例外。近两年都在做电商的系统,不是围着订单转就是围着支付,物流转。这些业务逻辑无外乎围绕这状态的变化进行CRUD,没用到太多算法。
我们不能说CRUD就很low,实际上复杂的系统都是可以分解成若干个简单的子系统来构成。每一个子系统里边做的事情可能也就是增删改查,但是这些子系统组合在一起是可以表达很复杂的系统状态,或者说复杂的流程。
互联网这几年发展比较快,很多非科班的学生也都进入了这个行业。在转行的时候,大家考虑的都是经济效益,第一要素就是熟悉一门编程语言会一些数据库操作,找到工作。所以说不会有太多时间去学习数据结构的算法。
但是我要强调,不是所有的项目都是CRUD就可以搞定了。比如说一些广告后台,搜索,排序推荐的系统,还是有一些数据结构的。比如说搜索引擎里边,最后对召回的结果要进行合并,很典型的合并k个有序的数组算法。再比如说热搜词的实时统计,你怎么实现?直接拿DB增删改查可不行。
那么面试的时候为什么面试官都喜欢问算法的数据结构呢?因为算法和数据结构最能体现一个人的基本功。基本功扎实的人,无论是做工程还是去做算法,都不会差到哪里去。我们招人的时候都有一个标准,就说招进来的这个人至少要排到team里面前50%。只有这样招进来的人才能够让我们的team更加强大。不可能招一个很差的人来拉低平均水平。。怎么评判这个人能够在team里面排到前50%呢?其实是有很多标准的,比如说算法数据结构就是里边很重要的一部分,其次,他的逻辑思维能力,系统设计能力,他的职业素养等等。但是算法和数据结构占的比重还是最大的。
你说如果连数据结构和算法都不会,有没有什么影响。我觉得是有的,要知道程序员这个群体也是有金字塔结构的。如果你连基本的算法和数据结构都不会,基本上属于比较底层的程序员。比较底层的程序员就意味着比较低的薪酬。同样是出售脑力劳动和时间,你比别人少赚。
所以看在钱的份上,请你不要忽视算法跟数据结构!!!
最后
学校没教过,工作中用不到,时间长了也一直不会;
学校没教过,工作中用得到,时间长了也就会了;
学校教过,工作中用不到,时间长了就忘了;
学校教过,工作中用得到,时间长更熟练了;
=========================================
N年经验还从事开发工作不会这些东西且混的还可以的,说明他的工作中不需要这些东西,尤其是做MIS的、围着数据库转的。
=========================================
程序员鄙视链:
科班出身的>非科班出身的
纯IT公司的>行业IT部门的
纯做技术的>技术+业务的(做行业的)
数学好的>数学差的
。。。