前一阵被邀请参与公司新任培训的师兄师姐分享环节,大体是和小组内的新入职校招同学分享工作中的积累和收获。分享内容没有要求,但是大家提的比较多的问题是入职后有没有什么成长的tips或者坑。我干脆提前做了些相关的准备,也一并在这里记录下来吧。

我回忆了下过去2年多以来,在公司遇到的之前未曾预期的种种,大致可以总结为下面两点:

  • 了解业务
  • 以人为本

先说了解业务吧。我们在日常工作中遇到的需求无非两类:业务需求技术需求。这两类工作都要求对业务的了解。在业务需求中,首先了解业务才有可能完好地还原prd的需求,避免产生不符合预期的情况,避免被产品或QA打回。然后,我们每个人都不是需求实现的机器,了解业务能让你知道,你写的每一行代码都是有意义的,都是真真正正为人服务的,而不是机械地完成任务。同时,对业务的熟悉程度也能让你的视野上个台阶,从更高的角度考虑问题,看到更远的可能。实际上,服务端同学相对来说,由于要设计数据库表,实现底层的业务逻辑,需要对整个业务理解更深入,所以在大多数团队,leader也都是服务端同学担当。

在技术需求中,同样离不开对业务的理解。可能有些刚入职的同学不会意识到:我们其实是工程师,而不是科学家。我们需要把技术应用到实际工作中,而不是单纯地指出某个技术的可行性。失去业务土壤的技术需求是无法带来真正价值的。业务需要需要能够从业务中挖掘,并在最后真正应用到业务中产生价值。举个反例,在我刚入职时实现过一个流程图工具,想法很单纯,用技术实现工具是个很酷的事。然而没有考虑过如何应用到业务中,最后半途而废。类似地,在入职1年多的时候,和同事开发了能够托管UI稿和prd稿的平台,但是我们无视了市面上已经有太多成熟好用的产品,最终也没能推动业务使用。一个比较好的技术需求应该怎么做呢:了解业务需要、使用技术赋能,然后保证实现落地。这三步中,使用技术赋能反而是最简单的一步。理解业务需要和推动业务使用是比想象中要困难的。

第二点叫做以人为本。这也是刚加入工作时可能注意不到的一点,入职前你可能以为你每天很浪漫地和代码泡在一起,和机器打交道。真正工作一段时间后,你会发现,每天至少50%的时间是在和人打交道的。人和机器是不一样的,机器是可靠的,可预期的,可以根据在学校里学习的知识推测的;而人是不可靠的,需要技巧,需要将心比心。这种不一样的思维方式会给可能过于理性的你带来麻烦。不然你会发现每天70%~80%的烦恼都是人而非机器带来的。

说几个例子,展开聊一下。先说代码,代码是写给人看,写给人理解的,然后才是交给机器去执行。看似你是在写代码,实际上你是通过代码在和未来的你或者接手你代码的人交流思路。所以代码的风格、可读性可能比你想象中要重要。一个糟糕的代码风格、可读性会让未来的你或者其他同事想要骂人,想要通过git blame找到这一坨shi一样的代码究竟是哪一个如此没品味的人写出来的。相反,一个好的风格、可读性会让未来的你和你的同事接手代码时心情愉悦,如清风拂面。类似地,可扩展性和设计良好与否也能起到上面的效果。可扩展性强和设计良好的代码可以极高地提高修改代码的愉悦程度和生产效率。

作为前端,界面的设计也一样重要。不要只是单纯地去实现PM或者UI的设计,可以站在终端用户的角度换位思考。如果是你遇到这种交互,它是否符合你的直觉,使用起来是否够简单,是否能达到目的。遇到有疑问的地方,随时可以找PM和UI讨论。

当然,这里说以人为本也不要矫枉过正。各位在日常工作中,还是以做事为主,公司内也还是看大家工作成果如何,而不是人际关系搞的如何。这里只是提个醒,希望大家在踏实努力的同时,也不要忘记了“人”这个角色的重要性。

总结上来看,就是上面这些,没别的了。各位既然来参加今天的培训,肯定也是从学校的环境刚进入工作环境没多久。上面这段分享听完之后,如果能对有些人有启示,能让大家意识到思维方式的不同,就达到我的目的了。

谢谢!

正式版HTTP/2发布于2015年5月,距今已经快5年了,相比老一辈HTTP 1.1有了许多改进。在具体讨论这些改进前,我们先简单回顾下HTTP这一路以来的历程。

历史回顾

HTTP在1991年发布了最初的HTTP0.9版本,主要用于学术交流,目的也只是用来在网络之间传递HTML超文本的内容。HTTP0.9基于TCP,只有一个GET请求类型,请求和文档响应都是ASCII字符流,响应数据类型只有HTML类型,在响应结束后立即断开连接。

随着互联网发展,1994年底出现了拨号上网,网景推出浏览器后,WWW已经不仅局限于学术交流,浏览器中除了承载HTML以外,还包括了JavaScript、CSS、图片、音视频等资源。HTTP1.0在这个背景下于1996年推出(RFC1945),它支持了状态码、方法、头部的概念,响应内容不局限于超文本文件,编码类型也不仅限于ASCII。但是TCP连接在响应返回后依旧会断开连接。

在浏览器等技术发展,HTTP请求更多也更复杂,HTTP1.0的已有问题暴露得越来越明显。TCP频繁建立连接的时延,缓存协商机制的不完整、大文件下载的支持等问题需要解决。于是HTTP1.1在1999年推出(RFC2616),这是个很庞大的协议,全文长达176页,在后续IETF对该规范进行更新时,则被拆分成了总页数更多的六个文档(即RFC7230协议族)。HTTP1.1包含了太多细节和可选的部分,包含不常用的功能和不合适的优化,因此几乎没有任何实现包含完整的协议功能。总的来看,HTTP1.1做了一些尝试:

  • TCP持久连接(keep-alive),即在一个TCP连接上发起HTTP请求
  • 支持范围请求(Accept-Ranges)
  • 更强大的缓存机制(协商缓存和强缓存,以及相关的头部)
  • 提出了HTTP pipeline,尝试改善串行HTTP请求引起的线头阻塞(Head-of-line blocking)问题
  • 更多的错误相关状态码
  • Host头处理

之后HTTP1.1便被一直使用至今,随着互联网页面请求资源的数量和体积增大,HTTP1.1中没能妥善解决的问题越来越明显。HTTPbis工作组在2007年夏天便着手于HTTP1.1标准的更新,并最终在2014年初形成上面提到的RFC7230系列协议族。

SPDY(SPeeDY)是由Google牵头开发的开源协议,意图在TLS和HTTP中间插入中间层,解决HTTP协议的问题。大约在2012年提出,也被大多数主流浏览器支持。最终在2015年HTTP/2协议发布后,逐步放弃支持。实际上HTTP/2也是在SPDY/3草案的基础上形成的协议初稿。

历史问题

传输资源与延迟

当今的互联网环境和20世纪末那会儿已经有了很大的不同,现在的Web页面更像一个应用的概念,而非一个简单的页面(SPA)。从HTTPArchive一个页面下请求的资源数已经上百,请求的资源体积也接近2M。

http-transfer-size

随着这些年网络硬件条件的迅猛发展,带宽已经不再是影响人们体验的因素,而网络延迟仍然没有太好的改善。高延迟的网络上(比如移动设备),即使拥有高连接速率,也很难获得优质快速的网络体验。页面从访问到打开的近70%时间都发生在网络上。

请求-响应模型

HTTP1.1是无状态协议,需要以客户端请求开始,然后才能响应。一个TCP上同时只能有一个请求/响应。TCP协议的能力并没有被充分利用。在HTTP1.1启用keep-alive后,TCP连接重复建立的问题被解决。但是请求还是需要排队一个一个发送,TCP的RTT(round-trip time)还是比较可观。后续的HTTP1.1提出了HTTP管线化(pipeline),即将多个HTTP请求合并成一个,一起发送,这样的确提高了服务器的资源利用率,但是也会带来线头阻塞(head-of-line blocking)问题,即一个比较耗时的请求会影响后续的所有请求。另外,它会给重试带来麻烦,需要网络中间节点的支持。所以这个特性并没有得到浏览器和服务器认可,实现也并不普及。目前大多数桌面浏览器也是默认关闭这个特性的。

http-pipeline

那些年,我们一起克服延迟的办法

针对上面的困难,智慧的开发者们自然也是有了许多应对办法。

  • 雪碧图:将小图片整合成一张大图。
  • 内联:将高优先级资源或小资源通过script标签或style标签或dataUrl的形式直接内嵌在页面里
  • 分片(sharding)与域名散列:将图片或者其他资源分发到不同主机。最初的HTTP1.1规范(RFC2616)提到一个客户端最多只能对同一主机建立两个TCP连接。后来,两个连接的限制被取消了(RFC7230),现在的浏览器一般允许每个域名主机建立6-8个连接。根据httparchive.org的记录显示,在Top30万个URL中平均使用40个TCP连接来显示页面

http-sharding

除此之外,为了减少请求数,前端会将代码合并并打包,这也是webpack这样的工具诞生的背景。

冗长的头部

HTTP1.1中1000+字节的头部都是常见的且体积较大的,如Cookie。头部信息有许多多余信息。这也让许多大请求建立连接的过程变得很慢。

总结来看,HTTP1.1遗留了下面几个问题:

  • 对TCP利用较差,同时只能有一个请求/响应
    • 目前应对方法:开多个TCP连接(分片),减少请求数(合并资源);这些方法多少会遇到TCP慢启动、DNS开销等问题
  • HTTP头部没有压缩,占用较大空间
    • 目前应对方法:减少请求数、使用cookie-less域名
  • 固有的请求-响应模式,重要资源无法优先推送
    • 目前应对方法:内联资源

HTTP/2对于上面这些问题自然是重拳出击。

HTTP/2概述

“HTTP/2 enables a more efficient use of network resources and a reduced perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection. It also introduces unsolicited push of representations from servers to clients.”

根据RFC7540的摘要,简明扼要地点出了HTTP/2带来的几个重要特性:

  • 多路复用的二进制协议;一个TCP连接上不再只有1个请求/响应,同时采用二进制而非文本传输数据
  • 头部压缩;用二进制分帧配合专门设计的头部压缩算法(HPACK)大大减少头部体积,HPACK有专门的RFC7541来规范。
  • 服务器推送;在客户端发送请求前,主动将资源推送给客户端

整个HTTP/2实际上还是在HTTP的框架下的,对HTTP1.1也是完全兼容的,这意味着你可以像以前一样使用HTTP的API、方法、头部、状态码这些:

  • HTTP/2必须维持HTTP的范式。它只是一个让客户端发送请求到服务器的基于TCP的协议
  • 不能改变http://https://这样的URL,也不能对其添加新的结构。使用这类URL的网站太多了,没法指望他们全部改变。
  • HTTP1.1的服务器和客户端依然会存在很久,所以必须提供HTTP1.1到HTTP/2服务器的代理
  • 不再使用小版本号。服务器和客户端都必须确定自己是否完整兼容http2或者彻底不兼容

协商

SPDY依赖于TLS,不过从SPDY中诞生的HTTP/2却可以选择是否基于TLS。由此带来2种HTTP/2协商机制。对于普通的HTTP1.1,通过给服务器发送一个带升级头部的报文。如果服务器支持HTTP/2,它将以“101 Switching”作为回复的状态码,并从此开始在该连接上使用HTTP/2。这种连接方式也被称为h2c(HTTP/2 cleartext),此时HTTP/2在TCP之上运行。出于安全性考虑。几乎所有的主流浏览器都不支持这种协商实现(curl可以支持)。

对于在TLS之上的https,Next Protocol Negotiation (NPN)是一个用来在TLS服务器上协商SPDY的协议。IETF将这个非正式标准进行规范化,从而演变成了ALPN(Application Layer Protocol Negotiation)。ALPN会伴随HTTP/2中的使用而推广,考虑到SPDY会使用NPN,而许多服务器又会同时提供SPDY以及HTTP/2,所以在这些服务器上同时支持ALPN以及NPN显然会成为最理所当然的选择。ALPN和NPN的主要区别在于,ALPN中由服务端最终决定通信协议,NPN中由客户端最终决定。

HTTP/2特性

在HTTP/2的介绍中提到,协议通过定义一个优化的基础连接的HTTP语义映射来解决HTTP1.1的问题。具体地,它允许在同一连接交错地建立请求和响应消息,并使用高效率编码的HTTP报头字段。它还允许请求的优先级,让更多的重要的请求更快速的完成,进一步提升了性能。最终协议设计为对网络更友好,因为它相对HTTP/1.x减少了TCP连接。最后,这种封装也通过使用二进制消息帧使信息处理更具扩展性。

