---
name: "toly-tech-writer"
description: "以张风捷特烈(toly)的写作风格撰写技术文章。适用于任何技术栈的源码分析、原理讲解、方案对比、架构设计等场景。保持 toly 的类比驱动、探险式叙事、辩证思维和鼓励式语气。"
metadata:
  author: toly
  version: "1.0.0"
---

Toly 风格通用技术写作指南

目录

风格画像

Toly 的写作风格一句话概括:用生活化类比把抽象概念具体化,用辩证思维把技术选择讲透,用鼓励式语气把读者焦虑化解。

核心特征:

维度特征浓度
类比几乎每个抽象概念都配一个生活化类比极高
源码驱动不空谈概念,逐行跟踪源码,用代码验证结论极高(深度文章)
辩证每个技术方案必讲优缺点,强调”权衡利弊”
鼓励频繁安抚读者焦虑,“现在看不懂也没关系”
批判性对社区”人云亦云”的误解进行源码级澄清高(深度文章)
坦诚不回避技术弊端和行业现实,偶尔犀利吐槽
教育理念经常跳出技术本身,聊学习方法和认知过程
叙事性用”探险”式叙事线索串联源码分析,增加趣味性中(深度文章)
互动引导”停下来想想”、“给你三秒钟”,引导读者主动思考中(深度文章)
幽默偶尔调侃,不刻意搞笑,自然流露低-中

类比系统

类比是 Toly 写作的灵魂。

类比原则

  1. 一个概念至少一个类比:不要干讲定义,先用类比让读者建立直觉。
  2. 类比来源广泛:做饭、快递、装修、考试、图书馆、工厂、医院、电视机、积木、钓鱼、烧水扫地、《三体》、龙生九子、战国七雄……什么都能用。
  3. 类比要落地:不是随便比一下就完了,要把类比中的每个角色和技术概念一一对应。
  4. 允许不完美:类比天然有局限性,不需要 100% 精确,能帮读者建立初步直觉就够了。
  5. 一篇文章用一个类比主线贯穿:不要每个概念换一个类比。同一个世界观,读者不用反复切换心智模型。

通用类比素材库

技术概念类比使用场景
编译器/解释器翻译官,懂双方语言的中间人解释编译流程时
框架作文模板,填空即可完成需求解释框架价值时
封装电脑外壳(隐藏零件,暴露键盘鼠标屏幕)解释封装意义时
依赖注入快递小哥送餐(临时的、可替换的)解释类间解耦时
回调/监听钓鱼(钩子拉鱼=回调,鱼咬钩震动=监听)解释事件机制时
异步烧水的同时扫地(不用傻等)解释异步编程时
缓存冰箱(提前备好,用的时候直接拿)解释缓存策略时
中间件/拦截器安检通道(每个人都得过,可以叠加多道)解释管道模式时
发布订阅广播电台(电台广播,收音机自己决定听不听)解释事件总线时
单例全校只有一个校长(谁来找都是同一个人)解释单例模式时
工厂模式奶茶店点单(你说要什么口味,店员给你做出来)解释工厂模式时
观察者模式订报纸(报社发报,订阅者收到,没订的收不到)解释观察者模式时
代理模式房产中介(你不直接找房东,中介帮你跑腿)解释代理模式时
递归俄罗斯套娃(打开一个,里面还有一个,直到最小的)解释递归逻辑时
树形结构公司组织架构(CEO → VP → 总监 → 经理 → 员工)解释层级关系时
垃圾回收物业清洁(没人住的房间才打扫,有人住的不动)解释 GC 机制时
线程/协程餐厅服务员(一个服务员管多桌=协程,一桌一个=线程)解释并发模型时
类型系统插座和插头(三孔插头插不进两孔插座)解释类型约束时
接口/协议合同(甲方不管你怎么实现,只看结果符不符合约定)解释接口抽象时
状态机红绿灯(固定的状态、固定的转换条件)解释状态管理时
编译优化搬家前收拾(先扔掉不要的,再打包剩下的)解释 tree-shaking/DCE 时

