第364篇:技术写作与案例文档编写能力

关键词

技术写作、案例文档、文档规范、技术传播、写作框架、Markdown、结构化写作、技术博客


一、为什么技术写作重要

1.1 文档的价值

技术文档的价值链条:

对个人:

■ 倒逼知识体系化 ■ 提升表达能力 ■ 建立个人品牌 ■ 沉淀经验资产 ■ 晋升评审加分项

对团队:

■ 降低沟通成本 ■ 加速新人上手 ■ 避免重复踩坑 ■ 统一运维规范 ■ 构建组织知识库

对行业:

■ 推进技术标准化 ■ 共享最佳实践 ■ 培养技术人才 ■ 构建技术生态

1.2 网络工程师的写作困境

常见写作痛点:

❌ "技术会做,写不出来" └─ 有实战经验但无法结构化表达 ❌ "怕写错或被质疑" └─ 完美主义导致迟迟不动笔 ❌ "写出来没人看" └─ 不知道读者需要什么 ❌ "不知道写什么" └─ 觉得日常工作"没什么好写的" ❌ "写了但质量不高" └─ 缺乏写作框架和方法


二、技术写作核心原则

2.1 金字塔原理

金字塔写作原则:

                结论先行
                ┌──────┐
                │ 核新 │
                │ 论点 │
                └──┬───┘
论点 A 论点 B 论点 C
论据 论据 论据
--- --- --- --- ---

原则 1:结论先行 —— 开头给出核心结论 原则 2:以上统下 —— 上层观点统领下层论据 原则 3:归类分组 —— 相关内容归为一组 原则 4:逻辑递进 —— 按时间/结构/程度排序

2.2 读者思维

站在读者角度思考:

写作前问自己五个问题:

  1. 读者是谁? └─ 新手/同行/领导/客户
  2. 读者想得到什么? └─ 知识/方法/经验/解决方案
  3. 读者当前水平? └─ 需要多少背景知识
  4. 读者会怎么读? └─ 精读/扫读/查阅
  5. 读完后读者能做什么? └─ 解决某个问题/学到某种方法

2.3 结构化表达

技术文档的 MECE 结构:

分类方式 1:时间顺序

问题发现 → 排查过程 → 根因定位 → 解决方案 → 验证确认 → 复盘总结

分类方式 2:结构分解

物理层 → 链路层 → 网络层 → 传输层 → 应用层

分类方式 3:维度划分

技术维度 / 管理维度 / 流程维度 短期措施 / 长期方案

分类方式 4:对比结构

方案 A vs 方案 B vs 方案 C 优点 / 缺点 / 适用场景


三、技术文档类型与写法

3.1 故障案例

故障案例写作模板:

  ┌──────────────────────────────────────────┐
  │  标题:[故障现象] + [根因]               │
  │  例:BGP 路由丢失导致跨域业务中断        │
  │                                           │
  │  一、故障现象(100 字)                   │
  │  发生了什么、影响范围、严重级别          │
  │                                           │
  │  二、排查过程(主体)                     │
  │  按时间线叙述,每条记录                   │
  │    ├ 操作:做了什么                       │
  │    ├ 现象:看到了什么                     │
  │    └ 结论:排除了什么/确认了什么          │
  │                                           │
  │  三、根因分析(核心)                    │
  │  为什么发生、触发条件                     │
  │                                           │
  │  四、解决方案                             │
  │  怎么修复、配置/命令                      │
  │                                           │
  │  五、预防措施                             │
  │  监控/配置规范/自动化检查                 │
  └──────────────────────────────────────────┘

  写作要点:
  ├ 用时间+操作格式,让读者能复现排查过程
  ├ 关键命令输出要附上,但不要全量粘贴
  ├ 每个排查步骤都要有结论(排除了什么)
  └ 根因要说清楚"为什么"而不仅是"是什么"

3.2 技术方案

