哈斯克尔与刻意练习
哈斯克尔与刻意练习
原文:https://medium.com/hackernoon/haskell-and-deliberate-practice-2bfd12901aef
你有没有遇到过这样的情况,你试着学习一些东西,投入适当的时间,然后被卡住了?很可能你没有用最好的方法学习。但是你怎么知道在你的领域里什么构成了好的学习?试图在网上为寻找如何学习某个特定话题的建议可能会令人沮丧。大多数人不考虑他们学习的方式。他们确实在学习,但是他们不能外化并教其他人他们做了什么,所以这类事情没有指导。
在我们关于学习的第一篇文章中,我们关注了一些更高层次的学习技巧。这样做的目的是让我们有更多的学习时间和动力。但是即使你的宏观技术很好,你最终还是需要特定领域的实践。本系列的第二篇文章展示了一种学习 Haskell 的特殊技术。这是一个开始,但我仍然想分享一些更一般的想法。
本文将回顾乔希·怀兹金的《学习的艺术》中的几个重要观点。我们要谈的第一个概念是刻意练习的想法。刻意练习的目标是专注于一个特定的想法,努力提高某项技能,直到它成为潜意识。第二个概念是错误在学习任何新技能中的作用。我们将利用这些来推动自己前进,并防止自己在未来被同样的想法绊倒。
刻意练习
假设你正在学习用钢琴(或任何乐器)演奏一段特定的音乐。最大的诱惑是通过从开始到结束反复演奏来“学习”这首曲子。你会得到相当多的正确答案,也会得到相当多的错误答案。最终,你会得到大部分的权利。出于几个不同的原因,这是一种诱人的练习方法:
- 这是“显而易见”的选择。
- 它让我们做我们已经喜欢和擅长的部分,这感觉很好。
- 毕竟,这最像是我们在表演中最终会做的事情。
然而,从学习的角度来看,这是一种次优的方法。如果你想提高你从头到尾演奏这首曲子的能力,你应该专注于你最薄弱的地方。你必须找到你正在纠结的特定段落。一旦你确定了这些,你可以进一步分解它们。你可以找到具体的措施,甚至注意到你有困难。你应该反复练习这些弱点,一次解决一件小事。在某一点上,你需要全力以赴,但这应该等到你对自己所有的弱点都有信心的时候。
关注小事是最重要的部分。你不可能把一段你一无所知的棘手的段落从头到尾完美地演奏出来。你可以从一个强迫你快速移动手的部分开始。你可能会练习十几次,只是专注于最后一个音符,然后移动你的手。对于这十几个重复来说,其他的都不重要。一旦你下意识地做了手部动作,你就可以转移到另一个想法上。下一步可能是确保你在手部动作后弹奏前三个音符。
这就总结了刻意练习的理念。我们一次专注于一件事,并有意识地练习这件事。无意识的练习,或者为了练习而练习,只会让我们进步缓慢。如果我们养成坏习惯,甚至会阻碍我们的进步。我们可以将它应用于任何技能,包括编码。我们想要建立微小的习惯,逐渐让我们变得更好。
错误
所以刻意练习是一个建立我们想要的技能的系统。然而,也有很多习惯是我们不想要的。我们做了很多事后才意识到是错误的事情。最糟糕的事情是当我们意识到我们已经一次又一次地犯了同样的错误!
Waitzkin 在《学习的艺术》中写道,“如果任何一个弟子的学生能够避免重复同样的错误两次,他们将会在他们的领域中扶摇直上。”如果我们完全避免错误,我们也可以这样做,但这是不可能的。我们第一次尝试某事时,总会犯错误。
因此,首先我们必须接受犯错的必然性。一旦我们做到了这一点,我们就可以有一个计划来对付他们。我们无法避免重复错误,但是我们可以采取措施来降低重复错误的几率。如果我们能够做到这一点,我们将会看到重大的改进。我们的解决方案最终将是记录我们所犯的错误。通过把事情写下来,我们将极大地减少错误的重复。
练习哈斯克尔
所以现在我们需要回到编码领域,问问自己如何将这些想法应用到 Haskell 中。我们可以关注编码实践的哪些特定领域?让我们从编译驱动学习的几个教训开始。
你可以写一个应用程序,只专注于建立以下习惯:在你写一个函数之前,把它作为未定义的清除掉,并确保类型签名可以编译。别的做对了也没关系!当你养成这个习惯后,你还可以再走一步。您可以确保在实现函数之前总是编写函数的调用(您的其他代码调用该函数)。
我之所以选择这些例子,是因为在编写函数时,有两件事最慢。首先是缺乏清晰度,因为我们不知道我们的代码将如何使用函数。第二个是工作的重复当我们意识到我们需要重写函数的时候。之所以会发生这种情况,是因为有一种额外的类型我们没有考虑到,或者类似的情况。这些习惯旨在让你提前做更多的计划,这样在实施的时候你的生活会更简单。
这里有几个类似的想法:
- 在编写函数之前,先编写一个描述该函数的注释。
- 在使用库中的表达式之前,请将其添加到。阴谋文件。然后,编写 import 语句,确保使用正确的依赖关系。
另一个很好的实践是在实现功能之前知道如何测试它。在几周内,我们将探索测试驱动开发,在那里我们将为我们的功能编写测试用例。但是如果它是一个非常简单的特性,比如获取一行输入并以某种方式解析它,那么您可以用更简单的方法来处理。例如,您可以通过几种类型的输入在命令行上运行您的程序。只要你在开始编码之前知道你的方法,它就有价值。首先在某个文档中编写测试计划可能是最有帮助的。
所以在几乎所有上述情况下,建立这个习惯的“触发器”是编写一个新的函数。触发器是建立新习惯最重要的部分。正是这个动作提醒你的大脑,你应该做一些你不习惯做的事情。在这种情况下,触发器可以为类型签名写::。每次这样做的时候,提醒自己当前的目标。
这是一个不同触发点的想法。每次你选择一个结构来包含你的数据(列表、序列、集合、映射等)。),头脑风暴至少三个备选方案。一旦你超越了基础,你会发现每个结构都有其独特的优势。如果你为你的最终选择写下你的理由,那将是最有帮助的。在这种情况下,触发器可以是每次你写关键字data的时候。对于一个更极端的版本,触发器可能是写下左括号开始一个列表。每次你这样做的时候,问问自己是否可以使用不同的结构。
这是最后一种可能性。每当你创建一个类型同义词时,问问你自己,如果用它来创建一个newtype是否会更好。这通常会导致更好的编译时行为。您可能会看到更清晰的错误消息,并且会在编译时发现更多的错误。这里的触发也很简单:任何时候你输入关键字type。
最重要的是。不要一次尝试多种!你想挑选一件事,练习它直到它成为潜意识,然后转移到其他事情上。这是刻意练习最难的部分:保持你的耐心。最大的诱惑是在好习惯固化之前继续前进,经常尝试新事物。一旦你把注意力转移到其他事情上,你可能会失去你正在做的任何事情!记得像对待复利一样对待学习!你需要做一些小的投资,在很长一段时间内积累起来。你不一定要加快这个过程。
跟踪错误
让我们也考虑一下避免将来犯同样错误的各种方法。同样,这些不同于你通过刻意练习建立起来的“技能”。它们发生得不多,你也不想“实践”它们。你只是想记住你是如何解决某个问题的,这样当它再次出现时你就可以再次解决它。你应该在谷歌文档中列出你在编程中遇到的所有最严重的错误。谷歌文档应该为每个错误记录三件事。
- 编译器消息或运行时行为是什么?
- 你的代码有什么问题?
- 你是怎么修好的?
举个例子,想想你确信你的代码是正确的时候。你查看错误,然后回到你的代码,然后回到错误。你仍然确定你的代码是正确的。当然,编译器(几乎)总是正确的。你要把这些记录下来,这样他们就不会再绊倒你了。
其他很好的候选对象是那些运行时错误,在这些错误中,您一辈子都无法找到错误发生在代码中的什么地方。你会想把这种经历写下来,这样下次发生这种情况时,你就能很快修复它。通过写下来,你也会激励自己去避免它。
还有一些愚蠢的错误你应该记录下来,因为它会更快地教会你正确的方法。比如当你开始的时候,你可以使用(+)操作符来尝试添加两个字符串,而不是(++)操作符。通过写下这样的错误,你会更快地学会古怪的语言特性。
你应该追踪的最后一组东西是令人敬畏的解决方案。不仅仅是错误修复,而是你的核心编程问题的解决方案。例如,您发现您的程序太慢,但是您使用了更好的数据结构来改进它。写下进展顺利的事情不仅感觉很好,你还会记录下你做了什么。这样,你下次也能应用它。这些项目(好的和坏的)是技术面试的好素材。面试官通常很想知道你克服了什么样的挑战,以显示你作为一名工程师的成长潜力。
我有一个例子来说明记录错误的好处和坏处。当我试图使用 Cabal 构建我的 Haskell 项目时,我遇到了一个令人讨厌的 bug。我记得这是一个没有指向任何特定文件的链接器错误。我做得很好,在心里记下了解决方案是在“中添加一些东西”。阴谋集团的文件。但我没有写下完整的背景或完整的解决方案。所以在将来,我会看到一个链接器错误,并知道我必须在。阴谋集团”的文件,但我不确定具体是什么。因此,与我写下完整的解决方案相比,我仍然更有可能重复这个错误。
摘要
“熟能生巧”是人们常说的一句话。但是任何掌握了一项技能的人都会告诉你,只有熟能生巧。糟糕或盲目的练习会让你停滞不前。或者更糟的是,它会使坏习惯根深蒂固,需要更多的时间来消除。刻意练习是通过建立微小的习惯来巩固知识的过程。你选择一件事来专注,忽略其他一切。然后你学习那个焦点,直到它变成潜意识。只有这样,你才能继续学习其他东西。这种方法需要极大的耐心。
关于学习,我们必须明白的最后一件事是,我们需要拥抱犯错的可能性。一旦我们做到了这一点,我们就可以制定一个计划来记录这些错误。这样,我们可以从中吸取教训,不再重复。这将极大地提高我们的发展速度。
如果你想开始你的刻意练习之旅,你应该下载我们的递归练习册!除了一些关于递归的内容外,还包含 10 道练习题。答案从undefined开始,这样你就可以一步一步地构建你的解决方案。这是学习刻意练习想法的好方法!
如果你以前从未写过一行 Haskell,不要害怕!你应该看看我们的入门清单。它将带您完成 Haskell 的安装,并为您开始 Haskell 之旅提供一些有用的工具!
黑客中午是黑客如何开始他们的下午。我们是 @AMI 家庭的一员。我们现在接受投稿并乐意讨论广告&赞助机会。
要了解更多信息,请阅读我们的“关于”页面,在脸书上点赞/给我们发消息,或者简单地说, tweet/DM @HackerNoon。