Janki方法–使用SRS改进编程(2011)

2020-11-25 20:52:34

编辑:更新为JANKI方法在撰写本文后的近四年中,我继续使用抽认卡进行学习,并对我的建议进行了许多改进。我在另一篇文章《自编指南指南》的第二部分Janki Method Refined中总结了这些观点,并在2020年通过一系列YouTube影片总结了这些观点:

这是快速成为有生产力的程序员的指南。马尔科姆·格拉德威尔(Malcolm Gladwell)在他的书《离群值》中告诉世界,掌握某些东西需要10,000个小时。每天练习三个小时,十年之内就会发光。数以百万计的读者感到鼓舞,因为他们只要投入大量时间就可以成为下一个比尔·盖茨。随着时间的推移,我们发现10,000小时比我们预期的要长得多。无限的潜力变成了幻想。

Janki方法是为了缩短学习编程所需的时间。建立一个自动化的网络业务使我在财务上,地理上和时间上都可以自由,这源于我的不耐烦梦想。我不想等待10,000个小时。我怀疑你也没有。

志向高尚的学习者尽管聪明才智和热情,但他们并不总是很快学习。对于大多数人来说,最终的能力取决于所花费的时间。马尔科姆(Malcolm)的10k听起来不错。

您已经读到边干边学比被动阅读要好;以书面表达思想会加深理解;需要不断修改知识以保持新鲜感;创造力来自将不同的想法联系在一起;并且您过去的错误是您最好的老师。您将其中哪些想法应用到学习中?

扬基方法(Janki Method)的基础是,如果您采取专注的学习方法,可以加快马尔科姆(Malcolm)的10k掌握水平。 Janki方法的核心是使用由出色的Damien Elmes编程的间隔重复抽认卡系统Anki。

通过遵循我的方法,我相信任何精通纪律的读者都可以在不到12个月的时间里在给定的编程领域(例如Web应用程序,iPhone应用程序)达到熟练程度*。

您是否曾经花一个星期学习考试,却忘记了在两个月内学到的90%以及一年内所学的所有其他知识?

忘记阻碍学习诸如编程之类的知识密集型技能。如果要构建大型应用程序,则需要记住各种语言,解决方案,库和陷阱。因为技术材料可能是如此抽象和枯燥,所以您会很快忘记。

Janki的第一条规则可以提高您的记忆力:“每次学习新知识时,都会创建一个问答卡片,并将其添加到Anki中。”

Anki是一个间隔重复系统。大多数算法使计算机高效。 Anki使您高效。通过使用永久保留所需的最少重复次数,Anki可以将抽认卡钻入您的长期记忆中。

首先创建一组称为计算机科学的抽认卡。卡片组包含许多卡,每个卡包含一个问题和一个答案。您用最能描述其内容的类别标记这些卡。例如,一张卡可能被标记为“ Rails”,另一张卡被标记为“ SQL”。每张卡可以具有许多标签,鉴于技术如何频繁重叠,这很有用。

随着时间的流逝,您将建立一个有关编程的知识库,该库具有清晰的分类,易于搜索的功能,并定期在云中备份。保持这样的存储库很有用,但是它并不能帮助您将知识保持在头脑中。这样做的关键是做Ankis。

每天早上,Anki都会计算出您可能会忘记的卡,然后提示您检查这些卡。每天只需要花费几分钟的时间进行Ankis,因为您只需要在给定的一天中检查甲板的一小部分即可。

对于您审阅的每张卡片,Anki会向您显示问题面,而答案面最初被遮挡。您的工作是在脑海中回答问题,然后揭示答案并检查您是否正确。回答后,屏幕底部将出现四个按钮:“再次”,“良好”,“简单”和“非常简单”。评估召回该卡的难易程度,然后按相应的按钮。根据您按下的按钮,Anki会确定下一次向您显示该卡片的时间,因此,如果您希望算法有效,那么诚实回答至关重要。

大多数人由于不擅长弹吉他的相同原因而无法学习编程:他们放弃得太早。尽管他们在开始的几周内都很努力,但很快就会失去动力,并在获得结果之前就放弃了。