技术方案写作模板:

  ┌──────────────────────────────────────────┐
  │  标题:[项目名称] + [技术方案]           │
  │  例:XX 数据中心 Spine-Leaf 架构升级方案 │
  │                                           │
  │  一、背景和需求(Why)                    │
  │  为什么要做、现有问题、业务需求          │
  │                                           │
  │  二、方案概述(What)                     │
  │  一句话说明方案、核心思路                │
  │                                           │
  │  三、方案设计(How)                      │
  │  架构图、技术选型、关键配置              │
  │                                           │
  │  四、方案对比                             │
  │  备选方案、优劣势、推荐理由              │
  │                                           │
  │  五、实施计划                             │
  │  阶段划分、时间节点、回退方案            │
  │                                           │
  │  六、风险评估                             │
  │  可能的问题、应对措施                    │
  │                                           │
  │  七、TCO 分析                             │
  │  投入成本、运维成本、ROI 预估            │
  └──────────────────────────────────────────┘

  写作要点:
  ├ 方案文档是写给决策者看的
  ├ 先给结论再展开细节
  ├ 用图表表达复杂关系
  └ 每个方案都要有风险和成本分析

3.3 技术博客

技术博客写作模板:

  ┌──────────────────────────────────────────┐
  │  标题:吸引眼球但不要标题党              │
  │  例:一次 BGP 路由黑洞排查纪实          │
  │                                           │
  │  开头(Hook):                           │
  │  用场景/问题/数据吸引读者                │
  │  例:"凌晨 3 点,监控告警响了..."       │
  │                                           │
  │  正文:                                    │
  │  第 1 段:交代背景(为什么重要)          │
  │  第 2 段:技术原理简介                    │
  │  第 3 段:问题现象和排查过程             │
  │  第 4 段:根因和解决方案                  │
  │  第 5 段:思考和总结                      │
  │                                           │
  │  结尾:                                    │
  │  总结核心观点、引导讨论                  │
  ├                                           │
  │  附件:关键命令输出、参考链接            │
  └──────────────────────────────────────────┘

  写作要点:
  ├ 开头要抓人,不要"本文介绍了..."
  ├ 能用截图别用文字
  ├ 每段一个核心观点
  └ 结尾要有"所以呢"——给读者留下什么

3.4 SOP 操作手册

SOP 写作模板:

  ┌──────────────────────────────────────────┐
  │  标题:[操作类型] + SOP                   │
  │  例:设备版本升级 SOP                    │
  │                                           │
  │  前置条件:                                │
  │  ├ 设备信息(型号/版本/序列号)          │
  │  ├ 所需材料(软件包/工具/账号)          │
  │  ├ 风险评估和回退方案                    │
  │  └ 审批确认(谁批准了)                  │
  │                                           │
  │  操作步骤(按时间顺序):                 │
  │  步骤号 | 操作 | 预期结果 | 异常处理     │
  │                                           │
  │  后置检查:                                │
  │  ├ 业务验证清单                          │
  │  ├ 监控确认                              │
  │  └ 文档更新                              │
  └──────────────────────────────────────────┘

  写作要点:
  ├ 每一步都要有"预期结果"
  ├ 新人按步骤操作也能完成
  ├ 异常处理不要"找老员工"
  └ 定期验证 SOP 的准确性

四、技术写作工具

#!/usr/bin/env python3
"""
技术写作辅助工具
"""

from dataclasses import dataclass
from typing import List, Optional
from datetime import datetime
import re


@dataclass
class ArticleSection:
    """文章段落"""
    title: str
    content: str
    word_count: int = 0
    readability_score: float = 0.0


@dataclass
class Article:
    """文章"""
    title: str
    keywords: List[str]
    sections: List[ArticleSection]
    created_at: str = ""
    word_count: int = 0

    def __post_init__(self):
        self.created_at = datetime.now().strftime("%Y-%m-%d")
        self.word_count = sum(s.word_count for s in self.sections)


