重新考虑我解释编程的方式(2020)

2021-07-29 21:29:16

“你知道递归沙拉的食谱吗?” - 我问。 “它由西红柿、橄榄和递归沙拉组成”。我的笑话落空了。迈克尔的眼神迷茫,等待着解释。我重新组合并尝试不同的策略——草图:我向不同的人解释了很多编程概念。从刚入门的高中生,到经验丰富的工程师,他们迅速潜入一门新的编程语言。我曾经为我曾经提出的聪明解释感到非常自豪。 “你的 UI 只是一个状态函数”,“闭包将你的变量包含在范围内”,“Prolog 函数参数可以输入或输出”。我也喜欢视觉效果、格式化代码和展示巧妙的动画。但很多时候接收端的人不会那么兴奋。我以为我的交货很差。编程是复杂而抽象的。就像高级数学一样,它从我们通常处理的日常事务中删除。我所描述的只是我的心智模型。文字、图片和大量的挥手是我内化这些抽象概念的方式。 “讲师说出描述一个想法的词;全班听到单词,可能还会在笔记本上涂鸦;然后全班就理解了这个想法。”在学习科学中,我们称这种模型为“传输主义”。知识可以直接从老师传给学生,就像将文本从一页转录到另一页一样。要是!这个想法完全不可信,以至于“传播主义”只是贬义地使用,指的是幼稚的历史教学实践。或者作为多汁的学术争吵中的广告。

我所有的“完美”模型都只在我的脑海中是美丽的。有时,他们确实与其他人产生了共鸣,但这纯粹是运气——他们的直觉与我对那个特定问题的直觉一致。首先,我试着非常仔细地倾听他们的问题。如果他们话不多,我会问问题并继续听。我会记录他们如何解释自己:他们使用什么名称来指代抽象概念?我会尝试使用相同的。他们以什么样的方式运作?他们是“看”事物还是“听”事物?他们需要走多深?只是修复一些东西然后继续前进,或者试图在更基本的层面上理解它?其次,我拒绝解释我是如何理解它的冲动。我试图接受他们对世界的心理模型,即使我认为它不是非常准确。只要不影响他们的理解,我愿意跳过不重要的部分。如果环境允许,我会鼓励他们使用调试器、日志或对代码进行试验。为此,有时我需要将问题空间缩小到一个更小的空间。

他们的关键是让他们探索现实世界(在这种情况下,编译器或编程语言运行时的工作方式)并调整他们自己的模型。目标是帮助他们发展自己的直觉,而不是传达我自己的直觉。这可以概括为:成功的沟通很大程度上是关于了解背景和接收端的人。回到迈克尔。我向他展示了 IntelliJ 调试器,并要求跟踪他编写的一个非常简单的递归程序。 “所以它就像楼梯!”,他惊呼道。 “每一次进去,就像是踏出一步,然后一路下来”。嗯,我想它有点像楼梯......我自己从来没有想过递归这种方式。现在我想我可以通过自动扶梯的类比来解释尾调用优化。