Skip to content

Latest commit

 

History

History
86 lines (57 loc) · 5.84 KB

01. 思维模式.md

File metadata and controls

86 lines (57 loc) · 5.84 KB

看看这段代码

let a = 10;
let b = a;
a = 0;

当运行这段代码以后,ab 的值分别是多少?在你接下去读之前先想想这个答案。

如果你已经写过一阵 Javascript,你可能会抱怨:“这段代码太简单了,我天天都在写啊,你到底想干嘛?”

然而这个练习并不是为了向你介绍什么是变量。我们确信你已经对它们非常的熟悉了。然而,这将会促使你注意并反思 思维模式

什么是思维模式?

再认真读一下上面的代码,确信一下结果是什么。(稍后告诉你为什么要认真读)。

当你再读一次这段代码,当你集中注意力的时候,你会逐渐注意到一些事情。你可能会注意到一些代码的“独白”:

  • let a = 10;

    • 声明一个叫 a 的变量,将其设置为 10
  • let b = a;

    • 声明一个变量 b,将其设置为 a
    • 等等,a 是什么?是 10 啊,所以 b 也是 10
  • a = 0;

    • 将变量 a 设为 0
  • 所以现在 a0b10,这就是答案了。

也许你的“独白”会有些不一样。有可能你会用“赋值”代替“设置”,也或许你会有用不同的顺序来考虑它。也有可能你想到了不同的结果。请注意为什么会造成不同的结果。注意这些“独白”其实并不代表你脑子力真正的想法。你有可能会说“将 b 设置给 a”,但它是不是意味着设置一个变量?

你可能会在其中发现一些熟悉的基础编程概念(例如变量)及操作(例如给变量赋值),这些都是一些你根深蒂固理解的一些类比,有一些还是来自真实的世界。另外一些可能来自你学习过的另外的领域,比如数学中的数字。这些类比可能会互相重叠或者相悖,但仍然能帮助你合理地理解代码发生了什么。

举个例子,许多人在学习变量的时候,都会被告知关于“盒子”中装入“物品”的类比。尽管你不一定能在看到变量的时候生动地想象出“盒子”,但是它仍然会在你的想象中“盒子化”。这些在你脑中近似的类比就叫做“思维模式”。如果你编程很久了,可能会有些困难,但请仍然尝试注意并反省你的思维模式。它们可能是视觉、空间以及机械思维的结合。

这些直觉(比如变量的“盒子化”)影响着我们如何去阅读代码的过程。但是有些时候,我们的思维模型是错的。可能一些我们读过的早期教程为了便于解释而忽略了一些正确性。也可能某些其他语言特性引入的一些错误的概念,比如在之前学习的其他语言中的 this 就是个例子。也许我们我们从一些代码片段中推断出了一些思维模型,但是从来没有验证它是否准确。

确定并修复这些问题是 Just Javascript 这本书的全部。我们会逐步构建(也许是重构)你关于 JavaScript 有用并准确的思维模型。一个好的思维模型将会帮助你更快找到并修复 bug,以及更好地理解其他人的代码,并在你编写自己的代码时会更加自信。

(顺便说一下,a0b10 是正确答案)

编程,快和慢

“Thinking, Fast and Slow” 是 Daniel Kahneman 广为认知的一本非小说类书。它提出人类在思考的时候会用到两个不同的“系统”。

只要可能,我们通常倾向使用“快”系统。我们与许多动物共享这个系统,比如我们在走路时不会摔倒这样神奇的力量。这个“快”系统非常擅长模式匹配(生存必须!)并且“做出反应”。但它不擅长做计划。

特别地,感谢前额叶的发展,人类同时拥有“慢”系统。这个“慢”系统可以对复杂的问题进行逐步推理。它让我们可以规划未来的事情,参与讨论,或者遵循数学证明。

因为使用“慢”系统会耗费很多的精力,我们倾向默认使用“快”系统 ———— 即使是在做智力需求比较高的任务,比如编程。

想象你正处在许多工作中间,并且想快速确定这个函数做了什么。快速看一下这段代码:

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;
}

你可能注意到了:

  • 这个函数复制了一个分页
  • 它会在原始分页没有保存时报错
  • 它将会以 “Copy of” 做为新分页的标题开头

还有什么你可能没注意到的是(如果你注意到了,就太棒了!)这段代码可能意外地改变了原始分页的标题。

像这样这些隐藏的 bug 在每天都在每个程序员身上发生。但现在你知道了有个 bug 的存在,你在读这段代码的时候会感觉不一样吗?如果你已经在“快”模式里读了这段代码,你可能需要切换到更耗费精神的“慢”模式来找到这个问题。

在“快”模式里,我们通过命名,注释来猜测代码的意图以及整体结构。在“慢”模式里,我们会逐步逐步追踪代码发生了什么。

这就是为什么正确的思维模式非常重要。在我们的脑中模拟一个计算机非常困难 ———— 而这种努力会因为错误的思维模式而被浪费。

如果你找不到 bug,也别担心。这意味这你非常需要这个课程!在接下来的模块里,我们会一起重构关于 JavaScript 的思维模式,这样你就会轻易地发现 bug 了。

在下一个模块里,我们将会开始构建一些 JavaScript 最基础的概念的思维模式 —— 值与变量。