想学好编程,别背代码!

分享我编程 “不忘” 的十几种方法

大家好,我是鱼皮。

最近私信收到最多的问题就是:我学编程的时候记不住代码,老忘怎么办?

比如这位小伙伴,学编程一个月了,问我咋背代码:

头像不错

其实,我自己的记性是非常非常差的,所以我才在选专业的时候弃法从码。

我在最开始学习 C 语言编程的时候,也是敲一次忘一次,很痛苦。但我又不想放弃,于是强迫自己去记忆代码,渐渐地把学编程变成了背单词。但花了很多时间,好不容易把单词背下来了,却还是写不出代码,这就让我逐渐怀疑人生。

后来和前辈们的交流中,我发现记不住代码是很正常的,倒不如说能记住代码的人不太正常(太聪明、记性好)。

于是,我改变了自己的学编程方法,不再背代码,提高了学习编程的效率。

今天就分享下我的编程 “不忘” 大法。

鱼皮编程不忘大法

分为四部分:先分享一些通用记忆方法,再是面向学编程的记忆方法,还给出了忘记代码后的解决方法,以及一些必须要记忆的内容。

本文大纲:

思维导图

通用记忆方法

以下方法,可以帮助我们养成记忆的好习惯,不止编程,适用于所有知识的学习。

编故事

相对枯燥的代码和理论,我们更喜欢看故事。试着把知识点编成有趣的故事,或者和某些人或事进行关联,能够加深印象。

比如我给大家分享编程经验的时候,会提到我的老弟小阿巴,就是为了加深大家的印象,一看到熊猫头就想到 bug,还有什么 “从前有匹马叫代码”,以及一些用故事讲技术的文章和视频,都能起到强化记忆的作用。

兴趣强化

对于自己感兴趣的事情,我们记忆会更容易。

比如我从前爱打游戏,数学公式记不住,但却能精准记忆怪物的血量伤害和装备的爆率。

所以想更轻松地记忆,最好能培养自己对这件事的兴趣,或者用更有趣的方式来学习,比如上面说到的看故事、看图解、看短视频知识分享。

利用感官

我们在记忆时除了需要动脑外,还可以利用好感官,比如搭配一些肢体动作。

关于这点,也不用刻意,每个人都有自己的习惯和小动作。比如有人喜欢用手比划,有人喜欢抚摸下巴,像我则是喜欢在背书时挠头,有的时候把头发挠掉了,看着这根头发,我就感觉知识记得更牢了。真就我变秃了,也变强了呗。

除了感官外,人脑经历过的事物,思考过的问题,体验过的情感和情绪,练习过的动作,都可以成为我们记忆的内容,帮助我们关联记忆碎片。

理解

记东西不能死记硬背,要思考,要理解,这点真的是从小听到大,就不多说了。

体系化

我们在学习时,最好按照体系去学习记忆,而不是东瞅瞅、西瞧瞧。

可以把零碎的知识整理成大纲、学习路线、思维导图等等,按序、分点地去记忆。

老读者应该发现了,我现在就经常在自己的知识分享文章开头放上一张思维导图,就是为了帮助大家快速了解文章结构,从而加深印象。

记忆时间

一般情况下,每天早上和晚上临睡前,是记忆的最佳时间。

我从小养成的一个习惯是:每天睡觉前会躺在床上回忆一遍自己今天做过的事情,的确有强化记忆的效果。

此外,考试周或面试前,我会把复习内容作为文档存到手机上,睡觉前打开 WPS Office 或者一些文档语音朗读软件,让音频伴我入睡。第二天早上起床前,可以先打开音频,闭上眼睛,听到知识点时自己在脑海中再回想一遍,真的有奇效!

定期回忆

不知道大家有没有听说过遗忘曲线(艾宾浩斯曲线),就是说我们在学习中的遗忘是有规律的,并且遗忘的速度先快后慢。

遗忘曲线

观察曲线,我们发现,很多短期记忆消失地很快。所以不能 光记不忆 ,要趁热打铁,学完知识后抓紧应用,并且按照曲线,每隔一段时间复习一遍,才能留住所学知识。

编程记忆方法

上面的方法可以帮助我们更好地记忆知识,而下面的方法更聚焦于帮助我们学习编程,提高效率。

选择性记忆

首先,对于学编程来说,千万不要去背代码!

本来编程知识这辈子都学不完了,背代码的话下辈子都学不完了。

学编程时,我们应该:记住有什么,你能做什么,而不是具体怎么做

