整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

2022前端大厂JavaScript 面试真题

. JavaScript 有哪些数据类型,它们的区别?

JavaScript 共有八种数据类型,分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。

其中 Symbol 和 BigInt 是 ES6 中新增的数据类型:

●Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了 解决可能出现的全局变量冲突的问题。

●BigInt 是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。

这些数据可以分为原始数据类型和引用数据类型:

●栈:原始数据类型(Undefined、Null、Boolean、Number、String)●堆:引用数据类型(对象、数组和函数)

两种类型的区别在于存储位置的不同:

●原始数据类型直接存储在栈(stack)中的简单数据段,占据空间 小、大小固定,属于被频繁使用数据,所以放入栈中存储;

●引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固 定。如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈 中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引 用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

堆和栈的概念存在于数据结构和操作系统内存中,在数据结构中:●在数据结构中,栈中数据的存取方式为先进后出。

●堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大 小来规定。

在操作系统中,内存被分为栈区和堆区:

●栈区内存由编译器自动分配释放,存放函数的参数值,局部变量的 值等。其操作方式类似于数据结构中的栈。

●堆区内存一般由开发者分配释放,若开发者不释放,程序结束时可 能由垃圾回收机制回收。

2. 数据类型检测的方式有哪些

(1)typeof

其中数组、对象、null 都会被判断为 object,其他判断都正确。

(2)instanceof

instanceof 可以正确判断对象的类型,其内部运行机制是判断在其 原型链中能否找到该类型的原型。

可以看到,instanceof 只能正确判断引用数据类型,而不能判断其 本数据类型。instanceof 运算符可以用来测试一个对象在其原型链 中是否存在一个构造函数的 prototype 属性。

(3) constructor

constructor 有两个作用,一是判断数据的类型,二是对象实例通过 constrcutor 对象访问它的构造函数。需要注意,如果创建一个对象 来改变它的原型,constructor 就不能用来判断数据类型了:

(4)Object.prototype.toString.call()

Object.prototype.toString.call() 使用 Object 对象的原型方法 toString 来判断数据类型:

同样是检测对象 obj 调用 toString 方法,obj.toString()的结果和 Object.prototype.toString.call(obj)的结果不一样,这是为什 么?

这是因为 toString 是 Object 的原型方法,而 Array、function 等类 型作为 Object 的实例,都重写了 toString 方法。不同的对象类型调 用 toString 方法时,根据原型链的知识,调用的是对应的重写之后

的 toString 方法(function 类型返回内容为函数体的字符串,Array 类型返回元素组成的字符串…),而不会去调用 Object 上原型 toString 方法(返回对象的具体类型),所以采用 obj.toString() 不能得到其对象类型,只能将 obj 转换为字符串类型;因此,在想要 得到对象的具体类型时,应该调用 Object 原型上的 toString 方法。

3. null 和 undefined 区别

首先 Undefined 和 Null 都是基本数据类型,这两个基本数据类型 分别都只有一个值,就是 undefined 和 null。

undefined 代表的含义是未定义,null 代表的含义是空对象。一般 变量声明了但还没有定义的时候会返回 undefined,null 主要用于 赋值给一些可能会返回对象的变量,作为初始化。

undefined 在 JavaScript 中不是一个保留字,这意味着可以使用 undefined 来作为一个变量名,但是这样的做法是非常危险的,它会 影响对 undefined 值得判断。我们可以通过一些方法获得安全的 undefined 值,比如说 void 0。

当对这两种类型使用 typeof 进行判断时,Null 类型化会返回“object”,这是一个历史遗留的问题。当使用双等号对两种类型的 值进行比较时会返回 true,使用三个等号时会返回 false。

4. intanceof 操作符的实现原理及实现

instanceof 运算符用于判断构造函数的 prototype 属性是否出现 在对象的原型链中的任何位置。

5. 如何获取安全的 undefined 值?

因为 undefined 是一个标识符,所以可以被当作变量来使用和赋值,但是这样会影响 undefined 的正常判断。表达式 void ___ 没有返 回值,因此返回结果是 undefined。void 并不改变表达式的结果,只是让表达式不返回值。因此可以用 void 0 来获得 undefined。

6. Object.is() 与比较操作符 “===”、“==” 的区别?

使用双等号(==)进行相等判断时,如果两边的类型不一致,则会进 行强制类型转化后再进行比较。

使用三等号(===)进行相等判断时,如果两边的类型不一致时,不 会做强制类型准换,直接返回 false。

使用 Object.is 来进行相等判断时,一般情况下和三等号的判断相 同,它处理了一些特殊的情况,比如 -0 和 +0 不再相等,两个 NaN 是相等的。

7. 什么是 JavaScript 中的包装类型?

在 JavaScript 中,基本类型是没有属性和方法的,但是为了便于操 作基本类型的值,在调用基本类型的属性或方法时 JavaScript 会在 后台隐式地将基本类型的值转换为对象,如:

在 访 问 'abc'.length 时 , JavaScript 将 'abc' 在 后 台 转 换 成 String('abc'),然后再访问其 length 属性。

JavaScript 也可以使用 Object 函数显式地将基本类型转换为包装类 型:

也可以使用 valueOf 方法将包装类型倒转成基本类型:

看看如下代码会打印出什么:

答案是什么都不会打印,因为虽然包裹的基本类型是 false,但是 false 被包裹成包装类型后就成了对象,所以其非值为 false,所以 循环体中的内容不会运行。

8. 为什么会有 BigInt 的提案?

JavaScript 中 Number.MAX_SAFE_INTEGER 表示最⼤安全数字,计算 结果是 9007199254740991,即在这个数范围内不会出现精度丢失(⼩数除外)。但是⼀旦超过这个范围,js 就会出现计算不准确的情况,这在⼤数计算的时候不得不依靠⼀些第三⽅库进⾏解决,因此官⽅提 出了 BigInt 来解决此问题。

9. 如何判断一个对象是空对象

使用 JSON 自带的.stringify 方法来判断:

使用 ES6 新增的方法 Object.keys()来判断:

10. const 对象的属性可以修改吗

const 保证的并不是变量的值不能改动,而是变量指向的那个内存地 址不能改动。对于基本类型的数据(数值、字符串、布尔值),其值 就保存在变量指向的那个内存地址,因此等同于常量。

但对于引用类型的数据(主要是对象和数组)来说,变量指向数据的 内存地址,保存的只是一个指针,const 只能保证这个指针是固定不 变的,至于它指向的数据结构是不是可变的,就完全不能控制了。

11. 如果 new 一个箭头函数的会怎么样

箭头函数是 ES6 中的提出来的,它没有 prototype,也没有自己的 this 指向,更不可以使用 arguments 参数,所以不能 New 一个箭头函数。

new 操作符的实现步骤如下:

1.创建一个对象

2.将构造函数的作用域赋给新对象(也就是将对象的__proto__属性 指向构造函数的 prototype 属性)

3.指向构造函数中的代码,构造函数中的 this 指向该对象(也就是 为这个对象添加属性和方法)

4.返回新的对象

所以,上面的第二、三步,箭头函数都是没有办法执行的。

12. 箭头函数的 this 指向哪

箭头函数不同于传统 JavaScript 中的函数,箭头函数并没有属于⾃⼰的 this,它所谓的 this 是捕获其所在上下⽂的 this 值,作为⾃⼰的 this 值,并且由于没有属于⾃⼰的 this,所以是不会被 new 调⽤的,这个所谓的 this 也不会被改变。

可以⽤Babel 理解⼀下箭头函数:

转化后:

13. 扩展运算符的作用及使用场景

(1)对象扩展运算符

对象的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷 贝到当前对象之中。

上述方法实际上等价于:

Object.assign 方法用于对象的合并,将源对象(source)的所有可 枚举属性,复制到目标对象(target)。Object.assign 方法的第一 个参数是目标对象,后面的参数都是源对象。(如果目标对象与源对 象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面 的属性)。

同样,如果用户自定义的属性,放在扩展运算符后面,则扩展运算符 内部的同名属性会被覆盖掉。

利用上述特性就可以很方便的修改对象的部分属性。在 redux 中的 reducer 函数规定必须是一个纯函数,reducer 中的 state 对象要求 不能直接修改,可以通过扩展运算符把修改路径的对象都复制一遍,然后产生一个新的对象返回。

需要注意:扩展运算符对对象实例的拷贝属于浅拷贝。

(2)数组扩展运算符

数组的扩展运算符可以将一个数组转为用逗号分隔的参数序列,且每 次只能展开一层数组。

下面是数组的扩展运算符的应用:

将数组转换为参数序列

复制数组

要记住:扩展运算符(…)用于取出参数对象中的所有可遍历属性,拷 贝到当前对象之中,这里参数对象是个数组,数组里面的所有对象都 是基础数据类型,将所有基础数据类型重新拷贝到新的数组中。

合并数组

如果想在数组内合并数组,可以这样:

扩展运算符与解构赋值结合起来,用于生成数组

需要注意:如果将扩展运算符用于数组赋值,只能放在参数的最后一 位,否则会报错。

将字符串转为真正的数组

任何 Iterator 接口的对象,都可以用扩展运算符转为真正的数组

比较常见的应用是可以将某些数据结构转为数组:

用于替换 es5 中的 Array.prototype.slice.call(arguments)写法。使用 Math 函数获取数组中特定的值

14. Proxy 可以实现什么功能?

在 Vue3.0 中通过 Proxy 来替换原本的 Object.defineProperty 来实现数据响应式。

Proxy 是 ES6 中新增的功能,它可以用来自定义对象中的操作。

代表需要添加代理的对象,handler 用来自定义对象中的操作,比如 可以用来自定义 set 或者 get 函数。

下面来通过 Proxy 来实现一个数据响应式:

在上述代码中,通过自定义 set 和 get 函数的方式,在原本的逻辑 中插入了我们的函数逻辑,实现了在对对象任何属性进行读写时发出 通知。

当然这是简单版的响应式实现,如果需要实现一个 Vue 中的响应式,需要在 get 中收集依赖,在 set 派发更新,之所以 Vue3.0 要使用 Proxy 替换原本的 API 原因在于 Proxy 无需一层层递归为每个属 性添加代理,一次即可完成以上操作,性能上更好,并且原本的实现 有一些数据更新不能监听到,但是 Proxy 可以完美监听到任何方式 的数据改变,唯一缺陷就是浏览器的兼容性不好。

15. 常用的正则表达式有哪些?

16. 对 JSON 的理解

JSON 是一种基于文本的轻量级的数据交换格式。它可以被任何的编 程语言读取和作为数据格式来传递。

在项目开发中,使用 JSON 作为前后端数据交换的方式。在前端通过 将一个符合 JSON 格式的数据结构序列化为

JSON 字符串,然后将它传递到后端,后端通过 JSON 格式的字符串 解析后生成对应的数据结构,以此来实现前后端数据的一个传递。

因为 JSON 的语法是基于 js 的,因此很容易将 JSON 和 js 中的对 象弄混,但是应该注意的是 JSON 和 js 中的对象不是一回事,JSON 中对象格式更加严格,比如说在 JSON 中属性值不能为函数,不能出 现 NaN 这样的属性值等,因此大多数的 js 对象是不符合 JSON 对 象的格式的。

在 js 中提供了两个函数来实现 js 数据结构和 JSON 格式的转换 处理,

JSON.stringify 函数,通过传入一个符合 JSON 格式的数据结构,将其转换为一个 JSON 字符串。如果传入的数据结构不符合 JSON 格 式,那么在序列化的时候会对这些值进行对应的特殊处理,使其符合 规范。在前端向后端发送数据时,可以调用这个函数将数据对象转化 为 JSON 格式的字符串。

JSON.parse() 函数,这个函数用来将 JSON 格式的字符串转换为一 个 js 数据结构,如果传入的字符串不是标准的 JSON 格式的字符串 的话,将会抛出错误。当从后端接收到 JSON 格式的字符串时,可以 通过这个方法来将其解析为一个 js 数据结构,以此来进行数据的访 问。

17. JavaScript 脚本延迟加载的方式有哪些?

延迟加载就是等页面加载完成之后再加载 JavaScript 文件。 js 延 迟加载有助于提高页面加载速度。

一般有以下几种方式:

defer 属性:给 js 脚本添加 defer 属性,这个属性会让脚本的加 载与文档的解析同步解析,然后在文档解析完成后再执行这个脚本文 件,这样的话就能使页面的渲染不被阻塞。多个设置了 defer 属性

的脚本按规范来说最后是顺序执行的,但是在一些浏览器中可能不是 这样。

async 属性:给 js 脚本添加 async 属性,这个属性会使脚本异步 加载,不会阻塞页面的解析过程,但是当脚本加载完成后立即执行 js 脚本,这个时候如果文档没有解析完成的话同样会阻塞。多个 async 属性的脚本的执行顺序是不可预测的,一般不会按照代码的顺序依次 执行。

动态创建 DOM 方式:动态创建 DOM 标签的方式,可以对文档的加载 事件进行监听,当文档加载完成后再动态的创建 script 标签来引入 js 脚本。

使用 setTimeout 延迟方法:设置一个定时器来延迟加载 js 脚本文 件

让 JS 最后加载:将 js 脚本放在文档的底部,来使 js 脚本尽可能 的在最后来加载执行。

18. 什么是 DOM 和 BOM?

DOM 指的是文档对象模型,它指的是把文档当做一个对象,这个对象 主要定义了处理网页内容的方法和接口。

BOM 指的是浏览器对象模型,它指的是把浏览器当做一个对象来对待,这个对象主要定义了与浏览器进行交互的法和接口。BOM 的核心是 window,而 window 对象具有双重角色,它既是通过 js 访问浏览器 窗口的一个接口,又是一个 Global(全局)对象。这意味着在网页 中定义的任何对象,变量和函数,都作为全局对象的一个属性或者方 法存在。window 对象含有 location 对象、navigator 对象、screen

对象等子对象,并且 DOM 的最根本的对象 document 对象也是 BOM 的 window 对象的子对象。

19. escape、encodeURI、encodeURIComponent 的区别

encodeURI 是对整个 URI 进行转义,将 URI 中的非法字符转换为合 法字符,所以对于一些在 URI 中有特殊意义的字符不会进行转义。

encodeURIComponent 是对 URI 的组成部分进行转义,所以一些特殊 字符也会得到转义。

escape 和 encodeURI 的作用相同,不过它们对于 unicode 编码为 0xff 之外字符的时候会有区别,escape 是直接在字符的 unicode 编码前加上 %u,而 encodeURI 首先会将字符转换为 UTF-8 的格式,再在每个字节前加上 %。

20. 对 AJAX 的理解,实现一个 AJAX 请求

AJAX 是 Asynchronous JavaScript and XML 的缩写,指的是通过 JavaScript 的 异步通信,从服务器获取 XML 文档从中提取数据,再更新当前网页的对应部分,而不用刷新整个网页。

创建 AJAX 请求的步骤:

创建一个 XMLHttpRequest 对象。

在这个对象上使用 open 方法创建一个 HTTP 请求,open 方法所需 要的参数是请求的方法、请求的地址、是否异步和用户的认证信息。

在发起请求前,可以为这个对象添加一些信息和监听函数。比如说可 以通过 setRequestHeader 方法来为请求添加头信息。还可以为这个 对象添加一个状态监听函数。一个 XMLHttpRequest 对象一共有 5 个状态,当它的状态变化时会触发 onreadystatechange 事件,可以

通过设置监听函数,来处理请求成功后的结果。当对象的 readyState 变为 4 的时候,代表服务器返回的数据接收完成,这个时候可以通 过判断请求的状态,如果状态是 2xx 或者 304 的话则代表返回正常。

这个时候就可以通过 response 中的数据来对页面进行更新了。

当对象的属性和监听函数设置完成后,最后调用 sent 方法来向服务 器发起请求,可以传入参数作为发送的数据体。

使用 Promise 封装 AJAX:

21. 什么是尾调用,使用尾调用有什么好处?

尾调用指的是函数的最后一步调用另一个函数。代码执行是基于执行 栈的,所以当在一个函数里调用另一个函数时,会保留当前的执行上 下文,然后再新建另外一个执行上下文加入栈中。使用尾调用的话,因为已经是函数的最后一步,所以这时可以不必再保留当前的执行上 下文,从而节省了内存,这就是尾调用优化。但是 ES6 的尾调用优 化只在严格模式下开启,正常模式是无效的。

22. ES6 模块与 CommonJS 模块有什么异同?

ES6 Module 和 CommonJS 模块的区别:

CommonJS 是对模块的浅拷⻉,ES6 Module 是对模块的引⽤,即 ES6 Module 只存只读,不能改变其值,也就是指针指向不能变,类似 const;

import 的接⼝是 read-only(只读状态),不能修改其变量值。 即 不能修改其变量的指针指向,但可以改变变量内部指针指向,可以对 commonJS 对重新赋值(改变指针指向),但是对 ES6 Module 赋值会 编译报错。

ES6 Module 和 CommonJS 模块的共同点:

CommonJS 和 ES6 Module 都可以对引⼊的对象进⾏赋值,即对对象内 部属性的值进⾏改变。

23. for...in 和 for...of 的区别

for…of 是 ES6 新增的遍历方式,允许遍历一个含有 iterator 接口 的数据结构(数组、对象等)并且返回各项的值,和 ES3 中的 for…in 的区别如下

for…of 遍历获取的是对象的键值,for…in 获取的是对象的键名;

for… in 会遍历对象的整个原型链,性能非常差不推荐使用,而 for … of 只遍历当前对象不会遍历原型链;

对于数组的遍历,for…in 会返回数组中所有可枚举的属性(包括原 型链上可枚举的属性),for…of 只返回数组的下标对应的属性值;

总结:for...in 循环主要是为了遍历对象而生,不适用于遍历数组;for...of 循环可以用来遍历数组、类数组对象,字符串、Set、Map 以 及 Generator 对象。

24. ajax、axios、fetch 的区别

(1)AJAX

Ajax 即“AsynchronousJavascriptAndXML”(异步 JavaScript 和 XML),是指一种创建交互式应用的网页开发技术。它是一种在 无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在 后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行 更新。传统的网页(不使用 Ajax)如果需要更新内容,必须重载整 个网页页面。其缺点如下:

本身是针对 MVC 编程,不符合前端 MVVM 的浪潮

基于原生 XHR 开发,XHR 本身的架构不清晰

不符合关注分离(Separation of Concerns)的原则

配置和调用方式非常混乱,而且基于事件的异步模型不友好。

(2)Fetch

fetch 号称是 AJAX 的替代品,是在 ES6 出现的,使用了 ES6 中的 promise 对象。Fetch 是基于 promise 设计的。Fetch 的代码结构比

起 ajax 简单多。fetch 不是 ajax 的进一步封装,而是原生 js,没有 使用 XMLHttpRequest 对象。

fetch 的优点:

语法简洁,更加语义化

基于标准 Promise 实现,支持 async/await

更加底层,提供的 API 丰富(request, response)

脱离了 XHR,是 ES 规范里新的实现方式

fetch 的缺点:

fetch 只对网络请求报错,对 400,500 都当做成功的请求,服务器 返回 400,500 错误码时并不会 reject,只有网络错误这些导致请 求不能完成时,fetch 才会被 reject。

fetch 默 认 不 会 带 cookie , 需 要 添 加 配 置 项 :fetch(url, {credentials: 'include'})

fetch 不 支 持 abort , 不 支 持 超 时 控 制 , 使 用 setTimeout 及 Promise.reject 的实现的超时控制并不能阻止请求过程继续在后台 运行,造成了流量的浪费

fetch 没有办法原生监测请求的进度,而 XHR 可以

(3)Axios

Axios 是一种基于 Promise 封装的 HTTP 客户端,其特点如下:浏览器端发起 XMLHttpRequests 请求

node 端发起 http 请求

支持 Promise API

监听请求和返回

对请求和返回进行转化

取消请求

自动转换 json 数据

客户端支持抵御 XSRF 攻击

25. 对原型、原型链的理解

在 JavaScript 中是使用构造函数来新建一个对象的,每一个构造函 数的内部都有一个 prototype 属性,它的属性值是一个对象,这个 对象包含了可以由该构造函数的所有实例共享的属性和方法。当使用 构造函数新建一个对象后,在这个对象的内部将包含一个指针,这个 指针指向构造函数的 prototype 属性对应的值,在 ES5 中这个指针 被称为对象的原型。一般来说不应该能够获取到这个值的,但是现在 浏览器中都实现了 __proto__ 属性来访问这个属性,但是最好不要 使用这个属性,因为它不是规范中规定的。ES5 中新增了一个 Object.getPrototypeOf() 方法,可以通过这个方法来获取对象的原 型。

当访问一个对象的属性时,如果这个对象内部不存在这个属性,那么 它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原 型,于是就这样一直找下去,也就是原型链的概念。原型链的尽头一 般来说都是 Object.prototype 所以这就是新建的对象为什么能够 使用 toString() 等方法的原因。

特点:JavaScript 对象是通过引用来传递的,创建的每个新对象实 体中并没有一份属于自己的原型副本。当修改原型时,与之相关的对 象也会继承这一改变。

26. 原型链的终点是什么?如何打印出原型链的终点?

由于 Object 是构造函数,原型链终点 Object.prototype.__proto__,而 Object.prototype.__proto__=== null // true,所以,原型链 的终点是 null。原型链上的所有原型都是对象,所有的对象最终都 是由 Object 构造的,而 Object.prototype 的下一级是

Object.prototype.__proto__。

27. 对作用域、作用域链的理解

1)全局作用域和函数作用域

(1)全局作用域

最外层函数和最外层函数外面定义的变量拥有全局作用域

所有未定义直接赋值的变量自动声明为全局作用域

所有 window 对象的属性拥有全局作用域

全局作用域有很大的弊端,过多的全局作用域变量会污染全局命名空 间,容易引起命名冲突。

(2)函数作用域

函数作用域声明在函数内部的变零,一般只有固定的代码片段可以访 问到

作用域是分层的,内层作用域可以访问外层作用域,反之不行 2)块级作用域

使用 ES6 中新增的 let 和 const 指令可以声明块级作用域,块级作用 域可以在函数中创建也可以在一个代码块中的创建(由{ }包裹的代 码片段)

let 和 const 声明的变量不会有变量提升,也不可以重复声明

在循环中比较适合绑定块级作用域,这样就可以把声明的计数器变量 限制在循环内部。

作用域链:

在当前作用域中查找所需变量,但是该作用域没有这个变量,那这个 变量就是自由变量。如果在自己作用域找不到该变量就去父级作用域 查找,依次向上级作用域查找,直到访问到 window 对象就被终止,这一层层的关系就是作用域链。

作用域链的作用是保证对执行环境有权访问的所有变量和函数的有 序访问,通过作用域链,可以访问到外层环境的变量和函数。

作用域链的本质上是一个指向变量对象的指针列表。变量对象是一个 包含了执行环境中所有变量和函数的对象。作用域链的前端始终都是 当前执行上下文的变量对象。全局执行上下文的变量对象(也就是全 局对象)始终是作用域链的最后一个对象。

当查找一个变量时,如果当前执行环境中没有找到,可以沿着作用域 链向后查找。

28. 对 this 对象的理解

this 是执行上下文中的一个属性,它指向最后一次调用这个方法的 对象。在实际开发中,this 的指向可以通过四种调用模式来判断。

第一种是函数调用模式,当一个函数不是一个对象的属性时,直接作 为函数来调用时,this 指向全局对象。

第二种是方法调用模式,如果一个函数作为一个对象的方法来调用时,this 指向这个对象。

第三种是构造器调用模式,如果一个函数用 new 调用时,函数执行 前会新创建一个对象,this 指向这个新创建的对象。

第四种是 apply 、 call 和 bind 调用模式,这三个方法都可以显 示的指定调用函数的 this 指向。其中 apply 方法接收两个参数:一个是 this 绑定的对象,一个是参数数组。call 方法接收的参数,第一个是 this 绑定的对象,后面的其余参数是传入函数执行的参数。

也就是说,在使用 call() 方法时,传递给函数的参数必须逐个列举 出来。bind 方法通过传入一个对象,返回一个 this 绑定了传入对 象的新函数。这个函数的 this 指向除了使用 new 时会被改变,其 他情况下都不会改变。

这四种方式,使用构造器调用模式的优先级最高,然后是 apply、call 和 bind 调用模式,然后是方法调用模式,然后是函数调用模式。

29. call() 和 apply() 的区别?

它们的作用一模一样,区别仅在于传入参数的形式的不同。

apply 接受两个参数,第一个参数指定了函数体内 this 对象的指向,第二个参数为一个带下标的集合,这个集合可以为数组,也可以为类 数组,apply 方法把这个集合中的元素作为参数传递给被调用的函数。

call 传入的参数数量不固定,跟 apply 相同的是,第一个参数也是 代表函数体内的 this 指向,从第二个参数开始往后,每个参数被依 次传入函数。

30. 异步编程的实现方式?

JavaScript 中的异步机制可以分为以下几种:

回调函数 的方式,使用回调函数的方式有一个缺点是,多个回调函 数嵌套的时候会造成回调函数地狱,上下两层的回调函数间的代码耦 合度太高,不利于代码的可维护。

Promise 的方式,使用 Promise 的方式可以将嵌套的回调函数作为 链式调用。但是使用这种方法,有时会造成多个 then 的链式调用,可能会造成代码的语义不够明确。

generator 的方式,它可以在函数的执行过程中,将函数的执行权转 移出去,在函数外部还可以将执行权转移回来。当遇到异步函数执行 的时候,将函数执行权转移出去,当异步函数执行完毕时再将执行权 给转移回来。因此在 generator 内部对于异步操作的方式,可以以 同步的顺序来书写。使用这种方式需要考虑的问题是何时将函数的控 制权转移回来,因此需要有一个自动执行 generator 的机制,比如 说 co 模块等方式来实现 generator 的自动执行。

async 函数 的方式,async 函数是 generator 和 promise 实现的 一个自动执行的语法糖,它内部自带执行器,当函数内部执行到一个 await 语句的时候,如果语句返回一个 promise 对象,那么函数将 会等待 promise 对象的状态变为 resolve 后再继续向下执行。因此 可以将异步逻辑,转化为同步的顺序来书写,并且这个函数可以自动 执行。

31. 对 Promise 的理解

Promise 是异步编程的一种解决方案,它是一个对象,可以获取异步 操作的消息,他的出现大大改善了异步编程的困境,避免了地狱回调,它比传统的解决方案回调函数和事件更合理和更强大。

所谓 Promise,简单说就是一个容器,里面保存着某个未来才会结束 的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一 个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

(1)Promise 的实例有三个状态:

Pending(进行中)

Resolved(已完成)

Rejected(已拒绝)

当把一件事情交给 promise 时,它的状态就是 Pending,任务完成了 状态就变成了 Resolved、没有完成失败了就变成了 Rejected。

(2)Promise 的实例有两个过程:

pending -> fulfilled : Resolved(已完成)

pending -> rejected:Rejected(已拒绝)

注意:一旦从进行状态变成为其他状态就永远不能更改状态了。

Promise 的特点:

对象的状态不受外界影响。promise 对象代表一个异步操作,有三种 状态,pending(进行中)、fulfilled(已成功)、rejected(已失 败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他 操作都无法改变这个状态,这也是 promise 这个名字的由来——“承 诺”;

一旦状态改变就不会再变,任何时候都可以得到这个结果。promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled,从 pending 变为 rejected。这时就称为 resolved(已定型)。如果改 变已经发生了,你再对 promise 对象添加回调函数,也会立即得到这 个结果。这与事件(event)完全不同,事件的特点是:如果你错过 了它,再去监听是得不到结果的。

Promise 的缺点:

无法取消 Promise,一旦新建它就会立即执行,无法中途取消。

如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。

当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始 还是即将完成)。

总结:

Promise 对象是异步编程的一种解决方案,最早由社区提出。Promise 是一个构造函数,接收一个函数作为参数,返回一个 Promise 实例。一个 Promise 实例有三种状态,分别是 pending、resolved 和 rejected,分别代表了进行中、已成功和已失败。实例的状态只能由 pending 转变 resolved 或者 rejected 状态,并且状态一经改变,就凝固了,无法再被改变了。

状态的改变是通过 resolve() 和 reject() 函数来实现的,可以在 异步操作结束后调用这两个函数改变 Promise 实例的状态,它的原 型上定义了一个 then 方法,使用这个 then 方法可以为两个状态的 改变注册回调函数。这个回调函数属于微任务,会在本轮事件循环的 末尾执行。

注意:在构造 Promise 的时候,构造函数内部的代码是立即执行的

32. Promise 解决了什么问题

在工作中经常会碰到这样一个需求,比如我使用 ajax 发一个 A 请求 后,成功后拿到数据,需要把数据传给 B 请求;那么需要如下编写代 码:

上面的代码有如下缺点:

后一个请求需要依赖于前一个请求成功后,将数据往下传递,会导致 多个 ajax 请求嵌套的情况,代码不够直观。

如果前后两个请求不需要传递参数的情况下,那么后一个请求也需要 前一个请求成功后再执行下一步操作,这种情况下,那么也需要如上 编写代码,导致代码不够直观。

Promise 出现之后,代码变成这样:

这样代码看起了就简洁了很多,解决了地狱回调的问题。

33. 对 async/await 的理解

async/await 其实是 Generator 的语法糖,它能实现的效果都能用 then 链来实现,它是为优化 then 链而开发出来的。从字面上来看,async 是“异步”的简写,await 则为等待,所以很好理解 async 用 于申明一个 function 是异步的,而 await 用于等待一个异步方法 执行完成。当然语法上强制规定 await 只能出现在 asnyc 函数中,先 来看看 async 函数返回了什么:

所以,async 函数返回的是一个 Promise 对象。async 函数(包含 函数语句、函数表达式、Lambda 表达式)会返回一个 Promise 对象,如果在函数中 return 一个直接量,async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象。

async 函数返回的是一个 Promise 对象,所以在最外层不能用 await 获取其返回值的情况下,当然应该用原来的方式:then() 链 来处理这个 Promise 对象,就像这样:

那如果 async 函数没有返回值,又该如何?很容易想到,它会返回 Promise.resolve(undefined)。

联想一下 Promise 的特点——无等待,所以在没有 await 的情况下 执行 async 函数,它会立即执行,返回一个 Promise 对象,并且,绝不会阻塞后面的语句。这和普通返回 Promise 对象的函数并无二 致。

注意:Promise.resolve(x) 可以看作是 new Promise(resolve => resolve(x)) 的简写,可以用于快速封装字面量对象或其他对象,将 其封装成 Promise 实例。

34. async/await 的优势

单一的 Promise 链并不能发现 async/await 的优势,但是,如果需 要处理由多个 Promise 组成的 then 链的时候,优势就能体现出来 了(很有意思,Promise 通过 then 链来解决多层回调的问题,现在 又用 async/await 来进一步优化它)。

假设一个业务,分多个步骤完成,每个步骤都是异步的,而且依赖于 上一个步骤的结果。仍然用 setTimeout 来模拟异步操作:

现在用 Promise 方式来实现这三个步骤的处理:

输出结果 result 是 step3() 的参数 700 + 200 = 900。doIt() 顺 序执行了三个步骤,一共用了 300 + 500 + 700 = 1500 毫秒,和 console.time()/console.timeEnd() 计算的结果一致。

如果用 async/await 来实现呢,会是这样:

结果和之前的 Promise 实现是一样的,但是这个代码看起来是不是

清晰得多,几乎跟同步代码一样

35. async/await 对比 Promise 的优势

代码读起来更加同步,Promise 虽然摆脱了回调地狱,但是 then 的

链式调⽤也会带来额外的阅读负担

Promise 传递中间值⾮常麻烦,⽽async/await⼏乎是同步的写法,⾮常优雅

错误处理友好,async/await 可以⽤成熟的 try/catch,Promise 的 错误捕获⾮常冗余

调试友好,Promise 的调试很差,由于没有代码块,你不能在⼀个返 回表达式的箭头函数中设置断点,如果你在⼀个.then 代码块中使⽤调试器的步进(step-over)功能,调试器并不会进⼊后续的.then 代 码块,因为调试器只能跟踪同步代码的每⼀步。

36. 对象创建的方式有哪些?

一般使用字面量的形式直接创建对象,但是这种创建方式对于创建大

量相似对象的时候,会产生大量的重复代码。但 js 和一般的面向对

象的语言不同,在 ES6 之前它没有类的概念。但是可以使用函数来

进行模拟,从而产生出可复用的对象创建方式,常见的有以下几种:

(1)第一种是工厂模式,工厂模式的主要工作原理是用函数来封装 创建对象的细节,从而通过调用函数来达到复用的目的。但是它有一 个很大的问题就是创建出来的对象无法和某个类型联系起来,它只是 简单的封装了复用代码,而没有建立起对象和类型间的关系。

(2)第二种是构造函数模式。js 中每一个函数都可以作为构造函数,只要一个函数是通过 new 来调用的,那么就可以把它称为构造函数。执行构造函数首先会创建一个对象,然后将对象的原型指向构造函数 的 prototype 属性,然后将执行上下文中的 this 指向这个对象,最后再执行整个函数,如果返回值不是对象,则返回新建的对象。因 为 this 的值指向了新建的对象,因此可以使用 this 给对象赋值。构造函数模式相对于工厂模式的优点是,所创建的对象和构造函数建 立起了联系,因此可以通过原型来识别对象的类型。但是构造函数存 在一个缺点就是,造成了不必要的函数对象的创建,因为在 js 中函 数也是一个对象,因此如果对象属性中如果包含函数的话,那么每次 都会新建一个函数对象,浪费了不必要的内存空间,因为函数是所有 的实例都可以通用的。

(3)第三种模式是原型模式,因为每一个函数都有一个 prototype 属性,这个属性是一个对象,它包含了通过构造函数创建的所有实例 都能共享的属性和方法。因此可以使用原型对象来添加公用属性和方 法,从而实现代码的复用。这种方式相对于构造函数模式来说,解决 了函数对象的复用问题。但是这种模式也存在一些问题,一个是没有 办法通过传入参数来初始化值,另一个是如果存在一个引用类型如 Array 这样的值,那么所有的实例将共享一个对象,一个实例对引用 类型值的改变会影响所有的实例。

(4)第四种模式是组合使用构造函数模式和原型模式,这是创建自 定义类型的最常见方式。因为构造函数模式和原型模式分开使用都存 在一些问题,因此可以组合使用这两种模式,通过构造函数来初始化 对象的属性,通过原型对象来实现函数方法的复用。这种方法很好的 解决了两种模式单独使用时的缺点,但是有一点不足的就是,因为使 用了两种不同的模式,所以对于代码的封装性不够好。

(5)第五种模式是动态原型模式,这一种模式将原型方法赋值的创 建过程移动到了构造函数的内部,通过对属性是否存在的判断,可以 实现仅在第一次调用函数时对原型对象赋值一次的效果。这一种方式 很好地对上面的混合模式进行了封装。

(6)第六种模式是寄生构造函数模式,这一种模式和工厂模式的实 现基本相同,我对这个模式的理解是,它主要是基于一个已有的类型,在实例化时对实例化的对象进行扩展。这样既不用修改原来的构造函 数,也达到了扩展对象的目的。它的一个缺点和工厂模式一样,无法 实现对象的识别。

37. 对象继承的方式有哪些?

(1)第一种是以原型链的方式来实现继承,但是这种实现方式存在 的缺点是,在包含有引用类型的数据时,会被所有的实例对象所共享,容易造成修改的混乱。还有就是在创建子类型的时候不能向超类型传 递参数。

(2)第二种方式是使用借用构造函数的方式,这种方式是通过在子 类型的函数中调用超类型的构造函数来实现的,这一种方法解决了不 能向超类型传递参数的缺点,但是它存在的一个问题就是无法实现函 数方法的复用,并且超类型原型定义的方法子类型也没有办法访问到。

(3)第三种方式是组合继承,组合继承是将原型链和借用构造函数 组合起来使用的一种方式。通过借用构造函数的方式来实现类型的属 性的继承,通过将子类型的原型设置为超类型的实例来实现方法的继 承。这种方式解决了上面的两种模式单独使用时的问题,但是由于我 们是以超类型的实例来作为子类型的原型,所以调用了两次超类的构 造函数,造成了子类型的原型中多了很多不必要的属性。

(4)第四种方式是原型式继承,原型式继承的主要思路就是基于已 有的对象来创建新的对象,实现的原理是,向函数中传入一个对象,然后返回一个以这个对象为原型的对象。这种继承的思路主要不是为 了实现创造一种新的类型,只是对某个对象实现一种简单继承,ES5 中定义的 Object.create() 方法就是原型式继承的实现。缺点与原 型链方式相同。

(5)第五种方式是寄生式继承,寄生式继承的思路是创建一个用于 封装继承过程的函数,通过传入一个对象,然后复制一个对象的副本,然后对象进行扩展,最后返回这个对象。这个扩展的过程就可以理解 是一种继承。这种继承的优点就是对一个简单对象实现继承,如果这 个对象不是自定义类型时。缺点是没有办法实现函数的复用。

(6)第六种方式是寄生式组合继承,组合继承的缺点就是使用超类 型的实例做为子类型的原型,导致添加了不必要的原型属性。寄生式 组合继承的方式是使用超类型的原型的副本来作为子类型的原型,这 样就避免了创建不必要的属性。

38. 哪些情况会导致内存泄漏

以下四种情况会造成内存的泄漏:

意外的全局变量:由于使用未声明的变量,而意外的创建了一个全局 变量,而使这个变量一直留在内存中无法被回收。

被遗忘的计时器或回调函数:设置了 setInterval 定时器,而忘记 取消它,如果循环函数有对外部变量的引用的话,那么这个变量会被 一直留在内存中,而无法被回收。

脱离 DOM 的引用:获取一个 DOM 元素的引用,而后面这个元素被删 除,由于一直保留了对这个元素的引用,所以它也无法被回收。

闭包:不合理的使用闭包,从而导致某些变量一直被留在内存当中。

者:靛蓝工房 文章转自78DM

原标题:一起来做模型之“MG艾比安篇”,浅谈打磨作用与金属色/伪电镀应用,因标题字数限制有删减

又来到了一起来做模型的系列栏目了。本次我选用了万代MG1/100 “艾比安高达”作为素体对象进行制作。最主要就是这个堆积了很久想尽快清理了它。

本次的制作中,在基础修整部分,我将会把重点放在塑料零件的表面打磨基础理论,介绍打磨的作用、手法、常用工具介绍;

而在涂装上我打算做成金属+电镀色效果,因此我会重点介绍金属色的使用手法,金属色上覆盖透明色的操作要领

上一期的水性漆使用中没想到引起了各位的热烈讨论,而就像是命运开玩笑一般,在我发帖的三天后就在贴吧上出了个瓜,某位玩家因为过分相信水性漆而导致了患病。确实是有点讽刺。但也证明了涂料安全性的论点。

而金属漆的毒性可以说是在同系列的涂料中最强烈的。而出于保命以及不为各位玩家带坏头,本次的制作只使用我个人相信的日本漆进行制作。

说白了就是郡士GX系以及SM系金属色。但不管使用什么涂料,也请各位做好完善的个人防护再来制作模型

那么事不宜迟,我们现在就来开始制作艾比安吧。

本次制作中除了模型套件以外,主要将使用水口钳、笔刀、锉刀、鹰嘴刻线刀、砂纸、面相笔、GX系以及SM系金属色。同时还准备好GX系列透明色。

我这次要做的正是电镀风格涂装。这种涂装的作品对模型的表面处理要求非常高,任何瑕疵都会在光泽面下表露无遗。这是对作者基本功的一次考验。


第一部分:零件水口及分模线的打磨方法。

制作模型的第一步,依旧还是水口打磨。虽然关于水口打磨每一期都有说,都是老调重弹。但考虑到很多人没看前几期,而且打磨又是本次的重点之一,我还是简略说说吧。

我在这里选用了武装的一个圆形零件进行操作展示。

首先,我们先把零件裁剪下来。初步裁剪的时候需要注意水口应留有较多的距离,以保障零件的表面完整。

接着我们使用水口钳逐点逐点地剪除水口。注意采用逐步贴近零件多次修剪的方法,可以防止一下裁剪太多而导致的缺肉风险。

请勿太过相信网红们一刀流的制作方法。那种偷懒性质的做法会增加损坏零件的风险。如果你有足够留意万代或者寿屋的模型说明书前面的注意事项,就会发现日本的模型生产商也是建议你采用这种逐步剪切的方法的。

因为是圆弧型外表的零件,水口钳是无法完全剪除干净的。但也无妨,像图中这样裁剪到呈现切线贴近圆弧边缘就可以了。

接下来我们使用笔刀切除水口两端多余的凸角。同样注意不需要切除太多以防止缺肉。

最后,我会对叠砂纸但不折平,使用圆角按压在零件表面,以画圈的形式打磨水口位置。

考虑到这是涂装的模型作品。砂纸我是使用1000目的直接打磨便能满足制作需求。

砂纸打磨完成后,可以看到水口已经完全消失,零件表面是规则而平整的圆弧外形。

使用砂纸打磨弧形的零件表面的时候,可以像图中这种,对叠砂纸但不折平,然后以圆角按压在零件表面。砂纸的圆角具有充足弹性,当按压到零件上时会因挤压而形成适配弧面的角度。这样的打磨小技巧可以帮助各位快速而高效地打磨弧面,不用担心磨坏弧度

像这样的操作,仅使用水口钳、笔刀、砂纸,基本能满足全部的水口打磨。

但如果水口出现的位置是平面的话,我们还能结合锉刀来提高操作的便利性与效率性。

这是背包上的零件,刚好是直线边缘位置上存在水口的理想示范。

同样地,我先使用水口钳大概修剪了水口。因为是在平面上的水口。郡士水口钳锋利的单刃结构几乎仅需一刀就能把水口去除。

接着使用笔刀将残余的水口痕迹修剪去除。

然后我们使用锉刀按压在水口出现的平面上来回拖行两三遍,水口就已经完全消失不见。我手上的这把是郡士的细目型锉刀,刀身上呈现层纹的切割片结构,就像是剃须刀那样。操作时只需要注意用力方向,零件表面上的凸起瑕疵很容易就会被削除而且在零件表面上留下的痕迹很少,是打磨水口时非常好用的辅助型工具。我们在很多日本模型博主的视频里面都能发现他们在使用这款锉刀处理水口(例如宇宙战舰大和号的日本相关模型制作视频),强烈建议各位尝试。

最后仅需要使用砂纸打磨表面就完成了操作。因为已经是使用锉刀预打磨了一遍,所以砂纸打磨时候的操作压力很低,很容易就可以打磨平滑。由此可见,配合锉刀与砂纸来进行水口打磨,效率性非常高,也能节约砂纸的损耗。

换句话说,花几十块买一把锉刀,可以节省好几年里面几百块的砂纸钱

这是翅膀状零件,可以看到在零件中央有着一道贯穿水口的分模线,非常扎眼必须要完全去除。

去除的方法也是非常简便,只需要使用1000目砂纸来回打磨,耐心地重复操作就能去除干净。如果觉得仅用砂纸打磨的操作压力很大,当然也可以配合锉刀使用。

这是打磨前后的效果对比。可见这道分模线的存在是非常显眼的。打磨去除是制作中必要的操作,可不能马虎处理。

像这种水口伴随分模线的瑕疵,在塑料模型中比比皆是,像图中的红色装甲零件上便能再次发现。

我们采用相同的手法进行处理,就能得到平滑统一的零件表面。

面积较大的塑料零件很可能还会有波纹。就像图片红色零件反光面上出现的弧形层纹。这是塑料在注模时流动而带入的瑕疵,波纹较深的位置放任不管也有可能会透过漆面表露出来,因此同样需要处理干净。

这里只需要使用1000目砂纸直接对零件表面采用按压式打磨就能完全去除波纹瑕疵。

有时水口出现的位置还会出现模具开合而产生的高低断层面,一个零件上存在三种瑕疵也确实是让人头痛。

但不管是什么瑕疵,没有锉刀+砂纸处理不了的,这里同样通过打磨的手法完全去除。

如此不断重复,我们就能把塑料零件上的水口、分模线、波纹面完全去除干净了。


阶段总结:

水口处理确实是千古不变的恒定话题。要处理好水口其实能使用的工具或者方法无非也就那么两三种。

关于水口钳,当然是性能好的会省事很多。常见的,本人津津乐道的恐怕就是田宫的神手。但这个价格太贵且耐用性太差,其实性价比并不高。我个人会推荐用本文中的这一把郡士单刃钳。150左右的价格跟田宫金牌相近,还略微便宜少许。而使用性能上比田宫金牌要好,耐用性也要比田宫的产品更强更耐操。性价比确实是很不错的,因此是我的个人推荐。

而锉刀则应该选用层纹型的锉刀。这种多排刀片的结构跟我们用的剃须刀相似,使用方向正确,就会去除表面凸起的异物但不会伤到皮肤,在模型制作中也是同理。如果只是打磨水口就不需要使用颗粒型的锉刀了,这个更加偏向于整形改造,打磨的压力比层纹型的高。

至于砂纸嘛,就不做讨论了,选用合适目数的就好。对比田宫的砂纸,郡士的砂纸打磨的手感较为生涩,但耐用性更强。田宫的砂纸打磨顺滑性更好,但耐用性较差更换频率更密。所以各位就按照自己的喜好与经济状况选择吧。


第二部分:缩胶的产生与打磨处理方法

缩胶,是塑料在凝固硬化时体积收缩而产生的自然现象。通常在面积较大,或厚度较高的零件上会出现得尤为明显。

如果是消光涂装的模型,缩胶的位置往往不会十分明显,因为光线在漫反射下有一定的遮瑕作用。但如果是光泽面的作品,缩胶会因反光差异而被展露出来。在制作金属色涂装、伪电镀涂装这种光泽模型时,缩胶需要打磨干净才能尽善尽美。

这是上文中打磨过水口的零件,一眼看上去表面平整规则。

倘若你对表面进行打磨,就会发现表面上有两处圆点型的凹陷。这就是缩胶了。

面对这种轻微的缩胶,我们只需要使用1000目砂纸按压表面进行打磨就可以完全去除。

像这样,表面经过打磨后缩胶已经完全消失,且零件的边缘线尤为锐利,这都是对零件进行充分打磨而带来的好处。

以翅膀零件来举例,可以看到缩胶的位置更为明显。而且缩胶内陷的造型非常规则。翻过背后,我们就能发现缩胶的位置跟零件内部的固定框架、组合桩等完全匹配。

因为零件越厚,收缩越大,缩胶就越是明显。刚好内部框架、组合桩等位置厚度要比空缺位置大,因此缩胶就全都集中在这些位置上了。

这块零件的表面还有不少的细节刻线。在打磨缩胶的时候可能会把刻线也一起磨掉,因此在打磨去除缩胶前,我们需要先对刻线进行加深操作。

图中我使用的是郡士的鹰嘴刻线刀,选用了0.15mm宽度的刀头。这个尺寸与原零件的线宽完全一致,只需要简单地勾拉几次就能完成加深。

然后就是使用1000目砂纸对零件按压打磨。因为这个零件的面积较大,缩胶分布广,所以打磨操作需要很有耐心,多花时间才能完成。

经过数次打磨,缩胶位置已经完全去除干净了。

这是肩甲上的零件。经过表面打磨可以看到其实表面也是存在较为明显的缩胶情况。

阶段总结:

缩胶,是广泛存在于塑料零件上的瑕疵。尤其出现在组合桩等厚度较大的位置。而对模型零件的表面进行打磨,原本难以发现的缩胶就能轻易地发现,从而进行修正。

同时,经过打磨之后的零件表面会出现很多细小的打磨坑纹。如果我们使用1000目砂纸进行打磨,那么打磨后的坑纹也是会在1000目或以下。我们涂装前喷涂的1000目水补土可以完美地填补坑纹,并且形成卡扣结构,以物理形式令漆面更加牢固地附着在零件表面,不易掉漆或者磨花。

综上所述,总结全件打磨对制作模型所带来的好处:

1、 去除例如水口、分模线、飞边、落差、波纹等塑料瑕疵;

2、 去除缩胶等表面缺陷。

3、 物理层面上增强水补土对零件的附着力。

说到缩胶打磨,可能就会有朋友问:“为什么不用牙膏补土填平后再打磨”之类的问题。

确实,使用牙膏补土填平打磨也是很常见的方法。可是牙膏补土本身的收缩性也很强,打磨过程中掉落的可能性也有,用起来需要注意的事情也很多,用不好也会适得其反。

再考虑到我这里边幅有限,关于牙膏补土填补,或者AB补土填补空缺的操作,就让我日后再开一期详谈吧。

第三部分:线条的强化加深操作。

以小腿装甲为例。此零件左右两端均有一段由斜角状细节产生的90°夹角高低线。这种细节线位没有规则线槽,在涂装后难以进行渗线,因此我们需要进行加深刻画。

我使用郡士的0.15mm宽度的鹰嘴刻线刀,以夹角为辅助在高低线拉刻2~3次便能制作出一道规则的线槽。如此一来便不用担心涂装后无法渗线的问题了。

这是小腿接近膝盖的零件,在红色零件的一侧存在两道带有斜角的高低细节线。这里同样没有规则线槽,需要进行加深刻画。可是这里的夹角太浅,无法为刻线刀提供辅助,因此我们需要使用额外的辅助措施。

这里我是用了透明硬边胶带进行辅助。郡士的鹰嘴刻线刀指向性较强,只需要稍加辅助就能顺畅地完成刻线制作。

加深高低刻线之后,同样使用1000目的砂纸将零件的表面打磨感觉,去除刻线时产生的多余毛刺就能完成全部操作。

图中这是头部的零件,我同样使用0.15mm宽度的刀头对刻线进行加深操作。

0.15mm的刻线刀头宽度几乎能满足这款艾比安的全部操作。由始至终都不需要替换其他刀头。0.15mm确实是制作高达模型中常用的尺寸,建议各位常备。

如此一来,通过充分的零件打磨与加深刻线操作,我们便完成了这次MG艾比安的基础修整工作。

那么接下来我们就准备开始对模型进行涂装吧。

阶段总结:

关于刻线的处理,其实我在之前的“阿斯莫德·上篇”中以及“大白鹅篇”中描述得会更多更具体。所以喜欢的话可以回头去看看。

阿斯莫德·上篇:https://bbs.78dm.net/forum/post/819276.html

大白鹅篇:https://bbs.78dm.net/forum/post/754012.html

第四部分,郡士GX及SM系列金属色涂装展示。

考虑到这次的涂装是以红色+金色+黑色为主导配色风格,因此我特意准备了郡士GX202金属红、GX212金属桃红、SM207超级黄金色等涂料进行展示。而喷涂的设备为郡士PS289型0.3喷笔,这也是模型圈子里绝大部分人的选择。

圈子里的人常言说,涂装金属色最好使用黑色作为底漆进行涂装事实真的如传言那样吗?我来验证一番。

在开始涂装模型之前,我先准备了一些黑色以及白色的塑料勺子来模拟黑白两种底色。我们先一起来对比下不同的底色对金属色的影响吧。

这里先用郡士SM208超级铝合金色作为示范。这个颜色跟银色较为接近,以此作为银色系的代表。

在黑底下涂装时,显色的金属质感比白底的更为显著,同时色泽也更为洁白。由此看来使用银色系的涂料时,黑底确实具有更好的表现效果。

接着我们使用SM207超级金为示范,这也能作为金色系的标准代表了。

在黑底时涂装此金色涂料,金色的光感更好,且金属质感也更为明确。使用白底的话在金属质感上有轻微的削弱情况。因此黑底对金色系涂装有提高作用的结论也是成立的。

接着我们使用GX202金属红作为示范。这款金属红可以说是除金银二色以外的金属一般色的典型代表了。

在黑底涂装时,金属红出现了发灰发暗的情况,金属质感有轻微的提高但红色的饱和度却出现不足。而在白底时,涂层色调红润,饱和度更高颜色更为鲜艳,发色更为理想。看来金属红还是要使用白底为好

最后我使用GX212金属桃红色做示范。这个颜色比金属红要浅,是介乎于金属红与银之间的一种涂料。

图片上可以看出,使用黑底时桃红色缺饱和的情况更加明显,涂层漆面出现了更为明显的偏灰的情况。而在白底时,涂层显色情况与涂料瓶盖的示范色几乎一致。由此看来白底确实更适合金属桃红色的发色

关于金属色的底色选择总结:

其实嘛,金属色的底色是需要根据想要的效果来做选择的,不能以一概论来选择黑色

黑色的底色,更能激发金属色的金属质感,但却会对彩色金属色造成发灰发暗的情况。

白色的底色,更能还原彩色金属色的色彩,但对金属质感的表达提升不明显。

以银色为例,我们看待银色首先就是金属质感。因为银色自身没有彩色的色感,所以缺饱和的问题在银色上并不能反映出来,甚至可能还会觉得适当的缺饱和,越是好。因此在银色涂装上确实是使用黑色的底色是最好的选择

以金色为例,使用白色做底色与黑色做底色,在实际中表达的差异性其实并没有很显著。如果模型作品最终是放在光线良好的摄影棚中拍摄,相信没有人能看出白色底色与黑色底色的区别,这是大实话。但金色同样是更为追求金属质感的色种,因此我也是推荐各位使用黑色做底色

以金属红/蓝/绿为例。以黑色作为底色确实会更能激发金属质感,但缺饱和的问题将会很严重,令颜色偏黑、发灰,效果强差人意。用白色作底色时,金属红/蓝/绿(以下统称金属彩色系)的发色会更加鲜艳,饱和度更高,更能还原色彩本身应有效果。虽然金属质感表达并不如银色突出,但起码最基本的饱和度和色泽得到保障。因此,我建议在使用金属彩色系涂装时,采用白色作为底漆

由此可见,网络上的网红说:“黑色是金属色唯一正确的底色选择”的这个说法我是不认同的。我认为必须要根据实际环境以及作品的表达效果来选择合适的底色。所以网红的说法到底有多少是亲身经验?还是以讹传讹得出来的谣言?请各位根据我上文的内容来自行判断吧。

最后我再说一个小小的经验。

由上个世纪90年代就开始做模型涂装的铁骨玩家圈子里,有对金属色底漆的一个独特理解:“银色最好的底色是深灰色,光泽深德灰的那种。金色最好的底色是偏深的中性灰,不用太深像高达关节色那种就可以了。”

至于这个老一派的说法是真是假是不是符合各位的价值观,就还得请各位去对比探究一下了。反正我是挺认同的。

接下来我们开始进行透明色涂装。

我本次制作的艾比安,针对红色部分是打算采用伪电镀风格涂装。因此透明红是必须的。我选择了郡士新推出的GX121透明红涂料。而不同的金属色底色上使用透明红最终呈现的颜色差异是怎样的?现在也我们来一探究竟。

首先,我以SM208超级铝合金以及SM207超级金来作对比。这恰好也就是我们常见的银底与金底之间的差异了。

在SM208超级铝合金色为底漆(即银系底色)的时候,透明红覆盖红整体呈现出纯正的深红色外观,红色调较为深邃了。如果采用不锈钢色这种深沉的银色,电镀红会呈现更为醇厚的质感,非常适合深沉红色为主的科幻模型制作。

在SM207超近金色为底漆(即金系底色)的时候,透明红覆盖后呈现出一定的橙色调。这是黄金色穿透透明红后带入的效果。轻微偏橙的电镀红色让人感觉更为鲜艳,颜色层次更丰富且带有火热的感觉,个人觉得非常适合制作新安洲、沙扎比一类的机体。

然后,我再以GX202金属红与GX212金属桃红色来作对比。同样是覆盖涂装GX121透明红来展示效果。

使用GX202金属红作为底色制作的电镀红,呈色红润饱和度较高。金属红自身的红色色彩对透明红产生了一定的补正,色彩饱和度比金银底色的更高,个人觉得十分好看。

使用GX212金属桃红色作为底色的效果与使用银色时候的效果较为接近。

经对比,我个人觉得使用SM207超级金色以及GX202金属红做底色制作的两种伪电镀红是最好看的。一个色泽鲜艳,一个饱和度极高。事实上使用金色作为底色制作电镀红的手法亦是圈子里绝大部分人的选择。在这次制作中,我希望能做出与别不同的感觉,因此将使用GX202金属红作为底色。

关于透明色使用的阶段总结

透明色是一种特殊的色种,它与不透明的实色(以下简称做实色)的区别在于:透明色的色度会随厚度的增加而增加,且没有明确的饱和上限。

以一句文言文来比喻:“水清则浅,水绿则深,水墨则渊。”换句话说,透明色的厚度越大颜色越深。

因此,我们在涂装透明色的时候一定要把握好漆面厚度,不然就会出现有深浅色差。

模型的零件会存在C面、夹角、凹陷等高低落差不同的位置,倘若涂装手法不成熟,就很容易造型漆面厚度不一而导致的色差问题。当涂装厚度过大的时候,透明漆可能出现边缘积聚,而导致边缘颜色深,中心颜色浅的情况。

同时,如果透明色覆盖金属色时厚度过大,就有可能会出现溶解金属色(也就是返底现象),导致金属色局部质感下降,令电镀涂装出现局部的质感缺陷。

由此我们可以得出透明色的使用注意事项:

