🐎 第9章 集腋成裘:Plugins 生态
📄 一句话概括

LSP 是语言服务器协议:编辑器问它「这个符号在哪儿定义」,它直接回位置。 实测在五十个文件里找一处定义:扫文件要读进一千二百字符,问符号表只要四十。 它省的不是时间,是窗口。

📝 本章和前面几章的关系

前面八节讲的是「怎么把能力组织起来」,这一节讲「以后还缺什么」。 这一节也是第 9 章的最后一篇,本章小结并在末尾。

一、LSP 能提供什么

跳转定义:这个函数在哪儿定义的。省掉一轮搜索。 查找引用:谁调用了它。改之前必须知道。 诊断:这里有类型错误。不用跑一遍才知道。

补全与重命名:改名字要动哪些地方。批量改的可靠来源。 四样能力有一个共同点:它们都是「符号层面」的问题,答案短、确定、不需要读全文。

二、真跑:五十个文件里找一个定义

演示里真造了五十个文件,真扫一遍找一处定义:读进来一千二百字符。 而符号表只回一行:文件名、行号、签名,四十字符左右。三十倍起步的差距。 注意时间不是重点(扫一遍只用几毫秒),重点是「读进来多少」——那才是窗口成本。

而且这些内容后面还要一直带着,所以一次搜索的成本会被后续每一轮放大。

三、为什么这对 agent 特别重要

人找定义时只翻一两个文件,扫五十个也不太疼。agent 的疼在「读进来就占窗口」。 演示里每个文件只有两三行,扫完才一千二百字符。真实仓库一个文件几百行,五十个就是几万字符。 那时候一次搜索就能吃掉小半个窗口。

这正是 10.4 节那个题目的伏笔:在有限窗口里驾驭大仓库,靠的是「少读」,不是「读得快」。

四、LSP 的代价

第一,得有语言服务器。冷门语言、老项目未必有。 第二,它要索引。项目刚拉下来时索引没建完,问它也是空。 第三,它是「语言级」的,理解不了业务语义。找定义行,找「这段代码为什么这么写」不行。

所以它是补充,不是替代:能在符号层面回答的问题交给它,其余还得读代码。

五、本章小结

第 9 章讲 Plugin。九节收在一句话上:它把「一堆配置」变成一个能装、能升、能审的包。 9.1 定位:解决一致性,不是解决方便;分界线是「改一次要通知几个人」。 9.2 结构:一份清单加几个可选目录,清单里 version 是给「出事那天」用的。

9.3 生命周期:装、用、升、停、卸;卸载不可逆,所以装之前就要问清它放哪儿。 9.4 命名空间:同名的东西靠前缀区分,插件优先级最低。 9.5 团队包:六个文件就够,缺 README 和钩子这类「不报错」的缺最容易被忽略。

9.6 分发:手工、私有市场、组织级三档,看「要管到什么程度」。 9.7 设计原则:单一职责排第一,因为另外三条都建立在它上面。 9.8 该不该打包:四个问题;形状没稳定就暂缓,别过早打包。

9.9 LSP:省的不是时间,是「为了找一个定义而读进来的几十个文件」。

六、动手 Demo:找一处定义:扫五十个文件和问一次符号表

LSP 是「语言服务器协议」:编辑器问它「这个符号在哪儿定义」,它直接回位置。 这里真造五十个文件、真扫一遍,对比「扫文件」和「问符号表」读进来多少。

for fn in sorted(os.listdir(tmp)):
    if not fn.endswith(u".py"):
        continue
    txt = get(tmp, fn)
    chars += len(txt)          # 读进来就得占窗口

实跑输出:

--------------------------------------------------------------------
找一处定义:扫五十个文件和问一次符号表
--------------------------------------------------------------------

  LSP 是「语言服务器协议」:编辑器问它「这个符号在哪儿定义」,它直接回位置。
  对 agent 来说,它省掉的不是时间,是「为了找一个定义而读进来的几十个文件」。

  ① LSP 能提供什么
  --------------------------------------------------------------------
| 能力 | 回答什么问题 | 省掉什么 |
|---|---|---|
| 跳转定义 | 这个函数在哪儿定义的 | 省掉一轮搜索 |
| 查找引用 | 谁调用了它 | 改之前必须知道 |
| 诊断 | 这里有类型错误 | 不用跑一遍才知道 |
| 补全与重命名 | 改名字要动哪些地方 | 批量改的可靠来源 |


  ② 真跑:五十个文件里找一个定义
  --------------------------------------------------------------------