class TechnicalWriter:
    """技术写作助手"""

    def __init__(self):
        self.articles: List[Article] = []

    def add_article(self, article: Article):
        self.articles.append(article)

    def check_readability(self, text: str) -> dict:
        """检查可读性"""
        sentences = re.split(r'[。!?\n]', text)
        sentences = [s.strip() for s in sentences if s.strip()]

        total_chars = len(text)
        total_sentences = len(sentences)
        avg_sentence_length = total_chars / max(total_sentences, 1)

        # 技术术语密度
        tech_terms = [
            "BGP", "OSPF", "VXLAN", "EVPN", "MPLS", "TCP", "UDP",
            "配置", "协议", "路由", "交换", "接口", "邻居", "故障"
        ]
        term_count = sum(
            text.count(term) for term in tech_terms
        )
        term_density = term_count / max(total_chars, 1) * 100

        # 长句检测(超过 80 字)
        long_sentences = [
            s for s in sentences if len(s) > 80
        ]

        return {
            "total_chars": total_chars,
            "total_sentences": total_sentences,
            "avg_sentence_length": round(avg_sentence_length, 1),
            "tech_term_density": round(term_density, 2),
            "long_sentences_count": len(long_sentences),
            "long_sentences": long_sentences[:5],
            "readability": (
                "优秀" if avg_sentence_length < 30
                else "良好" if avg_sentence_length < 50
                else "需要改进"
            )
        }

    def generate_outline(
        self, topic: str, doc_type: str
    ) -> List[str]:
        """生成文章大纲"""
        templates = {
            "故障案例": [
                "一、故障现象",
                "  1.1 问题描述",
                "  1.2 影响范围",
                "  1.3 严重级别",
                "二、排查过程",
                "  2.1 信息采集",
                "  2.2 假设验证",
                "  2.3 根因定位",
                "三、解决方案",
                "  3.1 修复措施",
                "  3.2 验证确认",
                "四、复盘总结",
                "  4.1 根本原因",
                "  4.2 预防措施",
                "  4.3 改进计划",
            ],
            "技术方案": [
                "一、项目背景",
                "  1.1 现状分析",
                "  1.2 需求分析",
                "二、方案设计",
                "  2.1 总体架构",
                "  2.2 关键技术",
                "  2.3 关键配置",
                "三、方案对比",
                "  3.1 备选方案",
                "  3.2 优劣势分析",
                "  3.3 推荐方案",
                "四、实施计划",
                "  4.1 阶段划分",
                "  4.2 风险应对",
                "五、成本分析",
            ],
            "技术博客": [
                "一、引子(Hook)",
                "二、背景介绍",
                "三、技术原理",
                "四、实战过程",
                "五、总结与思考",
            ],
            "SOP": [
                "一、前置条件",
                "  1.1 设备信息",
                "  1.2 所需材料",
                "  1.3 风险评估",
                "二、操作步骤",
                "  2.1 步骤一",
                "  2.2 步骤二",
                "  ...",
                "三、后置检查",
                "四、异常处理",
                "五、回退方案",
            ],
        }

        base = [f"# {topic}"]
        base.append("")
        base.extend(templates.get(doc_type, ["大纲待定"]))
        base.append("")
        base.append("---")
        base.append("")
        return base

    def review_article(self, article: Article) -> List[str]:
        """审阅文章"""
        issues = []

        # 检查标题
        if len(article.title) > 50:
            issues.append(f"⚠️ 标题过长({len(article.title)}字),建议控制在 30 字以内")

        # 检查关键词
        if len(article.keywords) < 3:
            issues.append("⚠️ 关键词不足 3 个,建议补充")

        if len(article.keywords) > 10:
            issues.append("⚠️ 关键词超过 10 个,建议精简")

        # 检查段落数量
        if len(article.sections) < 3:
            issues.append("⚠️ 段落数不足 3 个,建议增加内容层次")

        # 检查每段字数
        for section in article.sections:
            readability = self.check_readability(section.content)

            if readability["long_sentences_count"] > 3:
                issues.append(
                    f"⚠️ 「{section.title}」存在 "
                    f"{readability['long_sentences_count']} 个长句,建议拆分"
                )

            if readability["readability"] == "需要改进":
                issues.append(
                    f"⚠️ 「{section.title}」可读性需要改进,"
                    f"平均句长 {readability['avg_sentence_length']} 字"
                )

        # 总字数
        if article.word_count < 500:
            issues.append(f"⚠️ 总字数过少({article.word_count}字),建议扩充到 1000 字以上")

        if not issues:
            issues.append("✅ 文章质量良好,没有发现明显问题")

        return issues

    def suggest_improvements(self, text: str) -> List[str]:
        """建议改进"""
        suggestions = []

        # 检查被动语态
        passive_patterns = [
            r"被[^动]", r"受到", r"遭到", r"予以",
            r"进行", r"做出", r"给予",
        ]
        for pattern in passive_patterns:
            matches = re.findall(pattern, text)
            if matches:
                suggestions.append(
                    f"💡 检测到 {len(matches)} 处被动/冗余表达"
                    f"(如「{matches[0]}」),建议改为主动语态"
                )

        # 检查模糊词
        vague_words = [
            "大约", "可能", "大概", "也许", "通常",
            "一般", "基本", "比较", "相对",
        ]
        for word in vague_words:
            count = text.count(word)
            if count > 3:
                suggestions.append(
                    f"💡 「{word}」出现 {count} 次,建议量化或删除"
                )

        # 检查口语化表达
        casual_phrases = [
            "说白了", "简单来说", "对吧", "好吧",
            "嗯", "那个", "然后呢",
        ]
        for phrase in casual_phrases:
            if phrase in text:
                suggestions.append(
                    f"💡 检测到口语化表达「{phrase}」,建议替换为书面语"
                )

        # 检查序号格式
        if re.search(r'[1-9])|\([1-9]\)', text):
            suggestions.append(
                "💡 建议统一序号格式为「1.」「2.」或「一、」「二、」"
            )

        return suggestions

    def create_writing_template(self, doc_type: str) -> str:
        """创建写作模板"""
        templates = {
            "故障案例": """# 标题:[故障现象] + [根因]

## 关键词
故障、排查、[相关技术]

---

## 一、故障现象

**时间:** YYYY-MM-DD HH:MM
**级别:** P1/P2/P3/P4
**影响范围:** [多少用户/设备受影响]

[描述故障表现]

## 二、排查过程

### 2.1 第一轮排查(HH:MM-HH:MM)
**操作:** 检查了什么
**现象:** 看到了什么
**结论:** 排除了什么

### 2.2 第二轮排查(HH:MM-HH:MM)
**操作:** 检查了什么
**现象:** 看到了什么
**结论:** 定位到问题

## 三、根因分析

[为什么发生] → [触发条件] → [根本原因]

## 四、解决方案

**操作步骤:**
1. 步骤一
2. 步骤二
3. 验证确认

**关键配置:**

[相关配置]


## 五、预防措施

- [ ] 添加监控告警
- [ ] 更新配置规范
- [ ] 补充自动化检查
- [ ] 更新知识库

---""",
            "技术博客": """# 标题:吸引眼球但不要标题党

> 一句话总结全文核心观点

## 引子

[用场景/疑问/反常识吸引读者]

## 背景

[为什么这个话题重要]

## 技术原理

[用通俗语言解释核心概念]

## 实战过程

[故事化叙述,关键步骤附命令输出]

## 总结与思考

[核心收获 + 可以做得更好的地方]

---""",
        }

        return templates.get(
            doc_type,
            "暂不支持该文档类型的模板"
        )