里面加粗的部分即HTTP/2带来的几个新特性:

  • 单一TCP连接
  • 二进制分帧
    • 请求优先级
    • 服务端推送
    • 流量控制
  • 多路复用
  • 头部压缩(HPACK)

二进制分帧“层”

首先,HTTP/2是个二进制协议。它的请求和响应都是流的形式,它基本的协议单位是帧。每个帧都有不同的类型和用途。HTTP/2所有性能增强的核心也在于这个新的二进制分帧层,它定义了如何封装 HTTP 消息并在客户端与服务器之间传输。

http2-framing-layer

从图中能看到,在TLS之上,HTTP/2之下新增了一个二进制分帧层。这里所谓的“层”,指的是位于套接字接口与应用可见的高级HTTP API之间一个经过优化的新编码机制:HTTP的语义(包括各种动词、方法、标头)都不受影响,不同的是传输期间对它们的编码方式变了。不同于HTTP1.x里面用换行符作为分隔,HTTP/2中将信息分割成帧,并进行二进制编码。整个分帧过程由客户端和服务端替我们完成。

数据流和帧

上面这种二进制分帧机制改变了客户端与服务器之间交换数据的方式,也带来了流的概念。

  • 流(Stream):一个双向字节帧流穿过HTTP/2连接中的虚拟通道,可以承载一条或多条消息。
  • 消息:与逻辑请求或响应消息对应的完整的一系列帧。

流的生存周期包含idle、reserved(local)、reserved(remote)、open、half closed(local)、half closed(remote)、closed多个阶段。状态间通过特定的帧类型流转。在不同状态下对应着不同的能力,对于状态规范描述以外的操作请求都会给出协议错误(PROTOCOL_ERROR)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
                         +--------+
send PP | | recv PP
,--------| idle |--------.
/ | | \
v +--------+ v
+----------+ | +----------+
| | | send H / | |
,------| reserved | | recv H | reserved |------.
| | (local) | | | (remote) | |
| +----------+ v +----------+ |
| | +--------+ | |
| | recv ES | | send ES | |
| send H | ,-------| open |-------. | recv H |
| | / | | \ | |
| v v +--------+ v v |
| +----------+ | +----------+ |
| | half | | | half | |
| | closed | | send R / | closed | |
| | (remote) | | recv R | (local) | |
| +----------+ | +----------+ |
| | | | |
| | send ES / | recv ES / | |
| | send R / v send R / | |
| | recv R +--------+ recv R | |
| send R / `----------->| |<-----------' send R / |
| recv R | closed | recv R |
`----------------------->| |<----------------------'
+--------+

send: endpoint sends this frame
recv: endpoint receives this frame

H: HEADERS frame (with implied CONTINUATIONs)
PP: PUSH_PROMISE frame (with implied CONTINUATIONs)
ES: END_STREAM flag
R: RST_STREAM frame

流和帧的关系是:

  • 所有通信都在一个TCP连接上完成,这个连接可以承载任意数量的流
  • 每个流上面都有唯一标识符和可选的优先级信息,里面会承载要传递的消息
  • 每条消息都是一条逻辑HTTP信息(如请求或相应),有完整的HTTP语义,其中可能有一个或多个帧
  • 帧是最小的通信单位,承载着特定类型的数据,例如HTTP 标头、消息负载等等。帧可以交错发送,然后再根据帧头的数据流标识符进行组装

http2-frame

所有的帧以8字节的报头开始并且跟着0到16383字节长度的主体。帧格式如下:

1
2
3
4
5
6
7
8
9
 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| R | Length (14) | Type (8) | Flags (8) |
+-+-+-----------+---------------+-------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0...) ...
+---------------------------------------------------------------+

其中:

  • R:保留字段
  • Length:14位无符号整数的帧主体长度
  • Type:帧类型,它描述了剩余的帧报头和帧主体将如何被解释
  • Flags:为帧类型保留的8位布尔类型字段,根据不同帧类型赋予不同语义
  • Stream Identifier:31字节的流标识符(见StreamIdentifiers)。0是保留的,标明帧是与连接相关作为一个整体而不是一个单独的流。

请求与响应复用

在HTTP1.1中,客户端要想发起多个并行请求以提升性能,则必须使用多个TCP连接,这种对TCP效率低下的利用,在HTTP/2中得到改善。二进制分帧层将HTTP消息分解为互不依赖的帧,然后交错发送,最后再在另一端把它们重新组装起来。

http2-reusing

在上图中,流1和流3交错在同一个TCP连接上并行运行。这种机制带来了下面一些具体的提升:

  • 请求之间交错且互不影响
  • 响应之间交错且互不影响
  • 可以使用一个连接并行发送多个请求和响应
  • 不必再为了优化HTTP1.1性能做雪碧图、分片等骚操作
  • 一定程度上解决了线头阻塞问题

流控制

HTTP/2的流控制类似TCP,但是更为精细和更靠近应用层。借助HTTP/2流控制,可以实现在用户暂停一个大型视频流后,减少或阻塞视频里带来的HTTP流量,又或者中间代理匹配上下游流量速率。HTTP/2流控制提出了一些规则,但并没有指出特定算法,目标在于允许不需要协议改动的情况下改进流量控制算法。

  • 流量控制是逐跳的,而不是头尾端点的
  • 流量控制是基于窗口更新帧的。接收端广播自己准备在流及整个连接过程中接收的字节大小。这是一个信用为基础的方案。
  • 流量控制是有方向性的,由接收端全权掌握。
  • 流量控制窗口初始值是65,535字节,不过接收方可以设置一个更大的值
  • 帧类型决定了是否适用流量控制规则。目前只有DATA帧受流量控制
  • 不能被禁用
  • 通过使用WINDOW_UPDATE帧类型来实现

流优先级

HTTP/2标准允许每个数据流都有一个关联的权重和依赖关系:

  • 可以向每个数据流分配一个介于1至256之间的整数。
  • 每个数据流与其他数据流之间可以存在显式依赖关系。

优先级的目的是让客户端可以构建和传递“优先级树”,表明它倾向于如何接收响应。反过来,服务器可以使用此信息通过控制CPU、内存和其他资源的分配设定数据流处理的优先级。

http2-priority

数据流依赖关系通过将另一个数据流的唯一标识符作为父项引用进行声明;如果忽略标识符,相应数据流将依赖于“根数据流”。分配时,会尽可能先向父数据流分配资源,然后再向其依赖项分配资源。共享相同父项的数据流按其权重比例分配资源。在上图中,数据流B获得的资源是数据流A所获资源的三分之一。

新建流的终端可以在报头帧中包含优先级信息来对流标记优先级。对于已存在的流,优先级帧可以用来改变流优先级。

更详细规范参考RFC

帧类型

DATA

数据帧,类型0x0,传递和流关联的任意变量值长度的字节数据。例如,一个或多个数据帧被用来携带HTTP请求或者响应的载体。数据帧定义了以下标记:

  • END_STREAM (0x1) :用来表示当前帧是确定的流发送的最后一帧。设置这个标记时流进入到一种半封闭状态或者关闭状态。
  • END_SEGMENT (0x2) :表示是当前端的最后一帧。代理端绝对不能跨越多个端的边界来合并帧,转发帧的时候代理端必须保持片段的边界。
  • PADDED (0x8) : 位4用来表示Pad Length字段是可见的。

数据帧绝对需要与流相关联,且遵从流量控制。

HEADERS

报头帧,类型0x1,用来打开一个流,并携带头部片段。能在流打开或者半封闭(远程)的状态下发送。

1
2
3
4
5
6
7
8
9
10
11
+---------------+
|Pad Length? (8)|
+-+-------------+-----------------------------------------------+
|E| Stream Dependency? (31) |
+-+-------------+-----------------------------------------------+
| Weight? (8) |
+-+-------------+-----------------------------------------------+
| Header Block Fragment (*) ...
+---------------------------------------------------------------+
| Padding (*) ...
+---------------------------------------------------------------+

它有以下标记:

  • END_STREAM (0x1) :用来标识这是发送端对确定的流发送的最后报头区块。设置这个标记将使流进入一种半封闭状态。后面伴随带有END_STREAM标记的延续帧的报头帧表示流的终止。延续帧不用来终止流。
  • END_SEGMENT (0x2) :表示这是当前端的最后一帧。中介端绝对不能跨片段来合并帧,且在转发帧的时候必须保持片段的边界。
  • END_HEADERS (0x4) :表示帧包含了整个的报头块,且后面没有延续帧。不带有END_HEADERS标记的报头帧在同个流上后面必须跟着延续帧。
  • PADDED (0x8) :表示Pad Length字段会呈现。
  • PRIORITY (0x8) :设置指示专用标记(E),流依赖及权重字段将会呈现

PRIORITY

优先级帧,类型0x2。明确了发送者建议的流的优先级,它可以在任意时间的流中发送。优先级帧不包含任何标记(flag)。

1
2
3
4
5
6
7
 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|E| Stream Dependency (31) |
+-+-------------+-----------------------------------------------+
| Weight (8) |
+-+-------------+

RST_STREAM

类型0x3,允许流的立即终止。通常用来取消一个流,或表示有错误发生。绝不应该在idle状态下发出。

1
2
3
4
5
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Error Code (32) |
+---------------------------------------------------------------+

SETTINGS

设置帧,类型0x4。包含影响如何与终端通信的设置参数,并且用来确认这些参数的接收。设置帧必须由两个终端在连接开始的时候发送,并且可以由各个终端在连接生存期的任意时间发送。

PUSH_PROMISE

推送承诺帧,类型0x5。用来在流发送者准备发送流之前告知对等端。包含了终端准备创建的长流的31位无符号标记以及提供附加上下文的报头的集合。通常在服务器中使用。推送承诺的接收端可以选择给推送承诺的发送端返回一个与被承诺的流标识符相关的RST_STREAM标记来拒绝接收承诺流。

1
2
3
4
5
6
7
8
9
10
11
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| [Pad High(8)] | [Pad Low (8)] |X| Promised Stream ID (31) ...
+---------------+---------------+-+-----------------------------+
... Promised Stream ID | Header Block Fragment (*) ...
+-------------------------------+-------------------------------+
| Header Block Fragment (*) ...
+---------------------------------------------------------------+
| Padding (*) ...
+---------------------------------------------------------------+

PING

类型0x6。从发送端测量最小的RTT时间的机制,同样也是一种检测连接是否可用的方法。PING帧可以被任何终端发送,且必须在载体中包含一个8字节长度的任意数据。

GOAWAY

超时帧,类型0x7。通知远端对等端不要在这个连接上建立新流。超时帧可以由客户端或者服务端发送。发送后,可以针对新的流创建一个新的连接。这个帧的目的是允许终端优雅的停止接收新的流,但仍可以继续完成之前已经建立的流的处理。

1
2
3
4
5
6
7
8
9
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|X| Last-Stream-ID (31) |
+-+-------------------------------------------------------------+
| Error Code (32) |
+---------------------------------------------------------------+
| Additional Debug Data (*) |
+---------------------------------------------------------------+

32位的错误码中包含了关闭连接的原因。

WINDOW_UPDATE

窗口更新帧,类型0x8。用来实现流控制。

1
2
3
4
5
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|X| Window Size Increment (31) |
+-+-------------------------------------------------------------+

CONTINUATION

延续帧,类型0x9,用来延续一个报头区块。在END_HEADERS标记前,可以在HEADERS帧、PUSH_PROMISE帧以及CONTINUATION帧后接续任意数量的CONTINUATION帧。它包含一个flag:

  • END_HEADERS (0x4) : 设置指示这个帧的报头区块的终止

延续帧必须与流相关联。如果延续帧的相关流表示字段是0x0,终端必须响应一个类型为协议错误的连接错误。

服务器推送

http2-server-push

HTTP/2中的服务器推送打破了原来HTTP中的请求-响应语义(对原有语义也做了改进),支持服务器可以对一个客户端请求发送多个响应。在原先的HTTP1.1中我们可能会将重要资源内联到网页中,减少网络延迟,这实际上等同于HTTP/2中的强制推送。在HTTP/2中的服务器推送还有下面一些功能:

  • 推送的资源能被客户端缓存(服务器也只能推送可被缓存的资源)
  • 在不同页面之间可以重用
  • 可以由服务器设定优先级
  • 可以被客户端拒绝

服务器推送数据流由PUSH_PROMISE帧发起,需要先于请求推送资源的响应数据传输。实现上的策略是先于父响应(即,DATA 帧)发送所有PUSH_PROMISE帧,其中包含所承诺资源的HTTP头部。客户端接收到PUSH_PROMISE帧后,它可以根据自身情况选择接受拒绝(通过RST_STREAM帧)数据流。(例如,如果资源已经位于缓存中)

客户端完全掌控服务器推送的使用方式。客户端可以限制并行推送的数据流数量;调整初始的流控制窗口以控制在数据流首次打开时推送的数据量;或完全停用服务器推送。这些在HTTP/2连接开始时通过SETTINGS帧传输,可能随时更新。

头部压缩

在HTTP1.1中,头部数据使用以纯文本的形式传输,所占空间较大,在使用HTTP Cookie后,更是会达到上千字节。为了减少此开销和提升性能,HTTP/2使用专门设计的HPACK压缩格式压缩请求和响应头部,这种格式通过静态霍夫曼编码对传输的头部字段进行编码。HPACK要求客户端和服务器同时维护和更新一个包含之前见过的标头字段的索引列表,利用之前传输值的索引列表,我们可以通过传输索引值的方式对重复值进行编码,索引值可用于有效查询和重构完整的头部键值对。

hpack

作为一种进一步优化方式,HPACK压缩上下文包含一个静态表和一个动态表:静态表在规范中定义,并提供了一个所有连接都可能使用的常用HTTP头部字段列表;动态表最初为空,将根据在特定连接内交换的值进行更新。

早期版本的HTTP/2和SPDY使用的DEFLATE对头部进行压缩,但是在2012年夏天出现了CRIME这种安全攻击。因此,之后HTTP/2的头部压缩采用了专门设计的HPACK方案。在使用HPACK后,初次访问后的压缩率能达到70%~80%,甚至90%+。

支持度与调试

支持度上,主流浏览器服务器程序都已支持。你也可以访问这个网址体验HTTP/2和HTTP1.1在load大量图片时的延迟对比。

如果你想确认当前网页中的哪些请求是使用的HTTP/2,可以在chrome devTools下的network选项卡里查看“Protocol”列(未发现此列的可以在表头右键找到并勾选显示),其中HTTP/2将显示为h2。正如之前所说,支持HTTP/2的浏览器会和服务器使用特定协议协商,对于不支持HTTP/2的情况,会自动会退到HTTP1.1版本。

尽管HTTP/2使用二进制传输数据,然而浏览器为我们掩盖了实现细节。如果想要深入查看甚至是调试二进制分帧层的功能,如何去debug呢?

  • Wireshark
  • curl
  • h2i,不过这个好像已经不维护了

TLS调优

目前各大浏览器只在https://的基础上支持HTTP/2,即在TLS层之上的HTTP/2。多出的TLS的层也是会增加时延和成本的,具体涉及到的TLS握手、会话和加密套件协商过程还有优化空间,如减少证书层级、减少证书大小等。其余优化方向可以查看参考中一些文章介绍。

之前的优化还应该继续用么

继续保持的

  • 减少DNS查询
    • 减少域名
    • 启用预读:dns-prefetch
  • 使用CDN
  • 避免重定向
  • 资源压缩
    • 代码压缩(JS、HTML、CSS)
    • 资源压缩(图片、字体、音频、视频)
    • 文本压缩(Gzip)
  • 使用缓存

不再需要的

  • 分片与域名散列:HTTP/2对于一个域名只使用一个TCP连接,分片反而会浪费资源,同时也会影响流控制、头部压缩的表现。
  • 资源打包合并:HTTP/2支持多路复用,资源合并会降低缓存利用率,且会让开发流程更复杂。(snowpack了解一下)
  • 资源内联:可以由服务器推送解决这类需求,资源内联一方面无法缓存,另一方面会让页面代码更大

常见问题

  • Q: 既然HTTP/2是在SPDY工作基础上设计的,那HTTP/2推出后,SPDY还使用吗
  • A: Google公开声明了他们会在2016年移除Chrome里对SPDY和NPN的支持,并且极力推动服务器迁移至HTTP/2。2016年2月他们声明了SPDY和NPN会在Chrome 51之后被移除。
  • Q: 这个协议是否只对大型网站有效
  • A: 由于缺乏内容分发网络,小网站的网络延迟往往较高,而多路复用的能力可以极大的改善在高网络延迟下的体验。
  • Q: 基于TLS让速度变得更慢
  • A: 正如上一节提到的,TLS的握手确实增加了额外的开销,也有越来越多的方案提出来减少TLS往返的时间。TLS同时也会更多消耗CPU等资源,更多例子可见istlsfastyet.com。不过一方面HTTP/2并不强制要求基于TLS,另一方面HTTP/2带来的性能提升使得即使基于TLS,通常也会比HTTP1.1更快
  • Q: 为什么不使用文本传输
  • A: 的确,如果可以直接读出协议内容,那么调试和追踪都会变得更为简单。但是二进制带来的灵活度更高,何况浏览器会自动帮你解析。
  • Q: 看起来,HTTP1.1中的一些短板并没有改彻底
  • A: 实际上,设计HTTP/2之初的目标就包括向前兼容HTTP/1.1的范式,来保证升级协议也不用重写底层的很多东西。老的HTTP功能,如协议头、状态码、可怕的Cookie,这些都保留了。性能优化更多通过增加了一个中间分帧层解决的。
  • Q: 目前使用的广泛程度如何
  • A: 在2015年年底大多数浏览器就已经支持HTTP/2,目前约96%的浏览器支持HTTP/2,同时约46%的网站支持HTTP/2。

后续

  • 官网在给出HTTP/2规范时,也曾预计要10年时间和HTTP1.1并存,在这个期间,Web优化的思路也可能会有调整
  • TLS1.3。2020年2月的RFC8740中给出了基于TLS1.3的HTTP/2的实现建议。
  • 既然TCP容易遇到线头阻塞问题,那么能不用使用UDP呢?Google提出的QUIC(Quick UDP Internet Connection)它在很大程度上继承了SPDY的衣钵。QUIC可以理解成TCP + TLS + HTTP/2替代实现。
  • 2018年10月,互联网工程任务组HTTP及QUIC工作小组正式将基于QUIC协议的HTTP(英语:HTTP over QUIC)重命名为HTTP/3以为确立下一代规范做准备。

参考

正文:《经济学原理》 - 宏观经济学原理笔记

宏观经济学的数据

一国收入的衡量

  • 微观经济学:研究家庭和企业如何做出决策,以及它们如何在市场上相互影响
  • 宏观经济学:研究整体经济现象,包括通货膨胀、失业和经济增长
  • 国内生产总值(gross domestic product,GDP):在某一既定时期一个国家内生产的所有最终物品和服务的市场价值
  • 消费:家庭处购买新住房外用于物品和服务的支出
  • 投资:用于资本设备、存活、建筑物的支出
  • 净出口:外国人对国内生产物品的支出减国内居民对外国物品的支出
  • 名义GDP:按现期价格评价的物品和服务的生产
  • 真实GDP:按不变价格评价的物品和服务的生产
  • GDP平减指数:用名义GDP与真实GDP的比率乘以100得到的物价水平衡量指标

生活费用的衡量

  • 消费物价指数(CPI):普通消费者所购买的物品和服务的总费用的衡量指标
  • 通货膨胀率:从前一个时期以来,物价指数变动的百分比
  • 生产物价指数:企业所购买的一揽子物品与服务的费用的衡量指标
  • 指数化:根据法律或合同按照通货膨胀的影响对货币数量的自动调整
  • 名义利率:通常公布的、为根据通货膨胀影响校正的利率
  • 真实利率:根据通货膨胀影响校正过的利率

长期中的真实经济

生产与增长

  • 生产率:每单位劳动投入所生产的物品和服务的数量
  • 收益递减:随着投入量的增加,每一单位额外投入得到的收益减少的特性
  • 追赶效应:开始贫穷的国家倾向于比开始富裕的国家增长更快的特征

储蓄、投资和金融体系

  • 金融体系:经济中促使一个人的储蓄和另一个人的投资相匹配的一组机构
  • 金融市场:储蓄者可以借以直接向借款者提供资金的金融机构
  • 债券:一种债务证明书
  • 股票:企业部分所有权的索取权
  • 金融中介机构:储蓄者借以间接向借款者提供资金的金融机构
  • 共同基金:向公共出售股份,并用收入来购买股票和债券资产组合的机构
  • 国民储蓄(储蓄),用于消费和政府购买后剩下的一个经济中的总收入
  • 私人储蓄:家庭支付税收和消费后剩下的收入
  • 公共储蓄:政府在支付支出后剩下的税收收入
  • 预算盈余:税收收入大于政府支出的余额
  • 预算赤字:政府支出引起的税收收入短缺
  • 可贷资金市场:想储蓄的人借以提供资金、想借钱投资的人借以借贷资金的市场
  • 挤出:政府借款引起的投资减少

金融学基本工具

  • 金融学:研究人们如何在某时期内做出关于配置资源和应对风险的决策的学科
  • 现值:用现行利率产生一定量未来货币所需要的现在货币量
  • 终值:现行利率既定时,现在货币量将带来的未来货币量
  • 复利:货币量的累积,赚得的利润停留在账户中赚取更多利息
  • 风险厌恶:不喜欢不确定性
  • 多元化:通过用大量不相关的小风险代替一种风险来降低风险
  • 企业特有风险:只影响单独公司的风险
  • 市场风险:影响股市上所有公司的风险
  • 基本面分析:为决定一家公司的价值而对其会计报表和未来前景进行的研究
  • 有效市场假说:认为资产价格反映了关于一种资产价值的所有公开、可获得的信息的理论
  • 信息有效:以理性方式反映所有可获得信息的关于资产价格的描述

失业

  • 劳动力:就业者和失业者的工人总数
  • 失业率:劳动力中失业者所占比例
  • 劳动力参工率:劳动力占成年人口的百分比
  • 自然失业率:失业率曲线围绕波动的正常失业率
  • 周期性失业:失业率对自然失业率的周期性背离
  • 丧失信心的工人:想工作但已放弃寻找工作的人
  • 摩擦性失业:由于工人寻找符合自己嗜好和技能的工作需要时间带来的失业
  • 结构性失业:由于劳动市场提供的工作岗位不足或工资高于均衡工资引起的失业
  • 失业保险:工人失业时,位置提供部分收入保障的政府计划
  • 工会:与雇主就工资、津贴、工作条件进行谈判的工人协会
  • 集体谈判:工会和企业就就业条件达成一致的过程
  • 效率工资:企业为了提供工人生产率而支付的高于均衡水平的工资

长期中的货币与物价

货币制度

  • 货币:经济中人们经常用于向其他人购买物品和服务的一组资产
  • 交互媒介:卖者在购买物品和服务时给予卖者的东西
  • 计价单位:人们用来表示价格和记录债务的标准
  • 价值储藏手段:人们用来把现在的购买力转变为未来购买力的东西
  • 流动性:一种资产兑换为经济中交换媒介的容易程度
  • 商品货币:以由内在价值的商品为形式的货币
  • 法定货币:没有内在价值、由政府法令确定通货使用的货币
  • 通货:公众手中持有的纸币钞票和铸币
  • 中央银行:为了监管银行体系和调节经济中货币量设计的机构
  • 准备金:银行得到但是没有贷出去的存款
  • 部分准备金银行:只把部分存款作为准备金的银行
  • 准备金率:作为准备金持有的存款比例
  • 货币乘数:银行体系有1单位准备金产生的货币量
  • 银行资本:银行的所有者投入机构的资源
  • 杠杆:将借到的货币追加到投资的现有资金上
  • 杠杆率:资产和银行资本的比率
  • 资本需要量:政府管制确定的最低银行资本量
  • 公开市场操作:美联储买卖美国政府债券
  • 贴现率:美联储向银行发放贷款的利率
  • 法定准备金:银行必须根据其存款持有的最低准备金量的规定
  • 联邦基准利率:银行向另一家银行进行隔夜贷款时的利率

货币增长和通货膨胀

  • 货币数量论:一种认为可得到的货币量决定物价水平,可得到货币量增长率决定通货膨胀率的理论
  • 名义变量:按货币单位衡量的变量
  • 真实变量:按实物单位衡量的变量
  • 古典二分法:名义变量和真实变量的理论区分
  • 货币流通速度:货币易手的速度
  • 通货膨胀税:政府通过创造货币而筹集的收入
  • 费雪效应:名义利率对通货膨胀率所进行的一对一的调整
  • 皮鞋成本:当通货膨胀鼓励人们减少货币持有量时所浪费的资源
  • 菜单成本:改变价格的成本

面向开放经济的宏观经济学

