我与某人因是否应该记住代码而发生挣执[The conflict between me and somebody over whether to remember codes]

2022-10-31 10:12:19 +08:00
 mascteen

Table of Contents

  1. 事情是这样的:
  2. English Version

事情是这样的:

许久之前,我更新了一条状态,建议刚入行的新人如何快速上手代码,其中有一条这样写到“多去看别人写的代码如果有必要可以把一些优秀的代码背下来”,然后冲突就发生了。我认为做为一个新人,如果他人把一个逻辑用一段非常优秀的代码实现了,那记住这段代码是一个正确的学习方法,就如同我们也会经常背诵优美的句子。而某人认为这是无稽之谈误人子弟,写代码主要是靠不断的练习和实践,哪有去背诵代码的。大家是怎么认为的呢?

English Version

There's the thing:

Some days ago, I push a tweet, suggesting how newbie coder get quickly start handy coding. One of mine advises was said, "Learn code from career programmer and memorize some excellent code if necessary", then somebody not agree with that. I think if someone implements a logic with a good design pattern, then remember this code is a good way to learning, just like we appreciate beautiful sentences. But somebody just think this is redicules and misleading the newbie. Mastering code is mainly continuous practice and experience, and remember code always not a good way to learn. What do you think?

2395 次点击
所在节点    程序员
23 条回复
FrankHB
2022-11-02 21:03:19 +08:00
@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 数的(大概……)。
yaphets666
2022-11-03 09:42:28 +08:00
@FrankHB 你说这么多也没用啊兄弟,在今天来看,进大厂不刷算法题绝对进不去,不管是国内还是国外。
FrankHB
2022-11-03 20:59:05 +08:00
@yaphets666 那你可以理解我对这些所谓大厂(或者至少是通过你理解的方式进这些厂)以及这种方式混入其中的人没什么兴趣。因为客观上讲,人数不少,入行以后对业内影响实在有限。再不乐见,我也没理由为了跟我不太搭边的下界琐事浪费太多时间。

然而 OP 说的“入行”“新人”显然并不只事关这些厂和这些人。这也是我后面“稍微离点题”而不是彻底跑题的理由。

你应该也注意到我对算法小鬼(并不表示这些人技术一定差,其中甚至可以包括某些正儿八斤的算法竞赛选手)的不爽,远甚于刷题混进大厂的。因为小鬼的层次更加高一点,和我所处的生态环境相对更相关,并且远远更容易造成破坏。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/891338

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX