@
yaphets666 是你对力量体系一无所知。
进大厂的,就算只看技术线,难道还都是量产型码农了?就算真是码农,一开始就放弃技术专长和项目经验直接比做题经验了?就算应届的,没 paper 没会议成果好拿出来水的,再次也提提 GPA 啊参赛获奖啥的啊……直接就直奔刷题了,给 reviewr 感官通常也就是这要 low 到啥层次了只能看刷题了啊。
再者所谓刷题这种形式跟进厂能有多大关系?像 PAT 之类的本来也就是给人交作业用的。(虽然当年我早刷腻 ZOJ 都没兴趣碰了,反正本来也就是建议给外专业同学玩的,本专业不做硬性要求。)就算你想认为刷的这些所谓题能说明点能力问题,好歹也得划个难度层次的吧?(然而这种层次基本是看履历……包括算法竞赛。)然后你何德何能有底气确信对大厂有意义的门槛以上的题,里面是有几个用背代码能确保解决的?
然后稍微可能离点题的题外话,这里最需要婊的其实就是“算法”题这种形式,不管背不背什么东西。
我不是说题,是说所谓的“算法”在这里挂羊头卖狗肉。
如果能顺利解题(不背),的确是有掌握具体解题方式的可能性的。但非要管这叫“算法”,那还就是有点心智问题了。因为就算没背下来,会自主写出来的这些套路,撑死就是“算法实现”,还是具体到对码农工作都难以利用的那种。
做题的过程中除了熟悉具体语言的使用,对码农有点意义的经验就是选型。不幸的是,这些题的条件跟码农的真实工作环境差太远了。决策失败的后果也和实际工作相当不同。
码农和不那么码农的工程师相比,除了默认不那么需要了解工程文档和背锅(看工作环境而异),在使用语言实现算法的工作上可能确实要求经常相差不远。但那就是 happy path 。合格的工程师还需要面对不可预期的规格错误,乃至推着 PM 不合理需求的甲方爸爸扯皮。在没有足够多工程师顶包的情况下,水平层次不同的码农都会被视为这个角色。而做题对这方面的能力毫无帮助,甚至不会增长背锅抗压能力。(虽说 ICPC 训练队友之间甩锅熟练性的可能性微存。)
真实码农的工作往往需要独自处理切换 Plan A 到 Plan B (再菜也可能遇到,区别就是 plan 和锅的大小)。而对刷题党来讲,切换只存在于错估(是否做得出来)之后重新选题的投机,在原题上继续重试的无法用合乎工程范式的标准判分,因此刷题选手会不重视这点。这导致实际上再会做题的选手也是被高估的。再无敌的码农,实际工作中也不可能什么问题都一次性解对而不需要试错,所以处理错误路径的熟练性其实相当重要,但这在做题乃至竞赛中都基本无法体现。
另一方面,训练算法题恰恰架空了什么是“算法”的内涵。
算法分析这样的最重要的一类基础在做题的实践中只是停留在表面,做题的十分之一有这个基础就不错了(我是非常怀疑现在刷题的大部分甚至都没听说过主定理)。背题或者代码会更加严重降低这个基础的要求——要看熟题的模式猜到大致出题意图,就不用管什么算法哪来的,都是套路。
实际上,就算不讨论算法题,没有独立思维的“算法”爱好者通常不可能有机会正确搞对一些基础问题——即便是最专业的算法竞赛训练也不足以提供涵盖这些背景知识。
引用我之前在氵家(
https://www.ithome.com/0/648/992.htm )的一个回复:
算法学残的多了去了。随便抓个奥赛教练问个半算法(semialgorithm)存在的意义怕都是没底的。也难怪,一般算法描述训练时碍于理论基础不够,都用抠脚菜鸡的不严格描述(比如《算法导论》之类的伪码)入门,而九成九读者永远停留在入门阶段不懂在理论 CS 上缺了什么课要补,更不懂一般调教算法的普遍规律就是他们自以为无足轻重的语言里的——明明后者才是真正普遍的模型。这导致一堆菜鸡问题,比如要你去写个任意满足 PTC(proper tail call)的算法八成都会卡壳,因为算法用的语言太弱,要保证这种性质就得内嵌一个支持 PTC 的解释器。而训练合格到能解决这类问题的,会说自己做 calculi/semantics/computation models ,却一般不好说做 algorithm——太 low 了。
这个批评是涵盖所有自卖自夸搞“算法”的。考虑到会这样想的其实主要也就是比较不长进的码农,所以倒不必担心误伤实际上真的在从事改进和创造算法及其有效实现的工作的人。
所以你看,我其实都不太在乎背不背了。对正经码农工作,做题一直天然地比较 low ,差距还不小,所以有差嘛?
如果真有差,那么过滤口嗨的算法小学生的问题也不是没有:
算术复杂度和位复杂度有什么区别?
指针的算数操作的复杂度多少?
不是靠背,而是正经靠做题然后结合题面外的知识自行演绎理解爬上来的码农,这点应该还是能有点 13 数的(大概……)。