坚持到底—开发人员的实施计划

如何使用抽认卡和编码来真正保留概念

在欧洲各地的一个假期中,目的地之间有大量的停机时间,我开始翻阅彼得·布朗(Peter C. Brown),亨利·罗迪格三世(Henry L. Roediger III)和马克·麦克丹尼尔(Mark A. McDaniel)撰写的电子书“ Make it Stick”。 作为一个Java开发人员,他们认为自己在行业中有很多工作要做,我认为我需要比过去更好的学习策略。

在完成以前的教科书阅读后,我觉得自己没有保留所需的信息。 更具体地说,我从书本中获得了总体概念,但感觉只是保留了我所需要的一小部分。

我是“边做边学”的忠实信徒,而不仅仅是被动阅读文本,这是由多个来源证实的包括“坚持学习” 1和广受赞誉的“学习如何学习” MOOC。 2

重要的是自己培养“经验”,而不是阅读文本的次数。

问题在于,这本书本身并没有给出广泛的实施计划,因为它不想成为规定性的,所以是有意的。 但是,这使我们在软件开发中为一生苦苦挣扎的学生留下了什么呢?

我需要一种方法来证明该系统是否可以工作,然后再花太多时间,我想我发现了一个可以工作的系统。

简而言之,要获得最大价值,您需要:

  • 确定值得投资的主题
  • 安排时间练习和学习
  • 产生真实经验
  • 最大化您的投资回报率

确定值得投资的主题

重要的是要决定哪些科目可以保证这项投资,因为这就是事实。 如果您采用这种方法,您的材料肯定会变慢,但正如我发现的那样,您会提高召回率。

在实验期间,我决定专注于学习一些Java核心线索,因为我认为您将始终基于这些基础知识,并可以在各种环境中重复使用它们。

安排时间练习和学习

为了进行实际设置,您将需要一种测试自己的方法。 通过“检索练习”,您可以积极地回忆自己所学的知识,而不是简单地阅读,已被证明比其他回忆方法更有效3。 抽认卡就是这样一种方法。

我使用网站www.cram.com建立了抽认卡集合,每当我遇到一个我认为很重要的概念时,便将其添加到卡片中。 我比较喜欢纸质抽认卡,因为我可以在平板电脑,PC和手机上进行同步,并且在我乘坐公共交通工具,午餐时间或仅有一些闲暇时间时可以进行一系列“不错的测试”。

为了便于练习,我在学习材料后的1,3,7和10天里在手机上设置了提醒。 这样,我就很难回忆起某件事,但相隔的时间并不遥远,以至于我不得不再次学习所有东西。 目的是要努力回忆,但要努力克服,以至于我不得不重新阅读所有内容。

走过一段小路并不是要“坐着”,而是要经过一系列的日子。 因此,随着我对抽认卡的深入了解,召回它们的挑战也将越来越大。

以下是我如何安排间隔重复和学习测试的图表

产生“真实经验”

使用提醒系统,我可以挑战自己的高级概念—毕竟,您只能在抽认卡上放这么多东西。 但是,当然,技术工作需要更多地注意实施细节,因此我也需要一种方法来保留其中的信息。

输入“学习测试”,即“清洁代码4”一书中的内容。 对于那些不熟悉这个术语的人来说,这是“叔叔”鲍勃·马丁(Bob Martin)开发人员的绝佳方法。 简而言之,而不是阅读软件文档,而是使用可用的测试框架来“证明”文档所说的内容。

这正是我所做的事情-例如,当我读完一个教程说Java DateFormat以某种方式工作时,我创建了一个TestNG测试,该测试可以证明(或相反)我正在阅读的内容。

教程资料

示例:我想看看提供给DateFormat.getInstance()的Locale和Format参数如何工作

抽认卡

问:无论我的代码在哪里运行,如何检索字符串“ Jan-01–1970”?
提示:这是英国使用的格式。

答:我将使用DateFormat .getInstance()方法并传递两个参数
样式为DateFormat.MEDIUM(int)
语言环境将是Locale.UK(枚举)

学习测试示例

  @测试 
当LocaleUkAndDateFormatIsMediumThenThreeLetterMonthAndDay()引发异常时,公共无效{
DateFormat dateFormat = DateFormat。 getDateInstance (DateFormat。MEDIUM,Locale。UK);
assertThat (dateFormat.format( EPOCH_DATE ), (“ 1970年1月1日”));
}

示例:我想向自己证明,当我为DateFormat.getInstance()工厂方法提供零参数时,DateFormat类将使用MEDIUM日期格式和机器的语言环境。