1、注意漆面的厚度控制,防止出现厚度色差;

2、注意厚度控制,防止出现溶解底层金属色。

所以说白了,透明色的涂装就是要注意厚度控制。而要控制漆面厚度最有效的措施就是采用薄喷多层的技术了。请各位合理使用薄喷多层,不要盲目使用湿喷、厚喷、自流平等措施。

第五部分:模型涂装制作。

考虑到GX202金属红在白色底漆时具有更高的发色效果。因此我使用了白色水补土来简化制作。这里我选用了郡士的水性1000目水补土。这个水性水补土颗粒细腻,涂装后能形成光滑平面,有助于提高漆面的平滑度。而且这款水性水补土的漆面韧性极强,可以减低剐蹭掉漆的风险。

随后,我使用GX202金属红对零件进行统一涂装。GX202金属红的覆盖力在白底下非常理想,仅一层涂装几乎就能完全显色。

然后我使用GX121透明红进行涂装。这里我使用了薄喷多层的操作要领进行制作,为的是控制透明漆的厚度。左边零件为未涂装GX121透明红的金属红状态,中间的零件为透明红涂装1层时的效果,右边零件为GX121涂装了两层后的效果。

GX121透明红在薄喷两层时能达到完全显色的效果。

在曲面零件上可以直观看出,涂装GX121透明红后,零件的质感、色泽已经得到了飞跃性提高。在灯光下的效果已经可以达到伪电镀的质感要求,且光洁度也非常理想。

套件中黑色的零件,我直接使用了GX02光泽黑进行涂装。虽然看上去黑色已经非常纯正了,但其实这还有这可以提高的空间。

对于提升黑色零件的涂装质感,我同样使用了GX121透明红进行覆盖涂装。

图中左侧的零件组为单纯使用GX02亮光黑色涂装的效果。而右面的零件组为GX02亮光黑上覆盖了GX121透明红的效果。

可以非常直观地看到,覆盖了GX121透明红以后,零件的饱和度得到了显著提高。

倘若在光线良好的环境下,通过反光我们可以发现,在GX02亮光黑的基础上覆盖GX121透明红的零件,其光感更好,表面更加光洁且反光质感带有明显的红调。

这个覆盖涂装的操作能更进一步提升作品层次,丰富色泽,是一个实用性很强的技巧。

作品中金色的部分我直接使用了SM207超级黄金色来进行涂装。个人认为黄金色、耀金色这些标准的金色搭配红色使用效果非常理想。

MG套件的分件分色几乎是完美的。但为了彰显个人风格,我个人增加了不少分色的地方。因为是伪电镀的涂装,漆面比较娇气。以防在分色环节出现问题,我还是建议各位选择可靠的遮盖带进行操作以防出现伤害漆面的情况。我在这里使用的是郡士的遮盖带,当然其实不同品牌的遮盖带效果都差不多,也可以用田宫或者鸭井的,大家按照自己的喜好来选择吧。

反正,千万不要用工业遮盖带就好了,容易损坏漆面。

在进行骨架涂装前,我会先用遮盖带包裹主要关节的可动轴,防止漆面增加厚度而导致关节过紧。

骨架与关节位置的零件,我使用郡士GX201金属铁黑色进行涂装。这个涂料的成色效果几乎能满足所有科幻模型对骨架的表达要求。

艾比安高达的大腿、上臂等位置是灰色的成型色,而我在这里主要使用了SM208超级铝合金来表达。为了能有更贴近于原设定风格,我在SM208中额外添加了5%的GX201铁黑色来令铝合金色带有一定的灰度。

多节鞭以及大剑等武装零件,我在涂装了SM208超级铝合金色的基础上,覆盖涂装了一层GX101透明黑,操作方法与红色零件的伪电镀涂装完全一致。GX101透明黑更像是一种烟熏的透明色,能增加底下金属色的暗度,但又不会影响金属光彩。像这样类似暗钢色的效果也是不错。

什么?你说看不见我对鞭子做无缝?说什么呢,无缝又不是本次的主题,这么麻烦的东西当然用爱无视啦。


如此一来,我们便完成了作品的基础涂装了。

第六部分:后期制作与细节优化

当完成了基础涂装以后,我们就需要对模型的细节位置进行优化处理。而面对难以遮盖的细节我们可以采用面相笔手涂的形式来实现。

我在这里准备了一把郡士的“丸笔2号”型面相笔来进行笔涂补色操作的展示,使用的涂料为SM207超级黄金色。

首先摇匀涂料,然后打开瓶盖后,以瓶盖内的小碗为容器,使用面相笔蘸取涂料。

在使用SM系列金属色手涂时,我会在不稀释的情况下直接蘸取手涂。SM系列金属色的涂料流动状态良好,适合直接手涂使用。

然后直接以面相笔在需要补色的位置上轻画就能完成细节补色,非常简便。而且郡士的金属色系列就算手涂也能有很好的效果,减免了大量繁琐的遮盖分色工序。

这是我第一次使用郡士的面相笔,不得不说这款面相笔的手感极好,甚至超出我的预期。

全钢笔身的相当有分量感,笔身坚硬不易变形且外皮还有猛男粉的透明橡胶包裹。手感非常好也不容易打滑,拿在手上感觉棒极了。且笔头的收束性极好,也很容易清洗干净,值得推荐。

这样一把让我觉得手感极佳的面相笔,售价确实不算便宜。目前淘宝上也得要好几十块。而在相同的价格区间我们还能买到国产的,一包20~30支的廉价面相笔,可以实现用完即弃的土豪玩法。所以到底是选择买一把好的面相笔重复使用?还是选择以量取胜的便宜品?那就让各位玩家自行决定了。

倘若你选择了购买这把郡士的面相笔,我们在使用后必须要注意清洗与保养,不然就会产生损坏。清洗时可以使用蓝标稀释液泡洗蘸有涂料的笔头数秒,然后来回晃动让涂料充分溶解脱落。

随即在纸巾上擦拭干净就能完成清洗。

再次重申,不管面相笔性能再好,不注重清洗与保养,笔是用不持久的,因此我们必须要在每次使用后及时清洗。

套件的喷口细小,内部空间亦较小,使用面相笔手涂补色是合理的选择。

这里我使用GX202金属红,以面相笔手涂制作。在使用GX系列金属色手涂时,我会适当使用少量稀释液,在1/0.5的比例下蘸取手涂。


当完成了补色操作后,我们就能对零件进行渗线操作。这里我使用WC01黑色渗线液。具体使用方法是使用面相笔蘸取随即进行缝线的渗涂。在过往几期均有描述,这里便不再重复赘述了。

因为本次作品是伪电镀涂装。在涂装透明色时漆面已经非常非常光滑,所以渗线操作的压力很低,而且也非常容易擦干净。所以大家平常涂装时需要注意涂装漆面的平整度,方便后续的表面处理工序。

最后的表面处理,就是制作细节水贴了。这里准备了郡士蓝盖底胶型水贴软化剂。我以红色零件使用一般的市售水贴进行操作展示。

首先,我会使用蓝盖底胶型水贴软化剂瓶盖内部的刷头,点加少量软化剂在零件表面。

随即将已经泡发好的水贴转移到软化剂之上。

等待约30秒作用,让水贴充分软化后,以棉签吸收内部多余的软化剂。

等软化剂干透,便能完成水贴的制作了。使用了水贴软化剂后,水贴图案能更贴服地附着在零件表面,就算是起伏、转角的位置也不容易出现水贴翘起的情况。这里使用的软化剂为底胶型软化剂,也能促进水贴更加牢固地粘贴在零件表面,不会轻易掉落,是水贴操作中必不可少的耗材。

最后,我们需要对模型零件涂装透明保护漆。

因为是光泽面的模型,因此这次我选用的是郡士GX100光油。这款光油在模型制作圈子里被誉为是最好的硝基光油,没有之一。光泽度、平整度都可圈可点,得到玩家群体的广泛认可。

而近年来,圈子里面很多人开始流行使用氨基光油。据说氨基光油的效果更好而且漆面更坚固。但是处于身体安全的角度考虑,我还是老老实实地使用专用的模型漆吧。

GX100光油具有极好的填补能力,涂装后,水贴与零件表面的高度落差几乎被完全填补,看不出水贴的边缘厚度。同时GX100的光泽感非常强,原本已经光洁的为电镀红涂层在其加持下有着更强的反光效果,已经达到了镜面涂装的程度。

GX100极好的填补能力,也能对透明件打磨后的轻微磨痕有着良好的修补效果。正因GX100极好的填补能力,以及出众的光泽度,令它成为了圈子里玩家们的不二之选。

最后的最后,我们仅需将零件组合,便能完成本次模型的制作。

阿宅点评:大佬的教程是真的强,然后光黑之后上透明红,这个真的挺新奇,以后要试下

者按:日前,《连线》杂志发表了一篇文章,详细描述了Facebook早期发展的故事,内容摘录自《天才谷:未删减的硅谷历史》(Valley of Genius:The Uncensored History of Silicon Valley)一书,这本书的作者为亚当·费舍尔(Adam Fisher),里面描述了硅谷各家主要科技公司的创业史,其中有很多不为人知的故事。

每个看过《社交网络》(The Social Network)电影的人都知道Facebook成立的故事。那是2004年,哈佛大学的春季学期。然而,人们往往忘记的是,Facebook在剑桥市只有短短几个月的时间。当时它叫做TheFacebook.com,是一款专门针对大学生的Friendster复制品。Friendster是一个位于硅谷的开创性社交网络。

马克·扎克伯格(Mark Zuckerberg)的山寨网站在校园里很受欢迎,所以他和几个学校里的好友决定期末考试后搬到硅谷,在那里度过暑假,将Facebook推广到全国的其他大学。硅谷是互联网行动的发源地。他们大概就是这么想的。

在当时的硅谷,人们普遍认为互联网淘金热已经基本结束。地盘被抢走了,边界已经确定了。互联网赢了。见鬼,三年前,繁荣就已经破灭了。然而,没有人会费心把备忘录寄给马克·扎克伯格——因为在那个时候,扎克只是个无名小卒:一个雄心勃勃的十几岁大学生,痴迷于电脑地下组织。他对电脑了如指掌,但除此之外,他相当无知——当他还在哈佛的时候,总得有人向他解释,Napster这样的互联网网站实际上是企业建立的。

但是扎克伯格可以黑进去,在那个决定命运的夏天,他遇到了硅谷的几个关键人物,他们最终将彻底改变这家公司的方向。对于2004年和2005年这两个关键月份的口述史,我采访了所有的关键人物,并与其他一些有洞察力的人物交谈。正如你将看到的,出现的是一幅关于企业原始文化的画像,它将继续影响着现在的Facebook。整个企业一开始就像一种玩笑,它不是一家企业,而是一个夏日“啤酒乒乓”和代码冲刺的借口。事实上,扎克伯格的第一张名片上写着:“我是CEO……贱人。”

2006年3月,扎克伯格在位于帕洛阿尔托的 Facebook 总部拍摄。 他的第一张名片上写着“我是 CEO... 贱人。”图片来源:ELENA DORFMAN/REDUX

一、

肖恩·帕克(Sean Parker)( Napster的创始人之一,Facebook的首任总裁) :互联网时代以 Napster 结束,然后是互联网泡沫破裂,这导致了社交媒体时代的到来。

史蒂文·约翰逊(Steven Johnson )(著名作家和文化评论员) :当时,网络基本上是一种文学隐喻:“页面”——然后是页面之间的超文本链接。没有用户的概念;这根本不是隐喻的一部分。

马克·平卡斯(Mark Pincus)(基础社交媒体专利的共同所有者):我把Napster看作为社交网络的开端——专注人,而不是页面。对我来说,这是一个突破性的时刻,因为我看到互联网可以是一个完全分布式的对等网络。我们可以绕开那些大的媒体公司,并且彼此联系。

史蒂文·约翰逊:对我来说,这真的是从21世纪初写博客开始的。你开始把这些网站聚焦在一个人的观点上。它突然变得可以想象,哦,也许这里还有另外一个元素,网络也可以组织起来?就像我信任这五个人一样,我想了解他们的建议。早期的博客就是这样的。

埃文·威廉姆斯(Ev Williams)( Blogger、Twitter和Medium的创始人):当时博客链接很重,主要是关于互联网的。“我们在网上写关于互联网的文章,然后链接到更多的互联网,这不是很有趣吗?”

史蒂文·约翰逊:你会把一大堆不同的声音汇聚起来,这些声音基本上都可以向你推荐链接,所以会有一个个人的过滤器。

马克·平卡斯:2002年,雷德·霍夫曼(Reid Hoffman)和我开始了头脑风暴:如果互联网能像一场伟大的鸡尾酒会,会是什么样的呢?你可以带着一些惊人的体验离开,对吧?好的体验是什么?好的体验是工作、面试、约会的机会,以及公寓、房子、沙发等。

所以雷德和我开始说,“哇,这个人际网络实际上可以产生比谷歌更有价值的东西,因为你在这个接受高度审查的社区里,彼此之间有一些相似之处,每个人都有自己出现在这里的理由,所以你会得到信任。”信噪比可能很高。我们称之为Web 2.0,但没人想听,因为这是在消费互联网的冬天。

肖恩·帕克:所以在2000年到2004年间,在Facebook出现之前,有一种感觉就像是互联网上的一切都已经完成了。绝对的底部大概出现在2002年左右。PayPal在2002年上市,这是当年唯一一家进行IPO的消费互联网公司。所以,有一个奇怪的过渡时期,总共只有六家公司得到了资金,或者类似的资助。Plaxo就是其中之一。Plaxo是一个原始的社交网络。这是一种介于两者之间的东西:一种有腿的怪鱼。

亚伦·斯蒂格(Aaron Sittig)(发明 Facebook中“Like”的平面设计师) : Plaxo 是缺失的一环。 Plaxo是第一家真正成功的病毒式增长公司。 这时,我们才开始真正理解病毒式增长。

肖恩·帕克:我做过的最重要的事情是在 Plaxo 开发优化病毒性的算法。

亚伦·斯蒂格: 病毒式增长是指使用产品的人将产品传播给其他人的时候——就是这样。 人们不是因为喜欢而决定传播产品。而是人们在使用产品做他们想做的事情的自然过程中,自然而然地将产品传播给其他人。

肖恩·帕克:从最早的类社交网络(可能是Napster )到Plaxo (它有点像一个社交网络,但具有许多社交网络的特征),再到LinkedIn、MySpace和Friendster,再到Facebook这个现代化的社交网络,发生了很大的演变。