尝试在短时间内使用激烈的运动节奏学习,然后长时间停顿是有问题的。您的大脑需要时间来吸收所学内容,因此学习技巧不能凝结到周末。通过接受这种现实并使用强调每天增加工作量的学习方法,您将更不会感到筋疲力尽,更可能成功。

Janki的第二条规则鼓励对日常学习的承诺:“您必须每天(包括周末和节假日)每天使用Anki,并无限期地这样做。”

做Ankis必须保持与刷牙相同的习惯力,如果您想念Ankis,应该感到调皮。

规则2并不像乍看起来那样苛刻。经过几个月的练习,您将可以在5-8分钟内完成Ankis。由于Anki可在智能手机上使用,因此找到时间也不是问题,这意味着您可以在上班,坐公交车或在办公室空闲时进行检查。 Anki甚至可以在所有设备上同步存储卡状态,因此对桌面存储卡的更改将反映在所有设备上。

脱离上下文学习是浪费的。从头到尾阅读一本教科书可能会很有趣,但是如果这些概念与您当前面临的技术问题不相关,那么您将缺乏有效吸收该知识所需的心理环境。随之而来的是不完全的理解和浪费的精力。

Janki的第三条规则使您专注于当前重要的事情:“在上下文中学习。选择一个项目,然后仅了解完成任务所需要的内容。”

当我写这篇博客文章时,我不知道如何用纺织语言添加图像。

第3步:检查它是否有效后,我将新技术添加到了Anki Deck。

“我从书本上很难学到性。”埃迪·伊扎德(Eddie Izzard)

像性一样,编程可以更好地通过练习来掌握。没有实践的学习会使您与现实隔离。

当您在不尝试代码的情况下阅读有关编程的内容时,您会形成一个内部的表示形式,该表示形式是不完整的,难以理解的并且难以实际应用。

您将不会注意到关键细节。当您第一次在教科书中阅读许多内容时,它们似乎显得微不足道。也许是引号放在函数的参数周围,或者是关于允许空格的规则。这些被忽略的观点在实践中通常很关键,而任何不完全理解的事情都会削弱您的生产力。仅通过尝试编写代码,您将注意到这些规则的细微差别,并真正理解了所涉及的语言,技术和命令。

Janki的第四条规则基于现实中的知识:“只有在尝试使用其中的知识项目后,才能在卡片组中添加卡片。”

假设您正在使用由SQL数据库驱动的应用程序。要构建它,您将需要参考有关数据库设计和SQL(用于从数据库表中选择记录的查询语言)的文献。在处理应用程序时,您将接触到新概念。在将其添加到Anki平台之前,请尝试每种新知识。例如,如果您了解如何删除数据库表中的行,那么在创建详细说明该SQL查询的Anki卡之前,应尝试删除数据库中的实际行。

我们过去的错误是出色的记忆帮助。这是我们边做边学的主要原因。也就是说,并非所有过去的错误都能同样有效地教给我们教训。错误的情感影响与课程在记忆中保留的时间长度之间存在相关性。

假设您犯了一个大错误。您不小心将不完整的代码推送到了活动的服务器,从而使应用程序停机了12个小时。您可能会对此加以恐慌,随着客户投诉的泛滥,您会感到愚蠢和尴尬。这种情感上的惩罚可以强烈提醒您错误,将来在将代码推入服务器时,您将更加小心。

幸运的是,带有情感影响的错误很少见,您不太可能需要Janki方法来学习这些错误。但是,我们犯下的其他错误呢?在这些错误中,情感因素被减少甚至消失了?在最终学习我们的课程之前,我们可能需要多次犯这些错误。

错误重复是您在学习永久性课程之前在一生中犯特定错误的次数。由于错误代价高昂,令人尴尬并可能威胁职业生涯,因此将错误的发生率降到最低是明智的。老板,客户和同事都理解第一次犯错,除了最不合理的情况外,其他所有人都会原谅您。但是,他们不会觉得您第二次或第三次弄错同一件事是那么宽容。