def main():
    """主函数"""
    writer = TechnicalWriter()

    print("技术写作辅助工具")
    print("=" * 60)

    # 1. 生成大纲
    print("\n1. 大纲生成示例:")
    print("\n输入主题:400GE 数据中心升级最佳实践")
    print("文档类型:技术博客")
    outline = writer.generate_outline(
        "400GE 数据中心升级最佳实践", "技术博客"
    )
    print("\n生成的大纲:")
    for line in outline:
        print(f"  {line}")

    # 2. 可读性检查
    print("\n" + "=" * 60)
    print("\n2. 可读性检查示例:")

    sample_text = (
        "当网络发生故障时,我们需要按照系统化的方法进行排查。"
        "首先应该确认故障现象和影响范围,然后收集相关信息,"
        "接着列出可能的故障原因并逐一验证,最后定位根因并修复。"
        "在整个排查过程中,我们应该保持数据驱动的思维方式,"
        "不要仅凭经验猜测,而是通过抓包、查看日志等方式获取客观证据。"
        "同时,二分法可以帮助我们快速缩小排查范围。"
    )

    readability = writer.check_readability(sample_text)
    for key, value in readability.items():
        print(f"  {key}: {value}")

    # 3. 文章审阅
    print("\n" + "=" * 60)
    print("\n3. 文章审阅示例:")

    article = Article(
        title="一次 VXLAN 负载不均故障排查",
        keywords=["VXLAN", "负载均衡", "ECMP", "哈希"],
        sections=[
            ArticleSection(
                "故障现象",
                "某数据中心 Spine-Leaf 架构下,部分链路利用率达到 85% 而其他链路只有 20%",
                word_count=30
            ),
            ArticleSection(
                "排查过程",
                "检查了 ECMP 哈希算法配置,发现使用的是默认对称哈希。"
                "查看大象流分布,确认是由于多条大流哈希到同一条链路上。"
                "调整哈希因子后分布趋于均衡。",
                word_count=65
            ),
        ]
    )
    issues = writer.review_article(article)
    print("\n审阅结果:")
    for issue in issues:
        print(f"  {issue}")

    # 4. 生成模板
    print("\n" + "=" * 60)
    print("\n4. 模板生成:")
    template = writer.create_writing_template("故障案例")
    print(template[:500] + "...")