埃兹拉·卡拉汉(Ezra Callahan)( Facebook第一批员工之一):在21世纪初,Friendster获得了所有早期用户,拥有一个非常密集的网络,有很多活动,然后就达到了这个临界点。

亚伦·斯蒂格:当时正在进行一场非常大的竞赛,Friendster真的起飞了,看起来Friendster真的发明了一种叫做“社交网络”的新东西,他们是赢家,明显的赢家。现在还不完全清楚到底发生了什么,但是这个网站的发展开始变得越来越慢,在某个时候它就处于停滞状态了。

埃兹拉·卡拉汉:这为 MySpace 打开了大门。

埃文·威廉姆斯:MySpace 在当时可是个“大人物”。

肖恩·帕克:那是一个复杂的时期。MySpace很快就从Friendster手中接管了世界。他们抓住了接力棒。所以Friendster在衰落,MySpace在上升。

斯科特·马莱特(Scott Marlette)(在Facebook上增加照片标签的程序员) : MySpace非常受欢迎,但后来MySpace在扩展上也遇到了问题。

亚伦·斯蒂格:然后,Facebook在2004年2月推出,几乎无人问津,也没有引发太多谈论。

达斯汀·莫斯科维茨(Dustin Moskovitz)(扎克伯格的左膀右臂):当时有一个非常普遍的问题,现在看来很微不足道。根本不可能想到一个人的名字,去查他们的照片。哈佛大学的所有宿舍都有一本名为face books的个人目录——有些是印刷的,有些是在线的,大部分只提供给那个特定宿舍的学生。所以我们决定在网上创建一个统一的版本,我们称之为“Facebook”,以区别于那个版本。

扎克伯格与他的哈佛室友、达斯廷·莫斯科维茨、中心共同创建了 Facebook。 2004年,肖恩·帕克以总裁身份加入了公司。 这个三人组照片于2005年5月在公司的帕洛阿尔托办公室拍摄。图片来源:JIM WILSON/NEW YORK TIMES/REDUX

马克·扎克伯格(Mark Zuckerberg)(Facebook 的创始人和现任首席执行官) : 几周之内,就有几千人注册了。 我们开始收到其他大学的人发来的电子邮件,要求我们在他们的学校发布。

埃兹拉·卡拉汉:Facebook最初是在常春藤联盟推出的,并不是因为他们是傲慢自大的孩子,只想把东西交给常青藤联盟。而是因为他们有这种直觉,上常春藤盟校的人更有可能和其他常春藤盟校的学生成为朋友。

亚伦·斯蒂格: Facebook在伯克利推出时,把社交规则完全改变了。当我在伯克利的时候,你会发现,聚会就是你花了整整一周的时间和人们交谈,想知道什么是有趣的,然后你必须不断地与他们保持联系。有了 Facebook,知道周末发生了什么是微不足道的。一切都是为你准备的。

Facebook早在2004年3月就来到了硅谷中心的斯坦福大学校园。

二、

肖恩·帕克: 我在波托拉瓦利的室友都要去斯坦福。

埃兹拉·卡拉汉:我2003年我从斯坦福大学毕业,当时我和我的四个大学朋友在校园附近租了一所房子,我们有一间额外的卧室,所以我们在斯坦福大学的几份电子邮件列表上做了广告,找一个室友和我们一起搬进那所房子。我们得到了一个叫肖恩·帕克的人的回复。他最终非常随意地和我们住在一起,我们发现,虽然Napster成了一种文化现象,但并没有给他带来任何收入。

肖恩·帕克:我的一个室友的女朋友在使用一种产品,我就想,“你知道,它看起来很像Friendster或者MySpace。”她说,“哦,是的,但大学里没有人使用MySpace。”MySpace有点粗糙。

马克·扎克伯格:MySpace有将近三分之一的员工都在监控上传的色情图片。我们几乎没有在这方面花费过多少力气。原因是人们在Facebook上使用真名。

亚当·达安热洛(Adam D’Angelo)(扎克伯格高中时的黑客好友):真名真的很重要。

亚伦·斯蒂格:我们很早就明白了这一点,因为在Well上,社区原则已经确立了:你为你说的话负责。我们把它带得比Well还远。我们总是让一切都可以追溯到一个特定的真人。

斯图尔特·布兰德(Stewart Brand) (第一个重要的社交网站Well的创始人) :Well本来可以走这条路,但我们没有。这是我们犯的错误之一。

马克·扎克伯格:我认为,对于一个可能非常复杂的技术问题来说,这是一个非常简单的社会解决方案。

埃兹拉·卡拉汉:在早期,它是一个相当黑客化的简单网站:只是基本的网页表单,Facebook个人资料就是这样的。

鲁奇·桑哈维(Ruchi Sanghvi)(创建Facebook Newsfeed的程序员) :有一张小的个人资料照片,上面写着“这是我的个人资料”和“看看我的朋友”,下面有三四个链接和一到两个其他的框。

亚伦·斯蒂格:但我对他们产品的专注和清晰度印象深刻。一些小细节——比如当你去查看你的个人资料时,它非常清楚地说,“这就是你”,因为当时的社交网络非常非常难以理解。所以,这款产品有一种成熟性,在产品问世几年并得到改进之前,你通常不会看到这种成熟性。

肖恩·帕克:我看到了这个东西,我给Facebook上的一些电子邮件地址发了邮件,我基本上说,“我和Friendster合作了一段时间,我只是想见见你们,看看是否有什么可以谈的。”然后,我们在纽约开了个会——我不知道为什么会在纽约——刚开始的时候,马克和我只是讨论产品设计和我认为产品需要什么。

亚伦·斯蒂格:我接到肖恩·帕克的电话,他说:“嘿,我在纽约。我刚刚遇到了一个非常聪明的孩子马克·扎克伯格,他就是那个创建Facebook的家伙,他们说他们有一个“秘密功能”即将推出,将改变一切!但他不肯告诉我是什么。我快疯了。我不知道是什么。你知道这件事吗?你能想出来吗?你觉得会是什么?”所以我们花了一点时间谈论它,我们无法真正弄清楚他们将会改变一切的“秘密功能”到底是什么。我们有点沉迷于此。

在和肖恩·帕克见面两个月后,马克·扎克伯格搬到硅谷,打算把宿舍项目变成一项真正的事业。陪同他的还有他的共同创始人兼顾问达斯汀·莫斯科维茨和几名实习生。

马克·扎克伯格:帕洛阿尔托是一个神话般的地方,所有的技术都来自那里。 所以我想去看看。

鲁奇·桑哈维:当我听到Facebook搬到海湾地区时,我很惊讶,我以为他们还在哈佛的宿舍里工作。

在 Facebook 早期,扎克伯格招募了哈佛大学的同学克里斯·休斯,帮助对这项初创的服务提出建议。 两人于2004年5月在艾略特宫拍摄。图片来源: RICK FRIEDMAN/GETTY IMAGES

三、

埃兹拉·卡拉汉:2004年夏天,一系列重大事件发生了:肖恩在街上偶遇Facebook联合创始人的传奇故事,在几个月前他在东海岸遇见了他们。那次会面发生在我们都搬出一直住在一起的房子一周后。肖恩和他女朋友的父母在一起。

肖恩·帕克:当时,我在屋外散步,有一群孩子朝我走来——他们都穿着连帽衫,看起来很可能是刚刚出去闹事的吸大麻的高中生,我听到了我的名字。我想,哦,这是巧合,我再次听到我的名字,就像是,“肖恩,你在这里做什么?”然后,我转过身来。

我花了大约30秒的时间才弄清楚到底发生了什么,我终于意识到这是马克和达斯汀以及其他一些人。 所以我就说“你们来这儿干嘛?”他们说,“我们就住在那里。”我就说“这真奇怪,我也住在这里!”这真是太奇怪了。

亚伦·斯蒂格:我接到肖恩的电话,他告诉我,“嘿,你不会相信刚刚发生的事情。肖恩说:“你得过来见见这些人。马上过来。过来见见他们!”

肖恩·帕克:我甚至不知道从那里发生了什么,这甚至不是一种特别正式的关系。

亚伦·斯蒂格:于是我过去和他们见面,我对他们作为一个团队的专注度印象深刻。 他们偶尔会放松一下,做自己的事情,但是大部分时间他们都是坐在餐桌旁,开着笔记本电脑。 我会每周去他们那里几次,那里总是我能找到他们的地方,只是坐在餐桌旁,不停地工作,以保持他们的产品不断增长。

马克想做的就是,要么把产品做得更好,要么休息一下,放松一下,这样你就能有足够的精力去做更多的产品。就这样。他们除了去看电影,从来没有离开过那所房子。

埃兹拉·卡拉汉:早期的公司文化非常非常松散。感觉就像一个失控的项目,有着惊人的商业潜力。想象一下你的新生宿舍经营着一家企业,就是那种感觉。

马克·扎克伯格:大多数企业都不会像这样:一群孩子,住在房子里,做他们想做的事情,不在正常时间醒来,不进办公室,雇人,比如把他们带进你的房子,让他们和你一起放松一下,和你一起聚会,和你一起抽烟。

埃兹拉·卡拉汉:客厅是办公室,到处都有显示器和工作站,眼睛能看到的地方,都是白板。

当时马克·扎克伯格痴迷于文件共享,在硅谷暑假的宏伟计划是让Napster起死回生。它会再次崛起,但这一次是Facebook内部的一个功能。它的名字是Wirehog。

亚伦·斯蒂格:Wirehog就是马克所说的要改变一切的秘密功能。马克已经确信,Facebook之所以能真正受欢迎,并巩固其在学校的地位,是因为它是一种向他人发送文件的方式——主要是为了交换音乐。

马克·平卡斯:他们内置了一个看起来像Napster的小东西——你可以看到别人在电脑上有什么音乐文件。

埃兹拉·卡拉汉:就在这个时候,我们目睹了Napster被法庭完全禁止,娱乐业开始起诉随意分享文件的人。互联网狂野西部的时代明显结束了。

亚伦·斯蒂格:记住,Wirehog是在Facebook页面上无法分享照片的时候发生的,这一点很重要。Wirehog将成为与他人分享照片的解决方案。你可以在你的个人资料上放一个框,人们可以去那里访问你分享的所有照片——或者你分享的任何文件。它可能是音频文件,可能是视频文件,也可能是他们度假的照片。

埃兹拉·卡拉汉:但归根结底,这只是一种文件共享服务。当我加入Facebook的时候,大多数人已经开始意识到,除非Wirehog有一些我们没有想到的新用途,否则这只是一种负担。“我们总有一天会被起诉,那又有什么意义呢?”这就是我们的心态。

马克·平克斯:我有点奇怪为什么肖恩还想再次接近音乐。

亚伦·斯蒂格:我的理解是,Facebook的一些律师认为这是一个坏主意。就在Facebook用户增长非常迅速的时候,这项关于 Wirehog 的工作就被放弃了。

埃兹拉·卡拉汉:它们(各种大学)疯狂地要求加入。现在还只有一百所学校,但是在全国所有的学校,大学里的每个人都已经听说过了。使用数量已经疯了。白板上的一切都是与学校下一步要推出什么东西有关。这个问题非常独特。简单地说,“我们如何扩大规模?"

四、

亚伦·斯蒂格: Facebook 在一所学校发布,一天之内,就会有70% 的本科生注册。 当时,没有什么产品能像 Facebook 那样快速发展。

埃兹拉·卡拉汉:我们要成功似乎并不是不可避免的,但成功的范围看起来越来越清晰。达斯汀已经在谈论成为一家10亿美元的公司。他们从一开始就有这个雄心。他们非常自信:两个还是19岁的趾高气扬的孩子。

马克·扎克伯格:有一天,我们只是坐在一起,说:“我们不会回学校了,不是吗?”

埃兹拉·卡拉汉:这种傲慢看上去很了不起。

大卫·崔(David Choe)(著名涂鸦艺术家):肖恩是个瘦弱的书呆子,他说:“我要去为Facebook筹款。我要改变这些混蛋的想法。”我说,“你打算怎么做?”他把自己变成了一个“阿尔法”男性。他的发型真TM的超级锋利。他开始每天锻炼,晒黑了,穿了一套漂亮的西装。他参加了这些会议,拿到了钱!

马克·平卡斯:大概是2004年9月或10月,我在Tribe位于波特雷罗山尘土飞扬的砖房里的办公室——Tribe.net的想法就像Friendster加上Craigslist——我们在会议室,肖恩说他要把Facebook的人带进来。他把扎克带进来,扎克穿着一条运动裤,穿着阿迪达斯的人字拖,他看起来很年轻,坐在那里,双脚放在桌子上,肖恩正在飞快地谈论Facebook将要做的和关于增长的所有事情以及其他一切,我被迷住了。

因为我在做Tribe,我们没有成功,我们已经停滞不前了,我们正在碰壁,试图找出如何增长,这是一个孩子,他有一个简单的想法,他刚刚起飞!我已经对他们的成就感到敬畏,也许还有点恼火。因为他们做了一些更简单、更快、更少的事情,然后我记得肖恩在我办公室的电脑上打开了Facebook,他开始向我展示它,而我不能够在它上面注册,因为只有大学生才能用,太神奇了。

人们把他们的电话号码和家庭地址,以及关于他们自己的一切都放上去了,我简直不敢相信!但那是因为他们得到了这种信任。然后肖恩迅速组织了一轮投资,他建议扎克,我想,从彼得·蒂尔那里拿50万美元,然后从我和雷德·霍夫曼那里各拿3.8万美元。因为我们基本上是唯一一个在社交网络上做任何事情的人。那是一个非常非常小的俱乐部。

埃兹拉·卡拉汉:到了12月,这种气氛——我不会说这是一种更专业的气氛,但是马克和达斯汀一起工作的所有孩子要么回到学校,要么回到斯坦福,工作对他们来说变得更加严肃了。他们比第一个夏天工作得多。我们要到2005年2月才搬进办公室。就在我们签租约的时候,肖恩胡乱地开始说:“老兄!我认识一个街头艺术家。让他进去把事情(装饰)都做完。”

大卫·崔:我当时说,“如果你想让我把整栋大楼都粉刷一遍,那就是6万美元。” 肖恩说:“你要现金还是要股票?”

埃兹拉·卡拉汉:他用Facebook的股票支付了大卫·崔装修的费用。

大卫·崔:我根本不在乎 Facebook,甚至不知道它是什么。 你必须要有大学邮箱才能进去。 但我喜欢赌博,你知道吗? 我相信肖恩。 我就想,这孩子知道些什么,我要把我的钱押在他身上。