抽认卡

问:如果不向getInstance()传递任何参数,会发生什么?

答:您将获得默认的DateFormat样式为MEDIUM以及运行代码的位置的语言环境。

  @测试 
当LocaleDefaultAndDateFormatDefaultThenThreeLetterMonthAndDay()引发异常时,公共无效{
DateFormat dateFormat = DateFormat。 getDateInstance ();
assertThat (dateFormat.format( EPOCH_DATE ), (“ 1970年1月1日”));
}

这是至关重要的。 通过运行一系列测试,并发现它们失败了,我发现在某些情况下,我对API的现有理解是错误的。 我可以看到测试失败,可以从官方文档或某人的文章中找到并进行一次可以运行的测试,以查看影响。

在某些情况下,这些“较低级别”的发现对我来说足够重要,可以为其创建更多的抽认卡,使我想不到我所期望的东西。

最大化您的投资回报率

我在bitbucket上设置了一个帐户,以便可以检入我编写的任何测试。 结合在线和离线(在平板电脑和手机上)都可以使用的补习班,我可以随时随地获得参考资料。

这是一个巨大的回报。 举个例子,本月我针对BigDecimal API编写了学习测试。 在工作中,当我迫不及待地想知道单元测试为什么失败时,我简单地拉下了学习测试库,发现了一个符合我需要的方案。 在扫描代码时,我“免费”获得了关于API的复习!

正如“学习方法”课程还提到了 5 ,每次您在新场景中回忆信息时,信息和记忆都会得到增强和丰富,因此通过拥有数字系统,您甚至可以从这种方法中获得价值给…打电话。

最后的话语和发现

我写了一篇更广泛的文章,介绍如何设置我的系统,并在适当的时候将其链接到这里,供有兴趣的人参考。 现在,我想重申一些关键点。

  • 重要的是要决定哪些科目可以保证这项投资,因为这就是事实。 我倾向于使用这种方法来学习主题的基础知识,因为它们是很好的“物有所值”的方法。 您将获得长期召回的好处,可以在各种情况下一次又一次地应用信息。
  • 我不确定是否需要长期落实主题的特定实现 -我认为的“寿命”不值得让您放慢脚步。
    举个例子,我编写了关于反射的学习测试,因为像Spring这样的框架大量使用了反射,但是我不会在工作中编写用于开发Spring Web Project的学习测试。 在这些情况下,我的学习将来自于实际开发项目! (当然,无论如何我都会为任何开发编写单元测试)
  • 我很震惊地看到API会因测试失败而使我感到惊讶,这很好地证明了本书中的两点:“您从失败中学到的东西更多”和“在尝试为自己产生答案时学到的东西” 。
  • 在您现在没有基本概念的具体用例的地方,这是学习测试真正发挥作用的地方。 您拥有一套经过验证的参考资料,而无需每次都重新解释文档。

您的反馈

我希望现在在评论部分收到您的来信。 你喜欢这篇文章吗? 有什么指示我可以改善我为您提供的服务吗? 这种方法成功吗? 你有绊脚石吗?

很高兴知道您的想法。

资源资源

抽认卡

作为一组抽认卡的示例,我已链接到我在反射,日期/时间和集合上制作的某些抽认卡。

Bitbucket学习测试项目

我在这里提供了一些我一直在学习API的资源,欢迎您自己使用,但是如果您重新博客,请链接回到本文。 请注意,一些测试(集合和并发)仍在进行中,以进行全面修复-我故意将它们留在这里,以提醒我仍然没有掌握这些要点。

引文

1布朗,彼得C,鲁丁格三世,亨利L,麦克丹尼尔,马克A。“反思是一种实践形式。”坚持下去。 剑桥,马萨诸塞州,英国伦敦:哈佛大学Belknap出版社,2014年。第26-27页。 打印。

2 https://www.coursera.org/learn/learning-how-to-learn/lecture/BuFzf/illusions-of-competence

3 Brown,Peter C,Roedinger III,Henry L,McDaniel,MarkA。“测试:试纸与学习工具”。 剑桥,马萨诸塞州,英国伦敦:哈佛大学Belknap出版社,2014年。第18-19页。 打印。

4 Martin,Robert C,“探索边界”清洁代码:敏捷软件工艺手册。 马萨诸塞州斯托顿。 培生教育。 第116–118页。 打印。

5布朗,彼得C,鲁丁格三世,亨利L,麦克丹尼尔,马克A。 剑桥,马萨诸塞州,英国伦敦:哈佛大学Belknap出版社,2014年。第43-44页。 打印。