if __name__ == "__main__":
    main()

五、写作技巧与规范

5.1 用词规范

技术写作用词规范:

✅ 推荐:

■ 使用:配置 / 部署 / 排查 / 验证 ■ 量化:延迟 50ms / 带宽 100Gbps ■ 肯定:是 / 不是 / 确认 / 排除 ■ 简洁:删除"进行""做出""予以"

❌ 避免:

■ 模糊:大概 / 可能 / 据说 / 通常 ■ 冗余:进行配置(→配置) ■ 口语:说白了 / 对吧 / 然后呢 ■ 主观:我觉得 / 我感觉 / 我认为

5.2 图表使用

图表选择指南:

  场景                 推荐方式
  ───────────────────────────────────
  网络拓扑             架构图(draw.io/Visio)
  排查过程             流程图/时间线
  数据对比             柱状图/表格
  性能变化             折线图
  趋势预测             散点图+趋势线
  因果关系             鱼骨图
  协议交互             时序图
  配置示例             代码块

  图表编写原则:
  ├ 有图就有说明(图注)
  ├ 配色不超过 3 种主色
  ├ 字体统一、字号清晰
  └ 数据图标注单位和刻度

5.3 代码块规范

代码块使用规范:

  ✅ 正确的做法:
  ┌──────────────────────────────────────────┐
  │  # 带语言标识的代码块                    │
  │  ```python                               │
  │  def check_health():                     │
  │      pass                                │
  │  ```                                     │
  │                                           │
  │  # 命令带注释说明目的                    │
  │  ```bash                                 │
  │  # 查看 BGP 邻居状态                     │
  │  display bgp peer                        │
  │  ```                                     │
  │                                           │
  │  # 输出只截取关键部分                    │
  │  ```                                      │
  │  BGP local router ID : 10.1.1.1         │
  │  Peer          AS    State    Up/Down    │
  │  10.2.2.2    65001  Established 2w3d    │
  │  ```                                      │
  └──────────────────────────────────────────┘

  ❌ 错误的做法:
  ┌──────────────────────────────────────────┐
  │  # 无标识的代码块                        │
  │  ```                                     │
  │  display bgp peer                        │
  │  ```                                     │
  │                                           │
  │  # 全量粘贴命令输出                      │
  │  # 覆盖数十行无关信息                    │
  │                                           │
  │  # 命令无注释                            │
  │  # 读者不知道这是做什么的                │
  └──────────────────────────────────────────┘