基本概念

  • 封闭经济:不与世界上其他经济交易的经济
  • 开放经济:与其他经济交易的经济
  • 出口:在国内生产国外销售的物品和服务
  • 进口:在国外生产国内销售的物品和服务
  • 净出口:一国出口值减进口值,又称贸易余额
  • 贸易赤字:进口大于出口
  • 资本净流出:本国居民购买的外国资产减去外国人购买的本国资产
  • 名义汇率:用一国通货交换另一国通货的比率
  • 升值:能购买到外国通货量衡量的一国通货的价值增加
  • 贬值:能购买到外国通货量衡量的一国通货的价值降低
  • 购买力平价:一种认为任何一单位通货应该能在所有国家买到等量物品的汇率理论

宏观经济理论

  • 贸易政策:直接影响一国进口或出口的物品与服务数量的政府政策
  • 资本外逃:一国资产需求大量且突然地减少

短期经济波动

解释短期经济波动

  • 衰退:真实收入下降和失业增加的时期
  • 萧条:严重的衰退
  • 自然产出水平:一个经济在长期中当失业处于正常时达到的物品与服务的生成水平
  • 滞涨:产量减少而物价上升的时期

货币政策和财政政策对总需求的影响

  • 流动性偏好理论:凯恩斯认为,利率的调整使货币供给与需求平衡
  • 财政政策:政府决策者对政府支出和税收水平的确定
  • 乘数效应:扩张性财政政策增加收入的同时增加消费支出引起总需求的额外变动
  • 挤出效应:扩张性财政政策引起利率上升,从而减少投资支出引起的总需求减少
  • 自动稳定器:经济进入衰退时,决策者不必采取任何行动就可以刺激总需求的财政政策变动(如税制、政府支出)

通货膨胀和失业间的短期权衡

  • 菲利普斯曲线:表示通货膨胀和失业间短期关系的曲线
  • 自然率假说:认为无论通货膨胀如何,失业都要回到正常率或自然率的观点
  • 牺牲率:通货膨胀降低一个百分比过程中每年产量损失的百分比数
  • 理性预期:人们能充分利用他们可以获取到的全部信息,如政策信息等,用来预测未来

宏观经济学中的数据

一国收入的衡量

微观经济学研究家庭和企业如何做决策,宏观经济学研究整个经济,本章主要考察国内生产总值(GDP)

GDP同时衡量着经济中所有人的总支出和总收入。因为对于一个整体经济来说,收入必定等于支出。

衡量方式

国内生产总值是在一个既定时期一个国家内生产的所有最终物品和服务的市场价值

  • 既定时期:一般是一个季度公布一次,统计时会调整季度数据,避开季节性周期
  • 一个国家内:GDP衡量的生产价值局限于一个国家的地理范围内。即外国人在本国的工作产出会计入GDP,但是本国人在外国的产出则不会
  • 所有:GDP包括经济中生产并在市场上合法出售的所有物品,如家庭内生产和消费没有进入市场的这种则不会被计入
  • 生产的:不包括过去生产的物品交易,比如二手车
  • 最终:GDP只包括最终物品,而不包含中间物品。当然如果生产出来的中间物品没有被使用,而是增加了企业存货,这时可以暂时算作最终物品
  • 物品和服务:实体物品和无形服务
  • 市场价值:市场价格能反映物品的价值,如鱼子酱就是比汉堡包要贵

上面这种描述是从支出出发,也可以从收入角度出发。还有几个和GDP类似的指标:

  • GNP:国民生产总值,一国永久居民赚到的收入
  • NNP:国民生产净值,是GNP减去折旧
  • 国民收入:一国居民在物品和服务生产中赚到的总收入,几乎和NNP相等
  • 个人收入:家庭和非公司制企业得到的收入,和国民收入不同,它不包括留存收益——公司获得但是没有支付给所得者的收入
  • 个人可支配收入:个人收入扣减对政府的义务后剩下的收入,如个税、非税收支付

组成部分

Y = C + I + G + NX

其中Y是GDP,C是消费,I是投资,G是政府购买,NX是净出口。

  • 消费:家庭除购买新住房外用于物品和服务的支出,也包括教育支出。
  • 投资:对用于未来生产更多物品和服务的物品的购买,把汗家庭用于购买新住房的支出
  • 政府购买:包括地方、州、政府用于物品和服务的支出,一部分“转移支付”,如社会保障补助,不计入考虑
  • 净出口:外国与国内生产的物品的购买减去国内对外国物品的购买

真实GDP和名义GDP

GDP的增长来自两种形式:

  • 生产了更多的物品的服务
  • 物品和服务的价格增高

真实GDP去掉了物价水平的增长部分,使用固定在过去水平上的价格评价现期生产。真实GDP首先需要选择一个基年,然后用基年的价格计算各年的物品和服务的价值。由于真实GDP不受价格变动的影响,所以只会反映产量的变动。真实GDP作为衡量经济福利的指标要优于名义GDP。

对应的有GDP平减指数的概念,用于衡量物价水平。它等于名义GDP除以真实GDP再乘以100。通常我们用通货膨胀来描述经济中整体物价水平上升的情况。通货膨胀率是一个时期到下一个时期某个物价水平衡量指标变动的百分比。它可以由两年的GDP平减指数推算出来。

GDP能衡量幸福吗

GDP是个好指标,但是不是全面的指标。大多数人都希望有更高的收入和支出,人均GDP自然成为平均经济福利的衡量指标。然后在闲暇、环境质量、收入分配等方面,GDP并不能作为唯一的衡量因素。不过,GDP倒是衡量我们追求这些方面的能力。

生活费用的衡量

消费物价指数可以比较好地反映消费者购买的物品和服务,是较常用的通货膨胀指标。

消费物价指数(CPI)

消费物价指数(Customer Price Index,CPI)是普通消费者所购买的物品和服务的总费用的衡量指标。一般由国家统计局统计并发布,包含下面几步:

  • 确定“篮子”:即根据购买数量的多少,确定哪些物价对普通消费者是最重要的,订下不同物品的权数
  • 找出价格:确定时间点上的物品物价
  • 计算不同权数下所有物品的总费用
  • 选择基年并计算指数
  • 通过CPI的增长率确定通货膨胀率

一般在统计CPI的同时,也会统计生产物价指数,即衡量企业而不是消费者购买的一篮子物品与服务的费用,由于企业最终会把这些费用以更高价格转移给消费者,它对于预测CPI的变动是有意义的。在使用CPI的时候会遇到3个问题:

  • CPI无法衡量消费者的替代偏好,即使用便宜的物品替代昂贵的物品
  • CPI无法衡量新物品的引进带来的生活费用下降
  • CPI无法衡量质量的变动

CPI和GDP平减指数比较相似,都可以衡量物价的变化,但由于计算方式的不同,两个数字还是有所差异:

  • GDP平减指数反映了国内生产的物品和服务的价格,而CPI反映消费者购买的物品和服务,如波音生产的飞机会影响GDP,但不会影响CPI;石油价格的上涨对CPI影响很大,但是对GDP影响较小
  • GDP平减指数在加权时跟现期生产的所有物品和服务的比例有关,而CPI则是通过固定篮子的物品和服务的价格来计算

根据通货膨胀校正经济变量

  • 衡量物价水平的目的之一是能让我们比较不同时期的美元数字。使用物价水平指数换算就可以比较不同时代明星的薪水或是电影的票房。
  • 当某货币量根据法律或合同自动按物价水平变动校正时,成为通货膨胀的指数化
  • 储蓄时,名义利率只衡量货币量的变动,真实利率是根据通货膨胀校正后的衡量货币购买力变动的利率。除非通货紧缩,否则名义利率永远大于真实利率
    • 真实利率 = 名义利率 - 通货膨胀率

长期中的真实经济

生产与增长

一国的生活水平取决于它生产物品和服务的能力。在《鲁滨逊漂流记》中,鲁滨逊捕获鱼类的生产率直接影响他能享用多少食物。生产率取决于下面几个因素:

  • 人均物质资本,即人均用于生产物品和服务的设备和建筑物存量,或简称为资本。工具越多,越高级,自然可以生产更多更好的产品。资本的重要特征是,它是一种生产出来的生产要素
  • 人均人力资本,指工人通过教育、培训和经验获得的知识和技能,可以通过学习或培训得到,实际上,学生的日常学习就是用来未来生产的人力资本
  • 人均自然资源,即自然界提供的用于生产物品和服务的投入
  • 技术知识,即对生产物品和服务的最好方法的了解。技术知识是指社会对世界如何运行的理解,而人力资本是把这种理解传递给劳动力的资源消耗

以上几点可以构成生产函数:Y=AF(L,K,H,N)。其中:

  • L指劳动量
  • A代表生产技术
  • K代表物质资本
  • N代表自然资源

去掉规模带来的收益能得到Y/L=AF(1, K/L, H/L, N/L)。即生产率取决于技术知识、人均物质资本、人均人力资本和人均自然资源。

经济增长与公共政策

上面提到的生产率的影响因素,那么那些政策有助于提高生产率和生活水平呢?

  • 储蓄和投资:即减少现期资源的消费,用于投资资本的生产。不过资本会受到收益递减追赶效应的影响,即随着资源的投入,边际产出越来越少,且贫穷的国家在同样政策下的增长更高
  • 来自国外的投资:一种是由外国实体拥有并经营的资本投资,叫做外国直接投资,或者由外国实体购买国内公司的股票,叫做外国有价证券投资。这种投资可以有效增加一国的资本存量。因此大多数穷国都鼓励吸引外国投资
  • 教育:属于一种人力资本投资,且具有正外部性,即一个人的行为对旁观者福利有积极影响。不过,人才外流是穷国面临的一个问题
  • 健康与营养:健康的身体可以使工人获得更高的生产率,从而促进经济增长,而经济增长又会改善人们的健康状况,形成一个良性循环
  • 产权和政治稳定:尊重产权即保护人们对自己拥有资源行使权力的能力,不尊重产权的环境下,人们不糊积极地利用资源;类似地,稳定的政治可以比较好地保护产权。经济繁荣也部分取决于政治繁荣。
  • 自由贸易:外向型经济比内向型经济更容易提高生活水平
  • 研究与开发:对技术知识研究的鼓励或者资助
  • 人口增长:正面上,人口增长带来劳动力规模提升,且消费人群提升,同时从事技术研究的人更多;反面上,导致了自然资源紧张(这个可以通过创造新技术改善),稀释了资本存量,比如人力资本。

储蓄、投资和金融系统

前面提到了,储蓄和投资是一国长期经济增长的关键因素。然后储蓄和投资间是需要协调的,有一些人为未来考虑将收入储蓄起来,也有一些人想借钱为新的增长中的企业投资筹资。金融机构应运而生。

美国经济中的金融机构

金融体系会使经济中的稀缺资源从储蓄者流动到借款者的手中。金融体系就由帮助协调储蓄者和借款者的各种金融机构组成。这些机构可以分为两类:金融市场金融中介机构

金融市场

金融市场即想储蓄的人可以借以直接向想借款的人提供资金的机构。它包含债券市场股票市场

  • 债券市场:债券即借款人向债券持有人负有债务的证明,通常会说明到期日和利率,在到期日时偿还债券利息以及本金。债券间有3个不同的特性:
    • 期限:从短期债券到长期债券甚至永久债券(只付利息,不偿还本金)。通常任务长期债券风险更高,所以利率也通常更高
    • 信用风险:即拖欠的可能性。国家发型的债券信用风险较低,利率一般也比较低;状况不稳定公司发行的垃圾债券的利率则很高。
    • 税收待遇:绝大多数债券都属于应纳税收入,而政府发行的债券则一般不需缴纳所得税
  • 股票市场:股票代表企业的部分所有权,也代表对企业获得利润的索取权。不同于债务融资,出售股票的筹集资金方式称为权益融资。和债券相比,股票会面临公司发展波动的不确定性,风险更高,然而潜在收益也会更高。公司在向公众出售股份而发行股票后,股票持有者可以在有组织的股票市场上交易。股票市场上股票的价格由股票本身的供求状况决定,即人们对公司未来盈利性的预期。
    • 股票指数:计算出来的一组股票价格的平均数,如道琼斯指数由美国最主要的30家公司平均而来,标准普尔500指数由500家主要公司股票价格计算得到

对于股市观察者来说,股票的价格、红利(公司把一些利润支付给股东,没有支付的利润称为留存收益,用于增加投资)、价格-收益比都是需要关心的关键数字。

金融中介机构

储蓄者可以借以中介机构向借款者提供资金。下面分析两种中介机构:

  • 银行:从想储蓄的人手里吸收存款,并用存款向想借款的人发放贷款,从中收取利润。同时,银行借助存款帮助创造出人们借以作为交换媒介的特殊资产,如信用卡、支票等
  • 共同基金:向公众出售股份,并用收入购买股票和债券组合。它的首要优点是可以使钱不多的人也可以进行多元化投资,其次可以使普通人获得专业资金管理者的服务。第二点会受到金融学家的质疑。在资金管理者都密切关注每家公司的前景时,跑赢市场是很困难的。实际上,有种指数基金的共同基金,按一个既定的股票指数购买所有股票,它的表现甚至更好些。

