教学调试(2014)

2020-12-09 19:40:16

进行调试培训在2000年秋天,我参加了我的第一堂工程课:ECE 352,这是第一年计算机工程师的入门级数字设计课。它只是在客厅,到处都是等待入学的学生,他们会在学期末因人退学而找到座位。我们已经被警告说我们中的一半将无法生存这一年。在课堂上,我们再次被警告说,我们中有一半人注定要失败,而ECE 352是淘汰类,将造成很大的损失。

班上同学们活跃起来。第一堂课浪费了很少的时间在课程提纲上,很快进入了真正的课程材料。随后的讲座以先前的讲座为基础;谁不能抓住一个人,下一个都没有机会。项目在两周后开始,并且也基于他们的前任。没有完成一个任务的任何人都没有希望做下一个任务的希望。

我的一个朋友,我不明白为什么有些人遇到这么多麻烦;材料似乎是常识。费曼方法是我们唯一需要的工具。

费曼方法使我们在最后一个项目上失败了:分频器的设计,一个现实世界规模的项目,其复杂程度比我们以前要求解决的任何问题都要复杂。在他分配项目的那天,教授劝告我们尽早开始。在接下来的几周里,我们听到谣言说我们的一些同学日夜工作,但没有取得进展。

但是直到项目到期前一天晚上6点,我和我的朋友都忽略了所有这些证据。人们在挣扎中,这使我们感到惊讶,因为一半的班级在所有作业上都遇到了麻烦。我们一半忙碌于一切。我们认为我们应该在截止日期之前的晚上开始,并按时吃完晚饭。

在我们认为应该完成的一个小时后,我们才刚刚开始;我们俩都没有可行的设计。我们的失败是如此不同,以至于我们无法有效地比较音符。这个实验室里挤满了已经工作了几个星期的人,还有我们等到最后一刻才工作的人,到处都是坏消息:少数人在第一次尝试中就设法建立了一个工作部门,但没人能做到。想出了如何将不正确的设计转换为可以执行三级算术的东西。

我继续使用自己拥有的唯一工具:认真思考。该方法以前很可靠,但现在却产生了混乱,因为该项目太复杂而无法完整地可视化。我试图单独考虑设计的各个部分,但这仅表明问题出在各个部分之间的某种交互作用上。我看不到每个单独的组件有问题。思考各部分之间的关​​系是一种无奈的练习,一种持续的感觉,即解决方案是遥不可及的,因为专注于某一部分会把其他一些关键的知识从我脑海中挤出来。在接下来的一个学期中,我将获得足够的经验来管理复杂性和将组件集合视为黑盒抽象,我可以将设计推到另一个数量级而又没有问题的复杂性,但这是三个漫长的冬季实践,而今晚,我对如何进行一无所知。

到晚上10点,我饿死了,没有主意。我把人们聚在一起吃晚饭,希望能从考虑这个项目中得到一点休息,但是我们只能说那是多么的无望。当唯一的方法是完美地组装成千上万个零件而不会发生任何错误时,我们应该如何完成?这是荒唐的Atari游戏的乏味版本,没有生命,也没有继续。任何错误都是致命的。

许多人决心从头开始。他们决定成对工作以互相核对。我太固执,无法重新开始,也缺乏经验,不知道还要尝试什么。回到实验室后,由于有太多人放弃了,现在半空了。我继续盯着我的设计,好像再思考三个小时就会发现一些新的见解。

然后,午夜刚过,我们晚餐中的许多新伙伴报告了成功。从零开始的人中有一半具有可行的设计。其他人则感到沮丧,因为他们的设计仍然以某种微妙的,非显而易见的方式被破坏了。当我与其中一位学生交谈时,我开始仔细研究他的设计。几分钟后,我意识到费曼方法并不是唯一的前进之路:应该有可能反复系统地应用机械技术来找到问题的根源。在所有抽象之下,我们的项目完全由“与非”门组成(对那些在我们的工具箱中挖出足以揭示动态逻辑的人而言是祸),仅当两个输入均为1时,才输出0。如果正确的输出为0,则两个输入均应为1. t的输入有错误,它本身就是一个与非门的输出,其中至少一个输入应为1时为0。我们递归应用此方法,找到我们两个设计中的所有问题都在半小时之内。

我们很兴奋地向周围的人介绍了我们的新发现的技术,并带领他们走了几步。没有人遇到麻烦。甚至没有为以前的工作感到苦恼的人们。一个小时之内,我们耳中的一群人都吃完了,我们回家了。

