1.3 认知过程之间的关系
1.2 节详细讨论了 3 种与程序设计有关的重要认知过程。概括来说,长时记忆用于长期保存获取的信息,短时记忆用于暂时保存刚刚接收的信息,工作记忆则用于加工信息和孕育新想法。虽然本章把它们分为相互独立的过程,但是这 3 种认知过程之间的关系十分密切。下面来梳理一下三者之间的关系。
1.3.1 简要剖析认知过程如何相互作用
如图1-2所示,任何思考活动其实都会在某种程度上激活所有 3 种认知过程。阅读 Java 代码片段(参见代码清单 1-2)时,你可能已经在有意识地运用这些认知过程——大脑把“n 是整数”这类信息存储在短时记忆中,同时从长时记忆中提取出整数的定义,并利用工作记忆思考这段代码的作用。
图1-2 本书讨论的 3 种认知过程一览:短时记忆、长时记忆和工作记忆。箭头 1 代表进入大脑的信息,箭头 2 代表进入短时记忆的信息,箭头 3 代表从短时记忆转移到工作记忆的信息,这些信息与来自长时记忆的信息(箭头 4)相结合。工作记忆是大脑在进行思维活动时加工信息的机制
到目前为止,本章侧重于讨论代码阅读涉及的认知过程,但其他许多编程相关任务也会涉及这 3 种认知过程。
1.3.2 编程任务涉及的认知过程
我们以程序员阅读客户提交的错误报告为例进行讨论。问题似乎由差一错误引起。错误报告通过感官进入大脑——如果用眼睛看报告,那么感官就是眼睛;如果用读屏器“听”报告,那么感官就是耳朵。为解决问题,程序员必须再次阅读几个月前所写的代码。在重读代码的过程中,大脑把接收到的信息保存在短时记忆中,并从长时记忆中检索几个月前的信息(例如当时使用的 Actor 模型)。除了有关经验的记忆,长时记忆还会存储事实信息(例如差一错误的解决方案)。无论是刚刚获取的错误报告(存储在短时记忆中),还是解决类似错误的个人记忆和相关知识(存储在长时记忆中),所有信息都会进入工作记忆,大脑利用工作记忆来思考如何解决当前的问题。
练习 1-1
前文讨论了程序设计中涉及的 3 种认知过程。为加深印象,本练习设计了 3 段代码,不过这次没有解释它们的作用。因此,你必须阅读这 3 段代码并确定它们的作用。与之前的示例一样,3 段代码依次采用 APL、Java 和 BASIC 编写,但是每段代码执行的操作各不相同,所以无法依靠第一段代码来理解其他两段代码。
请仔细阅读 3 段代码并设法确定它们的作用,同时认真想一想阅读代码时涉及哪些认知过程。表1-1 列出的问题可以作为指导自我分析的工具。
表1-1 代码与认知过程
代码片段 1 APL 程序
f · {⍵≤1:⍵ ⋄ (∇ ⍵-1)+∇ ⍵-2}
这段代码的作用是什么?阅读代码时涉及哪些认知过程?
代码片段 2 Java 程序
public class Luhn { public static void main(String[] args) { System.out.println(luhnTest("49927398716")); } public static boolean luhnTest(String number){ int s1 = 0, s2 = 0; String reverse = new StringBuffer(number).reverse().toString(); for(int i = 0 ;i < reverse.length();i++){ int digit = Character.digit(reverse.charAt(i), 10); if(i % 2 == 0){//进行奇数位和偶数位校验 s1 += digit; }else{//对于 0~4,加上 2 * digit;对于 5~9,加上 2 * digit - 9 s2 += 2 * digit; if(digit >= 5){ s2 -= 9; } } } return (s1 + s2) % 10 == 0; } }
这段代码的作用是什么?阅读代码时涉及哪些认知过程?
代码片段 3 BASIC 程序
100 INPUT PROMPT "String: ":TX$ 120 LET RES$="" 130 FOR I=LEN(TX$) TO 1 STEP-1 140 LET RES$=RES$&TX$(I) 150 NEXT 160 PRINT RES$
这段代码的作用是什么?阅读代码时涉及哪些认知过程?