国民收入账户中的储蓄和投资

首先回忆一个恒等式:Y=C+I+G+NX。为了更好分析,我们考虑一个封闭经济,即NX为0的经济。换算一下得到Y-C-G=I。我们把左边算式即总收入减去消费和政府购买的结果称为国民储蓄,又叫储蓄,简写为S,因此S=I,即储蓄等于投资

假设T为政府以税收形式从家庭得到的数量减去转移支付(社保和福利)形式返回家庭的数量。则有S=(Y-T-C)+(T-G)。其中,(Y-T-G)称为私人储蓄,即家庭支付了税收和消费后剩下的收入,(T-G)称为公共储蓄,即政府在支付其指出后剩下的税收收入。T大于G时,政府得到的资金大于其指出而有预算盈余,T小于G时,政府会有预算赤字

可贷资金市场

可贷资金是指人们选择储蓄并贷出而不是用于消费的所有收入

  • 可贷资金的供给来自有额外收入想储蓄和贷出的人。贷出可以直接购买债券或者借助银行进行。这种情况,储蓄是可贷资金供给的来源。
  • 可贷资金的需求来自希望借款进行投资的家庭和企业,可以用来用抵押贷款购置住房、或者企业借款购买新设备、建设新工厂。这种情况下,投资是可贷资金需求的来源。

利率可以视为贷款的价格。综合上面可贷资金的供需,可以绘制出可贷资金的供求图。利率会自行调整使可贷资金供给、需求达到平衡。在分析中的“利率”指“真实利率”。

  • 储蓄激励。在这种激励下,借款成本较低,家庭和企业倾向于更多借款为投资筹资,从而利率下降且投资增加
  • 投资激励。比如对投资付税减免政策。此时会利率上升且储蓄增加
  • 政府预算赤字,赤字减少了国民储蓄,也就减少了可用于家庭和企业筹资的可贷资金的供给。由于政府借款引起的投资减少也被称为挤出。最终导致利率上升和投资减少
  • 政府预算英语,相反会增加可贷资金的攻击,减低利率并刺激投资

金融市场也是市场的一种,可贷资金的价格——利率——也由供求的力量决定。金融市场的一个特点是,它有联系着现在和未来的重要作用。

金融学的基本工具

现值

现值,即用当下利率产生给定未来货币量所需的当下货币量。是基础的用来衡量货币时间价值的工具。今天的钱永远比未来同样数量的钱更值钱。寻找未来货币量对应到当下货币量的过程,被称为贴现。计算现值时,会用到复利的概念,根据70规则,如果变量每年的增长率为x%,那么大约70/x年后,变量会翻一番。

风险管理

经济学家用效用的概念衡量一个人对福利或满足的主观衡量,效用函数会体现出边际递减的性质。即拥有的财富越多,获得等量财富得到的效用越少。同时,也由于边际递减性质,几乎所有人都有风险厌恶的特征。即不愿冒着失去x元的风险赌可能获得x元的可能性。那么怎么应对这种风险厌恶呢?

  • 保险市场,购买保险,用保险费的方式让保险公司帮你承担风险。保险的作用并不是消除风险,而是能够更有效的分摊风险。保险市场受到两个制约分摊能力的因素影响:
    • 逆向选择:高风险的人申请保险的几率更高
    • 道德风险:购买保险后,人们规避风险的激励变小了
  • 企业特有风险多元化:即选择更丰富的不相关的股票组合,避免受到一家公司的风险影响。也即“不要把所有鸡蛋都放在一个篮子里”。需要注意的是,多元化只能解决企业特有风险,不能消除市场固有风险,比如金融危机。

人们可以在收益和风险间选择取舍,股票收益更高,但是标准差也更大。政府债券等安全替代品基本没有标准差,因此收益也更低。

资产评估

OK!我们现在对时间以及风险都有了了解,那么怎样去购买股票呢?股票的价格时怎么受供给和需求控制的呢?我们在购买股票的时候,更希望所购买的股票价格低于其价值

  • 基本面分析,即对一家公司做足够详尽的分析,以确定其价值。你可以自行阅读公司年报来做研究,或者听从专业分析师的建议,再或者购买共同基金让它来帮你进行基本面分析
  • 有效市场假说,这种假说认为股市上的所有上市公司信息足够透明,也处于基金管理者的跟踪之下,他们的工作就是在价格低于价值时买进,高于时抛出;从而让价格稳定在价值附近。另外,供求均衡也决定了市场价值,即所有股票都已被公正的估价。根据这一理论,股票市场表现出信息有效,它反映了关于资产价值可获得的所有信息。从而股票价格应该是随机游走的,因为有关股票价格的所有信息都已在当下体现在价格上了。

有效市场假说最有力的证据来自指数基金的业绩。即按照既定股票指数购买所有股票的共同基金。它的表现大体上优于经过精心挑选的股票组合的共同基金。普通共同基金的频繁交易也导致了更多的交易费用。关于金融市场的研究证实了,胜过市场是极为困难的

在有效市场假说外,也有经济学家认为,非理性的心理因素也会影响资产的价格,当你评价一个股票时,你不仅必须估算企业的价值,还有估算其他人认为企业未来值多少。

失业

很显然,那些想工作但是找不到工作的人对经济中物品和服务的生产没有做出贡献。失业对于GDP自然是有所影响的。失业问题中包含自然失业率周期性失业,前者是经济中长期存在的失业量。

在政府衡量失业率时,会同时统计就业者失业者非劳动力

  • 就业者:作为得到报酬的员工工作的人,在自己企业工作得到报酬的人,在家族企业工作但没有报酬的人等。不论是全职还是兼职都计算在内。
  • 失业者:能够工作且有努力找工作,但没有找到的人,还包括被解雇正在等待重新回到工作岗位的人
  • 非劳动力:上面两类以外的人,如全日制学生、退休人员、家务劳动者

劳动力由就业者和失业者组成。失业率也等于失业者和劳动力的比值。劳动率参工率等于劳动力和成年人口的比值。在美国的统计结果中,最佳工作年龄的女性参工率低于男性,黑人失业率更高,青少年参工率低很多,失业率也更高。随着时代的变化,新技术和社会态度的变化让女性的参工率渐渐向男性靠拢。

衡量失业其实并不仅仅是失业率那么简单。一方面,有丧失信心的工人和避免纳税等人群存在,会影响失业率指标的准确性。我们同事也要具体细分失业人群。大多数情况下,大多数失业是短期的,然而既定时间段内观察到的失业都是长期的。那么为什么会有人一直失业呢?在一个理想的劳动市场,工资会调整劳动的供给和需求,并保证工人充分就业。但是这只是宏观的结论,对于具体的每个人,可能有因为个人偏好和技能不匹配引发的摩擦性失业,另外,由于某些原因引发的工作岗位不足、工资高于均衡水平(最低工资法、工会、效率工资),也会带来结构性失业

寻找工作

经济中总存在失业一方面和寻找工作有关。因为部门转移或经济发生结构性变化,总会带来摩擦性失业。摩擦性失业是不可避免的,因为经济总处在变化之中。针对这种情况,政府可以组织就业培训,或干脆直接发布职位。但也有人认为应该把决策交给工人和雇主。

美国的失业保险政策可以给享有的普通工人在26周内提供以前工资50%的补助。这提高了工人与工作相匹配的能力,但这一方面也反方面激励人们不认真找工作,和不在乎雇主对工作保障的保证。

最低工资

最低工资在少数情况下,会高于劳动市场供需平衡的均衡价格(绝大多数情况下,工人的工资都大大高于最低工资)。因此,最低工资的存在值解释了那些工资极低的劳动力存在结构性失业的可能性。这些工人通常都是年轻人、受教育少的人、从事兼职的人。

工会和集体谈判

工会作为工人的一种卡特尔,代表工人和雇主就津贴、工资、工作条件等进行谈判,并以罢工作为抗议手段。经过调查发现,参与工会的工人得到的收入比类似条件下,不参与工会的工人高出10%-20%。当工会把工资提高到均衡水平之上时,劳动供给增加、需求减少,引发结构性失业。这部分因此失业的劳动力情况反而变差。政府对于工会出台了一些政策和法律加以保护。

至于工会对于经济是好是坏,没有准确的答案,有人说工会对于工人的收益是以另一些工人的损失为代价的,也有人说工会可以平衡企业的市场势力,保护工人免受企业所有者的摆布。

效率工资理论

均衡工资理论告诉我们,如果工资高于均衡水平,企业的经营会更有效率。这也是导致结构性失业的一个原因。乍一听这个理论和我们的第一印象相反。但实际高工资可以提高企业的工人效率。

  • 工人健康,高工资可以提高工人身体素质
  • 工人流动率,高工资下,更少工人选择辞职,降低了工人流动率;企业雇佣和培训新工人也是有成本的,且新工人一开始的生产率也不如有经验的工人高
  • 高素质工人,重赏之下必有勇夫,同样的,高工资能吸引更好的工人来申请工作。
  • 工人忠诚度,高工资使工人更渴望保持他们的工作,从而给予工人付出最大努力的激励。

长期中的货币与物价

货币制度

货币的含义

在没有货币这种被大众接受的媒介出现时,你们不得不依靠物物交换,这种经济需要需求的双向一致性,即刚好彼此都有对方想要的物品或服务;货币在经济中有着相当重要的作用。

货币是经济中人们经常用于相互购买物品和服务的一组资产。它有着多种职能:交换媒介计价单位价值储藏手段。经济中通常用流动性来说明一种资产兑换为经济中交换媒介的容易程度,如货币的流动性是最强的,而房产、艺术品就比较弱。人们决定以不同形式持有自己财富时,会努力在流动性和价值储藏手段上寻求平衡。货币在流动性上很好,但是作为价值储藏手段就不大行了。

货币大体上可以分为商品货币法定货币两类:

  • 商品货币:货币本身有内在价值,如黄金
  • 法定货币:由政府法令确定的货币,没有内在价值

经济中流通的货币量称为货币存量,它包含通货(手中持有的纸币和铸币)、活期存款等。在美国有美联储负责管理法定货币制度。它主要有两个工作:

  • 管制银行并保证银行的正常运作,充当银行的最后贷款者,保证银行体系的稳定
  • 控制经济中可以得到的货币量,又称货币供给,从而调节经济。美联储的主要工具是公开市场操作——买卖美国政府债券

银行和货币供给

你持有的货币量除了通货还包含你的活期存款。因此银行也会影响货币供给。在一家得到不贷出的银行里,准备金即存款,且准备金率为100%。这种情况下,银行不增加货币供给。如果银行将一部分存款贷出来收取利息,准备金率则小于1,这种银行也叫作部分准备金银行。准备金率是由政府管制和银行政策一同制定的。在有部分存款被贷出后,增加的货币量以贷款人的负债形式存在,整体上看增加了货币量。最终通过准备金可以产生的货币量等于准备金乘以准备金率的倒数。这个系数也被称为货币乘数,即1单位准备金所产生的货币量。准备金率越高,银行贷出的款越少,货币乘数也越小。准备金率为1时,货币乘数为1,银行不贷款,也不创造货币。

上面的讨论是一种简单的场景,实际上银行的资产负债表上,还会包括银行向其所有者发行的股票中的得到的银行资本,以及发行债券得到的债务,利用存款、债务和自身资本,银行在保留一定准备金时,可以向外贷款或购买有价证券。经济中许多经营活动依赖杠杆,即将借到的货币追加到用于投资的现有资金上。银行正是利用了杠杆。银行的杠杆率是银行总资产和银行资本的比值。在下面的假设中,银行资本只有50,剩下的部分用过吸收存款和发行债券得到。杠杆率为20,。资产价值5%的增加就会使所有者权益增加100%,相反如果资产价值下降超过5%,银行的资本就会减少到低于负债,从而破产

1
2
3
4
5
    资产         负债和所有者权益
——————————————————————————————————
准备金 200 | 存款 800
贷款 700 | 债务 150
有价证券 100 |资本(所有者权益) 50

银行管制者要求银行持有一定量资本,保证银行能偿还储户的存款(不依赖政府帮助情况下)。

美联储控制货币的工具

美联储主要通过影响准备金量影响准备金率来影响货币乘数。

  • 影响准备金量:可以通过公开市场操作,即公开买卖政府债券,增大和减小货币供给;也可以通过贴现窗口向银行发放贷款,贷款的利率被称为贴现率。提高和降低贴现率分别会减少和鼓励向美联储借款,从而减少和增加货币供给
  • 影响准备金率:可以通过改变法定准备金规定银行持有的最低准备金量,由于许多银行超额持有准备金,这个方法现在使用不多;还可以通过支付准备金利息,即以美联储存款的方式持有准备金时,向银行支付利息。