| 做法 | 读了几处 | 读进来多少 | 占多少窗口 |
|---|:---:|:---:|:---:|
| 扫文件 | 50 个 | 1237 字符 | 309 token |
| 问符号表 | 1 次 | 约 40 字符 | 10 token |

  真扫一遍用了 0.005 秒,扫了 50 个文件。命中的是 m30.py。
  而符号表只回一行:文件名、行号、签名。三十倍起步的差距。
  注意这里的时间不是重点——重点是「读进来多少」,那才是窗口成本。

  ③ 为什么这对 agent 特别重要
  --------------------------------------------------------------------
  人找定义时只翻一两个文件,扫五十个也不太疼。agent 的疼在「读进来就占窗口」。
  演示里每个文件只有两三行,扫完才一千二百字符。真实仓库一个文件几百行,五十个就是几万字符。
  那时候一次搜索就能吃掉小半个窗口,而且这些内容后面还要一直带着。
  这正是 10.4 节那个题目的伏笔:在有限窗口里驾驭大仓库,靠的是「少读」,不是「读得快」。

  ④ LSP 的代价
  --------------------------------------------------------------------
  第一,得有语言服务器。冷门语言、老项目未必有。
  第二,它要索引。项目刚拉下来时,索引没建完,问它也是空。
  第三,它是「语言级」的,理解不了业务语义。找定义行,找「这段代码为什么这么写」不行。
  所以它是补充,不是替代:能在符号层面回答的问题交给它,其余还得读代码。

  ⑤ 本章小结
  --------------------------------------------------------------------
  第 9 章讲 Plugin。九节收在一句话上:它把「一堆配置」变成一个能装、能升、能审的包。
  9.1 定位:解决一致性,不是解决方便;分界线是「改一次要通知几个人」。
  9.2 结构:一份清单加几个可选目录,清单里 version 是给「出事那天」用的。
  9.3 生命周期:装、用、升、停、卸;卸载不可逆,所以装之前就要问清它放哪儿。
  9.4 命名空间:同名的东西靠前缀区分,插件优先级最低。
  9.5 团队包:六个文件就够,缺 README 和钩子这类「不报错」的缺最容易被忽略。
  9.6 分发:手工、私有市场、组织级三档,看「要管到什么程度」。
  9.7 设计原则:单一职责排第一,因为另外三条都建立在它上面。
  9.8 该不该打包:四个问题;形状没稳定就暂缓,别过早打包。
  9.9 LSP:省的不是时间,是「为了找一个定义而读进来的几十个文件」。
  下一章收全书:成本、调试、安全、大仓库、指令、团队落地、SDD 生态,最后一张全局图。
  ! 这里的符号表是概念对照,不是真实 LSP 调用;真跑的是「扫五十个文件要读进来多少」。
  ! token 按英文代码四个字符一个估,和中文文本的比例不同。

①LSP 四样能力:跳转定义、查找引用、诊断、补全与重命名。 共同点是「符号层面」:答案短、确定、不需要读全文。 ②真扫五十个文件读进来一千二百字符,符号表只回一行约四十字符。三十倍起步的差距。 时间不是重点(扫一遍几毫秒),重点是「读进来多少」——那才是窗口成本,而且后面每一轮都要带着它。 ③演示里每个文件只有两三行;真实仓库一个文件几百行,五十个就是几万字符,一次搜索能吃小半个窗口。 ④LSP 的代价:要有语言服务器、要等索引建完、而且它理解不了业务语义。所以它是补充不是替代。

30 秒实验

  1. 把文件数从五十加到二百,重跑一遍。扫文件那一行的字符数怎么涨?符号表那一行呢? 这说明差距跟什么有关?
  2. 把每个文件的内容从两行加到二十行,重跑一遍。「读进来多少」这一列的差距变成多少倍?
  3. 给「问符号表」那一行加上「冷启动要建索引」,重跑一遍。什么场景下 LSP 反而更慢?

常见误区

  1. 以为 LSP 的价值是「快」。它真正的价值是「少读」,省的是窗口不是时间。
  2. 拿 LSP 去回答业务语义问题。它只懂符号,不懂「这段代码为什么这么写」。
  3. 项目刚拉下来就问 LSP。索引没建完,问它也是空。
  4. 以为扫文件省钱。扫进来的内容会一直占着窗口,后面每一轮都在付这笔钱。
  5. 把 LSP 当成替代读代码。它是补充:符号层面交给它,其余还得读。
自测三问(点开对答案) 1. LSP 能提供哪四样能力? —— 跳转定义、查找引用、诊断、补全与重命名。都在符号层面,答案短而确定。 2. LSP 对 agent 的真正价值是什么? —— 少读。扫五十个文件要读进一千二百字符,符号表只回四十,省的是窗口不是时间。 3. LSP 有哪些局限? —— 需要语言服务器、需要索引建完、只懂符号不懂业务语义。所以是补充不是替代。

第 9 章到此收尾。下一章收全书:成本、调试、安全、大仓库、指令、团队落地、生态,最后一张全局图。

相关笔记