如何(不)学习
图片:叙事历史梦
本文的扩展版本已收录于由@isaacdlyman和开发者社区共同撰写的《编程第一年》一书中。这本书采用按需付费模式(包括免费),因此我强烈推荐大家去看看!
我记得小时候,对“学习”的含义有一些奇怪的想法。现在回想起来,我不明白自己为什么会有这些奇怪又毫无意义的想法。我尤其记得,我曾经以为学习就是从头到尾认真地读完一本教科书。我甚至会读前言。也许这只是我的个人想法!
然而,我认为各级教育体系确实存在一些问题,阻碍了人们的有效学习:学生们一次学习太多科目,学习内容也过于线性和死记硬背。因此,我认为人们很快就会忘记在学校(包括在大学)学到的大部分知识,这种情况并不少见。
以下是我多年来积累的一些启发式方法,它们在我学习新知识时对我帮助很大。如果你有时间自学,不妨试试这些方法。即使你在学校,如果你真的在乎学习,而不是只想着上课,我希望这些想法能对你有所帮助。
建立直觉
几乎任何技术主题都很容易让人陷入各种复杂的细节。然而,过早地陷入这些细节可能并非明智之举。如果我们不了解更广泛的背景,这些技术细节很快就会让我们不知所措。
当你初次阅读某个主题时,试着把握其整体框架。为什么它很重要或有用?它与其他主题或技术有何关联?它试图解决的问题是什么?还有其他视角吗?回答这些问题能为你提供一个视角,帮助你在深入研究更多技术细节时获得更深入的理解。
建立直觉是一个循序渐进的过程。通常,你可以在一本书或其他信息来源中找到一些线索。留意这些线索,并利用它们在脑海中构建出一幅关于高层次原则和联系的画面。要不断问自己:“这里最重要的想法是什么?”
知识债务
正如财务债务和技术债务一样,知识债务也同样存在。如果我们面对不理解的事情,往往会忍不住继续往前走,希望以后不会再给我们带来麻烦。其实,有时候这样做是可以的。也许深入理解并非必要——我们只需要完成一件具体的事情。又或者,进一步深入研究材料或许能帮助我们理清当前遇到的难题。
这两种情况有时确实存在,但理所当然地忽略这些差距并非良策。这会导致我们知识基础越来越不稳固,最终阻碍我们进步。例如,很多人觉得数学“太难”。我认为原因在于,他们在学校里不断被逼着学习更高级的科目,却同时留下了越来越多的空白。
我认为教育在这方面有很大改进空间。应该根据孩子们对基础知识的理解程度进行评估,并让他们能够在学习过程中不断复习旧知识,以确保完全掌握。每个孩子的发展都不一样:在我看来,教育中最严重的问题之一就是渴望以线性的方式、肤浅而死记硬背的学习方法不断进步。
任何技术科目,包括数学、计算机科学和编程,都需要付出努力(至少对我们凡人来说),但如果你一步一步来,并确保掌握过程中的各个步骤,你就能走得比你想象的更远。
PDL:问题驱动学习
正如测试驱动开发是关于编写代码以满足可衡量的标准——通过测试——我喜欢将同样的理念应用于学习。学习可能看起来像是一个被动的渗透过程。然而,我们很容易自欺欺人地认为自己已经理解了。阅读一些简单的资料来大致了解一个主题是可以的,但如果我们真的想了解如何运用我们的知识,就应该将学习转化为解决问题的结果。
我们可以从一个简单的问题入手,学习刚好够解决它的内容,就像在测试驱动开发 (TDD) 中让测试通过一样。接下来再处理一个类似的、可能稍微难一点的问题,我们能在不额外阅读的情况下解决它吗?如果可以,那就太好了。否则,我们就得回过头去翻阅之前的资料,找到我们需要的内容。这能让我们的阅读更加主动,也更有针对性。
我们能解决的问题越多,问题越多样化,我们的理解就越深刻、越具体。这是衡量我们理解事物深度的唯一真正标准。
多个事实来源
只阅读一本教科书或一篇文章通常不是一个好主意。任何信息来源都会有特定的背景。它会跳过一些步骤,还会对你所了解的内容做出假设。如果你感到困惑(即使你没有困惑!),也应该寻找其他能够解释它的资料。
如果你正在阅读的材料感觉太过高级,可以寻找更适合初学者的解决方法。如果你正在阅读某种编程语言的内容,但感觉不太明白,可以尝试用你更熟悉的语言找到相同主题的解释。也许你正在阅读的内容技术性太强。在这种情况下,可以寻找一些高阶描述来建立对这个主题的直觉。在这方面,我非常喜欢ExplainLikeImFive的想法。
每次减少主题
我和很多来自不同院校、不同专业的毕业生聊过他们的经历,包括数学、科学、医学、牙科等等。他们的故事往往雷同:死记硬背,通过考试,然后大部分都忘了,然后又重复。我也不认为这是学生的错。学生每学期要修的课程太多,以至于很难真正学到东西。我认为几乎所有学科都是如此,在计算机科学领域更是如此。
对于大多数人来说,我认为减少课程数量并专注于基础知识会更好。学生完成一门课程就应该意味着他们已经掌握了相关内容。同样的道理也适用于自学的人:一次选择一两个科目进行学习,并认真钻研,真正理解它们。
问你自己的问题
虽然解决预先定义的问题很有用,但它可能会变得单调乏味。它也有点被动。这比单纯阅读要好,但我们仍然把测试知识的任务交给别人。
不妨想想我们自己的问题?当你学习新东西时,问问自己一些问题。这意味着什么?有没有更普遍的视角来看待它?它和其他东西相似吗?可以这样应用吗?
如果你正在学习的内容与编程相关,你可以编写一些小程序来测试你的想法。你也可以构思一些更大的项目来实践。这些更大的项目会迫使你突破那些定义明确的练习的束缚。你需要整合不同的知识领域,并创造性地思考,以突破障碍。
另外,要质疑学习材料,找出错误。不要把所有东西都奉为圭臬。即使没有错误,这种主动学习也能确保你真正理解。你会探索边缘情况和违反直觉的可能性。这样做会让你的理解更加扎实:你会了解事物的运作方式,并且通过实践、具体的方式了解随之而来的局限性和例外情况。
返回并查看
有时我们直到后来才意识到学习中遗漏了一些东西。我们开始学习一个新主题,突然发现我们自以为理解的东西变得令人困惑。这时,停下来,回过头来复习之前的内容就再好不过了。但不要只是被动地重读。要根据你正在努力理解的新信息,去寻找新的见解:真正的理解不是一个线性过程,而是一个迭代过程。我们需要不断地回过头来弥补学习中那些我们甚至可能都不知道存在的不足。
当我自己学习新知识时,我发现自己会反复研读同一篇材料。第一次学习时,我可能会对一些全新的概念感到困惑。第二次学习时,我就能开始理解了。第三次学习时,我会开始专注于少数几个比其他内容更难的部分。随着时间的推移,我会提出更多自己的问题,有时还会将学习内容推向我之前阅读的书籍、文章或教程中没有提到的方向。
学习到一定程度后,可以先放下,过段时间再回头再看,这也是可以接受的。通常,我们可以在此期间积累一些背景知识,这样下次再回头学习时就能更有准备地应对。
基本面很重要
人们常常会执着于细节,尤其是在技术领域,比如执着于某种特定的编程语言、库或框架。我认为我们应该抵制这种倾向,尤其是在技术日新月异、瞬息万变的今天。
如果你从特定的技术开始学习,我相信这会限制你的适应能力,或者限制你从一个领域转换到另一个领域的能力。此外,当我们孤立地学习一门特定的技术时,我们的理解水平往往会变得肤浅。这意味着,一旦我们离开学习该技术的舒适区,我们很快就会迷失方向。
关注基础知识意味着尝试识别任何技术或范式背后的核心概念和构建模块。这样做就像很好地理解了如何使用乐高积木搭建东西。它让你能够想象任何结构并从头开始构建,而不必遵循预先包装好的套装附带的蓝图。
任何特定的技术都可以看作是一些基本理念以特定方式应用的组合。用这种方式看待事物非常有效。它就像一种超能力,让你比别人更快地掌握新事物,并让他们惊叹你是怎么做到的!
文章来源:https://dev.to/nestedsoftware/how-not-to-learn-5flm