在实际场景中,美联储并不能控制家庭选择以存款的方式持有的货币量,以及不能控制银行选择的贷款量,所以经济中的货币量部分取决于储户和银行家的行为。比如银行挤兑。现在,银行挤兑已经不是美国银行体系或美联储的主要问题,因为联邦存款保险公司(FDIC)保证大多数银行存款的安全。储户确信即使银行破产,他们的存款也将完好无损。

联邦基金利率

联邦基金利率即银行向另一家银行进行隔夜贷款时的利率。这种贷款是短期的,通常只有一夜。它和贴现率有所不同,一个是向银行借款,一个是向美联储借款,一般在银行缺乏准备金时,哪个方法便宜用哪个。由于金融体系各部分高度相关,联邦基金利率虽然只和银行借钱有关,但实际上也和其他类型贷款利率密切相关。美联储会定期开会确定联邦基金利率的目标,并通过公开市场操作等方式去实现该目标。

货币增长和通货膨胀

人们日常感受到的物价升高是通货膨胀的一种体现,相反还有通货紧缩。在微观经济学第一章中的经济学十大原理之一:政府发行货币过多时,物价上升。通货膨胀的成本可能并不像民众想象的那么大。

古典通货膨胀理论

古典通货膨胀理论可以用来说明物价水平和通货膨胀率的长期决定因素。物价水平的上升从另一个角度理解即每单位货币的价值下降。因此物价水平也可以看做货币价值的一种衡量指标

而货币的价值也通过货币供给货币需求决定。

  • 货币供给:美联储的公开市场操作,出售或买入政府债券时可以减少和扩大货币供给
  • 货币需求:热门想以流动性形式持有的财富量

在长期中,物价总水平总会调整到使货币需求等于货币供给的水平。当有货币注入时,根据货币数量论,经济中可得到的货币量决定了货币的价值。而在两个稳态间的整个调整过程可以描述为:人们会试图用消费或储蓄的方式花掉超额货币供给,储蓄的方式又可以通过贷款再度转化到消费,去增加人们对物品和服务的需求。然而经济中生成物品和服务的能力并不会随着货币注入而增加(它和物质资本、人力资源、自然资源、生产技术相关),因此需求的增加引起价格上升,这增加了人们的货币需求量。从而达到新的均衡。

古典二分法、货币中性和流通速度

大卫·休谟提出,所有的经济变量可以分为两类:名义变量是按货币单位衡量的变量,如农民的收入,真实变量是按实物单位衡量的变量,如玉米的产量。这种将名义变量和真实变量区分开的理论成为古典二分法。根据古典分析,名义变量会受到货币制度发展影响,而货币和真实变量是基本无关的。如我们在前面曾讨论过的:

  • 经济中物品和服务的生产主要取决于生产率和要素供给
  • 真实利率的调节可以使可贷资金供给平衡
  • 真实工资调整高于均衡水平时,会引起失业

这种货币供给对真实变量的无关性称为货币中性。货币中性在短期内不完全正确,但是在长期经济上是正确的。

货币流通速度用来衡量货币易手的速度。用Y代表真实GDP,P代表GDP平减指数,M代表货币量,V作为货币流通速度,则有MV = PY,即数量方程式。在经济体中,货币流通速度基本是不变的,它主要和社会观念、人们习惯、科学发展等相关。在货币数量论中有下面几个关键结论:

  1. 货币流通速度一直是比较稳定的
  2. 由于1,所以当货币量M改变时,PY也会等比例变动
  3. Y由要素供给(劳动、物质资本、人力资本、自然资源)和生产技术决定,由于货币中性,它并不影响产量
  4. 由于3,M的变动会反映在物价水平P的变动上
  5. 从而中央银行迅速增加货币供给时,结果就是高通货膨胀率
通货膨胀税和费雪效应

尽管通货膨胀会导致货币贬值,有些国家政府为了更方便快捷支付其支出(通常在高额支出且税收借款能力不足时),会选择创造货币。政府在通过印发货币筹集收入时,可以认为在征收一种向每个持有货币的人征收的通货膨胀税。这样导致的物价水平飞涨一般会随着货币制度改革而消除。

我们在前面提到,真实利率=名义利率-通货膨胀率。可贷资金的供求决定真实利率。货币增长的变动不会影响真实利率,但是会一比一地体现在名义利率上,因为反过来名义利率=真实利率+通货膨胀率。这种名义利率根据通货膨胀率所做的调整也称为费雪效应

通货膨胀的成本

首先,通货膨胀并不会导致购买力下降。因为在物价膨胀时,出卖物品、服务的人收入也得到了膨胀。也正如上一节所说,真实收入是由真实变量决定的。不过通胀还是会带来一些成本。

  • 皮鞋成本:通货膨胀像一种税,税收这种激励的扭曲给社会带来了无谓损失。皮鞋成本字面意义是更经常去银行会使你的鞋磨损得更快。实际上是指减少货币持有量的成本,比如你牺牲的时间和便利。
  • 菜单成本:相反地,企业为应对通胀不得不改变定价。这种改变价格的成本成为菜单成本。
  • 通胀会扭曲相对价格,扭曲消费者的决策,从而带来资源配置不当
  • 税收扭曲:许多税收都以名义量作为标尺,通胀夸大了资本收益的规模,无形中增加了这种收入的税收负担。税收指数化可以缓解这种情况
  • 通胀侵蚀计价单位的真实价值带来的混乱和不方便
  • 未预期到的通货膨胀会带来意料之外的财富再分配超速通货膨胀会转移债务人负担到债权人,相反通货紧缩会增大债务人负担

整体来看,超速通胀期间,上面这些成本是可观的。不过温和通胀期间,如每年物价上涨10%以内时,这些成本的大小则还没有定论。另一方面,通货紧缩会减小经济中物品和服务的需求,从而带来收入减少和失业增加。这可能比通胀的成本更高。

面向开放经济的宏观经济学

基本概念

我们在前面提到,贸易使每个人的状况更好。因此,前面在封闭经济基础上讨论的结论有必要放在开放经济的环境下探讨。当然,首先要了解一些概念:

  • 出口
  • 进口
  • 净出口
  • 贸易余额
  • 贸易盈余、贸易赤字、贸易平衡

一个开放经济以两种方式和其他经济交易:在世界市场上购买并出售物品和服务在世界金融市场上购买和出售股票、债券等资产。其中,衡量资本流动的有资本净流出的概念。它表示本国购买国外资本减去外国购买本国资本。这个值会受到各种因素影响。但整体来看,净出口等于资本净流出,即NCO=NX。从概念上看,这个等式必然成立。

应用这个结论,可以很快得到:

  • 一国有贸易盈余(NX > 0)时,资本从一国流出(NCO > 0)
  • 一国有贸易赤字时(NX < 0),资本从外国流入(NCO < 0)

储蓄、投资和国际流动的关系

在GDP的讨论中,我们已经知道Y=C+I+G+NX。其中国民储蓄S等于Y-C-G。所以可以很快得到S=I+NX。另外,从上面的结论NCO=NX,可以得出S=I+NCO。即储蓄等于国内投资加上资本净流出。或者可以说储蓄有两种用途:国内投资和资本净流出。在封闭经济中,NCO=0,所以S=I

真实汇率和名义汇率

  • 名义汇率是国家间通货交换的比率,可以用升值以及贬值衡量这种比率的变化(或者坚挺、疲软)。
  • 真实汇率是国家间物品与服务交换的比率,它是名义汇率在价格比率的换算下得到的。一国的真实汇率是其物品和服务净出口的关键决定因素。真实汇率的下降意味着本国物品/服务更便宜,从而带来净出口增加,汇率上升则有相反效果

汇率决定理论

购买力平价是最简单的长期汇率决定理论。它认为长期来看,任何一单位通货应该能在所有国家买到等量物品。它基于一价定律,这个定律从反证法出发,认为如果一种物品在不同地方具有不同价格,则存在套利可能,即利用价格差获益。这个获益过程会让价格还原到一致的水平。从而达到购买力平价的效果。

购买力评价也意味着真实汇率为1,即名义汇率等于外国物价水平和国内物价水平的比值。因此,当国内中央银行引发大量货币时,不仅从能买到的物品和服务来看,还是从能换取的其他通货来看,货币价值都减少了。购买力评价理论的局限性在于,假定条件太理想化。

  • 许多物品和服务并不能贸易,至少不那么容易贸易
  • 不同国家的物品和服务具有差异化,这种不可替代性也削弱了套利的可能

但是从长期看,大幅度且持久的名义汇率变动还是反映了国内外物价水平的变化。

宏观经济理论

在上一章介绍了净出口、资本净流出、真实汇率、名义汇率等概念,这章分为可贷资金市场、外汇市场加以讨论。这两个模型的建立基于GDP是既定的,以及经济中的物价水平是既定的。

可贷资金市场和外汇市场

  • 可贷资金市场:协调经济中的储蓄和投资,受S=I+NCO等式的支配。在这个市场中,供给来自于国民储蓄,需求来自于投资和资本净流出。而真实利率影响供需的均衡。在真实利率上升时,会同时抑制本国人购买外国资产且吸引外国人购买本国资产。
  • 外汇市场:协调交换国内外通货的人,受NCO=NX等式的支配。在这个市场中,通货供给来自资本净流出,需求来自净出口中外国所需要的本国通货。而真实汇率影响着供需均衡。真实汇率衡量了国内外物品的相对价格。真实汇率上升时,会减少外汇市场上对本国货币的需求量。由于汇率变动既影响购买外国资产,也影响这些资产的受益,这两种印象相互抵消。资本净流出的供给曲线几乎是垂直的。

开发经济中的均衡

在上面的两个市场中,资本净流出(NCO)作为两个均衡的桥梁。在上面的开放经济模型中:

  • 真实利率用来衡量未来的物品和服务相较当下物品与服务的价格
  • 真实汇率用来衡量国外的物品和服务相较本国物品与服务的价格

在真实利率确定后,可以得到均衡时资本净流出,从而再结合外汇市场需求曲线得到均衡时的真实汇率。

开放经济如何受政策和局势影响

上面用两个市场和供需图对宏观经济的几个关键指标进行了建模。两个市场通过资本净流出建立起联系。接下来就利用这个模型分析政策对这些指标的影响。

  • 政府预算赤字:减少国民储蓄,提高真实利率,减少资本净流出,减少净出口,使贸易趋向赤字
  • 贸易政策,贸易政策如关税或进口配额会影响进口,从而增加了美元需求,并导致真实汇率上升,但是资本净流出和净出口都不变。很多经济学家认为,贸易政策的微观经济影响会大于宏观经济影响
  • 政治不稳定/资本外逃,资本外逃增大了资本净流出,扩大了可贷资金需求和世界市场上的通货需求,并带来通货贬值和真实利率上升。相反,资本流入会让通货坚挺,并引起贸易赤字。

往往鼓励资本流出的国家,会引起通货疲软和贸易盈余,接受资本流入的国家通货坚挺和贸易赤字。

短期经济波动

经济活动有繁荣,也有衰退甚至是萧条时期,可以借助总需求和总供给曲线分析。首先有三个事实:

  • 经济波动是无规律且不可预测的
  • 经济波动时,大多数宏观经济变量同时波动
  • 产量下降时,失业上升

解释短期经济波动

根据古典经济学的古典二分法和货币中性,名义变量不会影响人们的生活,也不会影响真实变量。不过短期中,名义变量和真实变量却是有相关性的。这里我们借助总需求和总供给模型来分析。这里的供给需求和我们在微观经济学中提到的供需不是一个概念。这里的供给和需求是衡量整个市场而非特定市场的。

总需求曲线

整体来看,总需求曲线是向右下倾斜的。从3个角度来看:

  • 消费-财富效应:物价下降使人们手里的财富升值,提升了购买物品和服务的能力,鼓励人们支出。
  • 投资-利率效应:物价下降引起财富升值,多余的钱会鼓励人们在投资上的支出
  • 净出口-汇率效应:物价下降时,涌入储蓄和投资的钱会引起利率下降,带来资本净流出增加,货币贬值,国内物品相对国外更便宜,刺激净出口增加,提高了物品和服务的需求量

相反的,物价上升会从消费、投资、净出口的角度抑制物品和服务的需求量。上面这个分析是建立在货币量一定的基础上。一些因素会引起总需求曲线的移动:

  • 消费:风气、文化、税收,如鼓励向远看,会让总需求曲线左移
  • 投资:税收政策、货币供给,如短期货币供给增加降低利率刺激总需求曲线右移
  • 政府购买:基础建设工程、武器航天
  • 净出口:经济复苏、萧条

