程序员超强大脑
上QQ阅读APP看书,第一时间看更新

1.2 节详细讨论了 3 种与程序设计有关的重要认知过程。概括来说,长时记忆用于长期保存获取的信息,短时记忆用于暂时保存刚刚接收的信息,工作记忆则用于加工信息和孕育新想法。虽然本章把它们分为相互独立的过程,但是这 3 种认知过程之间的关系十分密切。下面来梳理一下三者之间的关系。

如图1-2所示,任何思考活动其实都会在某种程度上激活所有 3 种认知过程。阅读 Java 代码片段(参见代码清单 1-2)时,你可能已经在有意识地运用这些认知过程——大脑把“n 是整数”这类信息存储在短时记忆中,同时从长时记忆中提取出整数的定义,并利用工作记忆思考这段代码的作用。

图1-2 本书讨论的 3 种认知过程一览:短时记忆、长时记忆和工作记忆。箭头 1 代表进入大脑的信息,箭头 2 代表进入短时记忆的信息,箭头 3 代表从短时记忆转移到工作记忆的信息,这些信息与来自长时记忆的信息(箭头 4)相结合。工作记忆是大脑在进行思维活动时加工信息的机制

到目前为止,本章侧重于讨论代码阅读涉及的认知过程,但其他许多编程相关任务也会涉及这 3 种认知过程。

我们以程序员阅读客户提交的错误报告为例进行讨论。问题似乎由差一错误引起。错误报告通过感官进入大脑——如果用眼睛看报告,那么感官就是眼睛;如果用读屏器“听”报告,那么感官就是耳朵。为解决问题,程序员必须再次阅读几个月前所写的代码。在重读代码的过程中,大脑把接收到的信息保存在短时记忆中,并从长时记忆中检索几个月前的信息(例如当时使用的 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$

这段代码的作用是什么?阅读代码时涉及哪些认知过程?