埃兹拉·卡拉汉:然后我们就搬了进去,当你第一次看到这个涂鸦时,就会说,“天哪,这个家伙对办公室做了什么?”办公室在二楼,所以当你走进来的时候,你必须马上走上楼梯,而在面对你的10英尺高的大墙上,你看到的只是一个胸部巨大的女人,穿着疯狂的麦克斯风格的服装,骑着一只斗牛犬。

这是最吓人、完全不合适的东西。“该死的,肖恩!你做了什么?”与其说这是一幅画,还不如说那是文化。更重要的是肖恩这么做了,这为我们定下了基调。当你走进办公室的时候,第一件看到的就是一个骑着斗牛犬的大胸女战士,所以,要做好准备!

鲁奇·桑哈维:是的,这个涂鸦有点不雅,但是它是不同的,它是充满活力的,它是活的。 这种能量非常明显。

凯蒂·杰明德(Katie Geminder)( Facebook早期项目经理):我喜欢它,它给人的感觉很强烈。里面有一些非常性感的画面,我并不在意,但是这可能被认为有点敌意,我想我们已经处理了一些更具挑衅性的画面。

埃兹拉·卡拉汉:我不认为是大卫·崔干的,我认为是肖恩的女朋友,她在女厕所里描绘了两个完全赤裸的女人纠缠在一起,露骨而亲密的女同性恋场景。这肯定比一个人通常在一个办公室的女厕所里看到的更具暗示性。实际上,这只持续了几个星期。

麦克斯·凯利(Max Kelly)(Facebook 的第一位网络安全官) : 有一幅4英寸 × 4英寸的图画,上面画着某人被干了。 一位客服人员抱怨说,这是“性本质”,考虑到他们每天看到的情况,我不知道他们为什么要抱怨这个。 但是我最终还是去了当地的一家商店,买了一支金色的画笔,在涂鸦上涂鸦——只是一个随意的设计ーー这样就不会显示有人被干了。

杰夫·罗斯柴尔德(Jeff Rothschild)(投资者变成Facebook员工):这很疯狂,但我觉得很酷。它看起来更像大学宿舍或兄弟会,而不是一个公司。

凯蒂·杰明德:角落里塞着毯子,到处都是电子游戏,还有 Nerf 玩具和乐高玩具,有点乱七八糟。

杰夫·罗斯柴尔德:有一个PlayStation。有几张旧沙发。很明显,有人睡在那里。

卡雷尔·巴隆(Karel Baloun)(Facebook 最早的程序员之一) :我每周可能会在那里呆上两三个晚上。 我在一次员工集会上赢得了“最有可能在桌子下面发现你的”奖。

杰夫·罗斯柴尔德:他们有一个酒吧,一整个架子上都是酒,一天下来人们可能会喝一杯。

埃兹拉·卡拉汉:办公室里有很多酒。 总有这样的早晨,我走进办公室,听到啤酒罐在我打开门的时候移动,办公室里散发着陈酿啤酒的味道,就像一个垃圾桶。

鲁奇·桑哈维:他们有桶装啤酒。 啤酒桶上面有一些摄像技术。 它基本上能检测到人的存在,并发布谁在桶前的消息,所以当你在啤酒桶前的时候,它会拍下你的照片,然后贴上一些东西,上面写着“某某人在桶前”,这个小桶是有专利的。

埃兹拉·卡拉汉:我们刚搬进来的时候,办公室的门上有一把我们搞不清楚的锁,但是每天早上9点门就会自动打开。 我必须在9点之前到达办公室,确保没有人走进来偷走所有东西,因为没有人会在中午之前到达那里。 Facebook的员工基本上都是夜间活动的。

凯蒂·杰明德:这些孩子会进来——我说孩子,意思是他们真的是孩子——他们11岁或者12岁就开始工作了。

鲁奇·桑哈维:有时候我会穿着睡衣去上班,那是完全没问题的。 这感觉就像是大学生活的延伸; 我们所有人都在同一时间经历着相同的生活经历。 工作太棒了。 真是太有趣了。 感觉不像是在工作。我们一直都很开心。

埃兹拉·卡拉汉:你们一起在外面闲逛。你和你的同事喝酒。人们开始在办公室约会…

五、

鲁奇·桑哈维: 我们在 Facebook 发现了我们的重要人物。 我们所有人最终都结婚了。 现在我们正处在有孩子的阶段。

凯蒂·杰明德:如果你看看最初几年在 Facebook 工作的成年人——比如,30岁以上的已婚人士——你做一项调查,我告诉你,他们中75 %的人可能离婚了。

麦克斯·凯利:那么午餐就要开始了。我们的午餐承办人精神不平衡,你永远不知道TM的食物里会出现什么鬼东西。有一次鱼里有虫子。太可怕了。通常,我会工作到下午3点左右,然后在办公室里转一圈,看看那天晚上到底会发生什么。谁要发布什么?谁准备好了?有什么传言?发生什么事了?

史蒂夫·帕尔曼(Steve Perlman)(硅谷老兵,雅达利时代开始):我们和Facebook共用一个休息室。我们正在建造硬件:面部捕捉技术。Facebook的人在做一些HTML的事情。他们一大早就来了。他们会有一顿午餐供应。然后他们通常在中午前离开。我想,伙计,这就是生活!我需要这样的创业。你知道吗?我们每个人对Facebook唯一能想到的就是:人真好,但哪儿也不去。

麦克斯·凯利:大约4点左右,我会和我的团队开会,说“我们今晚会被搞得一团糟。”然后我们去酒吧。大约5到8个人一起,分别去大学大街上不同的酒吧,吃晚饭,什么的。

鲁奇·桑哈维:我们会坐在一起进行这些智力对话:“假设,如果这个网络是一个图表,你如何衡量两人之间的关系?你如何衡量一个人和一张照片之间的关系?那是什么样子?这个网络最终会是什么样子?如果我们真的拥有这个网络,我们该怎么办?”

肖恩·帕克:“社交图谱”是图论中的一个数学概念,但它是一种试图向那些有点学术和数学倾向的人解释我们正在构建的不是一个产品,而是一个由节点组成的网络,节点之间有大量信息流动。这就是图论。所以我们正在构建一个社交图谱。它从来没有被公开谈论过。这是一种向有数学背景的人表达我们正在建造的东西的方式。

鲁奇·桑哈维:回想起来,我真不敢相信我们当时还有这样的对话。 这似乎是一件很成熟的事情。 我们会坐在一起进行这些对话,他们并不局限于团队中的某些成员; 没有任何明确的结果。它纯粹是知识性的,对每个人都开放。

麦克斯·凯利:人们一直都在喝酒,就像要玩一整晚一样,但是从9点左右开始,气氛就开始凝固了:“今晚我们要发布什么?谁准备好了?谁还没准备好?”大约11点左右,我们就知道那天晚上我们要做什么了。

凯蒂·杰明德:没有一个过程是令人振奋的。会有工程师在潜心研究他们热爱的事情。然后他们会在半夜把它发布出来。没有测试——他们只是把它发布出去。

埃兹拉·卡拉汉:大多数网站都有这些非常强大的测试平台,以便测试变化。我们不是这样做的。

鲁奇·桑哈维:只要按下一个按钮,你就可以把代码推上去,因为我们真正相信“快速移动,打破常规”的理念。所以你不应该一周等一次,也不应该一天等一次。如果你的代码已经准备好了,你应该能够将它实时推出给用户。这显然是一场噩梦。

凯蒂·杰明德:我们的服务器能经得起考验吗?或者安全性:测试安全漏洞的功能如何?真的就只是把它发布到外面,看看会发生什么。

杰夫·罗斯柴尔德:这就是黑客的心态:你只要完成它。当你有10个人的时候,效果很好。到了20个、30个、40个人的时候,我花了很多时间来保持网站的正常运行。所以我们必须培养某种程度的纪律。

鲁奇·桑哈维:那么我们只能在半夜推出代码,因为如果我们弄坏了东西,不会影响那么多人。但这很可怕,因为我们每天晚上都要熬夜到凌晨3、4点左右,因为这种推搡行为只会让每个写了任何代码的人都在场,以防发生任何事情。

麦克斯·凯利:凌晨1点左右,我们就会知道要么我们完蛋了,要么我们很好。如果我们做得好,每个人都会像“whoopee”一样,也许能睡一会儿。如果我们被搞砸了,然后我们会说,“好吧,现在我们得试着把这个东西回滚回来或者修复它。”

凯蒂·杰明德:凌晨2点:那就是狗屎发生的时候。

鲁奇·桑哈维:然后再来一次,这种情况会一直持续到凌晨3、4或5点。

麦克斯·凯利:如果凌晨4点左右,我们无法修复它,我会说,“我们将尝试恢复它。”这意味着基本上我的团队会一直工作到早上6点,在4到6点之间睡觉,然后每天重复,持续了大概9个月。太疯狂了。

杰夫·罗斯柴尔德:一周工作七天。我一直都在。睡觉前我会喝一大杯水,保证两个小时后醒来,这样我就可以去检查所有的东西,确保我们没有把它搞砸。这是一整天,一整夜。

凯蒂·杰明德:对于一个想要和丈夫这样的成年人一起生活的人来说,这是一个很大的挑战。肯定有一种感觉,因为你年纪大了,结婚了,有一种工作之外的生活,而这些都是你没法保证的。

马克·扎克伯格:为什么大多数象棋大师都在30岁以下?年轻人的生活比较简单。我们可能没有汽车。我们可能没有家人……我只有一张床垫。

凯特·杰明德:想象一下,30岁以上的人听到你的老板这么说会是什么感受。

马克·扎克伯格:年轻人只是更聪明。

鲁奇·桑哈维:那时候我们还很年轻。 我们确实有大量的能量,我们可以做到这一点,但我们不一定是最有效率的团队。 对于高层领导来说,这绝对是令人沮丧的,因为很多谈话都发生在他们不在的时候,第二天早上他们就会处在变化中。 但是我们做的时候还是很有趣的。

六、

埃兹拉·卡拉汉:对于最初的几百名员工来说,几乎所有人都已经是公司工作人员的朋友,包括工程师和用户支持人员。这里有很多刚毕业的学生。当我们搬进办公室的时候,宿舍文化开始真正突出,也开始有一点点破裂。它有宿舍的感觉,但并不是完全由大学生主导。大人开始进来了。

杰夫·罗斯柴尔德:我是2005年5月加入的。办公室外的人行道上是比萨店的菜单。那是一幅漫画,画的是一位厨师,下面有一张需要招募人员的工作清单。

肖恩·帕克:当时谷歌非常有吸引力。所有伟大的工程师都要去谷歌。

凯特·罗斯(Kate Losse)(早期客户服务代表):我不认为我能够在谷歌工作。 对我来说,Facebook 看起来比谷歌酷多了,并不是因为 Facebook 是最酷的。 只是那时的谷歌似乎已经显得乏味无趣了,而像 在Facebook工作的人,其实并不想变成书呆子。 Facebook是一个社交网络,所以它必须有一些社交成分,就像正常的美国社交活动——比如啤酒乒乓。

凯特·杰明德:在街对面的办公室里有一栋房子,五六个工程师住在那里,那是一个正在举行的啤酒乒乓派对。这就像一个男孩俱乐部——尽管不仅仅是男孩。

特里·维诺格拉德(Terry Winograd)(著名的斯坦福大学计算机科学教授):我认为Facebook更像是一种本科生文化,而谷歌更像是研究生文化。

杰夫·罗斯柴尔德:在我走进Facebook的大门之前,我以为这些家伙已经创建了一个约会网站。大概过了一两个星期,我才真正明白是怎么回事。马克,他曾经告诉我们,我们不是一个社交网络。他会坚持说:“这不是一个社交网络。我们是对你真正认识的人有用的社交工具。”

MySpace是在有相似兴趣的人中间建立一个在线社区。我们看起来可能是一样的,因为在某种程度上它的形状是一样的,但是它为个人所做的是解决一个不同的问题。我们正在努力提高朋友之间的交流效率。

麦克斯·凯利:马克和我坐在一起,向我描述了他在Facebook上看到的一切。他说:“这关系到人与人之间的联系,建立一个系统,在这个系统中,凡是与你的生活有任何价值的人,只要你希望它被保存下来,就会被保存下来。不管你在哪里,和谁在一起,也不管你的生活如何改变:因为你总是和对你来说最重要的人联系在一起,你总是能够和他们分享。”

我听到了,我想参与其中。我想让这一切发生。早在90年代,我们所有人都对互联网抱有乌托邦的想法。这几乎让人回想起美丽的互联网,在那里,每个人都可以连接在一起,每个人都可以分享,这样做没有任何阻碍。Facebook在我看来也是一样。马克还太年轻,不知道当时的情况,但我认为他从本质上理解了80年代和90年代互联网应该是什么样子。而在这里,我又听到了同样的故事,可以想象,我有能力帮助它成功。这很有吸引力。

亚伦·斯蒂格:所以在2005年夏天,马克让我们大家坐下来,他说:“今年夏天我们要做五件事。”他说,“我们正在重新设计网站。我们正在做一个叫做News Feed的事情,它将告诉你,你的朋友在网站上做的一切。我们将推出照片功能,我们将重做 Parties 并将其转化为 Events,我们要做一个本地企业产品。”我们完成了其中一项工作,重新设计了网站。照片是我的下一个项目。

埃兹拉·卡拉汉:Facebook当时的产品非常简单:个人资料。没有News Feed,消息传递系统非常薄弱。他们有一个非常简单的活动产品,你可以用它来组织聚会。几乎没有其他功能可言。网站上没有照片,只有你的个人资料照片。没有任何东西能告诉你网站上的任何东西是什么时候改变的。你会发现有人改变了他们的个人资料图片,才会去注意他们的个人资料,并注意到,哦,照片变了。

亚伦·斯蒂格:有一些人每小时换一次个人资料照片,只是为了分享他们自己的照片。

斯科特·马莱特:当时照片是最受欢迎的功能。于是,亚伦和我走进一个房间,在白板上为一些网页添加一些线框图,决定需要存储什么数据。在一个月内,我们做出了一个在内部基本上可以完全运作的原型。很简单:你发布一张照片,它会进入一个相册,然后你会有一套相册,而且你可以在照片中标记人物。

杰夫·罗斯柴尔德:亚伦有做标记的洞察力,这是一个非常有价值的洞察力。这真的改变了游戏规则。

亚伦·斯蒂格:我们认为,最重要的是要说照片中的人是谁。我们不确定这是否真的会那么成功;我们只是感觉这很好。

