大智网汇
综合信息情报站

程序员怎么记住众多代码的?

赞(0) 打赏
以上内容(如有图片或视频亦包括在内)为自媒体平台用户上传并发布,未作人工编辑处理,不构成投资建议请自行甄别,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:wolfba@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容!

评论 5

  1. #1

    在著名的畅销书《刻意练习——从新手到大师》一书当中提到了这么一个案例。说是在导航软件出现之前,伦敦的司机有一项超能力,乘客只要告知目的地,就能瞬间在脑海中构思完接下来的驾驶路线,并稳稳地抵达。要知道伦敦是国际化大都市,城市交通网错综复杂。要记住庞大的路线、地图已经足够困难,更何况还需要快速计算出路径呢?

    对于这个问题书中给的解释是心理表征,这是一个英文翻译词,因为文化隔阂的原因导致它比较难以理解。我个人觉得理解成抽象信息更加直观,随着信息的一层层抽象和聚合,信息的密度会增大,信息的体积会随之减小。也就是说信息越抽象,我们要“记”的内容就越少,也就越容易被记住。

    伦敦的出租车司机并不是将地图印在了脑子里,而是对伦敦的路线提炼了非常精炼的抽象信息。使得只要一听目的地和当前时间,就能立刻反应出应该选择的最优路线。书中还有一个例子是记棋谱的例子,一些象棋高手可以快速记住一局残局每一颗棋子的位置。然而神奇的是,如果棋盘中的棋子是随机摆放的,他们的表现和普通人相差不大。只有是真实对弈的残局或者局面时,他们才能快速地记住。

    这说明了高手们之所以能记住盘面,并不是依靠记忆力记住了每一颗棋子的位置。而是利用了盘面中棋子位置之间的抽象信息,随机摆放的棋子是不包含抽象信息的,而真实对弈的棋局,每一颗棋子摆放的位置相互之间存在一定的逻辑。这些象棋高手可能自己也说不出来这逻辑究竟是什么,但他们正是通过它完成了记忆。

    如果大家了解过深度学习,尤其是卷积神经网络的话,会发现这和图像识别问题当中的卷积网络异曲同工。我们知道一张图片包含上百万甚至上千万像素点,每一个像素点都有独立的取值,因此图片的内容千变万化。我们直接从像素点入手想要设计一个模型是非常困难的,因此我们势必要做一些抽象和聚合。这也正是卷积神经网络训练的过程,我们来看下下图。

    模型的输入是一系列像素点,第一次抽象,我们会将相邻的像素点聚合,从而得到了一些边。第二次抽象,我们再将相邻的边聚合,得到了一些区域图。第三次抽象,我们再将局部的特征图聚合,就得到了一张完整的人脸。在这个过程当中,模型的参数数量是减少的,相比于输入层上百万甚至更多的参数,输出层可能只有几百个甚至几十个。

    这正是因为信息的高度抽象使得模型要“记住”的内容大大减少,到最后,都是高度抽象的信息,根本用不到太多的参数。

    在编程和算法领域也是一样的,高手们能力出众依靠的并不是记忆力,并不是因为他们记住了多少算法。算法题千变万化,只靠记忆是不够的,高手们和伦敦的出租车已经象棋高手一样,依靠的是对心里表征或者说高度抽象信息的驾驭。

    联想能力

    有一句著名的广告语,叫做人类失去联想,世界将会怎样。不考虑商业成分,单纯看字面意思,这句话毫无毛病。联想能力几乎能和思维能力画等号,这也是算法高手们的杀手锏所在。

    前面说了算法高手之所以能力出众,并不是依靠记忆力,靠记住了多少算法,而是依靠的抽象信息。那么在我们思考问题的过程当中,这些抽象信息是怎么起作用的,或者说高手们是如何进行思考的呢?依靠的都是本能吗?当然不是,依靠的是联想。

    普通人的大脑当中,知识是以点状图分布的。当遇到实际问题时,能想起来的只有那么几个点。而高手的思维当中,知识同样是以点分布的,只不过和普通人不同的是,高手会用联想将这些点串联起来,组成一张知识网络。遇到问题时想起来的就不再是几个零星的点,而是一大片知识网络,因此更容易获得启发想出解法。

    比如我们来举个例子,我们遇到了LeetCode中一道题。普通人读完题目之后一旦没有思路,就会陷入干想。他们知道要分析要推导,但完全不知道从何下手,只能瞪眼干想。而高手们呢?由于他们的知识体系非常紧密,读完题之后可能瞬间就联想到了几道类似的问题,或者是常用的一些解决方案,脑子里能有好几种想法。之后只要把这些想法一一验证,过滤掉不可行的。

    如果这些想法都不可行,那么就进一步分析它们不可行的原因,再从这些原因出发继续联想。如此操作往复多次,往往解法也就浮出水面了。

    看到了吗,不是在记忆里检索学过的算法生搬硬套,而是分析问题,通过联想寻找解法。

    原理大于一切

    通过前面的论述我们已经知道了,思维能力由两个部分组成,一个是知识点,另一个是联想能力。那么想要提升能力也可以从这两个角度针对性地入手。

    专题练习

    虽然我们说学算法不能靠死记硬背,但并不是说记忆力不重要。一个算法我们完全都没听说过,自然也就很难解决它适用的相关问题。想要拓展知识面,别无他法,只有依靠学习和练习。

    但学习和练习也是有技巧的,并不是机械的越多越好。由于篇幅原因,这里只说一个最贴切的——重质不重量。

    字面意思是更加看重质量而非数量,深挖一点来说是更加看重理解,尤其是核心原理的理解。核心原理是算法领域抽象程度最高的信息,最有含金量,将它记住的成本最低。比如很多同学觉得动态规划很难,种类很多,千变万化。但它的原理很简单,无非是状态转移和最优子结构两点。我们深入理解了原理之后,剩下的只需要根据实际情况随机应变即可,根本不用拘泥于代码形式。

    想要达成这点,最好的方法是专题练习。每次只学一个算法,一次把这个算法相关的各种变形问题都做一遍。把当前算法的原理搞懂吃透,一般来说一个专题做完之后,算法也就完全记住了。

    发散练习

    发散练习针对的是单个题目,大多数情况下,一道问题往往有多种解法。通常情况下,我们最容易想到的是我们最熟悉的算法。不少同学追求刷题数量,一旦通过题目就放在一边了,也不会再去深入思考尝试其他解法了。

    在一道已经通过的问题上继续花功夫,怎么看都是无用功,但事实并非如此,这也是很多acm大牛常用的训练方法,叫做发散练习。

    这么做的好处很明显,首先可以帮助我们开拓视野,一个是可以增强一些我们不太常用的算法的练习,另外一个很重要的理由是,很多时候不同的算法意味着不同的思路不同的推导过程。我们把几种方法都写出来,互相对比,不但对问题理解得更加深刻,也可以让我们对算法本身加深认识。很多时候会有“原来这题也可以使用这种方法”恍然大悟的感觉。

    还有一些大佬在练习的时候,会强制自己使用某一个算法。明明不是动态规划的问题,也想尽办法用动态规划去解释去思考。明明不是网络流的问题,也通过网络流去建模。通过这种方法逼自己开拓视野,增加对算法的理解和熟悉。动态规划和网络流非常经典,适用面也非常广,号称一切问题都可以使用这俩来建模。虽然略有夸张,但这种做法却很值得我们借鉴。

    这几年随着互联网行业发展越发成熟,国内大小公司对于算法问题以及思维能力的考察也要求越来越高。越来越多的公司会在面试当中进行算法题和思维题的考察,因此想要成为优秀的工程师,斩获知名公司offer,算法能力的提升和补充非常重要。

    针对大家的这个需求,老梁最近一直在公众号更新《代码随想录》的学习笔记系列。说是学习笔记,其实可以认为是随想录的随想录了,我会就书中提到的比较重要的算法和习题都做我个人的阐述和讲解。有没有看过原书都不影响大家的阅读,如果有这方面需要的话,不妨加个关注。

    算法学习路上,与你同行,共勉。

    梁唐1年前 (2023-02-19)回复
  2. #2

    离开业务逻辑强记那些代码没有意义,程序员主要是关注技术的应用场景,不会关心具体的实现。

    比如一个业务场景,是用数组还是链表,实际开发过程中大多数都是哪个用的顺手用哪个。工作中当你问同事为什么用这个容器的时候,别人大概率不会给你从时间和空间复杂度的角度去分析,而是说“xxx也是这么用的”。不少程序员毫不关心这些细节,只是把业务完成,测试通过上线就万事大吉。

    我每天写代码都是用vim,完全不用任何插件,写过的代码过几个月拿来还是能快速地解决问题。各种工具把技术的门槛降的越来越低,但是还是有不少人根本不care这些工具。

    现在很多人写代码完全不会去思考这一段程序在什么情况下抛出什么异常,完全是遇到bug就catch,甚至有的每段代码都有catch。

    Terrell1年前 (2023-02-19)回复
  3. #3

    是真的记不住,很多东西知道怎么实现,但具体的代码,还是得靠ide提示或者去查api文档,最近一段时间长些的内容还能门儿清,一放时间长了再看也是懵逼,这就考验代码的整洁度、可读性以及核心逻辑的注释了,熟悉一下倒还好,上手写起来效率就快了。

    程序员阿Tu1年前 (2023-02-19)回复
  4. #4

    仅讨论书写的话,以 Java 举例, 51个关键字 + 大约 4000 多个内置类。

    参考链接:
    en.wikipedia.org/wiki/L
    docs.oracle.com/javase/

    不可能都记住,哪怕记住“大多数”都是很难的,所以只能记住常用的。

    记住“常用的”并不难,我在第一份工作期间,大约能背出 30 多种颜色代码,原因是当时的工作就是调网页颜色,看多了就记住了。不过一段时间不用,现在只记得最简单的几种了。

    然而,网页可用的颜色有 256*256*256=16777216 种。

    我们压根记不住“众多”代码,主要是没这个必要:

    1. 我们程序员的工作是利用工具解决问题,IDE 就是很好的工具,联想到某些用记事本编程的家伙,反正我是不太能理解;
    2. 公司一般不限制大家上 baidu,google 和 StackOverflow ,部分没有网的场景,还有各种离线的 chm 或 pdf 文档;早先还流行个人技术 blog,基本都拿来当代码仓库用了,现在是 github;
    3. 记住常用词,是自然而然的事儿,谁都行。

    引用名言时间

    I don't need to know everything. I just need to know where to find it.
    我不需要知道一切。我只需要知道在哪里可以找到它。
    Albert Einstein 爱因斯坦

    不过,编程界存在一个问题,如果压根不知道这个东西是存在的,那我该怎么“找到它”呢?

    于是只能自己写一个,往往很糟糕~

    艾康麦icon-meh1年前 (2023-02-19)回复
  5. #5

    代码那么多,不可能记住。

    但是有代码管理工具啊,看看之前的递交很快就能理解。

    工程是一个一个功能垒上去的,知道那块砖在哪里,怎么测试就够了,不需要记住。

    需要记住的是执行逻辑,这块有流程图,思维导图。实在是复杂,那就写文档,力争看5分钟文档就能把之前的代码搞明白。

    最后就是时间问题了。工程维护开发一年以上的,基本80%以上都了解的很清楚。

    flyingfish1年前 (2023-02-19)回复

大智网汇

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 wolfba@q.com 举报,一经查实,本站将立刻删除。

投稿&软文

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

微信扫一扫打赏

登录

找回密码

注册