我现在明白为什么一半的班级都为早期的作业而苦苦挣扎。没有解释如何系统地解决问题,任何没有直觉地掌握正确解决方案的人都会感到沮丧。像我一样,高于平均水平但并不出色的人,在大多数班级中都溜冰了,他们很幸运或在最后的项目上浪费了大量时间。我什至看到人们很有才华,可以轻而易举地度过整个学位,而不会遇到太大的问题,无法凭直觉来理解;这些人在现实世界中遇到一千万行代码库的时候非常艰难。工程师越有才华,他们越有可能在校外碰壁调试墙。

我不明白的是,为什么学校不教系统的调试。它是工程学中最基本的技能之一:从问题的症状开始,追溯到找到问题的根源。最多需要半个小时的时间来教授绝对基础知识,哪怕是一点点也足以节省掉洗手并改用非STEM专业的学生的很大一部分。使用逐渐复杂的问题的标准工程类序列,对调试的关注可以扩展到一个学期,这足以覆盖一个令人讨厌的现实世界中的错误:也许某个系统每天崩溃一次当使用1994年的晦涩基准运行1,使用两个视频摄像头并使用特定视频卡通过硬件加速反复播放Blu-ray DVD并录制具有明显运动的东西时1。

这种动态变化并不是ECE 352甚至威斯康星州所独有的-当我在普渡大学第二年学习信号和系统课程EE 202时,我看到了同样的事情。问题是FFT和Laplace变换,而不是除法器和布尔2,但是避免教授基本技能是相同的。从学生在上班时间问我的问题来看,很明显,表现不佳的人并没有为班级的基本概念而苦苦挣扎,而是在代数方面苦苦挣扎:这些问题是由于对以下内容缺乏直觉的理解而引起的:例如,f(x + a)和f(x)+ a之间的差。

当我向教授建议他花半小时为那些从未在高中时有力地讲授材料的学生复习代数时,我毫不犹豫地被告知,这将浪费时间,因为有些人可以; t在工程学中破解它。有人告诉我,学期结束后,我不会太天真,因为有些人无法在工程学中攻克它。有人告诉我,用补习材料来帮助学生没有任何帮助。他们还是无法处理高级课程,因为有些学生根本无法在工程学中攻读高级课程。有人告诉我,普渡大学有宽松的招生政策,我应该期望高的失败率,因为有些学生根本无法在工程学中攻克它。

我同意几个学生可能会提供大量的帮助,但是如果有能力做到惊人的记忆力的人通过第一年的工程课程和微积分而又不深入了解代数的话,这会很奇怪学会了解他们记忆的代数。我不是一位出色的老师,但是我可以让一个办公时间的常客赶上整个学期。一位经验丰富的老师,即使是一个不太关心教学的老师,也可以轻松地向所有人教授这些材料。

为什么我们将材料留在课堂之外,然后让无法自己弄清楚这些材料的学生失败?为什么我们要使工程专业的头几年有些令人讨厌的仪式,而不是简单地向人们传授成为优秀工程师所需的知识?在所有高层讨论中,我们都需要如何堵塞STEM教育管道中的泄漏,不仅我们没有堵塞漏洞,而且我们为管道泄漏的速度感到自豪。

我看到这是一个实际的CPU错误,大约花了一个月的时间进行跟踪。这是bug的简单形式,它包含一组导致每天大约一次重现故障的成分-bug的原始形式仅每隔几天就会失败一次。我之所以不选择这个示例,是因为它特别困难:我可以想到很多需要花费较长时间来跟踪且具有奇怪症状的错误,包括一个灾难性的错误,该错误花费了六个月的时间才使我们最好的调试器了解。

对于在那里的ASIC硅后调试人员来说,该芯片几乎没有进行全面扫描的方法,而我们将状态从芯片中转储出去的唯一方法会扰动芯片的状态,从而使某些错误消失。美好的时光。从好的方面来说,在处理状态可见性差的不确定性硬件错误之后,软件错误似乎很容易。在最坏的情况下,它们很无聊且乏味,因为调试它们是将问题追溯到问题根源的问题。

[返回]

我的一位同事告诉我在克雷(Cray)的一段时间,当时一位高级总理提到该项目“需要更多布尔值”,提到工程资源不足。从那时起,我一直将数字设计师视为消耗咖啡因并产生布尔值的人。我仍然不确定模拟魔术师会产生什么。 [返回]