Facebook Photos于2005年10月上线。大约有500万用户,几乎都是大学生。

斯科特·马莱特:我们首先在哈佛和斯坦福推出,因为我们的朋友都在那里。

扎克伯格从小在纽约州的多布斯渡口长大,他的父母爱德华和凯伦以及他的姐妹兰迪,左,阿瑞尔一起抚养长大。图片来源:SHERRY TESLER/NEW YORK TIMES/REDUX

亚伦·斯蒂格:我们制作了这个程序,它会填满一个电视屏幕,向我们展示上传到服务器上的所有东西,然后我们打开它,等待照片的出现。第一批进来的照片是Windows壁纸:有人刚刚从Windows目录上传了他们所有的壁纸文件,这让人很失望,也许人们不明白?也许这样不行?

但接下来的照片是一个男人和他的朋友出去玩,然后接下来的照片是一群不同的女孩:三个女孩在一起,这四个女孩在一起,其中两个在一起,不过是她们在聚会上玩的照片,然后就没有停下来。

麦克斯·凯利:你参加了每一场婚礼,参加了每一个成年礼,看到了这些令人敬畏的东西,然后还有一个XX。所以,这是一个同时具有令人敬畏和糟糕的感觉的时刻。

亚伦·斯蒂格:在第一天,有人上传了700张照片,并在上面做了标记,然后就从那里起飞了。

杰夫·罗斯柴尔德:三个月内,我们传送的照片比互联网上任何其他网站都多。现在你不得不问自己:为什么?答案就是标记。没有人能收到一封电子邮件,上面写着“有人把你的照片上传到互联网上”——而不去看一看。这是人类的本性。

埃兹拉·卡拉汉:有史以来唯一最大的增长机制是照片标记。它决定了所有其他的产品决策。这是人们使用Facebook的方式第一次发生了真正的根本性变化,Facebook的心态发生了变化,News Feed的理念开始萌芽。现在,有理由看到这种变化会如何扩展到大学之外。

七、

杰夫·罗斯柴尔德:News Feed项目于2005年秋季启动,2006年秋季交付。

达斯汀·莫斯科维茨:News Feed 是病毒式传播概念的化身。

埃兹拉·卡拉汉:News Feed就是今天 Facebook 的基础。

肖恩·帕克:最初,它被称为“What’s New”,它只是网络中正在发生的所有事情的反馈——实际上只是一系列正在发生的状态更新和个人资料的更新。

凯蒂·杰明德:这是一个集合,是所有这些故事的集合,其中包含一些逻辑,因为我们无法向你展示正在发生的一切。有两种流:你正在做的事情和你的网络其他部分正在做的事情。

埃兹拉·卡拉汉:所以News Feed是第一次,现在你的主页不再是静态的、无聊的和无用的,而是不断更新的“报纸”,可以说,是Facebook上发生的我们认为你会关心的事情。

鲁奇·桑哈维: 这是一个很有意思的想法,因为通常当你想到报纸时,他们会有一些编辑化的内容,他们决定他们想说什么,他们想要印刷什么,他们在前一个晚上这样做,然后他们把这些文章发给成千上万的人。 但就 Facebook 而言,我们正在建立一千万种不同的报纸,因为每个人都有一个个性化的版本。

埃兹拉·卡拉汉:这确实是第一次具有里程碑意义的产品工程壮举。它必须处理很大的数据量:所有这些变化以及如何在个人层面上传播这些变化。

鲁奇·桑哈维:我们一年半来一直在不停地研究这个问题。

埃兹拉·卡拉汉:……然后是所有这些东西的智力方面:我们如何把你最关心的东西传递出来?从工程角度来看,这些都是非常棘手的问题。

鲁奇·桑哈维:在没有意识到这一点,我们最终在软件中建立了一个最大的分布式系统。 这是相当前卫的。

埃兹拉·卡拉汉:我们内部有它,我们使用了好几个星期——这真的很不寻常。

凯蒂·杰明德:我记得当时我在想想,“好吧,你们这些家伙,我们得做一些用户研究。”最后我说服扎克,我们应该把用户带到实验室,坐在玻璃后面,看着我们的用户使用产品。我花了很大的力气才让达斯汀、扎克和其他人去观看。他们认为这是浪费时间。他们说:“不,我们的用户很笨。”

埃兹拉·卡拉汉:这是我们第一次真正带外界人士来为我们测试东西,他们的反应,他们的初步反应是清楚的。人们就像,“我靠,我不应该看到这些,好像这感觉不对,”因为你马上看到这个人改变了他们的个人形象,这个人做了这个,这个人做了那个,你的第一反应是,哦,我的上帝!每个人都可以看到我!每个人都知道我在Facebook上做的一切。

麦克斯·凯利:但是News Feed对我们所有人来说都是非常有意义的,在内部,我们都很喜欢它。

埃兹拉·卡拉汉:所以在内部我们有这样一个想法,认为这是不正确的:这是一个太不和谐的变化,它需要慢慢推广,我们需要让人们对此保持热情——但马克却很坚定。“我们就这样做。我们就要发布了。就像撕掉创可贴一样。”

鲁奇·桑哈维: 我们在夜深人静的时候推出了这个产品,我们真的很兴奋,我们在庆祝。 我写了这样一篇博客文章:“Facebook换了一个新面貌。”

凯蒂·杰明德:我们写了一封小信,在信的底部放了一个按钮。按钮说:“太棒了!”不是说,“好吧。”而是“太棒了!”那太无礼了。我希望我有一个截图。哦天啊!就这样。你登陆Facebook,你就有了这个功能。我们没有给你选择,也没有很好的解释,这让人们感到害怕。

杰夫·罗斯柴尔德:人们惊慌失措,因为它似乎暴露了以前从未见过的信息。事实上并非如此。News Feed中显示的所有内容都是人们放在网站上的东西,如果他们去访问了那个个人资料,每个人都会看到。

鲁奇·桑哈维: 用户们很反感。 他们威胁要抵制这种产品。 他们觉得自己被侵犯了,他们的隐私受到了侵犯。 有学生在组织请愿书。 人们在办公室外排队等候。 我们雇了一个保安。

凯蒂·杰明德:外面有摄影师。 有人抗议说:“把旧的 Facebook 带回来!” 每个人都讨厌它。

杰夫·罗斯柴尔德:反应非常激烈。 有人在办公室里游行。 有人在Facebook 上组织了抗议News Feed的群组,不到两天,就有一百万人加入。

鲁奇·桑哈维:还有一个关于“鲁奇是魔鬼”的群组,因为我写了那篇博客文章。

麦克斯·凯利: 用户群体每一步都在与之争斗,他们会对我们施加压力,会对客户服务施压,然后说:“这真是一团糟! 这太可怕了!”

埃兹拉·卡拉汉:我们收到亲友的电子邮件。他们说,“你做了什么?太可怕了!换回来。”

凯蒂·杰明德:我们坐在办公室里,抗议活动在外面进行,“我们要把它回滚回去吗?我们要把它回滚回去吗!?”

鲁奇·桑哈维:在通常情况下,如果大约10 %的用户开始抵制该产品,你会关闭它。但是我们看到了一个非常不寻常的模式。

麦克斯·凯利:即使是那些告诉我们这很可怕的人,我们也会看着他们的用户流,然后说:你TM在不断地使用它!你在说什么?

鲁奇·桑哈维:尽管有这些反抗,这些请愿和人们在办公室外排起了长队,但他们还是在使用产品。他们实际上在使用它,而且使用它的次数是News Feed前的两倍。

埃兹拉·卡拉汉:这几天对公司里的每个人来说都是一场情绪上的灾难。尤其是那些挥舞着手臂说:“不要这样!别这样做的人!”因为他们觉得,“这就是我们告诉你会发生的事!”

鲁奇·桑哈维:马克在东海岸的第一次新闻发布会上,我们其他人都在帕洛阿尔托办公室处理这个问题,看着这些日志,试图传达“这真的有用!”在我们选择关闭它之前,先尝试做一些事情。

凯蒂·杰明德:我们必须马上推出一些隐私功能来平息风暴。

鲁奇·桑哈维:我们要求每个人给我们24小时。

凯蒂·杰明德:我们用这些小滑条建立了这个简洁的隐私“音频混音器”,你可以在那里打开和关闭。它设计得很漂亮——看起来很漂亮——但它无关紧要。

杰夫·罗斯柴尔德:我想没有人用过它。

埃兹拉·卡拉汉:但它被添加上去了,最终,即时反应消退了,人们意识到News Feed正是他们想要的,这个功能完全正确,这使得Facebook变得更加有用了一千倍。

凯蒂·杰明德:就像照片一样,News Feed只是——轰!——这是产品的一个重大变化。

杰夫·罗斯柴尔德:使用量在News Feed 的发布上飞速上升。 大约在同一时间,我们也对那些没有教育邮箱的人开放了网站。

埃兹拉·卡拉汉:一旦Facebook向公众开放,它就变得越来越明显,Facebook正在成为世界上所有人的目录。

杰夫·罗斯柴尔德:这两件事加在一起——就是Facebook成为一个被大规模使用的产品的转折点。在此之前,我们只是被高中生和大学生使用的产品。

马克·扎克伯格:统治!

鲁奇·桑哈维:“统治”在当时是 Facebook 的一大口号。

麦克斯·凯利:我记得公司开会时,我们高喊“统治”。

埃兹拉·卡拉汉:我们一直都有公司聚会,2005年的一段时间里,马克在公司聚会上的所有敬酒都以“统治”结束。

马克·扎克伯格:统治!!

八、

麦克斯·凯利:我们撕毁雅虎提议的那次会议,我记得特别清楚。

马克·平卡斯:2006年,雅虎向 Facebook 提供了12亿美元的收购提案,我认为是这样的,当时这似乎是一个惊人的价格,很难想象他们不会接受。 每个人都看到了 Napster、Friendster以及MySpace 结局,所以,一个没有收入的公司面临着一个可靠的公司提供了12亿美元的收入,你能够对此说不吗? 你必须非常尊重那些拒绝这些提议的创始人。

达斯汀·莫斯科维茨:我确信如果雅虎收购我们,产品将遭受重大损失。 肖恩告诉我,90% 的合并都以失败告终。

马克 ·平卡斯:对于扎克来说,非常幸运,雅虎的股票下跌,他们说不会改变报价。 但他们说这个报价是固定数量的股票,所以这个出价降到了8亿美元,我认为,扎克在情感上可能不想这么做,这让他清醒了过来。 如果雅虎说:“没问题,我们会用现金或股票支持这一报价,使其达到12亿美元”,那么对于扎克来说,这可能不会太难,也许 Facebook 会成为雅虎的一个小分支。

麦克斯·凯利:我们真的撕毁了雅虎的协议,把它当作一个公司来践踏! 我们就像这样,“去他们的,我们要收购他们!”那是恶意的胡说八道。

马克·扎克伯格: 统治! ! !

凯特·罗斯:他说话的方式有点讽刺。 这不是一个字面意义上的、可怕的“统治” ,这很有趣。 只有当你想到更大规模的事情时,你才会这样想,嗯,人们是否意识到,他们之间的互动是由一群对世界如何运作和什么是好的想法的人所构建的吗?

埃兹拉·卡拉汉:互联网的发展方向,有多少是受到了19岁、20岁、21岁富有的白人男孩的视角影响?这是一个现实的问题,社会学家需要深入地研究。

凯特·罗斯:我认为大多数人并没有真正考虑到现在几个人的价值观对每个人的影响。

史蒂文·约翰逊:关于这个问题,我认为存在一些合理的争论。 Facebook确实造成了一些回音室问题和政治两极化问题,但是我花了很多时间争论,互联网的责任要比人们想象的要少。

马克·平卡斯:也许我太接近这一切了,但我认为当你把视角拉回来的时候,我们中没有一个人真的那么重要。 我认为互联网正在走一条通向互联网想要去的道路。 我们都在试图弄清楚消费者想要什么,如果人们想要的是这个巨大的回声室和这个虚荣的、充满点赞的世界,有人会把它给他们,他们会成为赢家,而那些不提供这些的人,不会成为赢家。

史蒂夫·乔布斯:除了 Facebook 之外,我没有看到其他公司占据了统治地位。

马克·平卡斯:我不认为一群大学男生塑造了互联网。 我只是觉得他们先到达了那里。

马克·扎克伯格: 统治!!!!

埃兹拉·卡拉汉:直到我们有了一个全职的顾问,他说:“马克,看在上帝的份上: 你不能再用统治这个词了,”他停了下来。

肖恩·帕克:一旦你占据统治地位,那么它就会突然变成一个反竞争的术语。

史蒂文·约翰逊: 互联网用了30年才有了10亿用户。 Facebook 花了10年时间。 Facebook 的关键是它不是一个服务或者应用程序,它是一个基本的平台,和互联网本身的规模一样。

史蒂夫·乔布斯: 我很欣赏马克 · 扎克伯格。 我对他了解不多,但我欣赏他没有出卖公司——因为他想要成立一家公司。 我很欣赏这一点。

作者笔记

书面语言和口头语言有很大的不同。 因此,我冒昧地纠正了口误,将意识流的想法分成了句子,将句子排序成段落,消除了冗余的部分。 这中间的关键是不要把原来的口头语言变成书面语言,而是要把实际上的内容逐字记录下来。

我小心翼翼地保留了所有为了这篇文章而采访的每个人的语言节奏和语言风格,所以,你读到的内容在你的脑海里是真实的:真实的生活,真实的文字记录,真实的演讲者的意图。

这篇文章中发现的绝大多数词语都来自于我的采访。 在有些地方地方,我尝试着去挖掘之前未发表的采访,并引用他们的话。 在一些地方,我引用了之前发表过的采访:

2005年,马克·扎克伯格在哈佛大学计算机科学入门课上发表的演讲,以及同年2月他接受哈佛克里姆森报的采访; 达斯汀·莫斯科维茨2008年12月青年运动联盟峰会的主题演讲;大卫·柯克帕特里克(David Kirkpatrick)的著作《Facebook效应》(The Facebook Effect);大卫 · 崔在2016年3月的霍华·史坦秀上发表的评论; 史蒂夫 · 乔布斯对他的传记作者沃尔特 · 艾萨克森做出的评论,2011年乔布斯去世后不久,这个采访就在《60 Minutes》栏目播出。

书籍封面

原文链接:https://www.wired.com/story/sex-beer-and-coding-inside-facebooks-wild-early-days/

编译组出品。编辑:郝鹏程