《Just JavaScript》01. 思维模型

读以下代码:

1
2
3
let a = 10;
let b = a;
a = 0;

当他们运行后a和b的值是多少?在你往下阅读之前,先在你的脑子中想出答案。

如果你已经写了一段时间的JavaScript,你可能会想:“这比我每天写的代码简单多了,意义何在?”

这个练习的目标不是向你介绍变量,我们认为你已经对这些很熟悉了。相反的,它是为了让你注意并反思你的思维模型。

什么是思维模型

再次阅读上面的代码,目的是真正确定结果是什么。(我们稍后看为什么这个目的很重要)

当你第二次读它的时候,一步步地注意你脑子里发生的事,你可能会有这样的独白:

1
2
3
4
5
6
7
// 1.声明一个变量a,并给它赋值10
let a = 10;
// 2.声明一个变量b,将a的值赋给它,a为10,所以b也为10
let b = a;
// 3.将0赋给a
a = 0;
// 4.所以最后的答案是a的值为0,b的值为10

可能你脑中想的会有点不一样,可能你想的是给a设置值而不是赋值,或者你可能用不同的顺序读它。甚至你最后得出了不同的结果。注意一下具体哪里不同,即使是这段独白也无法真正捕捉到你脑海中发生的事情。你可能会说“把b设为a”,但是设置一个变量意味着什么呢?

你可能会发现,对每个熟悉的基本编程概念(比如变量)和操作(比如赋值),会有一套根深蒂固的类比与之相关。一些来自于现实的世界,其他的可能会从你最初学到的领域重新运用,比如数学中的数字。这些类比可能会部分重叠甚至矛盾,但是它们仍然帮助你理解在代码中发生了什么。

举个例子,很多人最初把变量当做盒子来学习,你可以往里面放东西。当你看到一个变量的时候,尽管你并没有真正地想象出一个盒子,但是在你的脑海里它们可能仍表现得像一个盒子。这些在你脑海中相似的运作方式被我们称做思维模型。思维模型对编程很久的你来说可能有难度,但是你要尝试注意和反思它们。它们可能是视觉的、空间的和机械的思维捷径的组合。

这些直觉(类似把变量比作盒子)在我们整个编程生涯中会影响我们如何读代码。但是有时候,我们的思维模型是错误的。可能我们早期读过的辅导课为了能简单的解释一些东西而牺牲了它的正确性。也许我们错误的从之前学过的另一种语言转移了关于特定语言特征的直觉。也许我们从某段代码推断出一种思维模型,但从未验证它是否准确。

识别和解决这些问题就是这本书《Just JavaScript》的全部内容。我们将逐步构建(或者,可能的话,重新构建)你关于JavaScript的思维模型,使之准确而有用。一个好的思维模型将会帮助你更快的定位和修复bug,更好的理解别人的代码,对你自己写的代码更自信。

(顺带一提,a的值为0,b的值为10是正确答案)。

快慢编码

丹尼尔·卡尼曼的《思考,快与慢》是一本广受欢迎的非小说类书籍。它的中心论点是,人类在思考时使用两种不同的“系统”。

只要有可能,我们就依靠“快速”系统。我们与许多动物共享这个紫铜,这给我们惊人的力量,就像走路时不摔倒一样。这个“快速”系统擅长模式匹配(生存所必需!!)以及“内脏反应”。但是它并不擅长计划。

独特的是,由于额叶的发育,人类也有一个“慢”思维系统。这个“慢”思维系统负责复杂的逐步的推理。它让我们计划未来的事件,参与争论或遵循数学证明。

因为使用“慢”系统在精神上非常消耗,所以我们倾向于默认使用“快”系统,即使在处理诸如编码之类的智能任务时也是如此。

想象你正忙于大量的工作,并且你希望快速识别此函数的功能,快速浏览以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
function duplicateSpreadsheet(original) {
if (original.hasPendingChanges) {
throw new Error('You need to save the file before you can duplicate it.');
}
let copy = {
created: Date.now(),
author: original.author,
cells: original.cells,
metadata: original.metadata,
};
copy.metadata.title = 'Copy of ' + original.metadata.title;
return copy;
}

你可能会思考:

你可能没有注意到(如果你注意到了,那就太好了!)这个函数也意外地改变了原始电子表格的标题。

每个程序员每天都会遇到这样的错误。但是现在你知道bug存在了,你会换种方式读代码吗?如果你一直在使用“快”模式阅读代码,则很可能会切换到更费劲的“慢”模式来查找他。

在“快”模式下,我们通过名字、注释和它总体的结构猜测代码干了什么。而在“慢”模式下,我们逐步追溯代码做了什么。

这就是为什么正确的思维模式非常重要。在我们的脑海中模拟一台计算机已经够难了——而这种努力被错误的思维模式所浪费。

如果你根本找不到bug,别担心,这意味着你会从这门课中得到最大的收获!在接下来的模块中,我们将一起重塑JavaScript的思维模型,以便你一目了然地看到bug。

在下一个模块,我们将开始为一些最基本的JavaScript概念(值和变量)构建思维模型。

上次更新 2020-06-03