举个例子,现在让你设计一个电梯调度系统。你只需要听说过有个东西叫 电梯调度算法 ,以及它能实现电梯的有序调度就行了,而并不需要记住怎么写代码。等到要做的时候,去搜该算法具体的实现就行了。

再举个例子,现在前端的类库那么多,假设让你做一个网页动画效果,那你在此前只需要知道 Animate.css 库可以实现,等用的时候查文档就好了,并不需要把它的每个类、每种用法都记下来。别忘了,代码更新换代很快的,即使有的东西你能记住,但它也有时效性。

尤其是对于编程的初学者,不要去背代码,你只需要知道某个函数大概能做什么事情,我要完成某个功能时能想到它(甚至是能搜到)就可以了。

另外,刷算法题目的时候很多同学理解不了就直接死记硬背,其实记忆算法没有问题,但你要记的不是某段代码,而应该是一类题目的 解题套路

笔记

学编程时,一定要多记笔记,无论是看书、看文章还是看视频。

但是请注意,笔记不是什么都记!

有些同学怕自己忘记视频中老师讲的知识,直接把老师的原话一句句地敲下来,一个视频暂停几十次。看似笔记上内容很多,但其实真正有用的、你能记住的东西很少,而且很浪费时间,大可不必。

不要忘了,笔记是 给你自己看的 ,是为了帮助自己复习的。我记笔记时,重点在于记思路、记流程、记关键节点。

比如我看一个前端项目实战教程时,我会记录老师设计系统的思路、以及实现系统的关键操作步骤,并且在看完视频后自己按照笔记的步骤去回想、去操作,而不是把老师写的每一行代码都记下来。还有就是记录老师重点强调的细节,尤其是一些坑。

记笔记还有个好处就是记录自己的学习过程和进度,虽然会花一些时间,但性价比是很高的。

多写代码

想学好编程,一定要多写代码多实践。很多同学理论玩的很 6、视频看的又多又快,但看完视频后还是不会写代码、没思路,大概率是因为敲的少了,都是纸上谈兵。

像我初学编程的时候,就是只看不写,最后约等于没看。

后来,我修改了自己学习的节奏,一般看视频学技术时:先看理论部分,了解某项技术它是做什么的、有什么功能;然后看实战,跟着老师看一集写一集,并且看完一套视频后,一定要对照笔记自己再做一个项目,把视频中讲到的重点技术进行综合运用。

不要觉得写项目浪费时间,想要学好编程,就一定要多做项目,可以帮助你更好地理解技术、加深印象。

另外,通过实践,可以帮助你理解很多枯燥的理论。比如当时我们上计算机组成原理这门课,基本全是理论,上课听的一知半解、昏昏欲睡,也根本记不住。

直到后来老师带我们到实验室,使用开发箱实际操作,通过接线点亮电路小灯,实现指令集运算,才真正帮助我记住了课堂上讲到的知识。

卡塔练习

我是从一本程序员修养类书籍接触到的 卡塔 ,官方的解释是:卡塔是指 “形”,即招式套路,练习时必须按形进行。

简单来说,就是每日练习。

想要学好编程,每天都要写一些代码,做一些训练。比如学前端的同学可以每天用 JS 来实现一个小功能,学后端的朋友的可以每天书写几条 SQL 语句,巩固 SQL 语法。此外,现在程序员找工作非常看重基础算法和数据结构,想要学好这些,我们也应该坚持每天刷 1 - 3 道题,坚持过就知道这到底有多重要了。

每日一题

多踩坑

相比快乐,我们更容易记住痛苦。所以学编程的时候,一定要多写代码,尤其是要多遇到 Bug,多解决 Bug。摔得越痛,飞的越高。

比如我曾经经历过一个线上事故,因为资源未释放导致服务停机,直接影响了现金收益!所以直到今天,我时刻记得要释放资源,不要再翻车了。

除了不经意间写 Bug 外,我还会 主动试坑 。就写代码的时候故意去尝试一些可能出现的操作,比如把函数参数的类型从 A 改为 B,然后分析对函数的影响,很多情况下,会有意想不到的收获,说不定就发现了一个知名框架的 Bug 呢?

激励

和上面提到的兴趣一样,如果写程序能给我们带来激励和正反馈,我们就更乐意、更主动地去完成它。

对我来说,自己主动去做的项目更容易记住,比如我至今都能想起大一时主动做的国家级创新创业项目用到了哪些技术、有哪些不足;但却想不起来大四时被要求做的图像处理毕业设计都有哪些功能了。

外力

除了主动之外,压力也能帮助我们提高编程学习效率,加深记忆。

比如我在腾讯实习期间,有一周上线时间很紧张,那一周基本每天工作到凌晨,所以印象尤为深刻。

