深圳幻海软件技术有限公司 欢迎您!

算法死活记不住?大神告诉你秘诀:内化它的逻辑

2023-02-28

​有网友诉说了自己的苦恼——我曾经非常擅长用不同的语言写代码,可是在一年后,我就完全忘记了如何用这些语言写代码。现在我正在尝试学习Lua,我能看懂每一行的意思,但是到了要写出来的时候就不知道该怎么做了。针对ta的苦恼,网友大神们纷纷给出建议。你是说循环、变量之类的语法吗?还是说排序、搜索、递归?这两

​有网友诉说了自己的苦恼——

我曾经非常擅长用不同的语言写代码,可是在一年后,我就完全忘记了如何用这些语言写代码。

现在我正在尝试学习 Lua,我能看懂每一行的意思,但是到了要写出来的时候就不知道该怎么做了。

针对ta的苦恼,网友大神们纷纷给出建议。

你是说循环、变量之类的语法吗?

还是说排序、搜索、递归?这两种情况,我只有一些基本的想法,剩下的由google完成。我不记得代码,只记得我需要什么。

没错,就是这个方法。

知道你需要在这里使用循环比记住循环语法更重要。

一旦你知道你需要使用什么,你就可以根据需要把语法google出来。

显然有些东西你应该记住语法,比如如何创建一个函数,如何创建不同类型的变量,如何将输出放到屏幕上......

不过随着它变得越来越复杂,只要理解这个概念,再google出来就行了。

你是指如何记住怎么写编程语言的,比如Lua、Python 或 C++ 之类的吗?

通常,就是通过写代码来记住,一段时间不写,就会忘了,然后你就需要重新去学习它们。

 

我做的网页设计/编程越多,我就越喜欢用「直线」方法。

只需选择你需要学习的下一个东西,并在你们之间画出最直、最快的线,然后去学习这个东西。弄清楚这一点,然后继续下一步。你需要学习的只是能让你完成任务的极少数特定的东西。你不需要成为一个完美的全栈开发人员,事实上,你可以将整个过程分解为大概10到20个核心步骤,假设它不是非常复杂的话。

我确实会阅读和研究了除此之外的编程语言,因为它们确实有助于在你的工具包中添加更多东西,并且用不同的方法来填充你的记忆,但是当涉及到实际的执行, 直线方法可能会让你快1000倍。

在条件允许的情况下,就要做减法。如果一个平台/后端主机很复杂,你需要5个小时才能弄清楚如何做最简单的事情,而这本应该用几分钟就完成,那就退后一步,看看你是否可以以某种方式简化它。

你是否需要学习3种不同的编程语言并观看4小时的视频才能完成实际上非常简单的任务?或者你能不能找到一些简单的服务器来存储你的简易数据库——它的使用和集成如此简单,以至于白痴都能很快找到它?我们并不会因为从A点到B点采取最耗时、最复杂的路线而赢得额外积分。​

我靠的是练习、谷歌和同事:)

我记住得很少,只记得帮助我找到答案的那一点面包屑。如果有好办法,请指点我一下。

我在面试时最喜欢听到的答案是——

「值得记住的东西都加了书签,其他的东西我现在很容易找到;我不需要所有的答案,但我很擅长找到它们。」

我在很多算法网站上的排名都很高。在我看来,从记忆的角度理解算法是行不通的。你需要内化它的逻辑。想想其他你知道该怎么做的事,你可能可以写下它的每一步,但你做的时候不会特意去想。比如做黄油吐司。想象一下,你有一个按钮式烤面包机。你得先烤面包,然后再涂黄油。顺序不只是你记住的东西,它是有意义的。如果你先涂上黄油,它就会滴入烤面包机底部的加热元件中。烤吐司就是一种算法。是的,你记得这些步骤,但是每个步骤和这项步骤的顺序背后都是有原因的。将此应用于您的数据结构和算法。学习简单算法背后的原理,以构建理解面试问题所需的基础知识。闪存卡式的记忆术将花费你大量的时间,而且几乎没有任何回报。

我知道算法,因为它们是解决问题的广泛技术。

每当我搞不清特定语言的确切语法时,我都会google,然后阅读文档。

Linters 和编译器错误消息通常也很有帮助。​

在过去的十年里,我已经建立了一个我称之为「个人备忘单」的笔记合集,其中包括我需要反复查找的所有内容。

开始,我用它查找rsync命令、Postgres转储/导入命令、nginx配置等,但现在我只有去查那种一两年才用到一次的晦涩内容时才会用到它。

我想说,我现在已经记住了这些东西的一半了。但是当我学习一种新的语言或概念时,拥有备忘单是关键的一步。重新找到你记忆中的SO帖子或博客文章的过程实在是太太太麻烦了。

如果你是指代码的语法,那么没有必要记住它。上网查一下就行了,很容易。

如果你指的是实际的算法(一段代码是一个算法的实现),那就不要把注意力集中在「记住它」上,要试着去分析和理解它,就像它是某种神秘的公式一样。

我说的「理解」,不是指 「能够说出每一行的作用」,而是「能够说出它为什么是这样,以及它的原理是什么」。

一旦你了解了它是如何运转的,你甚至不必记住如何去做——因为你将拥有重现它所需的所有推理能力。

如果你在维护别人的代码时,可能会发现有些代码非常晦涩,并且涉及很多间接调用和/或副作用。在这种情况下,只需问问自己该代码的输入和输出是什么。只有在你需要重构一个东西时,才需要更深入的研究。

老实说,我记得以前项目的一些部分,但我并没有太费力,相反,我更关心算法的高级轮廓,比如合并排序:将一个数组拆分为2个数组,然后将这些数组拆分为另外2个数组,直到数组大小降至1,然后按顺序合并数组。

或者快速排序:选择一个枢轴,遍历数组交换值,如果它们位于枢轴的错误一侧,则大于或小于枢轴,然后对枢轴的每一侧重复执行此操作,直到每个值都是枢轴。

我记得算法的主要部分,如果我在理解上遇到问题,我会将它们放入伪代码并根据需要修复我对算法的理解。​