如何快速学习复杂事物的指南 - Baldau


在担任软件工程师的20多年里,我一直被要求或期望我学习复杂的东西。卡尔·纽波特(Cal Newport)在他的《深入工作》(Deep Work)一书中谈到知识经济时说:“如果不学习,就无法繁荣。” 启动了新的语言和平台,项目提出了新的要求,库和框架发布了新版本⁠–在软件中,唯一不变的是变化。
免责声明⁠-我是一位经验丰富的学习者。我尝试一些东西,当它不起作用时,我尝试其他方法,并在“可行”后立即进行下一步。这有助于我在每次迭代中创建一个更加清晰的思维模型。这对我有用,但是我知道学习风格很多,而且可能对您不大有用。
 
确定目标

  • 将您要尝试学习的所有内容分解成用例。从耗时数分钟的一口大小的块开始,然后逐步增加它们。“学习python”太广泛了。安装python,打印hello world,安装和使用依赖项,从文件中读取等内容的定义更加明确,完成后更容易知道,从而有助于增强进度。
  • 考虑一下您需要学习多少才能完成每一项。将事情归类为“需要更多信息”和“暂时跳过详细信息”可能会有所帮助。例如,我不知道python依赖性管理的工作原理,但是我可以依靠它的工作并在没有这些知识的情况下取得进展。
  • 首先尝试一些东西。您可能会担心自己会搞砸,但是以我的经验,计算机很难损坏。使用已经必须猜测的思维模型。如果不是,那么您可以响应错误消息。
  • 休息一下。如果您正处于起伏和巡航中,请务必放心⁠—保持顺畅。但是,如果您发现自己失去了动力,侧身移动或翻新了旧地面,请让大脑休息一下。如果您以较小的增量来定义目标,那么您应该能够感觉到自己取得了一些进步,并腾出时间来处理所学到的东西。 

 
阅读完整的手册(RTFM),但不要尝试将其全部内部化
  • 得到要点。如果您正在学习已发布的文档,请阅读介绍,每个节/章的第一和最后一段以及每个段落的第一句以及提供的代码示例。如果您感到困惑,请稍作备份,并在必要时进一步深入。
  • 注意标注。标注和提示可能会很有帮助。通常在容易出错的地方提供它们。
  • 创建一个“稍后阅读”列表。我经常会发现自己对系统相关部分的工作方式感到好奇,但是除非我需要了解完成我所关注的用例的知识,否则我会推迟。我在待办事项应用程序中保留了一份阅读清单,但是那里有很多解决方案。 
  • 使用“入门”指南。这是“略读”规则的例外。入门指南通常是针对人们刚刚开始他们的学习之旅,其目的是给你只是足够的信息来实现单次使用的情况。不要略过它们⁠-阅读全部内容,并按照提供的示例进行操作。在GitHub上查看样板项目。
  • 不仅仅是docs。如果存在视频,播客和直播,则它们都是传递信息的一种有价值的方式。尝试使用其他媒体,然后找到最适合您的媒体。努力以2倍的速度观看/收听音乐,但放慢脚步,寻找有趣的部分。

 
学习深入(一点点)
因此,您已经信任自己的本能并刚刚开始,但是您立即遇到了障碍。可能是找不到命令,NullPointerException或 网页上的404。您如何从系统中获取更多信息?
  • CLI帮助。大多数命令行界面(CLI)将返回部分内容,帮助,--help或-h。关于参数及其顺序的线索可能有用。 
  • 潜入日志。大多数系统会将某些输出记录到控制台上或磁盘上某个位置的标准输出中。阅读日志就像阅读有关系统正在尝试执行的操作的故事一样。
  • 提高冗长程度。如果您已经阅读了日志,但不确定该如何处理,请尝试增加输出/日志的详细程度。您通常可以找到有用的线索和新的领域进行研究,这将使您更接近问题。
  • 搜索错误消息。其他人可能也遇到了同样的问题,您可能会在Q&A网站上找到线索,例如Stack Overflow,讨论或支持论坛,或者在GitHub中公开问题。确保引用错误消息,并尝试删除特定于用例的部分,而不是更普通的部分。
  • 阅读源代码。如果您有权访问系统的源代码,那么阅读它可以帮助您了解系统期望如何使用您的用例。不要试图理解每一行,而要使用类和方法名称作为系统名词和动词的信号。对于没有良好日志记录,文档或帮助的内部工具,这可能是唯一的选择。不确定代码是否是开源的?尝试在您语言的程序包管理器(对于Node.js为npmjs.org,对于python为pypy.org)中搜索库,或者在您喜欢的搜索引擎中尝试“ GitHub {programming language} {package name}”。

 
不要害怕寻求帮助
首先做功课-以前可能有人遇到过,特别是如果您是这个主题的新手。以下是您寻找答案时的良好资源:
  • 文档(请参阅RTFM)
  • 常见问题
  • 社区论坛
  • 聊天记录
  • 搜索

通过记录问题和一些相关的上下文,使其他人容易获得帮助。
  • 你想达到什么目的?
  • 您期望什么行为,您观察到了什么?
  • 你尝试了什么?
  • 您的执行上下文是什么?(操作系统,版本,插件等)
  • 这是现实生活中的一个(较旧的)示例:https : //github.com/Kong/kong/issues/1186 

 
反思过程
  • 总结并分享您学到的知识-这是所有知识工作者的好习惯
  • 您在哪里度过了无法帮助您达到目标的时间?
  • 是什么让您再次学习变得更容易?
    • 文档澄清?界面有变化吗?
    • 您可以修复它们(内部或开放源代码)或建议更改以使将来的学习者更容易吗?

 

总结
学习是一个反复的过程。首先定义您的目标,然后将它们分解为几小块。阅读任何可用的文档,以获取一定的背景信息,但不要一口气消化它们。不要害怕尝试从系统中获取更多信息。预算用尽时寻求帮助,但要清楚自己的要求。创建反馈循环以改善您和未来学习者的学习过程。