分享

有的知识你以为自己会了,但没办法把它讲出来,就是不理解,这样很快就会遗忘,面试时还会吃大亏!

所以最好能把自己写过的代码、学到的知识分享给他人,能够极大地加深对知识的理解和印象,还能帮助自己发现不足。

分享的途径多种多样,比如写文档、写博客、对着小黄鸭去讲、参与演讲、录制视频等。

像我刚开始学编程大概半年多的时候,就建立了自己的个人博客,在上面记录自己学到的知识。现在来看,虽然当时写的真的是太烂了!但也为我如今做知识分享做了铺垫。

我真的是很享受学习知识并且对外输出的过程的,持续学习,持续输出。说个好玩的事,大学的时候骑着我小电动车带室友一起上课的路上,我都会跟他扯一通技术。分享真的是可以激励自己不断进步,并且帮助到更多人的!

复盘总结

这也是很多同学忽略的一点,学了一个技术、做了一个项目后,就赶紧把他们像炸弹一样丢掉了。其实,你自己学过的、实践过的知识都是值得珍藏的宝藏。

我在学校时,每做完一个项目,都会展开回忆,从当初想做这个项目开始、到当时的思路、实现过程、遇到的坑等,并且还会分析自己做的好或不好的地方,再加上一些心得感悟,整理汇总成一篇博客文章。

同理,学完一门技术时,我也会把这个技术的关键知识点汇总成博客。

现在工作了,我依然保持总结的好习惯,自己会写日报、周报、月报、年报等。现在回过头来看,也是一笔不小的成就,要不然谁还记得自己一年前干了啥呢?

记录工作

忘了怎么办?

我知道很多同学追求完美,想把什么都记住,害怕今后忘记重要的知识。

其实对学编程来讲,忘记是很正常的,而且完全不可怕!

我建议大家索性少记一点,不要给自己太大的记忆负担,即使忘了,我们也有下面的方式来解决。

积累

首先,一定要注重积累,整理自己做过的事。

像我会整理自己写过的代码,这样等要用的时候,直接去找,然后 CV(复制粘贴)大法好。

我会整理自己写过的文章、看过的好文、好句子、好表情,打造自己的语料库、素材库,随用随搜,省去了大量记忆量。

我还会整理自己踩过的坑、写过的 bug,并且将解决方案也一同整理,即使下次再遇到同样问题,也能高效解决。

整理 Bug 及解决

利用搜索和文档

忘了某段代码怎么写、没有思路、或者遇到问题了,那就去网上搜索一下;忘了某个框架的特性、函数的参数、用法,那就去看框架的官网文档就行了。

难道还要别人帮你搜索嘛?

多写注释和文档

程序圈里有个梗:有位程序员骂一段代码特别辣鸡,结果最后发现是自己写的。

这是每位程序员都会遇到的事:

  1. 看不懂自己写的代码
  2. 不认识自己写的代码

为了防止此类沙雕事件的发生,我们应该适当地给代码添加注释,像我的话经常会放一些设计思路、设计文档链接、作者等等:

/*
 * 功能:三连
 * 思路:请参照文档 xx.cn
 * 作者:狗鱼皮
 */
function sanLian() {
  console.log('感谢三连')
}

还可以适当回顾下自己写的烂代码,说不定就有什么优化灵感了呢?

除了注释外,做项目一定要写文档,把项目背景、选型过程、设计思路、实现方案都写清楚。不仅可以帮助自己总结工作,还能给其他项目的参与者指引和帮助。

最好把产品说过的一些话也记录上,防止日后产品改需求。

不得不背?

最后,虽然说学编程不靠背代码,但等到找工作的时候,一些面试的考点还是必须要记住的。不过在背面经、背考点时也不要像背课文一样死板,还是要加上自己的理解,多实践。

比如经典面试题:MySQL 如何性能优化?

死记硬背当然可以,但有时间的话,更好的做法是自己实践一下 MySQL 的优化手段,并且记录优化的效果,比如性能提升了百分之几等等,这样自然就能记住,跟面试官聊的时候也更有底气。


以上就是本期分享,希望大家能养成好习惯,多敲多练,别再强迫自己背代码了!

最后再送大家一些 帮助我拿到大厂 offer 的学习资料

跑了,留下 6T 的资源!

我是如何从零开始通过自学,拿到腾讯、字节等大厂 offer 的,可以看这篇文章,不再迷茫!

我学计算机的四年,共勉!

我是鱼皮,<stron> 还是要求一下的,祝大家都能心想事成、发大财、行大运。</stron>

