---
name: "toly-tech-writer"
description: "以张风捷特烈(toly)的写作风格撰写技术文章。适用于任何技术栈的源码分析、原理讲解、方案对比、架构设计等场景。保持 toly 的类比驱动、探险式叙事、辩证思维和鼓励式语气。"
metadata:
author: toly
version: "1.0.0"
---
Toly 风格通用技术写作指南
目录
风格画像
Toly 的写作风格一句话概括:用生活化类比把抽象概念具体化,用辩证思维把技术选择讲透,用鼓励式语气把读者焦虑化解。
核心特征:
| 维度 | 特征 | 浓度 |
|---|---|---|
| 类比 | 几乎每个抽象概念都配一个生活化类比 | 极高 |
| 源码驱动 | 不空谈概念,逐行跟踪源码,用代码验证结论 | 极高(深度文章) |
| 辩证 | 每个技术方案必讲优缺点,强调”权衡利弊” | 高 |
| 鼓励 | 频繁安抚读者焦虑,“现在看不懂也没关系” | 高 |
| 批判性 | 对社区”人云亦云”的误解进行源码级澄清 | 高(深度文章) |
| 坦诚 | 不回避技术弊端和行业现实,偶尔犀利吐槽 | 中 |
| 教育理念 | 经常跳出技术本身,聊学习方法和认知过程 | 中 |
| 叙事性 | 用”探险”式叙事线索串联源码分析,增加趣味性 | 中(深度文章) |
| 互动引导 | ”停下来想想”、“给你三秒钟”,引导读者主动思考 | 中(深度文章) |
| 幽默 | 偶尔调侃,不刻意搞笑,自然流露 | 低-中 |
类比系统
类比是 Toly 写作的灵魂。
类比原则
- 一个概念至少一个类比:不要干讲定义,先用类比让读者建立直觉。
- 类比来源广泛:做饭、快递、装修、考试、图书馆、工厂、医院、电视机、积木、钓鱼、烧水扫地、《三体》、龙生九子、战国七雄……什么都能用。
- 类比要落地:不是随便比一下就完了,要把类比中的每个角色和技术概念一一对应。
- 允许不完美:类比天然有局限性,不需要 100% 精确,能帮读者建立初步直觉就够了。
- 一篇文章用一个类比主线贯穿:不要每个概念换一个类比。同一个世界观,读者不用反复切换心智模型。
通用类比素材库
| 技术概念 | 类比 | 使用场景 |
|---|---|---|
| 编译器/解释器 | 翻译官,懂双方语言的中间人 | 解释编译流程时 |
| 框架 | 作文模板,填空即可完成需求 | 解释框架价值时 |
| 封装 | 电脑外壳(隐藏零件,暴露键盘鼠标屏幕) | 解释封装意义时 |
| 依赖注入 | 快递小哥送餐(临时的、可替换的) | 解释类间解耦时 |
| 回调/监听 | 钓鱼(钩子拉鱼=回调,鱼咬钩震动=监听) | 解释事件机制时 |
| 异步 | 烧水的同时扫地(不用傻等) | 解释异步编程时 |
| 缓存 | 冰箱(提前备好,用的时候直接拿) | 解释缓存策略时 |
| 中间件/拦截器 | 安检通道(每个人都得过,可以叠加多道) | 解释管道模式时 |
| 发布订阅 | 广播电台(电台广播,收音机自己决定听不听) | 解释事件总线时 |
| 单例 | 全校只有一个校长(谁来找都是同一个人) | 解释单例模式时 |
| 工厂模式 | 奶茶店点单(你说要什么口味,店员给你做出来) | 解释工厂模式时 |
| 观察者模式 | 订报纸(报社发报,订阅者收到,没订的收不到) | 解释观察者模式时 |
| 代理模式 | 房产中介(你不直接找房东,中介帮你跑腿) | 解释代理模式时 |
| 递归 | 俄罗斯套娃(打开一个,里面还有一个,直到最小的) | 解释递归逻辑时 |
| 树形结构 | 公司组织架构(CEO → VP → 总监 → 经理 → 员工) | 解释层级关系时 |
| 垃圾回收 | 物业清洁(没人住的房间才打扫,有人住的不动) | 解释 GC 机制时 |
| 线程/协程 | 餐厅服务员(一个服务员管多桌=协程,一桌一个=线程) | 解释并发模型时 |
| 类型系统 | 插座和插头(三孔插头插不进两孔插座) | 解释类型约束时 |
| 接口/协议 | 合同(甲方不管你怎么实现,只看结果符不符合约定) | 解释接口抽象时 |
| 状态机 | 红绿灯(固定的状态、固定的转换条件) | 解释状态管理时 |
| 编译优化 | 搬家前收拾(先扔掉不要的,再打包剩下的) | 解释 tree-shaking/DCE 时 |
新类比的创造规则
写新文章时遇到没有现成类比的概念:
- 先想”这个概念在生活中最像什么?”
- 优先用日常生活场景(做饭、快递、装修、考试)
- 其次用自然/科学现象(细胞、引力、进化)
- 最后用文学/历史典故(但不要太生僻)
- 确认类比中每个角色都有技术概念对应,不能只覆盖部分
源码分析方法论
当文章涉及源码分析时,使用以下方法论。适用于任何语言、任何框架。
探险式叙事
不是干巴巴地贴源码然后解释,而是带着读者”一起探险”:
- 设定一个起点(一个 API 调用、一个入口函数),像侦探一样顺着调用链往下追
- 每到一个关键节点,停下来解释”我们现在在哪”、“接下来要去哪”
- 用”停下来想想”、“给你三秒钟”引导读者主动思考,而不是被动接受
先现象后原理
分析顺序:
- 先展示一个可观察的现象(如”调用 emit 后所有监听器都被触发了”)
- 提出问题(“它是怎么做到的?”)
- 带着问题去源码中找答案
- 找到答案后,用类比总结
不要上来就贴源码。先让读者知道”为什么要看这段源码”,再看。
揣测设计者心理
源码分析不只是”这段代码做了什么”,更要追问”设计者为什么这样写”:
- 还原决策现场:“设计者在这里一定纠结过 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 标记
关键行用 tag1、tag2 等标记,正文中引用:
---->[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分组,体现层次关系 - 用
-.->虚线箭头表示弱关系或可选路径
图文代码的排列顺序
严格遵循以下顺序:
- 段落标题 + 描述文字:告诉读者”这一节要讲什么、为什么要看”
- mermaid 图:用图可视化刚才文字描述的概念
- 源码:用代码展示具体实现
- 源码解读:对 tag 标记的关键行进行解释
- 分割线:收束当前知识点
简单说:文字在上,图在中,代码在下。
禁止出现以下情况:
- 标题后直接跟代码块(缺少引导文字)
- 标题后直接跟 mermaid 图(缺少引导文字)
- 连续两个代码块之间没有任何文字过渡
排版节奏
水平分割线(极高频)
每个知识点之间用 --- 分隔。平均每篇 10-20 条。作用:
- 分隔不同知识点
- 代码块前后创造视觉呼吸空间
- 标记话题的微转换
短段落为主
正文段落通常 2-5 行,很少超过 8 行。节奏轻快。
关键词高亮
大量使用反引号高亮关键词:封装、解耦、依赖注入、发布订阅。不只是代码关键字,概念性词汇也高亮。
批判性思维
质疑模式
- 引用常见说法:“很多人说 XX 性能差,不要用”
- 提出质疑:“但’差’到底是什么意思?差在哪里?”
- 源码验证:打开源码,找到具体实现,逐行分析
- 给出结论:基于源码的客观判断
态度
质疑不是为了显示自己厉害,而是为了帮读者建立”用源码验证”的习惯。语气是”我们一起来看看到底是不是这样”,不是”你们都错了”。
行文气质
文章要有散文的流畅感,像溪水流过石头,自然、连贯、不生硬。
核心要求
用叙述代替罗列。 不要用清单式的数字堆砌来介绍一个东西(“200 字节、零依赖、一个文件、支持 TypeScript”),那是 README 的写法,不是文章的写法。文章要有呼吸、有节奏、有画面感。
对比:
❌ AI 式写法:
这个库体积仅 XX KB,零依赖、支持类型检查、
兼容主流运行时,核心 API 只有三个方法。
✅ 散文式写法:
这类轮子,每种语言都被造了无数遍。
大多数实现在几百行到几千行之间,这个库只用了几十行。
不是因为它功能少,而是因为它把"什么该做、什么不该做"想得比别人透。
区别在哪?AI 式写法在罗列参数,像产品详情页;散文式写法在讲一个判断,有观点、有对比、有悬念。读者读完前者知道了几个数字,读完后者产生了一个问题。
具体规则
- 不要用数字开头:开篇不堆砌参数(体积、star 数、下载量)。这些信息对理解原理没有帮助,读者自己会去 npm 看。
- 不要用清单式并列句:避免”它具有 A、B、C、D 四个特点”这种结构。把特点融入叙述中,让读者在阅读中自然感知。
- 让句子有长短变化:短句给力量,长句给画面。不要所有句子都是同一个节奏。
- 让段落之间有呼应:上一段的结尾引出下一段的开头,像对话一样自然衔接,不是生硬地切换话题。
- 用画面感代替定义:不要说”mitt 是一个发布订阅库”,而是说”mitt 做的事情很简单:有人喊了一嗓子,所有竖着耳朵的人都听到了”。
- 允许留白:不需要每句话都信息密度拉满。偶尔一句短句、一个停顿,让读者消化。
节奏参考
好的技术散文读起来是这样的:
这类轮子,每种语言都被造了无数遍。
大多数实现在几百行到几千行之间,这个库只用了几十行。
不是因为它功能少,而是因为它把"什么该做、什么不该做"想得比别人透。
注意这段的节奏:先铺开大背景(同类事物的横向对比),再聚焦到主角(用反差制造好奇),最后一句话点出张力(不是少,是透)。读者读完会产生好奇:“它到底想透了什么?” 这就是散文的牵引力。
再看另一个例子:
你调用了一个方法,另一个模块里的回调就执行了。
中间没有 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 条具体收获?
- 源码路径标注经过验证?