Janki方法的第五条规则最大程度地减少了错误重复。 “每次您犯错时,都要进行一次验尸,然后尝试找出经验教训。考虑一下您需要了解的信息,以防止再次发生该错误,并将这种见解转化为新的抽认卡。”

通过应用此规则,您将用Janki评论代替现实中的错误,因此,您将更快地从错误中学习,并减少尴尬和现实世界中的错误。

提醒您过去的失败并不仅仅是防止它们重复发生。它也可以帮助您了解自己的领域,因为执行事后分析和检查错误的根本原因会鼓励您进行深入思考。您不仅可以制作防止发生特定错误的卡片,还可以使自己免受整个错误类别的影响。

每个错误都会成为学习经验。一团糟仍然很糟糕,但是您知道自己已经找到了一种改进的方法,就会感到有点胜利感,并且您将确信自己将永远不会再犯该错误。

通过遵循Janki Method的前五个规则,您将很快精通编程的底层细节:函数和命令的名称和用例,它们的预期输入和预期输出,常见错误的解决方案以及用于保留代码的技术有条理。

随着经验的增长,您将面临更大的问题,例如有关应用程序的结构决策,使复杂性降至最低的技术,用于管理代码同时版本的工作流以及代码性能与优雅之间的权衡。回答这些问题需要深厚的知识和丰富的经验,因此,您绝不能错过在这些首要问题上发展知识的机会。

Janki方法的第六条规则鼓励定期进行批判性反思:“在每个项目结束时,都要问自己自己,如果从后见之明的角度重复该项目,你会学到什么教训,以及会做些什么。”

在完成一个大型项目(例如完成一个新应用程序)之后,需要一些时间来进行反思。问自己一些大问题,例如:

我是否浪费时间去解决任何死胡同?我将来有什么办法可以帮助我预见这些情况,并防止它们再次发生?

我选择了正确的技术吗?我可以提出一个方案来帮助我下次做出正确的选择吗?

我可以创建清单以简化将来开发该功能的情况吗?

其中一些问题将很难回答,因为您必须反复思考各种选择,并思考每个选择的好处和取舍。明智的架构决策可避免浪费精力,因此这项工作值得。没有积极的思考,您将不太可能注意到这些项目级别的模式,因此您的智慧将比其他情况增长得慢。

就像闲置的前草坪一样,您的Anki甲板会变得难看。您以前学习的一种编程语言可能在2.0版中已发生了巨大变化,现在您的卡中有一部分无效。也许您的某些卡不再值得定期检查-它们的用处并不能证明所需的累积修订时间是合理的。

随着学习的进行,您将发现更简单的理解概念的方法。如果不更新您的名片以反映这些改进的范例,您可能会永远失去这些见识。通常,在更高级别的概念上,一组卡可以用一张卡代替。

有时,您会看到卡组中卡之间的链接。如果您注意到这些卡之间的连接,则会为同一知识项创建多个神经路径。如果一条路径失败了,您仍然可以到达另一条路径并触发该知识。思维导图可以帮助您记住类似想法的作品。通过寻找并注意甲板上的这些连接,您可以为知识表示增加一层冗余,从而进一步确保将来不会遗忘,

Janki的第七条规则使您的牌组保持身材。 “删除或修改任何错误,过时,难以记住,不完整或不必要的卡片。更新现有卡片,以提高了解的曙光。”

平面设计师,艺术家,建筑师和其他创意人员保留自己喜欢的设计的剪贴簿。后来,在进行项目工作时,他们从这些相同的剪贴簿中汲取了灵感。

作为程序员,您的主要灵感来源将是其他人的代码。下载开源项目(例如在Github上)并阅读代码。查找您不了解的部分,并根据需要创建新卡片。得到一支笔和纸,并勾画出程序的路径。输入是什么,预期输出是什么?数据在程序中移动时会发生什么?为什么这样设计?使用了哪些技术?

通过阅读代码,您将了解各种编程风格和编程问题的解决方案。您会看到自己喜欢的事物,以及很多自己不喜欢的事物。随着时间的流逝,您将找到自己的风格。