#Java学习##Java##学习路径#
全部评论
经典自问自答
1 回复 分享
发布于 2021-07-19 21:34

相关推荐

12-06 20:42
已编辑
中山大学 前端工程师
现在秋招已结束,整理发一些面经笔经,回馈一下牛客社区。准备:9.3https://gw-c.nowcoder.com/api/sparta/jump/link?link=https%3A%2F%2Fwww.nowcoder.com%2Fexam%2Fcompany%3FcurrentTab%3Drecommand%26jobId%3D100%26selectStatus%3D0%26tagIds%3D9079这里一共有六份真题试卷。刚刚尝试在两个小时内回答腾讯音乐娱乐集团2024校园招聘-前端开发笔试(II),结果三道算法只做出了两道。后面看题解发现第三道直接暴力枚举就行了,第二道确实有点难度(甚至是暴力枚举都很难写)。但是我第三道由于被第二道搞没了心态,就直接放弃了(真在笔试的时候千万别放弃)。所以客观来看我还是能做出三道的。刚才仔细看了一下第二道题,应该是属于动态规划,感觉其实也没有想象中那么难,可以认为是需要进行细致分类讨论的子问题分解递推求解。虽然我很菜,但是我要怀有题目不难的信念,这样才能保持心态良好。发现有一套试卷打不开,那我这两天做四套题就好了。9.4今天大概就是继续刷题好了。做两套或者三套。花了四个小时才做好了一套卷,这次是把全部题目都通过了。虽然花的时间超了,但是也给自己增加了信心:我是有能力把所有题目都做出来的,包括十分困难的动态规划!但是动态规划的那道题目我就花了1小时40分钟,其实前面20分钟已经把递推公式写出来了。但是发现自己的编程还不够熟练,而且平台的js版本要滞后一些,有些方法用不了。做的过程中常把数组和字符串的方法搞混了,还有些方法直接忘了。比如我在想办法往数组的前面插入一个元素,想了10分钟竟没有办法,只好作弊查了一下MDN文档,原来要用splice(0,0,value)。所以还要抄一抄数据结构来熟练一下。后面这份试卷就没那么幸运了,而且最后一道看程序写结果的题目到现在也没有完全搞明白,只是知道有那么回事。其中比较奇妙的就是在函数内给没有声明过的变量赋值会变为globalThis的变量,而不管调用函数时的this是什么。function&nbsp;test()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getName&nbsp;=&nbsp;function()&nbsp;{&nbsp; Promise.resolve().then(() =>&nbsp;console.log(0));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};return&nbsp;this;&nbsp;}比如上面的getName会变为globalThis的一个变量(即全局变量)。不管是直接调用:test(),还是用call或apply指定this:test.call(obj)或test.apply(obj),getName都会变为globalThis的一个变量,而不会绑定到obj。此外,我认为TME2022校园招聘前端开发岗位笔试(II)的第一道算法的描述是错误的。“若当前节点为右儿子,会变成当前节点的双亲节点的右边相邻兄弟节点的左孩子节点。(如果当前节点的双亲节点已经是最右边的节点了,则会变成双亲节点同级的最左边的节点的左孩子节点)”,这里的右边相邻兄弟节点严格来说具有同一父节点的才算兄弟节点,不过测试用例则是把堂兄弟结点也算是兄弟节点了。9.5今天继续刷了TME的两套题目(实习生),有些题没做出来,不过也算是练了一下手感。做了五套题,现在大概已经有了些感觉,起码打字速度加快了一些,对算法的实现流畅了一些。其中最大的进步可能就是初步领略了动态规划。有许多题目败在了算法复杂度上,确实是基本功不够扎实导致的,因为实在是想不出优化的办法,看了一下题解经常会看到一些人说xxx方法这样,希望我也有一天可以做到这样。不过按目前的情况来看大概要到春招的时候了。笔试:刚才完成了TME的笔试,ac了三道题(一共四道)。四道都是比较基础的算法题,但是由于脑子不太好使,第三道一开始想歪了(想到了动态规划那边),最后用偏暴力的递推来解,但是计算子方阵权值的长度选取一下没想清楚,导致没做出来。不过想想还是算了,毕竟笔试AC了三道已经算是我历史上的最佳成绩了,毕竟之前算法一直是我的弱项,而之前的面试都是一道都做不出来的。这无疑给了我充分的信心:我不会被算法卡脖子!
查看7道真题和解析 投递腾讯音乐娱乐集团等公司10个岗位
点赞 评论 收藏
分享
评论
9
18
分享
牛客网
牛客企业服务