总供给曲线

由于总供给曲线和真实GDP密切相关。所以在长期上,它是垂直的,但是短期中,总供给曲线则是向右上方倾斜。

在长期中,能引起总供给曲线变化的是决定真实GDP的那些因素:

  • 劳动变动:受自然失业率影响,比如最低工资调整
  • 资本变动:包括物质资本和人力资本
  • 自然资源变动:发现新的资源,或已有资源枯竭
  • 科学技术更新

长期中,技术和货币政策会引起总供给和总需求曲线共同右移,从而带来持续的通货膨胀。

短期中,总供给曲线是向右上倾斜的,即短期物价水平会影响经济中的产量,这个原因有3个相关的理论。

  • 粘性工资理论:名义工资对经济状况变动的调整缓慢,从而让工厂根据物价水平调整雇佣工人数目和产量
  • 粘性价格理论:即一些物品和服务的价格对经济状况变动的调整也是滞后的(部分是因为菜单成本)。从而在物价高于当前水平时增产,低于当前水平时减产
  • 错觉理论:供给者误认为相对价格下降/上升,

三种理论都说明,当实际物价背离人们预期物价水平时,短期产量会背离自然产出水平。这是个暂时存在的问题。因为人们的预期适应只是需要时间而已,但总会适应的。影响长期总供给曲线移动的因素也会引起短期总供给曲线移动。另外,预期物价水平的变动也会引起曲线移动,预期更高时,曲线左移,预期更低时曲线右移。

经济波动的原因

根据上一节提到的总供给和总需求模型,短期经济波动的基本原因来自:总需求曲线移动和总供给曲线移动。分析宏观经济波动的步骤和之前也是通过供需图完成。

  • 总需求曲线变动:通过总需求曲线和短期总供给曲线得到短期变动,产量和物价波动;再通过和长期总供给曲线得到最终变动,产量还原,物价上升或下降。由短期变动到长期均衡的过程受到粘性工资等原因影响。决策者可以通过政策干预减缓经济波动的严重性
  • 总供给曲线变动:同上,供给减少会引起滞涨,即产量减少和物价上升,并带来工资——物价螺旋式上升,但是长期来看,产量会回升,物价进一步上升。同样地,政策可以减缓产量的不利影响,但是只能以加剧通货膨胀作为代价

货币、财政政策对总需求的影响

上面提到,在短期经济中,可以用总需求和总供给曲线解释一些现象,这一章主要介绍了货币和财政政策对总需求曲线的影响。

货币政策

总需求曲线向右下倾斜的三个因素:财富效应、利率效应、汇率效应中,利率效应是影响最大的。根据凯恩斯的流动性偏好理论利率的调整使货币供给与货币需求平衡

  • 货币供给:美联储可以通过公开市场买卖政府债券或改变贴现率或修改法定准备金等手段调整货币供给,因此货币供给只和美联储政策有关,与利率无关。这条曲线是垂直的
  • 货币需求:利率是持有货币的机会成本,利率上升提高了这个成本,因此货币需求向右下方倾斜

根据流动性偏好理论,在均衡利率下,货币供给和需求达到平衡。

在之前的章节中,我们提到利率的调节使可贷资金的供给和需求达到平衡。这是长期角度的判断,在长期上,产量即自然产出水平是固定的,利率的调整使可贷资金供求平衡,物价水平的调整再使货币的供求平衡。但是短期内,物价总水平变化是缓慢的,利率的调整使货币供求平衡,确定的利率再影响产量水平。正好是反过来的。可贷资金理论更强调经济中储蓄倾向和投资机会的平衡,短期决定因素上,流动性偏好理论强调了货币政策的重要性。

  • 货币供给固定时,较高的货币需求引起较高利率,从而减少了物品和服务的盈利程度和需求量
  • 货币供给变动时,比如增加货币供给,会降低利率,增加物品和服务的需求量,使需求曲线右移

美联储在政策制定上并非直接以货币供给直接作为政策工具,而是使用联邦基金利率最为目标制定政策。而根据上面的理论,使用货币供给或是利率都可以描述一个货币政策。美联储以利率作为目标时,也意味着它承诺或调整货币供给来达到这个目标。简单来记忆的话:

  • 扩大总需求的货币政策 = 增加货币供给 = 利率降低
  • 紧缩总需求的货币政策 = 减少货币供给 = 利率提高
流动性陷阱

在一些特殊时期,利率甚至会降至接近0,由于名义利率不可能降低至0以下,这种时候扩张性货币政策通过降低利率和刺激投资支出带来的额外流动性就很难再起到作用,即流动性陷阱。当然还有其他的扩张经济的工具,如承诺未来的货币扩张来提高预期通货膨胀,或购买抵押贷款或公司债券降低这类贷款利率(量化宽松)。

美联储的目标之一是稳定总需求,因此在股市上涨时,美联储货币政策会偏向紧缩,而在股市下跌时,政策会偏向宽松。

财政政策

财政政策主要包括政府购买税收

政府购买

整体上会让总需求曲线右移,但是乘数效应挤出效应会让总需求曲线移动的幅度大于和小于预期。

  • 乘数效应:政府购买带来的增加了收入,刺激的消费支出,同时也让工厂雇佣更多工人,进一步刺激投资和消费,引起连锁反应。这种正反馈有时也被称为投资加速数,如果用边际消费倾向(MPC)来衡量家庭额外收入用来消费而不是储蓄的倾向,最终乘数等于1/(1-MPC)。乘数说明经济可以将支出变动影响扩大。
  • 挤出效应:政府购买刺激物品和服务的总需求的同时,必然带来利率提升,从而减少投资支出,阻止总需求增加。

最终政府购买带来的总需求曲线移动取决于乘数效应和挤出效应的大小。

税收政策

税收政策变化会直接影响人们的消费欲望。但是影响幅度取决于家庭对税收变动持久性的判断。判断越持久,影响越大。

运用政策来稳定经济

在是否支持政策来稳定经济上有两派意见:

  • 支持:政府应对经济中的变动的概念做出反应以便稳定总需求。因为人总有动物本能在,悲观主义和乐观主义情绪会带来经济的波动。不过有些政策的效果也取决于人们对政府政策的态度(如税收)
  • 反对:政策产生以及带来影响都有时滞,且经济预测并不一定准确,政策发生作用时很可能已不是当初的经济环境,从而带来副作用

类似税制、政府支出这样的政策可以自动适应经济变化,在经济衰退时,政府征收的税随着人们收入的减少而减少,政府支出譬如福利随着人们生活条件变差而增加,从而起到刺激经济的作用。因此它们也被统称为自动稳定器

通货膨胀和失业间的短期权衡

长期来看,自然失业率受最低工资、工会、效率工资等影响,而通货膨胀率取决于央行控制的货币供给的增长。这两个几乎互不相关。但是在短期中,总需求的变化会体现在短期总供给曲线上,增加或减少失业。总需求增加带来产量增加、失业减少和物价上升、通货膨胀;总需求减少带来产量下降、失业上升和物价下跌、通胀减少。

菲利普斯曲线

1958年,菲利普斯发现失业率和名义工资间的负相关特性,而后被发展成失业率和通货膨胀率间的负相关特性,并将相关关系称为菲利普斯曲线。菲利普斯曲线说明,短期中通货膨胀和失业的组合是由于总需求曲线的移动使经济沿总供给曲线变动

长期菲利普斯曲线:预期的作用

菲利普斯曲线在短期内是比较典型的,但根据之前的“货币中性”的观点,在长期,不可能用名义变量的控制去钉住真实变量。同样的,不能通过控制货币量去影响自然失业率和产量这些真实变量。从长期来看,失业并不取决于货币量增长和通货膨胀。它和我们在失业一章中提到的最低工资法工会谈判在职培训计划等有关。

那么又怎么去解释短期内菲利普斯曲线的表现呢?和总需求、总供给中说到的一样,是预期发挥的作用,预期的通货膨胀造成了短期的失业率下降。我们可以概括成下面的式子:

失业率 = 自然失业率 - a(实际通货膨胀 - 预期通货膨胀)

其中实际通货膨胀可以通过美联储的货币政策快速调整,然而预期通货膨胀需要个人和企业慢慢适应和调整,并最终抵消货币政策的效果。根据这个理论,自然率假说提出,选择较高的通货膨胀来减少失业只能起到暂时性效果。

总供给冲击

1970到1980年期间,石油输出国组织大幅削减石油出口,导致油价飙升,总供给曲线左移,菲利普斯曲线右移,经济陷入滞涨(产量下降、物价上升)。对于同样的通货膨胀,失业率更高;类似地,对于同样的失业率,通货膨胀效率更高。一方面,决策者希望紧缩总需求来对付通货膨胀,但这会进一步增加短期失业;另一方面,扩大总需求对付失业,则会进一步提高通货膨胀。这种两难的处境比之前更甚。这种情况以及菲利普斯曲线的移动的维持时间取决于人们的预期通货膨胀的调整时间。

牺牲率与反通货膨胀

反通货膨胀并不等于通货紧缩,它旨在减少通货膨胀的比率,而不是把它变成负数。牺牲率可以用来衡量减少通货膨胀需要“牺牲”的每年产量。一部分经济学家认为,在理性预期,即人们充分运用政策信息,且快速调整预期时,牺牲率并不会像想象中那么高。最终反通货膨胀的起效速度和程度取决于人们对侦测的相信程度。

经济政策的讨论和思考

  • 是否要采取财政政策和货币政策来稳定经济
    • 是:可以采取政策来稳定总需求,从而稳定生产和就业
    • 否:政策都有时滞,需要政治过程,然而经济是有时间窗口的,错过时机就难以找回
  • 政府反衰退应该增加支出还是减税
    • 增加支出:传统凯恩斯主义中,衰退的原因就是总需求不足,而政府购买增加相比减税更有效率地增加总需求
    • 减税:减税可以增加家庭可支配收入,我们可以通过改变减税方向,超特定方向激励用户增加总需求。政府购买可能会引发人们对未来高税收的预期从而减少消费。同时政府能否明智而迅速的花钱也是存疑的。减税对比政府购买分散了支出决策,绕开了不可靠的政治过程
  • 货币政策应该按规则指定还是见机行事
    • 按规则:灵活度过高会让让滥用权力没有限制,比如总统竞选时采取扩张性货币政策以获得暂时性比较好的就业,同时还容易存在政策的前后不一致性,影响人们对通货膨胀的预期
    • 灵活制定:能更快速地应对经济形式的变化,同时政治性经济周期和前后不一致性在实践中并不明显
  • 是否应该把零通货膨胀作为目标
    • 是:通胀带来真实成本,同时降低通胀可能并不像想象中那么困难
    • 否:零通胀好处并不大,然而实现零通胀的成本却是很大的,反通货膨胀引起的衰退会留下痕迹。另外,一个合理的通货膨胀不会给人们带来负担,同时还能留下更大的缓冲区域
  • 政府是否应该平衡预算
    • 是:更高的政府债务给了后代更大的负担,同时财政赤字代表负的公共储蓄,它降低了国民储蓄引起真实利率上升和投资减少。不过相对高税率来说,高债务相对好点
    • 否:下一代人身上背的债务被夸大的,如果从他们一生的收入来相比,身上背的债务并不算多。另外,政府债务也需要和其他政策放在一起看,政府债务带来的更好的教育、医疗等,同时也有助于财产再分配
  • 应该为了鼓励储蓄而修改税法么
    • 应该:各种税收政策抑制了储蓄需求,会减少国民储蓄
    • 不应该:税收有助于增大公共储蓄,同时合理的征税也可以保证储蓄

很少有什么政策只有好处而没有代价。

程序设计其实就是解决问题,它需要发明、创造和灵感

《程序员思维修炼》的作者同时也是《程序员修炼之道》的作者,在书中都有体现实用主义的影子。而在本书中,思考的角度则更高。从思维方式、学习能力等角度出发,提出了对不同人有着不同借鉴意义的真知灼见。全书思路发散,图结构而非树状结构的全书脉络让人较难在脑海中一次回忆起全部内容。开头对于专家模型的介绍稍显突兀,而后对R型思维的介绍,包括概念介绍、需要重视和如何培养,思路上比较连贯。整体上还是读者自己形成看法和认识。后面对学习能力、注意力控制等的介绍倒是比较有实用性,可操作性较高。按第一章的专家模型来界定,就是面向新手、高级新手阶段的指令集。书中大脑调试一章对于有心理学基础的读者来讲,聊胜于无。整体来看,也完全可以面向非程序员群体,全书前半段更能开阔视野,后半段更有使用价值。

吐槽一点,把书中对于“情境”一词翻译成“上下文”之后,我读起来舒服了很多。因此下面我也做了这样的“翻译”