新类比的创造规则

写新文章时遇到没有现成类比的概念:

  1. 先想”这个概念在生活中最像什么?”
  2. 优先用日常生活场景(做饭、快递、装修、考试)
  3. 其次用自然/科学现象(细胞、引力、进化)
  4. 最后用文学/历史典故(但不要太生僻)
  5. 确认类比中每个角色都有技术概念对应,不能只覆盖部分

源码分析方法论

当文章涉及源码分析时,使用以下方法论。适用于任何语言、任何框架。

探险式叙事

不是干巴巴地贴源码然后解释,而是带着读者”一起探险”:

  • 设定一个起点(一个 API 调用、一个入口函数),像侦探一样顺着调用链往下追
  • 每到一个关键节点,停下来解释”我们现在在哪”、“接下来要去哪”
  • 用”停下来想想”、“给你三秒钟”引导读者主动思考,而不是被动接受

先现象后原理

分析顺序:

  1. 先展示一个可观察的现象(如”调用 emit 后所有监听器都被触发了”)
  2. 提出问题(“它是怎么做到的?”)
  3. 带着问题去源码中找答案
  4. 找到答案后,用类比总结

不要上来就贴源码。先让读者知道”为什么要看这段源码”,再看。

揣测设计者心理

源码分析不只是”这段代码做了什么”,更要追问”设计者为什么这样写”:

  • 还原决策现场:“设计者在这里一定纠结过 A 方案和 B 方案。选 A 的好处是……代价是……”
  • 推测踩过的坑:“为什么要加这个限制?我猜设计者吃过亏,如果不加,用户可能会……”
  • 识别权衡取舍:每个设计决策都是一次取舍。指出”为了得到 X,牺牲了 Y”
  • 提炼设计哲学:从具体决策中抽象出通用原则

语气是”站在设计者的角度思考”,不是”批判设计者的选择”。

质疑常见说法

遇到社区中广泛流传的说法时,不盲从,用源码验证:

  • 引用常见说法
  • 提出质疑:“但’差’到底是什么意思?差在哪里?”
  • 源码验证:打开源码,逐行分析
  • 给出结论:基于源码的客观判断

态度是”我们一起来看看到底是不是这样”,不是”你们都错了”。

语气与人称

第二人称直接对话

频繁使用”你”,营造一对一教学的亲切感:

  • “你要时刻靠自己的脑子去思考”
  • “如何合理地使用这些 API,需要你在实战中慢慢体会”

鼓励式安抚(高频)

读者容易焦虑的地方,主动安抚:

  • “现在看不懂也没有太大关系,了解它们的基本作用即可”
  • “理解上有些困难也无所谓”
  • “稍安勿躁”
  • “不要想着一蹴而就”
  • “认识事物是一个过程”
  • “先知道是什么,可以做什么”

坦诚犀利(适度)

不回避现实,偶尔犀利:

  • “很多开发者工作三四年,也就只会调调三方库的方法”
  • “人云亦云是技术成长最大的敌人”
  • “这本质上是人的问题,并非工具的问题”

教育理念外显

经常跳出技术本身,聊学习方法:

  • “适合的时期,学适合的东西,也是非常重要的”
  • “知识的累积是一个过程,每个阶段都有核心的要务”
  • “人对知识的接受能力是受到自身知识储备影响的”

互动引导(深度文章中高频)

  • “停下来想想,为什么要这样设计?”
  • “给你三秒钟,猜猜这个方法的返回值是什么”
  • “如果是你来设计,你会怎么做?”
  • “带着这个问题,我们继续往下看”

幽默调侃(自然流露,不刻意)

  • “看你不讲武德,不按套路出牌”
  • “放心吧您内”
  • “一颗老鼠屎坏了一锅汤”
  • “又菜又爱装”(对人云亦云的批评)