Janki的第八条规则鼓励您使用他人代码的阅读作为学习的来源:“定期阅读代码。如果您遇到有趣的事情-是算法,黑客或体系结构决策-请创建一张详细说明技术并显示代码的卡片。”

使用Anki进行学习的最初目标是阻止自己遗忘,Anki兑现了这一诺言。我没想到的是长期日常使用所带来的次要优势。

知道数千个命令可以节省时间,而不必花费大量时间查找参考资料。遇到问题时,您会立即想起以前的解决方案,而在构架系统时会想到许多可能性。您将快速阅读他人的代码,并对自己的理解充满信心。最接近的类比是自然语言的流利程度。您将说出代码。

我花在编程上的大部分时间都花在了调试上,即修复您的代码或其他程序员的代码中的错误。在这里,对平台的深入了解将最大程度地提高您的速度。调试主要包括收集信息。该系统应该做什么?当我们看到错误时,系统中有什么数据?可能出了什么问题?通常,一条拖欠的代码行可能是导致整个网站崩溃的错误的原因。困难的部分是找出数千行逻辑中的哪一条导致了该问题。

让我们举个例子。假设您的程序使用了100个函数,而其中的70个已内置到该语言中。这意味着有30个自定义函数。如果您满怀信心地知道70个内置函数的输入和输出,那么调试将得到简化,因为您只需要弄清楚其余30个自定义函数是如何工作的。考虑到自定义函数本身是根据内置函数定义的,因此此任务也不应该花费太长时间。关于内置函数的语法,输入,输出和使用的完全确定性,使您可以快速隔离未知内容并将错误暴露出来。

通过Janki方法提高了头脑风暴的能力。深入的知识意味着您可以在纸上快速尝试替代方案,从而增加遇到麻烦的,显而易见的解决方案的机会。

您可能会争辩说,通过经验获得的知识将使您获得同样的速度提升。没错,但是这种说法没有讲到重点。 Janki使您可以更快地获得相同的知识,并将其保留更长的时间。如果您忘了几个月后却忘记了如何做某事,那么Anki就是您的最佳选择。

技术领域的技能是您的才智和知识的产物。一个人的弱点可能被另一个人的力量所掩盖。聪明但经验不足的人可以和乏味而经验丰富的人相提并论。

最好通过示例说明这一点。让我们使用两种方法将130乘以30。

方法1:您知道乘法是重复加法,因此问题变为130 + 130 + 130…依此类推。应用加法规则,您最终将获得3900。让我们将智慧称为快速执行这些单独计算的能力。

方法2:也许您在学校的乘法表中还记得13 X 3是39。您可能还记得,乘法的可交换和关联属性使您可以将130 X 30简化为10 X 13 X 3 X 10并最终简化为39 X 100,可以将其简单地计算为3900。由于领域知识可让您显着简化问题,因此您的智能或添加速度无关紧要。

在方法1中,该问题是劳动密集型的,因为您没有使用知识来简化计算。方法2并非如此,在这种情况下,您会推理使用更高阶的知识块,因此可以轻松解决原本冗长的问题。将记住的知识块应用于眼前的问题称为块化。

如果您记得一个问题的答案,则无需立即推断出它,因此您可以自由地推断出更多抽象的概念。这就是分块的价值。

Janki方法鼓励分块。这是意想不到的好处,但最终对我来说最有用。每天应用六个月后,您将使用与简化方法2中的乘法问题等效的思维捷径来对概念进行编程。通过在平台上添加越来越抽象的规则和概念,并尽量利用这些想法,可以最大程度地实现分块。解决问题时。

您的计算机是否发出过错误消息,并且尽管您记得曾经看过它,但是却不记得如何解决它?在我开始使用Janki Method之前,这会在我身上发生很多。

我第一次看到该问题时,会花半天时间解决问题。六个月后,问题可能再次发生,可能形式有所不同。即使我隐约意识到以前已经看过它,但我还是忘记了如何修复它。

这感觉很浪费,我不喜欢它。我不想两次解决相同的问题。 Janki方法有助于防止这种情况的发生。

Anki具有搜索功能,可以找到您牌组中所有匹配的牌。您甚至可以过滤

......