下面分章节简单摘录一些闪光点。

绪论

个人理解

写代码是项脑力运动,软件项目运作中,弱点实际上在人,而非机器和代码。因此对于思维上的练习是很有裨益的。

摘录

  • “软件产品处于应用、用户、规则和硬件的合力之下。这些因为总是在不断变化,迫使软件产品也随之改变” ——《没有银弹》
  • 始终关注上下文
  • 有些东西是基础的、各领域相通的。那么必然是存在某些根本和重要的东西。(然而作者没有举例)

从新手到专家

个人概括

人对技能的掌握是可以分阶段的。在低能阶段,更需要固定的指令集,这可以通过培训、手册等手段实现;经过不断的模仿和意外情况以及新手自己的努力总结后,可以一步步进化到高能阶段,这个阶段会偏向按直觉行事,在新手看来就像是magic。对于新手和专家的管理方式一定是不同的,新手更需要规则去避免思考,以及去做标准化;专家更需要自由化的工作环境来避免人为限制。

摘录

  • 专家的很多行为是如此的熟练以至于已经变成无意识的了
  • 德雷福斯模型的5个阶段:新手、高级新手、胜任者、精通者、专家。大多数人都停留在前两阶段。专家的比例极低,需要海量的时间积累。
    • 新手只是要一个立竿见影的目标,他们需要一个指令清单和决策树能按部就班的执行下去
    • 高级新手已经可以根据经验从正确的上下文中采纳建议,但他们没有更高的全局思维
    • 胜任者能建立问题领域的概念模型,并有效的应用
    • 精通者有全局思维,并不断纠正以往不好的工作表现
    • 专家是各领域知识和信息的主要来源,根据直觉行事而不需要理由
  • 任何对开发指定严格规则的方法或企业文化都会拖累专家业绩表现到新手水平
  • 元认知,即自我认知能力,往往在较高的技能层级才会具有,即知道自己不知道什么
  • 积极的实践需要4个条件
    • 一个明确定义的任务
    • 任务具有适当难度
    • 环境能提供大量反馈
    • 提供重复犯错和纠正错误的机会
  • 没有实践就没有技能,先通过模仿来学习进步
  • 要警惕工具中忽视上下文造成的不灵活性,结合实际保证一定的灵活度
  • 培养知觉
  • 学习学习能力

认识大脑

个人概括

人的大脑并没有明显区分出左脑司情感,右脑司逻辑。但是思维模式上却是区分出L(Logic)型和R(Rich)型。L型偏细节、偏实现、偏逻辑;R型偏整体、偏设计、偏模式。L型能帮助你100%解决问题,R型则需要等待idea涌现出来。我们不能因为R型在日常生活或学习工作生涯中较少出现而忽视了它。

摘录

  • L型又叫线性模式,R型又叫富模式。R型对知觉、问题解决和创造性非常重要,L型让你细致工作并实现目标、
  • 两种模式会竞争大脑总线。就像你回忆梦的时候,R型能帮你想象出来;但是想要把梦讲出来时,L型占用了总线,你无法获取到R型记忆了。
  • R型思维不能直接控制
  • 大脑并没有一个中心主管思想,各种想法会分布式的涌现和竞争,不断刷新大脑闪存。只有胜利者能成为你的意识。所以你需要做好准备,记录你随时可能出现的idea
  • 每个人都有好点子,但是你不捕获的话,很容易沉没在脑海里
  • L型处理让人踏实、舒适、可预期;R型则更像直觉,它喜欢综合学习,模式分析,而不愿受理性约束,因为它并不需要基于原因或已有事实来输出结果。因此R型具有直觉性、跳跃性。我们日常生活做出的决定,几乎都不是纯L型或纯R型的结果,比如,你为什么结婚?
  • R型的综合和L型的分析不同。综合意味着脱离细节、在乎全貌。有些任务专注细节反而难以完成,而从全貌出发可能更简单,比如左手画圆,右手画方?
  • 社会和教育鼓励L型,但是R型也是不可缺少的。
  • 一成不变的工作环境不利于大脑发展,丰富的感官机会会更有利。
  • “美学在于选择、共鸣、同化和爱,而非创造”
  • L型看树木,R型看森林

利用右脑

个人概括

R型对于工作和生活是一定有帮助的,先体验对问题有个感官认识,而后上手会更快。有些时候,难题会被意外的灵感解决。R型可以通过一些方式去培养,如晨写来培养找到感觉的过程、或散步沉思来转移L型注意力给R型发挥空间等。我们在日常中会无意识的用到R型,比如类比、隐喻甚至是幽默。

摘录

  • 利用多感官反馈,可以从视觉、触觉、听觉或者其他角度创造多种体验,刺激你的大脑,让它发挥魔力
  • L型思维会符号化感官输入,要创造条件避免这样,比如角色扮演,洞察真实事物
  • R型引入日常工作,可以提高工作效率
    • 先体验去感受模式,一次多感官、亲身实践的上下文更有助于学习。当然,对于没有门槛或者低门槛的活动这么做会更好用
    • 让R型开路,之后L型紧跟,酒醉写作,酒醒修改,综合两种思维模式
    • 结对编程:一个使用R型发现模式,一个使用L型专心实现(比较理想化了)
  • 隐喻是最日常的沟通R型和L型的方式。隐喻的参考系差别越大,创造性的成果就越大
    • 随机并列锻炼联想能力
    • 系统隐喻,使用日常事物去类比代码模型。但是有时很难找到这样的类比
  • 幽默在于在不同想法中制造新奇的联系,也可以锻炼R型
  • 你的大脑会记录所有输入,R型负责组织和模式发现,并随机涌现结果。很多时候,涌现的结果是无法用言语表达的。这个时候,可以利用图像流或者自由笔记
    • 图像流:想象一个问题,观察图像,大声描述出来,努力用各种感官去想象
    • 自由笔记:去写作,不要分心
    • 晨写:让无防备的大脑倾倒想法
    • 利用散步:使用散步,比如在树林或公园等安全的环境里随便走走,做到心不在焉,让R型自己工作。
  • L型是命令性的,主动工作;R性则不能被命令,只能去邀请
  • R型除了帮助你形成想法,还能帮你发现模式。如代码、神谕
  • 尝试新鲜事物,锻炼大脑

调试大脑

个人概括

人的大脑因为进化原因,是有些先天“缺陷”的。你需要了解它们避免决策时的误差。这些“缺陷”在心理学领域的书籍中会有更加详细和科学的介绍

摘录

  • 人具有认知偏见,如思维定势、基本归因错误、自我服务偏见等
  • 大脑处理现实复杂性的方法就是把庞大、复杂的系统符号化为简单易操作的对象。这也使得人类非常不善于从过去的事情推断未来的事情。我们总是假定事情是一个稳定和线性的递进,然而现实是非线性的。
    • “很少”不意味着没有,黑天鹅事件总会发生
    • 过早下结论
  • 重视上下文:认清时代影响,一个人的特性可能和其时代有关。
  • 了解个体倾向,每个人有不同的性格特征,你无法改变别人
  • 记住你是高级动物,在一些时候,避免大脑中进化而来的低级动物逻辑。比如见样学样,非好即坏。
  • 如何避免认识误差:自我辩论,如果你认为自己已经明确一些事情,尝试解释一下它的反面

主动学习

个人概括

学习能力是可以有一些可量化可落地的手段去提高的。首先,学习一定是个主动的过程,你需要明确自己的目标(可以使用SMART模型),建立自己的学习计划。找到更适合自己的感官模式。之后有一些具体的手段,比如小组学习SQ3R思维导图写文档以教代学

摘录

  • “大脑不是一个用于灌输的容器,而是一束需要点燃的火焰”
    • 学习需要你自己主动做
    • 仅仅掌握知识,不去实践,没有用
    • 需要有目标和反馈去纠正效果
  • SMART帮你明确目标
    • Specific,Measurable,Achievable,Relavant,Time-boxed。
    • 具体的:不能只是简单的想法
    • 可度量:可以量化
    • 可实现
    • 相关的:需要能在你掌控中
    • 时间可控的:需要有deadline
  • 时间是无法创造和销毁的
  • 要有知识投资计划,就像理财一样
    • 设定目标
    • 多样化投资,考虑风险和回报率
    • 主动投资
    • 定期投资:养成一种习惯
  • 总有一种感官模式更适合你:视觉、听觉、动觉
  • 成人更适合小组学习,大家一起学习,相互促进,互相学习,学得更有效
  • 相比经验式学习,阅读是一种效率极低的学习方式,SQ3R让阅读更有效
    • Survey、Question、Read、Recite、Review
    • 概览:粗略阅读目录,形成整体印象
    • 问题:搞清楚你想弄明白的问题
    • 阅读:困难的地方可以放慢速度
    • 复述:合上书本,用R型记忆感受,用你自己的语言复述内容
    • 回顾:重读,扩展笔记,和人讨论
    • 这个方法也可以用来初高中学习
  • 根据遗忘曲线,可以定期回顾来增强记忆
  • 思维导图提供了更高的自由度来表现关系,更有助于增强连接,获得更多感悟
    • 绘制思维导图时可以不容那么认真
    • 手写是关键,动觉可以帮助你在视觉外刺激大脑,加深记忆
    • 探索性的思维导图:想到哪儿画到哪儿,然后再整理,发现模式
  • 写文档的过程比写文档更重要
  • 以教代学可以考验你是否真的理解了,同时解释过程中的隐喻可能会让你有新的收获。
    • 在给聪明人解释时,对聪明人挑毛病的顾虑也是一大动力

经验积累

个人概括

实践是学习中必不可少的一步,如何更有效的从实践中学习也有些诀窍。

摘录

  • 经验主义:通过实践来构建认知,而不是通过学习来灌输。
    • 让学习更有趣味性
  • 波利亚的解题法:先确认已知量、未知量、上下文环境。然后有些方法
    • 努力回忆类似未知量的问题
    • 画图
    • 是否用上所有已知量和条件
    • 换一种问题描述方式
    • 从未知量推到已知量
  • 一个高效有益的学习环境应该允许你安全和方便地做3件事情:探索、创造和应用
    • 在编码领域,这意味着,至少要有版本控制单元测试项目自动化
  • 失败分两种,其中没有产生任何知识的失败会阻止我们学习
  • 上下文反馈是一种内在诀窍技术,其让学习者关注于非常简单的反馈循环,避免向学生传授一长串指令,从而形成一种意识,来纠正学生的学习表现。这种意识是非判断性的。内在诀窍的理念关注反馈,以此增长专业知识。
  • 面对时间压力时,人会缺乏创造性。要允许失败。建立允许失败的领域。
  • 参加一个周围都是专家的会议或聚会时,你的能力也会有提高。我们是天生的模仿者,把自己想象成专家甚至也有效果。可以想象实践并从中学习,会如同真实体验一样有效

注意力控制

个人概括

在信息化社会,过滤信息,管理注意力会提高你的工作效率。一方面要注意积累,管理好个人知识体系;另一方面要管理好自己的上下文,避免频繁切换,保持一个大的上下文环境,不管是物理上的还是软件上的。

摘录

  • 时间是你自己分配的,并不是我们没有时间了,而是我们的注意力不够
  • 着眼于现在,没有任何分心,没有任何自言自语。缓和L型嘈杂的声音带来的痛苦。
    • 冥想:学习集中注意力。在冥想中,会沉浸到一种宽松的思维状态中。在这里你可以意识到自己和你的上下文,不用做出任何判断和回应。在这种风格的冥想中,需要做的只是注意自己的呼吸。不要与自己交谈,保持清醒。
  • 在过度几种后,可以有意识地忘掉问题,让问题在思维中“浸泡”一会儿。注意把浸泡和拖延分开。
  • 使用wiki管理自己的知识体系
    • wiki页面间的相互链接会形成自然的知识体系和模型
  • 维护上下文的成本时昂贵的,要较好地管理
    • 避免大脑频繁切换上下文,这样会提高错误率。在深入进行的任务被打断后,需要10~20分钟的时间找回状态
    • 远离会打断思路的工具,比如即时聊天或者邮件
    • 利用外部缓存维护清单,如纸片或多窗口,只在大脑里存储“指针”
    • 切换时,可以做一些记录,方便切换回来
    • 保持足够大的上下文,比如所有信息都放在桌面,或使用多窗口维护上下文栈
    • 管理好你的多窗口

超越专家

人们看却没有看见,听却没有听见,吃却没有味觉,接触却没有触觉,说话却没有思考. —— 达芬奇

摘录

  • 现在就开始动手吧
    • 有私人wiki,建立知识图谱
    • 给思维放个假,让散步成为生活的一部分
  • 专家容易见怪不怪,要避免这样

–END–

0%