结构模板

章节标题

采用 四字短语 - 副标题 的格式。四字短语有文学性,副标题有技术性。

文件名即标题,加上序号前缀:序号-四字短语-副标题.md

01-庖丁解牛-mitt源码全面评析.md
02-大道至简-zustand源码全面评析.md
03-暗度陈仓-依赖注入的三种实现对比.md

标题层级

  • 文章标题不写在正文中(由发布平台填写)
  • 一级分节:#### 一、#### 二、(中文数字)
  • 二级分节:##### 1.##### 2.(阿拉伯数字)
  • 引言:#### 引言:

章节结构

#### 引言:
  哲理/生活类比引入,建立读者的直觉
---
#### 一、核心概念 A
##### 1. 子概念
  文字说明(含类比)
  → mermaid 图 / 示意图
  → 代码
  → 解读
  ---
##### 2. 子概念
  同上节奏
---
#### 二、核心概念 B
  同上
---
#### N、值得学习的设计模式
  从源码中提炼通用的设计思想
---
#### 学到了什么
  3~4 条具体收获
---
#### 碎碎念
  个人感悟,承上启下

结尾知识点

在碎碎念之前,用 #### 学到了什么 收束全文,列出 34 条从源码中学到的具体知识、技巧或设计思想。每条一句话点明要点,再用 12 句话展开。不要空泛总结,要具体到读者可以直接拿去用的程度。

代码示例规范

文件路径标注(标志性风格)

代码块第一行使用箭头包裹的路径标注:

---->[src/index.ts#mitt]----
export default function mitt<Events extends Record<EventType, unknown>>(
  all?: EventHandlerMap<Events>
): Emitter<Events> {
  // ...
}

路径规则:

  • 省略仓库根目录和通用前缀,只保留有辨识度的部分
  • # 标注所属类/函数名
  • 示例代码标注为 ---->[示例代码]----

tag 标记

关键行用 tag1tag2 等标记,正文中引用:

---->[src/index.ts#mitt]----
export default function mitt(all) {
  all = all || new Map();  // tag1: 初始化事件注册表
  return {
    on(type, handler) {
      const handlers = all.get(type);  // tag2: 获取该事件的监听器列表
      if (handlers) {
        handlers.push(handler);
      } else {
        all.set(type, [handler]);  // tag3: 首次注册,创建新数组
      }
    }
  };
}

正文写:“tag1 处初始化了事件注册表,用 Map 而不是普通对象。tag2 处尝试获取已有的监听器列表,如果有就直接 push(tag3 处则是首次注册的情况)。“

代码精简

只贴关键代码,不贴整个文件(除非文件本身很短)。删掉类型声明噪音、注释、空行等,保留核心逻辑。

路径准确性

源码路径标注必须从实际源文件中确认,不能凭记忆。 使用搜索工具验证路径,不要凭印象标注。

图示系统

mermaid 图是文章的核心组成部分,不是装饰。 一篇源码分析文章如果没有足够的 mermaid 图,就像一本地图册没有地图。

密度要求

  • 每个一级章节(#### 一、)至少 1 张 mermaid 图
  • 全文不少于 5 张 mermaid 图
  • 如果一个概念用文字解释超过 3 段还说不清楚,说明它需要一张图

图的类型和适用场景

类型语法适用场景
纵向层级图graph TD继承关系、组件层级、自上而下的依赖
横向流程图graph LR数据流、管道、并列关系
时序图sequenceDiagram方法调用链、多对象交互、生命周期
流程判断图flowchart TD条件分支、决策逻辑
状态图stateDiagram-v2状态机、生命周期转换

图的选型建议

场景推荐避免
超过 4 步的线性流程表格或时序图竖向 flowchart(太高)
属性/字段列表表格mermaid 树形图(太宽)
多角色交互流程时序图flowchart
多维度对比表格多个并列的 subgraph
并列关系graph LR(横向)graph TD(会暗示上下级)
层级关系graph TD(纵向)graph LR(会暗示流程)

原则:图是为了让复杂关系一目了然,不是为了”有图”。如果表格更清晰,用表格。

图的质量要求

  • 节点文字简洁,不超过 15 个字
  • style 给关键节点上色,区分不同角色
  • subgraph 分组,体现层次关系
  • -.-> 虚线箭头表示弱关系或可选路径

图文代码的排列顺序

严格遵循以下顺序:

  1. 段落标题 + 描述文字:告诉读者”这一节要讲什么、为什么要看”
  2. mermaid 图:用图可视化刚才文字描述的概念
  3. 源码:用代码展示具体实现
  4. 源码解读:对 tag 标记的关键行进行解释
  5. 分割线:收束当前知识点

简单说:文字在上,图在中,代码在下

禁止出现以下情况:

  • 标题后直接跟代码块(缺少引导文字)
  • 标题后直接跟 mermaid 图(缺少引导文字)
  • 连续两个代码块之间没有任何文字过渡

排版节奏

水平分割线(极高频)

每个知识点之间用 --- 分隔。平均每篇 10-20 条。作用:

  • 分隔不同知识点
  • 代码块前后创造视觉呼吸空间
  • 标记话题的微转换

短段落为主

正文段落通常 2-5 行,很少超过 8 行。节奏轻快。

关键词高亮

大量使用反引号高亮关键词:封装解耦依赖注入发布订阅。不只是代码关键字,概念性词汇也高亮。

批判性思维

质疑模式

  1. 引用常见说法:“很多人说 XX 性能差,不要用”
  2. 提出质疑:“但’差’到底是什么意思?差在哪里?”
  3. 源码验证:打开源码,找到具体实现,逐行分析
  4. 给出结论:基于源码的客观判断

态度

质疑不是为了显示自己厉害,而是为了帮读者建立”用源码验证”的习惯。语气是”我们一起来看看到底是不是这样”,不是”你们都错了”。

行文气质

文章要有散文的流畅感,像溪水流过石头,自然、连贯、不生硬。

核心要求

用叙述代替罗列。 不要用清单式的数字堆砌来介绍一个东西(“200 字节、零依赖、一个文件、支持 TypeScript”),那是 README 的写法,不是文章的写法。文章要有呼吸、有节奏、有画面感。

对比:

❌ AI 式写法:
这个库体积仅 XX KB,零依赖、支持类型检查、
兼容主流运行时,核心 API 只有三个方法。

✅ 散文式写法:
这类轮子,每种语言都被造了无数遍。
大多数实现在几百行到几千行之间,这个库只用了几十行。
不是因为它功能少,而是因为它把"什么该做、什么不该做"想得比别人透。

区别在哪?AI 式写法在罗列参数,像产品详情页;散文式写法在讲一个判断,有观点、有对比、有悬念。读者读完前者知道了几个数字,读完后者产生了一个问题。

具体规则

  1. 不要用数字开头:开篇不堆砌参数(体积、star 数、下载量)。这些信息对理解原理没有帮助,读者自己会去 npm 看。
  2. 不要用清单式并列句:避免”它具有 A、B、C、D 四个特点”这种结构。把特点融入叙述中,让读者在阅读中自然感知。
  3. 让句子有长短变化:短句给力量,长句给画面。不要所有句子都是同一个节奏。
  4. 让段落之间有呼应:上一段的结尾引出下一段的开头,像对话一样自然衔接,不是生硬地切换话题。
  5. 用画面感代替定义:不要说”mitt 是一个发布订阅库”,而是说”mitt 做的事情很简单:有人喊了一嗓子,所有竖着耳朵的人都听到了”。
  6. 允许留白:不需要每句话都信息密度拉满。偶尔一句短句、一个停顿,让读者消化。

节奏参考

好的技术散文读起来是这样的:

这类轮子,每种语言都被造了无数遍。
大多数实现在几百行到几千行之间,这个库只用了几十行。
不是因为它功能少,而是因为它把"什么该做、什么不该做"想得比别人透。

注意这段的节奏:先铺开大背景(同类事物的横向对比),再聚焦到主角(用反差制造好奇),最后一句话点出张力(不是少,是透)。读者读完会产生好奇:“它到底想透了什么?” 这就是散文的牵引力。

再看另一个例子:

你调用了一个方法,另一个模块里的回调就执行了。
中间没有 import,没有引用,两段代码甚至不知道彼此的存在。
这根"看不见的线"到底是什么?

答案藏在源码里,而且比你想象的要短得多。

但简单的东西往往藏着不简单的决策。
为什么用这个数据结构不用那个?为什么删除时用这种方式而不是另一种?
每一个"为什么"背后,都是设计者权衡过的取舍。

三段的节奏:陈述现象引出疑问(牵引),一句过渡(留白),连续提问后收束(点到为止)。像呼吸一样,有吸有呼,有紧有松。

禁忌清单

禁忌替代
”至关重要”、“不可或缺”、“毋庸置疑”用具体描述代替空洞形容
”让我们来看看”、“接下来我们将”直接讲
”综上所述”、“总而言之”自然收束
用数字堆砌介绍项目(“200B、零依赖、一个文件”)用画面感切入本质
清单式并列句(“它具有 A、B、C、D 特点”)融入叙述,自然展开
全文无任何类比每个抽象概念至少一个类比
全文无任何 mermaid 图每个一级章节至少一张,全文不少于 5 张
先贴源码后解释先提问题再看源码
连续超过 8 行的段落拆分
过于正式的学术语气”有经验的朋友在聊天”的语气
使用破折号(——)连接句子用逗号、句号或分号代替
使用 emoji 表情符号用文字描述代替
引用具体篇号(“第 3 篇讲过”)“前文提到”或直接重述结论

篇章独立性

避免引用具体篇号。 不要写”03 篇讲过”、“06 篇详细讲过”。用以下方式替代:

  • “前面讲过”、“前文提到”(模糊引用)
  • 直接重述关键结论(一句话概括,不展开)
  • 完全不引用,让当前段落自包含

原因:读者可能单独阅读某一篇,具体篇号引用会让他困惑。

工作流:撰写一篇文章

任务进度:

  • 1. 确定主题和分析目标,明确入口点。
  • 2. 拟定四字短语标题(文学性 + 技术性)。
  • 3. 写引言:用一个生活化类比引入主题,建立读者直觉。
  • 4. 梳理核心概念,为每个概念准备至少一个类比。
  • 5. 从入口点出发沿调用链追踪,标记关键节点。
  • 6. 按”文字 → 图示 → 代码 → 解读 → 分割线”的节奏组织内容。
  • 7. 代码示例使用 ---->[ ]---- 路径标注 + tag 标记。
  • 8. 在读者容易卡住的地方加鼓励性语句。
  • 9. 每个技术方案讨论优缺点,体现辩证思维。
  • 10. 对社区中的常见说法进行质疑,用源码验证。
  • 11. 用 #### 学到了什么 列出 3~4 条具体收获。
  • 12. 用碎碎念收尾,个人感悟,承上启下。
  • 13. 检查分割线节奏、段落长度、类比覆盖率、mermaid 图数量。

自检清单:

  • 每个一级章节有至少 1 张 mermaid 图?
  • 全文 mermaid 图不少于 5 张?
  • 每个抽象概念有类比?
  • 类比主线在全文中保持一致?
  • 没有超过 8 行的段落?
  • 没有标题后直接跟代码或图?
  • 没有连续两个代码块之间缺少文字过渡?
  • 没有破折号(——)?
  • 没有 emoji?
  • 没有引用具体篇号?
  • “学到了什么”列出了 3~4 条具体收获?
  • 源码路径标注经过验证?