5.4 常见错误

新手常见写作错误:

  错误 1:开头铺垫过长
  ┌──────────────────────────────────────────┐
  │  ❌ "随着网络技术的快速发展..."          │
  │  ❌ "在当今数字化转型的浪潮下..."        │
  │  ✅ 直接说问题,不要"随着"开头          │
  └──────────────────────────────────────────┘

  错误 2:内容没有重点
  ┌──────────────────────────────────────────┐
  │  ❌ 想写太多,什么都浅                   │
  │  ✅ 一篇文章只讲一个核心问题             │
  └──────────────────────────────────────────┘

  错误 3:没有"所以呢"
  ┌──────────────────────────────────────────┐
  │  ❌ 现象描述完就结束                      │
  │  ✅ 给出结论和建议                       │
  └──────────────────────────────────────────┘

  错误 4:术语不解释
  ┌──────────────────────────────────────────┐
  │  ❌ 默认读者都知道所有术语               │
  │  ✅ 首次出现时简要解释                   │
  └──────────────────────────────────────────┘

六、写作习惯养成

从零开始的技术写作路径:

  第 1 阶段:写给自己(1-3 个月)
  ┌──────────────────────────────────────────┐
  │  每周写一篇排障记录                      │
  │  格式不限,重点是记录                    │
  │  每篇 300-500 字即可                     │
  │  坚持 12 周                              │
  └──────────────────────────────────────────┘

  第 2 阶段:写给小团队(3-6 个月)
  ┌──────────────────────────────────────────┐
  │  整理成结构化案例                        │
  │  加入分析和思考                          │
  │  在团队内部分享                          │
  │  收集反馈修改                            │
  └──────────────────────────────────────────┘

  第 3 阶段:写给行业(6-12 个月)
  ┌──────────────────────────────────────────┐
  │  发到技术社区(知乎/公众号/CSDN)       │
  │  关注阅读量和评论                        │
  │  根据反馈持续改进                        │
  │  建立个人品牌                            │
  └──────────────────────────────────────────┘
高效写作习惯:

  ┌──────────────────────────────────────────┐
  │  每日:写 100 字工作日志                 │
  │  每周:写一篇故障/项目记录               │
  │  每月:整理一篇完整技术文章              │
  │  每季:汇总沉淀到知识库                  │
  │  每年:复盘写作成果                      │
  │                                           │
  │  写作流程:                                │
  │  1. 定选题(30 分钟)                     │
  │  2. 列大纲(30 分钟)                     │
  │  3. 写初稿(2 小时,不追求完美)         │
  │  4. 改二稿(1 小时,删减优化)           │
  │  5. 终审(30 分钟,检查)                │
  │  6. 发布                                  │
  └──────────────────────────────────────────┘

七、总结

技术写作能力要点:

  1. 核心原则
     └─ 金字塔结构:结论先行
     └─ 读者思维:为谁写
     └─ 结构化表达:分类清晰

  2. 文档类型
     └─ 故障案例:时间线 + 关键命令
     └─ 技术方案:Why → What → How
     └─ 技术博客:Hook → 故事 → 总结
     └─ SOP:步骤 + 预期 + 异常

  3. 写作规范
     └─ 用词准确、量化表达
     └─ 图表辅助、代码块规范
     └─ 避免冗余、主动语态
     └─ 每篇一条主线

  4. 持续改进
     └─ 从排障记录开始
     └─ 反馈驱动优化
     └─ 建立写作习惯
     └─ 分享创造价值

  记住:技术写作能力 = 技术深度 × 表达能力
  写是最好的学习方式——写出来才是真正理解

下篇预告:第365篇《网络技术的未来与AI融合》——展望网络技术的未来演进方向,探讨AI与网络融合的趋势。


下篇预告:第365篇《网络技术的未来与AI融合》——展望网络技术的未来演进方向,探讨AI与网络融合的趋势。