记录下进入研二的日子...

#1 ·
#2 ascah :

感觉事情时不时的会超出预料。本来打算 8 月初调下宿舍,后面说再等等会有低楼层。索性趁着这段空档期回家一段时间。最近又知道调宿舍的日期又要延后了。如果我改签下车票,在家多待几天也不是不可能。不过之前填的返校日期是这两天,继续待不太靠谱。懒得改签,明天回校。后面干什么?现在还不知道。

#3 紫金港第一皮革<・)))><< 回复 ascah :
ascah:

不过之前填的返校日期是这两天,继续待不太靠谱

我感觉至少上交基本不会检查你是否按期到宿舍吧🤔

#4 ascah 回复 紫金港第一皮革<・)))><< :

这倒不是学校层面的查,给导师交的是这个日期。虽然可能晚回几天也没啥事

魔芋爽在土塬的树洞,欢迎源友和塬友们来串门🥰

学业碎片/生活碎片/摸鱼画画/阅读心得
若你有心认出我,请勿声张,留我一片毫无顾忌的天地 🤫
:pig2:

#1 ·
#6 我有魔芋爽 :

没想到土塬的皮革兔竟然是动态的, 哈哈哈:pig2: :pig2: :pig2:

#7 我有魔芋爽 :

:clown_face_mouse: :magic_wand_clown_face: :joy_smiling_face_with_tear: :sob_imp: 土塬的表情太搞笑了哈哈哈哈

#10 紫金港第一皮革<・)))><< :

居然还有来自水源的门友 震惊()

本楼欢迎每一个来聊天的人!

写在最前面:请不要盒我!
lz 并不希望被认出自己的线下身份 🥺

Part 4 开楼题记:

暂时写不出来
主楼指路部分删除了大部分水源日记楼链接 仍然保留的水源链接是因为链接指向的内容属于其他创作者或未被转载至门
这表明本日记楼的本土化程度极大增强 :tieba_huanhu:

Part 3 开楼题记:

随便写了一点,大概是作为对半年前的自己的答复吧。

很难想象,自从我在水源建楼以来已经过了半年,这其中又包含了多少建楼之时难以预料的变迁,难以想象的悲欢。当时的鱼鱼想必无法想象自己会离开水源,更无法想象自己能够在土源上岸、更加恣意地生长。

I_Love_ZJU:

愿我能够摆落面对网络社交信息的焦虑和过分依赖,更加专注地备战期末考,如果还能更进一步的话,更好体味生命的真谛。

这应该是我在离开后的第一天的祈愿。回望现实,它究竟实现了多少?

备考目的大概是达成了,本学期期末考的成绩除了被某几门课程恶心了之外,总体和上学期相比也有了很大的提升。土源也以它如盛唐长安包容万国衣冠一般的好客特质,接纳了我这个来自 sjtu 的赛博流浪者,让我有了“此心安处是吾乡”的归属感,并逐渐在开拓独属于自己的一隅天地的过程中,重新建构起全新的稳态。比起水源层出不穷的炸裂大瓜,我还是更喜欢在土源缓慢更新的宁静氛围中沉淀、成长。我在水源“交我平凡”中笃定地说出了“我爱水源”,现在,我也可以笃定地说出,我爱土源,并且再加一句,土源社区是我的家园。

之前我提到了,希望自己能够“保有对阅读的热爱”,遗憾的是,上学期仍然未能阅读多少专业课程以外的书,希望暑假可以多阅读一些书籍吧。

至于回忆部分,我希望暑假能再写写,但感觉想写的东西上学期似乎写的差不多了。本想给高三首考后的回忆写个关于高考的终章,但高三又有何终章可言?源自高三的焦虑乃至糟糕的睡眠仍在折磨着我,而且我甚至在无数次低效学习时希望着自己能够重拾高三时学习的效率。我的高三绝不快乐,但正因如此,我认为我更加需要在被诗化记忆彻底欺骗之前,尽可能忠实地记述自己经历过的一切。不过高三也有快乐的时刻——和老师聊天时,感觉这值得一写,先挖个坑。

还是很难相信自己怎么已经大二了,我的迷茫仍在持续,因此,“怎么办”的求索以及对于这个问题不定期的答复也不会停止。

先到此,因为我写不下去了。
紫金港第一皮革鱼
250726


以下为半年前的内容:

话归正题,这是一个犹豫许久后建立的日记楼。我接下来会简要谈谈它的命名由来以及内容构成。

lz 的用户名“Comment faire”为法语中的“怎么办”。以“怎么办?”为日记楼命名,首先明示此楼的归属。其次,“怎么办?”这个疑问句传达着 lz 在人生的十字路口的迷茫情绪。lz 进入交大以来由于一系列原因一直处于 emo 状态中,专业课是学不会的,成绩排名是不行的,聊得来的人是没几个的、而且只能线上联系还不一定会有回应……至于未来的发展方向,lz 更是近乎一无所知 ,但 lz 唯一知道的就是自己想要尽全力逃离上海,因为这座城市给我带来的回忆几乎都是痛苦的,它商业化、事业心强的城市气质也和我格格不入,lz 不知道自己要去哪里,但是绝对不想再待在上海了……

此外,“怎么办”也是车尔尼雪夫斯基和列宁都采用过的书名。lz 希望自己也可以 (保有对阅读的热爱) 如这些前辈一般,在一次次“怎么办”的叩问和随之进行的思索中,明晰自我前行的方向,少一份迷惘彷徨,多一些坚定勇毅。

本楼可能包含一定生活碎片和零零散散的思考痕迹。lz 个人自小倾心于“致广大”而非“尽精微”(一个不恰当的譬喻,lz 明白本来这两者不应该形成庸俗对立),并不喜欢关注生活的琐屑,但作为不资深的 pig2 仍然对美食和旅游有相当多的兴趣。同时,由于 lz 并不想被盒出线下身份,所以本楼也很可能不会出现生活实景、具体专业学习之类的内容。lz 完全不接触二次元,也没有时间玩游戏,因此本楼不会出现二次元、游戏相关内容。

本楼很可能随机掉落 lz 作为一个做题家对过往生活的回忆。
在此摘录《往事与随想》开头很打动我的几段话:

“我决定写下来;但是一个回忆唤起千百个别的回忆;一切接近遗忘的旧事复活了:少年时代的理想,青年时期的憧憬,豪迈的青春岁月,监禁和流放——这些早年的厄运没有在我心头留下一丝阴影,倒像穿越长空的春雷,以它们的巨响唤醒和激励了年轻的生命。”

“有些往事需要经历相当久的时间,才能形成一个清晰的观念——一种无可奈何、令人伤感,但又能获得谅解的观念。不经过这一步,写成的东西可能是真诚的,但不可能是真实的!”

lz 显然不具有赫尔岑的阅历(什么显而易见的东西也往上面写),可能会回忆到的往事也没有经历足够长的时间的磨洗,客观性大概是一点也没有的,如果有人来看大概也就是看个乐子,不过这确实不重要。

这栋楼没有召唤术,因为 lz 不知道该召唤谁。 🥺

最后的最后,如果你看到了这里,
(中二预警)
那么——

我们仍然同心同德……
并将再度踏上孤独而忧伤的征途,
不倦地呼号真理——
哪怕希望扬长而去,人们毫不眷顾!

Comment faire
记于 2025-01-26

lz 终于知道可以召唤谁了🥹: @兴庆宫第一迷路幽灵

浅浅指下路:(在土源更新的均已加上土源链接)

历史上的“怎么办”日记楼
本楼出现的 markdown 知识
lz 被写作折磨的惨痛经历
关于优绩主义的一点迷思 感谢 @十一世纪 的解答 感谢 @repartee 的分享
lz 学考技术时的笨蛋经历
一点“明日新年”时的杂感
高中原班不算痛苦的回忆
🌲分享的聚餐应对方式

感谢 @anon60679752 的分享

lz 高一分班后的一些回忆
关于《里斯本丸沉没》的随想
lz 设想的对待过往的态度
小忆首考及其后的事件
交我平凡参选且落选的内容
土源限定!关于向死而生的感想
本楼出现的旅游攻略

已完工的攻略:
宜昌一日游 (感谢 @Rath_c 的分享)
海宁一日游
南京攻略
宁德攻略(景点部分)
宁德攻略(皮革部分)
北京攻略(感谢 @一芥孤舟 老师的分享)
泉州攻略
无锡攻略
筹备阶段的攻略:
沈阳
长沙

#1 ·
#4 紫金港第一皮革<・)))><< :

昨天本来想写开楼题记 结果写不出题记 但是写完了对首考后直至高考的经历的回忆

终章

不知不觉地,高三下的一百余天在日复一日的学习、问问题、找老师聊天等活动中度过了。我在一个个因学习重复内容而感到厌倦的瞬间希望快点到来的高考,也是真正到来了。

与首考相比,高考时的心态还是较为平稳的,没有出现因为焦躁恐惧而引发的失眠。高考和高中的其他考试,似乎也没有特别明显的区别,因此我对它也没有什么单独的、特别突出的印象。我现在只能记得数学考试前,和我的朋友一起遇到数学老师,然后老师说了一句“两个高手”,我们在去考场路上拼尽全力想要淡忘这四个字,不让它影响自己的心态;以及考完英语后,我认为自己续写内容毫无希望,在路上遇到英语老师后忍不住诉苦了好几分钟,老师只能无奈地安慰(虽然事后的分数表明,实际上续写肯定没有扣很多分🤣)。

6 月 10 日早上考完生物后去估分,我惊喜地发现自己数学小题都对,18(3)猜出了大致答案(后来才知道开闭区间错了)。要走的时候,遇到了一位认识的英语老师,他问我语法填空如何,我说全对,而后回答怎么做的时候只能说是凭语感。那位老师顺手递给我两个小桃子,很甜,我在走回家的路上 🐖完了。

由于估分花了一定时间,走出校门时,门外的人群已经散尽,我沿着熟悉的路线走回出租屋,和来时一样,独自一人。

我不怀念高中,接下来说出的话不包含任何意义上的 nostalgia,但我依旧很想说出来:

我直到现在,再也没吃过那么好吃的小桃子了。

#5 post deleted by author :

前排留名 :wave_gif:

意外发现土塬,希望可以交一些 XJTU 的朋友 😊
想听听 XJTU 的朋友们日常都在做什么呢?有什么有意思的活动吗?等等

我今天做了一天的数电作业 😇


这个楼后面也许会是一个日记楼,初步打算当朋友圈一样发 🥰
欢迎围观闲聊


三更:
楼里应该会有学习笔记(喜欢 md 但又没有一些好的可以记录和交流的平台,于是放置于此处)和一些 emo 时刻 和乱七八糟的各种没地方放的东西
s 属性大爆发——Study!


四更:

#1 ·
#2 😀 :

西交有什么好玩的吗?
我没有同学在西交,所以有点好奇的
土塬里没有人吗?怎么感觉都是 SJTU 的! 🫠

#3 IO :
难过,post:1, topic:14436, username:dT-Tb:

做了一天的数电作业

可以来虾饺东一楼做数电实验,贼有意思

#4 RaspberryPi 回复 😀 :

西郊兴庆校区北门马路对面有一个兴庆宫公园,大小大概跟兴庆校区差不多 🐁

秋招失败,转投了保底选调生,目前在南方某沿海省驻村,预计时长(不跑路的话)两年,大致记录一下每日工作。

#1 ·
#2 sola :

【現在公開可能な情報】

关于我:北方县城小镇做题家,老家在乡村,但只有过年会回去,基本没有乡村生活经验。

关于选调:考公的一种给部分大学(985+)优待的路径,相对省考/国考竞争相对较小;早期规模较小,考上的基本都成为了储备干部,随着规模增加,实质上除了两年基层锻炼外与正常考录没多大区别。(在省直和中央单位可能还有一定优势,因为提拔到处级需要硬性要求两年基层经验,刚录用时就先刷完可以避免科级提处级时下乡锻炼与单位脱节,不过近年来不满足基层条件破格提拔的也多了起来)

关于行政级别:我国实行省市县乡四级体制
省:自治区 直辖市 SAR
市:一般都叫市
县:市辖区 县级市 县
乡:乡 镇 街道
再往下就不是行政体制,而是自治机构,包括村(农业区)和社区(城区)

关于村里:旁边就是镇政府驻地,由于镇主要在做土地承包,所以村已经没有农业用地,所有集体土地均作为建厂用地承包给企业,村集体收入主要依赖土地租金收入。
村民人数在中 k 级别,村委会 10+ 人,村集体资产在千万级别。

#3 AI 回复 sola :

厉害,感兴趣

#4 PipaQinse233 回复 sola :

优秀门友,我的榜样

最近在一些群里看到有课题组招本科生778a52601f01b3321e46fbb4971106b8.jpeg
因为不是第一次见到,并且笔者也是做 ai 的,只不过没在本校,出于好奇,就去搜了搜这个组的主页和论文列表。

这个组 2026 年产出了整整 12 篇文章,其中有四篇中了 a 会。

我虽然并不赞成小红书上所谓的“慢科研”倡议,大伙为了毕业升学发文章无可厚非。

但搜了搜这个组的文章感觉很奇怪

第一,几乎全都不开源,开源也是完全没办法复现

7c06312a-a576-46ea-9af1-b06830bfebf6.png

4cda9519-4645-4c98-9f69-d59c41c0d990.png

让 agent 搜了一下 12 篇里边只有 3 篇有仓库,已有的仓库也是完全没办法复现,开源整理做的很差,模块更是少了很多。如果有做类似方向的 uu 应该知道这意味着什么。

无意对学术诚信有质疑,但在 ai 这个领域一年 12 篇文章,方向多样且都是热门但没有一篇可复现,开源完整是否有点过分了。这样的工作也很难有影响力。

第二,本科生参与这些项目能得到怎样的培养?

这 12 篇普遍署名不少,但一作却比较集中在一两个人。在这种方向领域多样又高产的领域,很容易会让人觉得是把本科生当耗材的情况,但好像群里发推广的人对这个组的评价很不错,所以真实情况到底是怎么样的笔者也很难清楚,但这个署名情况肯定不算健康。

笔者发这个文章的目的只是希望低年级本科生科研可以多了解一些信息,而不是只看课题组名气和宣传,希望大家多多筛选多方收集资料。因为笔者在大一大二也吃过这样的亏。如果有人想看后续也可以写一些 cs 选组指南。

也想请了解这个组、用过这些代码,或者实际参与过项目的同学分享一下经历。如果我对论文状态、仓库或团队情况有理解错误,也欢迎指出,我会修改。

#1 ·
#2 CAMELLIA :

今天早上又看见在招生了....
e5e18f9b-ea2c-43ee-b8a4-6b00a5326223.png.

#3 anonymous :

本科本校听说这个老师挺厉害的,人品也可以,上过他的体系结构课程,确实能感到思维清晰很熟悉硬件相关内容。
其他细节和科研不清楚

#4 CAMELLIA 回复 anonymous :

貌似任老师是大导,这个实验室实际上是下边的小导负责,毕竟任老师也不做 ai

MIT《The Missing Semester》

  1. Coding Agents(AI 编程智能体):如何利用 AI 编写、修改、测试和理解代码。
  2. Code Quality(代码质量):如何通过代码检查、自动化测试和 CI 保证软件质量。
  3. 软件工程沟通与协作(Communication & Collaboration):如何写好技术文档、提交记录、Issue 和 Pull Request,以及如何进行 Code Review。

这三节课其实有非常紧密的联系:

Coding Agents 帮助你更高效地编写代码,Code Quality 帮助你验证代码,Communication & Collaboration 帮助整个团队理解、审查和维护代码。

下面分别讲解技术原理、具体例子、实际使用方法以及课程练习。

第一节:Coding Agents(AI 编程智能体)

一、什么是 Coding Agent?

Coding Agent 是一种能够使用外部工具完成编程任务的 AI 系统。

普通聊天 AI 通常主要通过对话提供解释和代码建议。

Coding Agent 除了生成文本,还可以在得到相应权限的情况下:

  • 读取项目中的源代码。
  • 修改文件、创建新文件。
  • 在终端执行命令。
  • 运行自动化测试和类型检查。
  • 分析错误并尝试修复。
  • 搜索相关文档。
  • 检查 Git 修改记录。

因此,它不只是告诉你如何修改代码,而是可以实际执行相关开发步骤。

1. 普通 AI 与 Coding Agent 的区别

能力 普通 AI 对话 Coding Agent
解释代码 可以 可以
生成代码 可以 可以
自动读取项目文件 取决于工具 通常支持
直接修改项目 取决于工具 通常支持
执行测试 需要执行工具 通常支持
根据报错迭代修复 需要反馈 可以通过工具循环完成

课程建议采用一个理解模型:

把 Coding Agent 想象成一名能力较强、但仍然需要指导和监督的初级工程师。

你负责告诉它目标、限制和验收标准,它负责执行具体任务,你则要检查结果。

二、Coding Agent 如何工作?

这是课程最重要的技术原理。

传统 LLM(Large Language Model,大语言模型)主要根据输入上下文生成输出。

但 Coding Agent 在此基础上增加了一个负责执行工具调用的程序,教材称为 Agent Harness。

User Prompt

用户提出编程需求

LLM

分析上下文,生成下一步动作

Agent Harness(智能体运行框架)

文件读写

终端命令

运行测试

工具结果反馈给模型,继续分析和修正

例如,你告诉 Agent:

将这个 Python 脚本改造成命令行工具,使用 argparse 解析参数,添加类型注解,并确保类型检查通过。

Agent 可能执行这样的流程:

  1. 读取 Python 文件。
  2. 分析程序当前结构。
  3. 修改代码,增加 argparse。
  4. 添加 Type Hints(类型注解)。
  5. 执行 mypy 类型检查。
  6. 如果有错误,就继续修改。
  7. 检查通过后向你报告结果。

这个过程最关键的地方,是 Feedback Loop(反馈循环)。

它不是只生成一段代码,而是利用真实的工具运行结果验证自己的工作。

三、LLM 的 Context Window 是什么?

Context Window(上下文窗口)指模型在一次推理中能够处理的上下文长度限制。

例如,一个项目可能包含:

project/
├── app.py
├── database.py
├── utils.py
├── tests/
├── docs/
└── README.md

如果 AI 同时读取大量文件、文档、终端输出和历史对话,就会消耗上下文容量。

这会带来两个问题:

  • 上下文可能超过模型的容量限制。
  • 即使没有超过限制,大量无关信息也可能干扰模型完成当前任务。

因此,有效使用 Coding Agent,不只是写出好的 Prompt,还需要管理提供给它的上下文。

课程介绍了三种常见方法:

方法 含义 适用场景
Clear Context 开始新的对话 切换到完全不同的任务
Rewind 回退之前的对话步骤 Agent 沿错误方向工作
Compaction 压缩已有对话信息 对话过长,需要保留重要上下文

这部分还有一个重要结论:

提供更多上下文不一定更好,提供准确且相关的上下文才更重要。

四、Coding Agent 有哪些实际用途?

1. Implementing Features:实现新功能

假设你有一个 Python 项目,需要增加 CSV 导出功能。

你可以要求 Agent:

在现有项目中增加导出 CSV 的功能。保留现有 API,增加单元测试,运行全部测试,并列出修改的文件。

这比简单要求“帮我写一个 CSV 函数”更完整。

因为你不仅告诉它要做什么,还明确了不能破坏什么,以及如何验收。

2. Fixing Errors:修复错误

例如:

mypy .

报告:

error: Incompatible return value type

你可以要求 Agent 找出原因、修复问题,再重新运行 mypy。

这种能够自动运行检查工具的任务非常适合 Agent。

3. Refactoring:重构代码

Refactoring 指在尽量保持外部行为不变的前提下,改善代码结构。

例如,将一个 500 行的 Python 文件拆分成:

project/
├── api.py
├── models.py
├── services.py
└── utils.py

Agent 可以帮助调整导入路径、函数位置以及相关测试。

但是必须验证重构没有破坏原有功能。

4. Code Review:代码审查

可以让 Agent 检查:

  • 潜在 Bug。
  • 不合理的异常处理。
  • 缺失的测试。
  • 安全风险。
  • 重复代码。

例如:

Review the changes since the last commit. Focus on correctness, security and missing tests.

但这不意味着 AI 的审查结果一定正确。它可能遗漏真实问题,也可能把正常代码误判为 Bug。

5. Code Understanding:理解陌生代码库

这对新加入项目的开发者尤其有用。

例如:

Explain how authentication works in this repository. Identify the main entry points and relevant files.

Agent 可以阅读相关文件,帮助你理解认证流程。

这比漫无目的地逐个阅读文件通常更高效。

6. Vibe Coding

教材还介绍了 Vibe Coding。

其含义是:开发者主要通过自然语言描述目标,由 AI 完成绝大部分实际代码编写。

这种方式适合快速原型和探索性项目,但对于长期维护的软件,开发者仍然需要理解代码、安全边界和测试结果。

五、进阶 Agent:AGENTS.md、Skills、Subagents 和 MCP

这四个术语很容易混淆。

1. AGENTS.md:项目级指导文件

假设你的项目中有:

project/
├── AGENTS.md
├── src/
└── tests/

AGENTS.md 可以用于告诉兼容的 Coding Agent 如何在这个项目中工作。

例如:

# Project Instructions

- Use Python 3.12.
- Format code with Ruff.
- Run pytest after changing code.
- Do not modify generated files.
- Do not commit API keys.

它的作用类似于一份给 AI 开发者阅读的项目说明。

不同 Agent 对指令文件的名称、作用范围和加载规则可能不同。

2. Skills:按需加载的专门工作流程

AGENTS.md 一般用于项目级约定。

Skill 则可以把某项专门任务的操作方法单独封装。

例如:

skills/
└── code-review/
    └── SKILL.md

里面可以说明:

  • 如何分析代码变更。
  • 重点检查哪些风险。
  • 如何运行测试。
  • 如何组织审查结果。

Agent 在需要进行代码审查时,再按自身支持的机制加载对应的 Skill。

这样可以减少每次对话都加载大量无关指导信息的问题。

3. Subagent:子智能体

Subagent 是由主 Agent 调用、负责特定任务的智能体。

例如,主 Agent 正在实现新功能,同时可以将代码检查任务交给专门的子智能体。

Main Agent

负责整体开发任务

Code Agent

实现功能

Checking Agent

运行 mypy、ruff

教材提供的练习就是创建一个 Python Code Checking Subagent,使它能够:

  • 对上一次 Git Commit 后修改过的 Python 文件执行 mypy。
  • 运行 ruff。
  • 检查代码格式和静态分析问题。
  • 向主 Agent 返回检查结果。

4. MCP:Model Context Protocol

MCP 是一种用于连接 AI 应用与外部工具或数据源的开放协议。

例如,Agent 可以通过支持的 MCP 服务访问文档或其他工作系统。

因此,它和前面的概念并不相同:

概念 主要解决的问题
AGENTS.md Agent 应当遵守哪些项目规则?
Skill Agent 如何完成某类专门任务?
Subagent 哪个专门 Agent 来完成子任务?
MCP Agent 如何连接外部工具和数据源?

5. Parallel Agents:并行智能体

教材还介绍了让多个 Agent 同时开发。

例如:

  • Agent A 修改前端。
  • Agent B 修改后端。
  • Agent C 增加测试。

如果多个 Agent 直接修改同一工作目录,就可能发生冲突。

因此课程推荐结合 Git Worktree,为不同 Agent 提供相对独立的工作目录。

六、Coding Agents 的风险

教材特别强调了几个风险:

第一,AI 可能产生错误代码。即使代码可以运行,也不代表它满足业务要求。

第二,AI 可能陷入调试循环。它不断尝试修改,但没有真正定位问题,甚至造成更多修改。

第三,隐私与安全。部分 Coding Agent 会把代码、上下文或工具结果传输给云端模型。使用前需要理解相关权限和数据处理方式。

第四,过度依赖。如果完全不理解生成的代码,短期看似节省了时间,长期却可能降低你独立开发和排查问题的能力。

因此,教材特别提醒:不要把允许 Agent 不经确认执行危险操作的模式当作日常默认配置。即使使用隔离容器或虚拟机,也必须考虑网络、文件挂载和凭证的安全边界。

这一节的核心不是“让 AI 替代程序员”,而是:

学会如何提出明确任务、提供正确上下文,并通过真实工具验证 AI 的工作结果。

第二节:Code Quality(代码质量)

这一节讨论一个非常实际的问题:

程序可以运行,是否意味着代码质量很好?

答案是否定的。

例如,下面两段 Python 代码在正常输入下可以产生相同结果:

def add(a,b):return a+b
def add(a: int, b: int) -> int:    return a + b

第二段代码结构更清晰,而且具有类型注解。

但即使第二段代码写得很整洁,也不能证明它没有逻辑错误。

因此,课程介绍了一系列不同层次的质量保证工具:

Formatting、Linting、Testing、Pre-commit Hooks、Continuous Integration 和 Command Runners。

一、Formatting:代码格式化

Formatting 是自动统一代码风格的过程。

例如,你写了:

def calculate(a,b):  return a+b

格式化工具可以调整为:

def calculate(a, b):    return a + b

通常可以自动处理:

  • 空格与缩进。
  • 引号风格。
  • 过长代码行。
  • 换行方式。
  • 一些语法布局规则。

常见工具包括:

语言 工具
Python Ruff Formatter、Black
JavaScript / TypeScript Prettier
Go gofmt
多种文件格式 Prettier 等

例如,Python 项目使用 Ruff:

ruff format .

就可以按照配置格式化项目。

还可以配置 IDE 在保存文件时自动格式化。

为什么这很重要?

假设一个团队有十个人,每个人都习惯不同的缩进、换行和引号方式。

代码审查时,就会出现大量无意义的格式变化。

统一格式的好处,是让程序员把注意力集中在真正重要的逻辑修改上。

二、Linting:静态代码检查

Formatting 和 Linting 的区别非常重要。

Formatting 关注代码怎么写得整齐;Linting 关注代码中是否存在可疑或不合理的写法。

例如:

import osdef calculate():    x = 10    return 42

这里的 os 没有使用,x 也没有被使用。

代码能够运行,但存在没有必要的内容。

Linter 可能报告:

Unused import: os
Local variable x is assigned but never used

使用 Ruff:

ruff check .

可以运行规则检查。

某些可安全自动修复的问题可以使用:

ruff check --fix .

但是,不是所有 Lint 警告都意味着代码一定错误。

部分规则可能产生 False Positive(误报),而且自动修复仍需要检查结果。

Formatter、Linter 和 Type Checker 的区别

工具 主要检查内容 示例
Formatter 格式与排版 空格、缩进、换行
Linter 可疑写法和代码规范 未使用变量、复杂条件
Type Checker 类型是否一致 函数返回 str 却声明为 int

例如:

def get_age() -> int:    return "twenty"

mypy 这类类型检查工具可以指出返回值与声明的类型不一致。

但类型检查通过,也不意味着程序逻辑一定正确。

Semgrep 是什么?

教材还介绍了 Semgrep。

普通文本搜索主要匹配字符,而 Semgrep 可以根据程序语言结构搜索代码模式。

例如:

semgrep -l python \
  -e "subprocess.Popen(..., shell=True, ...)"

它可以帮助找出符合特定调用模式的 Python 代码。

这种能力对于自定义安全检查、查找危险 API 用法和执行团队代码规则非常实用。

三、Testing:自动化测试

这是代码质量部分最重要的概念之一。

假设你写了:

def divide(a, b):    return a / b

你手动运行:

print(divide(10, 2))

输出:

5.0

于是你认为程序正确。

但这只验证了一个输入组合。

例如:

divide(10, 0)

会发生什么?

它会抛出 ZeroDivisionError。

这不一定意味着实现错误,因为函数的设计可能本来就要求分母非零。但它说明,我们需要明确函数的预期行为并测试。

1. Unit Test:单元测试

单元测试通常针对单个函数或较小的功能单元。

例如:

# calculator.pydef add(a: int, b: int) -> int:    return a + b

使用 pytest:

# test_calculator.pyfrom calculator import adddef test_add():    assert add(2, 3) == 5def test_add_negative():    assert add(-2, 3) == 1

执行:

pytest

如果实现符合断言,测试就会通过。

assert 的意思是:断言后面的条件必须成立。

2. Integration Test:集成测试

单元测试主要检查单个组件。

集成测试则关注多个组件协同工作时是否正常。

例如:

API
 ↓
Business Logic
 ↓
Database

一个 API 的业务逻辑可能完全正确,但数据库连接配置错误,导致整个功能不可用。

集成测试可以覆盖这种跨组件的问题。

3. Functional / End-to-End Test

端到端测试会从用户使用场景出发,测试一条较完整的业务流程。

例如,一个购物网站:

用户登录
   ↓
选择商品
   ↓
加入购物车
   ↓
提交订单
   ↓
确认结果

这类测试通常更接近用户实际使用系统的方式。

4. 其他测试方法

教材还介绍了:

  • Test-Driven Development(TDD):先编写测试,再实现功能。
  • Regression Testing(回归测试):为已经修复的 Bug 增加测试,防止再次出现。
  • Property-Based Testing(基于性质的测试):描述程序应当始终满足的性质,并自动生成输入进行验证。
  • Mocking(模拟依赖):在测试中用可控对象代替数据库、网络 API 等外部依赖。

例如,除法函数的一项性质是:

对于任意满足条件的数 a 和非零数 b:

[ (a/b)\times b\approx a ]

这里通常要考虑浮点数误差。

Property-Based Testing 工具可以根据这种性质生成大量不同的输入,而不局限于几个手写测试案例。

四、Code Coverage:代码覆盖率

假设你有一个函数:

def classify(x):    if x > 0:        return "positive"    elif x < 0:        return "negative"    else:        return "zero"

你只测试:

classify(10)

虽然测试通过,但你并没有测试负数和零。

Code Coverage(代码覆盖率)用于衡量执行测试时,哪些代码被运行过。

假设某个项目的行覆盖率为 75%

75% 已执行

25% 未执行

使用 pytest-cov 可以生成覆盖率报告,例如:

pytest --cov=. --cov-report=html

然后查看 HTML 报告,找到哪些代码没有得到测试。

但是教材特别提醒:

高覆盖率不等于高质量测试。

假设一个测试只是调用函数,却完全不检查结果,那么它也可能提高覆盖率。

因此,比起盲目追求 100%,更重要的是测试关键行为、边界情况和错误处理是否正确。

五、Pre-commit Hooks:提交前自动检查

你已经学过 Git,因此这一部分比较容易理解。

正常提交流程:

修改代码
   ↓
git add
   ↓
git commit

如果我们希望每次提交前都自动检查代码格式和 Lint 问题,就可以使用 Git Hook。

例如:

修改代码
   ↓
git add
   ↓
Pre-commit Checks
   ├── Formatter
   ├── Linter
   └── Other Checks
   ↓
git commit

Pre-commit Hook 可以在提交前运行配置好的检查任务。

如果检查不通过,提交通常会被阻止,直到问题得到修复。

它主要解决:

防止不符合项目规范的代码轻易进入版本历史。

不过本地 Hook 可以被跳过,团队也不能假设每个人都正确安装了 Hook。

这就是为什么还需要 CI。

六、Continuous Integration(CI):持续集成

这是现代软件开发中非常重要的工程实践。

假设你的项目托管在 GitHub。

每次开发者提交代码或创建 Pull Request 时,CI 系统都可以自动运行检查。

Git Push / Pull Request

GitHub Actions (CI)

Format

Lint

Test

PASS

检查通过

FAIL

反馈错误

例如,一个 GitHub Actions 工作流可以写成:

name: Python CI

on: [push, pull_request]

jobs:
  quality:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Install tools
        run: python -m pip install ruff pytest

      - name: Lint
        run: ruff check .

      - name: Format check
        run: ruff format --check .

      - name: Test
        run: pytest

这是一个用于理解 CI 的简化示例。

它会在 push 或 Pull Request 事件发生时检查项目。

真实项目还需要根据依赖安装方式、测试配置和安全策略调整工作流。

CI 和 CD 的区别

  • CI(Continuous Integration):持续集成,自动构建、检查和测试代码。
  • Continuous Deployment(持续部署):在满足条件后,将修改自动部署到目标环境。

例如,课程网站可以在提交代码后自动运行检查,再构建并部署到 GitHub Pages。

七、Command Runners:命令运行器

项目变大之后,开发者可能需要记住很多命令:

uv run ruff check .
uv run ruff format .
uv run pytest
uv run mypy .

教材介绍了 just 这样的 Command Runner。

你可以在项目中定义:

lint:
    uv run ruff check .

format:
    uv run ruff format .

test:
    uv run pytest

然后执行:

just lint
just test

它的本质是:

给复杂或常用的项目命令提供统一、易记的入口。

这也能够降低新成员加入项目时的学习成本。

八、Regular Expressions:正则表达式

这部分虽然看起来与代码质量不同,但在代码搜索、日志分析和批量替换中非常实用。

Regex(Regular Expression,正则表达式)是一种描述文本匹配模式的语言。

1. 最基础的正则表达式

例如:

abc

匹配字符串中的 abc。

\d+

匹配一个或多个数字。

\d{4}-\d{2}-\d{2}

匹配类似:

2026-01-14

的日期形式。

但注意,它同样可能匹配:

2026-01-99

因为这个正则表达式检查的是字符格式,而不是日期是否合法。

2. 常见正则语法

符号 意思 示例
. 匹配一个字符 a.c
* 前面的模式重复 0 次或多次 a*
+ 前面的模式重复 1 次或多次 a+
? 前面的模式出现 0 次或 1 次 a?
\d 数字字符 \d{4}
\w 单词字符 \w+
[abc] a、b、c 中的一个 [abc]
^ 字符串或行的开头,取决于模式 ^Hello
$ 字符串或行的结尾,取决于模式 end$
(...) 捕获分组 (\d+)
a\|b 两个模式二选一 cat\|dog

3. Capture Group:捕获组

假设你有一个日期:

2026-01-14

只想获取月份 01。

可以使用:

import retext = "2026-01-14"match = re.match(    r"\d{4}-(\d{2})-\d{2}",    text)print(match.group(1))

输出:

01

其中括号:

(\d{2})

表示捕获两位数字。

.group(1) 表示获取第一个捕获组的内容。

4. Greedy 和 Non-greedy:贪婪与非贪婪匹配

这是正则表达式中非常容易出错的地方。

假设字符串为:

"name": "Alice", "college": "MIT"

如果使用:

"name": "(.*)"

.* 默认是贪婪匹配,可能匹配尽可能长的内容,把后面的字段也包含进去。

而:

"name": "(.*?)"

使用非贪婪匹配,会尽量在第一个符合条件的位置停止。

但教材特别提醒:

对于 JSON、HTML 等具有复杂结构的数据,不应该依赖简单正则表达式进行完整解析。

例如,要提取 JSON 中的 name:

import jsondata = '{"name": "Alice", "college": "MIT"}'person = json.loads(data)print(person["name"])

这比尝试编写一个处理所有 JSON 转义情况的正则表达式更加可靠。

第三节:Communication & Collaboration(工程沟通与团队协作)

这一节与前面两节有所不同。

前两节主要讲技术工具,而这节课强调:

优秀的软件工程师不仅需要写出正确的代码,还要让其他人能够理解、审查、使用和维护这些代码。

课程开头提出了一个非常重要的原则:

记录和传达 Why(为什么),而不仅仅是 What(做了什么)。

因为代码通常已经能告诉别人“程序做了什么”,但往往无法告诉别人“当初为什么这样设计”。

一、Code Comments:怎样写有价值的注释?

先看一个没有太大价值的注释:

# Increase counter by onecounter += 1

这段注释几乎没有增加任何信息。

因为代码已经能够清楚表达它的行为。

再看另一种:

# Retry at most three times because the upstream# service rate-limits repeated failed requests.MAX_RETRIES = 3

第二段注释不仅解释了常量的含义,还解释了为什么选择这个值。

这就更有价值。

教材推荐的注释类型

类型 应该解释什么
TODO 哪些工作尚未完成,为什么暂时没有做
References 算法、规范或实现依据来自哪里
Correctness Arguments 为什么这段复杂代码能够产生正确结果
Hard-learned Lessons 过去遇到过哪些不明显的问题
Rationale for Constants 某个固定数值为什么这样设置
Load-bearing Choices 哪些看似普通的实现细节不能随意修改
Why not 为什么没有使用一个看起来更简单的方案

例如:

# Do not replace this ordered collection# with a set: later processing depends# on preserving the original input order.

它不是在描述代码执行了什么,而是在提醒未来的维护者:

这里有一个容易被忽略的设计约束。

如果没有这段注释,其他程序员可能出于性能考虑将其替换为普通集合,从而意外改变程序行为。

这里还涉及一个非常重要的写作原则:

注释应该补充代码无法充分传达的信息,而不是重复代码。

二、README:让其他人理解你的项目

README 通常是别人接触一个项目时看到的第一份文档。

教材建议 README 尽早回答四个问题:

  1. What does this do? —— 这个项目做什么?
  2. Why should I care? —— 为什么它对我有用?
  3. How do I use it? —— 如何使用它?
  4. How do I install it? —— 如何安装它?

注意它的顺序。

很多开发者习惯先写一大段安装教程。

但用户首先想知道的是:这个工具是否解决自己的问题。

例如,一个 Python CSV 清洗工具的 README 可以这样组织:

README.md 示例结构

CSV Cleaner

A command-line tool for cleaning duplicate rows in CSV files.

首先说明项目的用途

Why use it?

Remove duplicate rows automatically without manually editing spreadsheets.

解释项目的实际价值

Usage

csv-cleaner input.csv --output clean.csv

展示用户如何使用

Installation

pip install csv-cleaner

最后说明安装过程,命令仅作示例

一个好的 README 应该让用户能够快速判断项目是否适合自己,并在需要时找到详细信息。

三、Commit Messages:如何写高质量的 Git 提交信息?

你之前学过:

git commit -m "fix bug"

这虽然是有效命令,但提交信息的价值很低。

因为它没有解释:

  • 修复了什么 Bug?
  • 为什么 Bug 会发生?
  • 为什么采用当前修复方式?
  • 是否存在副作用?

教材推荐使用:

Problem → Solution → Implications

即:

问题 → 解决方案 → 影响

例如,假设系统中的付款请求偶尔被重复处理。

一个较好的提交信息可以写成:

Prevent duplicate payment processing

Problem:
Network retries may submit the same payment
request multiple times.

Solution:
Use an idempotency key to identify repeated
requests and reuse the existing result.

Implications:
Payment requests now require a stable
idempotency key from the caller.

这个提交信息不仅说明了修改内容,还解释了问题背景以及可能产生的影响。

这在几个月后调查历史问题时会非常有用。

Atomic Commits:原子提交

教材还推荐将代码按照独立的逻辑变化组织成 Commit。

例如:

较好的提交组织

Commit A: Add user authentication

Commit B: Add authentication tests

Commit C: Update authentication docs

不理想的提交组织

Commit A: Fix login, update payment, rename files, format code, change README

把无关修改塞进同一个 Commit,会让代码审查和后续排查问题变得更加困难。

你之前学过的:

git add -p

就可以帮助你将文件中的不同修改块分开暂存,创建逻辑上更清晰的提交。

四、Bug Reports:如何写好错误报告?

假设你发现某个软件有问题。

你提交了一个 Issue:

This doesn't work. Please fix it.

维护者很可能不知道问题发生在哪里。

课程建议,一个好的 Bug Report 至少应该说明:

  • Environment:操作系统、软件版本及相关配置。
  • Expected Behavior:预期行为。
  • Actual Behavior:实际发生的结果。
  • Reproduction Steps:如何复现问题。
  • Attempted Solutions:你已经尝试过哪些解决方式。

例如:

Bug Report 示例

Title: CSV export fails when the input is empty

Environment

Python 3.12, Ubuntu 24.04, application v1.2.0

Expected Behavior

The command should produce an empty CSV file containing the header row.

Actual Behavior

The program raises an IndexError.

Steps to Reproduce

  1. Create an empty input CSV file.
  2. Run csv-cleaner input.csv --output result.csv.
  3. Observe the exception.

What I Tried

Tested with a non-empty CSV file; the problem did not occur.

这种报告让维护者更容易理解和复现问题。

Minimal Reproducible Example:最小可复现示例

这是软件工程中非常重要的能力。

假设你的程序有 10,000 行代码,某个功能发生异常。

你可以尝试将导致错误的代码逐渐简化:

10,000 行项目
      ↓
500 行相关模块
      ↓
50 行相关逻辑
      ↓
10 行最小复现代码

最终得到一个只包含问题核心的示例。

这样的示例非常有价值,因为它可以排除不相关因素,帮助维护者快速定位错误。

有时你在缩小问题范围的过程中,就会自己发现根本原因。

五、Pull Request:如何向项目贡献代码?

Pull Request(PR)是 GitHub 等平台中常见的协作机制。

它让开发者提出代码修改,并邀请维护者审查、讨论和合并。

一个典型的工作流程是:

1

阅读 CONTRIBUTING.md

2

建立开发分支

3

实现一个明确的修改

4

运行格式检查与测试

5

创建 Pull Request

6

进行 Code Review

7

根据反馈修改并合并

教材建议你在提交 PR 前,先确认项目是否已有类似的 Issue 或正在进行的工作。

还要尽量控制 PR 的范围,不要为了实现一个小功能而同时修改大量无关文件。

一个好的 PR 描述不仅要说明修改了什么,还要解释:

为什么需要这个修改,以及为什么当前实现值得被项目接受。

维护者需要长期承担代码维护责任,因此合理的技术方案也可能因为维护成本过高或不符合项目方向而被拒绝。

六、Code Review:如何审查别人的代码?

Code Review 不只是寻找 Bug。

它还帮助团队共享知识、发现不合理的设计以及提高代码可维护性。

教材提出了几个很实用的原则。

1. Review the Code, Not the Person

评价代码,而不是评价程序员。

不理想:

You wrote confusing code.

更好的方式:

This function is difficult to follow. Could we split validation and processing into separate functions?

第二种表达更加聚焦于问题,也更容易推动改进。

2. Actionable Feedback

评论应该尽量可执行。

例如:

不理想:

Don't use globals.

更好的方式:

Could we replace these global variables with a configuration object to make testing easier?

3. 区分必须修改和个人建议

并不是所有 Review Comment 都应该阻止 PR 合并。

例如:

Blocking Issue:

一个身份验证函数允许未授权用户访问数据。

这是需要优先解决的正确性和安全问题。

Suggestion:

某个变量名可以更清楚。

这是可以讨论的改进建议,不一定需要阻止合并。

4. 不要无限追求细节

代码审查需要关注重要问题。

如果审查者不断纠结无关紧要的排版细节,会消耗开发者和维护者的时间。

这也是前面为什么需要 Formatter:机器可以自动处理的问题,就没有必要让人工 Review 占用大量时间。

七、Education:如何提出好的技术问题?

教材引用了 Julia Evans 关于如何提问的建议。

其中最重要的技巧是:

先说明你的理解,再指出你不理解的具体部分。

例如:

不理想:

I don't understand Docker.

更好的问题:

My understanding is that Docker containers share the host kernel, while virtual machines have their own guest OS. Does that mean Docker containers cannot run a different kernel from the host?

第二个问题更加具体。

回答者能够直接看出你已经理解了什么,以及需要澄清什么。

同样,提问时还应该尽量说明自己尝试了什么,以及遇到了怎样的结果。

这不仅适用于人与人之间的沟通,也适用于向 AI 提问。

八、AI Etiquette:AI 使用规范

教材最后讨论了 AI 在软件工程中的使用规范。

它强调:

当 AI 对你的工作有实质性贡献时,应该按照项目或组织的规则披露 AI 的使用情况。

例如:

  • AI 只帮助润色了 README。
  • AI 实现了某个函数,但你编写并验证了测试。
  • 整个应用主要由 AI 生成。

这几种情况并不相同。

教材还提醒,如果公司或团队对数据隐私、合规、代码生成以及 AI 使用有特殊要求,开发者应该遵守相关政策。

在考试、技术面试等考核情境中,也需要遵守明确的工具使用规则。

AI 可以帮助你提高效率,但不能代替你对代码正确性和工程责任的判断。

第四部分:如何将三节课结合起来?

我们用一个具体项目,把三份课程材料连接起来。

假设你准备开发一个 Python 命令行工具:

CSV Cleaner:自动删除 CSV 文件中的重复记录。

第一阶段:利用 Coding Agent 开发

你向 Coding Agent 提出任务:

Create a Python CLI that reads a CSV file, removes duplicate rows, and writes the cleaned data to a new file. Use argparse for command-line arguments, include type annotations, and add unit tests. Do not overwrite the input file.

Agent 可以阅读文件、创建程序、编写测试,并尝试执行检查。

第二阶段:通过 Code Quality 验证

代码生成后,你运行:

ruff format .
ruff check .
mypy .
pytest

分别检查代码格式、潜在问题、类型一致性和功能正确性。

接下来通过 Pre-commit Hook 和 GitHub Actions 自动运行这些检查。

这样,即使 AI 修改了代码,也必须经过相同的质量验证流程。

第三阶段:通过 Communication & Collaboration 交付

你创建清晰的提交记录:

git add .
git commit -m "Add CSV deduplication CLI"

编写 README,说明工具用途、使用方法和安装方法。

然后创建 Pull Request,向审查者说明:

项目解决了什么问题、采用了什么实现方式、如何测试,以及是否存在已知限制。

完整的软件工程工作流

需求与验收标准

明确什么才算完成

Coding Agent + Developer

生成、理解、修改代码

Formatter + Linter + Type Checker + Tests

自动验证代码质量

Git Commit + Pull Request

记录修改目的和技术决策

CI + Human Code Review

自动检查与人工判断,共同决定能否合并

这三个部分共同构成了现代软件工程实践的核心。

第五部分:课程练习与学习路线

三份教材包含了很多练习。如果你刚开始学习,我建议先完成下面这些具有代表性的任务。

综合学习任务

0/8 已完成

用 Coding Agent 完成一个小功能

让 AI 修改一个 Python 程序,并观察它如何读取文件、运行命令和修复错误。

创建 Agent 项目指导文件

编写 AGENTS.md,规定代码风格、测试命令和禁止修改的文件,测试 Agent 是否遵守。

配置 Ruff 和 pytest

让一个 Python 项目具备代码格式化、静态分析和单元测试。

练习覆盖率分析

执行带覆盖率的测试,找出未覆盖代码,并为关键情况补充测试。

配置 GitHub Actions

在 Push 和 Pull Request 时自动运行格式检查、Lint 和测试。

练习正则表达式

使用捕获组提取日期月份,比较贪婪与非贪婪匹配,再用 JSON 解析器处理结构化数据。

编写 README 和 Commit Message

说明项目用途、使用方法,并在提交说明中解释 Problem、Solution 和 Implications。

进行一次 Code Review

审查一份真实或练习用的 PR,区分 Blocking Issues 与 Suggestions,并提出可执行的反馈。

三节课最重要的知识总结

课程 最值得记住的原则
Coding Agents AI 可以执行编程任务,但必须有明确目标、合适上下文和结果验证
Code Quality Formatter、Linter、Type Checker、Tests 和 CI 解决不同层次的代码质量问题
Communication & Collaboration 优秀的技术沟通应该解释 Why,让其他人理解和长期维护你的工作

最终需要建立的思维方式是:

不要只是追求把代码写出来,而是要确保代码符合需求、经过验证、容易理解,并能够由其他工程师继续维护。

这三节课真正教给你的,就是如何从“会写程序的人”逐渐成长为“能够可靠交付软件的工程师”。

#1 ·
#2 Zethes :

现代软件工程实践:AI 编程智能体、代码质量与工程协作

基于 MIT The Missing Semester 三个主题的系统化教程

  • 第一部分:Agentic Coding(AI 编程智能体)
  • 第二部分:Beyond the Code(软件工程沟通与协作)
  • 第三部分:Code Quality(代码质量与自动化工程实践)

导言:从编写代码到交付可靠的软件

传统计算机课程通常比较关注算法、数据结构、编程语言和操作系统。但是,在真实的软件开发工作中,仅仅掌握这些知识是不够的。

一个软件工程师还需要解决以下问题:

  1. 如何快速理解一个陌生的软件项目?
  2. 如何借助 AI 完成代码开发,同时保证代码正确?
  3. 如何发现代码中的潜在错误?
  4. 如何自动执行代码检查和测试?
  5. 如何让其他开发者理解自己的代码?
  6. 如何与团队成员协作开发?
  7. 如何提交高质量的代码修改?
  8. 如何确保软件能够长期维护?

这三个主题共同回答了这些问题。

1. 软件工程的三个层次

我们可以将现代软件工程划分为三个层次。

第一层:Software Development(软件开发)

核心问题:如何把需求转化为代码?

涉及:

  • 需求理解
  • 代码阅读
  • 功能实现
  • AI 辅助编程
  • 代码重构

对应第一部分 Coding Agents。

第二层:Software Quality Assurance(软件质量保证)

核心问题:如何确保代码正确、稳定和可靠?

涉及:

  • 代码格式化
  • 静态分析
  • 类型检查
  • 自动化测试
  • 持续集成

对应第三部分 Code Quality。

第三层:Software Engineering Collaboration(软件工程协作)

核心问题:如何让不同的人共同理解、开发和维护软件?

涉及:

  • 技术文档
  • 代码注释
  • Git 提交记录
  • Bug Report
  • Pull Request
  • Code Review
  • 开源社区协作

对应第二部分 Beyond the Code。

三个层次不是独立的。

例如,当 AI 修改了一段代码后:

  • Coding Agent 负责实现修改。
  • Code Quality 工具负责验证修改。
  • Code Review 负责判断修改是否值得合并。
  • 技术文档负责记录修改背后的设计决策。

2. 本教程的贯穿案例

为了避免知识点彼此孤立,我们将围绕一个小型 Python 项目进行学习。

项目名称:Markdown Link Extractor

目标:开发一个命令行工具,从 Markdown 文件或网络资源中提取链接。

最终项目结构:

markdown-link-extractor/
│
├── AGENTS.md
├── README.md
├── pyproject.toml
├── uv.lock
├── .gitignore
├── .pre-commit-config.yaml
│
├── src/
│   └── link_extractor/
│       ├── __init__.py
│       └── cli.py
│
├── tests/
│   ├── test_extract.py
│   └── test_cli.py
│
└── .github/
    └── workflows/
        └── ci.yml

我们将逐步完成:

  1. 使用 AI 编程智能体开发程序。
  2. 为程序添加类型注解和自动化测试。
  3. 配置 Formatter 和 Linter。
  4. 配置 Git Pre-commit Hooks。
  5. 配置 GitHub Actions。
  6. 编写 README 和技术文档。
  7. 创建 Git Commit 和 Pull Request。
  8. 通过 Code Review 完成软件交付。

第一部分:Agentic Coding(AI 编程智能体)

第 1 章 理解 AI 编程智能体

1.1 从传统编程到 AI 辅助编程

传统软件开发通常遵循以下过程:

需求
 ↓
程序员分析问题
 ↓
编写代码
 ↓
运行程序
 ↓
发现错误
 ↓
修改代码
 ↓
重新测试

随着大语言模型的发展,程序员可以将部分开发任务交给 AI。

例如:

  • 解释一个陌生项目。
  • 根据需求生成函数。
  • 修改已有代码。
  • 编写单元测试。
  • 修复类型检查错误。
  • 重构大型模块。
  • 分析 Git 修改记录。

但需要区分三种 AI 编程方式。

1.1.1 AI Autocomplete(智能代码补全)

这是最基础的 AI 编程辅助方式。

例如:

def calculate_average(numbers):

AI 根据上下文预测后续代码:

    return sum(numbers) / len(numbers)

特点:

  • 以局部代码补全为主。
  • 通常不需要复杂的任务规划。
  • 适合减少重复编码。
  • 程序员仍然主导整个开发过程。

1.1.2 Inline Chat(代码编辑器中的 AI 对话)

程序员可以选中一段代码,让 AI:

  • 解释代码。
  • 优化代码。
  • 增加注释。
  • 修改函数。
  • 转换编程语言。

例如:

将这个函数重构为三个独立函数,
分别负责数据验证、数据处理和结果输出。

AI 根据要求生成修改建议或直接修改选中的代码。

1.1.3 Coding Agent(AI 编程智能体)

Coding Agent 的能力更进一步。

它不仅生成代码,还可以操作开发环境。

例如:

请分析这个项目。

找到处理用户登录的代码,
增加密码长度验证,
补充相应的单元测试,
运行测试和类型检查,
直到所有检查通过。

Agent 可以自主执行一系列操作:

  1. 查找项目文件。
  2. 阅读相关代码。
  3. 确定需要修改的位置。
  4. 修改代码。
  5. 创建测试。
  6. 执行测试。
  7. 根据错误继续修改。
  8. 总结最终结果。

这就是 Agentic Coding。

1.2 Coding Agent 的核心架构

要理解 Coding Agent,首先需要理解它不是一个单独的语言模型,而是由多个部分构成的系统。

1.2.1 LLM:大语言模型

LLM(Large Language Model)是 Coding Agent 的核心推理和文本生成组件。

从课程采用的高层模型来看:

给定输入字符串,模型根据训练得到的概率分布预测后续 Token。

可以写成:

[
P(y\mid x)
]

其中:

  • (x):输入 Prompt。
  • (y):模型生成的输出。
  • (P(y\mid x)):给定输入时生成某个输出的概率。

在编程任务中:

输入可以是:

  • 用户的需求。
  • 项目源代码。
  • 终端输出。
  • 历史对话。
  • 外部文档。

输出可以是:

  • 解释。
  • Python 代码。
  • 修改建议。
  • 工具调用请求。

需要注意,LLM 的输出是概率生成结果,并不意味着它已经通过程序运行验证。

1.2.2 Agent Harness:智能体运行框架

Agent Harness 是连接语言模型与外部工具的程序。

它负责:

  • 将上下文发送给模型。
  • 识别模型生成的工具调用请求。
  • 执行对应工具。
  • 将执行结果反馈给模型。
  • 管理对话和工具调用过程。
  • 根据权限策略决定是否需要用户确认。

例如,模型可能生成一个执行测试的工具调用请求:

Tool: Terminal

Command:
pytest tests/

Harness 负责执行命令,并将结果返回模型。

模型随后根据结果决定下一步。

1.2.3 Tools:外部工具

常见工具包括:

工具类别 典型功能
File Tools 读取、创建和修改文件
Shell 执行终端命令
Search 搜索项目和外部文档
Git 查看版本历史和代码差异
Testing 执行自动化测试
Type Checking 执行类型检查
Browser 浏览网页和在线文档

1.2.4 Agent Loop:智能体循环

Coding Agent 最重要的工作机制是反复执行:

Observe → Think → Act → Observe

即:

观察 → 分析 → 行动 → 再次观察。

例如:

用户提出需求
    ↓
Agent 阅读项目
    ↓
Agent 分析代码结构
    ↓
Agent 修改代码
    ↓
Agent 运行测试
    ↓
测试失败?
  ↙       ↘
 是         否
 ↓          ↓
分析错误    汇报结果
 ↓
重新修改
 ↓
重新测试

这就是为什么允许 Agent 运行测试工具特别重要。

如果 Agent 只能生成代码,却不能获得测试反馈,它就很难建立可靠的自动修正循环。


第 2 章 如何正确使用 Coding Agent

2.1 从模糊需求到明确任务

一个常见错误是只告诉 Agent:

帮我优化这个项目。

这个需求过于模糊。

Agent 不知道:

  • 哪些地方需要优化?
  • 是性能还是可维护性?
  • 是否允许改变 API?
  • 是否可以修改项目结构?
  • 如何判断优化成功?

更好的方法是把需求拆分为五个部分。

任务描述模板

Task:
需要完成什么任务?

Context:
当前项目是什么情况?
涉及哪些文件和功能?

Constraints:
有哪些不能违反的限制?

Acceptance Criteria:
什么情况下认为任务完成?

Verification:
应该运行哪些检查?

例如:

Task:
将现有 Markdown 链接提取脚本改造成命令行程序。

Context:
当前程序通过 urllib 下载 Markdown 文件,
使用正则表达式提取链接。

Constraints:
1. 使用 Python 标准库。
2. 保留现有提取逻辑。
3. 不引入不必要的第三方依赖。
4. 使用类型注解。

Acceptance Criteria:
1. 支持通过命令行传入 URL。
2. 支持将结果输出到终端。
3. 支持将结果保存到文件。
4. 网络请求失败时给出清晰错误信息。

Verification:
运行 pytest。
运行 mypy。
运行 ruff。

这种任务描述比简单的自然语言要求更容易得到可靠结果。

2.2 实践:让 Agent 改造一个 Python 程序

原课程给出了一个示例。

首先有一个简单程序:

from urllib.request import urlopen
import re

def download_contents(url: str) -> str:
    with urlopen(url) as response:
        return response.read().decode("utf-8")

def extract(content: str) -> list[str]:
    pattern = r"\[.*?\]\((.*?)\)"
    return re.findall(pattern, content)

print(
    extract(
        download_contents(
            "https://example.com/document.md"
        )
    )
)

这个程序有几个问题:

  1. URL 被写死在代码中。
  2. 无法通过命令行传入不同 URL。
  3. 缺少完善的错误处理。
  4. 没有定义清晰的程序入口。
  5. 还没有建立自动化测试。

现在让 Coding Agent 将其改造成命令行程序。

目标结构:

import argparse
import re

from urllib.request import urlopen


def download_contents(url: str) -> str:
    with urlopen(url, timeout=10) as response:
        return response.read().decode("utf-8")


def extract(content: str) -> list[str]:
    pattern = r"\[.*?\]\((.*?)\)"
    return re.findall(pattern, content)


def main() -> None:
    parser = argparse.ArgumentParser()

    parser.add_argument(
        "url",
        help="Markdown document URL"
    )

    args = parser.parse_args()

    content = download_contents(args.url)

    links = extract(content)

    for link in links:
        print(link)


if __name__ == "__main__":
    main()

运行:

python main.py https://example.com/document.md

这里使用了 Python 的 argparse 模块。

它负责解析命令行参数。

例如:

python main.py --help

可以显示程序使用说明。

进一步改进

可以继续要求 Agent:

请进一步改进这个程序:

1. 增加输出文件参数 --output。
2. 网络请求失败时返回非零退出状态。
3. 对输入 URL 进行基本检查。
4. 为 extract 编写单元测试。
5. 使用 mypy 检查类型。
6. 使用 Ruff 检查代码质量。

这里需要特别注意:

课程中的正则表达式是一个简单的 Markdown 链接提取示例,不是完整的 Markdown 解析器。对于包含嵌套括号、转义字符等复杂情况的 Markdown,需要更完善的解析方案。

2.3 让 Agent 形成闭环

最重要的不是让 AI 生成更多代码,而是让它能够验证自己的修改。

推荐工作方式:

明确需求
  ↓
阅读代码
  ↓
制定修改方案
  ↓
执行修改
  ↓
运行测试
  ↓
检查失败信息
  ↓
修改
  ↓
再次验证

可以使用如下 Prompt:

请不要只根据代码阅读结果判断任务完成。

你需要:

1. 修改相关文件。
2. 运行项目已有的测试。
3. 运行类型检查。
4. 运行 Linter。
5. 检查失败原因。
6. 修复你造成的问题。
7. 再次执行全部检查。

最后列出:
- 修改了哪些文件
- 解决了什么问题
- 执行了哪些检查
- 哪些检查通过
- 还有哪些未解决的问题

注意:Agent 声称检查通过,不等于检查确实通过。需要查看实际终端结果。


第 3 章 Coding Agent 的主要应用场景

3.1 Feature Implementation:新功能开发

任务:为一个已有程序增加功能。

例如:

为现有用户管理系统增加 CSV 导出功能。

要求:
- 支持选择导出字段。
- 支持 UTF-8 编码。
- 不修改原有查询 API。
- 为正常情况和异常情况增加测试。

适用场景:

  • 增加功能。
  • 编写重复代码。
  • 扩展 API。
  • 增加命令行参数。
  • 实现数据处理逻辑。

3.2 Error Fixing:错误修复

当编译器、Linter、Type Checker 或测试出现错误时,可以将错误信息交给 Agent。

例如:

运行 mypy 后出现以下错误:

Incompatible return value type

请分析原因并修复。
不要通过简单关闭类型检查规则来消除错误。

为什么要避免只关闭规则?

因为这可能只是隐藏了问题,并没有真正修复问题。

3.3 Refactoring:代码重构

重构是改善代码内部结构,而尽量不改变外部行为。

例如:

原本有一个过长的函数:

def process_user(data):
    # 数据验证
    # 数据清洗
    # 数据保存
    # 日志记录
    pass

可以拆分为:

def validate_user(data):
    pass


def clean_user(data):
    pass


def save_user(data):
    pass


def process_user(data):
    validate_user(data)
    clean_user(data)
    save_user(data)

重构之后,应该使用测试验证原有功能没有被破坏。

3.4 Code Review:AI 辅助审查

可以让 Agent 检查最近一次 Commit 的修改:

Review all changes since the last commit.

Focus on:
1. Correctness bugs.
2. Security vulnerabilities.
3. Missing error handling.
4. Performance issues.
5. Missing tests.

For each finding, provide:
- File and line number.
- Explanation.
- Potential impact.
- Suggested fix.

Do not report purely stylistic preferences.

AI 的审查结果应作为候选问题,而不是最终结论。

3.5 Code Understanding:理解陌生项目

当你接触一个大型代码库时,可以让 Agent:

  • 识别项目入口。
  • 解释模块关系。
  • 找出关键数据结构。
  • 追踪函数调用关系。
  • 解释一个功能的执行路径。

建议使用逐步追问,而不是一次要求它解释整个仓库。

例如:

第一步:

请识别项目的主要入口文件。

第二步:

请追踪用户登录请求的调用路径。

第三步:

请解释认证中间件的工作机制。

第四步:

请指出这一实现可能存在的安全风险。

3.6 Shell as an Interface:自然语言驱动终端

Agent 还可以将自然语言转换为 Shell 命令。

例如:

找到项目中所有超过 500 行的 Python 文件。

Agent 可能使用:

find . -name "*.py" -exec wc -l {} \;

但是,Shell 命令具有很强的操作能力。

涉及删除文件、修改权限、覆盖数据、访问网络和读取秘密信息的命令,必须谨慎审查。

3.7 Vibe Coding:自然语言驱动应用开发

Vibe Coding 适合:

  • 小型原型。
  • 概念验证。
  • 个人工具。
  • 快速试验。
  • 交互界面草稿。

不适合直接将未经理解和验证的生成结果投入关键生产系统。


第 4 章 进阶智能体工程

4.1 Reusable Prompts:可复用提示词

如果你经常要求 Agent 做代码审查,可以把任务要求保存为模板。

例如:

你是一个 Python Code Review Agent。

请重点检查:
1. 逻辑正确性。
2. 异常处理。
3. 类型安全。
4. 资源管理。
5. 安全问题。
6. 测试覆盖。

请优先报告高风险问题。

不要仅仅为了个人风格提出修改建议。

这样可以减少重复编写 Prompt 的时间。

4.2 Parallel Agents:并行智能体

多个 Agent 可以同时完成不同任务。

例如:

Agent 工作
Agent A 实现 API
Agent B 编写测试
Agent C 阅读技术文档
Agent D 审查安全风险

但要避免多个 Agent 同时修改相同文件。

课程推荐使用 Git Worktree 隔离工作目录。

例如:

git worktree add ../project-api feature-api

git worktree add ../project-tests feature-tests

这样不同工作目录可以对应不同分支。

4.3 MCP:Model Context Protocol

MCP 是连接 AI 应用与外部工具、数据源的开放协议。

例如,一个支持 MCP 的 Coding Agent 可以通过相应服务:

  • 读取项目文档。
  • 查询数据库。
  • 访问 Notion。
  • 与其他工作系统交互。

MCP 解决的是模型如何通过标准化接口访问外部工具和上下文的问题。

它不是一个新的语言模型,也不是编程语言。

4.4 Context Management:上下文管理

课程重点介绍四种方式。

Clear Context

对于完全不同的任务,开始新的对话。

避免无关历史干扰当前任务。

Rewind

当 Agent 沿着错误方向执行时,回退到之前的状态。

比不断叠加修正 Prompt 更有效。

Compaction

将较长的历史压缩为摘要。

保留重要信息,减少上下文消耗。

llms.txt

教材介绍了 /llms.txt 这一提议标准。

它的目标是提供适合语言模型阅读的文档入口。

例如,一个工具的文档可能包含:

https://example.com/llms.txt

它可以帮助 Agent 更高效地获取相关文档,但具体是否提供以及内容质量取决于项目。

4.5 AGENTS.md

AGENTS.md 是项目级指导文件。

例如:

# AGENTS.md

## Project

Python 3.12 project.

## Coding Standards

- Use type annotations.
- Use Ruff for formatting.
- Use Ruff for linting.

## Testing

Run pytest before completing a task.

## Restrictions

- Do not modify generated files.
- Do not commit secrets.
- Preserve public APIs unless explicitly requested.

它可以帮助 Agent 在多个任务和会话中遵循统一项目规范。

4.6 Skills 与 Subagents

Skill 是专门工作流程的封装。

Subagent 是负责特定任务的子智能体。

例如:

Main Agent
   |
   +-- Research Subagent
   |
   +-- Testing Subagent
   |
   +-- Security Review Subagent

它们可以让主 Agent 将工作委派给专门的子流程。

但不同产品对 Skills 和 Subagents 的支持方式不完全相同。


第 5 章 AI 编程的局限与风险

5.1 概率生成不等于程序正确

AI 可能生成:

  • 不存在的 API。
  • 错误的依赖用法。
  • 不符合需求的逻辑。
  • 不安全的代码。
  • 看似正确但实际失败的测试。

5.2 Debugging Spiral:调试循环

有时 Agent 会:

  1. 修改代码。
  2. 运行测试。
  3. 发现错误。
  4. 修改另一个位置。
  5. 引入新的错误。
  6. 再次尝试。

这种过程可能不断扩大修改范围。

解决方法:

  • 要求先定位根因。
  • 控制修改范围。
  • 查看 Git Diff。
  • 每次修改后运行相关测试。
  • 必要时回退。
  • 不要让 Agent 无限制地重复尝试。

5.3 Privacy:隐私风险

课程提醒,许多 AI 编程工具默认使用云端模型。

可能被发送到云端的信息包括:

  • 源代码。
  • 项目文件。
  • 提示词。
  • 终端输出。
  • 交互历史。

因此,使用前应该检查工具的数据处理方式、企业政策和隐私要求。

5.4 Overreliance:过度依赖

如果程序员只负责提出需求,完全不理解生成的代码,就很难承担长期维护责任。

尤其在学习阶段,完全让 AI 代替自己思考,可能使你获得了一个程序,却没有获得相应的编程能力。

最终原则:AI 可以承担执行任务的工作,但程序员必须承担理解、验证和决策的责任。


第二部分:Beyond the Code(软件工程沟通与协作)

第 6 章 软件工程为什么不仅仅是编程?

软件工程师的工作不仅包括编写程序,还包括与其他工程师进行持续交流。

真实项目中,你需要:

  • 解释系统如何工作。
  • 了解其他团队的需求。
  • 阅读他人的代码。
  • 参与技术决策。
  • 报告错误。
  • 审查代码。
  • 维护已有系统。

课程将工程沟通大致分成两类:

  1. One-way Communication:单向沟通。
  2. Two-way Communication:双向沟通。

单向沟通主要通过文档、注释和提交信息完成。

双向沟通主要通过讨论、Issue、PR、Review 和技术交流完成。


第 7 章 One-way Communication:单向技术沟通

7.1 为什么需要单向沟通?

假设你今天完成了一个复杂的功能。

六个月以后,另一位程序员接手这个项目。

他可能不知道:

  • 为什么使用当前算法?
  • 为什么选择这个数据结构?
  • 为什么某个参数是 1492?
  • 为什么没有采用另一种实现?
  • 哪些部分存在尚未解决的限制?

如果没有记录,这些知识就会随着开发者离开项目而消失。

因此,技术文档的一个核心任务是保存决策背后的原因。

7.2 Code Comments:代码注释

课程强调:

好注释解释 Why,而不是重复 What。

错误示例:

# Add one to counter
counter += 1

正确性或设计理由示例:

# Preserve insertion order because the downstream
# serializer depends on deterministic field ordering.

后者记录了代码中不容易直接看出的约束。

值得记录的七类注释

1. TODO

标记尚未完成的工作。

不好的写法:

# TODO: optimize

更好的写法:

# TODO: Current lookup is O(n^2), which is acceptable
# for fewer than 100 records. Introduce an index if
# the dataset grows beyond this size.

2. References

记录算法、论文或外部规范的来源。

例如:

# Implements the retry policy described in:
# https://example.com/specification

正式项目中最好引用稳定的文档版本或永久链接。

3. Correctness Arguments

解释复杂代码为什么正确。

# The loop invariant guarantees that all elements
# before i have already been processed.

4. Hard-learned Lessons

记录不容易发现的问题。

例如:

# Flush the buffer before closing the stream.
# Otherwise the final partial batch may be lost.

5. Rationale for Constants

解释魔法数字。

# Maximum batch size is 128 to stay within the
# downstream service's request limit.
MAX_BATCH_SIZE = 128

6. Load-bearing Choices

解释为什么某个实现细节不能随便改变。

# Keep this collection ordered because output
# generation depends on deterministic iteration.

7. Why Not

解释为什么没有采用看起来更简单的方案。

# Avoid global mutable state because it prevents
# independent tests from running safely in parallel.

7.3 README:项目说明文档

README 是项目的入口。

推荐结构:

# Project Name

## What does this project do?

## Why should you use it?

## Usage

## Installation

## Configuration

## Development

## Testing

## License

核心顺序:

What → Why → Usage → Installation

先让读者理解项目价值,再让读者学习使用和安装。

README 的质量标准

一个好的 README 应当:

  • 能快速说明项目目标。
  • 有可以直接理解的使用示例。
  • 给出清楚的安装步骤。
  • 说明必要的配置。
  • 指明项目限制。
  • 给出开发和测试方法。
  • 不用大量无关文字淹没核心信息。

7.4 Commit Messages:提交说明

Git Commit 不只是保存代码变化,也是记录项目演进历史。

不好的提交:

fix bug
update files
change code

这些内容无法帮助未来的开发者理解修改原因。

课程建议使用:

Problem → Solution → Implications

示例

Prevent duplicate payment processing

Problem:
Network retries may submit the same payment
request multiple times.

Solution:
Use an idempotency key to identify repeated
requests and reuse the existing result.

Implications:
Callers must now provide a stable idempotency key.

如何组织复杂 Commit?

一个 Commit 应当尽量代表一个逻辑完整的修改。

例如:

Commit 1: Add authentication validation
Commit 2: Add authentication unit tests
Commit 3: Update authentication documentation

不要把无关重构、格式化和功能开发混在一个提交中。

使用:

git add -p

可以交互式选择文件中的不同修改块。

这有利于:

  • 审查。
  • 回滚。
  • 使用 git bisect 定位问题。
  • 理解项目历史。

使用 LLM 生成 Commit Message

课程指出一个重要问题:

如果只给 LLM 一个 Git Diff,它通常只能知道 What,不知道 Why。

因此可以让模型:

根据当前 Diff 编写 Commit Message。

重点解释:
1. 修改所解决的问题。
2. 选择该方案的原因。
3. 考虑过哪些替代方案。
4. 修改带来的影响。

如果缺少必要背景,请先向我提问。

如果 Agent 本身参与了开发,它通常能够访问此前的需求和设计讨论,因此更容易生成准确的提交说明。


第 8 章 Collaboration:软件工程协作

8.1 软件开发中的参与者

开源项目中通常存在三类群体:

  • Users:使用软件的人。
  • Contributors:参与贡献的人。
  • Maintainers:负责项目长期维护的人。

课程指出,通常用户数量远大于贡献者数量,而贡献者数量又远大于维护者数量。

因此,维护者的时间是一种稀缺资源。

一个贡献是否值得被接受,不仅取决于它能否解决问题,还取决于它是否值得维护者投入时间。

这就是 High Signal-to-Noise Ratio(高信噪比)的重要性。

8.2 Bug Report:高质量错误报告

一个好的 Bug Report 应当包括:

内容 说明
Environment 操作系统、版本、配置
Expected Behavior 预期行为
Actual Behavior 实际行为
Reproduction Steps 复现步骤
Previous Attempts 已经尝试的排查方法

示例:

# Bug: CSV export fails for empty input

## Environment

Python 3.12
Ubuntu 24.04
Application v1.2.0

## Expected Behavior

An empty CSV should produce a valid output file
containing the header row.

## Actual Behavior

The program raises IndexError.

## Steps to Reproduce

1. Create an empty input.csv.
2. Run the export command.
3. Observe the exception.

## What I Tried

The issue does not occur with non-empty CSV files.

8.3 Search Existing Issues

提交 Issue 前,先检查:

  • 是否已经有人报告相同问题?
  • 是否存在正在讨论的解决方案?
  • 是否有相关的 Pull Request?
  • 是否有项目文档解释该行为?

重复创建 Issue 会增加维护成本。

如果已经存在相关讨论,通常更好的方式是补充有价值的信息。

8.4 Minimal Reproducible Example

最小可复现示例是帮助维护者定位问题的重要工具。

例如,原本有一个大型应用:

10000 lines of code

你逐步删除不相关模块,最后得到:

def parse_value(value):
    return value[0]

然后发现输入空字符串时会引发问题。

这比提交整个大型项目更有助于分析根因。

8.5 Issue 的沟通礼仪

课程特别提醒:

  • 不要频繁催促维护者。
  • 不要反复发布没有新增信息的“me too”。
  • 不要只复制终端输出。
  • 应该先搜索已有问题。
  • 如果等待一段时间没有回复,可以礼貌跟进。
  • 如果能够复现问题,尽量提供最小示例。

维护者可能是志愿者,不能假设他们随时有时间响应。

8.6 CONTRIBUTING.md

参与开源项目之前,应阅读:

CONTRIBUTING.md

它通常规定:

  • 如何创建开发分支。
  • 如何运行测试。
  • 代码风格要求。
  • PR 格式。
  • 提交信息要求。
  • 项目开发流程。

还需要注意项目许可证。

例如,某些 Copyleft 许可证会对衍生作品的发布方式产生要求。贡献之前应该了解许可证对代码使用和分发的影响。

如果发现安全漏洞,不应直接公开发布详细利用信息。应该优先通过项目的安全披露渠道联系维护者,给予合理修复时间。

8.7 Pull Request:提交代码贡献

一个好的 PR 应当满足:

  1. 修改范围明确。
  2. 尽量避免无关变化。
  3. 解释为什么需要修改。
  4. 解释为什么采用当前实现。
  5. 提供测试方式。
  6. 指出需要审查的重点。

如果一个功能确实需要很多相关文件的修改,可以使用较大的 PR,但应该保持 Commit 组织清晰,使维护者能够逐步审查。

AI 生成的 PR

课程特别提醒:

AI 可以快速生成代码,但不能因此降低贡献者的责任。

如果提交者自己无法解释代码,维护者就需要承担额外的理解、审查和维护成本。

因此,提交 AI 生成的代码之前,必须:

  • 理解主要实现。
  • 检查功能正确性。
  • 检查安全性。
  • 验证测试。
  • 删除无关修改。
  • 补充必要文档。

维护者最终接受的是长期维护责任,而不是一次性的代码输出。


第 9 章 Code Review:代码审查

9.1 为什么需要 Code Review?

Code Review 不仅仅是寻找错误。

它还有以下价值:

  • 提高代码质量。
  • 发现设计缺陷。
  • 传播项目知识。
  • 统一开发规范。
  • 帮助初级工程师学习。
  • 减少错误进入生产环境的概率。

即使你不是高级工程师,也可以参与 Review。

新成员有时反而更容易发现项目中的隐含假设。

9.2 Code Review 的六项原则

原则一:Review the Code, Not the Person

不要针对个人。

不好的评论:

You wrote confusing code.

更好的评论:

This function is difficult to follow.
Could we separate validation and processing?

原则二:Prefer Actionable Comments

评论应该让作者知道下一步怎么做。

不好的评论:

Don't use globals.

更好的评论:

Could you replace these global variables
with a configuration dataclass?

This would allow tests to run independently
and safely in parallel.

原则三:Ask Questions Rather Than Making Demands

例如:

What happens if this value is null?

比直接命令:

Handle null values.

更容易展开有效讨论。

原则四:Explain the Why

建议:

Consider using a named constant here
so the timeout can be adjusted by environment.

而不是仅仅说:

Use a constant.

原则五:Distinguish Blocking Issues and Suggestions

可以在评论中区分:

  • Blocking:必须修改的问题。
  • Suggestion:改进建议。
  • Nit:非阻塞的小问题。

原则六:Acknowledge Good Work

不要只指出问题。

如果某个实现很好,也应该告诉作者原因。

代码审查应该帮助团队建立更好的工程习惯,而不是让作者感到所有修改都在被否定。

9.3 Know When to Stop

不要把每个细节都变成必须修改的要求。

优先处理:

  1. 正确性。
  2. 安全性。
  3. 兼容性。
  4. 可维护性。
  5. 重要的性能问题。

对于不影响整体质量的小型风格问题,应合理控制评论数量。


第 10 章 Education:如何提出有效的技术问题

程序员需要持续学习,也需要向其他人提问。

课程介绍了五个重要方法。

1. State Your Understanding First

先说明自己已经理解的内容。

例如:

我的理解是 LEFT JOIN 会保留左表的所有行,
即使右表没有匹配记录也会保留。

这个理解正确吗?

2. Ask Yes/No Questions

适当提出可以用是或否回答的问题。

这样更容易确认某个具体理解是否正确,避免无关讨论。

3. Be Specific

不要问:

How does SQL work?

可以问:

LEFT JOIN 是否会保留右表中没有匹配记录的左表行?

4. Admit When You Don't Understand

如果不理解一个概念,应直接说明。

我理解了前面的执行流程,
但不清楚这里为什么需要使用事务隔离级别。

这比假装理解更有助于学习。

5. Don't Accept Incomplete Answers

不要因为别人给出一个看起来专业的答案就停止思考。

应该继续追问,直到真正理解。

当然,也要尊重对方时间。

这些原则同样适用于与 LLM 对话。


第 11 章 AI Etiquette:AI 使用规范

AI 已经成为软件开发的重要工具,但使用方式仍然需要遵守工程伦理和团队规则。

11.1 Disclose AI Usage

当 AI 对工作产生实质性贡献时,应该按照团队和项目要求披露。

例如:

AI Assistance:

- AI helped generate the initial unit tests.
- The implementation was manually reviewed.
- All tests were executed by the contributor.

比简单写一句“Used AI”更有价值。

11.2 Follow Team Policies

不同团队可能对以下问题有不同要求:

  • 哪些代码可以发送到云端模型?
  • 是否允许使用第三方 AI 服务?
  • 是否可以让 AI 生成核心业务代码?
  • 是否需要记录 AI 参与情况?
  • 是否涉及数据驻留和合规要求?

应该遵守组织的规则。

11.3 Interviews and Assessments

面试和考试通常是为了评估个人能力。

如果不确定是否允许使用 AI,应该事先询问。

不能假设所有考核都允许外部 AI 工具。


第三部分:Code Quality(代码质量)

第 12 章 代码质量体系概述

代码能够运行,并不代表代码质量足够好。

例如:

def process(data):
    result = []
    for x in data:
        if x > 0:
            if x < 100:
                result.append(x)
    return result

它可能运行正常,但仍然存在:

  • 风格不统一。
  • 条件嵌套不必要。
  • 缺少类型注解。
  • 缺少测试。
  • 没有错误处理。
  • 没有说明输入约束。

代码质量需要多种工具共同保障。

本课程介绍六项主要内容:

  1. Formatting
  2. Linting
  3. Testing
  4. Pre-commit Hooks
  5. Continuous Integration
  6. Command Runners

另外还介绍 Regular Expressions。


第 13 章 Formatting:自动格式化

13.1 什么是代码格式化?

Formatter 会自动调整代码的表面形式。

例如:

原始代码:

def calculate(a,b):
  return a+b

格式化后:

def calculate(a, b):
    return a + b

主要处理:

  • 缩进。
  • 空格。
  • 引号。
  • 换行。
  • 行长度。
  • 代码布局。

13.2 为什么需要统一格式?

如果每个人都按照自己的习惯编写代码,团队会在大量无关紧要的风格问题上浪费时间。

这类争论在软件工程中称为 Bike-shedding。

例如:

  • 使用单引号还是双引号?
  • 缩进使用两个空格还是四个空格?
  • 一行代码最长多少字符?

如果 Formatter 能够自动统一这些选择,开发者就能将注意力放到逻辑和设计上。

13.3 常见工具

工具 语言
Ruff Formatter Python
Black Python
Prettier JavaScript、TypeScript 等
gofmt Go

Python 项目可以执行:

ruff format .

如果只想检查、不修改:

ruff format --check .

13.4 Formatter 配置

一些工具支持较多配置。

建议将项目格式配置提交到版本控制中。

此外,还可以使用 EditorConfig。

例如:

root = true

<li>charset = utf-8</li>
end_of_line = lf
insert_final_newline = true

[*.py]
indent_style = space
indent_size = 4

它能够帮助不同 IDE 使用一致的编辑器设置。


第 14 章 Linting:静态代码分析

14.1 什么是 Linter?

Linter 在不运行程序的情况下分析代码,寻找可疑模式和潜在问题。

这叫 Static Analysis(静态分析)。

例如:

import os

def calculate():
    x = 10
    return 42

这里存在:

  • 未使用的 import。
  • 未使用的变量。

Linter 可以发现这些问题。

14.2 Formatter 与 Linter 的区别

对比 Formatter Linter
目标 统一外观 发现问题
关注 表面语法 代码模式和潜在错误
是否修改代码 通常可以 部分规则可以
示例 Ruff Format Ruff Check

14.3 使用 Ruff

安装:

pip install ruff

检查:

ruff check .

自动修复可修复的问题:

ruff check --fix .

检查格式:

ruff format --check .

14.4 Linter Rules

Linter 通常包含大量规则。

某些规则可能:

  • 检查未使用变量。
  • 检查未使用导入。
  • 检查不合理的条件嵌套。
  • 检查危险函数调用。
  • 检查不合理的代码复杂度。

不同规则可以根据项目情况配置。

14.5 False Positives:误报

Linter 并不完美。

有些情况下,它可能认为某种写法有问题,但开发者实际上有合理理由。

因此可以通过配置或局部注释关闭某些规则。

例如:

# noqa: S602

这类抑制应该有明确理由,不应该把它当成解决真实安全问题的默认方式。

14.6 Semgrep:基于语法结构的代码搜索

普通 grep 主要根据字符进行搜索。

Semgrep 可以基于程序语法结构匹配代码模式。

例如,课程展示了对以下危险模式的检查:

subprocess.Popen(
    command,
    shell=True
)

命令:

semgrep -l python \
  -e "subprocess.Popen(..., shell=True, ...)"

这种方式能够比简单的文本匹配更准确地查找符合语法结构的代码。

适用场景:

  • 安全规则。
  • 自定义代码规范。
  • 大型代码库检查。
  • 危险 API 搜索。

第 15 章 Testing:自动化测试

15.1 为什么需要测试?

测试的基本思想:

编写程序之后,再编写一组程序来验证它的行为是否符合预期。

例如:

def add(a, b):
    return a + b

测试:

def test_add():
    assert add(2, 3) == 5

测试通过,说明在这个输入条件下,程序符合预期。

但一个测试无法证明函数在所有输入下都正确。

15.2 Unit Testing:单元测试

单元测试检查一个较小的功能单元。

Python 常用 pytest。

安装:

pip install pytest

项目结构:

project/
├── calculator.py
└── tests/
    └── test_calculator.py

calculator.py:

def add(a: int, b: int) -> int:
    return a + b


def divide(a: float, b: float) -> float:
    if b == 0:
        raise ValueError("b cannot be zero")

    return a / b

test_calculator.py:

import pytest

from calculator import add, divide


def test_add():
    assert add(2, 3) == 5


def test_divide():
    assert divide(10, 2) == 5


def test_divide_by_zero():
    with pytest.raises(ValueError):
        divide(10, 0)

执行:

pytest

15.3 Integration Testing:集成测试

集成测试验证多个模块之间能否正确协作。

例如:

API
 ↓
Service
 ↓
Database

需要验证:

  • API 是否正确调用 Service。
  • Service 是否正确访问数据库。
  • 数据是否能够正确保存和读取。

15.4 Functional Testing:功能测试

功能测试主要从用户功能或完整业务流程出发。

例如:

用户注册
  ↓
用户登录
  ↓
创建订单
  ↓
支付订单
  ↓
查询订单

测试重点是整个流程是否满足预期需求。

15.5 Test-Driven Development:测试驱动开发

TDD 的基本循环:

Red → Green → Refactor

Red

先编写测试,让它因为功能尚未实现而失败。

Green

编写最少的代码,让测试通过。

Refactor

在测试保护下改进代码结构。

这种方法能够让开发者在编写实现之前就明确预期行为。

15.6 Regression Testing:回归测试

当程序发生 Bug 时,不仅应该修复 Bug,还应该增加相应测试。

例如:

某个函数曾经在空输入下崩溃。

修复后增加:

def test_empty_input():
    assert process([]) == []

以后每次修改程序时,都可以自动检查这个问题是否再次出现。

15.7 Mocking:模拟外部依赖

如果程序依赖第三方 API 或数据库,测试时不一定需要真的访问外部服务。

可以使用 Mock 替代真实依赖。

例如:

from unittest.mock import Mock

def fetch_user(client, user_id):
    return client.get_user(user_id)


def test_fetch_user():
    client = Mock()

    client.get_user.return_value = {
        "id": 1,
        "name": "Alice"
    }

    result = fetch_user(client, 1)

    assert result["name"] == "Alice"

这样可以:

  • 避免真实网络请求。
  • 避免依赖外部服务是否可用。
  • 提高测试速度。
  • 控制测试输入。

但 Mock 不应过度使用,否则测试可能只验证模拟对象,而没有验证真实系统的集成行为。

15.8 Property-Based Testing:基于性质的测试

普通单元测试通常使用手工指定的输入。

例如:

assert add(2, 3) == 5

Property-Based Testing 则通过描述程序应当满足的性质,让工具自动生成大量输入。

教材介绍了 Hypothesis。

安装:

pip install hypothesis

例如,假设我们有一个字符串填充函数:

def pad(text: str, length: int) -> str:
    return text.ljust(length)

我们希望满足:

[
|\operatorname{pad}(s,n)| \geq n
]

对于任意合法的字符串 (s) 和非负整数 (n),填充后的长度不应该小于 (n)。

测试可以写成:

from hypothesis import given
from hypothesis import strategies as st


@given(
    text=st.text(max_size=20),
    length=st.integers(min_value=0, max_value=50)
)
def test_pad_length(text, length):
    result = pad(text, length)

    assert len(result) >= length

Hypothesis 会生成许多输入并检查性质。

但它不是数学证明。

它只是通过大量生成的测试样本寻找违反性质的情况。

测试数据的范围和性质仍然需要开发者合理设计。


第 16 章 Code Coverage:代码覆盖率

16.1 什么是覆盖率?

Code Coverage 衡量运行测试时有多少代码被执行。

例如:

def classify(x):
    if x > 0:
        return "positive"

    elif x < 0:
        return "negative"

    return "zero"

如果只测试:

classify(10)

那么负数和零的分支就没有被执行。

覆盖率报告可以帮助开发者发现未测试区域。

16.2 使用 pytest-cov

安装:

pip install pytest-cov

执行:

pytest --cov=src --cov-report=html

生成 HTML 报告。

查看:

htmlcov/index.html

可以看到:

  • 哪些文件被测试。
  • 哪些代码行被执行。
  • 哪些分支没有覆盖。

16.3 为什么覆盖率不等于质量?

假设:

def divide(a, b):
    return a / b

测试:

def test_divide():
    divide(10, 2)

这个测试可能执行了函数的全部代码行。

但它没有验证结果是否正确。

所以:

高覆盖率不一定意味着测试有效。

课程建议:

关注高质量测试,而不是单纯追求覆盖率数字。

覆盖率的真正价值是帮助发现测试盲区。


第 17 章 Pre-commit Hooks:提交前自动检查

17.1 Git Hook 的概念

Git Hook 是 Git 提供的事件触发机制。

例如,在提交前执行脚本:

git commit
    ↓
pre-commit hook
    ↓
执行检查
    ↓
允许或阻止提交

17.2 Pre-commit Framework

教材介绍了 Pre-commit 工具。

首先安装:

pip install pre-commit

在项目根目录创建:

.pre-commit-config.yaml

示例:

repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v5.0.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer

  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.9.0
    hooks:
      - id: ruff
      - id: ruff-format

注意:示例版本仅用于说明配置结构,真实项目应根据当前工具版本选择经过验证的版本。

安装 Hook:

pre-commit install

现在执行:

git commit -m "Add new feature"

Git 会在提交前执行配置的检查。

如果检查不通过,提交可能被阻止。

开发者修复问题后重新提交即可。


第 18 章 Continuous Integration:持续集成

18.1 什么是 CI?

CI 是 Continuous Integration 的缩写。

它指将代码集成到共享代码库时,自动运行构建和质量检查。

例如:

开发者修改代码
      ↓
git push
      ↓
GitHub Actions
      ↓
自动运行检查
      ↓
返回检查状态

CI 能够在代码进入主分支之前发现问题。

18.2 GitHub Actions

在项目中创建:

.github/workflows/ci.yml

示例:

name: Python CI

on:
  push:
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Install dependencies
        run: |
          python -m pip install pytest ruff

      - name: Check formatting
        run: ruff format --check .

      - name: Lint
        run: ruff check .

      - name: Test
        run: pytest

当代码 Push 或 PR 时,GitHub Actions 会自动运行。

18.3 为什么 CI 使用 Check-only Mode?

在开发者本地:

ruff format .

可以自动修改代码。

但是在 CI 中,通常使用:

ruff format --check .

原因是 CI 的任务应该是验证提交的代码,而不是悄悄修改代码。

如果格式不正确,就返回失败,让开发者修复后重新提交。

18.4 Matrix Testing:矩阵测试

有些项目需要同时支持:

  • Linux
  • macOS
  • Windows

还可能支持:

  • Python 3.11
  • Python 3.12
  • Python 3.13

可以通过 CI Matrix 让多个环境自动执行相同测试。

这样能发现本地开发环境中不容易暴露的兼容性问题。

18.5 Scheduled CI:定期检查

CI 不一定只在代码变化时运行。

也可以设置定时任务。

例如,每周重新检查依赖。

为什么?

因为即使你的代码没有变化,外部依赖也可能发布新版本,或者出现兼容性和安全问题。

定期 CI 可以帮助发现这些问题。

18.6 CI Status Badge

GitHub README 中经常出现:

Build: Passing

这类状态标记可以告诉使用者最近的自动化检查是否通过。

但它只能表示指定工作流的状态,不代表软件在所有环境中都没有问题。


第 19 章 Continuous Deployment:持续部署

CI 主要验证代码。

CD 则进一步将通过验证的修改部署到目标环境。

例如:

git push
   ↓
CI 检查
   ↓
构建网站
   ↓
部署到 GitHub Pages

教材以 Missing Semester 网站为例,说明代码更新后可以自动构建并发布网站。

CD 也可以用于:

  • 发布 Docker 镜像。
  • 部署 Web 服务。
  • 发布二进制文件。
  • 更新文档网站。

CI 和 CD 可以结合在同一个自动化流水线中。


第 20 章 Command Runners:项目命令管理

随着项目规模扩大,命令可能越来越复杂。

例如:

uv run ruff check .
uv run ruff format .
uv run pytest
uv run mypy .

Command Runner 可以将这些命令封装为简短入口。

课程介绍了 just。

例如创建:

lint:
    uv run ruff check .

format:
    uv run ruff format .

test:
    uv run pytest

typecheck:
    uv run mypy .

然后执行:

just lint
just format
just test
just typecheck

这样新加入项目的开发者不需要记住所有工具的完整参数。

类似能力也可以由:

  • npm scripts
  • Hatch scripts
  • Make
  • 其他项目管理工具

提供。


第 21 章 Regular Expressions:正则表达式

21.1 什么是正则表达式?

Regular Expression(Regex)是一种描述字符串集合和匹配模式的语言。

例如:

abc

匹配字符串中的 abc。

\d+

匹配一个或多个数字。

missing|semester

匹配 missing 或 semester。

正则表达式常用于:

  • 文本搜索。
  • 日志分析。
  • 数据验证。
  • 批量替换。
  • 命令行工具。
  • IDE 搜索。
  • 测试筛选。

21.2 基础语法

表达式 含义
abc 字面匹配 abc
. 任意单个字符(默认不匹配换行符)
[abc] a、b、c 中的一个
[^abc] 不属于 a、b、c 的字符
[a-f] a 到 f 范围中的字符
a|b 匹配 a 或 b
\d 数字字符
\w 单词字符
\b 单词边界
(...) 分组
? 前面的模式出现零次或一次
* 前面的模式出现零次或多次
+ 前面的模式出现一次或多次
{N} 前面的模式重复 N 次
\. 匹配真正的点号
\\ 匹配真正的反斜杠
^ 行或字符串开头
$ 行或字符串结尾

21.3 日期匹配

\d{4}-\d{2}-\d{2}

匹配:

2026-01-14

但不验证日期是否合法。

例如:

2026-01-99

仍然能够匹配。

21.4 邮箱匹配

教材给出了简单示例:

.+@.+

它只表示:

  • @ 前面至少有一个字符。
  • @ 后面至少有一个字符。

这不是可靠的邮箱验证规则。

完整邮箱地址验证涉及更多语法和规范,通常应使用成熟的验证方案,而不是自己编写一个极其复杂的正则表达式。

21.5 Capture Groups:捕获组

例如:

import re

text = "2026-01-14"

match = re.match(
    r"\d{4}-(\d{2})-\d{2}",
    text
)

print(match.group(1))

输出:

01

括号:

(\d{2})

表示捕获一组两位数字。

21.6 Greedy and Non-greedy:贪婪与非贪婪

例如:

".*"

* 默认采用贪婪匹配,尽可能匹配更多内容。

而:

".*?"

使用非贪婪匹配,尽可能匹配较短内容。

这在文本提取中非常重要。

21.7 Regex 的局限性

正则表达式非常适合简单文本模式。

但不适合所有结构化数据解析。

例如:

  • HTML。
  • 嵌套 JSON。
  • 复杂编程语言语法。
  • 有任意层级嵌套结构的数据。

对于 JSON,应该使用 JSON Parser:

import json

data = '''
{
    "name": "Alyssa P. Hacker",
    "college": "MIT"
}
'''

obj = json.loads(data)

print(obj["name"])

对于复杂语法结构,应使用专门的 Parser。

选择工具的原则:简单文本模式使用 Regex,结构化数据使用对应解析器。


第四部分:综合实践项目

第 22 章 建立完整的软件工程工作流

现在将三个主题整合起来。

项目:Markdown Link Extractor。

22.1 项目需求

实现一个 Python 命令行程序:

link-extractor input.md

提取 Markdown 文件中的链接。

支持:

link-extractor input.md --output links.txt

将提取结果写入文件。

要求:

  1. 使用类型注解。
  2. 使用 argparse。
  3. 有合理的异常处理。
  4. 编写单元测试。
  5. 使用 Ruff。
  6. 使用 mypy。
  7. 配置 Pre-commit。
  8. 配置 GitHub Actions。
  9. 编写 README。
  10. 通过 Pull Request 完成代码审查。

22.2 创建项目

mkdir markdown-link-extractor
cd markdown-link-extractor

git init -b main

uv init --package

创建虚拟环境并安装开发工具:

uv add --dev pytest ruff mypy pre-commit

22.3 让 Coding Agent 实现功能

给 Agent 提供:

请在当前项目中实现 Markdown Link Extractor。

功能:
1. 接收 Markdown 文件路径。
2. 提取普通 Markdown 链接。
3. 支持 --output 指定输出文件。
4. 输入文件不存在时返回清晰错误。
5. 使用类型注解。
6. 为主要功能编写单元测试。

限制:
1. 不修改输入文件。
2. 优先使用 Python 标准库。
3. 不要为了通过测试而删除测试。
4. 不要关闭 Linter 规则来隐藏问题。

完成后:
运行 pytest、ruff 和 mypy,
并报告实际结果。

22.4 编写测试

至少测试:

  • 有一个链接。
  • 有多个链接。
  • 没有链接。
  • 空文件。
  • 非法文件路径。
  • 输出到指定文件。

例如:

def test_extract_single_link():
    text = "[Google](https://google.com)"

    assert extract(text) == [
        "https://google.com"
    ]


def test_extract_no_link():
    text = "No links here"

    assert extract(text) == []

这里的测试针对简单 Markdown 链接格式,不代表完整覆盖所有 Markdown 语法。

22.5 配置质量检查

执行:

uv run ruff format .
uv run ruff check .
uv run mypy src/
uv run pytest

确保所有检查通过。

22.6 配置 Pre-commit

添加 .pre-commit-config.yaml,让提交前自动执行格式和 Lint 检查。

安装:

uv run pre-commit install

22.7 配置 CI

创建:

.github/workflows/ci.yml

在每次 Push 和 PR 时运行:

  • Ruff Format Check。
  • Ruff Lint。
  • Mypy。
  • Pytest。

22.8 编写 README

README 至少应该包括:

# Markdown Link Extractor

## What

A command-line tool for extracting links
from Markdown documents.

## Why

It helps inspect and process links
without manually reading the document.

## Usage

link-extractor input.md

## Installation

...

## Development

...

## Testing

...

22.9 提交 Git Commit

git add -p

git commit -m "Add Markdown link extraction CLI"

复杂修改应该拆分为多个逻辑独立的 Commit。

22.10 创建 Pull Request

PR 应当说明:

  • 解决了什么问题。
  • 实现了什么功能。
  • 为什么使用当前方案。
  • 如何验证。
  • 有哪些限制。

最后让其他开发者进行 Code Review。


第五部分:课程练习与考核

第 23 章 分阶段实践任务

建议不要一次完成所有练习,而是分阶段训练。

阶段一:Coding Agent

任务 验收标准
使用 Agent 阅读陌生代码库 能解释项目主要模块
使用 Agent 开发小功能 修改符合需求
使用 Agent 修复测试失败 有真实测试结果
创建 AGENTS.md Agent 能遵守项目规则
创建 Skill 能复用专门工作流程
创建 Subagent 能完成独立检查任务
体验并行 Agent 能避免工作目录冲突

阶段二:Beyond the Code

任务 验收标准
阅读大型项目 README 能评价其信息组织
编写代码注释 解释关键设计原因
编写 Commit Message 包含问题与解决动机
创建 Bug Report 具有明确复现步骤
制作最小复现示例 能独立重现错误
创建 Pull Request 修改范围清晰
进行 Code Review 评论具体、可执行

阶段三:Code Quality

任务 验收标准
配置 Formatter 代码风格统一
配置 Linter 能识别常见问题
配置 Type Checker 类型错误能够被发现
编写 Unit Tests 核心函数得到测试
使用 Coverage 能发现未覆盖代码
配置 Pre-commit 提交前自动检查
配置 CI Push 和 PR 自动测试
学习 Regex 能完成常见文本提取任务

第 24 章 最终知识框架

三部分内容可以归纳为以下知识体系。

领域 核心概念 核心工具或方法
AI Development LLM、Agent Loop、Harness Coding Agents
Agent Context Context Window、Compaction AGENTS.md、Skills
Agent Architecture Tool Calling、Subagents MCP、Git Worktree
Technical Writing Comments、README 技术文档
Version History Atomic Commits Git Commit Message
Collaboration Issue、PR GitHub
Code Review Blocking、Suggestions Review Practices
Formatting 代码风格 Ruff、Black、Prettier
Static Analysis 静态检查 Ruff、Semgrep
Type Safety 类型一致性 mypy
Testing Unit、Integration、Functional pytest
Property Testing 性质验证 Hypothesis
Coverage 执行覆盖情况 pytest-cov
Automation Pre-commit Git Hooks
Integration CI GitHub Actions
Deployment CD 自动化部署
Command Management 命令封装 just
Text Processing 正则表达式 Python re、grep

结语:真正的软件工程能力是什么?

这三份课程材料传达了一个共同的思想:

软件工程不仅仅是写代码。

一个成熟的工程师需要同时具备以下能力:

  1. 开发能力:能够将需求转化为可运行的程序。
  2. 工具能力:能够利用 AI、Shell、Git 和自动化工具提高效率。
  3. 验证能力:能够使用测试、静态分析和 CI 验证程序质量。
  4. 表达能力:能够通过注释、文档和提交记录解释设计决策。
  5. 协作能力:能够参与 Issue、PR 和 Code Review。
  6. 责任能力:能够对代码的正确性、安全性和长期维护负责。

尤其在 AI 编程时代,生成代码的成本正在降低,但理解代码、验证代码、判断设计取舍以及维护系统的能力依然重要。

最终的学习目标不是成为一个只会向 AI 提问的人,而是成为一个能够利用 AI、工程工具和团队协作机制,持续交付可靠软件的工程师。

#1 ·
#2 Zethes :
#3 Zethes :

如果版本控制也能变得更好用:Jujutsu 入门与实践

大家好,我是 Chris Krycho。今天我想和大家聊聊 Jujutsu 版本控制系统,简称 JJ。这个名字听起来可能有些特别。过去十年左右,对大多数开发者来说,版本控制几乎就意味着 Git。我认为,现在是时候改变这种局面了。

今年二月初,我发表了一篇很长的文章,深入讨论 Jujutsu。从去年九月前后开始,我基本上已经把它作为唯一的日常版本控制工具;在那之前,我也已经使用过一段时间。为什么我们应该考虑超越 Git?我先解释一下原因,然后会通过实际演示来说明。

为什么我想从 Git 向前迈一步

Git 在它诞生的时代,以及它所提供的能力范围内,是一款非常出色的工具。Git 出现时,我们确实需要它带来的那些能力。分布式版本控制相较于此前的非分布式版本控制,是一次巨大的进步。正在观看视频的各位中,有些人可能从未经历过 CVS,甚至 SVN 的时代,更不用说以 Polytron 版本控制系统为底层、再由 Serena 提供包装的那类工具了。我经历过那个时代,那确实是一段不太愉快的时期。

Git、Mercurial,以及 2000 年代中期出现的其他一些工具,都比此前的系统前进了一大步。突然之间,我可以在自己的机器上拥有一份完整的仓库副本,你也可以在自己的机器上拥有一份完整副本。即使我们恰好修改了同一部分内容,也没有关系;我们不必先锁定文件,再等到稍后才能提交。分支也成为了一等公民。对于过去十年才进入这个行业的人来说,这些事情可能已经理所当然了:当然可以随手创建一个分支。但在 Git、Mercurial 以及同一代版本控制系统出现之前,情况并不是这样。我绝不会想回到那个年代,不过,我确实希望继续向前发展。

过去十年我一直在使用 Git,在此之前使用的是 Mercurial。简单来说,Git 本身也值得受到一些批评。它的命令行界面以复杂难用而闻名,而且这种复杂性并不总是因为它所处理的问题本身足够复杂。对于从未使用过 Mercurial 的人来说,我们有时会把它称为一个“存在性证明”:它证明版本控制系统的命令行界面完全可以设计得很好。Mercurial 的版本控制命令行体验确实不错。

然而,大多数人最终还是使用 Git,因为 GitHub 的规模和影响力非常大,Linux 项目也极具影响力,而且大量工具都默认你会使用 Git。Git 逐渐成为了整个生态系统所预期的版本控制工具。与此同时,Git 内部也积累了很多复杂性,这些复杂性来自它的历史,以及项目背后的人所做出的选择和偏好,而这些选择和偏好并不一定符合我的想法。

这时,Jujutsu 出现了。当然,这一代还有其他值得关注的版本控制系统,例如 Meta 的 Sapling,以及作为独立项目发展的 Pijul 等。不过,在这些选择中,我最喜欢的是 Jujutsu。

Jujutsu 与 Git 兼容。这意味着,正如接下来会看到的那样,我们可以直接在现有 Git 仓库上使用它。这是它推广和采用方面的一项巨大优势。事实上,Git 当年能够成功,很大程度上也是因为它能够与 SVN(Subversion)仓库互操作。Jujutsu 的命令行界面则更多受到 Mercurial 的启发,也更符合我所认同的通用界面设计原则,而不是沿袭 Git 的设计。这一点非常好。

Jujutsu 还有一些很有意思的能力。它把冲突作为一等概念来理解,也把移动提交作为一等操作来处理,并且提供了比 Git 的交互式 rebase 更好的体验。Git 的交互式 rebase 我当然会用,也用过很多次,但它本来可以做得更好。Jujutsu 对合并提交有清晰的理解,也知道合并冲突是如何工作的。由于它能够把冲突作为日常工作流程中的一等部分来处理,所以冲突不会让整个工作停摆,也不会阻止你继续前进。你完全可以先说“这个问题稍后再解决”,然后继续做其他工作。

总的来说,Jujutsu 的使用体验在很多方面都比 Git 前进了一大步。有些差异很难在真正使用之前用语言说清楚。我现在每次因为某些原因不得不回到 Git 时——而过去六个月里,这种情况已经越来越少——都会觉得自己像是在泥地里游泳,或者像是在躲避一连串障碍物。无论用什么比喻,体验都不太好。

关于这些问题,我可以讲上一整天;你也可以去读我那篇一万字的文章。不过,我们不如直接看一些例子。接下来几分钟,我会带大家了解 Jujutsu 的基本工作方式。最后,我还会提到社区中另一位成员制作的一个视频:他正在开发一个基于 Web 的用户界面,并计划把它放进一个轻量级的包装应用中,从而能够分发到 Windows、Linux 和 macOS。它的用户界面是基于 Web 技术构建的,使用了一项叫作 Tauri 的技术。关于这些内容,之后可以再去了解更多。虽然我接下来展示的终端演示已经很不错,但那个界面在某些方面甚至更好。不过先别离开,我们现在就开始。

在现有 Git 仓库中使用 Jujutsu

我现在使用的是 iTerm2。先从一个实际例子开始:克隆一个我知道很适合演示的仓库。我把它简称为 tm。True Myth 是一个我经常使用的包,也是我大约七年半前编写的项目。这里使用 GitHub 自己提供的命令行工具 gh 来克隆仓库。gh 有时会在这里卡住,不过这次没有问题。克隆完成后,我进入 true-myth 目录。

现在可以看到,这是一个有着较长 Git 历史的仓库。最近的提交大多是 Dependabot 自动生成的依赖版本更新,因此单看这段历史并没有太多值得说明的内容。我已经安装了 Jujutsu,而且安装的是最新公开版本。接下来展示的内容,都可以通过 Homebrew 安装,也可以从 Nix 软件包获取;当然,也可以使用 Cargo 安装,因为 Jujutsu 是用 Rust 编写的工具。它运行很快,也相当稳定,我很喜欢使用它。

假设我正在开发 True Myth,并且想做一些修改。首先,我可以在这个 Git 仓库里运行:

jj git init

这条命令会让 Jujutsu 接入当前已有的 Git 仓库,并导入底层 Git 仓库中的变更。此时,我还没有在本地关联任何远程分支,因此接下来可以设置跟踪关系:

jj branch track main@origin

这样就建立了一个跟踪分支,和在其他版本控制工作流中设置跟踪分支的方式差不多。

现在先看看仓库状态:

jj status

输出告诉我,工作副本(working copy)是干净的。这符合预期。不过,有意思的是,Jujutsu 会明确标识工作副本。在 Git 中,工作副本的状态与暂存区(index)密切相关;而在 Jujutsu 中,工作副本本身有明确的身份,并且对应着一个提交和一个变更。稍后我会详细解释这一点。

再运行:

jj log

可以看到一份提交历史。乍看之下,它和 git log --oneline --graph 之类的输出差不多,还没有什么特别之处。但请注意,我只是运行了 jj git init,就已经可以在这个仓库里使用 Jujutsu 了。如果查看仓库根目录,原来的 .git 目录、GitHub 相关文件以及其他内容都还在,只是多出了一个 .jj 目录。进入 .jj 后,可以看到其中有仓库数据和工作副本相关目录,这些内容保存着 Jujutsu 自己的内部状态,作用类似于 Git 的 .git 目录。

关键在于,Jujutsu 理解 Git,并且能够与 Git 协同工作。每当我们通过 Git 做了一些操作,Jujutsu 都可以导入这些变化;反过来,当我们通过 Jujutsu 修改一个由 Git 仓库作为底层存储的项目时,这些变更也会提交到底层 Git 仓库中。

例如,我创建一个文件:

touch hello.txt

然后查看状态:

jj status

Jujutsu 会告诉我,工作副本发生了变化,并且新增了一个名为 hello.txt 的文件。这和 Git 的状态信息类似。接下来,我可以给这次变更添加描述:

jj describe -m "whoa"

再运行 jj log,就能看到一个新的提交。它位于 Git 提交历史之上,提交说明是 whoa。这正是我们预期的结果。与此同时,我也可以运行:

git log

会看到同样的提交,因为刚才的操作已经同步写入底层 Git 仓库。

不过,Jujutsu 并不只是一个更好用的 Git 命令行界面。首先,Jujutsu 未来会拥有自己的底层存储后端。这意味着,它可以与 Google 的大型单体仓库(monorepo)协同工作——Jujutsu 正是在 Google 开发的;也可以使用自定义后端,例如通过网络与 FUSE 文件系统协作。它还可以使用自己的原生后端,从而支持 Git 本身并不具备的功能。

即使仍然使用 Git 作为底层存储,我们也能做一些普通 Git 工作流中不容易实现的事情。这是因为 Jujutsu 对版本控制有着不同的理解。尤其重要的一点是:它区分“提交”(commit)和“变更”(change)。

提交与变更:Jujutsu 的核心模型

在 Git 中,我们通常主要考虑提交。Git 的底层当然还有其他概念,如果你是 Git 高手,可能也了解这些内部细节,但对日常操作来说,提交通常就是最基本的工作对象。

Jujutsu 不仅有提交的概念,还有变更的概念。下面通过一个全新的演示仓库来看看它们在实践中意味着什么。

我先创建一个演示目录,进入其中,并初始化一个仓库。这里先尝试指定 Git 后端:

jj git init

如果当前目录还不是 Git 仓库,这样做就会失败,因为它并不是一个现有的 Git 仓库。那么,如果我并不在意底层是不是 Git 仓库,只想直接使用 Jujutsu 呢?当然可以:

jj init

现在,我得到的是一个原生的 Jujutsu 仓库。如果查看它的内部目录结构,会发现它和刚才的仓库大体相似。不过,如果进入存储目录,就会看到其中有一个 Git 文件夹。刚才我没有展示这一点,因为当时还不重要。这里的确存在一个 Git 仓库,它与把 .git 目录直接放在项目根目录下所得到的仓库是一样的。

Jujutsu 允许你采用这种布局,但并不要求你这么做。在与已有仓库互操作时,这种能力很有用。以后我也许会用另一段视频更深入地展示这些内容;今天我只想说明,在需要的时候,Jujutsu 可以创建一个 Git 仓库作为底层存储,但它不必把这个实现细节直接暴露给你,也不必要求 .git 目录出现在项目根目录中。

接下来创建文件 a.txt,写入内容 hello Jujutsu。然后查看状态:

jj status

可以看到工作副本发生了变化。首先介绍一个命令:

jj describe

describe 的简写是 desc。现在我给当前工作副本添加说明:

jj describe -m "add a.txt"

注意,工作副本仍然对应着同一个变更 ID(change ID)。之前我提到过变更 ID,现在看到的就是它。与此同时,它也有一个提交 ID(commit ID)。此时,我们有了一个代表工作副本状态的新 Git 提交。换句话说,工作副本既是一个提交,也是一个变更。这个设计非常巧妙,因为它意味着我们可以直接在原地持续修改同一个变更。

在 Git 中,要实现类似效果,通常需要借助暂存区,或者通过 amend 等方式修改已有提交。Jujutsu 不需要我们采用这种方式。比如,在继续做其他事情之前,我再创建一个文件 b.txt,写入 hey JJ,然后再次查看状态:

jj status

这时,工作副本的变更 ID 仍然和之前相同,但由于底层 Git 仓库中对应的提交发生了变化,所以提交 ID 已经更新。它仍然只是同一个变更。

现在我可以意识到,之前设置的提交说明不够准确:这次变更并不只是添加 a.txt,还添加了 b.txt。因此,我可以直接修改说明:

jj describe -m "add a.txt and b.txt"

由于 Git 的工作方式,底层 Git 仓库现在又有了一个不同的提交,但 Jujutsu 中的变更 ID 仍然保持不变。

这正是 Jujutsu 强大之处的一部分:一个变更的历史可以不断演化,而不必把底层 Git 提交视为不可更改的最终记录。Jujutsu 可以持续更新这个变更的状态,并在需要时把旧版本保留下来供追溯。

追踪变更的演化与恢复操作

如果我想看看这个变更是如何随时间演化的,可以运行:

jj obs log

这里的 obs 是 observation 的缩写。这个命令也许将来会改成类似“evolution log”的名字;社区目前还在讨论这件事。命令输出中有一处高亮内容,它表示识别这个对象所需的最短标识符。在 Jujutsu 的很多操作中,这个标识符甚至只需要一个字母。

例如,我可以用变更 ID 对应的修订来查看演化历史:

jj obs log -r <change-id>

这样就能看到这个变更随时间发生过的变化。输出中的一些版本会被标记为隐藏,因为它们已经不再属于当前有效的变更状态。最初,这个变更只是一个空提交,没有任何文件内容,也没有设置描述;它对应着一个早期标识符。随后,在同一个变更 ID 下,它演化到了后续版本。

每当我们运行 jj status 或其他 Jujutsu 命令时,Jujutsu 都会对工作副本进行快照。如果底层使用 Git 存储,它也会创建相应的 Git 提交,同时保留同一个变更。因此,你实际上会看到多个 Git 提交,它们分别对应同一变更在不同时间的状态。之后,这些不再需要的提交可以由 Git 的常规垃圾回收机制处理。

更重要的是,如果我们想恢复其中某一个旧版本,也可以做到。我们能够看到一个变更如何通过这些 Git 提交逐步演化,并且可以在需要时恢复某个历史状态。当你想弄清楚“我刚才到底做了什么”时,这会非常有用。在 Git 中,虽然可以通过 reflog 在一定程度上做到类似的事情,但操作起来并不轻松;而在 Jujutsu 中,这种能力是直接提供的。

仓库整体也有类似的历史记录。运行:

jj op log

这里的 op 是 operation,也就是操作。它会展示整个仓库中发生过的每一次操作。这比 Git 的 reflog 更完整一些。请注意,其中不仅包括提交相关操作,也包括诸如“因为你运行了 jj status,所以对工作副本做了一次快照”,或者“因为你运行了 jj describe,所以更新了这个提交”这样的记录。你所做的每一项操作,都会出现在操作日志中。

如果想回到操作历史中的某个时间点,可以取得对应的操作修订 ID,然后运行:

jj op restore <operation-id>

这样就能恢复到那个操作发生时的仓库状态。我现在不打算这样做,因为我想保留 a.txt 和 b.txt,但这确实是一项非常强大的能力:你可以直接查看仓库的操作历史,并且回到历史中的任意一个时间点,轻松恢复当时的状态。

这也意味着,Jujutsu 自带一个非常方便的撤销命令:

jj undo

它相当于找到最近的一次操作,并恢复到这次操作发生之前的状态。任何操作都可以撤销,包括修改提交说明这样的操作。

例如,我再运行一次 jj op log,可以看到刚才修改了描述。如果我想撤销这个描述修改,只需输入:

jj undo

工作副本就回到了之前的状态:它的描述又变回只添加 a.txt。值得注意的是,这里恢复的是我们之前使用的同一个 Git 提交 ID。底层并没有在这段时间内把它垃圾回收掉,因此我们能够直接回到那个状态。

再查看操作日志,会发现刚才多了一条 undo 操作。如果我又想撤销这次撤销,因为我希望回到同时包含 a.txt 和 b.txt 的描述状态,也可以像刚才一样使用 jj op restore,恢复到撤销操作之前的那个操作状态。这样,我们就回到了原来的位置。整个操作日志也会相应地显示这次恢复。

这些能力主要体现在底层机制上。不过,大多数时候,我只是在仓库里提交代码、修改文件,并把工作推进下去。接下来看看更日常的操作。

拆分变更,创建新的提交

我再创建一个文件 c.txt,写入 neat JJ is cool,然后运行:

jj status

这时我意识到,我并不想让 c.txt 成为当前这个提交的一部分,而是希望把它放进一个新的提交里。

在 Git 中,我需要使用暂存区来控制哪些内容属于某个提交、哪些内容不属于它。而在 Jujutsu 中,我只需要运行:

jj split

这里我使用的是一位贡献者提供的、内置的语义化 diff 编辑器(semantic diff editor)。在编辑器中,我可以把 a.txt 和 b.txt 保留在第一个部分。这个部分的提交说明可以是 add a and b,这和之前的内容一致。然后,我可以为第二个部分添加说明:add c.txt。

现在,我就得到了两个部分。第一个部分仍然是原来的那个变更,变更 ID 没有变化,但提交 ID 更新了;第二个部分则是一个新的变更。运行 jj log,就可以看到它们之间的关系。

我经常需要做这种事情。过去,我通常使用 Git 暂存区来完成;而在 Jujutsu 中,我可以一直修改工作副本,直到它达到自己满意的状态,然后输入:

jj new

这样就会创建一个新的提交。

前面我展示过 jj describe。Jujutsu 也有 jj commit 命令,可以像之前那样直接使用一条消息提交。但 jj commit 实际上只是 jj describe 和 jj new 的简写组合。也就是说,我可以在任何时候创建新的提交,也可以在之后单独修改它们的描述。

例如,假设我现在位于一个新的空提交上,准备继续做一些工作,但我不喜欢当前的描述。我可以运行:

jj describe -r <revision> -m "add c.txt to the history"

这里需要指定要描述的修订。只要给出对应的修订标识符,就可以修改那个提交的说明。完成后,Jujutsu 会提示它对一个后代提交进行了 rebase。原因是,我修改了这个提交的父提交。记住,在 Jujutsu 中,@ 符号始终表示当前所在的位置,也就是当前工作副本在仓库历史中的位置。

再看一下日志,整体结构仍然和之前一样。我现在位于一个空提交上,但它的父提交说明已经被修改为 add c.txt to the history。我还可以给更早的那个提交换一个完全不同的描述,例如把它改成 start it up with a and b。执行后,Jujutsu 会对两个后代提交进行 rebase。也就是说,我只是在提交图中修改了一个较早提交的描述,位于它上方的提交也会随之重新定位。这种操作在 Jujutsu 中很自然;如果使用 Git,通常需要执行 git rebase --interactive,而且过程会更繁琐。

在历史中移动,并在原地修改提交

现在我再创建一个文件 d.txt,写入 D,然后运行:

jj status
jj commit -m "add D"

这里没有什么特别之处。

不过,如果我想回到之前的某个提交,并对它进行修改呢?在 Git 中也能做到,但通常需要使用交互式 rebase,再配合 amend、squash 等操作。在 Jujutsu 中,我只需要移动到想编辑的修订:

jj edit <revision>

例如,我想给 c.txt 增加一些内容,就可以切换到对应的提交。此时再看仓库状态,@ 表示我当前所在的位置。我只是向后移动到了历史中的一个提交,这并不是什么问题。刚才创建的 D 就不再处于当前工作副本的位置了。

Jujutsu 会自动把后代提交 rebase 到更新后的工作副本上,因为我们正在原地修改这个变更。它会提示有一个后代提交被重新应用到工作副本上。我们现在编辑的是同一个变更,而不是必须创建一个全新的提交,再手动处理后续历史。这种方式很不一样:在 Git 中,你并不能轻易获得这样的自动 rebase 行为。

如果我想在两个提交之间再插入一个提交,也同样很简单。我可以运行:

jj new <revision>

例如,指定某个提交作为新提交的父提交,就能在它和后续提交之间创建一个新的空提交。Jujutsu 会自动对后代提交进行 rebase。现在我位于这个新创建的空提交上,可以做一些不同的事情:再次创建 d.txt,写入 different way to get D in the repo,然后给这个提交添加描述。

这样就可能产生一个冲突。问题在于,之前的自动 rebase 已经把一个后代提交重新应用到当前工作副本上,但我们现在又在另一条历史路径中添加了 D。于是,同一个文件在两个提交中都发生了变化。

我们可以切换到另一个提交查看状态:

jj edit <revision>
jj status

这里会出现冲突,因为这个提交也添加了 D。文件中会出现冲突标记。从外观上看,它与 Git 中常见的冲突标记没有太大区别。但有意思的是,Jujutsu 允许我们带着这个冲突继续工作,并不会因此陷入停顿,也不会强迫我们立即解决冲突。

我完全可以说:“这个问题稍后再处理,我现在还有其他事情要做。”即使当前存在冲突,也可以继续创建新的文件、修改其他内容。例如,我再创建一个 e.txt,然后继续工作。Jujutsu 对这种情况完全没有问题。即使 d.txt 仍然处于冲突状态,我也可以继续向前推进。

甚至在冲突之后,我仍然可以继续修改这个文件。Jujutsu 不会因此阻止我。查看状态时,d.txt 依然显示为冲突,但我仍然可以继续创建新的提交。之后,我们再回来处理这个冲突即可。

在不停止工作的情况下解决冲突

现在我们来解决刚才留下的冲突。大致有两种方式:第一种是直接编辑冲突文件,就像刚才看到的那样;第二种是基于冲突所在的提交创建一个新的提交,在这个新提交中完成修复。

到目前为止,我运行 jj new 时都没有带参数。实际上,可以给它传入一个修订标识符,这个修订就会成为新提交的父提交。例如,我可以基于之前那个存在冲突的提交创建一个新提交。这样,我就创建了一条分支。

从 Jujutsu 的角度来看,分支并不是什么特别复杂的东西:我只是创建了一个以某个提交为父提交的新提交,它自然就与原来的提交分开了。现在我已经切换到这个新提交,可以在这里解决冲突。

最简单的方式就是直接编辑文件,保留冲突两侧都需要的内容,并调整相应的标点。完成后,合并冲突就解决了。再查看状态,这个提交已经没有冲突。

接下来,我希望把这个解决冲突的提交合并到它的父提交中。如果从 Git 的思路考虑,我可能需要先 squash,再执行 rebase,才能让最终历史变成自己想要的样子。但在 Jujutsu 中,我不需要这么做,只需运行:

jj squash

这会把当前提交的内容压入父提交。输出会告诉我,有一个冲突得到了解决。再看提交图,原来那个冲突已经消失了,不过另一条分支或变更中仍然存在冲突。这是因为我之前还在那条路径上给文件添加过一些内容。

因此,我可以再创建一个基于那条变更的新提交,检查文件内容。这里的状态也是合理的:我们之前确实把一个带有冲突的变更提交了,所以现在仍然能看到一些额外的冲突内容。不过,我可以检查文件,发现实际上只需要保留其中一部分。使用能够理解差异的工具处理这类内容也完全没有问题。现在,我再次解决冲突。

运行:

jj status

可以确认冲突已经解决。接下来仍然可以把当前提交 squash 到父提交中。之前存在的冲突已经得到解决,或者被放弃;如果某些冲突内容不再重要,也可以直接丢弃。现在,仓库里已经没有冲突了。之前为了修复冲突而创建的额外分支也消失了,因为我们把那个额外的空分支提交合并掉了。于是,我们可以继续正常工作。

这其实很有意思。在 Git 中,这样的操作可能会非常痛苦,也很难处理;而在这里,我们刚刚完成了整个过程。我甚至是用比较困难的方式完成的,因为我直接在 d.txt 里用普通文本编辑器处理了冲突。如果愿意,我也可以使用:

jj resolve

配合 diff 编辑器来解决冲突。以后的视频中,我会展示这种方式,也会进一步说明 Jujutsu 在 rebase 场景下还能如何发挥作用。

总结:版本控制可以更自然

今天的演示已经差不多有三十分钟了,先讲到这里。最重要的是,希望大家看到:Jujutsu 很有意思,它能够完成一些在 Git 中比较困难的操作,而且整个过程又显得相当自然。它的界面设计不错,创建分支也很容易,之后我们还会继续讨论这些内容。

总体而言,使用 Jujutsu 的感觉就是很多事情本来就应该如此。等你再回到 Git 时,可能会突然意识到:“等等,我这些年来一直都是这样工作的?”是的,过去确实如此,但其实我们不必一直这样。

希望这次对 Jujutsu 的深入入门介绍对你有所帮助。之后我还会在某个时候继续制作相关内容。如果你想知道后续视频什么时候发布,可以订阅频道。如果你喜欢这期视频,也请点个赞,并把它分享给其他人,帮助更多人发现这项内容。

感谢观看。

#4 Zethes :

本次访谈主要是一场关于 Google AI 战略、技术发展和基础设施投资的访谈,而不是一场全面讨论 AI 社会经济影响的访谈。

文章涵盖的主要主题:

  • Google 坚持前沿 AI 研究的战略与 Gemini Argon 的表现
  • 递归式自我改进、多智能体协作与 AI 安全
  • 世界模型、物理理解与 AGI
  • 算力短缺、基础设施投资及商业利益平衡
  • AI 原生交互界面与 Google 未来产品
  • Gemini、Muse、Dots 及 Apple 合作
  • 太空数据中心、TPU 与能源布局
  • AI 对 Google 内部软件开发效率的影响
  • 数据中心建设与社区责任
  • 技术乐观主义与人类社会的未来

说明:当前版本是经过 AI 结构重组的访谈文章,不是逐句逐字翻译稿。它保留了主要论点、案例和关键数字,但不能保证满
足「所有内容均不遗漏」这一严格要求。

根据访谈字幕整理为第一人称叙述。文中的“我”指 Google CEO Sundar Pichai;主持人的提问以少量问题标题呈现,主体保留为我的回答与观点。已对自动字幕中的重复、口误和明显识别错误作必要的语义整理。模型名称及个别专有名词按字幕保留;字幕无法可靠辨认之处不擅自补全。

#1 ·
#2 Zethes :

Sundar Pichai:AI 的无限可能、算力短缺与下一代产品形态

我们仍处在这项重大技术变革的早期

为什么 Google 必须继续站在 AI 前沿?

我认为,我们现在仍处在有史以来最具深远影响的技术变革的早期阶段。这不是一项尚未真正落地、还停留在实验室里的技术;人们已经在使用它,而且它正在改变工作与生活。对 Google 来说,站在 AI 技术前沿不是阶段性的战略选择,而是公司的基因和长期承诺。我们一直在推动技术边界,从 Transformer 研究一路走到今天,我们不会选择一条只满足于“够用”的道路。

外界曾经有一种看法,认为 Google 已经放弃了前沿模型,只打算开发速度更快、能力达到一定标准的模型,再把它们整合进产品。这种判断是完全错误的。前沿领域竞争非常激烈,也在快速变化;这恰恰令人兴奋。我对 Argon 的研发成果感到满意。我们没有急于发布,而是花时间进行安全测试,并谨慎部署。考虑到它的能力,我们的发布节奏比其他模型稍慢,但我认为这是值得的。

Argon 在智能体任务、知识工作、编程和创意任务等多个方面都属于非常优秀的前沿模型。发布后的最初 72 小时内,它的使用量接近 25 万亿 tokens,约为 Gemini 3.0 在发布后最初 72 小时使用量的 3 倍。需求非常旺盛,我们在提供服务时也受到算力容量限制。与此同时,前沿模型没有一个可以一劳永逸的终点:即使一个模型相较两个月前的水平已经全面进步,仍然会有需要改进的局部领域。例如在编程方面,我们已经从用户反馈中看到一些具体问题,也知道哪些地方需要继续提升。

我并不认为所有产品都必须使用规模最大、能力最强的模型。不同尺寸、不同能力和不同成本结构的模型都有存在价值。我们推出 Flash 等模型,就是因为产品体验需要在能力、速度和成本之间取得平衡。前沿模型往往更慢、成本也更高,因此一些很好的产品体验完全可以由非最前沿模型提供。但 Google 仍会同时追求高能力模型和不同层级的模型,并关注能力与成本之间的 Pareto 最优边界。

站在前沿的价值,不只是让我们在基准测试中领先,更重要的是能更早看到新能力的出现,从而提前为未来做好准备。我们在消费者业务和企业业务中都有广泛的应用场景;一些云客户明确希望获得前沿模型。前沿模型也可能更擅长开发下一代模型。在递归式自我改进逐渐成为研究方向的时代,这一点尤其重要。我们在内部把前沿模型部署给开发者后,已经看到明显的能力跃迁:它能处理此前模型无法解决的问题。处于前沿,意味着处于创新前沿,也能推动组织自身的创新。

多智能体、自我改进与 AI 安全

AI 会如何从单个模型走向多个智能体协同?

我认为,接下来一个令人兴奋的方向,是多个智能体能够协同完成复杂任务。整个行业一直在研究具有长期执行能力的智能体,但未来的系统不会只是一个模型独自完成所有事情,而会是多个智能体共同工作。无论是消费者还是企业用户,都将能够使用某种多智能体框架,让多个智能体持续运行、分工协作,并在需要时完成任务。这就是为什么我会把当下形容为一个充满无限可能的时刻。

我们离真正的递归式自我改进还有多远?

Argon 的研发确实使用了模型帮助开发模型的方式,这也是其中一项重要创新。但需要准确描述我们今天所处的位置:我们距离完全自主、达到最终形态的递归式自我改进仍然很远。现在更恰当的说法是,在模型开发的不同环节中,AI 研究人员与 RSI 循环共同工作;智能体以一定程度的自动化方式帮助研究人员协作构建模型。它不是一个已经脱离人类、能够无限自我迭代的系统。这个方向非常令人兴奋,我预计这种人机协作的连续进展还会在未来一段时间持续发生。

当模型并不总是完全按照人类意图行动时,安全如何保障?

我认为,安全与网络安全一样,需要采用纵深防御,而不能只依赖单一措施。模型对齐当然重要,我们投入了大量工作,尽可能让模型的行为与人类意图保持一致。但对齐仍然是一个活跃的研究领域,存在明确的不足和差距。我们不能假设只要完成对齐训练,风险就会自然消失。

除了对齐,我们还投入大量资源进行实时监控。在模型执行任务的过程中,我们需要获得足够好的遥测信息,理解系统正在做什么;一旦发现意外行为,就能够及时介入。监控本身的架构也很重要:模型应当在沙箱和隔离环境中运行,同时监控机制必须能够实时发挥作用,而不妨碍系统完成合理任务。这些都是我们持续投资的方向。

部署到企业环境时,客户也必须拥有控制权,包括实时监控能力、决定模型部署位置的权利,以及明确限定模型能够访问哪些数据。我们需要让企业客户决定模型可以接触什么信息、在哪些环境中运行,以及如何监督其行为。安全部署还需要专门分配算力资源,不能把所有计算资源都用于提升模型能力,而忽略测试、监控和安全保障。

我认为,整个行业需要不断提高标准,投入足够时间把这些工作做好。对风险保持担忧是合理的,关键在于尽早思考还能采取哪些措施。行业已经在增加模型对齐、安全测试等方面的工作;下一步应当推动跨行业标准,建立更一致的评估方式,并引入独立评估机构。我们可以参考金融控制体系:金融行业有会计准则,也有独立审计机构。AI 行业同样需要逐步建立标准和独立评估机制。监管也会在这个过程中发挥作用。

世界模型、物理理解与通向通用智能的路径

为什么 Google 同时研究语言模型和世界模型?

人类并不是只通过语言理解世界。我们会感知周围环境,接收各种输入,并理解物理世界如何运行。因此,我认为让模型理解物理定律、以高保真度模拟世界,是构建智能的重要基础能力。Google 同时推进语言模型和世界模型研究,是因为我们希望探索所有可能推动智能发展的路径,而不是过早地认定只有一种技术路线。

机器人是一个很直观的例子。Argon 在具身推理基准测试上处于领先水平,这并非偶然,也与我们长期构建世界模型的经验有关。模型如果要在真实世界中行动,就需要理解环境、物体和物理规律,而不仅仅是生成文本。我预计未来会出现能够把这些能力融合起来的架构。但在现阶段,我们希望在智能发展的这条“崎岖前沿”上,尽可能站在各种可能方法的前沿。多条研究路线能够相互促进,帮助我们获得更好的研究成果和洞见,也有助于最终构建更强大的通用人工智能模型。

算力:长期战略、资源约束与投资取舍

为什么算力成为 AI 竞争中最稀缺的资源?

算力是当前 AI 研发中最重要、也最稀缺的资源之一。研究人员通常会认为,计算机越大,能够训练和运行的 AI 就越强。如果把最大的计算资源交给研究人员,即使这会在短期内牺牲云业务等业务的利润,他们也会希望获得尽可能大的计算能力。这种取舍并不容易,因为算力既要支持前沿研究,也要服务客户和现有业务。

今天我们拥有的算力,很大程度上取决于我在 2024 年作出的决策。回头看,现在不只是 Google,其他公司也都面临算力短缺;每家公司都希望自己当初规划的算力能够再多一倍。AI 技术能力提升得很快,需求也在迅速增长,因此算力规划不可能完全准确。我们需要综合考虑需求信号、底层技术能力、供应情况和长期发展趋势,同时避免仅仅因为眼前需求强烈就做出不负责任的投资。

我把算力看作长期战略资源。Google 的不同业务有各自独立的经营目标和责任,但公司必须为它们规划长期算力发展路径。云业务团队需要为客户提供服务,也需要有明确的长期算力轨迹;与此同时,前沿 AI 研究需要足够的资源。我们必须在这些目标之间作出安排,而不能只看某个季度的财务结果。对支持前沿 AI 发展所需的投资而言,这是一项长期承诺。

我也认为,AI 产业正在经历一个非常特殊的建设周期。有人担心数据中心和基础设施会不会过度建设,历史上技术产业确实出现过过度投资的情况,例如光纤建设周期。但我们不能简单地把过去的经验机械套用到今天。当前这项技术已经被广泛使用,技术能力仍在快速提升,需求也在扩张。判断是否建设更多基础设施,需要同时观察需求信号、技术进步和实际利用情况。我们必须保持纪律,既不能因为害怕过度建设而错失长期机会,也不能忽略投资可能带来的成本与社会影响。

Google 如何在研究、云业务和商业回报之间作出平衡?

我不会把问题理解为“要么支持研究,要么保护云业务”。Google 必须同时做好这些事情。我们需要让研究人员拥有足够强大的计算资源,也需要为云客户提供可靠的服务,并对不同业务的长期算力需求作出规划。算力分配和投资决策会影响未来数年的竞争位置,因此不能只以短期利润作为唯一标准。

我知道外界会关注我们是否把算力优先用于自家模型,是否愿意以更高成本向外部购买算力,以及云业务是否因此受到影响。我的基本判断是,算力投资必须围绕长期能力建设展开。我们需要持续投资基础设施,也需要理解市场供需变化,不能假设任何时候都能轻易获得额外算力。今天出现的短缺,正是过去数年规划与当前需求共同作用的结果。

AI 将如何改变人与计算机的交互界面

未来的界面还会是搜索框、应用和菜单吗?

我认为,未来的交互方式会变得更加自然。今天人们使用计算机时,往往必须先知道应该打开哪个应用、点击哪个按钮、输入什么指令。AI 可以改变这种模式。用户不一定要把需求整理成结构化、精确的命令,而是可以像与人交谈一样表达自己的意图,甚至可以先随意描述、边想边说,再由系统理解真正想完成的事情。

我自己使用这类系统时,也会直接说出尚未整理好的想法,甚至只是把思路讲出来。系统应当能够理解上下文,不要求用户每次都以非常正式的方式提出请求。比如,用户可能希望观看一段视频,也可能希望完成某项工作;系统需要理解用户当下的目标,并在适当的时候提供帮助。理想的体验应当无缝、自然,而不是让用户不断在不同工具和界面之间切换。

未来的 AI 助手可能会持续在后台工作,并在合适的时机采取行动。用户仍然需要知道系统正在做什么,也需要能够介入、调整和控制任务。我们正在从“人主动操作软件”走向“人表达目标、AI 协助执行”的交互方式。多智能体系统将使这种变化更加明显:不同智能体可以在后台处理不同任务,而用户通过统一的界面了解进度并作出决定。

Google 的既有产品能否适应 AI 原生的交互方式?

这是 Google 必须认真面对的问题。OpenAI 等 AI 原生公司给整个行业带来了很大的推动,也迫使 Google 作为一家公司加快思考和行动。关键不只是把一个聊天框放进现有产品,而是重新思考用户如何完成任务,以及搜索、Gmail、地图和其他产品表面如何协同工作。

我不认为传统产品和 AI 原生产品之间只能二选一。Google 拥有广泛的产品组合、用户基础和服务场景,这些产品可以成为 AI 能力触达用户的重要入口。但我们也必须适应智能体时代,重新设计产品体验。某些功能会以独立服务的方式存在,某些能力则会融入现有产品;重要的是让用户在不同场景中获得连贯、统一的体验,而不是被迫理解 Google 内部不同产品和系统之间的边界。

从软件开发者的使用方式可以看到这种变化。今天,开发者已经不再希望完全按照过去的方式逐行编写所有代码;AI 能够参与复杂任务,帮助人们提高效率。类似的变化也会发生在普通消费者的工作流中。AI 界面会创造新的价值,但这并不意味着现有产品的价值会立刻消失。未来一段时间,市场会同时存在新的 AI 原生体验,以及对既有产品的持续改造。

我们希望 Gemini 成为跨产品体验的重要组成部分。用户会在 Gemini 应用中使用这些能力,也会在 Google 的不同产品和服务中接触到它们。我们的目标是让 Gemini 能够处理更复杂的智能体任务,并在不同界面之间提供一致的体验。相关能力会由更先进的模型提供支持,而不是局限于单一聊天窗口。

Gemini、Muse、Dots 与未来的智能体产品

用户未来会怎样使用持续工作的 AI 智能体?

我认为,消费者和企业用户最终都会获得某种多智能体框架。多个智能体可以持续工作、分工处理任务,并在需要时与用户沟通。它们不是只在用户输入一句话后给出一次回答,而是能够围绕一个目标持续推进工作。用户可以在适当的时候介入,检查任务状态、修改方向或批准下一步行动。

这也意味着产品形态不会只由单一应用决定。Gemini 可以成为用户接触智能体能力的重要入口,但不同能力也可能分布在其他产品和服务中。我们要做的是把这些体验组织起来,使它们能够在用户需要的地方发挥作用,而不是要求用户自己理解背后的模型、智能体和基础设施。

访谈中主持人询问 Google 的 Muse 或 Dots 产品进展。我的回答重点是,未来用户——无论消费者还是企业——将能够使用多智能体框架,让智能体持续执行任务。这一方向体现了 AI 产品从单轮问答走向长期任务执行的变化。字幕没有提供 Muse 或 Dots 的具体发布日期、功能清单或商业化细节,因此不能据此推断尚未公布的产品安排。

与 Apple 的合作及 AI 生态

Google 如何看待与 Apple 的 AI 合作?

访谈谈到 Google 与 Apple 的合作,以及 Apple 如何把外部 AI 能力整合进自己的产品。我的态度是,这类合作对双方都有意义。Apple 在产品体验和生态整合方面做得很好;通过合作,相关模型和技术可以帮助 Apple 改善 Siri 等体验。主持人进一步询问双方是否会开展更多合作,但这段字幕没有给出明确的新增合作承诺,也没有披露具体合作范围之外的安排。

从行业角度看,AI 能力不会只存在于某一家公司的应用中。不同平台和产品会以不同方式整合模型、智能体和云端服务。对用户而言,重要的是这些能力能否真正改善产品体验,而不是用户必须关心背后由哪家公司提供了哪一层技术。

太空数据中心与长期基础设施布局

为什么 Google 会考虑把数据中心送入太空?

我认为,很多技术在刚开始时看起来像科幻,但经过十年到二十年的持续投入,就可能变成有实际意义的技术。Waymo 就是一个例子:从早期看起来非常超前的技术探索,到后来逐步成为能够在现实世界运行的系统。量子计算也是类似的长期投入方向。我们在量子领域已经投入了很长时间,访谈中我提到这段旅程大约已经持续近二十年。

太空数据中心是另一个长期方向。我们在这方面的探索大约开始了两到三年。我认为,未来把计算基础设施部署在太阳同步轨道上可能具有合理性,因为这样能够持续获得太阳能,也就是我们能够利用的最丰富能源之一。随着 AI 对算力的需求呈指数级增长,长期来看,能够 24 小时持续获得能源的轨道环境可能会变得有吸引力。

当然,这是一项非常有挑战性的工程。团队为项目设定了有纪律的阶段性里程碑。把 TPU 送入太空是其中一个令人兴奋的重要节点。访谈录制时,我们预计这些 TPU 即将迎来一个类似“Hello, World”的首次成功运行时刻。我期待看到这一进展,也会继续在这一方向投入。

这并不意味着太空数据中心会立刻替代地面数据中心。它是面向长期算力需求的多项探索之一。我们需要评估工程可行性、能源优势、部署成本和运行可靠性,并按阶段推进。

AI 对 Google 内部软件开发的影响

AI 已经在多大程度上参与 Google 的代码开发?

此前我曾提到,Google 内部约有 25% 的代码由 AI 编写。现在,单纯用这个比例衡量 AI 的影响已经没有太大意义,因为我们触及的几乎每一部分代码,都已经深度受到 AI 的影响。更值得关注的是,AI 是否让工程师能够承担过去难以完成的复杂项目,以及最终的软件质量是否得到改善。

以 Argon 为例,我们观察到一个明显的拐点:工程师开始使用它处理复杂项目,其中包括影响数百万行代码的项目。Argon 发布后的四周内,我们看到销售额提高了 30%;更重要的是,回滚数量也出现了幅度接近三分之一的下降。也就是说,工程师不仅能够更高效地编写代码,而且产出的代码质量也在改善。

因此,我们正在使用更新的指标来跟踪 AI 对工程工作的影响,而不是只统计有多少代码由 AI 生成。生产效率、项目复杂度、代码质量和回滚情况,能够更全面地反映 AI 工具是否真正改善了软件开发。

数据中心建设、社区责任与能源成本

面对数据中心建设引发的社区担忧,Google 应当怎么做?

我们非常重视以负责任的方式建设数据中心。我走访过一些 Google 长期运营大型数据中心的社区,也会与当地居民交流。有些居民会告诉我们,他们的孩子因为 Google 在当地的投资而有机会上大学。我们与这些社区共同成长,这说明数据中心投资能够带来就业、教育和其他长期收益。但这并不意味着建设项目可以忽略当地居民的担忧。

我认为,关键是从项目早期就与社区沟通,保持透明,并认真理解项目对周边地区的影响。对于这些项目,我们承诺带来新增电力,并承担项目所需电力的 100% 成本。我们还需要尽早了解社区和邻里受到的影响,与当地居民合作解决问题,而不是等到数据中心建成、争议出现后才开始回应。

如果能够以正确的方式推进,数据中心建设与社区发展并不必然冲突。但行业不能假设所有企业都会采取相同做法。居民突然发现大型数据中心建在自家后院附近,感到惊讶或担忧,是完全可以理解的。整个行业都应当在沟通、透明度和责任落实方面做得更好。

从长期角度看,太空数据中心等探索也与基础设施选址有关。未来我们需要更多数据中心,而把它们放在不同环境中,可能会带来不同的成本、能源和社区影响权衡。但这类长期探索不能成为今天忽视社区责任的理由。

AI 研究中的其他关键突破方向

除了更大的模型,Google 还在押注哪些研究方向?

我们并不是只押注一种技术路线,而是在多个方向同时投入。Argon 支持一百万个输出 tokens,是其中一个值得注意的进展。早期 Gemini 模型在输入侧实现了一百万 token 的上下文窗口,也体现了我们持续推进长上下文能力的努力。

除此之外,我们还在研究合成数据、持续学习和更高效的模型架构。持续学习关注的是模型发布后能否继续更新和学习,而不是每次会话结束后就失去此前积累的能力。更高效的架构则有助于在有限算力条件下提升模型能力和运行效率。世界模型也是我们持续投入的方向之一。

我们会把有意义的一部分算力专门用于这些研究押注。它们与主线模型开发并不是彼此割裂的:研究过程中出现的想法,有时会逐渐成熟,并最终进入主线模型。因此,即使某些探索尚未成为公开产品,也可能对后续模型能力产生重要影响。我们会在这些方向上同时进行多项尝试。

技术乐观主义:创新必须服务于人类

如何在承认风险的同时,继续对技术进步保持乐观?

我对技术进步抱有深刻的信念,因为从我个人的人生经历来看,技术进步以及技术可及性的提升,确实能够改善人们的生活。这种亲身经验构成了我乐观态度的基础。但我从来不认为,技术乐观主义意味着想做什么就做什么,也不意味着只要建造出某种技术,社会就一定会自动从中受益。

人类始终需要努力驾驭技术,让技术以正确的方式服务社会。我们必须把技术建设放在人类福祉的框架下,努力让人的处境变得更好。这应当成为我们开发和部署技术时最重要的目标。真正的乐观主义不是盲目乐观,而是在认识风险、认真解决问题的同时,相信技术能够带来进步。

主持人以萨尔瓦多的一个城镇为例:五年前,当地曾经对比特币和区块链充满热情,建设活动一度十分繁荣,但后来发展没有达到人们的预期。再次访问时,那里已经像一座鬼城,留下许多未完工的建设项目。这个例子说明,创新需要下注,也需要乐观,但投资并不总会按预期兑现,失败还可能给社区带来真实后果。对此,我的看法是,技术发展需要承担风险,但更需要明确我们究竟在为谁建设、希望解决什么问题,以及如何让技术真正改善社会。

我认为,我们现在仍处于未来进步的非常早期阶段。人们经常谈到医疗保健等领域,但大量影响可能还在前方。技术有机会从根本上降低许多事物的成本,尤其是那些长期以来持续变得越来越昂贵的领域;它也有机会帮助人类发现新材料,并从根本上改变某些行业的发展曲线。今天我们很难完全理解这些变化最终会有多深远,但我相信它们会产生非常重大的影响。

与此同时,我们必须正当地担忧技术可能出错的各种方式。正是认真对待这些担忧,才能推动我们找到解决办法。乐观与谨慎并不矛盾,而是必须同时存在:我们要相信技术能够改善人类生活,也要对潜在风险保持清醒,并投入足够的工作来处理它们。

结语:无限可能伴随着责任

我对 AI 的未来非常乐观,因为我们才刚刚开始看到这项技术能够带来的变化。前沿模型、多智能体协作、世界模型、持续学习、更加自然的交互界面,以及新的计算基础设施,都可能推动下一阶段的进步。但这些进步不会仅凭模型能力增长而自动变成社会价值。我们必须同步做好安全研究、独立评估、企业控制、基础设施建设和社区沟通。

对 Google 来说,真正重要的不是单纯追求更大的模型或更多的算力,而是持续推动技术前沿,并把技术转化为能够改善人类处境的产品和服务。我们需要保持创新的雄心,也需要承担与之相匹配的责任。技术乐观主义只有在服务于人类、认真面对风险并努力让社会从中受益时,才具有真正的意义。

#1 ·
#2 Zethes :

P1P2 科学方法

物理定律的特征:物理学与数学的关系,以及科学的方法

面对听众的挑战

今晚我能看到观众席了,所以我也能从人数上判断出来——上一次我眼前只是一片黑压压的影子——今晚一定有许多在座的朋友对物理学并不十分熟悉,也有不少对数学不太精通,我毫不怀疑,其中还有一些人既不懂物理也不懂数学。这对一个要讲"物理学与数学的关系"的演讲者来说,确实构成了相当大的挑战。不过,这个挑战我并不会接受。我发表这个演讲的题目时,用的是清晰明确的语言,我没有把它包装成它并不是的东西。题目就是"物理学与数学的关系",如果你发现在某些地方需要一点物理学或数学的基础知识,我也没办法。

数学在复杂情境中的应用

在思考数学对物理学的应用时,我们很自然地会想到:当涉及大量数字和复杂情况时,数学就会非常有用。举例来说,如果我们去看生物学,一个病毒对一个细菌的作用,如果你在显微镜下观察,那完全是非数学的、杂乱无章的抖动。病毒在这个奇形怪状的细菌上找到某个位置——每个细菌的形状都不一样——找到某个点,也许它把 DNA 推进去了,也许没有,诸如此类。然而,如果我们对数以百万计、数十亿计的细菌和病毒做实验,那么通过取平均值、处理大量数据,我们就能学到很多关于病毒的知识。我们可以利用求平均过程中涉及的数学,看看病毒是否在细菌体内发育出了新的菌株,比例是多少,由此我们可以研究遗传学、突变等等。

再举一个更简单的例子。你想象一块巨大的棋盘,用来下跳棋或者西洋跳棋。如果棋盘非常大,那么任何一步的实际操作并不是数学性的,它非常简单。如果是数学性的话,棋子要么往这边走,要么往那边走,沿着对角线走,或者到达底线变成王,然后可以往后走。换句话说,规则的表述非常简单,并不真正涉及任何数学。但是你可以想象,在一块巨大的棋盘上,有非常多的棋子,对最佳走法、好走法或坏走法的某种分析,也许可以通过一种深层的推理来完成,需要有人先离开去深入思考一番——那就变成了数学,那种抽象的推理。

再举一个例子,计算机中的开关。如果你只有一个开关,它要么是开的,要么是关的,这没什么数学可言,尽管数学家喜欢从这里开始他们的数学。但是,当所有的互连和线路都考虑进来,要弄清楚一个非常大的系统会怎样运作,那就需要数学了。

我想立刻说明一点:数学在物理学中有一个最主要的应用——当然它的应用非常广泛——那就是在讨论复杂情况中的详细现象时。给定游戏的基本规则,数学在复杂情境中有着巨大的应用。如果我只谈数学与物理的关系,我会把大部分时间花在这上面。但既然这是一个关于物理定律特征的系列讲座,我没有时间去讨论数学在物理学中用于计算复杂情况的应用。我们直接转向另一个问题——基本定律的特征。

基本定律中的数学

如果我们回到跳棋的比喻,基本定律就是棋子移动的规则。数学可以被应用于复杂的情况,以弄清楚下一步该怎么走、在复杂局面中什么是好棋。但基本定律的简单特征只需要非常少的数学。

然而,物理学中奇怪的事情是:对于基本定律,我们仍然需要数学。我举两个例子,一个其实不太需要数学,另一个则需要。

物理学中有一个叫做法拉第定律的规律,它说的是:在电解中,沉积的物质量与电流以及电流作用的时间成正比。也就是说,物质量与通过系统的电荷量成正比。这听起来很数学化,但实际上发生的事情是:通过导线的每个电子都携带一个单位的电荷。举一个具体的例子,也许沉积一个原子需要一个电子过来,那么沉积的原子数就必然与流过的电子数成正比,也就是与通过导线的电荷量成正比。所以,这个看起来具有数学形式的定律,其基础并不需要真正深刻的数学知识——只不过是一个电子对应一个原子,使它能够沉积下来。这并不深刻。这确实是数学,我不得不说"数字一",但这不是我今晚要谈的那种数学。

牛顿引力定律的数学性

另一方面,如果我们看牛顿的万有引力定律,它有这样一些特征,我上次已经写下来了,只是为了让你们感受数学符号传达信息的速度。我们说过,力与两个物体质量的乘积成正比,与它们之间距离的平方成反比。物体受到力的作用后,会改变速度或改变运动方向,改变的量与力成正比,与质量成反比。好了,用文字说出来也没问题,我并没有写方程。但它仍然是某种数学性的东西。我们会疑惑:这怎么能是基本定律呢?那边那颗行星是怎么做的?它看着太阳,看看有多远,然后决定用它内部的计算器算出距离平方的倒数,然后据此决定自己该移动多少?这当然不是对引力机制的解释。

所以你也许会想进一步探究,确实有各种人尝试过进一步探究。牛顿最初被质疑说:这没有任何意义,它什么也没告诉我们。他回答说:它告诉你天体是怎么运动的,这就够了。我告诉了你它怎么运动,而不是为什么。但人们往往不满足于没有机制的解释。

粒子轰击模型的尝试与失败

我想描述一种理论,它是人们发明的众多解释之一,也许你自己也想过。每隔一段时间,就会有某个学生兴冲冲地跑进来,突然解释了引力。他说:假设世界上到处都有大量粒子以极高的速度飞过我们,它们从各个方向均匀地射来,不断地穿过我们,偶尔会撞击我们,对我们进行轰击。但我们和太阳对它们来说几乎是透明的——几乎透明,但总有一些会撞上来,所以并不是完全透明的。

看看会发生什么。如果太阳在这里,地球在那里,那么如果太阳不存在,粒子就会从四面八方轰击地球,给予微小的冲量——那些少数撞上的粒子噼里啪啦地撞击——但不会使地球朝任何特定方向移动,因为从一边来的和从另一边来的、从上面来的和从下面来的,数量一样多。然而,当太阳在这里的时候,从这个方向来的粒子有一部分被太阳吸收了,因为有些粒子撞上了太阳,穿不过去。因此,从这个方向朝地球来的粒子数量,比从另一边来的要少,因为那边没有太阳阻挡。经过一番思考,你很容易看出:太阳越远,在所有粒子可能来的方向中,被挡住的粒子所占的比例就越小——也就是说,太阳的视尺寸越小,实际上与距离的平方成反比。因此,地球会受到一个朝向太阳的冲量,这个冲量与距离的平方成反比,而且是大量非常简单的操作的结果——只是一个接一个地从各个方向撞击。这样一来,数学关系的奇怪性就会大大减弱,因为基本操作比计算距离平方的倒数要简单得多。这台"机器"做了计算——这些粒子只是在那里弹跳。

唯一的麻烦是,它行不通。由于其他原因,它行不通。你编造的每一个理论都必须对照所有可能的后果来分析,看看它是否还预测了别的什么。这个理论确实预测了别的东西:如果地球在朝这个方向运动,那么从前面撞击它的粒子就会比从后面撞击它的多。就像你在雨中奔跑,雨从前面打在你脸上的比打在后脑勺的多,因为你是在迎着雨跑。所以当地球朝这个方向运动时,它是在迎着粒子跑,而逃离从后面追上来的粒子,因此从前面撞击它的粒子比从后面的多。而且只要有任何运动,就会有一个横向的力。这个横向力会使地球在轨道上减速,地球肯定不可能持续围绕太阳运转至少三四十亿年。所以,这个理论到此为止了。

你会说:"这倒是个好理论,它暂时摆脱了数学。也许我能发明一个更好的。"也许你能,因为没有人知道最终答案。但直到今天,从牛顿时代起,没有人发明出另一种关于这个定律背后的数学机制的理论描述,它要么只是在用不同的方式说同样的事情,要么让数学变得更复杂,同时还不会预测出错误的现象。我的意思是,有些理论确实做到了,但就像这个模型一样,它预测了不真实的东西。所以,到今天为止,除了数学形式之外,没有引力理论的其他模型。

数学在物理定律中不可避免

如果只有这一个定律具有这种特征,那会很有趣,也有点恼人。但事实是,我们研究得越多,发现的定律越多,对自然挖掘得越深,这种"病"就越严重——我们的每一个定律都是一个纯粹的数学陈述,而且是用相当复杂和深奥的数学来表达的。牛顿引力定律是相对简单的数学,随着我们深入,数学变得越来越深奥、越来越困难。为什么会这样,我一点头绪都没有。我在这个讲座中的目的只是告诉你们这个事实。换句话说,我这个讲座的目的实际上是解释为什么我无法让你们满意——如果你们不太懂数学的话,我没办法用任何其他方式来解释自然。这个讲座的重担就在于此:告诉你们一个事实,即不可能真正诚实地迎接这个挑战——用一种让人能感受到自然定律之美的方式来解释,而听众却没有对数学的深刻理解。很遗憾,情况似乎就是如此。

数学不仅仅是语言

你也许会说:"好吧,那就不解释定律了,至少告诉我定律是什么。为什么不用文字而用符号来告诉我?数学只是一种语言,我想翻译这种语言。"事实上,我可以翻译,而且凭借耐心,我想我部分地做到了。我可以再进一步,解释更多细节,比如"如果距离是两倍远,力就是四分之一"等等,可以把所有这些都转换成文字。换句话说,我会对外行很友好,他们满怀希望地坐在那里,期待你能解释些什么。不同的人因为向外行解释这些深奥主题的技巧不同而获得不同的声誉。外行然后一本又一本地寻找书,希望避开即使最好的阐述者最终也无法避免的复杂性。他读着读着,发现越来越混乱,一个复杂的陈述接着另一个,一个难以理解的东西接着另一个,所有这些东西显然彼此之间毫无关联,变得越来越晦涩。他希望也许在另一本书里会有某种解释。"那个人几乎快说清楚了,也许另一个人能说清楚。"我不认为这是可能的,因为还有另一个特征:数学不仅仅是一种语言。数学是语言加上推理,就像语言加上逻辑。数学是一种推理工具,它实际上是一大堆某个人仔细思考和推理的结果。通过数学,可以把一个陈述与另一个陈述联系起来。

例如,我可以说力是朝向太阳的。我也可以告诉你,正如我之前所说的,行星的运动方式是:如果我画一条从太阳到行星的线,然后在某个固定的时间间隔后——比如三周后——再画一条,行星扫过的面积与下一个三周扫过的面积完全相同,再下一个三周也一样,如此循环。现在,我可以仔细地向你解释这两个陈述,但我无法解释为什么它们是同一回事。所以,如果你不欣赏数学,你就无法看到:自然中大量看似极其复杂的事实,以及所有那些奇怪的定律和规则——每一个都已经仔细地向你解释过了——实际上是紧密交织在一起的,逻辑允许你从一个推出另一个。

等面积定律的几何证明

也许难以置信,我能证明如果力朝向太阳,那么相等的时间就会扫出相等的面积。如果我可以的话,让我来展示一个证明,让你们看到这两件事确实是等价的,这样你们就能体会到,仅仅陈述两个定律是不够的——两个定律是相互关联的,仅凭推理就能从一个推出另一个。数学是有组织的推理,知道如何做这件事是好的,这样才能欣赏陈述之间关系的美。

好,我来证明:如果力朝向太阳,那么相等的面积在相等的时间内被扫出。我们开始。这是太阳,我们想象在某个时刻,比如行星在这里,它以某种方式运动,比方说一秒后——或者一个小时,随便选什么时间——比方说一秒后,它移动到了位置二。如果太阳不对它施加任何力,那么根据伽利略的原理,它会继续沿直线运动。所以在下一个相同的时间间隔内,下一个一秒,它将移动完全相同的距离,沿同一条直线,到达位置三——如果没有力的话。

好了,首先我们要证明,如果没有力,相等的面积在相等的时间内被扫出。我提醒你们,三角形的面积是底乘以高的一半,高是到底边的垂直距离。如果三角形是歪的——有个名字,我忘了——钝角三角形——那么高就是这个垂直高度。

现在让我们画到这两个点的连线。在没有力的情况下,问题是:这两个面积相等吗?考虑由太阳和点一、点二构成的三角形,就是这个。它的面积是这个底边乘以这个高。那么另一个三角形呢?就是从二到三的运动三角形,是这个底边乘以同一个高。两个三角形有相同的高,而且正如我所指出的,有相同的底边,因此有相同的面积。到目前为止很好:如果太阳没有施加力,相等的面积在相等的时间内被扫出。

但太阳确实施加了力。在从一到二到三的这个间隔中,太阳在拉扯,改变运动方向——这个方向、那个方向。为了对此做一个好的近似,我们取中间位置或平均位置,说在整个间隔中,全部效果是使运动在朝向太阳的方向上改变了某个量。这意味着,虽然粒子本来在朝这个方向运动,本来会在下一秒朝这个方向运动,但由于太阳的影响,运动被改变了一个量,这个改变朝着这个方向——平行于从位置二到太阳的连线。这些线是平行的。新的运动是我本来要做的运动和太阳作用引起的变化的合成。所以它实际上并没有到达位置三,而是到了位置四。

现在我们要比较三角形二 - 四-太阳和二 - 三-太阳。我要证明它们是相等的,因为它们有相同的底边。这两个三角形——没有力的那个和有力的那个——有相同的底边。它们有相同的高吗?当然有,因为它们被包含在平行线之间。所以它们有相同的高,因此我最后画的那个三角形的面积和我画的第二个三角形——二、三、太阳——的面积相同,而我之前已经证明了那个面积等于第一个。所以在行星的实际轨道运动中,第一秒和第二秒扫过的面积是相等的。通过推理,我们可以看到力朝向太阳这个事实与面积相等之间的联系。

不巧妙吗?不,这是我从牛顿那里借来的,直接出自《自然哲学的数学原理》,图都是一样的,只是字母不同,因为他用拉丁文写,这些是阿拉伯数字。

从几何推理到解析方法

顺便说一下,牛顿把他的证明做成像这样的几何形式,他书中的所有证明都是这种几何类型的。今天我们不再使用那种推理方式了,我们使用一种带有符号的解析推理。这种几何推理需要一种灵巧性——要画出正确的三角形,注意到面积,想出怎么做,你必须聪明。但分析方法已经有了改进,所以你可以更"笨"一些,写得快得多,效率高得多。我只想展示一下用更现代的数学符号写出来是什么样子,你只需要写很多符号就行了。

首先,我们想讨论面积变化的速度,我们用 dA/dt 来表示。面积变化是因为——当半径在扫动时——是速度在垂直于半径方向上的分量乘以半径,告诉我们面积变化的速度。这就是径向距离乘以速度(即距离的变化率)的垂直分量。现在的问题是,面积变化率本身是否变化。原则上它不应该变化,面积的变化率不应该变化。所以我们对它再求一次导数。那些点不是关于把点放在正确位置的小技巧——那只是你必须学的一些规则,是人们发现的一系列非常强大的规则。这个表达式说的是:速度在垂直于速度方向上的分量——没有这样的分量,因为速度在自身方向上——而加速度,即速度的导数,等于力除以质量。所以这个表达式说的是:面积变化率的变化率等于力在垂直于半径方向上的分量。但如果力在半径方向上——正如牛顿所说——那么垂直于半径方向就没有力,这意味着面积变化率不变化。

我只是想展示不同符号系统的区别。牛顿或多或少知道怎么做这些,用的是稍微不同的符号,但他把所有东西都写成几何形式,因为他试图让人们能读他的论文。他发明了微积分,也就是这种数学,这是数学与物理关系的一个很好的例证。当物理学中的问题变得困难时,我们常常可以求助于数学家,他们已经研究了这样的问题,已经对这样的项目进行了推理,为我们准备好了一条推理的路线可以遵循。另一方面,他们也许没有准备好,那样我们就必须发明自己的推理路线,然后它会传回数学家那里。因为任何对任何事物进行仔细推理的人,都是在为"当你思考某件事时会发生什么"的知识做出贡献。如果你把它抽象出来,送到数学系,他们会把它放进书里,作为一个数学分支。

数学作为连接各种陈述的工具

数学是从一组陈述走向另一组陈述的方式。它在物理学中显然是有用的,因为我们有所有这些不同的谈论事物的方式,它允许我们推导结果、分析情况、以不同方式重新表述定律,并把各种陈述联系起来。事实上,一个物理学家所知道的总量其实很少,他只需要记住从一个地方到另一个地方的规则,他就能做到。换句话说,关于等面积、力在半径方向等等的各种陈述,都通过推理相互联系着。

巴比伦传统与希腊传统

现在出现了一个有趣的问题:是否有某种模式?是否有一个起点——基本原理——可以推导出整个体系?或者说,自然中是否有某种特定的模式或秩序,使我们能理解哪些是更基本的陈述,哪些是更派生的陈述?

有两种看待数学的方式,为了这个讲座的目的,我称之为"巴比伦传统"和"希腊传统"。在巴比伦的学校里,学生学习数学的方式是做大量的例子,直到他领悟了一般规则。大量的几何知识也被掌握了——圆的很多性质、毕达哥拉斯定理、立方体和三角形的面积公式等等——也有一些推理可以从一个东西到另一个东西。数值量的表格也是可用的,所以你可以解复杂的方程。一切都为计算准备好了。但欧几里得发现了一种方法,可以把所有几何定理从一组特别简单的公理中排列出来,你们肯定都熟悉那种几何。

巴比伦的态度是——我所说的"巴比伦数学"的方式是——你知道所有这些不同的定理以及它们之间的许多联系,但你从未真正意识到它们都可以从一堆公理中推导出来。现代数学——最现代的数学——集中于公理和在非常明确的框架内的证明,有关于什么可以接受为公理、什么不可以接受的惯例。例如,在几何中,取欧几里得公理的某种修正版本使之更完善,然后展示系统的推导。例如,毕达哥拉斯定理——三角形各边上的正方形面积之和等于斜边上的正方形面积——不应该是一条公理。另一方面,从笛卡尔的几何观点来看,毕达哥拉斯定理就是一条公理。所以我们要担心的第一件事是:即使在数学中,你也可以从不同的地方开始,因为所有这些不同的定理都通过推理相互联系着。

没有真正的方法说"这些在最底下是基础,这些通过逻辑连接在上面",因为如果你被告知的是这一个而不是那一个,你也可以把逻辑反过来推。这就像一座有很多构件的桥,它是过度连接的——如果有几块掉出来了,你可以用另一种方式重新连接。今天的数学传统是从某些特定的公理开始,这些公理由某种惯例选定,然后从那里构建起整个结构。巴比伦的方式——我说的并不真的是巴比伦的——是说:我碰巧知道这个,碰巧知道那个,也许还知道那个,我从那里开始推导出一切。明天我忘了这个是对的,但我记得那个是对的,然后我重新构建。我从来不确定该从哪里开始、在哪里结束。我只是始终记住足够多的东西,这样当记忆消退、碎片掉落时,我就把东西重新拼凑起来。每一天都是如此。

从公理出发的方法在获取定理方面并不是高效的。在几何中解决问题时,如果你每次都要回到公理,效率就不高。但如果你记得几何中的几样东西,你总是可以到达别的地方,用另一种方式效率要高得多。最好的公理与最有效的周游方式从来不完全相同,事实上从来都不相同。

在物理学中,我们需要巴比伦方法,而不是欧几里得或希腊方法。让我说说为什么。欧几里得方法的问题是要使公理变得更有趣或更重要。但我们的问题是:在引力的情况下,说力朝向太阳是更好的公理,还是说相等的面积在相等的时间内被扫出是更好的公理?从一个角度看,力更好,因为如果我陈述力是什么,我就可以处理一个有许多粒子的系统,其中轨道不再是椭圆——因为粒子之间的相互拉扯——等面积定理就失效了。因此我倾向于把力定律作为公理而不是另一个。

角动量守恒

另一方面,等面积原理可以被推广。当有大量粒子的系统时,它变成另一个定理。我本来准备解释的,但我看到时间快不够了。不过有一个陈述比等面积等时间更一般一些。让我说说它是什么。说起来相当复杂,也不像等面积那么漂亮,但它显然是等面积原理的"后代"。

如果你看着所有这些粒子——木星、土星、太阳和所有这些东西——围绕许多恒星运转或者不管它们是什么,全部相互作用的。从远处看,投影在一个平面上,就像这张图片一样。然后一切都在运动,这个朝这个方向动,那个朝那个方向动,等等。然后取任何一个点——比方说这个点——然后计算每一个粒子扫出多少面积,到每个粒子的半径扫出多少面积,然后把它们全部加起来。但是等等——那些质量更重的粒子贡献更大。如果这个的质量是那个的两倍,那么这个面积就算两倍多。

这就是在"扫动",所有这些的总和在时间中不变化。这就是另一个定律的显然推广。顺便说一下,这个总和叫做角动量,这叫做角动量守恒定律。"守恒"只是意味着它不变化。

这个定律的一个结果——只是为了展示它有什么用——想象许多恒星落在一起形成一个星云、一个星系。当它们靠近时,如果它们原来在很远的地方,运动很慢,所以只有很少的面积在很长的臂上被产生——到中心的距离很长。然后如果这些东西落进来,到中心的距离变短了。如果所有恒星现在都靠近了,这些半径变小了,为了扫出相同的面积,它们必须运动得更快。所以当这些东西落进来时,它们会旋转起来,这样我们就能大致理解旋涡星云的定性形状。也可以用完全相同的方式理解滑冰运动员的旋转——当你开始时腿伸出去,转得慢,当你把腿收进来,转得更快。因为当腿伸出去时,它在缓慢运动中每秒贡献一定面积,然后当它收进来时,为了获得相同的面积,你必须转得更快。但我没有为滑冰运动员证明这一点——滑冰运动员用的是肌肉力量,引力是不同的力——但这对滑冰运动员也是对的。

定律超越其推导

我们现在有一个问题:我们常常可以从物理学的一部分——比如万有引力定律——推导出一个原理,而这个原理被证明比推导本身要广泛得多。这在数学中不会发生——定理不会出现在它们不该出现的地方。换句话说,如果我们说物理学的公设是万有引力定律,我们可以推导出角动量守恒,但只限于引力。然而我们通过实验发现,角动量守恒是一个范围大得多的事情。牛顿有其他公设,从中可以得到更一般的角动量守恒定律,但牛顿定律是错的——没有力,那都是一堆胡说,粒子没有轨道,等等。然而,这个关于面积的原理的精确推广——角动量守恒——在量子力学中的原子运动中是对的,据我们今天所知,它仍然是精确的。

所以我们拥有这些宽泛的原理,它们横扫所有不同的定律。如果一个人太认真地对待他的推导,觉得这个原理只在那个定律有效时才有效,他就无法理解物理学不同分支之间的相互联系。也许有一天,当物理学完备了,也许通过这种论证,我们知道了所有的定律,然后我们可以从某些公理开始——毫无疑问,会有人想出一种特定的方式来做这件事,然后所有的推导都会被完成。但在我们还不知道所有定律的时候,我们可以用一些定律来猜测超越证明范围的定理。

所以,为了理解物理学,一个人必须始终在头脑中保持所有各种命题及其相互关系的精妙平衡,因为定律常常超越其推导的范围。只有当所有定律都被知道之后,这才不再重要。

引力定律的三种等价表述

数学与物理之间另一个有趣的事情是——一件非常奇怪的事情——通过数学论证,你可以证明你可以从许多不同的看似不同的起点出发,得到同样的结果。如果你有公理,这很清楚,你可以用一些定理。但实际上,物理定律是如此精妙地构造的,它们的陈述具有如此定性上不同的特征,这非常有趣。

如果你们允许的话,我要用三种不同的方式来陈述万有引力定律,它们结果是完全等价的,但听起来完全不同。

第一种是物体之间的力,如前所述。每个物体感受到作用在它上面的力,然后加速或改变运动,以每秒某个量变化。这就是我所说的通常方式,我称之为牛顿定律。这是一种描述方式。

这种定律有一个完全不同的特点:力依赖于有限距离之外的某个东西。它有一种我们称为"非定域"的性质——这个物体上的力取决于那边那个物体在哪里。你也许不喜欢超距作用的想法,但它就是能知道那边发生了什么。

然后还有另一种陈述定律的方式,非常奇怪,叫做"场"的表述方式。这很难解释,但我只想给你们一个粗略的概念。它说的是一件完全不同的事情:空间中每一点都有一个数。我知道它是一个数,不是一个机制——这就是整个物理学的麻烦,它必须是数学的。空间中每一点都有一个数,这里一个数,那里一个数,以此类推。当你从一个地方走到另一个地方时,这个数会变化。如果一个物体被放在空间中的某一点,作用在它上面的力指向那个数——它的名字叫"势"——变化最快的方向,力的大小与势在你移动时的变化率成正比。这是第一个陈述。但这还不够,因为我必须告诉你如何确定势如何变化。我可以说势随每个物体的距离的倒数变化,但那又回到了超距作用的想法。然而你可以用另一种方式陈述这个定律:你不需要知道任何小区域之外发生的事情。如果你想知道这里某一点的势是什么,你告诉我以那个点为球心的任何球面——不管多小——上的势是什么就行了。你不需要看外面,你只需要告诉我邻域内发生了什么,以及球内有多少质量。规则是这样的:球心处的势等于小球面上的势的平均值,减去那个常数除以球的半径的两倍。假设球的半径叫做 a,然后乘以球内的质量——如果球足够小的话。

现在你看,这个定律和另一个不同,因为它只告诉你一个点发生的事情与非常近处发生的事情的关系。牛顿定律告诉你某一时刻发生的事情取决于更远处的事情——它从一个瞬间到下一个瞬间给出如何计算,但在空间中它从一个地方跳到另一个地方。但这个东西在时间上是定域的,在空间上也是定域的,因为它只取决于邻域。这是另一种表述方式。

现在还有另一种完全不同的方式。你看到这些不同表述中哲学和定性思想的差异。你不喜欢超距作用?你可以不用它。现在我要给你们看一种哲学上完全相反的方式,其中完全不讨论事物如何从一个地方传到另一个地方,整个事情是一个总体性的陈述。

当你周围有其他粒子,你想知道这个粒子如何从一个地方运动到另一个地方时,你这样做:你计算一个量。你发明一个可能的运动,从给定的一个地方到另一个你感兴趣的地方,在给定的时间内——比如它想在一小时内从这里到那里,你想知道它走什么路线能在一小时内到达。所以你计算一个量,猜测一条曲线。如果你尝试这条曲线,你计算某个数;如果你尝试另一条路线,你当然会得到不同的数。但有一条路线给出那个量的最小可能值,那就是粒子实际走的路线。

现在我们在用关于整条曲线的某种陈述来描述实际运动——椭圆。我们失去了因果性的概念:粒子在这里,它感受到拉力,它移动到这里。取而代之的是,它以某种宏伟的方式"嗅"遍了所有可能的曲线,所有可能的路线,然后决定走哪一条。

等价表述的深远意义

这是一个例子,说明描述自然的美丽方式有如此广泛的范围。当人们说自然必须有因果性——好吧,你可以用那种方式谈论。自然必须用最小原理来表述——好吧,你也可以用这种方式谈论。自然必须有定域场——你也可以那样做。问题是:哪一个是正确的?

如果这些不同的选择在数学上不完全等价,如果某些选择会有不同于其他的后果,那就很好,因为我们只需要做实验来找出自然实际上选择了哪种方式。大多数人是带着哲学观点来的,他们喜欢这个不喜欢那个。但我们从大量经验中学到,所有关于自然将如何运作的哲学直觉都是失败的。从来就不管用。一个人只需要把所有可能性都算出来,尝试所有选择。

在我谈的这个特定情况下,这些理论是完全等价的。三种表述——牛顿定律、定域场方法和最小作用量原理——的数学后果在每一种情况下都完全相同。那我们怎么办?你在所有书中都会读到:因此我们无法在科学上决定哪个是对的。这是对的——它们在科学上是等价的,不可能做出决定,因为没有实验或方法可以区分它们,如果所有后果都相同的话。

但在心理上,它们非常不同,有两个原因。第一,在哲学上,你喜欢或不喜欢它们,训练是唯一能克服这种"病"的方法。第二,在心理上它们不同,因为当你去猜测新定律时,它们完全不等价。只要物理学是不完备的,我们还在试图发现和理解其他定律,那么不同的可能表述就会提供线索,暗示在其他情况下可能会发生什么。它们在我们心理上变得不等价,因为它们暗示我们对更广泛情况下定律可能是什么样子的猜测。

爱因斯坦的启示

例如,爱因斯坦注意到——他说他意识到信号不能以超过光速的速度传播。对于电,他猜测这是一个普遍原理——同样的猜测游戏,就像把角动量从你证明它的那个情形推广到整个宇宙一样。他猜测它对所有东西都是对的,他猜测它对引力也是对的。如果信号不能比光速更快,那么瞬时描述力的方法就变得非常糟糕。在爱因斯坦对引力的推广中,这种描述物理学的方法是无望地不充分的,极其复杂的,而定域场方法和最小原理方法则是简洁而优美的。所以我们还没有在那两者之间做出决定。

事实上,量子力学说,就我陈述它们的方式而言,两者都不完全正确,但最小原理的存在被证明是一个后果——在微观尺度上粒子遵循量子力学。事实是,目前理解的最佳定律实际上是两者的结合,我们使用最小原理加上定域的力、定域的定律。今天的信念是,物理定律必须具有定域特征,同时也具有最小原理。但我们并不真正知道。

为什么我们必须保留所有表述

所以情况是这样的:如果你有一个只是部分精确的结构,某些东西将会失败。如果你用恰好正确的公理来写它,也许只有一个公理失败,其余的保留,你只需要改变一小点。但如果你用另一组公理来写,它们全部崩溃,因为它们都依赖于那个失败的东西。但我们无法事先判断哪种写法最好,除非凭借某种直觉和猜测,直到我们发现新的情况。所以我们必须始终把所有看问题的替代方式保存在头脑中。物理学家做的是巴比伦数学,很少注意从固定公理出发的精确推理。

自然的一个惊人特征就是这种解释方案的多样性。事实证明,这之所以可能,只是因为定律是如此的独特和精妙。例如,定律是平方反比这一点,使得它可以变成定域的——如果是立方反比就做不到。方程的另一端——力与速度的变化率相关——这个结果允许最小原理这种写法。因为如果力与位置的变化率而不是速度的变化率成正比,你就不能那样写。如果你试图哪怕稍微修改定律,你就发现只能用少得多的方式来写它们。我总是觉得这很神秘,我不理解为什么物理定律似乎总是可以用如此多的方式来表达。它们似乎能同时穿过好几个"门"。

数学家与物理学家的不同

现在我想对数学与物理的关系做一些更一般的评论。第一点是,数学家只处理推理的结构,他们并不真正关心他们在谈论什么。他们甚至不需要知道自己在说什么,或者用他们自己的话说,他们也不需要知道他们说的是否正确。让我解释一下:如果你陈述公理,你说"某个如此如此的东西和某个如此如此的东西",那么逻辑就可以在不理解这些词的含义的情况下进行。如果公理的陈述是真实的——我的意思是仔细表述的、足够完整的——那么做推理的人不需要对这些词的含义有任何知识,你就能用同样的语言推导出新的结论。如果我在一条公理中用了"三角形"这个词,结论中就会有关于三角形的某些陈述,而做推理的人可能根本不知道三角形是什么。但然后我可以把他的东西读回来,说:"哦,三角形,就是那个有三条边的东西。"然后我就知道了这个新的事实。换句话说,数学家准备了抽象的推理,只要你有关于真实世界的公理,就可以使用。

但物理学家赋予所有短语以意义。这是一件非常重要的事情,很多从数学转来学物理的人并不欣赏这一点:物理学不是数学,数学也不是物理学。一个帮助另一个,但你必须理解这些词与真实世界的联系。在最后,你必须把你算出来的东西翻译成英语、翻译成世界、翻译成你将要用来做实验的铜块和玻璃,以发现后果是否真实。这是一个问题,而这个问题根本不是数学的问题。

物理学家的特殊需求

我已经提到了另一个关系——当然很明显,数学推理的发展对物理学家有巨大的力量和用处。另一方面,物理学家的推理有时对数学家也有用。数学家也喜欢让他们的推理尽可能一般化。如果你说"我有一个三维空间,普通空间,我想谈论普通空间"——你知道你在里面,你测量距离,需要三个数来告诉你某样东西在哪里:宽、长、高,三维空间——你开始问他们定理,然后他们说:"听着,如果你有一个 n 维空间,那么这些定理是这样的。"好吧,但我只想要三维的情况。"那就代入 n 等于三。"然后你会发现,很多复杂的定理在特殊情况下要简单得多。

物理学家总是对特殊情况感兴趣,他从来不对一般情况感兴趣。他在谈论某个具体的东西,他不是在抽象地谈论任何一般的东西。他知道他在谈论什么。他想讨论引力定律,他不要任意力的情况,他要引力定律。所以需要一定量的简化,因为数学家为广泛范围的问题准备了这些东西,这非常有用。后来总是那个可怜的物理学家回来说:"对不起,你本来要告诉我四维空间的事情的时候……"

物理直觉与数学严格性

另一个有趣的事情是:当你知道你在谈论什么——这些是力,这些是质量,这是惯性,等等——你可以使用大量的常识,一种坐在裤子上的对世界的感觉。你见过各种各样的事情,你或多或少知道现象会怎样表现。而可怜的数学家把它翻译成方程,那些符号对他来说没有任何意义,他唯一的指南就是精确的数学严格性和论证中的仔细。而物理学家或多或少知道答案大概会怎样,可以猜出一半,然后相当快地继续推进。数学的严格精确性在物理学中并不是非常有用,现代数学中关注公理的态度也不是。数学家可以做他们想做的事。一个人不应该批评他们,因为他们不是物理学的奴隶。不必仅仅因为这对你们有用,他们就必须那样做。他们可以做他们想做的事,那是他们自己的工作。如果你想要别的东西,那你自己去算。

猜测新定律

下一个问题是:当我们试图获得新定律时,我们是否应该使用直觉的"坐在裤子上的感觉"和哲学原则?我不喜欢最小原理,或者我喜欢最小原理;我不喜欢超距作用,或者我喜欢超距作用。问题是模型在多大程度上有帮助。这是一件非常有趣的事情:模型常常有帮助,大多数物理教师试图教学生如何使用这些模型,获得对事物如何运作的良好物理感觉。但最伟大的发现总是证明,抽象远离模型才是对的。模型从来没有任何好处。麦克斯韦对电动力学的发现最初是用大量想象中的轮子和惰轮以及空间中的一切其他东西做出来的。如果你去掉了空间中所有的惰轮和其他一切,那个东西就好了。狄拉克发现了量子力学的正确定律——对于相对论量子力学——只是通过猜方程。猜方程的方法似乎是猜测新定律的一种相当有效的方式。这再次表明数学是表达自然的深刻方式,而试图用哲学原则或"坐在裤子上的机械感觉"来表达自然,并不是一种有效的方式。

我必须说,这是可能的,而且我知道我经常做出这样的假设:物理学最终将不需要数学陈述,机制最终会被揭示——就像其他偏见一样,只是一种偏见。总是让我困扰的是,尽管有所有这些定域性的讨论,在无论多么小的空间区域和无论多么小的时间区域内,根据我们今天理解的定律,发生的事情需要一台计算机进行无穷多步逻辑运算才能弄清楚。那么,在那个微小的空间里,所有那些怎么可能在发生?为什么需要无穷多的逻辑才能弄清楚一个微小的时空点会做什么?所以我经常做出这样的假设:定律最终会像跳棋一样简单,所有的复杂性都来自规模。但这与其他人做出的其他猜测具有相同的性质——我喜欢它,你不喜欢它。对这件事不要太有偏见是好的。

总结:大自然的数学语言

总结一下,我会引用金斯的话,他说:"伟大的建筑师似乎是一位数学家。"对于不懂数学的人来说,要真正传达自然最深层的美,确实非常困难。C.P.斯诺谈到了两种文化。我真的认为那两种文化是:拥有这种体验的人和从未拥有这种体验的人——理解数学到足以欣赏自然之美的人,和没有达到这个程度的人。

很遗憾,它必须是数学的,而且对某些人来说数学是困难的。据说——我不知道是不是真的——当一位国王试图跟欧几里得学几何学时,他抱怨说太难了,欧几里得说:"几何学没有皇家大道。"没有皇家大道。这不是我们的错。我们作为物理学家,不能把这个东西转换成任何其他语言。如果你想讨论自然,想了解自然,想欣赏自然,就必须学会她所说的语言。她只以一种形式提供她的信息。我们不会如此不谦虚地要求她改变,然后我们才肯关注。

在我看来,所有的智识论证——无论你做出怎样的论证——都不会以任何方式,或者以非常非常少的方式,向聋人的耳朵传达音乐体验真正是什么。世界上所有的智识论证都不会说服另一种文化的人——那些哲学家试图通过定性地告诉你来教你,我试图向你们描述——这传达不了,因为这是不可能的。我们是在对聋人的耳朵说话。也许正是因为视野的局限,才使得这样的人能够想象宇宙兴趣的中心是人。谢谢你们。


科学方法:我们如何寻找新定律

现在我要讨论我们如何寻找新定律。一般来说,我们通过以下过程来寻找新定律:首先,我们猜一个。然后——别笑,这是真的——我们计算这个猜测的后果,看看如果这个我们猜的定律是对的,它会意味着什么。然后我们把计算结果与自然比较,或者说与实验或经验比较,直接与观察比较,看看它是否有效。如果它与实验不符,那就是错的。这个简单的陈述就是科学的关键。不管你的猜测有多美,不管你有多聪明,不管是谁做出的猜测,不管他叫什么名字——如果它与实验不符,那就是错的。就这么简单。

猜测是科学的

因此,做出猜测并不是不科学的,尽管许多不在科学领域的人认为是这样。例如,几年前我和一个外行讨论飞碟——因为我在科学上对飞行物了如指掌——所以我说:"我不认为有飞碟。"我的对手说:"飞碟不可能存在吗?你能证明它是不可能的吗?""不,我不能证明它是不可能的,只是非常不可能。"他说:"如果你不能证明它是不可能的,那你就非常不科学。你怎么能说它不太可能呢?"好吧,这就是科学的方式。科学的做法是说什么更可能、什么不太可能,而不是一直在证明可能和不可能。

为了界定我的意思,我最终对他说:"听着,我的意思是,根据我对周围世界的了解,我认为飞碟的报告更可能是地球上已知的非理性特征的结果,而不是来自外太空的未知的理性努力的结果。只是更可能而已。"这就是一个好的猜测,我们总是试图猜出最可能的解释,同时在脑子里保留一个想法:如果它不行,我们就必须讨论其他可能性。

超导、超感官知觉与占星术

例如,曾经有一段时间有一个叫做超导的现象——现在仍然有这个现象——就是金属在低温下没有电阻地导电。起初并不明显这是已知定律的结果,是这些粒子的结果。但事实证明,它已经被足够仔细地思考过了,事实上被确定为已知定律的结果。还有其他现象,比如超感官知觉,不能用已知的物理学知识来解释。有趣的是,那个现象并没有被很好地确立,我们不能保证它存在。如果它确实能被证明存在,那当然会证明物理学是不完备的,因此它对物理学家来说极其有趣——不管它是对是错。许多许多实验表明它不起作用。

占星术的影响也是如此。如果星星真的能影响某天是否适合去看牙医——在美国我们有那种占星术——那物理理论就是错的,因为从这些东西中可以理解的基本原理中,没有任何机制能使它成立。这就是科学家对那些想法持有一些怀疑态度的原因。

理论可以被证伪但永远不能被证实

当然,你们看到,用这种方法我们可以推翻任何确定的理论。你有一个确定的理论——一个真正的猜测,从中你可以明确地计算后果,可以与实验比较。原则上我们可以摆脱任何理论,我们总是可以证明任何确定的理论是错的。但请注意,我们永远不能证明它是对的。假设你发明了一个好的猜测,计算了后果,发现你计算的每一个后果都与实验一致。那这个理论是对的吗?不,它只是没有被证明是错的。因为在未来,可能有更广泛的实验范围,你可以计算更广泛的后果,然后你可能发现它是错的。这就是为什么像牛顿行星运动定律这样的定律能持续这么长时间。他猜出了万有引力定律,计算了太阳系的各种后果,与实验比较,过了好几百年,水星运动的微小偏差才被发现。在那么长的时间里,这个理论一直没有被证明是错的,可以暂时被认为是对的。但它永远不能被证明是对的,因为明天的实验可能会成功地证明你认为是对的东西是错的。所以我们永远不能确定我们是对的,我们只能确定我们是错的。然而,我们能持续这么久是相当了不起的。我有些想法为什么能持续这么久。

模糊理论不可证伪

我还必须向你们指出,你不能证明一个模糊的理论是错的。如果你做出的猜测表达得很差、相当模糊,你用来计算后果的方法也相当模糊——你不确定——你说"我认为一切都是因为格格巫,格格巫做这个做那个,所以我大致可以解释这是怎么运作的"——那么你就会看到那个理论是好的,因为它不能被证明是错的。如果计算后果的过程是不确定的,那么凭借一点技巧,任何实验结果都可以看起来像是预期的后果。

你们可能在其他领域也熟悉这种情况。例如,一个人恨他的母亲,原因当然是她在他小时候没有足够地抚摸他或爱他。实际上如果你去调查,你会发现她确实非常爱他,一切都很好。那么就是因为她在他小时候过度溺爱他。所以通过有一个模糊的理论,你可以得到任何一种结果。

这个问题的解决方法是:如果有可能事先准确地说明多少爱是不够的、多少爱是过度溺爱的,那么就会有一个完全合理的理论,你可以对它进行检验。通常当有人指出这一点时,他们会说:"哦,你是在处理心理学的事情,那些东西不能那么精确定义。"是的,但那样你就不能声称知道任何关于它的事情。

猜测不是随机的工作

因为我是理论物理学家,我更乐于讨论问题的这一端:如何进行猜测?正如我之前说的,猜测来自哪里完全不重要,重要的是它应该与实验一致,并且应该尽可能明确。但你会说:"那很简单,我们设置一台机器,一台伟大的计算机,里面有一个随机轮子,产生一系列猜测,每次它猜一个关于自然如何运作的假设,立即计算后果,与另一端的实验结果列表进行比较。换句话说,猜测是笨人的工作。"实际上恰恰相反,让我试着解释为什么。

保险箱的比喻

第一个问题是如何开始。你想开始,我要从所有已知原理开始。但所有已知原理彼此之间是不一致的,所以必须去掉一些东西。我们收到很多信,总是有人写信来坚持认为我们应该在我们的猜测中打洞。你看,你打一个洞是为了给新的猜测腾出空间。有人对你说:"你们这些人总是说空间是连续的,但你怎么知道当你到达足够小的尺度时,真的有足够多的点?也许它只是一堆由小距离分隔的点。"或者他们说:"你知道那些你告诉我的量子力学振幅,它们太复杂太荒谬了,你怎么知道它们是对的?也许它们不对。"我收到很多这样的信。

但我必须说,这样的评论是完全显而易见的,对于任何在这个问题上工作的人来说都是完全清楚的,指出这些没有任何好处。问题不是什么东西可能是错的,而是什么可以精确地替代它。如果你说了任何精确的东西——例如,在连续空间的情况下,假设精确的命题是空间实际上由一系列点组成,点之间的空间没有任何意义,而且这些点排列在一个立方阵列中——我们可以立即证明那是错的,那行不通。你看,问题不是去改变或说某样东西可能是错的,而是用某样东西来替代它。那并不那么容易。一旦任何真正明确的想法被替代进去,几乎立刻就会变得明显它行不通。

其次,在这些简单类型的东西上有无穷多的可能性。情况有点像这样:你坐在那里非常努力地工作,工作了很长时间试图打开一个保险箱。某个乔走过来,他不知道你在做什么,什么都不知道,只知道你在试图打开它,然后他说:"嘿,你为什么不试试组合 10-20-30?"因为你很忙,你在尝试很多东西,也许你已经试过 10-20-30 了,也许你知道中间那个数已经是 32 而不是 20 了,也许你知道事实上这是一个五位数的组合。所以这些信没有任何好处。所以请不要给我寄信告诉我这个东西要怎么运作。我读它们是为了确保我还没有想到那个,但回复它们太花时间了,因为它们通常在尝试 10-20-30。

我们来玩一个游戏:

扔硬币,如果扔出的是正面则重复扔硬币,直到扔出反面为止,一次游戏结束。一次游戏的奖金是根据扔硬币的次数决定的,即:
如果第 1 次就扔出反面,奖金 2 块;
如果第 2 次才扔出反面,奖金 4 块;
...
如果第 n 次才扔出反面,奖金 2^n;

问:你最多愿意每次花多少钱玩这个游戏?

很显然,这个游戏的期望是

E = 2*(1/2) + 4*(1/2)(1/2) + ... + 2^n(1/2)^n + ...
= 1 + 1 + 1 + ...
= ∞

所以理论上我们花费任意有限的价格去参与游戏应该都是划算的。但是,这个结论明显与人们的直觉相悖。事实上,现实中几乎没有人愿意花费 20 以上的价格去玩这个游戏,更不用说花费任意有限的价格了。

然而,在现实中人们精力有限、生命有限,只能进行有限次游戏。这时,使用基于“无限次”游戏假设计算出的“期望值”来进行决策,是否会存在问题呢?

我们再仔细观察一下游戏的规则,发现无穷大的期望,来自于在时间的无穷远方,将一个高阶无穷大的奖励压缩进了一个无穷小的概率。对任何现实中的人来说,高阶无穷大和无穷大没有什么区别,因此没有人能够拿到最终的这个所谓无穷大的收益。

这使我们不得不反思,延迟满足是否总是那么行之有效?如果把一个超级巨大的奖励放在一个非常漫长的延时之后,真的会有人实现吗?延迟满足在此时真的还有意义吗?

我又想到了强化学习中的 Q-learning,距离当前时刻越近,所得到的 reward 越高(我没有仔细研究过 RL,不清楚是否大部分的 reward 都是这么设置的)。这看起来也很有道理:在实现一个目标的开始阶段,你得到的 reward 越高,你越可能保持在正确的道路上。而如果是越往后 reward 越高,你更有可能在开始阶段走了一条奇怪的路子摆烂,直到最后一步,虽然 reward 奇大无比,但是你因为开始偏离得太多,几乎完全不可能得到这个 reward 了。

所以我在想,也许我们应该给自己在更近的阶段设置更多的奖励,我们才能 keep motivated,而不是把一个巨大的奖励藏在无穷远处,画饼充饥。延迟满足并不总是有效,因为人的生命与精力并不是无穷的。一味欺骗自己、麻痹自己,相信那个无穷远处的高阶无穷大奖励,恰恰是不理性的,反而容易让人堕入虚无的深渊。

#1 ·
#2 Anonymous Coward Old :

某种意义上讲人类社会就是个 Ponzi scheme,前面的人靠后面的人工作挣钱来养老

#3 Anonymous Coward Old :

严谨地说,reward 不是距离当前 timestep 越近越高。reward 是 MDP 中当前状态下采取某动作转移到另一个状态时获得的值, $ r(s, a, s') $ ,和 timestep 无关。

只是在计算 return (expected sum of reward) 的时候,可以在 reward 前面加个折扣 γ\gamma 。这个折扣还可以理解为:MDP 有 1−γ1-\gamma 的概率转移到死亡状态,从而后面什么奖励都没有。

#4 3ee28fe1a60c95b89d29317f122c70 :

搞到一万亿以上的钱可能没区别了,所以可以想象一万亿以上都是一万亿封顶,则可能期望是 40 元左右

通用目的技术:从蒸汽机、电力到人工智能的经济增长逻辑

引言:为什么少数技术能够改变整个经济体系?

回顾人类经济发展的历史,我认为有一个非常值得关注的现象:真正推动经济长期增长的,并不总是数量最多的技术发明,而是少数能够被广泛应用、持续改进,并不断催生其他创新的关键技术。蒸汽机、电动机、半导体、计算机和互联网,都具有这样的特征。这些技术的影响远远超出了它们最初出现的行业,逐渐渗透到制造业、交通运输、金融、医疗、教育和社会生活的各个领域,最终改变整个经济体系的生产方式。

经济学将这类技术称为通用目的技术(General-Purpose Technology,GPT)。Timothy F. Bresnahan 和 Manuel Trajtenberg 在 1992 年发表的工作论文《General Purpose Technologies: Engines of Growth?》中,系统提出了这一概念,并试图解释为什么少数关键技术能够成为经济增长的长期动力。他们指出,技术进步并不是一个可以简单归结为生产函数中某个残差项的过程。不同技术的经济意义存在巨大差异,有些技术只是改善某一类产品,而另一些技术则能够成为大量产业的共同投入,改变其他行业进行研发、生产和创新的方式。

我理解的 GPT,最重要的地方并不在于它本身有多先进,而在于它能够形成一个持续扩大的创新体系。一项基础技术不断进步,使更多下游行业能够以更低的成本、更高的效率使用它;下游行业在应用过程中又会产生新的产品、生产流程和技术需求,这些需求反过来推动基础技术继续升级。由此,技术创新不再是孤立事件,而是形成一个跨行业、跨组织、跨时间的正反馈过程。

蒸汽机最初解决的是动力问题,电动机解决的是动力供应的灵活性问题,半导体和计算机则让数字化计算成为几乎所有行业都能够使用的基础能力。今天,人工智能正在进入一个类似的阶段:它不只是提高某些任务的效率,还可能改变研发、知识生产、企业组织、公共服务和产业协作的基本方式。

因此,我认为理解人工智能的经济影响,不能只研究模型性能提升了多少、企业采用率有多高,或者某些工作岗位是否会被自动化。更重要的是理解它是否具备通用目的技术的基本特征,是否能够产生足够多的互补性创新,以及这些创新能否最终转化为全社会范围内的生产率提升。

通用目的技术究竟具备哪些特征?

通用目的技术不是简单意义上的重大技术发明

Bresnahan 和 Trajtenberg 对 GPT 的定义包含三个核心特征:广泛渗透性(Pervasiveness)、持续的技术改进潜力(Inherent Potential for Technical Improvement),以及创新互补性(Innovational Complementarities)。这三个特征共同决定了一项技术能否从局部应用工具发展为整个经济体系的增长引擎。

第一,广泛渗透性意味着这项技术能够被大量不同的下游行业使用。这里的广泛,并不只是指使用人数多或者市场规模大,而是指它能够进入性质完全不同的生产活动,成为各种产品、服务和生产系统的共同投入。例如,电动机可以用于纺织、冶金、食品加工和交通运输;半导体既可以进入计算机,也可以进入汽车、医疗设备、通信系统和工业控制设备。不同应用行业之间可能不存在直接联系,但它们都能够使用同一种基础技术。

第二,持续改进潜力意味着技术本身并不是一个固定不变的产品,而是能够通过持续研发、工程改进、生产学习和科学突破不断提升性能。技术进步可以表现为价格与性能比的改善,也可以表现为可靠性、速度、精度、容量、能耗和其他质量维度的提升。随着基础技术越来越便宜、越来越可靠,原来无法负担或者没有经济价值的应用开始变得可行,更多行业因此加入使用者行列。

第三,也是最重要的,是创新互补性。它意味着基础技术的进步能够提高下游行业开展研发和技术创新的回报;反过来,下游行业的技术进步也能够扩大基础技术的市场需求,促使基础技术提供者继续投资研发。基础技术和应用行业之间因此形成相互促进的关系,而不是简单的上下游采购关系。

这三个特征共同产生一种特殊的规模报酬现象。随着技术性能提升、使用行业扩大以及互补创新增加,整个技术体系能够获得超过单项技术改进本身的经济收益。Bresnahan 和 Trajtenberg 将这种机制视为通用目的技术能够推动长期经济增长的重要原因。

技术的通用性来自底层功能,而不是表面上的应用相似性

Bresnahan 和 Trajtenberg 提出,可以把某一时期的技术体系理解为一棵具有层级结构的技术树。最上层是少数基础技术,它们执行某种具有普遍价值的通用功能;下层则是大量使用这些基础技术的产品类别、生产系统和应用行业。

例如,蒸汽机和电动机的通用功能是提供连续旋转运动(Continuous Rotary Motion)。从表面上看,纺织、切割、抛光、金属加工和交通运输属于完全不同的生产活动,但这些活动都可以通过动力驱动的机械设备完成。因此,当连续旋转运动能够以更低的成本、更高的可靠性和更好的性能提供时,许多原本没有明显机械化可能性的工作也会逐渐发生改变。

半导体技术对应的基础功能则是二进制逻辑(Binary Logic)。传统手表、洗衣机、汽车发动机、计算机和医疗设备的工作过程虽然各不相同,但都可以拆解为一系列将输入转化为目标输出的步骤。其中相当多的步骤可以通过二进制逻辑电路实现。由此,表面上差异巨大的产品和生产方式,实际上可以共享少数底层技术原理。

我认为,这种底层功能的一致性非常重要。它解释了为什么某些技术能够不断进入新的产业,也解释了为什么技术扩散往往会产生超出最初预期的经济影响。人们在一项技术出现时,通常只能看到已经明确的应用场景,却很难预见它最终会覆盖多少行业。

通用目的技术与发明方法的发明并不是同一个概念

在研究工业革命和人工智能时,我认为还需要区分两个经常被混淆的概念:通用目的技术,以及发明方法的发明(Invention of a Method of Invention,IMI)。

通用目的技术提高的是商品和服务的生产效率;发明方法的发明提高的则是创造新知识、新技术和新想法的效率。两者可能同时存在于同一项技术中,但并不是必然关系。

Nicholas Crafts 在 2021 年的论文《Artificial Intelligence as a General-Purpose Technology: An Historical Perspective》中,引用 Cockburn、Henderson 和 Stern 的分类框架,对两者进行了区分。论文第 522 页的图 1 将技术划分为四类:

不是通用目的技术 是通用目的技术
不是发明方法的发明 Bessemer 转炉、工业机器人 蒸汽动力、自动驾驶汽车
是发明方法的发明 研究实验室、算法 ICT、深度学习

这个分类说明,一项技术可以广泛应用于不同产业,却不一定直接改变创新活动本身;也可以显著改善创新活动,却不一定成为覆盖整个经济体系的通用技术。

例如,蒸汽动力是典型的 GPT,但它并没有直接创造一种全新的科学研究方法。研究实验室能够改变技术研发的组织方式,但它本身并不是像电力一样广泛嵌入各行业的基础技术。信息通信技术则同时具有两种特征:它既能提高商品和服务的生产效率,也能降低知识获取成本,改变研发和创新活动的方式。

我认为,人工智能最值得关注的潜在价值,恰恰在于它可能同时具备这两种属性。它不仅能够完成原来由人类执行的认知任务,还可能成为一种新的知识生产工具,改变科学研究、工程设计、药物发现和企业研发的过程。

通用目的技术如何形成经济增长动力?

创新互补性如何形成双向诱导机制?

为了理解 GPT 如何推动经济增长,我认为最重要的是理解基础技术提供者与下游应用行业之间的双向创新关系。

在传统产业组织中,上游企业提供产品,下游企业购买产品并用于自己的生产活动。双方通常通过市场价格完成交易。但在通用目的技术体系中,这种简单的交易关系并不足以解释技术进步,因为双方的研发决策会相互影响。

假设某家企业生产半导体,下游企业则利用半导体开发个人计算机、汽车电子系统、医疗设备和通信产品。当半导体性能提高时,下游企业可以开发更好的产品,降低生产成本,或者创造以前不存在的产品。这会提高下游企业投资研发的回报,使它们更愿意投入资源改进自己的产品和生产流程。

反过来,当下游行业的技术水平提高时,它们对半导体性能的要求也会增加。例如,个人计算机需要更高的处理速度和更大的存储容量,汽车需要更可靠的电子控制系统,医疗设备需要更强的数据处理能力。这些需求会扩大半导体企业的商业机会,使它们有更强的动力继续研发。

因此,基础技术的进步诱导下游创新,下游创新又诱导基础技术进步。这是一种双向诱导机制(Dual Inducement Mechanism),也是 GPT 与普通技术最重要的区别之一。

Bresnahan 和 Trajtenberg 将这种关系称为创新互补性。若用经济学语言表达,就是基础技术质量提高,会增加下游企业研发的边际回报;下游企业技术水平提高,也会增加基础技术提供者研发的边际回报。双方的创新活动因此具有战略互补性(Strategic Complements)。

技术进步为什么会产生纵向和横向外部性?

GPT 的经济影响不仅来自基础技术与下游应用行业之间的互补关系,还来自两种外部性:纵向外部性(Vertical Externality)和横向外部性(Horizontal Externality)。

纵向外部性发生在基础技术提供者与下游应用行业之间。上游企业研发出更好的基础技术,会让下游企业获得收益;下游企业研发出更好的产品,又会扩大上游企业的市场需求。双方都无法完全获得自己创新带来的全部社会收益,因此各自的私人创新回报会低于社会总回报。

横向外部性则发生在不同的应用行业之间。半导体质量提高,不仅有利于计算机行业,也有利于汽车、通信、医疗和工业控制行业。任何一个行业扩大对半导体的需求,都可能提高半导体产业继续研发的收益,而半导体性能提高又会让其他行业受益。

从下游应用行业的角度看,基础技术的质量具有某种公共品属性。每一个行业都希望其他行业也增加应用和研发投入,因为更多应用行业能够共同扩大基础技术的市场规模,推动技术进一步升级。但单个行业通常不会主动承担全部基础技术升级成本。

由此产生了一个重要问题:每个行业都希望享受技术进步带来的好处,却不一定愿意为整个技术体系承担相应的创新成本。

为什么市场机制容易造成创新不足和创新滞后?

Bresnahan 和 Trajtenberg 的理论模型指出,即使基础技术和应用行业之间存在巨大的共同收益,分散化的市场经济也未必能够实现社会最优的创新水平。

问题的核心是双边道德风险(Bilateral Moral Hazard)和收益可占有性(Appropriability)。

假设半导体企业需要投入大量资金改进芯片性能,而计算机制造商需要投入研发资金,才能充分利用新芯片的性能。芯片企业希望通过较高的价格获得研发回报,但芯片价格越高,计算机制造商的创新成本也越高,后者就越不愿意进行互补研发。

如果半导体企业按照边际成本定价,计算机制造商就能够获得更强的创新激励,但半导体企业自身可能无法获得足够的研发收益,因此也缺少升级技术的动力。如果半导体企业提高价格,上游研发激励会增加,下游研发激励却会下降。

即使采用价格歧视,也很难同时解决双方的问题。一个能够获得全部社会创新收益的完全价格歧视型上游垄断者,可能使下游应用行业的创新回报接近于零。相反,能够给予下游企业充分创新激励的定价方式,又可能让上游企业无法收回研发投入。

因此,单纯依靠市场价格,很难同时让双方获得与社会回报相匹配的创新激励。

论文的命题一指出,在相应的模型假设下,社会最优状态下的基础技术质量、下游技术水平以及采用基础技术的行业数量,都会高于分散化市场交易所形成的均衡水平。换句话说,私人部门可能在基础技术和下游应用两个方面同时投入不足。

这种现象可以概括为:创新不足,而且创新发生得太晚(Too Little, Too Late)。

大型需求方为什么能够成为技术发展的触发器?

Bresnahan 和 Trajtenberg 特别强调,大型、稳定且具有较高支付意愿的需求方,可能成为 GPT 发展的重要推动力量。

美国国防部在 20 世纪 50 年代和 60 年代的采购政策,就是一个典型案例。当时,美国国防部对微电子产品具有较高的性能要求,也愿意通过采购承诺承担部分技术开发风险。这种需求不仅支持了微电子产业的发展,还可能通过技术进步惠及其他使用者。

但横向外部性并不只来自政府。Bell System 和 IBM 等大型私人需求方,也对微电子技术的基础进步作出了重要贡献。

在更早的技术发展过程中,交通运输行业也发挥过类似作用。19 世纪铁路建设需要大量钢轨,铁路和蒸汽船需要能够承受高压蒸汽的材料与设备。这些行业愿意为突破现有技术边界的产品支付更高价格,因此为钢铁、材料科学和工程技术提供了稳定的创新需求。

我认为,大型需求方的重要性不只是购买规模大,而是它们能够通过长期、可预测的需求,降低基础技术研发的不确定性,并为整个应用生态系统创造共同收益。

在美国半导体产业的发展过程中,冷战背景、国防采购政策以及相关产业的商业需求共同构成了外部触发条件。此后,GPT 与应用行业之间的正反馈逐渐发挥作用,推动技术进步持续多年。

技术合作和制度安排为什么重要?

既然纵向和横向外部性使市场机制难以实现社会最优,那么技术企业之间的合作就具有重要意义。

Bresnahan 和 Trajtenberg 提出,基础技术提供者与应用行业之间可以通过具有约束力的技术合同,明确双方的研发投入、技术标准和收益分配。不同应用行业之间也可以通过合作,扩大共同技术的发展规模。

但技术合同本身也面临外部性问题。每个行业都希望其他行业与基础技术提供者建立合作关系,因为其他行业的合作同样能够推动基础技术升级。与此同时,合同执行、技术预测和长期承诺都存在困难。

20 世纪末的计算机和通信产业提供了一个例子。IBM 和 AT&T 曾经在各自市场中拥有非常强的市场地位,能够在一定程度上推动基础技术和下游应用的共同发展。随着市场竞争结构发生变化,技术创新逐渐分散到更多企业,原来由大型企业承担的隐性协调职能也随之改变。

后来,战略联盟、标准制定组织、产业联盟、软件开发者社区以及行业媒体等机制逐渐成为重要的技术管理工具。这些机制能够帮助企业交换技术信息、预测发展方向,并鼓励互补性创新,但它们仍然无法完全内部化所有外部性。

因此,GPT 的发展速度不仅取决于技术本身,也取决于产业组织、合同制度、市场结构、技术标准和信息交流机制。

为什么通用目的技术的经济影响往往需要很长时间?

技术突破为什么不能立即转化为生产率增长?

从经济史来看,一项技术出现与它真正推动整个经济体系的生产率增长之间,通常存在明显的时间差。

Nicholas Crafts 在 2021 年的研究中指出,通用目的技术的生产率贡献通常在早期比较有限,随后才逐渐增加。滞后的原因主要包括三个方面:基础技术本身还需要持续改进,技术设备的质量调整后价格还需要下降,以及企业需要投入时间和资源进行组织变革和互补性创新。

以电力为例,托马斯·爱迪生于 1882 年开始向纽约客户提供电力,但美国电气化真正产生显著生产率收益,主要是在 20 世纪 20 年代,距离最初的电力商业化已经过去约 40 年。

为什么会出现这样的差距?早期工厂通常采用蒸汽机集中提供动力,再通过皮带和轴系把动力传输到不同机器。这种结构决定了机器的位置必须围绕动力源安排,生产线布局、工人组织和物料流动都受到限制。

电动机的出现并不意味着工厂立即获得全部收益。企业必须重新设计工厂,把大型集中动力系统改造成多个可以独立布置的小型动力单元。只有当机器能够按照生产效率的要求自由布局,工厂的生产组织才能发生根本变化。

因此,电力带来的生产率增长并不只是能源成本下降,还来自生产流程和组织结构的重新设计。

蒸汽动力的扩散为什么同样经历了长期滞后?

蒸汽动力在英国的经济影响也不是从蒸汽机发明之日起就立即显现。

James Watt 的蒸汽机于 1769 年获得专利,但英国蒸汽动力在 1830 年之前对生产率增长的贡献非常有限。当时使用的蒸汽动力只有约 165,000 马力。即使到了 1870 年,约三分之二的蒸汽动力仍集中在煤矿开采、棉纺织和金属制造等行业。

早期低压蒸汽机的煤炭消耗量较高,经济性受到限制。高压蒸汽技术的发展,则使蒸汽动力能够更广泛地用于工厂、铁路和蒸汽船,但这种技术转变直到 19 世纪下半叶才逐渐完成。

此外,当时蒸汽机相关的科学理论和工程知识还不成熟,蒸汽动力的价格下降速度比较缓慢,尤其是在 1850 年以前。

这说明,技术的发明并不等于技术的成熟,技术成熟也不等于技术已经被广泛采用。只有技术性能、生产成本、基础设施和应用行业的组织能力同时发生变化,通用目的技术才可能真正释放其经济价值。

电动机如何改变了整个制造业的生产组织?

Bresnahan 和 Trajtenberg 对电动机的案例进行了详细讨论。20 世纪初的前三十年,电力价格持续下降,电动机效率不断提高,电动机逐渐取代蒸汽机,成为制造业的重要动力来源。

在美国,电动机在 1900 年前后占全部已安装马力的比例还不到 5%,到 1930 年已经超过 80%。

这个过程最重要的地方不是电力替代蒸汽机,而是电力使工厂能够重新组织生产活动。

蒸汽机需要复杂的皮带和轴系来传递动力,机器必须靠近动力传输系统,工作流程也必须按照动力需求安排。电动机则能够以更小、更便宜的单位向不同设备独立供电,机器可以被安排在最有利于生产效率的位置。

这使工厂能够重新设计工作空间、生产线和机器布局。电力因此不仅降低了能源成本,还提高了生产组织的灵活性,为制造业带来了广泛的生产率收益。

Crafts 的研究也指出,美国电力带来的显著生产率收益主要发生在 20 世纪 20 年代,距离 1882 年的电力商业化约 40 年。这是一个非常典型的 GPT 扩散滞后案例。

半导体和计算机如何成为第三次技术革命的基础?

二进制逻辑为什么能够成为通用功能?

半导体技术是 20 世纪后半叶最重要的通用目的技术之一,其底层通用功能是二进制逻辑。

在电子电路出现之前,许多产品依靠机械部件完成复杂的控制和转换过程。例如,机械手表利用弹簧动力产生表示时间的模拟信号,洗衣机通过机械运动、阀门开关和电气控制完成不同工作步骤。

从技术原理上看,这些过程中的很多步骤都可以通过二进制逻辑电路实现。只要能够利用逻辑门、触发器等元件完成输入与输出之间的转换,原本需要大量不同机械结构的功能,就可能由相对标准化的电子元件实现。

半导体的应用范围因此远远超出了计算机本身。

最初的晶体管进入助听器,随后进入收音机、电视机和计算机。微处理器出现后,新的应用迅速扩展,个人计算机、CT 扫描仪、摄像机等新产品得以发展;汽车、民用飞机和军用飞机等传统产品也逐渐发生电子化改造。

Bresnahan 和 Trajtenberg 在论文第 40 页的图 1 中,使用半导体作为 GPT 的例子,将其与助听器、收音机、电视、计算机、CT 扫描仪、汽车等不同应用行业连接起来。这张图所表达的核心意思是:这些行业之间并不需要具有相同的生产流程,它们只需要共同使用同一种基础技术。

标准化为什么使数字技术具有强大的规模经济?

数字集成电路具有一个非常重要的特点:它能够使用高度标准化的元件。

传统机械零件很难实现类似程度的标准化。例如,机械钟表的齿轮可以具有不同齿数和尺寸,具体结构需要根据不同设备进行设计,因此很难把所有齿轮都变成少数通用零件。

数字集成电路则不同。一个由标准化触发器组成的电路,可以通过组合不同数量的相同元件实现不同的逻辑功能。类似的标准元件能够被用于计算机、磁带设备以及其他各种逻辑设备。

这意味着,标准化的数字元件可以实现极高的生产规模,批量生产带来的成本下降能够抵消针对不同应用进行适配所产生的额外成本。

同时,集成电路生产具有明显的学习效应。随着生产批次增加,制造工艺、良率和生产管理不断改善,成本进一步下降。这使半导体产业能够形成持续的规模经济和技术进步。

半导体技术的进步速度有多快?

Bresnahan 和 Trajtenberg 在 1992 年的论文中,列举了半导体产业在此前几十年里的技术进步数据。

20 世纪 60 年代初期,一个集成电路上只能集成少量元件;到了 80 年代初期,单个芯片上的元件已经超过 10 万个;到了 90 年代初期,数量达到约 100 万个。

这一变化大致符合当时所描述的摩尔定律(Moore's Law):单个芯片可以集成的元件数量大约每年翻一倍,而且这一趋势已经持续超过 25 年。

与此同时,动态随机存取存储器(DRAM)的质量调整后价格也大幅下降。论文指出,早期 70 年代每千比特存储器的价格超过 4 美元,后来下降到不足 1 美分,并据此描述存储器在约 15 年间出现了约 5,000 倍的价格差异。

这种价格和性能的巨大变化,使计算设备能够进入原本无法负担它们的市场。现代个人计算机的性能和灵活性远远超过早期大型主机;今天只需要几美元就能购买的数字手表,在 Sputnik 发射的年代甚至还不具备现实可行性;能够在几秒钟内收集、处理和显示数百万条信息的 CT 扫描仪,也逐渐成为医院里的常见设备。

我认为,半导体案例充分说明了 GPT 的第二个特征:持续改进不仅让原有应用变得更好,还会让新的应用在经济上变得可行。

微处理器的发展如何体现技术代际升级?

Bresnahan 和 Trajtenberg 在论文第 43 页引用了 1991 年《Business Week》对 Intel 微处理器发展路线的介绍。这张表格记录了当时已经推出以及正在开发的芯片代际。

芯片 推出时间 主要特点
8086/8088 1978/1979 为第一代 IBM PC 及其兼容机提供计算能力,采用 16 位处理,但计算机内存使用受到限制
80286 1982 比 8088/8086 速度更快,支持运行更大型的程序,首次出现在 1984 年 IBM PC/AT中
80386 1985 Intel 第一款 32 位微处理器,能够以 32 位数据块进行处理,使个人计算机能够承担网络等更复杂的任务
80386SX 1988 80386 的低价版本,目标是替代 80286 市场
80486 1989 被称为“芯片上的主机”,具有约 120 万个晶体管,是当时复杂程度很高的芯片
486SX 1991 旨在让大众以较低成本获得接近大型主机的计算能力,并逐步取代 80386
586 1992 年预期 预计具有约 200 万个晶体管,性能至少达到 80486 的两倍,目标是与 RISC 芯片竞争
686 1993/1994年预期 当时刚进入研发阶段,预计加入声音和视频处理能力,服务于多媒体应用

需要注意,586 和 686 的相关描述是 1991 年时对未来芯片的预期,而不是对后来实际产品表现的回顾。

这组技术代际变化说明,基础技术升级能够不断扩大下游行业的创新空间。计算机制造商需要了解下一代微处理器的性能,才能设计相应的计算机产品;软件开发者需要获得新的操作系统,才能为新系统开发软件;操作系统开发者又需要了解新一代计算机硬件的能力。

不同技术层级之间存在紧密联系,任何一层的进步都会影响其他层的研发方向。

如何衡量通用目的技术对经济增长的贡献?

GPT 如何影响劳动生产率和全要素生产率?

在经济学中,衡量通用目的技术的常见方法是增长核算(Growth Accounting)。

劳动生产率增长通常可以分解为资本深化和全要素生产率增长。Crafts 在 2021 年的论文中进一步将资本划分为 GPT 相关资本和其他资本,并将全要素生产率增长划分为 GPT 生产部门与其他经济部门的贡献。

其基本关系可以写成:

[
\frac{\Delta(Y/L)}{Y/L}

\alpha\frac{\Delta(K_O/L)}{K_O/L}
+
\beta\frac{\Delta(K_{GPT}/L)}{K_{GPT}/L}
+
\omega(\Delta A/A)_{GPT}
+
\phi(\Delta A/A)_O
]

其中,(Y/L) 表示劳动生产率,(K_O) 表示其他资本,(K_{GPT}) 表示通用目的技术相关资本,(\alpha) 和 (\beta) 分别表示相应资本的收入份额,(\omega) 和 (\phi) 则表示 GPT 生产部门与其他经济部门在总产出中的相应权重。

这个分解说明,GPT 对劳动生产率的影响主要有两个渠道:一是通过增加 GPT 相关资本投入,提高每名劳动者能够使用的资本数量;二是通过基础技术自身的生产率提高,直接改善技术设备的性能和成本。

此外,GPT 还可能通过知识溢出产生第三种影响。例如,企业使用新的技术设备后积累了经验,这些经验可能被其他企业学习和利用,从而提高整个行业的生产率。

在原有增长核算框架中,可以加入一个知识溢出项:

[
\gamma\frac{\Delta(K_{GPT}/L)}{K_{GPT}/L}
]

其中,(\gamma) 表示 GPT 资本深化带来的未获得直接补偿的全要素生产率溢出效应。由于这部分影响很难独立估计,许多研究并没有将其单独纳入计算,而是把它计入其他经济部门的全要素生产率增长。

这也意味着,传统增长核算可能低估 GPT 对经济的真实影响,特别是当技术的主要贡献来自知识扩散、组织变革和互补性创新时。

蒸汽、电力和 ICT 分别贡献了多少生产率增长?

Crafts 在论文第 524 页的表 1 中,对蒸汽、电力和 ICT 的生产率贡献进行了估算。数据以每年劳动生产率增长的百分点表示。

技术及经济体 时期 资本深化 TFP 贡献 合计 占全经济劳动生产率增长的比例
蒸汽动力(英国) 1760—1830 0.011 0.003 0.014 5.6%
蒸汽动力(英国) 1830—1870 0.18 0.12 0.30 19.0%
蒸汽动力(英国) 1870—1910 0.15 0.16 0.31 29.2%
电力(美国) 1899—1919 0.04 0.06 0.10 5.6%
电力(美国) 1919—1929,估计一 0.07 0.07 0.14 3.6%
电力(美国) 1919—1929,估计二 0.07 0.30 0.37 9.5%
电力(美国) 1929—1941 0.04 0.16 0.20 8.0%
ICT(美国) 1974—1995 0.41 0.36 0.77 49.4%
ICT(美国) 1995—2004 0.78 0.72 1.50 49.0%
ICT(美国) 2004—2012 0.36 0.28 0.64 41.0%

注:电力在 1919—1929 年的估计一没有考虑全要素生产率溢出,估计二则将其纳入。

这张表最值得注意的地方是,蒸汽动力和电力的宏观生产率贡献具有明显的滞后,而 ICT 的影响出现得更快、规模也更大。

ICT 在 1995—2004 年对美国劳动生产率增长的年度贡献达到 1.50 个百分点,约占全经济劳动生产率增长的 49%。即使到了 2004—2012 年,其贡献仍然达到 0.64 个百分点。

相比之下,电力在 1899—1919 年的年度贡献只有 0.10 个百分点,占全经济增长的 5.6%。到了 1919—1929 年,如果计入 TFP 溢出,其贡献提高到 0.37 个百分点。

这组数据说明,GPT 的宏观经济贡献并不是从技术诞生时就固定存在的,而是会随着技术改进、应用扩张和组织调整逐渐增加。

为什么 ICT 的影响比蒸汽和电力出现得更快?

我认为,ICT 的历史提供了一个重要的比较案例。

Intel 4004 微处理器于 1971 年推出,ICT 在美国劳动生产率增长中的贡献从 1974—1995 年开始变得显著。与蒸汽动力和电力相比,ICT 的技术扩散和生产率贡献出现得更快。

这可能与现代经济的科学技术能力、研发投入和资本市场成熟程度有关。现代企业已经拥有更成熟的研发组织、工程人才、融资渠道和全球供应链,因此能够更快地识别和利用新的技术机会。

Crafts 也指出,Solow 曾经提出著名的生产率悖论:“计算机时代无处不在,唯独没有出现在生产率统计数据中。”但从历史比较来看,Solow 在 20 世纪 80 年代末提出这一观点时,ICT 对劳动生产率的贡献实际上已经相当显著。

不过,不能简单地把整个经济的生产率增长都归结为 GPT。蒸汽和电力确实发挥了重要作用,但它们并不是唯一的增长动力。

例如,英国劳动生产率的增长速度从 1869 年的每年 2.2% 下降到 1890 年的 0.8%,但蒸汽动力对劳动生产率的贡献在 1830—1870 年和 1870—1910 年两个时期大致相当。蒸汽动力的使用马力从 1870 年的 210 万增加到 1907 年的 970 万,说明蒸汽时代并没有在 19 世纪 70 年代结束。

同样,美国 1899—1941 年第二次工业革命相关技术集群,只解释了私人国内经济劳动生产率增长的 36% 和 TFP 增长的 38%。即使是影响巨大的技术革命,也无法解释经济增长的全部变化。

Boyan Jovanovic 和 Peter Rousseau 在 2005 年的研究中也指出,电气化和信息技术是美国经济最重要的两次通用目的技术革命。电气化的扩散范围更广,而信息技术在技术上显得更加革命性;ICT 时代的生产率放缓也更明显,但其持续扩散和价格不断下降,为 21 世纪的增长提供了乐观依据。

工业革命真正改变的是什么?

第一次工业革命并不是一场立即爆发的生产率革命

传统经济史通常把英国 1760 年代至 1830 年代的经济发展称为第一次工业革命。这一时期出现了大量著名发明,包括 Richard Arkwright 的纺织技术、Henry Cort 的冶金技术、Samuel Crompton 的纺纱设备、George Stephenson 的铁路技术以及 James Watt 的蒸汽机改进。

但 Crafts 认为,第一次工业革命最值得关注的特点,并不是生产率立即高速增长,而是人类逐渐形成了一种新的发明方法。

在工业革命初期,技术进步并没有立即带来大规模的全要素生产率增长。农业和交通运输以外的大部分服务业受到的影响都比较有限。即使到了 1851 年,纺织、金属制造和机器制造等典型工业革命行业,也只占工业就业人数的不到三分之一,或者占全社会就业人数的 13.4%。

当时经济中仍然有大量就业集中在传统产业,因此少数行业出现技术突破,并不能立即改变整个经济的生产率。

Crafts 在论文第 528 页的表 5 中给出了英国 1700—1913 年的增长核算数据。

时期 劳动生产率增长 资本深化贡献 劳动力质量贡献 TFP 增长
1700—1760 0.25 0.10 0.01 0.14
1760—1780 -0.01 -0.06 -0.01 0.06
1780—1800 0.46 0.19 -0.01 0.28
1800—1830 0.29 0.10 0.01 0.18
1830—1856 1.11 0.65 0.08 0.38
1856—1873 2.06 0.72 0.32 1.02
1873—1913 1.06 0.38 0.58 0.10

注:单位为每年百分比,按照标准新古典增长核算方法计算。

这张表显示,1760—1830 年英国的 TFP 增长并不突出。真正显著的劳动生产率增长主要出现在 1830 年以后,而 1856—1873 年劳动生产率增长达到每年 2.06%,TFP 增长达到 1.02%。

另一个值得注意的现象是,1873—1913 年的 TFP 增长只有 0.10%。当研究进一步使用工作小时数并单独识别劳动质量贡献时,这种放缓仍然存在,并不能简单地视为一个短暂的统计异常。

因此,第一次工业革命并不是一个技术发明出现后,生产率就立即大幅增长的案例。

第一次工业革命为什么没有立即带来大规模工资增长?

工业革命的另一个重要争议,是技术进步是否导致劳动者长期受损。

一些研究将英国工业革命时期描述为“恩格斯暂停”(Engels' Pause):技术进步加速,但实际工资增长缓慢,劳动者在国民收入中的份额受到挤压。这一历史经验经常被用来讨论人工智能和自动化对就业市场的潜在影响。

Crafts 对这一观点进行了重新检验。他认为,虽然部分劳动者遭受了严重的技术替代冲击,但英国整体劳动收入份额并没有出现长期、大幅度的下降。

论文第 527 页的表 3 给出了 1770—1860 年英国劳动、土地和资本收入份额,以及隐含利润率的数据。

年份 劳动收入份额 土地收入份额 资本收入份额 利润率
1770 61.0% 21.8% 17.2% 9.8%
1780 56.8% 21.4% 21.8% 12.6%
1790 57.1% 19.8% 23.1% 13.1%
1800 55.8% 18.3% 25.9% 15.3%
1810 56.4% 16.3% 27.3% 16.0%
1820 59.0% 15.8% 25.2% 14.3%
1830 60.7% 15.1% 24.2% 14.1%
1840 59.2% 12.5% 28.3% 15.9%
1850 65.3% 10.5% 24.2% 12.9%
1860 62.0% 8.5% 29.5% 17.2%

利润率是通过资本收入份额除以资本产出比计算得到的。

从数据来看,资本收入份额确实从 1770 年的 17.2% 增加到 1860 年的 29.5%,但这主要伴随着土地收入份额下降,而不是劳动收入份额持续下降。工业化过程中资本不断积累,而农业土地面积几乎没有增长,因此资本在国民收入中的份额上升并不意味着所有收益都来自对劳动者收入的挤压。

这一时期的收入不平等呈现出类似库兹涅茨曲线的变化。相关研究估计,英国基尼系数从 1759 年的 0.53 上升到 1798 年的 0.60,随后下降到 1846 年的 0.58,并在 1867 年进一步降至 0.48。

不过,整体劳动收入份额相对稳定,并不意味着没有劳动者受到严重冲击。

最典型的案例是手工织布工。他们最初受益于纺纱机械化带来的生产扩张,但后来又被动力织布机取代。手工织布工人数从 1780 年的 37,000 人增加到 1820 年的 240,000 人,随后在 1850 年下降到 43,000 人。

他们的每周货币工资从 1770 年的 75 便士上升到 1805 年的 276 便士,随后又在 1830 年回落到 75 便士。

与此同时,新的职业类型不断出现。属于较低中产阶级职业群体的家庭数量,从 1798 年的 253,000 户、占全部家庭的 8.6%,增加到 1846 年的 649,000 户、占 15.4%。

这说明技术替代与新任务创造同时发生。机器取代了一些原有劳动任务,但经济活动的扩张也创造了新的工作机会。问题在于,劳动者能否顺利完成职业转移,以及转移过程中需要承担多少教育、培训和收入损失成本。

实际工资和劳动生产率之间存在什么关系?

Crafts 在论文第 528 页的表 4 中,以 1770 年为 100,比较了英国实际人均 GDP、实际消费收入和实际产品工资。

年份 实际人均 GDP 实际消费收入 实际产品工资
1770 100.0 100.0 100.0
1780 104.0 105.2 97.0
1790 104.2 109.3 97.6
1800 113.8 109.3 104.2
1810 118.7 109.6 109.8
1820 115.9 111.6 112.2
1830 124.7 114.3 124.3
1840 143.9 127.1 139.8
1850 154.3 148.9 165.3
1860 164.1 154.7 167.1

注:实际消费收入和实际产品工资采用以相应年份为中心的五年平均值。

到 1820 年,英国实际人均 GDP 比 1770 年提高了约 16%,实际消费收入提高了约 12%。在 1770—1840 年间,劳动生产率累计增长约 44%,实际消费收入增长约 27%,实际产品工资增长约 39%。

这说明,劳动生产率增长确实快于劳动者消费收入增长,但并没有出现长期、全面的劳动收入崩塌。分析这类历史问题时,还需要区分 GDP 平减指数和生活成本指数,因为两种价格指标可能使实际产品工资和实际消费收入呈现不同变化。

工业革命的真正突破是形成了新的发明方法

Crafts 借助经济史学家 Joel Mokyr 的研究,提出第一次工业革命最深层的意义,是人类逐渐形成了一套能够持续产生技术进步的新方法。

这种方法建立在系统性的经验主义和实验之上。人们不再只依靠个别工匠的经验,而是开始通过观察、实验、记录、比较和传播,积累可以被其他人重复使用的技术知识。

这套方法提高了三个方面的能力:创新成功的概率、研发投入的积极性,以及每项创新最终能够产生的生产率影响。

如果用内生增长理论表示,可以将技术进步率写成:

[
x=\lambda\sigma q
]

其中:

  • (x) 表示技术进步率;
  • (q) 表示创新投入或研发强度;
  • (\lambda) 表示单位创新投入取得成功的概率;
  • (\sigma) 表示每项成功创新所带来的生产率提升幅度。

创新努力通常会随着市场规模扩大而增加,因为市场越大,成功创新后能够获得的商业回报越高。因此,市场规模与创新投入之间存在正向关系。

第一次工业革命所形成的新发明方法,能够同时提高创新成功概率、研发投入和创新的实际影响力。

知识获取机构如何推动了技术进步?

这一时期出现了一系列专门生产、整理和传播科学技术知识的组织。Crafts 将其称为知识获取机构(Knowledge Access Institutions,KAIs)。

其中包括:

  • 英国皇家学会(Royal Society),成立于 1660 年;
  • 月光社(Lunar Society),成立于 1765 年;
  • 曼彻斯特文学与哲学学会,成立于 1781 年;
  • 机械学院(Mechanics Institutes),从 1823 年开始出现;
  • 英国科学促进会(British Association for the Advancement of Science),成立于 1831 年。

知识获取机构的数量从 1761 年的 3 个增加到 1851 年的 1,014 个。相关研究发现,这些机构对所在地区的专利活动具有显著影响。

与此同时,应用数学技能的传播也发挥了重要作用。测量、计算和工程设计能力的提升,使机器工具得以发展,进而把原本停留在理论和实验阶段的发明转化为能够实际运行的机械设备。

第一次工业革命仍然主要建立在经验主义之上,而不是现代意义上的成熟科学理论。例如,康沃尔抽水蒸汽机的燃料效率提升,很大程度上依赖不同设计方案的实际运行记录、观察和比较。

这种技术学习的局限在于,它往往局限于特定地区和特定行业,不一定能够自然传播到其他地方。

第二次工业革命如何改变了发明方法?

第二次工业革命通常被认为发生在 1870—1914 年。与第一次工业革命相比,这一阶段最重要的变化,是技术进步逐渐建立在应用科学和工业研发实验室之上。

Thomas Edison 于 1876 年在门洛帕克建立了自己的实验室。到了 1918 年,美国制造业已经建立了 665 个研发实验室。

专利活动的组织方式也发生了变化。1880 年,美国约 95% 的专利属于独立发明者;到了 1930 年,企业和独立发明者获得的专利数量已经大致各占一半。

发明者的科学与工程训练背景也明显提高。在 1845 年以前出生的美国伟大发明家群体中,只有 12% 的专利获得者接受过科学或工程训练;对于 1866—1885 年出生的群体,这一比例上升到 60%。

第二次工业革命的研发体系使 TFP 增长进入新的水平。Bakker、Crafts 和 Woltjer 的研究估计,美国 1899—1929 年的 TFP 年均增长约为 1.1%,如果不单独扣除劳动质量增长,粗略 TFP 增长约为 1.7%;Kendrick 在 1961 年的较早估计则为 1.4%。

电力、内燃机和化学工程都是这一时期的重要技术突破。英国在利用第二次工业革命潜力方面,相比美国表现得不那么成功。

第三次工业革命如何使 ICT 成为发明方法?

第三次工业革命通常被用于描述 20 世纪 60 年代至 21 世纪初的计算机科学和信息通信技术发展过程。

这一时期的技术进步经历了大型主机、个人计算机和互联网的发展。ICT 不仅提高了商品和服务的生产效率,还成为一种知识技术,显著降低了获取、储存、传播和处理知识的成本。

它同时改变了研发活动本身。例如,软件密集程度的提高与专利引用中软件相关内容增加有关,也使企业能够以相同的研发投入获得更多专利成果。

计算能力成本的下降尤其惊人。Nordhaus 对计算成本的研究显示,以 2006 年美元计,每百万单位计算能力的成本从 1940—1949 年的 25.7,下降到 1970—1979 年的 0.000592,再下降到 2000—2006 年的 0.000000000137。

这种变化对科学研究和经济学研究产生了巨大影响。

Xavier Sala-i-Martin 在 1997 年发表了一篇基于 400 万次回归分析的研究。他的计算机完成这些计算大约需要 33 小时,而他的计算速度约为每分钟 2,000 次回归。与此相比,Milton Friedman 在 20 世纪 40 年代末运行一次回归就可能需要 40 小时。

计算能力的进步不仅提高了研究速度,也改变了研究者能够提出的问题和使用的方法。

Crafts 还指出,美国非 ICT 行业的 TFP 年均增长贡献从 1974—1995 年的 0.14 个百分点提高到 1995—2004 年的 0.89 个百分点,同期包括 ICT 行业在内的总 TFP 增长从 0.50% 提高到 1.61%。但这种变化并没有持续保持。

人工智能为什么可能成为第四次工业革命的基础?

如果第一次工业革命的核心是系统经验主义,第二次工业革命的核心是工业研发实验室,第三次工业革命的核心是计算机和信息通信技术,那么人工智能可能代表下一次发明方法的变化。

Crafts 认为,人工智能尤其是深度学习,可能同时成为 GPT 和 IMI。它不仅可以执行既有任务,还可能提高研发和科学研究的生产率。

这一点在药物发现和科学研究中已经出现了一些早期案例。

2020 年 2 月,MIT 公布了新型抗生素 Halicin 的发现。2020 年 11 月,DeepMind 在蛋白质折叠问题上取得突破。这些案例表明,机器学习不仅可以提高现有研发活动的效率,还可能帮助研究人员发现新的科学关系和技术方案。

机器学习也已经成为经济学研究中的重要工具。例如,研究人员利用数字化书籍中的文本,推断过去约 200 年人口幸福水平的变化。按照相关研究,如果完全依靠人工完成这些文本分析,可能需要至少 800 亿人小时,而这种自动化分析在 10 年前还不具备技术可行性。

另一个重要问题是,现代研发的生产率是否正在下降。

Bloom 等人在 2020 年的研究中提出,寻找新想法可能变得越来越困难。美国自 20 世纪 30 年代以来,TFP 增长相对于研发支出的下降,与创新所需的知识负担不断增加这一解释相一致。

这可能是因为容易取得的技术成果已经逐渐被开发,也可能是因为现代科学研究越来越专业化,研究人员需要掌握更多知识才能取得新的突破。

如果人工智能能够提高寻找新想法、组合知识和验证假设的效率,它就可能成为缓解研发生产率下降的一种力量。

这里需要特别注意:如果人工智能主要通过提高其他行业的研发效率来推动经济增长,那么传统增长核算未必会把这些收益直接记在 AI 资本或 AI 行业名下,而可能把它们记录为其他经济部门更高的 TFP 增长。

人工智能是否已经具备通用目的技术的全部特征?

人工智能的快速改进是否已经得到证明?

MIT Sloan 于 2024 年 8 月 6 日发表的文章《The Impact of Generative AI as a General-Purpose Technology》,引用 Andrew McAfee 的研究,认为生成式人工智能已经具备通用目的技术的基本特征。

首先是快速改进。

文章指出,OpenAI 的 GPT-3.5 在 2022 年底发布时,在美国律师资格考试中的表现超过约 10% 的考生;GPT-4 于 2023 年 3 月发布后,其表现超过约 90% 的考生。

人工智能的上下文窗口也在快速扩大。2020 年,最先进的生成式 AI 系统能够处理的信息量约为 7.5 页文本;到了 2023 年末,这一能力已经扩大到接近 300 页,约为原来的 40 倍。

除了模型性能提升,推理成本和单位能力价格下降同样重要。基础技术的持续改进与价格下降,使更多企业和个人能够在经济上负担相关应用。

人工智能的应用范围是否已经足够广泛?

MIT Sloan 文章引用了 2023 年的一项覆盖 14,000 名不同职业和行业用户的 Salesforce 调查。

调查中,28% 的受访者表示已经在工作中使用生成式 AI,其中超过一半没有获得雇主正式批准;另有 32% 的受访者预计很快会在工作中使用生成式 AI。

另一项 2023 年的研究估计,美国约 80% 的劳动者至少有 10% 的工作任务会受到生成式 AI 影响,其中约 19% 的劳动者可能有至少一半的工作任务受到影响。

这些数据反映的是 2023 年前后的采用情况和任务暴露程度,并不等同于实际岗位被替代的比例。

从经济增长角度看,广泛应用意味着 AI 不再只属于计算机和软件行业,而是开始进入金融、法律、医疗、教育、营销、客户服务和制造业等不同领域。

为什么互补性创新是判断 AI 是否成为 GPT 的关键?

生成式 AI 能够生成文本、图片和声音,但这些能力本身并不足以形成整个经济体系的生产率革命。

真正重要的是企业能否围绕 AI 重新设计工作流程,开发新的软件工具和服务,调整组织结构,并将 AI 整合到跨部门的业务流程中。

例如,AI 能够帮助医生处理医疗记录,但如果医院没有改变预约、诊断、病历管理和治疗流程,那么 AI 带来的生产率收益就会受到限制。

AI 能够生成代码,但如果企业的软件架构、产品设计和工程协作流程没有发生变化,代码生成效率提高也未必会带来同等幅度的组织生产率提升。

Andrew McAfee 的研究强调,生成式 AI 的深层影响可能来自整个组织的重新设计,而不是单个任务的自动化。

从宏观经济角度看,Goldman Sachs 曾估计,生成式 AI 可能使未来十年美国 GDP 增长率提高 0.4 个百分点。这是一项前瞻性预测,而不是已经实现的增长结果。

为什么 AI 可能比蒸汽机和电力扩散得更快?

传统 GPT 往往需要大量新的基础设施才能广泛使用。

蒸汽动力需要矿山、煤炭供应、机械制造和交通运输系统;电力需要发电设施、输电网络、配电设备以及工厂内部电气化改造。

人工智能则可以直接运行在已经普及的互联网连接设备上。用户不需要掌握编程语言,也不需要理解复杂的计算机操作,只需要使用自然语言就能与模型进行交互。

这显著降低了技术扩散的初始门槛。

不过,我认为基础设施已经存在,并不意味着所有互补创新都已经完成。真正决定 AI 经济影响的,仍然是企业、政府和个人能否将技术能力转化为实际生产流程的变化。

人工智能可能通过哪些渠道改变宏观经济?

AI 提高单一行业生产率,是否意味着 GDP 会大幅增长?

在讨论 AI 的宏观经济影响时,我认为首先需要区分三种不同的情景。

第一种情景是 AI 主要提高某一个行业的生产率,例如软件开发、法律服务或内容生产,而其他行业的生产方式基本不变。

这种情景可能使该行业的产品和服务质量大幅提高,但未必会让 GDP 出现同等幅度的增长。

一个典型的历史案例是照明技术。

电灯泡和其他照明技术出现后,照明行业的生产率提升了许多个数量级。今天的照明效果远远超过几十年前,但照明行业在 GDP 中的份额并没有随生产率提升而不断扩大,反而逐渐下降。

原因在于,当一个行业的生产效率提高、产品价格下降时,消费者购买同样功能的产品所需要支付的费用会减少。即使产品质量和实际价值大幅提高,该行业的名义 GDP 占比也可能下降。

同时,其他生产率没有同步提高的行业仍然需要支付相近的工资,因此它们的相对价格可能不断上升。这种现象与经济学中的成本病(Cost Disease)有关。

因此,如果 AI 首先让软件行业的生产率极大提高,却没有同步改变其他行业的生产方式,宏观 GDP 的变化可能远小于人们根据软件行业效率提升所作出的直觉判断。

AI 如果成为额外劳动力,会产生什么影响?

第二种情景是将 AI 理解为一种额外的劳动供给。

传统经济中,劳动主要来自人类;如果 AI 能够在大量任务上承担与人类相似的工作,那么它就相当于为经济体系增加了一种新的劳动投入。

这种情景的宏观影响取决于 AI 能够替代哪些任务、替代速度有多快,以及经济体系是否能够同步增加资本投入。

如果 AI 能够完成越来越多的任务,但经济中的机器、设备、基础设施和其他互补资本没有同步增加,那么 AI 劳动能力的增长就可能无法完全转化为最终产出增长。

此外,还需要区分 GDP 水平的提高与 GDP 长期增长率的改变。

AI 可能使 GDP 曲线整体上移,也可能改变经济长期增长率。两种结果在经济学上的含义并不相同。

因此,真正值得测量的是:哪些职业和任务正在受到 AI 影响,以及在具体任务中,AI 能够以多快的速度替代或补充人类劳动。

如果 AI 主要提高思想和知识的生产效率,结果会有什么不同?

第三种情景,也是我认为最值得关注的情景,是 AI 主要成为知识生产和创新活动的工具。

经济学家 Paul Romer 在内生增长理论中强调,思想与传统商品存在一个重要区别:思想具有非竞争性(Non-rivalry)。

一旦微积分被发明出来,它就可以被无数人同时使用,不会因为某个人使用了它,就减少其他人使用它的机会。

如果 AI 主要提高思想生产效率,它的影响就不只是提高某个行业的劳动生产率,而可能改变整个经济体系发现新知识、组合已有知识和开展研发的速度。

这里的关键并不只是 AI 能够提高人工智能行业自身的研发效率,而是它能否提高整个经济体系的研发效率,包括药物研发、材料科学、工程技术、农业、能源和制造业。

Cockburn、Henderson 和 Stern 在关于人工智能与创新的研究中,也强调 AI 可能成为一种新的通用目的发明方法,改变研发组织和创新过程。

我认为,如果 AI 主要通过提高知识生产效率来推动增长,那么它的宏观经济影响可能远远超出传统的自动化分析。

GDP 是否足以衡量 AI 的经济价值?

GDP 是宏观经济分析的重要指标,但它并不一定能够完整反映数字技术带来的消费者价值。

例如,互联网搜索、在线地图、免费软件和许多数字服务,可能给消费者带来很大的便利,却不一定产生与其使用价值相匹配的市场交易金额。

因此,GDP 可能低估部分数字技术的实际经济价值。

在一场关于 AI 经济学的学术讨论中,演讲者提出,可以考虑通过消费者剩余等指标,补充传统 GDP 核算。

该讨论引用的一项调查估计,美国约 40% 的人每天或每周使用生成式 AI 工具;用户为了继续使用这些工具,平均每月愿意支付约 98 美元,或者说需要获得约 98 美元的补偿才愿意放弃这些工具。

将这一估计与用户规模结合,演讲者给出了约 1,000 亿美元的消费者剩余估算。

这一结果是基于调查和支付意愿的推算,并不是已经纳入官方国民经济核算的 GDP 数据。但它说明,AI 的经济价值可能不仅来自企业销售收入和劳动生产率,还来自消费者获得的额外便利、知识获取能力和时间节约。

发展中国家为什么可能从人工智能中获得更大的相对收益?

为什么发达国家和发展中国家对 AI 的态度可能不同?

2026 年《世界发展报告:AI 的承诺》相关学术讨论中,Susan Athey 提出了一个值得注意的现象:发达国家,尤其是美国,对 AI 的态度相对悲观,而发展中国家的态度则更加乐观。

这看起来有些反直觉,因为发达国家拥有更强大的计算基础设施、更多的 AI 人才和更先进的模型,而发展中国家往往缺乏这些资源。

但我认为,理解这种差异,需要先考虑不同国家的现实起点。

如果一个国家缺少医生、教师、农业专家和其他专业人员,那么 AI 带来的价值可能首先表现为补足稀缺能力,而不是替代已经充足的劳动供给。

例如,在一些发展中国家,农民可能无法获得准确的市场价格信息,教师可能缺乏高质量的教学资源,小型餐馆经营者可能需要花费半天时间处理客户订单和供应商订单,患者也可能无法获得可靠的医疗信息。

在这样的环境中,AI 能够提供原本很难获得的专业知识和服务,其相对于现有经济基础的改善幅度可能非常大。

与此同时,如果一个国家已经拥有相对充足的专业服务和成熟的企业组织,那么人们可能更关注 AI 对现有工作岗位的替代风险。

因此,AI 对不同国家的影响不能只通过技术先进程度判断,还需要结合专业人才的稀缺程度、产业结构、企业规模和公共服务能力。

发展中国家的哪些现实条件值得特别关注?

Susan Athey 在讨论中引用了几组数据,帮助解释发展中国家为什么可能从 AI 中获得较大的生产率提升。

在撒哈拉以南非洲地区,每 10,000 人只有约 2.9 名医生,而全球平均水平约为 16 名。

低收入国家的小学平均每名教师需要面对约 40 名学生,而富裕国家这一数字约为 15 人。与此同时,低收入国家教师本身的受教育水平和数字教学资源也可能存在不足。

在农业领域,一些研究发现,农民可能将超过一半的利润让渡给中间商,其中一个重要原因是缺乏及时、准确的农产品价格信息。

研究还发现,如果能够在正确的时间、正确的地点向农民提供微观天气预报,就可能明显改善农业生产决策。

这些问题的共同点是,经济活动本身并不一定缺乏劳动者,而是缺乏能够提高劳动者生产率的知识、专业能力和信息。

因此,AI 在发展中国家的重要作用,可能不是减少劳动者数量,而是增加每个劳动者能够使用的专业知识和生产能力。

为什么小型企业可能成为 AI 应用的重要场景?

Susan Athey 在讨论中指出,发展中国家的企业结构与发达经济体存在明显差异。

她引用的数据显示,约 90% 的人在员工人数少于 10 人的企业中工作。

这些企业包括零售店、餐馆、商店和家庭农场,很多分布在中小城镇和乡村地区。

经营者通常需要自己处理采购、客户沟通、员工管理、库存记录和经营决策,但他们缺少专业管理软件和完整的业务信息系统。

例如,一家小餐馆可能依靠即时通信软件接收客户订单,同时通过相同的软件联系供应商。店主需要手动整理订单、确认库存、安排采购,并跟踪不同客户的需求。

如果 AI 应用能够直接接入现有通信系统,自动整理客户订单、记录库存、识别采购需求和生成经营建议,那么企业就不必首先改变自己的沟通方式或购买复杂的软件系统。

AI 可以在现有工作流程中提供专业能力。

我认为,这种模式特别值得关注,因为它降低了企业采用技术的初始成本,也使 AI 不必依赖传统的大型企业软件部署方式。

为什么医疗、教育和农业能够成为通用目的能力的来源?

在传统宏观经济模型中,生产函数通常被表示为技术、资本和劳动等投入的组合。

但 Susan Athey 强调,专业知识和经验本身也是重要的生产投入。

医疗、教育和农业推广服务能够提高其他行业的生产率,因此这些部门可以被理解为具有通用目的能力(General-Purpose Capabilities)的基础部门。

如果医疗服务质量提高,劳动者因疾病缺勤的时间减少,整体经济产出就可能增加。如果教育质量提高,未来劳动者的人力资本水平也会提高。如果农业推广服务能够提供准确的天气和价格信息,农民就能够改善生产决策,增加农业产出。

这些能力的提升会通过其他行业进一步扩散。

例如,如果 AI 能够让农民的生产率提高 5%,或者帮助农村居民避免为了获得医疗服务而每次往返两小时,那么它带来的经济收益就不仅是节省了某项服务的成本,还可能直接增加劳动时间、农业产出和家庭收入。

这也是为什么我认为,人工智能的经济价值不应只通过它替代了多少工作任务来衡量,还应关注它能否提高整个社会的专业服务供给。

为什么 AI 必须适应当地环境,才能真正实现技术扩散?

采用技术和适应技术有什么区别?

2026 年世界发展报告提出了一个非常重要的框架:Adopt、Adapt、Advance,即采用、适应和推进。

采用意味着使用已经存在的 AI 工具,例如利用现有模型帮助医生进行诊断、帮助农民改善农业决策,或者帮助企业提高运营效率。

适应意味着根据当地语言、制度、数据、基础设施和实际需求,对 AI 工具进行改造,使其能够真正融入当地经济活动。

推进则意味着发展更先进的模型、芯片、数据中心和相关基础设施,逐渐进入 AI 技术价值链的更高层级。

对于大多数发展中国家来说,直接建设最先进的基础模型并不是最现实的起点。它需要大量资金、计算芯片、数据中心、训练数据和世界级研发人才。

相比之下,采用和适应已有技术通常更加经济,也更容易产生现实收益。

世界银行在 2026 年 8 月发布的报告指出,AI 的扩散速度已经明显快于过去的通用目的技术。蒸汽机扩散到低收入国家大约需要 80 年,电力约需要 40 年,互联网约需要 20 年;而在 ChatGPT 推出后的六个月内,中等收入国家已经占据其全球流量的一半。

这意味着发展中国家有机会以更短的时间接触新技术,但能否真正获得收益,仍然取决于本地适应能力。

为什么低成本 AI 可能比最先进的 AI 模型更重要?

在低收入国家,智能手机和互联网的普及程度并不一致。

Susan Athey 在讨论中引用的报告图表显示,低收入国家拥有智能手机的人口比例大约只有 20%。如果只考虑通过智能手机应用直接使用大型聊天机器人,就可能忽略大量潜在用户。

但 AI 应用并不一定需要以聊天机器人的形式出现。

例如,店主真正需要的可能不是与 AI 进行长时间对话,而是让客户通过现有通信软件发送订单,由系统自动整理、确认和处理。

对于只有功能手机的用户,仍然可以通过电话和语音服务提供 AI 能力。即使用户不具备读写能力,也可以通过语音消息获得个性化建议。

Susan Athey 提到,她曾与 Precision Development 合作,通过电话语音向农民提供个性化农业建议。早期系统主要提供单向语音信息,而新一代 AI 有机会进一步实现双向语音交流,使农民能够直接提问,并获得针对具体情况的回答。

在这种环境中,AI 需要适应当地语言、方言、设备条件和用户能力,而不是要求用户适应技术本身。

她还引用了一项小企业调查。该调查虽然不包括员工人数少于 5 人的最小企业,但仍然发现约 90% 的受调查企业使用短信或即时通信软件。这意味着许多企业已经具备基本的通信条件,只需要在现有系统上增加 AI 能力。

为什么小型本地模型有时比前沿模型更有价值?

在讨论中,Susan Athey 提到,她曾接触过非洲的一些团队,这些团队已经能够使用游戏电脑运行较小的 AI 模型。

这些模型不一定能够在数学竞赛中超过最先进的前沿模型,但它们可以完成更具体的任务,例如理解当地语言和方言,或者在较小的专业知识库中回答特定问题。

在这样的场景下,用户真正关心的不是模型在通用能力排行榜上的名次,而是它能否快速、准确、低成本地解决具体问题。

一个需要长时间推理、调用大量计算资源的前沿模型,可能并不适合处理一个简单的地方农业问题。一个经过本地适配、运行成本很低的小模型,反而可能产生更高的实际经济价值。

这说明 AI 应用需要在能力、成本、速度和适用范围之间进行权衡。

世界银行 2026 年的报告也强调,低成本的“小型 AI”可以通过短信、语音电话和基础手机,把专业知识提供给更多人,而不必要求每个国家都建设大型数据中心或训练最先进的基础模型。

发展中国家是否具备参与 AI 开发和适应的能力?

Susan Athey 在讨论中还引用了 GitHub 上的 AI 相关活动数据。

这些数据表明,除高收入国家外,印度、巴基斯坦、孟加拉国和尼日利亚等国家也存在一定规模的 AI 开发活动。

这些国家中有不少拥有软件外包产业和技术人才,因此具备参与 AI 工具开发、适应和本地化的基础条件。

不过,全球产业分工的变化也可能带来新的风险。

例如,一家跨国公司可能同时在菲律宾和印度班加罗尔设有业务流程外包中心。如果 AI 提高了某一地点的生产率,公司可能很快决定将更多业务集中到班加罗尔。

班加罗尔可能因此获得更多业务,但当地企业也可能进一步利用 AI 自动化这些业务流程。原本在菲律宾从事呼叫中心和业务流程外包工作的员工,则可能失去部分工作机会。

因此,发展中国家不能只关注某个产业是否扩大,还需要关注本地劳动者的下一种比较优势是什么,以及能否把被释放出来的人力资本重新投入 AI 应用开发和本地适应工作。

政府、企业和非政府组织在这一过程中都可能发挥重要作用。

人工智能的宏观增长为什么会受到弱环节限制?

什么是弱环节理论?

在讨论 AI 对长期经济增长的影响时,Christopher Tonetti 和 Chad Jones 的研究引入了一个重要概念:弱环节(Weak Links)。

这个概念与 Michael Kremer 的 O 形环生产理论以及供应链中的瓶颈问题有关。

如果一项产品需要完成一系列相互依赖的任务,那么最终产出往往会受到最弱任务的限制。

例如,制作一个蛋糕需要鸡蛋、糖、面粉和烤箱。如果缺少其中任何一种关键投入,即使其他材料非常充足,也无法制作出完整的蛋糕。

供应链同样如此。如果某个关键零部件无法供应,其他零部件再充足也不能保证最终产品顺利交付。

Tonetti 用一个简单的生产函数来表达这种关系:

[
\frac{1}{Y}=\frac{1}{X_{hard}}+\frac{1}{X_{easy}}
]

其中,(Y) 是最终产出,(X_{hard}) 和 (X_{easy}) 分别代表两种不同任务的产出。

这个表达式体现了调和平均数所具有的弱环节特征:如果其中一个投入已经非常充足,那么继续增加这个投入对最终产出的改善就会越来越有限。

真正限制产出的,是数量最少、效率最低的那项任务。

Tonetti 还使用参数 (\sigma) 表示弱环节的约束程度。按照他在讨论中介绍的估计,(\sigma) 大约为 0.2,这意味着生产体系受到弱环节的约束相当明显。

为什么只让某个行业实现无限生产率,也不会带来无限经济增长?

Tonetti 首先举了软件行业的例子。

在美国,软件支出大约占总收入的 2%。假设软件行业的生产率突然提高到无限大,能够以极低成本提供无限数量的软件,但它并没有承担任何新的任务,其他行业的生产方式也没有改变,那么整体 GDP 能够提高多少?

按照模型中的简单计算,GDP 只会增加约 2%。

这是因为,软件虽然变得极其高效,但其他行业仍然受到原有任务和生产瓶颈的限制。

他进一步考虑一个更加极端的情景:假设目前经济中有 50% 的任务支出都对应于被自动化的任务,而且这些任务的生产率达到无限大,那么整体产出会增加多少?

模型给出的结果仍然只有约 19%。

这说明,即使大量任务的生产率无限提高,其他尚未自动化的任务仍然可能成为限制整体经济增长的瓶颈。

因此,人工智能能否广泛承担不同任务,往往比它能否在某个特定任务上达到极高性能更加重要。

为什么自动化任务范围的扩大如此重要?

Tonetti 的研究不仅关注机器生产率提升的速度,还关注机器能够承担的任务范围。

从历史来看,机器在许多任务上的生产率提高速度明显快于人类。如果只观察计算能力和机械设备性能,人类可能已经很难与机器进行直接比较。

但机器生产率提升并不会自动转化为整体经济增长。它还需要伴随任务边界的不断扩大。

Tonetti 提出了一个历史反事实:假设机器的生产率仍然像现实历史中那样快速提高,但我们始终不允许机器承担 1950 年以后出现的新任务,那么过去几十年里几乎所有重要的生产率收益都可能无法实现。

这说明,经济增长来自两个共同作用的过程:机器本身不断变得更有效率,以及机器能够承担的任务范围持续扩大。

他估计,美国经济中每年大约有 2% 的任务支出份额从人类劳动转向机器。

与此同时,机器生产率的增长速度平均比人类生产率快约 4 个百分点。

如果进一步考虑一个极端的情景,即所有行业中的机器生产率都按照计算机和信息技术行业的速度提高,那么这一差距可能达到约 11 个百分点,而不是历史趋势下的 3.8 个百分点。

这就是研究中所称的“Moore's Law Everywhere”情景。

为什么生产率的弱环节决定 AI 的宏观增长速度?

我认为,弱环节理论给出了一个非常重要的判断:AI 的宏观价值并不取决于它在少数任务上有多么出色,而取决于它能否在足够广泛的任务中达到可用水平。

如果 AI 能够在少数复杂任务上表现出极高能力,但其他大量任务仍然需要人类完成,那么整个经济体系仍然可能受到这些任务的约束。

相反,如果 AI 能够在医疗、教育、行政、制造、农业、物流和企业管理等领域,以中等质量完成大量实际任务,那么它可能带来更广泛的生产率增长。

Tonetti 将 AI 在不同任务上的能力差异称为不均匀智能(Jagged Intelligence)。AI 可能在某些任务上极其出色,但在另一些任务上仍然存在明显局限。

因此,决定宏观增长速度的并不是技术能力的最高点,而是整体生产体系中最薄弱的环节能否持续得到改善。

AI 未来可能带来多大程度的经济增长?

完全自动化是否意味着劳动收入份额必然归零?

Tonetti 在研究中考虑了三种长期自动化情景。

第一种情景是最终所有任务都由机器完成,人类不再承担任何生产任务。

第二种情景是机器承担的任务越来越多,但人类在任何时期都仍然承担一部分任务,只是这些任务的比例持续下降。

第三种情景是不完全自动化,即长期仍然有一些任务需要人类完成。

在历史趋势延续的基准情景中,三种情况在未来几十年里可能呈现非常相似的经济表现。

如果机器最终承担全部任务,资本收入份额可能逐渐上升到 100%。但如果人类始终保留一定任务,即使自动化持续推进,资本收入份额也可能长期保持相对稳定。

这说明,自动化程度提高并不必然意味着劳动收入份额会持续下降。

即使劳动收入份额下降,也需要区分收入份额和实际收入水平。劳动者最终消费的是收入水平,而不是收入份额。如果整个经济的总产出大幅提高,即使劳动者占总收入的比例下降,其实际收入仍然可能增加。

Tonetti 用一句很直接的话表达了这一点:人们消费的是收入水平,而不是收入份额。

基准情景下,AI 会带来多大的 GDP 增长?

在历史趋势延续的基准情景中,Tonetti 的模型显示,自动化会使经济增长速度逐渐提高,但在未来几十年内,这种提高仍然比较温和。

到 2070 年左右,模型中的年经济增长率可能达到约 2.6%。

到 2050 年,经济总产出相对于原有趋势的提高约为 4%。

这与部分科技行业人士所预测的短期内经济产出增长数倍甚至十倍,存在明显差异。

模型认为,原因在于弱环节的约束:即使部分 AI 任务的生产率迅速提高,整体经济仍然受到其他尚未自动化的任务限制。

Moore's Law Everywhere 情景是否可能产生指数级增长?

在更加乐观的情景中,假设整个经济体系的机器生产率都能够以计算机行业的速度增长,而且自动化任务扩张的速度也显著提高,那么经济增长可能出现完全不同的结果。

模型显示,这种情况下,增长率可能快速提高,甚至在特定参数条件下出现有限时间内产出趋于无穷大的数学奇点。

这类情景的机制是机器能够制造更好的机器,而更好的机器又进一步提高机器研发和生产效率,最终形成自我强化的增长循环。

但即使在这种极端假设下,模型也指出,短期产出的扩张仍然受到任务范围和弱环节的限制。

因此,是否能够出现奇点,与未来十年或二十年的现实生产率增长,并不是同一个问题。

我认为,这一模型最重要的价值不在于预测某一个具体增长率,而在于指出:如果 AI 能够广泛承担不同任务,并且这些任务之间的互补瓶颈得到解决,宏观经济增长才可能真正加速。

人工智能对劳动市场和经济安全意味着什么?

AI 自动化是否一定会造成劳动收入份额下降?

从第一次工业革命的历史来看,技术替代与新任务创造往往同时发生。

机器能够接管部分人类劳动,但经济活动扩张也会产生新的工作任务。劳动者最终的收入和福利,取决于这两种力量之间的相对变化,以及社会能否帮助劳动者完成职业转移。

Crafts 的研究指出,英国第一次工业革命并没有出现长期、大幅度的劳动收入份额下降。虽然部分职业受到严重冲击,但整体劳动市场同时出现了新职业和新的中产阶级职业群体。

这并不意味着 AI 不会造成失业,也不意味着所有劳动者都能够自然找到新的工作。

真正重要的是降低劳动力调整成本,包括教育、培训、职业转换、就业信息和社会保障。

为什么 AI 安全风险可能比短期就业冲击更加紧迫?

Tonetti 在讨论中还提出,弱环节理论不仅适用于经济增长,也适用于 AI 安全风险。

在正向增长方面,弱环节意味着必须让足够多的任务得到改善,才能显著提高整体产出。

但在负向风险方面,少数关键任务或系统受到破坏,就可能导致整个经济体系出现严重损失。

网络安全就是一个典型例子。

攻击者不需要成功攻击所有系统,只需要找到一个关键漏洞并成功利用,就可能造成巨大的经济影响。尤其是当一个软件供应商、金融服务机构或基础设施系统同时服务大量企业和个人时,它本身就可能成为整个社会的弱环节。

Susan Athey 在讨论中举例指出,美国曾经出现一次重大网络攻击,使约三分之一的美国人口在一个月内无法正常获得数字处方服务。

这一案例说明,如果一个关键服务被少数供应商集中提供,那么单点故障就可能影响大量下游用户。

人工智能可能降低网络攻击的技术门槛,让攻击者能够更快速地尝试大量不同方法。攻击者不需要像正规企业一样经过产品安全审查、组织重构和内部审批,只需要有一种攻击方式成功,就可能获得巨大收益。

网络安全还具有明显的外部性。单个企业可能没有足够动力承担全部安全投入,但其安全不足可能影响整个社会。

因此,不能只关注 AI 能否提高劳动生产率,还需要关注它能否被用于网络攻击、诈骗和关键基础设施破坏。

生物安全为什么也是重要问题?

除了网络安全,人工智能还可能降低部分生物技术活动的知识门槛。

讨论中提出了两个方向:AI 可能帮助恶意行为者学习如何实施危险的生物活动,也可能帮助他们进一步掌握相关物质和技术的制造过程。

这类风险与 AI 模型的开放程度、使用成本和扩散速度有关。

开放模型能够帮助发展中国家以更低成本获得高质量 AI 能力,但同时也可能让部分具有风险的技术能力更容易被恶意行为者获取。

因此,AI 开放性和安全性之间存在需要认真处理的权衡,不能简单地把所有监管都解释为市场保护,也不能忽略技术扩散带来的真实风险。

我认为应该如何理解 AI 作为通用目的技术的长期价值?

不能只问 AI 最终会产生什么影响,还要问不同影响会以什么速度发生

在 2026 年的学术讨论中,Susan Athey 提出了一个非常重要的分析方法:不要只问 AI 最终会发生什么,而要问不同影响分别会以什么速度发生。

有些变化可以很快完成,例如攻击者使用 AI 生成诈骗内容、自动化网络攻击,或者企业在已有软件系统中加入 AI 功能。

另一些变化则需要很长时间,例如大型企业重新设计组织结构、调整员工职责、替换生产设备、建立新的数据体系,以及重新配置跨部门工作流程。

这些变化即使具有很高的经济回报,也未必能够立即发生。

例如,一个受到政府保护、具有政治关联或存在市场准入壁垒的企业,不一定会因为出现了更有效率的 AI 工具就立刻改变经营方式。它可能有其他方式保护自己的市场地位。

员工也可能因为担心失去工作和收入而不愿意使用 AI。如果管理者没有让员工理解技术如何改善工作,也没有建立相应的激励机制,技术就可能无法顺利扩散。

因此,GPT 理论需要结合具体的微观经济事实、企业组织和制度环境,才能用于预测 AI 的经济影响。

为什么企业有时会理性地选择等待?

AI 能力和使用成本正在快速变化。

Christopher Tonetti 在讨论中指出,某个模型在上一年处于前沿水平时,可能具有较高的运行成本;到了下一年,同一个模型可能已经变得非常便宜。

因此,一个发展中国家或者企业可能会面临选择:现在使用昂贵的前沿模型,还是等待几个月,使用性能更好、价格更低、已经得到更多验证的模型。

对于企业来说,如果今天投入大量资金重构生产流程,但六个月后其他公司已经开发出更成熟的解决方案,那么提前投资的回报可能并不理想。

因此,等待并不一定意味着缺乏创新意识,有时反而是面对技术不确定性时的理性决策。

但这种等待也可能使整个经济体系延迟获得技术收益。

这再次说明,AI 的经济影响取决于技术性能、采用成本、企业组织和未来预期之间的共同作用。

为什么医疗服务中的弱环节特别值得关注?

Susan Athey 在讨论中提出了一个医疗案例。

假设 AI 已经能够准确识别患者的疾病,并为患者推荐正确的治疗方法,但患者所在的农村地区没有药品供应,或者缺乏能够执行治疗的医疗人员,那么 AI 的诊断能力就无法转化为实际健康收益。

在这种情况下,真正限制产出的并不是诊断技术,而是药品配送、医疗人员和服务基础设施。

因此,AI 提高某一环节的效率,并不意味着整个系统就会同步改善。

我认为,这也是弱环节理论最有价值的地方。它让我们从单项技术性能转向整个生产系统,关注哪些互补资源仍然稀缺,以及这些资源如何限制 AI 的实际经济收益。

AI 作为通用目的技术需要什么样的政策和制度环境?

政府应该如何成为 AI 发展的推动者?

世界银行 2026 年《世界发展报告:AI 的承诺》提出,政府可以从三个身份发挥作用:AI 的推动者、使用者和监管者。

作为推动者,政府需要建立 AI 广泛应用所需要的数字和非数字基础设施。

数字基础设施包括计算资源、数据资源、互联网连接和 AI 人才;非数字基础设施则包括稳定的电力供应、基础教育、职业技能、商业环境和制度能力。

这些基础条件需要协同建设,因为单独改善某一个领域,并不一定能够带来足够收益。

作为使用者,政府可以通过公共采购和公共服务应用,推动 AI 在医疗、教育、农业推广和司法等领域落地。

政府采购不仅能够帮助公共部门提高效率,还可以为本地 AI 企业创造真实需求,使它们有机会开发和适应本地化解决方案。

作为监管者,政府需要处理隐私、网络安全、AI 系统可靠性和市场集中等问题。对于市场机制无法有效解决的社会风险,可以通过现有法律、行业标准和国际合作建立相应的约束机制。

为什么竞争政策和市场结构也会影响 AI 的增长贡献?

Bresnahan 和 Trajtenberg 的研究提醒我们,GPT 的发展与市场结构密切相关。

如果基础技术提供者拥有很强的市场权力,它可能通过定价方式影响下游企业的创新激励。如果不同应用行业之间缺少合作机制,基础技术的公共收益也可能无法得到充分利用。

世界银行 2026 年的报告进一步指出,AI 价值链的不同层级,包括芯片、基础设施、模型和应用,集中在少数国家和少数公司手中。

这种集中会产生依赖风险。对于发展中国家而言,如果 AI 的关键投入全部依赖少数跨国企业,那么技术创造的经济收益可能有相当一部分通过模型服务、芯片和计算资源采购流向国外。

这意味着,AI 带来的生产率提高并不必然全部转化为本地收入和利润。

因此,我认为发展中国家需要在开放使用全球技术与建设本地适应能力之间寻找平衡,而不是简单追求建设自己的所有底层模型和基础设施。

世界银行也强调,建设前沿 AI 模型是最困难、成本最高的路径。对多数发展中国家而言,更现实的策略是先采用现有技术,再根据当地需求进行适应,最后在具备相应能力后推进更高层级的技术研发。

为什么必须降低劳动者的技术调整成本?

AI 的长期经济收益可能来自劳动生产率提高、任务重新分配和新产业发展,但这些变化并不会自动让每个人受益。

如果部分岗位被快速替代,而新的岗位和职业能力还没有形成,劳动者可能在相当长的时间内面临失业和收入下降。

因此,政策需要关注教育、职业培训、就业转换和社会保障,帮助劳动者从被自动化的任务转向新出现的任务。

从第一次工业革命的经验来看,新任务的形成能够抵消部分技术替代效应,但如果劳动力调整完全交给市场,调整成本可能非常高。

这也是为什么我认为,人工智能时代的政策重点不能只放在技术研发和企业采用率上,还需要关注技术收益在劳动者之间如何分配。

结论:人工智能的深层影响来自整个经济体系的重新设计

回顾蒸汽机、电力、半导体和信息通信技术的发展历史,我认为,通用目的技术的核心价值从来不只是提高某个产品或某个行业的效率,而是改变整个经济体系产生创新、组织生产和积累知识的方式。

Bresnahan 和 Trajtenberg 的研究说明,GPT 具有广泛渗透性、持续改进潜力和创新互补性。基础技术与应用行业之间的双向诱导,使得技术进步能够产生超出单项创新本身的经济收益。但由于纵向和横向外部性,市场机制可能造成创新不足、创新滞后和协调失败。

Crafts 的历史研究则说明,通用目的技术的宏观经济影响通常需要时间才能显现。蒸汽机、电动机和 ICT 的历史都表明,技术改进、组织重构、互补性投资和学习积累,是技术突破转化为生产率增长的重要条件。

第一次工业革命的深层意义,是形成了系统经验主义和知识传播机制;第二次工业革命通过工业研发实验室和应用科学改变了创新方式;第三次工业革命通过计算机和互联网大幅降低了知识获取和研发成本。

人工智能可能成为第四次工业革命的重要基础,但它是否能够真正发挥 GPT 的作用,还取决于能否形成足够广泛的应用,以及能否进一步成为一种提高研发和知识生产效率的新方法。

从宏观经济角度看,AI 的增长贡献可能通过三种渠道实现:提高单一行业生产率、扩大可用劳动供给,以及提高整个经济体系的知识生产和研发效率。其中,第三种渠道可能具有最深远的长期影响。

从发展中国家的角度看,AI 还有一个特殊机会:它可以补足长期稀缺的专业知识、医疗服务、教育能力和农业信息。通过低成本模型、语音服务、本地化应用和现有通信系统,AI 有机会以较低成本提高大量小型企业和个体劳动者的生产率。

但我认为,最终决定 AI 经济影响的,仍然不是某个模型能够达到多高的性能,而是整个经济体系能否解决那些限制生产率的弱环节。

如果只有少数行业获得了极高的 AI 能力,而其他行业仍然缺乏必要的人才、基础设施和组织能力,那么整体增长仍然会受到限制。

如果 AI 能够在广泛任务中提供足够可靠、足够低成本的能力,并且能够推动企业、政府和社会组织重新设计工作流程,那么它就有可能成为真正的通用目的技术。

我对 AI 长期经济价值的核心判断是:技术能力决定可能性,互补性创新决定扩散范围,组织和制度决定实现速度,而整个经济体系中的弱环节最终决定增长能够达到的高度。

#1 ·

自证认识导师:教 2 北办公

学术水平:非常善于包装自己,把自己实验室的能力说得天花乱坠,忽悠学生跟合作者,张口就来。当年在其实验室完成本科毕业论文,真的是觉得不是一般的水。白老师本人不会写代码,压根就不懂数据分析,只知道根据文献瞎猜,瞎指挥。听组里同学说,几年前就吹嘘课题组投了 3 篇 10 分以上的文章,现在几年过去了,还没有出来。做毕业论文的时候,只知道让学生干杂事,压根不指导学生做毕业论文,当时还忽悠我们在实验室读博。据了解,课题组到现在发的文章都是白老师自己做一作且通讯,而且没有超过 4 分的文章,大量灌水。

科研经费:白老师写本子很厉害,知道基金评审专家的喜好,当然也会找关系,疏通,经费充足。但是基本不让学生出去开会参加学术会议,记得课题组同学说过,白老师一般都是自己出去开会,回来之后在学生面前说今天认识某个大牛,跟某个大牛交流了很久。据说医院支付给学生的劳务费,白老师会事后要回去。

学生补助:国家最低标准呗,怕学校找麻烦。另外还有一点是看白老师心情。你完全按照她的意思来,就给的多,做的杂事多,就给的多。当然也有学生基本没拿到补助的,原因很简单,没顺她的意。

师生关系:组里同学都见惯了这个老师的虚伪。对学生文章的署名,一般都是白老师自己一作,而且署名顺序不会商量。讲真,她的实验室,她就是慈禧太后。当然白老师自认为对学生很好,跟学生关系很不错。

工作时间:每天 8 小时打卡,每周六天,杂活不记时间,必须随叫随到。

学生前途:压根不管学生前途问题。对钱非常苛刻,只关心项目进展,数据结果。

#1 ·
#2 anonymous :

真的假的

价值投资、时代与人生

AIGC 整理讲稿

根据 2019 年、2024 年北大讲座及现场问答整理,非本人原文

这些年来,我常常会碰到一个问题:价值投资的基本原理似乎并不复杂,讲来讲去,也就是那么几个概念。既然道理并不难懂,为什么真正能够长期按照价值投资的方法去实践的人,却始终只是很少的一部分?我自己做投资这么多年以后,越来越觉得,这其实就是“知”和“行”之间的距离。价值投资首先是一种思想方法,但它最终一定要落实到实践;而一旦进入实践,人性、环境、激励机制、市场波动、别人对你的看法,包括你自己对自己的认识,都会不断地来考验这些看起来非常简单的原则。所以真正难的地方,从来不是把几个概念背下来,而是在几十年的时间里,当环境不断变化、市场不断诱惑你、别人不断告诉你还有更聪明的办法时,你仍然能够按照自己真正理解的规律去行动。

我第一次真正系统接触价值投资,是三十多年前刚刚到美国以后。那个时候,我并没有想到自己后来会做投资这么多年,也没有想到这会变成影响我一生的一套思想方法。后来回过头来看,我越来越觉得,价值投资对我的意义远远超出了投资本身。它首先教会我如何理解一家企业,后来又逐渐逼着我去理解市场经济、理解制度、理解历史、理解人的心理,最后还必须不断地理解自己。投资表面上是在分配资本,实际上它是一场非常漫长的求知过程。你在这个过程中不断发现自己原来不知道什么,不断修正过去的错误,同时又逐渐建立起少量真正可靠的知识。对我来说,这可能才是价值投资最有意思的地方。

如果一定要把价值投资最基本的思想讲清楚,我一直认为其实只有四个最根本的概念。第一个概念是,股票本质上代表的是一家企业的所有权;第二个概念是,市场存在是为了给你服务,而不是为了指导你;第三个概念是,我们投资所面对的是未来,而未来本质上是不确定的,所以任何判断最终都只能是概率,正因为如此,我们必须要求安全边际;第四个概念是,投资人必须通过长期学习,逐渐建立属于自己的能力圈,并且只在能力圈范围之内行动。听起来,这四个概念并没有多复杂,甚至一个下午就可以解释清楚。但价值投资真正的全部困难,其实都藏在这四句话真正落实到现实生活之后发生的事情里面。

一、股票首先是一种所有权,而不是一个每天跳动的价格

很多人进入股票市场以后,第一个看到的是价格。今天涨了多少,明天跌了多少,市场怎么看,机构怎么看,分析师怎么看,新闻在说什么,这些东西非常容易占据一个人的全部注意力。但是价值投资的第一个要求,是在心理上把这个关系倒过来:你首先买的是企业,然后才是股票。如果你买了一家公司百分之一的股份,和你买了一家公司百分之百的股份,在经济本质上并没有根本区别。差别只在于你的所有权比例不同,而不是一种叫作“企业”,另一种叫作“股票”。

我自己早年真正开始投资以后,对这个问题有过一个很深的心理体验。当时我对生意其实还懂得非常少,最开始能够做的事情,不过是读财务报表,尤其是资产负债表。我会去看那些非常便宜的股票,看公司账上到底有多少现金、多少证券、多少房地产,看看它的净资产和市场价格之间到底是什么关系。有一些公司的市场价值甚至明显低于账面上可以相对可靠确认的资产价值。那个时候我对企业未来到底能够赚多少钱,往往并不十分清楚,但是因为价格足够低,我觉得至少有一层比较大的保护,所以敢于开始做一些投资。

真正有意思的变化发生在买完以后。当一家公司只是一个研究对象的时候,你和它之间的心理关系是一种关系;当你真正拿自己的钱买下它的一部分以后,这种关系会立刻发生变化。我第一次清楚地意识到:这家公司有一部分真的属于我。这个时候,你开始用一种所有者的心态重新看待所有信息。以前只是看一个数字,现在你会问这个数字是怎么来的;以前看到收入增长,也许就觉得不错,现在你会继续追问这个收入靠什么产生,它是不是可持续,客户为什么要买它的东西,竞争对手能不能把这个生意抢走,公司的资本为什么这样配置。你甚至会开始关心一个以前完全不会注意的问题:如果这个企业是我百分之百拥有,而且股票市场从今天开始十年不开门,我还愿不愿意继续持有它?

这种心理转换非常重要,因为一个人的屁股和脑袋在很大程度上确实是连在一起的。比如一个长期从事卖方研究的人,他的工作激励就是把一个观点卖出去,那么他自然会不断寻找支持自己观点的信息。如果你天天训练自己怎么把一个故事讲得更漂亮,最后最大的危险不是别人被你说服,而是你自己被自己说服。一个特别会“卖”观点的人,如果不能完成从销售者思维到所有者思维的转变,在投资上反而可能遇到很大的问题。真正成为所有者以后,你搜集信息的“天线”会发生变化,过去的知识仍然有用,但是知识之间的组织方式变了,因为你的目标不再是证明一个观点足够精彩,而是判断自己的钱放在这个企业里到底安不安全。

所以我始终认为,“股票是所有权”并不是一句抽象的金融学定义,它首先是一种很重要的心理训练。如果没有完成这个心理转换,后面所有的价值投资方法都很难真正建立起来。一个把股票当作交易代码的人和一个把股票当作企业所有权的人,即使看的是同一份年报,得到的信息也会非常不一样。前者更容易问下个月股价会不会涨,后者则会自然地问,这个企业十年以后会是什么样子。时间尺度一变,信息的意义也就变了。

二、投资和投机,看起来都在买卖股票,实际上是在玩两种完全不同的游戏

理解了所有权以后,第二个必须想清楚的问题,就是股票市场里面到底有哪些人在做什么。股票市场从诞生开始,其实一直混合着两种完全不同的行为。一种行为是在判断企业未来的经济表现,也就是说,公司以后能够赚多少钱,能够创造多少价值;另一种行为是在判断其他市场参与者短期内会怎么行动,也就是说,别人明天愿意出什么价格,过几个月情绪会不会更乐观,某个资金是不是要进来,下一批买家会不会愿意出更高的价钱。

前一种行为我叫投资,后一种行为本质上就是投机。投资人的研究对象主要是企业,投机人的研究对象主要是其他参与者。虽然两类人最后都可能通过股票买卖表现出来,但这两件事在经济学意义上的结果完全不同。一个企业如果处在能够长期累进增长的现代经济体系里面,它的利润可能持续增加,资本可能不断产生新的回报,所以企业所有者总体上是可以一起变得更加富有的。这是一种可以创造增量的游戏。但是如果你的盈利完全来自于预测另外一个人什么时候买、什么时候卖,那么你赚的钱最终就来自另一个市场参与者的损失。把所有这类行为加在一起,投机本质上就是一个零和的体系;再加上交易成本、管理费用、税收以后,整体甚至会进一步变成负和。

这并不是说投机者在任何一段时间都一定赚不到钱。完全不是这个意思。市场里面当然可能有人连续很多年做得非常好,也有人可能长期处在另一边。但是从整个体系看,如果一个行为并没有创造企业利润,没有增加企业经济价值,而只是参与者之间重新分配筹码,那么最终不可能所有人都靠这个方式获得持续的财富增长。这个道理其实非常简单,但现实中反而经常被各种复杂的名词遮住。有些理论看上去很高级,过去可能讲 K 线,后来讲各种量化模型,再后来可以讲人工智能,但你最后还是要问那个最基本的问题:这套方法赚的钱到底来自哪里?如果主要来自预测其他参与者的短期动作,那么不管包装得多么复杂,本质仍然属于同一类游戏。

这一点为什么重要?因为一个真正的价值投资人进入市场以后,会面对极大的心理压力。你的交易对手绝不是格雷厄姆寓言里一个看上去有点可笑的“市场先生”,现实中的交易对手可能比你学历高,比你有钱,比你有经验,比你职位高,甚至在很长一段时间里,他的业绩都比你好。如果你没有把投资和投机这两个游戏在逻辑上彻底区分开,你就会不断怀疑自己:是不是别人知道的东西比我多?是不是别人赚钱就是别人更正确?是不是我没有参与某一轮上涨,就说明我错过了时代?

一个投资人最容易犯的错误之一,就是不断地觉得自己在“错过”。别人赚了一笔钱,自己没有参与,心理上就开始不舒服。市场不断上涨的时候,原来你认为不属于自己能力圈的东西,也突然变得好像可以理解了;市场不断下跌的时候,原来你已经研究了很多年的企业,又突然变得好像什么都不确定了。归根到底,这是因为你并没有真正站稳自己所玩的游戏。如果你的回报来自企业长期创造价值,那么你的判断体系应该围绕企业建立;如果你的回报来自下一位买家的行为,那当然就要每天研究别人。但是你不能嘴上说自己是投资者,心里却一直在等待市场替自己证明。

三、“市场先生”的真正意义,是让市场给你报价,而不是让市场替你思考

格雷厄姆讲“市场先生”,本来就是为了帮助投资人建立这样一种独立性。你可以把市场想象成一个每天都来敲门的人,他非常勤快,而且精力旺盛,每天都愿意给你报一个价格。有的时候他特别乐观,认为未来什么问题都不存在,于是愿意用非常高的价格买下你手里的资产;另外一些时候,他又会突然非常悲观,觉得未来没有希望,于是愿意用很低的价格把他的资产卖给你。你没有义务每天跟他交易,更没有义务每天接受他的判断。绝大部分时间,你完全可以不理他,只有当他的报价真正变得对你有利的时候,你才需要利用他。

但是这个概念一旦从教室进入现实,难度立刻增加。学生在课堂里听“市场先生”,觉得这是一个非常自然的道理;进入金融市场以后,周围的人却都是真实而具体的,而且常常看起来比自己更加成功。领导可能告诉你,市场已经证明你错了;同事可能因为买了另一类股票而短期获得很好的回报;新闻媒体也会不断把价格变化解释成某种必然的基本面事实。你如果长期处在这种环境里,而自己又没有真正建立独立判断,很容易慢慢把市场价格当成了价值本身,最后从“市场为我服务”变成“市场每天在给我上课”。

所以一个价值投资人必须真正理解,价格和价值是两个概念。价格是某一个时点上市场参与者共同作用形成的结果,价值则是一个企业未来能够创造的经济结果经过合理判断以后得到的估计。我们当然不可能精确知道价值,但不能因为无法精确知道,就把价格当成价值。反过来,如果一家企业的基本面没有发生实质变化,而你只是因为股价下跌就立刻改变自己对它的看法,那通常说明你原来的判断很可能就没有真正独立存在过。

当然,独立绝不等于固执。市场价格有时候可能是在提醒你某些自己没有看到的事实,所以你永远应该去检查自己的逻辑。但是检查逻辑和服从价格完全是两回事。真正的独立性不是“别人说什么我都不听”,而是无论别人说什么,你最终都回到事实和逻辑本身。如果别人提出了你没有考虑过的事实,你就应该认真修改自己的判断;如果只是因为别人比你有地位、比你赚钱多、市场价格和你相反,你就放弃原来的研究,那么你的所谓能力圈就没有真正建立起来。

四、能力圈最关键的不是大小,而是边界

如果一个人不想做投机,而是真正希望通过研究企业的基本面来投资,那么下一步一定会遇到能力圈的问题。什么叫我真正理解一家企业?我怎样知道自己是真的懂,而不是只是觉得自己懂?这可能是投资里面最难的问题之一,因为世界上最危险的无知,不是你知道自己不知道,而是你以为自己已经知道。

我对能力圈的理解,首先不是“你知道多少”,而是“你能不能清楚地画出边界”。任何一个人的知识都是有限的,能力圈当然也一定有限。如果一个人说自己什么行业都懂,什么生意都可以判断,那他大概率其实没有真正理解能力圈。真正的知识一定包含一个条件:你不仅要知道在什么情况下自己的判断成立,还要知道在什么情况下它会失败;不仅要知道为什么这个企业可能很好,还要知道什么事情出现以后,会证明你原来的理解是错误的。

我们做投资,本质上要对企业未来相当长时间的经济表现做判断。那什么才算比较接近“懂”?至少你应该能够回答很多基本问题:这个企业到底靠什么赚钱?客户为什么愿意购买它的产品?竞争对手为什么没有把它的利润抢走?这个行业的基本竞争规则是什么?资本在这里是怎么配置的?管理层到底起到多大作用?十年以后这个企业可能变成什么样?尤其重要的是,你能不能想清楚十年以后它最坏可能是什么样。如果我无法对一家公司的长期下行风险形成比较可靠的判断,我通常就不会轻易说自己真正懂这家公司。

很多人喜欢研究最好的情况,因为最好情况容易让人兴奋。但是投资首先是一个关于风险控制的活动。好的企业有时候会自己照顾好最好的一面,真正危险的是你没有看清最坏的一面。所以能力圈并不是一个鼓励自信的概念,恰恰相反,它首先要求谦卑。你知道得越多,往往越清楚世界上还有多少东西说不清楚。到最后你会发现,绝大多数企业其实你都没有办法真正预测,绝大多数技术变化也很难长期预测,很多今天看起来非常优秀的公司,其竞争优势并没有强到足以跨越很长时间。

我很喜欢芒格讲过的一个标准:如果我要拥有一个观点,我必须首先能够找到最聪明的反对者,并且能够把他的论证讲得足够好,甚至比他本人讲得还好,然后我才有资格真正拥有自己的观点。这个标准的实质就是知识上的诚实。你必须主动去寻找最强的反方,而不是只寻找支持自己的证据。人在心理上天然具有确认偏误,一旦喜欢上一家公司,就会自动多看好消息,少看坏消息;一旦买了股票,更容易把所有信息重新解释成有利于自己的故事。所以能力圈最终不只是知识问题,也是一种人格上的训练。

五、投资真正重要的不是懂得多,而是你真正懂的那一点不能错

世界上的上市公司非常多,如果把全球主要市场加在一起,大概有数以万计甚至十万量级的公司。一个投资人如果把目标设定为“我要全部了解”,从一开始方向就错了。你根本不需要了解所有企业。事实上,一个投资人一生真正需要做出的重大判断非常有限,在任何一个时期,真正值得你深入研究并且可能实际行动的企业,也许只有几家或者十几家。

因此,投资最重要的工作之一其实是做减法。这个行业我看不懂,可以放弃;那个技术变化太快,无法可靠预测,可以放弃;另外一家企业虽然很优秀,但是价格已经没有安全边际,也可以等待。一个投资人完全不需要因为错过了不属于自己的机会而焦虑。真正需要担心的是,当一个明确落在你能力圈里的机会出现时,你有没有把它搞错。

很多人进入投资行业以后会产生一种错误的竞争意识,好像知道得越多就越厉害。其实投资回报并不是知识竞赛。真正赚钱并不要求你在所有领域都比别人聪明,而是要求你在少数真正重要的判断上正确。如果一件事情已经超出了你的能力范围,不做判断往往就是最好的判断;如果一家公司变化太快,以至于十年以后几乎无法想象,那么无论这个故事今天有多吸引人,它也未必是适合你的投资对象。

这也是为什么我越来越愿意把时间集中到那些相对更加可预测的行业和企业里。时间越长,行业本身的基本特征往往比短期的管理技巧更重要。某些行业天然容易形成稳定竞争格局,某些行业则注定长期处在非常激烈的竞争里。比如餐馆,任何一个时期都可能有一批非常成功的餐馆,甚至在某个菜系里做到最好,但是过几年以后名单可能完全变了。这说明“今天很好”和“长期可预测”不是同一个概念。真正值得花大量时间研究的,是那些我们有可能在很长时间里理解其竞争规则,而且企业本身又确实长期显著优于同行的公司。

如果一家企业能够长期以远高于竞争者的资本回报率经营,同时竞争优势又能够维持,那么这个企业就开始变得非常有意思。这个时候,你的任务就不是每年重新找一个新的故事,而是理解为什么这种优势存在,它靠什么保护,这种优势有没有可能继续。一个优秀企业真正的价值,不只是它今天赚了多少钱,而是它能不能长期把资本以较高的回报率继续投入。只要这一点能够持续,时间就会开始变成你的朋友。

六、安全边际不是保守,而是承认我们永远无法准确预测未来

价值投资里面一个非常重要的概念是安全边际。为什么要有安全边际?因为我们的知识永远有限,而我们投资的又恰恰是未来。无论你研究得多深入,都不可能把未来所有变量算清楚。宏观经济会变化,竞争者会变化,技术会变化,管理层会变化,消费者也会变化。面对这种现实,投资人如果还要求自己做出精确预测,最后往往得到的就是精确的错误。

我早年有些投资,就是因为安全边际足够大,所以即使当时对企业本身理解得还非常有限,也敢于采取行动。有的公司账上实际拥有的资产价值明显高于当时整个公司的市场价值。在这种情况下,我甚至不需要对十年后的盈利能力有非常精确的判断,只要确认这些资产确实存在,企业本身并没有马上要毁掉的重大问题,价格本身就给了我很大保护。后来其中有些投资涨了很多倍,但实际上那并不说明我一开始就准确预测了所有事情,很多时候只是因为买得足够便宜,结果比原本能够合理期待的还要好。

安全边际真正告诉我们的,是要尊重自己的无知。你对未来越没有把握,价格就越需要给你保护;如果价格不能给你保护,你就必须对企业本身有非常高的确定性。当然,这两种确定性并不是完全割裂的。投资人早期可能更容易从资产价格的明显低估中寻找安全边际,随着对企业理解越来越深入,也会逐渐认识到,一个极其优秀、长期能够高回报再投资的企业,本身也可以创造另外一种安全边际,因为时间和企业的复利能力会不断替所有者工作。

但是无论哪一种情况,核心原则都一样:你必须为错误留出空间。投资永远不是证明自己聪明,而是在大量不确定中尽量避免永久性资本损失。我们真正应该追求的不是“任何情况下都不会错”,而是“即使某些判断错了,结果仍然能够承受”。这也是价值投资为什么可以长期生存的一个根本原因。

七、企业的护城河不能只看一个标签,真正重要的是竞争优势为什么可以持续

很多人研究企业的时候,很喜欢问一个标准化的问题:护城河到底是什么?是品牌,是管理层,是商业模式,是网络效应,还是成本优势?我越来越觉得,这个问题不能离开具体企业来抽象回答。每个行业的竞争优势来源都不同,而且不同时间尺度下,决定企业表现的因素也不一样。

如果你的时间尺度比较短,人当然非常重要。一家企业在创业早期、行业高速发展期,创始人和核心管理团队可能对企业价值产生极大的影响。优秀的企业家可以做出连续正确的决策,也可以吸引优秀人才,在不确定环境里不断改变组织。但是时间尺度越长,行业本身的结构往往越重要。一个再优秀的人,如果长期处在极差的商业环境、极差的行业结构里,也很难产生长期非常优秀的经济结果;反过来,有些企业即使管理者未必极其特殊,因为行业本身的条件很好,也可以获得相当不错的回报。

所以我不太愿意把护城河简单归纳为几个词。真正应该研究的是,为什么这家企业在竞争中能够长期获得高于同行的经济回报,而这个原因为什么没有被竞争者复制和消灭。品牌只有在能够转化为定价能力、客户忠诚或者更低获客成本的时候才有经济意义;规模只有在能够带来成本优势或者网络优势的时候才有价值;优秀管理层只有在他的能力可以真正转化为企业长期竞争优势时才重要。最后所有这些分析都必须落到一个非常具体的问题上:这种超额回报能够维持多久?

这也是为什么研究企业不能只研究财务报表。你必须了解管理层,也必须了解行业基本规则,还要了解竞争者、客户、供应商、资本需求、技术变化以及整个产业链上的经济关系。真正建立一个企业的能力圈,需要的信息非常多,而且最后你仍然可能得出一个结论:这个企业就是无法判断。接受这个结论很重要。投资里面一个非常大的进步,往往不是你增加了多少“可以买”的公司,而是你能够更加快速、更加有信心地把大量公司排除在自己的范围之外。

八、一个真正适合做价值投资的人,需要一种非常特殊的“品性”

巴菲特和芒格经常讲,投资成功最重要的并不是智商,而是 temperament。我一直觉得这个词中文很难完全准确地翻译,我自己更愿意叫它“品性”。这里面既有一些天生的性格,也有大量后天可以训练的东西。为什么投资需要这种特殊的品性?因为投资的工作环境和人的天性其实存在很大的冲突。

第一是独立性。你需要能够接受别人长时间不同意你。市场可能和你不同意,媒体不同意你,同事不同意你,客户甚至也不同意你。如果你的心理稳定必须建立在别人认同上,那么在市场里会非常困难。但这里再次要强调,独立不等于固执。独立是你最后服从事实和逻辑,而不是服从社会压力。如果事实改变了,你应该立刻改变;如果只是价格和情绪改变,而事实没有改变,你就不应该轻易被带走。

第二是耐心,而且是一种常人很难适应的耐心。真正好的机会很少。有些优秀投资人可以连续看一个领域几十年,在三十多年里面可能才真正遇到一次值得重仓行动的机会,之后又很多年没有第二次。但是他仍然会继续看、继续研究。机会不来的时候,完全可以什么都不做。这种状态对很多人其实非常难,因为金融行业的文化通常在奖励行动,每天都有人告诉你必须做点什么,必须产生交易,必须有观点。但真正的投资并不按照这种节奏发生。

第三是机会真正出现以后敢于行动。很多人能够长期观察,也能够讲出很多正确道理,但到了真正便宜、市场极度恐慌的时候,却没有办法把研究转化为行动。优秀投资人的品性非常特殊:在绝大部分时间里可以极其克制,在真正的机会出现时又可以突然变得非常果断。这两种特性看上去甚至有些矛盾,但投资真正需要的恰恰就是这种组合。你不能因为“长期主义”而永远不行动,也不能因为“果断”而每天交易。

第四是对商业有一种近乎本能的兴趣。有人把它叫 money sense,我觉得更准确地讲,就是你看到一个生意以后会自然地想知道,它到底怎么赚钱,为什么赚这个钱,为什么客户愿意买,为什么竞争对手没有把利润抢走。有这种兴趣的人不需要别人每天督促他研究,因为研究本身对他就有吸引力。没有这种兴趣,仅仅因为觉得投资行业收入比较高而进入,通常很难坚持几十年。你会发现,真正优秀的方向往往是兴趣和能力能够互相强化的地方。

九、知识上的诚实,比聪明更加稀缺

这些年我观察过很多很聪明的人,也见过很多人在投资上最后并不成功。聪明当然不是坏事,但聪明有一个很大的危险,就是一个人越聪明,越有能力为自己的错误制造出非常复杂的解释。真正难得的是知识上的诚实,也就是 intellectual honesty。

什么叫知识上的诚实?就是你愿不愿意不断问自己:我到底知道什么?我不知道什么?这个结论到底来自事实,还是来自我希望它是真的?如果明天出现什么事实,我会承认自己原来的判断错了?如果我无法回答这些问题,我其实还没有真正拥有这个观点。真正的研究不是证明自己对,而是尽可能快地发现自己可能错在哪里。

人在天生的心理结构上并不是为客观理性设计的。我们的大脑首先是自然选择的结果,它最重要的功能是帮助我们生存,而不是帮助我们在现代资本市场里做完全理性的概率判断。所以我们带着大量天然的心理倾向进入现代社会,会产生很多结构性的盲点。确认偏误、从众心理、损失厌恶、权威影响、自我服务偏误,这些东西并不会因为一个人学历高就自动消失。有时候,知识更多反而会让这些偏误变得更精巧,因为你拥有了更复杂的语言来合理化它们。

这就是为什么价值投资最终是一种持续的自我训练。你不仅是在研究企业,还要不断观察自己做判断的方式。为什么我突然喜欢上这个公司?是不是因为股价最近涨了?为什么我突然认为原来的风险没那么大?是不是因为我已经买进去了?为什么我对一个反方意见特别反感?是不是因为它触碰到了我已经投入很多时间和金钱的观点?这些问题如果长期认真问,慢慢会变成一种习惯。这个习惯不仅对投资有用,对一个人的一生都很重要。

十、学习没有神奇捷径,真正可靠的方法仍然是兴趣、科学方法和长期积累

有人会问,怎样学习才能形成所谓知识的复利?我自己的体会其实并没有什么特别神秘的方法。一个真正有用的知识,首先应该能够在相当程度上被事实和逻辑支持;其次,它应该具有比较强的解释力,能够帮助我们理解一些现实问题;最后,它最好还具备某种预测能力。按照这个标准,人类到目前为止最可靠的一类知识当然是科学知识。

但是投资有一个特殊问题:我们研究的大多数事情都和人有关。只要和人有关,结果通常就不会像物理实验一样给你一个高度确定的答案,而更多表现为一个概率分布。所以我一直觉得,统计思维在现实世界里非常重要。我们当然仍然应该使用科学方法,但是必须接受,最后很多时候只能得到一个“模糊的正确”,而不是一个“精确的答案”。投资里面最危险的一种幻觉,就是用大量数字制造出一种虚假的确定性。模型可以算到小数点后很多位,并不代表现实真的有那么精确。

所以在学习过程中,宁可接受模糊的正确,也不要沉迷于精确的错误。你应该不断寻找有解释力、有预测能力、能够被现实反复检验的知识,并且把这些知识慢慢连接起来。最开始的时候这种积累看不出太大效果,但是时间长了以后,不同学科、不同企业、不同时期得到的经验会开始互相印证,这时知识就真正产生复利。

另外一个非常重要的东西就是兴趣。一个人如果真正对一个问题有兴趣,他会在别人停止的时候继续往下想,在别人已经接受一个答案的时候再问一个“为什么”。这种差别一天两天看不出来,十年、二十年以后就会非常大。最容易形成长期竞争优势的地方,通常不是你被迫学习得最多的领域,而是你有兴趣到停不下来的领域。因为别人工作结束了,你仍然觉得这件事本身有意思,于是你自然积累得更深。

所以如果一定要让我总结学习方法,我还是会说:让兴趣引导你,用科学的方法检验你得到的认识,然后用知识上的诚实不断修正错误,一点一点积累。这个过程很慢,也没有任何捷径,但是到目前为止,这是我看到唯一真正可靠的方法。

十一、不要试图寻找一种统一的“优秀企业家人格”

投资人经常会问,我最看重企业家的什么品质。做商业和投资这么多年,我见过形形色色的企业家,最后反而越来越不愿意用一种标准人格去判断谁一定能够成功。市场经济最有意思的一个地方,就是它允许非常不同的人找到适合自己的位置。一个在普通社会环境里看上去很特别,甚至不太容易相处的人,在某一个商业环境里可能恰恰能够把自己的特殊能力发挥到极致。

所以我不会先建立一个所谓“伟大企业家的标准画像”,然后去市场里找符合这个画像的人。真正应该做的是从企业本身出发,研究为什么这个人能够建立出这样的组织,他的特点在这个组织里到底发挥了什么作用,他的缺点是不是被其他人或者制度弥补了。有的企业家并不喜欢管细节,却特别擅长找到优秀的人;有的人组织能力一般,但是对产品有极端敏锐的感觉;有人对成本极其敏感,有人擅长长期资本配置。不同企业所需要的能力组合完全不同。

这也是为什么企业分析必须具体情况具体分析。你不能因为一个企业家看上去符合某种传统意义上的“优秀人格”,就认为企业一定优秀;也不能因为一个人看上去不符合普通人的成功模板,就过早否定他。市场经济本身就是一个非常强大的筛选机制,它会让很多异质的人在不同领域寻找自己的 niche。作为投资人,我们真正要判断的,仍然是这种人与组织的组合能不能长期创造经济价值。

十二、普通投资者真正需要避免的,首先是被市场诱惑

并不是所有人都应该成为职业投资人。事实上,真正建立能力圈、长期研究企业,是一个需要大量时间和兴趣的工作。如果一个普通投资者不愿意花这么多时间,那么完全没有必要勉强自己做专业投资人的工作。对大多数人来说,更重要的可能是用一种可靠的方法保护并长期增加自己的财富。

如果一个经济体已经进入了可以持续累进增长的现代经济阶段,而且一个指数能够比较充分地代表这个经济体中主要企业的长期表现,那么长期指数投资本身就是一个很合理的选择。因为从整体上看,投机者的净结果最终彼此抵消,而指数长期获取的主要就是企业总体经济增长的结果。当然,这个结论有前提,就是经济体本身能够长期创造增长,而且指数具有足够代表性。

另外一种选择,是把资金交给真正优秀的投资人。但是选择优秀投资人本身并不容易。首先要判断他到底是投资者还是投机者;其次要看他有没有真正适合投资的品性;第三要看他是否在自己专业领域形成了深度,而且这种能力有没有经过足够长时间的实际业绩检验;还要看他的能力圈是否真实,以及他的激励机制是不是和投资人一致。真正长期而可验证的 track record 很重要,因为一个人讲一套非常漂亮的投资理论很容易,几十年把一套方法持续做出来要难得多。

普通投资者最应该避免的事情,往往是市场越热越想进去,市场越冷越想出来。人的天性在这方面几乎天然和正确的投资行为相反。价格上涨以后,我们觉得安全;价格暴跌以后,我们觉得危险。但如果企业本身的价值没有以同样的幅度变化,这种感觉恰恰可能把一个人带到最坏的交易位置。所以无论是指数投资,还是把钱交给真正可靠的专业投资人,最重要的一件事都是不要反复被市场情绪牵着走。

十三、价值投资不能脱离时代,但也不能退化成宏观预测

到了最近这些年,我对价值投资和时代之间的关系思考得越来越多。价值投资从方法上讲当然是自下而上的,我们从企业基本面开始。但是企业从来不生活在真空里。它必然存在于一个具体国家、一个具体制度、一个具体时代和具体的国际环境中,资本、技术、市场、贸易关系、社会治理和消费者信心的变化,最后都会以不同方式影响企业。

因此,当时代发生非常大的结构变化时,价值投资人不可能完全装作没有看到。过去几年,无论是中国内部的经济调整,还是全球政治经济环境,都出现了很多让人困惑的变化。就业、企业家信心、房地产、资本市场、消费、需求,以及主要国家之间的关系变化,都会让人自然地产生一个问题:我们过去理解的那些长期规律是不是还有效?企业未来还能够像过去一样创造价值吗?

要回答这些问题,我觉得必须把时间尺度再放长一些。过去几百年真正改变人类社会的一个根本现象,是现代科技和市场经济结合以后,经济开始出现持续的、累进的增长。在农业文明时代,一个社会最核心的经济资源是土地和人口,因为财富生产有非常明确的物理上限。在这样的世界里,一个群体获得更多财富,往往意味着另外一个群体失去土地和资源,所以长期的国际关系天然带有非常强烈的零和性质。

但是进入现代科技文明以后,情况发生了变化。经济增长越来越依赖知识、技术、资本、商品和服务之间的充分交换。商品与商品之间的交易可能形成一加一大于二,知识和思想之间的交流有时候甚至可能产生更大的增量。这个时候,一个社会真正重要的经济边界不再只是土地有多大,而是市场有多大,资本能不能流动,技术能不能交流,生产要素能不能以相对有效的方式配置。

从这个角度看,所谓现代化,不仅仅是造出了多少工厂或者拥有多少基础设施,而是整个经济系统是不是进入了一种可以持续产生福利增长的状态。如果技术进步和市场机制能够不断产生新的生产力,一个企业就有机会长期扩大价值,这也是价值投资能够长期成立的宏观基础。

十四、中国今天的困难,需要放到“工业起飞之后的转型”中理解

中国在过去四十多年经历了非常快速的经济变化。这种变化当然是历史性的,但是如果放到近代世界史里面看,一个后发国家完成最初工业化追赶时,三四十年的高速变化并不是完全没有先例。德国、日本、美国以及很多其他经济体,在不同历史时期都经历过非常快速的工业起飞。真正困难的地方往往出现在最初起飞完成以后,因为经济结构已经发生巨大变化,但社会治理、人的观念、制度安排和社会心理不会以同样的速度自动调整。

这个时候就会出现一个结构性落差。经济已经进入新的阶段,人们仍然可能沿用过去形成的很多观念;生产能力已经很强,但是需求结构、资本配置、社会保障、居民消费、企业信心未必同步完成转型;社会创造了大量储蓄,但这些储蓄是否能够真正有效转化为长期生产资本,又取决于金融体系和资本市场的成熟程度。很多所谓的“中等收入阶段问题”,其实都和这种转型有关。

所以对于今天中国遇到的困难,我认为既不能轻视,也没有必要把它理解为历史上完全不存在、无法理解的问题。一个价值投资人要尽可能把时间尺度拉长,既看到现实中的具体约束,也看到更长期的结构性力量。短期极度悲观和短期极度乐观,本质上都是一种容易被当下情绪绑架的状态。真正重要的是分析哪些问题是周期性的,哪些是结构性的,哪些制度安排正在发生变化,以及这些变化最后会怎样传导到具体企业。

这也是为什么宏观环境虽然重要,价值投资仍然必须回到企业。你很难准确预测十年以后所有国际关系,也很难预测每一项政策的精确路径。你真正能够做的是寻找那些在相当广泛的情形下仍然可以生存、适应和创造价值的企业,并且对那些自己无法预测的部分留出足够安全边际。如果一个投资最后完全建立在你精确预测某一次宏观事件之上,那实际上你已经把自己的成功建立在一个非常脆弱的条件上。

十五、现代资本市场真正提供的不只是钱,而是一套信用体系

我们今天谈资本市场,经常把它简单理解成融资工具,好像资本市场最大的功能只是给企业提供钱。但银行也可以提供钱,所以如果资本市场只有融资这一个功能,它的重要性就很难真正解释。现代资本市场更深层的功能,是建立一套能够把社会储蓄持续转化为生产资本的信用体系。

在这套体系里,企业家要有企业家的信用,投资人要有投资人的信用,连接储蓄者和投资者之间的各种中介机构也要有自己的信誉。一个普通储蓄者可能完全不懂某一家具体企业,但他可以通过一系列可信的制度安排,把自己很小的一部分储蓄投入到一个自己从未见过的企业里。无数小额储蓄汇集以后,形成巨大的资本力量,然后投入真正能够创造生产力的企业,企业创造利润以后,这些利润又重新回到资本所有者手里。整个过程之所以能够运转,关键不只是钱,而是信用。

这也是为什么我认为市场经济和价值投资之间存在非常深的关系。价值投资不是一个人在赌场里想办法从另外一个人手中拿走更多筹码,而是在一个有效市场经济体系里,把资本配置给真正能够创造价值的企业。如果你的判断是正确的,企业家得到了资本,企业发展了,员工和客户获得了价值,投资人也获得了回报,这本质上可以是一种多赢。

从这个意义上讲,投资人的信用本身就是一种非常重要的资产。一个投资机构如果不断改变自己的规则,只追逐短期流行的产品,最后连自己的真实长期业绩都说不清,那么投资人很难真正判断他到底创造了什么。长期资本真正需要的,是可验证的历史,是一致的行为,是在不同市场环境下仍然能够看出一个人到底按照什么原则行动。信用和知识一样,需要几十年积累,却可以在很短时间里毁掉。

十六、全球价值投资真正要解决的,是如何在变化的时代中寻找不变的经济规律

今天做全球价值投资,当然比过去面对更多复杂因素。不同国家之间的关系、贸易体系、技术管制、资本流动、产业链重构,都会影响企业价值。因此所谓“全球价值投资”,绝不意味着看到任何国家的便宜股票就可以买。你必须把政治、制度和社会环境看成企业基本面的组成部分,而不是一个完全独立的宏观话题。

但这并不意味着投资人应该把自己变成国际政治预测家。恰恰相反,价值投资真正重要的地方,是明确哪些事情无法预测。世界永远会出现意外,国际秩序也会不断变化。一个价值投资人的任务不是准确预测每一场风暴,而是尽量拥有那些能够穿越相当多风暴的资产,同时确保买入价格给自己留下足够空间。

所以做全球投资的时候,我仍然会回到那些最基本的问题:这个企业创造的产品或者服务是否真正有价值?它在竞争中的位置是什么?资本回报如何?这种回报来自什么?企业文化和治理是否可靠?所在国家的制度是否能够保护财产权和正常商业活动?资本是否能够正常进出?企业是否过度依赖某一种自己无法判断的政治条件?只有把这些问题一层一层弄清楚,所谓时代分析才真正落到了价值投资上。

十七、投资最终是一场不断“熵减”的求知过程

做投资这么多年以后,我越来越觉得,投资真正吸引我的,并不只是资本回报本身。世界上赚钱的方法很多,真正让我觉得这件事值得做一辈子的原因,是它迫使一个人不断追求真知。

现实的物理世界很多过程是熵增的,但是人有一个非常特殊的地方,就是我们可以通过学习不断增加有序的知识。一个人可以从完全无知开始,通过学习逐渐理解越来越多的规律;可以通过修养不断改变自己的品性;可以因为理解了一个新的科学原理而创造过去完全不存在的产品;也可以因为看懂了一家企业真正创造价值的方式,把资本配置给它,从而帮助一种新的生产力成长。

回过头来看,过去几十年里很多改变世界的东西,最初不过是少数人掌握的一点“小小的真知”。计算机、互联网、通信技术,最底层看起来都不过是一些非常基础的科学和工程原理,但是这些知识被不断组合以后,可以让整个世界发生不可想象的变化。投资人如果能够真正理解这些创造价值的过程,然后把资本配置到正确的方向,他得到的不只是自己的财富增长,也参与了社会生产力增加的过程。

所以我越来越觉得,价值投资真正的“正道”,本质上也是一种熵减的旅程。你不断减少自己的无知,不断修正自己的偏见,不断建立更加可靠的知识,同时把自己积累的资本配置给真正能够创造价值的人和企业。这个过程如果做对了,它可以是多赢的:企业获得资本,社会获得产品和服务,投资者获得长期回报,而你自己也因为这个过程变成一个比过去更加理性、更加诚实、知识更加丰富的人。

十八、真正属于一个投资人的机会,一生不会太多

投资时间越长,我越相信真正属于一个人的机会其实非常有限。金融市场每天都有无数价格变化,每一年都有新的热门行业、新的技术、新的叙事,但是大部分东西与你没有关系。你不需要抓住全部机会,也根本不可能抓住全部机会。

真正重要的是,你有没有逐渐形成一个真实的能力圈,并且在这个圈里保持长期观察。当机会没有出现的时候,你就读书、研究、思考,可以什么都不做;当一个企业真正进入你的能力圈,而且价格又给了足够安全边际的时候,你必须有能力识别它;而当这种极少数机会真正出现时,你又必须有足够的定力采取行动。

所以价值投资最后形成了一种非常不同的生活节奏。大部分时间很平淡,没有那么多戏剧性的变化。你每天做的事情是阅读,是观察,是和人交流,是修改自己的思维模型。也许很多年都没有一笔真正改变结果的投资。但是复利的特点本来就是这样:真正重要的结果常常来自少数几件事情,然后在很长时间里持续积累。

从这个意义上说,一个投资人不应该害怕无聊。很多时候,无聊本身就是正确状态。真正危险的反而是你每天都觉得必须做点事情,必须有一个新观点,必须证明自己一直在工作。市场不会因为你很勤奋地交易就奖励你,市场最终奖励的是正确判断和正确价格。

十九、知行合一,最终还是回到认识自己

价值投资讲到最后,其实越来越像一个关于人的问题。为什么同样的道理,有些人可以坚持,有些人不能?为什么同样研究一家公司,有些人可以在价格下跌时保持客观,有些人会陷入恐慌?为什么有人可以等待十年,有人十天不交易就很难受?这些区别最后都和一个人的兴趣、性格、知识结构、心理习惯以及价值观有关。

所以不是每一个人都一定适合做专业价值投资。一个人真正最容易成功的方向,往往是兴趣和能力能够结合的方向。如果你的兴趣根本不在商业和投资,完全没有必要因为听说某个行业挣钱多就强迫自己进入。这个世界永远有人赚得比你多,如果人生方向只由别人赚多少钱来决定,你会不停地改变自己,最后什么事情都很难做深。

如果一个人确实对商业有兴趣,也具备比较强的独立性,能够长期学习,愿意承认错误,能够忍受等待,而且在真正有把握的时候能够行动,那么价值投资可能是一个非常适合他的方向。但即使如此,这仍然是一个几十年的学习过程。能力圈不是一天建立起来的,品性也不是听完一场课就获得的。很多东西必须通过真实的投资、真实的错误、真实的市场波动,一点一点训练出来。

我自己到今天也仍然在这个过程中。做了这么多年投资,并不意味着我对所有问题都有答案,反而会越来越清楚自己的知识有多么有限。但也正因为如此,我越来越喜欢这件事情。因为每过几年回头看,你会发现自己真正学会了一些过去完全不知道的东西,过去一些模糊的认识慢慢变得清楚,一些曾经非常自信的判断又被证明其实并没有那么可靠。这种不断修正、不断积累的过程,本身就是投资最大的价值之一。

二十、结语:把时间留给真正值得复利的东西

如果让我今天重新总结价值投资,我仍然不会增加很多新的原则。股票代表企业所有权,市场为你服务而不是指导你,未来只能用概率来理解,因此必须保留安全边际;同时,一个人要用长期学习建立能力圈,并且只在真正理解的范围之内投资。这些原则过去有效,我相信以后也仍然会有意义。

真正改变的,是随着经验增加,你会越来越理解这些简单原则背后的分量。你会明白“股票是所有权”并不是一句定义,而是一种心理位置的改变;“市场先生”不是一句幽默的比喻,而是一个人能否保持独立性的考验;“安全边际”不是保守,而是承认人类知识有边界;“能力圈”不是炫耀你懂多少,而是清楚知道自己不知道什么;“品性”也不是一个漂亮的道德词汇,而是在几十年市场波动里,你到底能不能按照事实和逻辑生活。

时代当然会变化,而且有些时候变化得非常剧烈。但是从一个价值投资人的角度看,我们最需要做的,不是每天预测所有变化,而是不断寻找那些在变化之中仍然成立的经济规律。技术可以变化,行业可以变化,国际环境也可以变化,但长期创造价值、有效配置资本、保护财产权、建立信用、鼓励知识和生产要素充分交换,这些因素仍然决定着一个经济体和企业能不能持续发展。

最后,一个人真正能够形成复利的东西其实并不多。知识可以复利,信用可以复利,好的品性可以复利,优秀企业的资本回报也可以复利。真正值得做的事情,是把时间和精力放到这些能够长期积累的东西上,而不是每天被短期价格和情绪带走。

对我来说,价值投资最终已经不仅是一套投资方法。它更像是一种认识世界的方法,也是一种认识自己的方法。它要求你尊重事实,尊重概率,尊重常识,也尊重自己的无知;它要求你长期学习,又要求你接受大部分时间什么都不用做;它要求你有自己的判断,同时又随时准备在新事实出现时承认自己错了。

如果一个人能够把这些事情真正做一辈子,我想,即使最后没有成为一个职业投资人,他得到的也不会只是怎样买股票。因为追求真知本身可以改变生活,长期积累本身可以改变命运,而一个越来越理性、越来越诚实、越来越了解自己边界的人,无论最终从事什么职业,大概率都会拥有一个更加完整的人生。

#1 ·
#3 anonymous :

举个例子,在农业文明时代,财富就是土地和人口。那么,今天土地还是不是财
富?回顾整个世界历史,尤其是在欧洲,封建体系持续了数百上千年,很多国家的封建制
度都因革命而瓦解了,除了一个例外——英国。这几百年来,英国没有发生大的革命,许
多原本拥有土地的贵族至今还保留着很多土地和宏伟的城堡
。在过去,他们是最富有的人。
然而,今天这些贵族还富有吗?答案是否定的。大多数仅拥有土地和城堡的贵族已经不再
富有,甚至变得相对贫穷。只有少数贵族依然富裕,是因为他们有其他投资,而不是仅仅
依赖原有的土地和城堡。
为什么会这样?因为维持土地和城堡需要大量人力。一个大型城堡动辄需要几十甚
至上百的佣人来维持运转。然而,过去几百年间,人的价值发生了巨大的变化,导致今天
的贵族已无法负担如此多的佣人。同样地,土地也需要雇人耕作,人的价值增加了,土地
本身的产出增加相对比较少,乡间房子价值的增加也很少,维修成本反而很高。所以,这
些没有转化成工业商业用途的土地城堡成了贵族们的负担,而没有成为财产。今天,仍能
维持土地和城堡的英国贵族,大多是通过将城堡开放给公众参观来获取收入。例如,将城
堡当作公园开放,收取每人五英镑的门票费用。我相信在座有很多人到英国旅游,参观过
类似的城堡,甚至还有人租用城堡举办生日宴会、公司晚会、婚礼等等。这是一个土地和
人口的相对价值变化的例子。

#4 anonymous :

我们来回顾一下价值投资的起源。价值投资正
是诞生于整个经济和宏观环境极度动荡、充满困惑的时期。最早完整阐述价值投资理念的
人是本·格雷厄姆(Ben Graham),也就是巴菲特的老师。那么格雷厄姆是什么时候开始
理解和实践价值投资的?他最早从 1926 年开始投资,前三年中,他与很多投资者一样,
经历了“咆哮的二十年代”(Roaring Twenties),期间也做了很多投机操作。然而,
1929 至 1932 年的大萧条时期,他的投资合伙企业的帐面价值损失高达 70%。痛定思痛,
他才开始真正实践价值投资,并于 1932-1935 年成功弥补了之前的亏损。1936 年,他创
立了一个新的封闭式基金(closed fund),运营至 1956 年结束,二十年间实现了非凡的
回报。期间,他于 1949 年出版了《聪明的投资者》,首次完整地阐述了价值投资的最重
要的三个理念

价值投资的奠基人格雷厄姆,正是在宏观经济面临巨大挑战时发现了价值投资的方
法论。他在那个时代所经历的比我们今天面对的挑战要困难得多。当时,美国的失业率高
达 25%,整个经济体萎缩了约三分之一到一半
,具体比例取决于不同的评估方法。人们普
遍感到前途渺茫,世界仿佛快走向末日。等他终于回本,开始新的基金时,世界又迅速陷
入一场法西斯发动的全球性战争,这场战争最终导致上亿人死亡,数亿人受伤,世界上大
部分的工业体系被彻底摧毁
。在这样的时代背景下,他创造了卓越的投资业绩。

另一位对价值投资的理论和实践做出巨大贡献的是经济学家凯恩斯。很多人都熟悉
凯恩斯的宏观经济理论,以及他对战后布雷顿森林体系和全球金融体系设计的贡献,但是
很少有人知道凯恩斯也是一位优秀的价值投资人。从 1921 年到他 1946 年离世,凯恩斯管
理着剑桥大学最重要的国王学院的捐赠基金,25 年间积累了卓越的投资业绩。凯恩斯早
期也曾有过很多投机,但是在不断的经验教训中,他开始总结出价值投资的核心理念。凯
恩斯与格雷厄姆的事业轨迹高度重合,都经历了“咆哮的二十年代”、大萧条和世界大
战。不过,与格雷厄姆不同的是,凯恩斯所在的英国在二战期间处于战火前线,而格雷厄
姆所在的美国则处于战争的大后方,因此凯恩斯在这样的背景下创造出的业绩更具意义。

还有一位约翰·邓普顿(John Templeton),他对价值投资以及把价值投资推广到
其他国家起到了重要作用。1939 年,正值战争期间,许多美国股票跌破一美元,邓普顿
秉持“便宜就是硬道理”的原则,将当时在美国股市中所有低于一美元的股票各买 100 股,
共投入一万美元。四年后,当他卖出时,104 只股票中有 100 只都取得了大幅上涨。1954
年,他创建了邓普顿基金(Templeton Fund),开始将价值投资理念推广到很多其他国家。
1992,这只基金经过 38 年的发展,历经市场的各种变化,取得了十几倍的收益

我(李录)在 1997 年创建了喜马拉雅基金。在此之前,我在 1993 年买了第一只股票,就是
从买便宜的公司开始。在投资便宜公司的过程中,逐步建立起自己的能力圈,并从寻找便
宜的公司慢慢过渡到寻找优质且便宜的公司。1997 年,基金成立之初,我就经历了亚洲
金融危机
。过去这几年中国市场经历了资本与资产的大幅回撤,许多人都遭遇了房地产、
股票和其他证券价格的下跌。然而这轮下跌的程度与当年的亚洲金融危机相比,依然不可
同日而语。1997-1998 年亚洲金融危机期间,亚洲主要国家的市场普遍下跌 70% 以上,最
惨烈的甚至跌了 90% 以上
。我们的基金也同样面临了巨大的挑战,出现了比较大的波动,
但那几年的业绩总和恰恰是我们收益很高的一段时期,那时的市场可谓遍地黄金。

摘要

职业韧性并不意味着永远不会失败,而是能够把职业上的挫折与个人价值区分开来,在经历痛苦之后诚实地反思,然后重新出发。我曾在为 Sandy Weill 工作了 15 年之后被花旗解雇。这件事令我震惊,也让我难过,但我最终意识到,公司不再需要我,并不意味着我作为一个人的价值有所减少。后来,我选择了处于困境中的 Bank One,带着家人搬到芝加哥,把相当大一部分个人资产投入公司股票,并参与推动它的转型。那段经历让我更加确信,真正的韧性不是抱怨环境,而是接受现实,承担责任,利用手中的资源把事情做好。

领导一家大型企业,既需要分析能力、商业判断和风险意识,也需要好奇心、同理心、沟通能力以及做出艰难决定的勇气。我一直非常重视数字、风险、运营和执行,但随着职业生涯的发展,我越来越认识到,情商和智商同样重要。优秀的领导者必须懂得倾听,尊重不同岗位的人,能够根据员工的性格调整沟通方式,并创造一个让每个人都愿意贡献意见的环境。领导者的价值并不取决于自己是不是会议室里最聪明的人,而在于能否让团队充分发挥能力。

企业的长期竞争力来自持续投入、审慎管理风险、贴近客户,以及能够在复杂环境中坚持长期战略。无论面对经济衰退、滞胀、国际贸易摩擦还是地缘政治冲突,我都希望摩根大通能够承受各种情景。我们不会因为短期经济波动,就停止拓展国际业务、建设分行、招聘银行家或投资新技术。同时,我们必须不断了解基层员工和客户真正遇到的问题,把批评当作改进的礼物。对美国而言,经济增长、教育、基础设施、医疗、监管效率与国家安全也越来越紧密地联系在一起。

两次接近死亡的经历,让我更加明确人生的优先次序。一次是晚期咽喉癌,另一次是危及生命的主动脉夹层手术。它们没有改变我热爱工作的事实,却让我更加有意识地生活。我始终认为,家庭、国家、摩根大通是我的价值排序。职业上的成就当然重要,但陪伴孩子、承担家庭责任,以及帮助他人和社会,同样是人生中不可替代的部分。

对于未来,我仍然相信个人努力、优秀企业、自由竞争和持续学习所创造的机会。无论是人才选拔、银行业整合、人工智能时代的工作方式,还是领导层继任和退休后的生活,我都更愿意寻找真正有效的方法,而不是简单迎合流行观点。我希望未来能够写书、教学、帮助企业和慈善机构改善管理,也希望新闻行业能够提供更多深入、严谨、真正帮助公众理解复杂问题的报道。

#1 ·
#2 Zethes :

在不确定的世界里领导:Jamie Dimon 谈职业韧性、商业决策、风险管理、家庭与人生

职业韧性:被解雇不等于失去自我价值

在花旗被解雇,是我职业生涯中最重要的一次挫折

如果谈到职业韧性,我确实有一些亲身经历可以分享。我曾经为同一个人工作了 15 年,最后却被解雇了。这个人就是 Sandy Weill,我们一起经历了美国运通、Travelers,以及后来花旗集团的发展阶段。虽然事后回想起来,我本来不应该那么惊讶,因为在那之前,我们已经有好几年相处得不太融洽,但事情真正发生时,我仍然非常震惊。

那天,我们先开了一场管理层会议,随后 Sandy 叫我过去,John Reed 也在场。他们让我坐下来,告诉我公司准备进行一些调整。当天晚上,我就回家了。对一个长期投入同一家公司、参与了许多重大业务发展和收购的人来说,这种经历显然非常难受。但我后来逐渐想明白一件事:受到影响的是我在那家公司的职业价值,而不是我作为一个人的自我价值。 我失去了那个职位,也失去了原来在公司的角色,但我仍然是我自己。我告诉孩子们,我没有问题,我会好起来。

这并不是说被解雇不应该让人痛苦。被拒绝、失去职位或者遭遇重大失败,都会让人受伤。我认为,人完全可以允许自己难过一段时间,可以沮丧,甚至可以暂时责怪这个世界。但是,总有一个时刻,你必须重新站起来,继续往前走。

还有一件事情同样重要,那就是诚实地审视自己到底做错了什么。类似的关系破裂,通常不完全是某一方的问题。即使你认为自己受到了不公平的对待,也应该尝试理解自己的责任。你不需要把所有错误都归咎于自己,但如果完全拒绝反思,就会失去从失败中学习的机会。

失业后的一年,我没有急着寻找下一个头衔

很多人记得,我当时被解雇之后,差不多过了一年才开始下一份重要工作。实际上,那段时间并不像外界想象的那么令人焦虑。

我记得自己是在 11 月被解雇的,之后花了几个月处理离职协议和其他相关安排。期间,公司甚至收回了原来提供给我的办公室,我不得不自己重新安排办公地点。我认为那是一个不太友善的举动,不过也没有必要一直纠结。

到了第二年的 3 月或 4 月,我决定干脆享受一下那个夏天。我带着家人去欧洲进行了一次相当悠闲的旅行。直到 9 月回到纽约,办公室也安排好了,我才开始认真考虑下一步到底要做什么。

当时确实有很多人联系我,而我几乎接听了每一个电话,即使有些机会从一开始就不在我的考虑范围内。我认为认真回应别人是一种基本的尊重。

我考虑过成立一家商人银行,也有人希望与我合作开展投资业务。我接到过一家大型国际投资银行的邀请,还专门去伦敦见了管理团队,但最终判断自己不适合在那里工作。也有一些规模较小的公司向我提供职位。此外,我完全可以写一本书、到学校教学,甚至直接退休。这些都是合理的选择,其中一些事情我后来仍然希望去做。

但当时我很清楚,自己还没有准备结束职业生涯。我仍然年轻,仍然希望尝试经营一家大型企业,并证明自己有能力让它取得成功。

为什么最终选择了 Bank One,而不是亚马逊或家得宝

在寻找新机会的过程中,我还与 Jeff Bezos 见过面。当时他正在为亚马逊寻找一位总裁。我们谈过,但我没有继续推进这个机会。对那时的我来说,跨入互联网和电子商务领域,跨度可能有点太大。不过,我非常欣赏 Jeff,从那以后我们一直保持着友谊。

真正进入最后考虑范围的两个重要机会,是 Home Depot 和 Bank One。

我非常喜欢 Home Depot 的创始团队以及公司的文化,也一直很欣赏 Arthur Blank、Ken Langone 和 Bernie Marcus。前不久我还见到了 Arthur Blank,而 Bernie Marcus 已经去世了。当年我去亚特兰大与他们见面,三个人一起吃饭时,我不得不坦白一件很有意思的事情:在他们联系我之前,我竟然从来没有走进过一家 Home Depot 门店。

这当然不意味着我不能学习零售业,但从职业背景来看,我在金融行业积累了几十年的经验。我从小就在金融环境中成长,父亲和祖父都是股票经纪人,后来又在 American Express、Travelers 和花旗工作。

如果一个人一辈子都在打网球,现在突然让他去打长曲棍球,当然也可能学会,但他必须重新适应一套完全不同的规则、技能和环境。我对零售业非常尊重,但银行和金融服务是我更熟悉的领域。

Bank One 当时是一家遇到严重困难的公司,但这反而没有让我太过担心。我对它的业务不是每一个细节都了解,但大部分东西是我熟悉的。我觉得自己可以利用过去积累的经验,帮助它走出困境。

我一直有一种非常朴素的想法:不要像个孩子一样不断抱怨。接受你手里已经拥有的东西,然后尽可能把它做好。

因此,我最终选择了 Bank One,而且不是以一种随时准备离开的态度加入。我带着家人搬去了芝加哥,在那里买房子,把孩子送进当地学校,并且在刚到公司的时候,就把大约一半的个人资金投入了 Bank One 的股票。

我希望员工、投资者和董事会都知道,我的利益与这家企业真正联系在一起。此后我所做的决策,不只是一个受雇的职业经理人所做的决策,也包含了作为股东的责任感。大家知道,如果公司的未来出现问题,我本人也会承担很大一部分经济后果。

从 Bank One 到摩根大通:真正投入意味着什么

在芝加哥重新开始,并不轻松

虽然我最终非常喜欢在芝加哥工作的经历,但刚到 Bank One 时,我确实感觉相当孤立。我原来是一个典型的纽约人,很多人甚至不相信我真的会搬到芝加哥。

当时媒体经常问我是否真正承诺留在当地。我反复解释,我已经搬过来了,家人住在这里,孩子也在这里上学。有些人甚至会开车经过我在芝加哥的房子,确认我是不是真的住在那里。

我后来经常开玩笑说,如果有一天我在芝加哥去世,而家人把我的骨灰运回纽约,芝加哥的人可能还会说:“看吧,我们早就知道他没有真正打算留在芝加哥。”这个玩笑虽然有些夸张,但也反映了当时外界对我的怀疑。

刚加入公司的第一场重要会议就是董事会会议。在此之前,我只见过大概六位董事,那天才认识了其他十几位董事。Bank One 的董事人数很多。会议结束后,董事们陆续离开,人力资源主管带我去参观办公室。

他们为我准备了一间角落里的办公室,但我不想坐在那里。我希望自己的办公室就在业务活动最密集的地方,而不是远离其他管理人员。我喜欢能够随时观察团队、与员工交谈,也希望大家知道可以直接来找我。

随后,我提出想见见管理团队。大家进入会议室,我与他们握手、打招呼,手里还端着一杯咖啡。有人很认真地告诉我:“Jamie,我们不在这个房间里喝咖啡,因为这里有一块非常漂亮的白色地毯。”

我看看手中的咖啡,再看看他们,又看看咖啡,然后说:“从现在开始,可以喝了。”

这就成了我在 Bank One 做出的第一个高管决定:允许大家在铺着白色地毯的会议室喝咖啡。

这件事听上去很小,但它反映了我对管理文化的看法。企业不应该把一些形式上的规矩看得比人与人之间的交流更重要。我希望管理团队把注意力放在业务、客户、风险、执行和沟通上,而不是担心一杯咖啡会不会破坏地毯。

Bank One 的转型,以及与摩根大通的合并

后来,Bank One 的经营状况明显改善。有人把那段经历描述为我们取得了巨大成功,我的说法会稍微谨慎一些:我们确实成功扭转了公司的局面,让一家陷入困境的企业重新成为一家经营状况不错的公司,但它还远远不是一家完美的公司。

在那段时期,Bank One 的市值大约从 210 亿美元上升到了 500 亿美元。与此同时,摩根大通也经历了比较艰难的阶段,最终双方选择合并。尽管 Bank One 在交易中获得了一定溢价,但从实质上讲,这是一场双方参与程度都很高的合并。

我在交易结构和未来管理安排上拥有相当大的话语权。合并之后,董事会席位采取了双方各八人的安排,而协议规定,我将在 18 个月或 24 个月后成为 CEO,除非董事会有 75% 的成员反对。

从实际效果看,这几乎意味着我肯定会成为 CEO。因为要形成那么高比例的反对票,并不是一件容易的事情。

这次合并最终让我有机会领导摩根大通,但在我看来,最重要的并不是职位本身,而是能够在一个更大的平台上,运用我们过去积累的经营能力、风险管理经验和组织管理方法。

大型企业领导者应该如何管理公众影响力

我不会为了发表意见而发表意见

领导摩根大通这样一家规模巨大的公司,意味着我的一些公开讲话会受到媒体、投资者、监管机构和政策制定者的关注。主持人 Monica McNutt 提到,甚至特朗普总统也表示会关注我的看法。

但我不认为自己说的每一句话都具有外界想象的那种分量,也不希望不断出现在电视上,对所有事情发表意见。事实上,我自己也会认真听其他人的看法,因为我希望了解他们如何理解这个世界、正在做什么,以及他们观察到了哪些我可能忽略的变化。

公开讲话时,我会努力做到诚实而谨慎。我希望自己说的是经过思考、含义明确的话。话说得越多,未必越能把问题解释清楚,有时反而可能制造误解。

如果仔细观察我的公开活动,就会发现我通常都有一个具体的理由。我可能是在某个城市宣布新的业务扩张计划,可能是在介绍帮助当地社区的新项目,也可能是推出新的投资计划。

我并不喜欢单纯为了上 CNBC 而谈论经济。如果没有具体目的,我宁愿把时间花在经营公司和学习上。

当然,还有一个我非常重视的领域,就是美国公共政策。我认为,一些政策问题与国家长期竞争力、社会稳定以及经济增长密切相关。只要我们确实拥有相关专业知识,并且能够提供有价值的建议,我愿意更积极地参与讨论。这并不是为了增加个人曝光度,而是因为我希望为国家做一些有益的事情。

公共政策参与必须建立在专业能力之上

摩根大通不会对所有公共政策都发表意见。我们会认真讨论哪些议题真正与公司有关、哪些领域我们具有专业知识,以及我们能够发挥什么作用。

例如,我通常不会深入评论各种具体医疗政策,但像医疗服务价格透明度这样的议题,涉及市场运作、信息透明和消费者利益,我们可能有一些有价值的观点。

同样,国际贸易和地缘政治正在变得越来越重要。我们成立了亚太战略小组,因为我们知道,与亚洲尤其是中国的经济关系,将长期影响全球贸易和金融市场。

我们还设立了国防相关的行动论坛,研究美国需要建立哪些能力、供应链和资源储备,才能在潜在战争或重大安全危机中保持充分准备。除此之外,我们还组建了地缘政治战略团队,因为越来越多客户希望我们帮助他们理解不断变化的国际环境,并评估这些变化对企业经营和投资的影响。

我们会花大量时间讨论,究竟应该参与哪些议题,以及如何参与。与此同时,有些问题不是我们主动选择的,例如国会调查、传票或者其他监管程序,也会迫使公司投入资源去处理。

这种公众关注并没有从根本上改变我的日常管理方式,却确实影响了我们愿意参与的议题范围。我的原则始终是:如果我们有专业能力,而且确实能够帮助社会解决问题,就应该认真考虑发挥作用。

从 Sandy Weill 身上学到的经营与风险管理

大规模并购让我学会经营复杂企业

我在 Sandy Weill 身边工作多年,参与了大量收购和整合,这对我的管理能力影响非常深远。

我们最早从 Commercial Credit 开始,随后收购了其他消费金融公司,又收购了包含多家保险公司的 Primerica,之后加入了 Smith Barney、Travelers 的部分业务及其全部业务,还涉及 Shearson、Salomon Brothers 等不同金融机构。

从外部看,那是一台非常有名的并购机器。我们不断寻找机会,完成交易,再把不同类型的金融业务纳入同一个组织。

但如果从战略一致性的角度看,这些业务并不总是具有非常清晰的协同关系。有的公司经营保险,有的做消费金融,有的做证券经纪,有的从事投资银行业务。它们的商业模式、资产结构和风险敞口都不相同。

我当时就知道,并不是所有业务都存在完美的战略契合。然而,一家多元化的金融集团仍然可以通过把每项业务经营好,为股东创造大量价值。

这种经营方式要求管理者真正理解不同业务,而不能只关心收购价格或者交易是否完成。我们必须学习如何管理系统、员工、运营、市场营销和产品,同时理解每一家子公司实际承担了什么风险。

例如,保险业务可能涉及非常复杂的长期风险,有些风险甚至与卫星等特殊资产有关。我一直非常关注风险究竟藏在哪里,最坏的情况可能有多严重,如果问题真的出现,公司能否承受,以及需要提前做好什么准备。

我处理了大量日常经营事务,对数字、风险和运营细节都非常着迷。我希望知道公司到底发生了什么,而不是只听取一些经过包装的高层汇报。

今天我依然非常重视这些细节,但并不需要像年轻时那样亲自参与每一项工作。因为现在我已经非常了解管理团队,也相信他们具有足够能力。我没有必要重复他们已经做得很好的事情。

我很早就学会了用事实挑战权威

我第一次得到与 Sandy Weill 工作的机会,也和一件相当偶然的事情有关。

年轻时,我写过一份关于金融机构合并的分析报告,涉及 Shearson、Hammill 和 Hayden Stone 等业务背景。母亲认识 Sandy,就把我的文章拿给了他。

Sandy 看完之后非常喜欢,还送回一些意见,问我是否愿意让他使用和传阅这份材料。

我的回答非常直接:当然可以,不过你们那里有没有暑期实习工作?

这可能有些大胆,但我确实因此得到了机会。起初,我做的主要是非常基础的数据工作,例如录入预算数字,并不是什么高级岗位。

那年夏天,我有机会参加一些会议。记得有一次,有人讨论公司的大约 450 家分支机构,并表示所有分支机构都在盈利。我当场提出不同意见,说并非如此,其中有四家没有盈利,还能指出具体是哪些机构,包括位于 Portland 的一家,以及其他几家。

我当时只是一个暑期实习生,却敢于在会议上纠正这种说法。不是因为我想让别人难堪,而是因为我知道相关数字,也认为事实比职位高低更重要。

这种工作习惯一直保留到今天。无论职位多高,管理者都应该愿意了解细节;无论职位多低,员工也应该能够在掌握事实的情况下提出不同意见。

好的领导力:智商、情商、好奇心与尊重

真正的倾听,是把全部注意力交给别人

随着职业生涯的发展,我越来越意识到,领导力并不只是制定战略、阅读财务报表或者做出投资决策。

倾听非常重要。我经常告诉团队,如果我要参加一场会议,我会提前阅读材料,也就是完成所谓的 pre-read。会议开始后,我会把百分之百的注意力放在讨论上,而不是一边开会一边处理其他事情。

我会认真听别人说什么,不断提问,尝试更深入地理解他们的逻辑、假设和担忧。提问不是为了证明自己更聪明,而是为了把事情弄清楚,知道我们究竟面对什么问题,以及下一步应该怎么做。

我也非常重视尊重、关怀和好奇心。员工不愿意为自己不尊重的人工作,也不愿意为自己不信任的人工作。如果领导者根本不关心他们,员工通常能够感受到。

所谓有爱心或有人情味,并不只是对高级管理人员友善。你怎样对待清洁工、服务员、出租车司机,和怎样对待其他公司的 CEO 一样重要。一个人真正的品格,往往体现在这些日常互动中。

我还认为,好奇心是一种谦逊。一个始终保持好奇心的人,承认自己不可能知道所有事情,因此愿意不断学习。

即使我管理着一家大型银行,也不意味着我比柜员或分行经理更懂得每一项零售银行业务。很多时候,他们对某家分行的日常经营、客户真正需要什么、流程哪里存在问题,比我了解得多。

因此,我不仅应该倾听他们,还应该主动创造机会向他们学习。

认可员工,不只是说一句“干得不错”

我和 David Novak 讨论过员工认可的问题。他长期强调 recognition,也就是在组织中认真看见和肯定他人的贡献。

真正的认可,不应该只是简单说一句“你做得很好”。它还应该包含具体的内容,例如你准确指出员工究竟解决了什么问题、发现了什么别人没有看到的风险,或者通过什么努力推动了结果。

有时,认可也意味着承认自己原先的判断不够好,而其他人找到了更好的方法。

如果一个领导者能够认真理解员工的工作细节,并准确描述他们的贡献,员工就会知道自己的努力被真正看见了。

这种尊重、倾听和认可,不是企业文化的装饰,而是企业文化得以建立的基础。如果管理者不愿意理解别人,不愿意承认别人的贡献,也不愿意学习,那么再多关于企业文化的口号都没有意义。

情商和沟通能力,是管理能力的重要组成部分

年轻的时候,我可能低估了良好沟通的价值。随着管理的组织越来越大,我才真正意识到,能把复杂问题讲清楚,是一种非常重要的能力。

写作尤其如此。我很喜欢那句经典的话:“抱歉给你写了这么长一封信,因为我没有时间把它写短。”

把话写短,往往需要更多思考。你必须真正理解问题,区分重要与不重要的部分,再用清晰的语言让别人理解。这也是对阅读者时间的尊重。

Jeff Bezos 采用过六页备忘录的工作方式,我认为那是一种很好的管理实践。我们在摩根大通内部也使用很多类似的书面材料,因为它们能够迫使人们充分思考,再进行讨论。

但情商不仅是写作和表达。它还包括赢得信任、兑现承诺、愿意出现在员工身边,以及理解不同的人需要不同的沟通方式。

有些员工能够接受非常直接、强硬的反馈,甚至觉得这种方式有助于迅速解决问题。另一些员工面对同样的语言,可能会感到恐惧、羞辱或情绪受到严重影响。

领导者需要识别这些差异,并调整自己的行为。

同样一句严厉的话,对不同人的影响完全不同

我记得在 2007 年前后的金融危机时期,有一个星期六,我在家里接听工作电话,语气相当严厉。我的三个女儿都听到了电话内容。

其中两个女儿并不觉得有什么特别,她们已经习惯我在工作中有时会非常直接。但另一个女儿突然哭了起来。她问我,为什么要那么生气,是不是准备解雇电话另一端的人。

这件事让我非常深刻地意识到,同样一种行为,在不同人眼里可能代表完全不同的东西。

一个人听到严厉的批评,可能觉得这不过是正常的工作讨论;另一个人却可能觉得自己正面临极大的威胁。

领导者的责任,不是回避困难的议题,而是以适合对方的方式把困难的议题讨论清楚。

一个团队里可能有内向的人、外向的人,以及具有不同神经认知特征的人。我们希望他们都能发挥自己的能力,就必须创造一个让不同类型的人都敢于表达意见的环境。

这不意味着降低标准,而是要求领导者提高自己的沟通水平,理解人的差异,并帮助每个人在组织中贡献最大的价值。

深入基层:为什么我坚持亲自走访分行和客户

巴士巡访不是公关活动,而是一种学习方式

我一直有到各地实地走访业务的习惯。过去很多出差通过飞机完成,往往集中在纽约、洛杉矶、旧金山等主要市场。但后来我们决定采取一种不同的方法:乘坐巴士,沿着一条路线深入较少被高层访问的城市和社区。

在收购华盛顿互惠银行 WaMu 后,我们进一步扩大了西海岸业务。2012 年前后,我们组织过一条从西雅图到圣迭戈的巴士路线,希望真正了解沿途不同市场的情况。

我们没有只停留在西雅图、旧金山或洛杉矶,也去了 Sacramento 以及一些内陆小城。行程最后到达圣迭戈,还访问了当地军事基地,与受伤的退伍军人交流。

最近,我们也继续在美国南部等地区开展类似的巡访。

这种旅行最大的价值,是能够看到总部会议室里很难看到的真实情况。

我们会让分行经理、柜员以及其他基层员工上车,与管理层直接交流。我经常开玩笑告诉他们,上了巴士就能得到两样东西:啤酒和豁免权。

所谓豁免权,就是希望他们放心地告诉我们真实情况,不用担心因为批评管理层或者公司政策而受到惩罚。

巴士上会放音乐,气氛相对轻松。我们鼓励大家坦率表达意见:哪些流程不合理,哪些产品存在缺陷,哪些规定妨碍了服务客户,哪些事情是总部完全没有意识到的。

这些批评对我来说不是麻烦,而是礼物。

我们会认真记录发现的问题,整理成清单,回到总部后继续推动改进。

客户的抱怨,也是最有价值的经营信息

实地巡访不仅包括员工。我们也会与消费者、小企业客户、大企业 CEO、机构客户以及地方社区负责人见面,举办客户晚宴、员工大会和其他交流活动,有时还会参观大型呼叫中心。

客户经常会直接告诉我们,某些产品或服务不如竞争对手。有些人甚至会非常明确地指出,别的银行做得更好,而我们的流程太慢、太复杂,或者没有满足他们真正的需求。

听到这种反馈时,我希望团队的反应不是辩解,而是把问题写下来,然后想办法修复。

一家大型企业很容易形成自己的信息过滤系统。客户抱怨经过多层汇报之后,可能变成一份语气温和、问题不那么尖锐的材料。长期如此,管理层就会误以为业务运行良好。

面对面交流能够减少这种信息失真。

此外,我发现,无论到美国哪个小城,当地的人们都非常重视大型企业领导者愿意真正花时间到访。

我们会与当地媒体交流,了解社区需要,讨论慈善项目,观察就业机会,研究是否能够增加招聘或投资。这些举动能够让当地居民感受到,我们不仅仅是把他们当作一组业务数字。

对他们来说,企业领导者亲自到场、认真倾听,本身就是一种尊重。

地缘政治、美国经济与长期战略

经济冲击往往具有滞后性,不能只看眼前的数据

现在的商业环境确实变得更加复杂。关税、移民政策、财政政策和地缘政治都在发生变化,但美国经济的表现,有时候似乎没有受到大家预期的那么严重的冲击。

我认为,观察这些问题时必须有耐心,因为很多经济变化都有很长的传导周期。

例如,即使新的关税政策从今天开始实施,也不意味着所有影响会立刻反映在消费者价格和企业利润中。如果一艘货船今天装货,它可能一个月后才抵达美国港口,相关成本变化还需要进一步传递到企业供应链和最终消费者。

移民政策变化对劳动力供应和经济增长的影响,同样需要时间才能观察清楚。

对于当时正在推进的所谓“大而美法案”,我们也不能在所有细节和效果尚未明确之前,就简单断言它一定会产生什么结果。

因此,我不愿意根据几周或者几个月的经济数据,就认定某项政策已经成功或者失败。

我们需要更长的观察周期,同时研究不同政策之间可能相互强化或抵消的影响。

不过,相比这些短期经济变量,我更加关注地缘政治。

我的风险管理原则,是为所有合理情景做好准备

摩根大通必须能够应对不同类型的经济环境,包括正常增长、经济衰退、严重衰退、通货膨胀,以及增长停滞但物价仍然上涨的滞胀环境。

我不会因为某种情景的发生概率看起来不高,就完全忽视它。

即使我们认为某一种结果不太可能发生,也应该问自己:如果它真的发生,公司是否有足够的资本、流动性、运营能力和管理能力来应对?

一家具有长期竞争力的金融机构,不能只在经济形势良好时表现优秀。

我们应该能够承受好的、坏的,甚至非常糟糕的结果。

但从全球视角来看,真正重大的问题是如何维持一个安全、稳定、开放并且有利于自由社会发展的国际环境。

这也是为什么我们加大了对一些美国公共政策问题的投入。我们希望推动更好的经济增长政策、更高效的住房供给、更合理的教育体系以及更有效的基础设施建设。

如果政府长期无法解决民众关心的问题,人们对政府和公共机构的信任就可能下降。

这些问题不仅涉及经济,还涉及国家治理能力。

从住房、教育到航空管理,美国需要解决大量结构性问题

有人会觉得,一家银行的 CEO 为什么会关心美国联邦航空管理局 FAA 的运作方式。

原因很简单:这些基础设施和公共管理能力会影响整个经济的生产率、安全性和成本。

我认为 FAA 的很多工作人员非常敬业,但美国航空管理系统的一些技术和流程已经过时。现代化水平不足,可能让航班无法采用更加直接、高效的航线,也可能增加运营成本、造成安全方面的挑战,甚至带来更多二氧化碳排放。

这不是员工是否努力的问题,而是整个系统是否具备现代化能力的问题。

类似的情况也存在于美国其他领域。我们的建设许可制度需要改革,教育体系需要改善,医疗制度仍然存在大量可以提高效率的地方。

我们还需要解决住房负担能力、劳动力技能、经济增长和基础设施等问题。

我在年度董事长致股东信中也讨论过这些议题,并提出了一些具体建议。

我并不认为这些问题无法解决。恰恰相反,我认为美国仍然拥有非常强大的资源、人才、创新能力和制度基础。

面对中国,最重要的是提升美国自身的竞争力

我不一定会把中国简单称作敌人,但中国显然是一个非常强大的竞争对手,同时也是一个重要的军事力量。

中国既有自己的优势,也有弱点。我们可以花很多时间讨论这些问题,但对我来说,更重要的不是不断表达对中国的恐惧,而是把美国自己的事情做好。

美国需要提高经济增长能力,确保拥有世界上最强大的军事力量,持续推动创新,保持技术领先和长期竞争力。

只有做到这些,我们才能更有信心地维持美元的国际储备货币地位,并继续吸引全球投资。

这些目标并不是遥不可及,但如果我们不改革许可审批制度、不改善学校教育、不提升医疗体系效率,也不解决其他长期存在的结构性问题,就会逐渐削弱自己的优势。

因此,摩根大通现在比过去更加积极地参与这些与国家长期竞争力相关的议题。

为什么我们不会因为经济不确定性而停止扩张

长期投资不应该被短期周期左右

尽管外部环境存在大量不确定性,摩根大通并没有因此暂停既定扩张计划。

我们仍然希望在海外扩大业务,招聘更多银行家,在美国建设新的分行,并持续投资技术。

即使出现经济衰退,我也不会因为这一点就从根本上改变公司的长期战略。

当然,我们会根据风险状况作出一些调整。例如,某些业务可能需要适度降低销售扩张速度,或者减少特定领域的风险敞口。但整体投资方向不会轻易改变。

假设美国出现滞胀,那会是一个具有挑战性的环境,但我们也应该有能力承受。

而且,无论经济短期发生什么变化,美国仍然是一个拥有巨大财富创造能力的国家,也是全球投资者非常重要的投资目的地。

我不希望公司因为害怕下一次衰退,就放弃那些需要十年甚至更长时间才能形成竞争优势的机会。

美国银行业的未来:整合、规模优势与社区银行

为什么美国有几千家银行,而很多国家只有少数大型银行

美国银行体系非常独特。这里大约有 4000 到 5000 家银行,而其他一些国家的银行业集中度明显更高,可能主要由五到十家大型银行构成。

如果观察加拿大、澳大利亚、日本、法国和英国等市场,就会发现它们的银行体系通常比美国更加集中。德国在某些方面是一个例外,因为它保留了相当多具有地方特色的银行机构。

美国形成这种结构,有很深的历史原因。

过去很长时间,美国银行不能自由地跨州经营。直到 20 世纪后期,相关限制才逐步放松。更早的时候,有些州甚至对同一城市内的银行网点数量作出严格限制。

例如,历史上的 First Chicago 曾经只能在芝加哥拥有一家分行,所以那家分行的规模非常大。

当这些法律和监管限制逐渐变化之后,美国银行才开始更大规模地进行跨地区合并。

银行业本身具有非常显著的规模经济。技术系统、网络安全、合规管理、风险管理、支付处理以及其他基础设施,都需要大量固定投入。

从这个角度看,银行之间进行整合具有经济逻辑,因此我预计美国银行业仍然会继续发生一定程度的整合。

但是,这绝不意味着所有并购都会成功。

我亲身经历了大量银行合并,知道真正的整合非常困难。企业文化可能不兼容,财务结构可能出现问题,系统和技术平台可能难以统一,员工和客户也需要重新适应。

很多银行并购最终并没有实现原先承诺的价值。

所以,并购存在经济逻辑,不代表每一笔并购都是好交易。

小型社区银行有独特的竞争优势

我也不认为所有小银行最终都必须被大型银行收购。

实际上,美国有很多经营得非常好的社区银行。它们了解当地客户,拥有不错的资本回报,而且能够提供大型银行不一定能够复制的服务。

举一个例子:一家位于小镇的社区银行,可能没有使用 Salesforce 那样复杂的客户关系管理系统,也没有世界级的大型数据平台。

但你知道它们最好的 CRM 系统是什么吗?就是分行经理自己的大脑。

当地银行经理可能认识客户的全家,知道他们的孩子在哪里上学,知道他们经营什么生意,也了解他们遇到了什么困难。

如果你的孩子需要一张信用卡,银行经理甚至可能在下班回家的路上,顺便把卡送到你家。

他们还可能非常了解当地房地产市场,知道某条街的商业物业值多少钱,知道一份当地租约的真实价值,以及哪些小企业经营稳健。

这些知识和服务关系,很难完全通过一个集中化的软件平台替代。

所以,不能简单认为大型银行一定经营良好,而小型银行一定经营不佳。事实上,有很多小银行拥有优秀的财务表现,因为它们在自己的细分市场中真正做到了专业而高效。

摩根大通的增长主要依靠有机扩张

摩根大通已经非常大了。主持人提到,我们的规模甚至接近几家主要竞争对手的总和,因此很多人自然会问,我们是否还能继续收购美国银行。

答案是,我们目前受到美国相关限制,不能像普通银行那样继续通过收购其他美国银行来扩张。

理论上,我们可能在海外收购银行,但我也不认为那是最值得优先考虑的增长方式。

我们已经拥有足够大的业务平台,可以通过有机增长持续发展。

例如,在美国,我们能够一个州、一个州地拓展市场,一家分行、一家分行地增加覆盖,继续扩大消费者金融、信用卡和商业银行业务。

在海外,我们也拥有很多机会,包括 Chase UK 等新业务。

全球经济仍然在增长,企业的金融需求越来越复杂。越来越多美国跨国公司在秘鲁、哥伦比亚以及欧洲各地开展业务,而这些企业在进入新市场时,也需要银行提供支付、融资、现金管理、风险管理和其他服务。

我们能够陪伴这些客户在不同国家开展业务,这是一种非常重要的规模优势。

大型银行能够承担小银行无法完成的全球性任务

摩根大通在大约 100 个国家开展业务,每天处理的资金流转规模大约达到 10 万亿美元。

要实现这种能力,需要极其复杂的技术系统、支付网络、运营基础设施和网络安全体系。

我们在美国拥有大约 8700 万消费者客户。有人认为这个数字包括全球消费者,但我通常会特别说明,这主要指美国消费者。

此外,我们还服务大约 1.2 万家企业客户以及 6000 家投资机构,业务对象包括城市、州政府、学校、医院、主权财富基金和其他政府机构。

我们不仅仅为企业提供银行服务,也会协助不同国家的政府和公共机构开展融资活动。

例如,我们参与过巴基斯坦政府相关债券交易,并为政府提供信用评级、融资安排等方面的建议。

主权财富基金在全球金融体系中的资产规模也非常庞大,它们需要投资、托管、风险管理和其他专业金融服务。

小型社区银行可以非常擅长服务当地客户,但不可能单独建设支持 100 个国家业务、每天处理 10 万亿美元资金流动的系统。

两种银行具有不同的竞争优势,也满足不同类型的客户需求。

为什么我不希望竞争对手陷入危机

健康的竞争,比竞争对手被削弱更有价值

Wells Fargo 的 CEO Charles Scharf 是我非常熟悉的人。我在他 21 岁时就聘用了他,后来也一直非常关注他的职业发展。

他是一位朋友,也曾经与我共事。我对他在 Wells Fargo 取得的工作成果感到骄傲,尤其是在公司经历困难时期之后,他带领团队进行了大量修复和改善工作。

我曾经向他表示祝贺。

但这并不意味着我们之间没有竞争。摩根大通和 Wells Fargo 当然仍然是竞争对手。

问题在于,我不认为一家银行竞争对手遭遇严重困难,就一定对我们有利。

例如,当 Credit Suisse、Silicon Valley Bank 和 First Republic 出现严重问题甚至倒闭时,有些人认为,对其他大型银行来说,这是一件好事,因为它们可能因此获得客户和业务机会。

我并不同意这种看法。

银行出现大规模失败,会让公众质疑整个银行体系的稳定性。如果某家银行的治理、风险控制或经营存在问题,人们不一定只怀疑那一家机构,也可能开始怀疑其他银行。

整个行业的信任基础可能因此受到伤害。

Wells Fargo 之前也受到一些非常严格的监管限制。我认为其中部分限制并不公平。这些措施或许在某些时期让摩根大通获得了一点竞争上的便利,但长期来看,我并不觉得这对银行体系有好处。

我更希望看到的是一家健康的 Wells Fargo 与我们公平竞争,而不是一家受到严重限制、无法充分发挥能力的银行。

一个健康的银行体系,需要健康的竞争者,而不是依赖竞争对手不断失败。

两次接近死亡:癌症、心脏手术与人生观的变化

被诊断出癌症时,我第一次真正面对死亡

我曾经经历过晚期咽喉癌的治疗。主持人 Monica 也经历过晚期乳腺癌,我们都曾在 Memorial Sloan Kettering Cancer Center 接受治疗,因此对彼此的经历有一定理解。

当医生告诉你患了癌症时,那种感觉几乎像被人迎面打了一拳。

癌症在社会上并不罕见,我们都知道有很多人会患癌。但在自己被诊断之前,人们心里常常会隐隐觉得,这件事大概不会发生在自己身上。

真正面对诊断时,我的思维很快发生了变化。

最开始你可能会想:“为什么是我?”

但没过多久,你又会意识到:“为什么不能是我?我又有什么特别的理由能够完全避开这种事情?”

接下来就是漫长而令人疲惫的检查和治疗过程。

你可能需要接受活检、不同类型的影像检查和其他测试,医生也需要时间判断疾病发展到了什么程度。

在所有结果明确之前,你常常不知道情况究竟有多严重,而这种等待本身就非常难受。

对我而言,咽喉癌治疗的过程非常痛苦,绝不是一件容易承受的事情。

但最困难的部分,仍然是告诉自己的孩子。

告诉三个女儿的那一刻,比治疗本身更难忘

我不想让女儿们受到过度惊吓,所以一开始很难找到合适的表达方式。

我把她们叫到一起,想告诉她们发生了什么。起初她们还在正常聊天,彼此说个不停。

但当我开始认真讲话时,她们突然安静下来,因为她们看出我确实有一件重要的事情要说。

我先告诉她们:“在告诉你们具体发生了什么之前,我希望你们先知道,我会好起来的。”

这句话说完之后,房间里完全安静了。

然后,我才告诉她们自己患了癌症。

我一直记得那个时刻。对一个父亲来说,面对自己的疾病是一回事,而面对孩子可能产生的恐惧和不安,是另一回事。

你希望保护她们,希望让她们安心,但又必须诚实地告诉她们正在发生什么。

主动脉夹层让我再次面对生死

几年之后,我又经历了一次危及生命的心脏急症。

那次情况非常严重,我当时认为自己活着走出手术室的概率可能只有 50%。

事情发生在清晨,大约五点的时候,我突然感到胸口剧痛,就像有人把一把刀直接刺进我的胸膛一样。

那种疼痛极其强烈,我甚至觉得身体内部有什么东西被撕裂了。

我非常幸运,第一时间联系了自己的医生。他很快判断事情可能非常严重,直接告诉我带上妻子、坐出租车去指定医院,并安排心脏科医生在那里等候。

医院的医生迅速作出了正确诊断:主动脉夹层。

这种情况有时可能被误诊,而快速、准确的诊断对患者生存非常重要。

更幸运的是,当天早上,世界上非常优秀的相关外科医生之一 Leonard Girardi 恰好能够为我做手术。

那场手术持续了大约七到八个小时。

我知道自己面临极高的风险,也知道手术结果有很大的不确定性。

即使生命垂危,也必须确保公司能够正常运作

在被推进手术室之前,我首先想到的是家人。那时她们还没有全部赶到医院,因为整个事件发展得非常突然。

但我也意识到,作为摩根大通 CEO,我必须确保董事会能够及时了解我的情况。

我让妻子联系公司相关人员,并要求他们准确传达我的诊断,而不是使用一些模糊的说法。

我特别要求通知总法律顾问和首席董事,让董事会知道究竟发生了什么,以及我可能在一段时间内完全无法履行工作职责。

这不是我应该替董事会作决定的时候。我的责任是把真实情况告诉他们,让他们能够采取必要措施。

后来,董事会任命 Gordon Smith 和 Daniel Pinto 作为临时代理 CEO,确保公司在我接受治疗和恢复期间继续正常运作。

这件事反映了大型企业治理的一项基本要求:无论 CEO 多么重要,公司都不能完全依赖某一个人的身体状况或个人能力。

被推进手术室时,我没有太多人生遗憾

很多人问我,当你认为自己可能只有一半机会活着出来时,会不会突然想起大量人生遗憾。

我的真实感受是,没有那么多。

当然,我会想到家人,也会思考自己还有哪些事情没有做完。但我并没有在被推进手术室的时候,突然觉得整个一生充满遗憾。

我记得自己当时还没有完全失去意识。手术室非常大,里面可能有 20 位医护人员。

我看着那些准备为我手术的人,对他们说,无论最后发生什么,我都想先感谢大家。

后来我见到医生时,还专门问过他是否记得这件事。

我非常感激那些医生和护士。经历过重症监护病房的人,会知道护理人员有多么专业、耐心和重要。

手术之后,我曾想给照顾我的护士们送礼物,但医院有自己的规定,不允许接受某些礼品。

最后,我想办法给他们添置了一台新的冰箱,用来存放食物。因为当时正值新冠疫情开始的阶段,我还送了一台能够为手机等设备充电并进行消毒的机器。

这些事情当然无法真正回报他们挽救我生命所付出的努力,但至少是我能够表达感谢的一种方式。

重症监护病房是一种非常深刻的谦逊教育

我平时是一个非常习惯掌控工作节奏的人,习惯了解信息、作出决定、推动团队行动。

但在重症监护病房醒来之后,我发现自己身上连接着大量医疗设备和管线,很多事情都无法独立完成。

那种感觉非常令人谦卑。

你突然变得像一个需要他人全天照料的孩子,甚至一些最基本的事情都需要依赖护士帮助。

但与此同时,这种经历也让我感受到人的善意。照顾我的医护人员不仅非常专业,也充满耐心和同情心。

即使手术已经结束,医生仍然提醒我,危险期还没有完全过去,需要继续观察。

面对这样的处境,你会更加深刻地理解生命的脆弱。

每个人都知道自己有一天会死亡,但真正经历过接近死亡的人,会以一种完全不同的方式理解这件事。

我曾经读到一位澳大利亚作家 Julia Baird 关于患癌经历的文字,其中有一个观点给我留下了很深的印象:经历严重疾病之后,一个人会更加有意识地生活。

我觉得这个说法非常准确。

我的疾病没有让我突然厌恶工作,也没有让我决定完全改变职业方向。我仍然热爱自己做的事情。

但我确实更加明白,时间不是无限的,不能理所当然地假设自己会永远活着。

工作与家庭:我如何理解父亲的责任

我始终把工作和家庭作为生活中最重要的两件事

人们经常讨论职业女性如何平衡工作和育儿,但我认为,男性同样需要认真承担家庭责任。

我有三个女儿,过去多年一直努力参与她们的成长。不过,我并不想假装自己所有事情都做得很完美。很多方法也是我在实践中逐渐学习到的。

首先,如果没有我的妻子 Judith 的支持,我不可能完成这些事情。

她承担了大量家庭责任,我们一起为孩子创造了稳定的生活环境。这一点必须首先说明。

我个人的做法相对简单:我把时间主要分配给工作和家庭。

你很少看到我出现在各种需要穿晚礼服的社交活动上。我没有花很多时间打高尔夫球,也减少了看电视体育比赛的时间。

如果星期六去打网球,我通常会带着孩子们一起去,甚至在她们只有六岁的时候也是如此。

我希望工作之外的重要活动能够尽量与家人共享。

当然,我并不是没有个人兴趣。我喜欢历史、葡萄酒、烧烤和徒步旅行,也喜欢和家人一起度假。

只是这些事情中的很多,都可以成为家庭共同经历的一部分。

家庭时间不会自动出现,必须主动安排

有一次,我向女儿们讲述自己如何平衡工作和家庭,其中一个女儿提醒我,我总是漏掉一些重要的事情。

她说,我应该承认自己确实作出了牺牲。

我回答说,我并不觉得自己牺牲了什么,因为那本来就是我想要的生活。

但她指出,我确实减少了与朋友相处的时间,也放弃了一些其他活动和机会。

我后来承认,她说得有道理。

即使我主观上不认为那些选择是牺牲,它们客观上也意味着我把某些事情放在了其他事情之前。

这就是生活中的优先次序。

如果你真的希望陪伴家人,就必须像安排重要工作会议一样安排家庭活动。

把孩子的比赛、家庭聚会或者其他重要事情写进日历,认真对待,而不是假设工作结束后自然会有空闲时间。

真正优秀的员工,不应该因为照顾家庭而受到惩罚

我也希望管理者理解,员工的工作表现不应该只用他们每天坐在办公室里的时间来衡量。

如果一个员工工作非常出色,而某天下午需要去参加孩子的足球比赛,我不认为这应该构成问题。

在我看来,他去看孩子比赛,与他出去拜访客户,并不必然存在谁更值得尊重的问题。

关键在于他有没有履行自己的职责、有没有为公司创造价值。

新冠疫情是一场非常糟糕的公共卫生事件,但它至少提醒了企业一件重要的事情:很多照顾家庭成员的人,需要更大的工作安排灵活性。

这和长期在家办公不是同一个概念。

如果员工的父亲生病了、母亲需要照顾、孩子遇到健康问题,或者家庭中发生了其他必须处理的情况,企业应该给予适当支持。

只要他们仍然能够完成工作,管理者就不应该机械地计算这些事情占用了几天办公室时间。

我们也在相关制度上提供了更多灵活性。

例如,我们不只是讨论传统意义上的产假或陪产假,而是为第二照护者提供同样长达 16 周的相关假期。

我认为这种支持非常重要,因为照顾孩子和家庭,本来就不应该只是某一方的责任。

人生的价值排序:家庭、国家、摩根大通

家庭始终是我最重要的遗产

如果有人问我,摩根大通和家庭哪一个更能代表我最终留下的遗产,我的答案是家庭。

我的孩子们将拥有自己的职业道路,也可能通过她们的工作,以我无法预见的方式改变世界。

我一直把自己的价值排序概括为:家庭、国家、摩根大通。

这不意味着摩根大通不重要。恰恰相反,它是我参与社会、创造价值和帮助他人的主要方式之一。

如果我把摩根大通经营好,就能够帮助员工、客户、个人消费者、企业、社区乃至整个国家。

因此,我的社会贡献既来自家庭,也来自自己的职业工作。

但在生命结束的时候,家庭仍然是最重要的部分。

现在公司大楼里有很多来自 J. P. Morgan 的经典名言。主持人曾开玩笑说,也许未来可以把我的一些话放在墙上。我觉得那并不是最值得在意的事情。

我确实考虑过写一本书,而且已经保留了不少平时写的材料。因为我经常写作,所以未来真正开始写书时,可能已经有相当多基础内容可以使用。

不过,当我曾经提出要写书时,董事会告诉我,既然公司还在支付我的薪酬,我就应该专注于 CEO 的工作。

我认为这个要求有道理。等到适当的时候,我再把那些经验整理出来。

家庭背景如何塑造我的价值观

在一个被坚强女性包围的家庭里成长

我的妻子 Judith 是我在哈佛商学院认识的。我们有三个女儿,后来又有了孙辈。

很长一段时间,我们家里几乎到处都是女性:我的妻子、三个女儿、孙女,甚至连家里的狗都是母的。后来终于有了一个男孙。

不过,如果谈到对我影响很大的女性,就不能漏掉我的母亲和祖母。

我的母亲是一位非常坚强的人,也是一位充满关爱的母亲。她接受过弗洛伊德式心理分析理论的影响,因此特别喜欢追问人们行为背后的动机。

当别人做出某种行为时,她经常问:“他们为什么这样做?”

而年轻时的我常常回答:“我不在乎他们为什么这样做。”

但随着年龄增长,我越来越理解她关注人的心理和动机的原因。

我的祖母同样非常坚强。她们给我的影响,不只是要努力工作,还包括如何尊重他人、如何面对困难,以及怎样在必要时坚持原则。

希腊移民家庭教会了我最基本的做人准则

我有四位祖父母,其中三位是希腊移民,另一位出生在美国,具有一部分意大利血统。他们都没有接受过高中教育。

我的那位祖母非常擅长烹饪,小时候我经常吃到她做的希腊菜和意大利菜。

但比食物更重要的,是他们和我的父母共同传递的价值观。

这些价值观并不复杂,也不是什么高深的管理理论。

首先,要正确对待别人。

如果我小时候对服务员、出租车司机或者其他人态度不好,家里一定会非常严厉地教育我。

其次,要在别人受到欺负时挺身而出。

如果看到一个孩子被霸凌,他们会期待我帮助那个受欺负的人,即使这意味着自己可能承担一些风险。

第三,一个人应该有生活目标,而这个目标不必与金钱和商业成就直接相关。

我有一个哥哥是物理学家,另一个哥哥从事教育工作。我的三个女儿也走上了不同道路,有人从事新闻报道,有人进入医疗领域,也有人选择银行业。

我从不认为所有孩子都应该像我一样从事金融。

重要的是,他们能够找到有意义的事情,成为对社会有贡献的人,并努力让世界变得更好。

最后,就是无论做什么,都应该尽自己最大的努力。

不要偷懒,不要满足于表面完成任务,而要不断学习、保持好奇心,并认真对待自己承担的责任。

父母去世之后,我才真正理解家族传承

非常有意思的是,在父母去世之前,如果有人问我,作为希腊移民的孙子对我的性格究竟有什么影响,我可能不知道怎么回答。

我的父母是在同一天去世的,当时他们都在家中,而且相互陪伴。

那是一件非常令人难过的事情,但从另一个角度看,能够在彼此身边走完人生最后一段路,也是非常特别的经历。

他们去世之后,随着时间推移,我才开始更加认真地回顾家族历史,思考祖父母和父母究竟把什么东西传给了我。

我后来发现,那些从小听到的朴素原则,已经深深影响了自己对商业、领导力和人生的判断。

选拔管理者:聪明只是起点,品格和执行力更重要

我希望高管具备怎样的能力

当我选拔最重要的管理团队成员时,当然希望他们聪明、善于分析。

现代金融业务非常复杂,没有足够的智力和分析能力,很难理解其中的风险和机会。

但聪明不能只意味着能够快速完成数学计算或者解读财务报表。

我希望管理者始终能够观察外部世界,了解竞争对手、技术变化、客户需求和行业趋势。

这种能力与好奇心密切相关。

有一次,我要求消费银行业务团队派一批人去中国学习。

一些员工一开始不理解,认为这趟旅行可能是浪费时间。我告诉他们,去了之后自然会发现值得学习的东西。

他们到中国之后,看到了微信、支付宝、腾讯以及当地企业在数字支付和金融科技领域采用的不同方法,才真正理解其他市场正在发生多么有意思的创新。

这就是我希望管理者拥有的开放心态。

不要因为某种商业模式不是自己发明的,或者某种技术出现在不同国家,就认为它没有学习价值。

有判断力,还必须有作出决定的勇气

在专业能力和好奇心之外,我非常重视品格、企业文化、关怀他人的能力以及执行力。

我会把诚实、勤奋、尊重他人等因素视为基本条件,而不是可有可无的附加项。

然后,我还会特别观察一个人有没有韧性和决断力。

一个人可能非常善良,也非常聪明,但真正面对压力时,他可能不愿意做决定。

有些管理者不断分析问题,却迟迟无法采取行动。这种情况有时让我很惊讶,因为他们看起来具备很多优秀特质,最终却无法把事情完成。

还有一些人可能不是团队里分析能力最强的,却特别擅长综合各种意见,抓住关键,最后推动事情落地。

因此,每个人的能力组合不同。有的人擅长分析,有的人擅长观察,有的人擅长综合判断,有的人擅长执行。

优秀团队的价值,就在于把这些不同能力组合起来。

但如果一个人想负责一家大型企业,他至少需要在分析、判断、学习、执行、品格和人际管理等方面具备比较完整的能力。

我们当然需要技术专家,但不能只因为某人非常懂技术,就认定他一定能够成为一名优秀的业务负责人。

面试高管时,我首先想了解他是怎样的人

很多人以为,高级管理者参加我的面试时一定会非常紧张。

我通常会尽量让他们放松,因为我真正想了解的是面试者本人,而不是让他们感到自己正在接受一位大型银行 CEO 的审问。

我经常从一些很普通的话题开始。

例如,你在哪里长大?父母做什么工作?你有几个兄弟姐妹?小时候喜欢什么活动?在哪里上学?什么事情对你影响很大?

我希望先知道这是一个怎样的人,然后再深入讨论他的职业经历。

当然,面试只是人才评估的一部分。

对于真正重要的岗位,我们通常安排不同的人参与面试,因为每位面试官可能观察到不同的特点。

有些人非常擅长面试,能够真正理解候选人的思维方式和品格。

但有些面试官太忙于向候选人展示自己有多么优秀,以至于忘记了深入了解对方。

一个候选人的真实表现,不能只靠一场面试判断

对于高级管理岗位,我们通常已经掌握了大量与候选人有关的信息。

例如,他是否努力工作,是否诚实,是否能够把复杂问题写清楚,是否按时完成承诺。

他的同级同事怎么看待他?下属是否愿意为他工作?他犯错时会不会主动承担责任?

他是否尊重别人?是否经常对员工大喊大叫?在困难时期是否表现可靠?

这些问题往往可以通过长期工作记录、推荐意见和不同来源的反馈进行了解,并不需要等到面对面见到候选人才开始判断。

因此,面试不应该是孤立的仪式,而应当是对一个人长期行为和职业经历的深入验证。

我真正想找的是既有能力又有品格,既愿意学习又能够做出决定,并且能够帮助其他人取得成功的领导者。

人才无处不在:名校并不是唯一的人才来源

我非常重视州立大学和不同地区的人才

主持人曾提到田纳西大学 Knoxville 校区的 Haslam College of Business,并告诉我,那里大约三分之一的本科生对商业教育表现出兴趣。

我认识 Haslam 家族,也非常尊重他们帮助学校发展所做的努力。

我认为,这种商业教育需求非常积极。

很多人习惯把顶尖人才与常春藤盟校联系起来,但我长期以来发现,优秀人才其实分布在美国各个地方。

很多人拥有能力、抱负和工作热情,只是没有获得同样的机会,或者没有被传统招聘体系充分发现。

因此,我不会简单认为来自哈佛或其他名校的毕业生,就天然优于州立大学的学生。

教育背景当然可能提供一些信息,但它不能替代对一个人真实能力、品格和努力程度的判断。

美国很多城市仍然充满创业与发展活力

我很喜欢 James Fallows 关于美国不同城镇的研究与写作。他和妻子曾走访美国许多城市,记录当地社区如何发展经济、教育和社会组织。

我自己在全国出差时,也经常看到类似的情况。

无论是在 Birmingham、Jackson、Huntsville,还是美国其他地方,我都会遇到大量希望发展事业、建立企业、获得好工作的人。

我去过很多历史上黑人高校 HBCU,与那里的学生交流。

这些年轻人希望得到工作机会,希望发展自己的能力,希望进入优秀企业。他们并不像一些媒体描述的那样,只会抱怨或者缺乏工作热情。

我还观察到,在田纳西、佐治亚、北卡罗来纳、南卡罗来纳和得克萨斯等州,一些地区具有非常强烈的创业和发展动力。

从某些角度看,这些地区的经济活力可能比加利福尼亚、密歇根或纽约的一些地方更加明显。

当然,这并不意味着所有人都相同,但这种地区发展趋势值得认真观察。

我希望更多年轻人理解商业和自由企业制度是如何运作的,也希望学校更好地教授公民教育、经济制度和企业经营的基本知识。

这些能力对于一个社会保持长期繁荣非常重要。

Haslam 家族就是一个很好的创业案例。Jim Haslam 建立了 Pilot Flying J,后来这项业务被 Berkshire Hathaway 收购。这种从创业、经营到建立大型企业的经历,本身就值得年轻人研究。

重返办公室:为什么我不认同把远程办公作为普遍标准

我关注的是实际效果,而不是迎合流行观点

我曾经因为支持员工重返办公室而受到很多关注,有些人把我的一次讲话称为“怒斥”或者“激烈批评”。

我知道自己讲话时有时会表现得非常有情绪和力量,但我认为,那次讨论其实是在认真回应一个非常具体的问题。

我并不是为了反对某种流行趋势而故意提出相反意见。

我的原则是先努力找出事实,然后根据事实行动。

如果某种做法确实更好,我愿意接受;如果某种做法看似受欢迎,但实际上正在伤害企业、客户或者员工发展,我也愿意指出问题。

我一直认为,做正确的事,比做眼前方便的事更加重要。

年轻员工需要在真实工作环境中学习

我反对某些远程办公安排,一个非常重要的原因,是它们可能损害年轻员工的培养过程。

大多数人的职业能力,并不是只靠阅读教材或者参加线上培训获得的。

很多技能来自学徒式学习。

你坐在资深同事旁边,观察他如何与客户沟通,如何参加销售会议,如何进行演示,如何处理反对意见,甚至观察他怎样犯错、怎样修正错误。

这些日常细节会逐渐形成个人的职业判断和沟通能力。

如果年轻员工长期不在办公室,他们可能无法获得同样的观察和参与机会。

我们已经发现,一些不经常到办公室的年轻人,在参与客户项目、建立内部人际网络和提升工作能力方面落后了。

他们可能不会被安排到重要客户账户上,也没有机会自然地认识更多同事。

这种损失不仅是工作技能上的,还可能涉及社交能力和职业发展机会。

我甚至担心,长期减少面对面社交可能影响年轻人建立亲密关系的机会,包括认识未来伴侣。

工作场所往往比个人居住社区更加多样化,能够让人接触不同背景、不同想法的人。

如果一代年轻人长期缺少这些经历,其中一些损失可能很难完全弥补。

视频会议无法完全复制面对面管理

我有时把远程会议管理称为“好莱坞方格游戏式管理”,因为屏幕上排列着一格一格的人脸。

但这种沟通与真实坐在同一个会议室里存在明显差异。

假设我不同意 Monica 的某个观点,如果我们面对面交流,我可以通过语气、眼神和身体语言,让她知道我是在认真提出问题,而不是攻击她。

她也可以立即观察我的反应,继续解释自己的想法。

但在一个同时有 12 个人的视频会议中,这种互动容易变得僵硬。

你对某一个人提出的问题,似乎成了对所有人公开发表的评论。

我也注意到,有些人在视频会议期间会查看手机、平板电脑或者处理其他事情,实际上并没有认真参与讨论。

这并不意味着所有远程会议都没有价值,而是说明它们无法完全替代某些面对面管理活动。

远程办公会削弱许多自然发生的后续沟通

我们在办公室开完一整天的管理会议之后,通常不会立即停止讨论。

大家会在走廊里继续交流,有人可能过来告诉我,上午提到的问题已经解决了,也有人可能提出新的风险。

我会让某位高管去找另一位同事讨论,或者直接走到他们的办公室继续推进。

这些自发发生的后续沟通,构成了企业执行效率中非常重要的一部分。

在线上会议里,大家更容易说:“这个问题我们下周再讨论。”

如果星期五很多人不在办公室,团队也可能决定推迟讨论,因为关键人员没有到场。

结果是,原本当天能够解决的问题,被拖延到下一周。

我不希望大型组织因为不断等待下一次正式会议而降低执行速度。

弹性工作与长期远程办公不是同一回事

在推进办公室政策之前,我们实际上认真分析过工作安排的效果。

我们曾经允许部分员工每周在办公室工作三天、在家工作两天。

但实际执行中,有些人变成每周只到办公室两天,在家工作三天,甚至没有遵守原本已经相对宽松的规定。

我认为,这种情况必须被正视。

有些人会说:“远程办公对我来说很有效。”

但这只说明个人感受,并不是关于组织效率的充分分析。

还有人会说:“反正我的团队很多会议都是通过 Zoom 进行的。”

这同样不能自动证明远程办公是最佳安排。

我们应该分析的是,它对客户服务、员工成长、团队协作、管理效率和长期经营结果究竟产生了什么影响。

同时,摩根大通并不是完全反对远程工作。我们有大约 10% 的岗位可以长期在家办公,因为这些岗位的工作性质允许这样做,而且这种安排能够满足业务和客户需要。

我反对的是,在某些岗位明显不适合长期远程工作的情况下,仍然把它当作所有人都应该享有的普遍安排。

工作模式是一项商业选择,不是道德判断

我完全接受不同企业采用不同的经营模式。

有些公司可能选择高度远程化,另一些公司可能要求更多面对面协作。

如果两种方式都符合法律和商业要求,它们完全可以在市场中竞争。

我相信自己的公司因为重视办公室协作而具有优势。其他企业可以不同意,也可以建立完全不同的组织方式。

最终,竞争结果会告诉我们哪些方法更有效。

但这不应该被理解为一个道德问题。

我并不是说选择远程办公的人在道德上有什么错误,也不是说所有企业都必须模仿摩根大通。

我觉得奇怪的是,有些人因为自己希望在家办公,就认为应该要求摩根大通采用同样的制度。

他们完全可以选择其他工作模式不同的企业。

但当我们根据自身业务、员工发展和客户需求作出管理决定时,这项决定应该得到基本尊重。

社会分歧、公共讨论与企业的责任

美国社会并不像媒体画面中那样处处对立

现在美国确实存在很多政治和社会分歧,一些人甚至不敢公开表达不同意见。

但我认为,必须区分媒体呈现的全国性政治争论,与大量普通社区的真实生活。

当我们乘坐巴士走访 Huntsville、Greenville、Raleigh、Durham、Austin、Spokane、Boise 和 Bozeman 等城市时,经常看到的是人们正在积极合作。

当地政府、企业和居民共同讨论怎样改善学校,怎样帮助贫困社区,怎样为少数族裔创造机会,怎样建设步道和河滨公共空间,以及怎样吸引企业和增加就业。

很多地方仍然在增长、创新和改善居民生活。

如果一个人每天主要通过华盛顿、纽约以及 CNN、Fox News 等媒体观察美国,他可能会觉得整个社会始终处于激烈冲突中。

但当你真正走进这些城市,就会发现很多普通人仍然在努力工作、照顾家庭、经营企业和建设社区。

这并不意味着社会分裂不存在,而是说,现实比高度政治化的媒体叙事更加复杂。

面对争议,企业应该坚持原则,也应该根据法律调整政策

摩根大通会认真分析社会争议,并形成自己的立场。

我们长期关注气候、人才多样性以及其他公共议题。

当法律发生变化时,我们当然需要检查自己的政策是否符合新的要求,并在必要时作出调整。

例如,在多样性相关政策方面,法院对种族配额以及某些依据种族作出决定的做法提出了明确限制。

我们一直强调,公司没有采用招聘配额,也不会简单依据肤色决定一个人的录用、薪酬或者晋升。

面对新的法律环境,我们修改了一些政策措辞和具体项目,但这并不意味着停止接触不同背景的人才。

我们依然会到历史上黑人高校招聘,也会继续与西班牙语社区交流,为需要西班牙语服务的客户提供支持。

我认为这些活动本身具有商业价值,也能够帮助公司发现人才、服务客户。

与此同时,我们确实取消了一些原来的项目。

其中一部分原因是,它们已经变得过度官僚化,或者不能实现预期目标。

我们在合规、审计和财务部门也经常做类似的事情:某些流程随着时间不断增加复杂度,却没有带来实际价值,那就应该取消或者重新设计。

我不认为任何项目只要被赋予了一个好的名称,就自动值得永久保留。

我们应该持续检查它究竟有没有效果。

我的办公室管理方式:保持开放,而不是把日历排满

我尽量让员工随时能够找到我

虽然我经常出差,在总部办公室的时间大约只有一半,但只要人在公司,我都会努力保持开放和可接触。

我几乎每天都会回复大多数电话和电子邮件。

如果有人打电话说需要和我讨论 30 分钟,我通常愿意安排。

但对直接向我汇报的高级管理人员,我并不总是设置固定的周期性一对一会议。

原因是我们已经非常熟悉彼此,也建立了充分信任。

他们知道如果遇到问题,可以直接来找我;如果我认为某件事情需要讨论,也会直接联系他们。

我在日历上有意保留一些空白时间。

当然,我也需要参加正式会议、经营评审和其他重要活动,但我不希望一天的每一分钟都被预约占满。

留出空白时间,意味着我可以在办公室里走动,观察团队正在发生什么,也可以随时加入重要讨论。

我更喜欢真实、直接的交流

我经常在办公室楼层走动,走进某位同事的办公室,问问正在处理的问题,或者在走廊里继续讨论上午会议提出的事项。

有时,我会直接走进一个正在进行的会议,加入讨论。

如果某个问题需要更长时间,我可能约相关人员一起吃午饭,或者在下班后喝一杯,继续谈上 45 分钟甚至更久。

我并不认为所有重要交流都必须通过提前两周预约的正式会议完成。

真正重要的是,相关人员是否能够充分表达观点、及时解决问题,以及把后续行动落实下去。

对于已经非常成熟、工作表现优秀的高管,我也没有必要频繁干预。

他们知道什么时候需要找我,我也知道什么时候应该提出自己的意见。

如果能够与历史人物进行一次私人谈话

我最想见的人是 Abraham Lincoln

如果能够与历史上任何一个人进行一次深入交流,无论对方是否还活着,我大概会选择 Abraham Lincoln。

我读过很多关于林肯的书,越了解他,就越欣赏他的智慧和品格。

他既有很高的智力,也有很强的情商。他能够思考极其复杂的问题,同时理解不同人的动机和情绪。

他也是一位非常善于运用语言的人,能够用简洁、有力量的表达解释重大问题,而且还非常幽默。

更重要的是,他在美国历史上极其困难的时期承担了领导责任。

在国家面临分裂、战争和巨大压力的时候,他仍然努力维持国家统一,并作出很多极其艰难的决定。

我很想了解,他究竟怎样思考问题,怎样处理不同意见,怎样在高压环境中保持判断能力。

我一直喜欢历史,特别是在休假时,经常阅读大量历史书籍。因为历史能够让我们理解,许多今天看起来全新的问题,其实都有过去的经验可以参考。

最有价值的私人讨论,往往涉及艰难的人事决定

如果回顾自己职业生涯中最重要的一些私人讨论,我很难只选择某一次会议。

真正重要的交流,很多都与艰难的人事决定有关。

例如,我们需要判断某个人是否适合某个岗位,是否应该调整管理团队,或者怎样处理复杂的组织关系。

我通常不会只听取一个人的意见,就立即作出决定。

有时,我会先见三个人,听取不同观点,然后思考一段时间,再见另外三个人。

新的信息可能让我重新理解原来的问题,于是我又会回头找到最早交流过的人,继续追问。

这个过程很像一层一层剥洋葱。

你原本以为自己已经理解了选择,后来却发现还有其他因素没有考虑。

你需要不断深入,才能弄清楚真正可行的选项是什么,以及相关人员是否真的具备承担责任的能力。

对我而言,这些看似普通的谈话,往往比一次公开演讲更能影响公司的未来。

继任与退休:什么时候应该离开 CEO 岗位

我没有设定一个绝对明确的退休日期

外界一直关心我什么时候会卸任摩根大通 CEO,以及谁会成为下一任领导者。

我目前没有给出一个确定的时间表。

在我看来,继任应该同时满足两个条件:继任者已经做好准备,而且确实到了我应该离开的时候。

这两个因素需要结合起来考虑。

如果未来我不再担任 CEO,董事会可能希望我继续担任董事长一段时间,也许是几年,但具体安排仍然需要由董事会决定。

而且,新任 CEO 上任之后,他或她也应该对未来的治理安排拥有适当的话语权。

我的目标不是无限期地保留权力,而是确保公司能够顺利完成领导层过渡。

下一任 CEO 不一定是最聪明的人,而应该是最好的领导者

我认为下一任 CEO 需要具备很多我们已经讨论过的品质。

他或她必须聪明,但仅仅聪明远远不够。

更重要的是品格、责任心、好奇心、工作投入程度、尊重他人的能力,以及让整个团队发挥最大潜力的能力。

我见过许多非常聪明的人,但他们不一定能够有效管理组织。

有些人可能在专业技术上远远超过我,我也会非常愿意承认这一点。

但领导者的工作,不是证明自己在每个领域都比下属优秀。

更好的比喻是体育教练。

一位优秀教练不一定是球场上技术最强的人,却可以通过合理安排、指导、激励和组织,让整支球队打出远超个人能力简单相加的表现。

有时,一个不合适的球员可能破坏整个团队的表现;而一位优秀教练能够让不同类型的人形成真正的协作。

因此,最聪明的领导者,未必是智商最高的人,而可能是最善于释放他人能力的人。

我预计未来的 CEO 很可能来自公司内部,因为我们拥有非常优秀的人才梯队。

但作为一项管理纪律,我们也会认真考虑外部候选人。

真正重要的是找到最适合公司的人,而不是事先把所有可能性排除掉。

离开 CEO 岗位之后,我还想做什么

写书、教学,以及继续学习

我并不认为退休意味着从此什么都不做。

我很可能会写一本书,把职业生涯中积累的经验、判断和教训整理下来。

我平时写了很多东西,因此已经拥有不少材料。等到真正有时间时,我希望能够认真完成它。

我也希望参与教学。

主持人曾邀请我到田纳西大学的 Haslam College of Business 授课,我对此很感兴趣。

我不一定能长期住在那里,但完全愿意去上一些课,和学生讨论商业案例、领导力、风险管理以及企业经营。

我很喜欢案例教学,因为真实商业案例没有那么多简单、标准化的答案。学生必须理解背景、分析不同选择,再考虑决策后果。

我认为,这是一种很好的学习方法。

至于主持人提议的高尔夫球或者麻将,我没有特别大的兴趣,也不打算因为退休就突然培养这些爱好。

我希望帮助真正需要改善的企业和慈善机构

目前,我没有在其他上市公司董事会任职,因为这可能带来利益冲突,也需要投入大量时间。

但未来,如果我非常喜欢某家公司的业务和团队,也许愿意加入它的董事会。

我同样有兴趣帮助一些慈善机构改善治理和经营。

世界上有不少优秀的慈善组织,拥有很有意义的使命,却可能因为管理不善、战略不清晰或者治理结构存在问题而陷入困境。

如果我能够担任董事长,帮助它们寻找合适的董事、调整战略、改善组织结构,并让机构重新发挥作用,我会觉得这是一件非常值得做的事情。

我不希望只是挂名坐在董事会里,定期开会,却不产生任何实际贡献。

此外,我也可能与朋友一起投资或者经营企业。

也许未来会租一间办公室,研究收购机会,投资一些公司,参与实际经营。

如果我的女儿或者女婿愿意一起做,我也会很高兴。

但我绝不会强迫他们参与我的事业。他们应该有自己的选择。

事实上,我已经有一些朋友在开展类似活动,只是因为目前的职位和利益冲突限制,我不能参与。

等到适当的时候,这些可能都会成为人生下一阶段的一部分。

新闻业的价值:让公众真正理解复杂世界

我非常尊重新闻工作者,但希望新闻业减少标题党

我对新闻业一直很有兴趣,也非常尊重记者的工作。

我认为,记者不仅仅是向普通公众传递信息,他们也在教育那些真正影响社会决策的人。

参议员、众议员、州长以及他们的工作人员,都会通过新闻报道了解经济、企业和公共政策。

这些人的判断可能影响大量人的生活,因此新闻质量非常重要。

当然,我也经常批评媒体行业的一些问题。

现在有太多为了吸引点击量而设计的内容,也有太多未经充分验证的信息被反复传播。

但这些问题并不改变新闻业本身的重要性。

我希望新闻机构能够投入更多资源,帮助读者深入理解复杂问题,而不是只提供一些快速、情绪化或者缺乏背景的判断。

与 Jeff Bezos 的友谊,让我更关注《华盛顿邮报》

我和 Jeff Bezos 认识很多年了。最早我们曾经讨论过亚马逊总裁的机会,后来一直保持友谊。

我非常欣赏他,也逐渐认识了他的妻子 Lauren。前不久我和 Judith 还参加了他们的婚礼。

Jeff 现在不仅是一位企业家,也是《华盛顿邮报》的所有者。

我偶尔会与《华盛顿邮报》的编辑们交流,也向 Jeff 提出过一些关于报纸运营和报道方向的想法。

在我看来,全球真正具有国际影响力的几家英语新闻机构,包括《纽约时报》、《华尔街日报》、《金融时报》和《华盛顿邮报》。

它们都非常重要,也都还有继续改善的空间。

例如,美国主流报纸对国际事务,特别是国际企业和金融商业活动的报道,我认为仍然不够充分。

全球经济正在发生大量复杂变化,但美国普通读者未必能够通过日常新闻充分理解这些变化。

我希望主要新闻机构能够提供更多有深度的国际商业报道。

长篇深度报道不能被快速新闻完全取代

我一直很喜欢真正深入的新闻调查和长篇报道。

过去,我有时会组织小型沙龙式晚宴,让不同背景的人围绕某个重要问题进行深入讨论。

这种交流的价值在于,大家不需要在几分钟内形成结论,也不用把复杂问题压缩成几个适合传播的观点。

同样,新闻机构应该给记者足够时间,让他们真正研究一个主题,理解背景,寻找证据,并向公众解释复杂问题的结构。

我认为,优秀新闻机构不仅要告诉公众发生了什么,还应该尽可能解释为什么会发生、哪些因素导致了问题,以及真正的解决方案可能是什么。

例如,学生贷款问题不应该只停留在“是否应该减免贷款”这样的简单争论上。

我们需要理解学生贷款制度究竟在哪些地方出了问题,哪些政策需要修复,哪些规则应该改变,什么样的人应该得到债务减免,以及为什么。

这些问题都需要严肃分析,而不能只给出一句政治口号。

住房负担能力同样如此。

关于经济增长和住房供给的讨论,例如《Abundance》一书所涉及的问题,值得通过深入研究来理解。

教育改革也一样。

我们知道某些高中教育模式有效,也知道有些做法长期没有取得理想结果。

但如果我们只是反复说“学校存在问题,必须改革”,却不愿意具体研究哪些方法有效、哪些没有效果、为什么有效,以及怎样真正实施,就不可能获得持续改善。

我希望未来有机会参与推动这类深入的公共讨论。

至于是否会与 Jeff Bezos 在新闻领域开展某种合作,我并没有确定计划,但确实有不少想法。

无论通过写作、支持深度报道、参与讨论,还是帮助新闻机构提高经营能力,我都希望能够让公众获得更准确、更完整、更有价值的信息。


结语:人生真正重要的是持续学习、承担责任,并让他人变得更好

回顾我的职业生涯,我经历过被解雇,也经历过重新开始;参与过大量并购与企业整合,也领导过复杂的组织转型;面对过金融危机、监管压力、全球经济变化,以及两次直接威胁生命的疾病。

这些经历让我越来越清楚,职业生涯并不是一条始终向上的直线。

一个人可能在某个阶段获得巨大的成功,也可能在下一阶段遭遇非常严重的挫折。

真正重要的是,遇到困难之后,能否承认现实,保持理性,认真检视自己的错误,并继续行动。

在企业管理上,我始终相信几项基本原则:认真研究事实,理解风险,尊重员工和客户,持续保持好奇心,并且在必要时作出艰难决定。

我不希望成为一个只会发表观点,却不愿承担结果的领导者。

我希望公司里每个人都能有机会表达真实想法,能够在自己的岗位上不断学习,也能够得到应有的尊重。

优秀的管理不应该让员工依赖某一位特别聪明的领导者,而应该帮助整个组织形成判断、学习和执行的能力。

在个人生活上,我始终认为,家庭不能被当作职业成功之后才有时间照顾的事情。

工作当然重要,我也一直热爱工作。但如果一个人希望陪伴家人,就应该主动为他们安排时间,并接受这种选择所需要付出的机会成本。

两次严重疾病还让我意识到,我们无法假设自己拥有无限的时间。

如果有一天我离开摩根大通,我仍然希望继续写作、教学、投资、帮助企业和慈善机构解决问题,也希望把自己的经验传递给年轻人。

最终,我并不认为人生最值得追求的是一个头衔、一份财富,或者别人是否把你的名言挂在墙上。

我更在乎自己有没有努力做好应该做的事情,有没有尊重和帮助身边的人,有没有为家庭尽到责任,以及有没有通过工作让企业、社区和国家变得更好。

我希望始终保持好奇心,诚实面对问题,尽最大努力完成自己承担的责任,并让身边的人有机会发挥他们最好的能力。