<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>王忠亮的博客</title><description>软件工程 · 技术分享 · 学习笔记</description><link>https://wzl12345.pages.dev/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.11.0</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年6月7日 17:36:05</lastBuildDate><item><title>LLM 入门学习路线：从零开始的实践记录</title><link>https://wzl12345.pages.dev/posts/llm-learning-roadmap/</link><guid isPermaLink="true">https://wzl12345.pages.dev/posts/llm-learning-roadmap/</guid><description>从零开始的 LLM 入门路线，含精选资源与实战记录。</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这篇文章记录我从零开始入门 LLM（大语言模型）的学习路线和实践过程，包括精选的学习资源、环境搭建经验和实战练习记录。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么学 LLM？&lt;a href=&quot;#为什么学-llm&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;不是跟风。而是意识到：LLM 正在改变软件的形态。从 ChatBot 到 Agent，从 RAG 到 Function Calling，这些不是概念游戏 — 它们是新一代应用的基础设施。所以决定系统性地入门，而不是东一榔头西一棒槌地看碎片文章。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;学习资源清单&lt;a href=&quot;#学习资源清单&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;经过筛选，以下是我认为最值得投入时间的资源：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;精选仓库&lt;a href=&quot;#精选仓库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;仓库&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;状态&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/Shubhamsaboo/awesome-llm-apps&quot; target=&quot;_blank&quot;&gt;Shubhamsaboo/awesome-llm-apps&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Agent、RAG、Voice AI 实战项目集&lt;/td&gt;&lt;td&gt;✅ 已下载&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/microsoft/generative-ai-for-beginners&quot; target=&quot;_blank&quot;&gt;microsoft/generative-ai-for-beginners&lt;/a&gt;&lt;/td&gt;&lt;td&gt;微软 18 课入门，有中文版&lt;/td&gt;&lt;td&gt;📌 已下载&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/mlabonne/llm-course&quot; target=&quot;_blank&quot;&gt;mlabonne/llm-course&lt;/a&gt;&lt;/td&gt;&lt;td&gt;社区公认最好的 LLM 学习路线&lt;/td&gt;&lt;td&gt;📌 待看&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/openai/openai-cookbook&quot; target=&quot;_blank&quot;&gt;openai/openai-cookbook&lt;/a&gt;&lt;/td&gt;&lt;td&gt;OpenAI 官方代码示例&lt;/td&gt;&lt;td&gt;📌 待看&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/punkpeye/awesome-ai-agents&quot; target=&quot;_blank&quot;&gt;punkpeye/awesome-ai-agents&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AI Agent 大全，找灵感用&lt;/td&gt;&lt;td&gt;📌 待看&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;环境搭建&lt;a href=&quot;#环境搭建&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我的开发环境如下：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt;：3.12.9（虚拟环境 venv）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;框架&lt;/strong&gt;：LangChain&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型&lt;/strong&gt;：DeepSeek API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;项目目录&lt;/strong&gt;：&lt;code&gt;~/langchain-demo/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;搭建过程很顺利。Python 虚拟环境用 venv 创建，然后 pip install langchain 就行。DeepSeek 的 API key 放到 .env 文件里，用 python-dotenv 加载。这是基本但干净的项目结构。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;练习记录&lt;a href=&quot;#练习记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. hello_langchain.py — 第一个 LangChain 脚本&lt;a href=&quot;#1-hello_langchainpy--第一个-langchain-脚本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最简单的调用：通过 LangChain 的 ChatOpenAI 接口（设置 base_url 指向 DeepSeek API）完成一次对话。验证了环境的联通性，也确认了 DeepSeek 模型的响应质量。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. test_gen.py — 测试用例自动生成器&lt;a href=&quot;#2-test_genpy--测试用例自动生成器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是第一个有实际价值的练习。写了一个脚本：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;输入：接口描述（API endpoint、参数、返回格式）&lt;/li&gt;
&lt;li&gt;输出：测试用例（正常情况、边界值、异常输入）&lt;/li&gt;
&lt;li&gt;用 LangChain 的 PromptTemplate 做模板化提示词&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;让它生成一个简单的 REST API 测试用例，效果不错。核心就是一个好的 prompt + 模型的理解能力。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. LangChain vs 裸 API — Agent 循环对比&lt;a href=&quot;#3-langchain-vs-裸-api--agent-循环对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;为了理解 LangChain 到底封装了什么，做了一个对比实验：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;裸 API&lt;/strong&gt;：自己维护对话历史，手动拼接系统提示和用户消息，处理 token 计数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LangChain&lt;/strong&gt;：用 ChatMessageHistory 管理上下文，PromptTemplate 做模板，输出解析器处理回复&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;结论：LangChain 的价值在于抽象了通用模式（对话管理、模板、工具调用），但理解底层机制后，小项目用裸 API 更灵活。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. rag_demo.py — 最小 RAG 演示&lt;a href=&quot;#4-rag_demopy--最小-rag-演示&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;RAG（检索增强生成）是目前 LLM 应用最热门的模式之一。做一个最简单的版本：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;用一个小文档库作为知识源&lt;/li&gt;
&lt;li&gt;用户提问后，先把问题向量化，检索最相关的文档片段&lt;/li&gt;
&lt;li&gt;把检索到的片段作为上下文注入 prompt，让模型基于这些信息回答&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这个练习让我理解了 RAG 的核心链路：&lt;strong&gt;文档 → 分块 → 向量化 → 存储 → 检索 → 注入 → 生成&lt;/strong&gt;。LangChain 在这条链路上提供了不错的工具封装。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;我的学习策略&lt;a href=&quot;#我的学习策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;不求多，求准。不求全记，求用得上的能调。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;遇到一个问题 → 去找对应的工具/文章 → 动手实现 → 提取能复用的模式&lt;/li&gt;
&lt;li&gt;不追求看完所有课程，追求能上手做东西&lt;/li&gt;
&lt;li&gt;用日记把学到的记下来，需要的时候能搜到就行&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;下一步计划&lt;a href=&quot;#下一步计划&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;系统学习微软 generative-ai-for-beginners 课程&lt;/li&gt;
&lt;li&gt;深入 Agent 方向：工具调用、多 Agent 协作&lt;/li&gt;
&lt;li&gt;做一个有点实际价值的项目&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;LLM 入门并不神秘。搭环境、调 API、写 demo，和学任何新技术没什么两样。真正有价值的是动手做东西的时候踩的坑和想通的事 — 那些才是自己的。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>逻辑学笔记：思维检票员的自我修养</title><link>https://wzl12345.pages.dev/posts/logic-notes/</link><guid isPermaLink="true">https://wzl12345.pages.dev/posts/logic-notes/</guid><description>关于逻辑的本质、信息与推理、宏大叙事的拆解。</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;学逻辑不是为了变得伶牙俐齿，而是为了在自己心里装一个检票员：「你这段推理的票，给我看看。」&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h2&gt;为什么会有逻辑&lt;a href=&quot;#为什么会有逻辑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;逻辑存在，是因为人需要在信息不完全的情况下做出正确判断。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果人全知全能，不需要逻辑 — 所有问题直接有答案。但人不是。人活在信息永远不够的世界里，逻辑就是那个从已知推到未知的桥梁。&lt;/p&gt;&lt;p&gt;三个前提决定了逻辑的必要性：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;世界是有规律的&lt;/strong&gt;：如果世界是彻底的随机混沌，逻辑不存在也没用。但世界有因果、有结构，逻辑是对这种规律的抽象和形式化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人脑有极限&lt;/strong&gt;：人一次只能处理有限信息，容易偏误、被情绪带跑。逻辑是人给自己造的拐杖 — 按规则推，至少不容易错。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;沟通需要共识&lt;/strong&gt;：没有逻辑的争论，最终比的是嗓门和拳头。逻辑提供了可复现、可检查、可反驳的讨论框架。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;一个比喻：逻辑之于思维，就像语法之于语言。不学语法也能说话，但容易语无伦次。学了语法不一定能说出漂亮话，但至少不会把意思说反。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;逻辑的本质：从已知推出大概率正确的结论&lt;a href=&quot;#逻辑的本质从已知推出大概率正确的结论&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;逻辑的本质可以精确定义为：&lt;strong&gt;从已知信息出发，按规则推演，得到一个在当前信息下最可能为真的结论。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;注意这个定义里的几个关键点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;从已知出发&lt;/strong&gt; — 逻辑不能无中生有。前提是空的，推不出任何东西。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按规则推演&lt;/strong&gt; — 不是拍脑袋，是遵循推理规则。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最可能为真&lt;/strong&gt; — 逻辑不生产真理，逻辑生产「可信度排名」。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;为什么不是100%？演绎逻辑（三段论）在封闭系统里可以到100%，但现实世界里的逻辑给的从来不是一个确信值。信息变了，结论也可以变。科学就是这个过程 — 不断逼近，从不宣称绝对正确。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;「既定」陷阱：从答案反推原因&lt;a href=&quot;#既定陷阱从答案反推原因&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一个非常重要的逻辑洞察是「既定推理」：已知一个正确的结果，反推它成立的条件和原因，并且保证推理链条干净。&lt;/p&gt;&lt;p&gt;这种逆向推理本身不是问题 — 科学中经常用。但这里藏着一个巨大的坑：&lt;strong&gt;偷换条件&lt;/strong&gt;。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;有人把条件换成相似但不一致的东西，却声称能推出同样的答案。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;例子：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;正确：如果天下雨，地会湿。地湿了 → 可能是因为下过雨。&lt;/li&gt;
&lt;li&gt;偷换：如果天下雨，地会湿。地湿了 → 所以下过雨（忽略了洒水车、水管爆裂、露水等可能）。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;更隐蔽的版本：你用A推导出B，他把A悄悄换成A’（看着像A但不一样），然后说「你看，按你的逻辑，B成立」。实际上前提已经不是你的前提了。&lt;/p&gt;&lt;p&gt;一个判断标准：&lt;strong&gt;当你觉得「好像有道理但又说不上哪里不对」— 那就大概率是条件被偷换了。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;黄金屋理论：信息量与推理能力&lt;a href=&quot;#黄金屋理论信息量与推理能力&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一个核心观点：信息是推理的燃料。没有信息，逻辑再强也是空转。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;信息越多，推理能力越强。&lt;/strong&gt; 巧妇难为无米之炊 — 推理能力再强，前提是空的，推不出任何东西。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;足够多的信息可以自我纠错。&lt;/strong&gt; 单一信息源容易骗人，但当你读了10本不同立场的书，矛盾的地方会自己打架。信息量大了，错误会自己暴露。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;获取 ≠ 内化。&lt;/strong&gt; 获取是眼睛扫过去了，内化是能用自己的话讲出来。中间差着一道工序：加工。读书本身不消化，读完停下来想想、写写笔记、跟人聊聊 — 才是内化。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;策略建议：不求多，求准。不求全记，求用得上的能调。你不是要装下所有东西，而是要知道什么东西在哪能找到。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;案例分析：马哲「量变引起质变」的逻辑拆解&lt;a href=&quot;#案例分析马哲量变引起质变的逻辑拆解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;「量变引起质变」—— 这个命题听起来没毛病，但仔细拆解会发现漏洞。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;「一定条件」是个空洞的占位符&lt;a href=&quot;#一定条件是个空洞的占位符&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;水烧到100°C变成水蒸气 → 「一定条件」= 达到沸点。你每天练琴突然某天弹好了一首曲子 → 「一定条件」= 练习量突破技能阈值。但马哲把它写成「一定条件下」时，相当于说：就是会发生变化的那个点。这不是解释，是重新描述了一遍现象，然后贴了个标签。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;性质变化 vs 身份变化&lt;a href=&quot;#性质变化-vs-身份变化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这个区分非常关键：水 → 水蒸气是性质变了（液态→气态），但H₂O这个身份没变。你今天投了50份简历都没回音，投到第51份有了面试 — 这是身份变了（从待业变成有面试的人），但你性质没变，能力没突变。&lt;/p&gt;&lt;p&gt;量变引起质变这个命题模糊了两种「变」：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;渐变&lt;/strong&gt;：量在积累，性质在慢慢滑动&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;突变&lt;/strong&gt;：积累到某个阈值，咔嚓一下换了个状态&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;两者的机制完全不同。渐变不需要「一定条件」，它一直在变。突变需要触发条件，但这个条件往往不是量变本身带来的（水到100°C不是水的选择，是环境气压决定的）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;终极追问：量变本身不保证质变&lt;a href=&quot;#终极追问量变本身不保证质变&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;量变只保证量变。质变需要另一个独立的条件来触发。&lt;/strong&gt; 一匹马吃草，吃再多草也不会变成牛。量再多，如果系统结构没变，质变不会发生。&lt;/p&gt;&lt;p&gt;马哲把「在一定条件下」轻轻带过了，但这个条件恰恰是整个命题里最关键的变量。对自然界（水烧开），度和关节点是可测量的。对社会领域（阶级跃迁），度和关节点无法精确计算 — 你只能事后回头看才知道在哪，事前无法预判。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;宏大叙事的悖论&lt;a href=&quot;#宏大叙事的悖论&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果把上述分析方法放大到一个完整的哲学体系——比如马克思主义哲学——会发现一个深刻的悖论：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;前提A&lt;/strong&gt;：马克思主义是半成品，需要后人发展&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前提B&lt;/strong&gt;：发展不能动摇根本原则&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;问&lt;/strong&gt;：如果根本原则本身就是错的，这个发展是在干什么？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;答案很尴尬：在错误的地基上盖装修。&lt;/p&gt;&lt;p&gt;「我是半成品，你们来发展我」— 这句话听起来极为谦逊、开放、科学。但它暗含了一个不可质疑的前提：我的方向是对的，你们只是帮我补细节。如果地基错了，装修得再漂亮，楼也是歪的。&lt;/p&gt;&lt;p&gt;这不是马哲特有的问题，是所有封闭的宏大叙事共有的结构：它在系统内部留了一个更新接口，但这个接口只能打补丁，不能改底层代码。一旦有人想改底层代码，系统会说：「你这是歪曲，不是发展。」&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;科学 vs 信仰：分界线在哪&lt;a href=&quot;#科学-vs-信仰分界线在哪&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;科学最本质的特征是什么？不是正确，是&lt;strong&gt;愿意承认自己错了&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;一个更精确的区分：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;科学&lt;/strong&gt;：愿意被证伪。新的证据来了，旧理论可以修正或推翻。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非科学/信仰&lt;/strong&gt;：拒绝被证伪。任何反例都被解释为「你还没理解」或「这是发展中的特例」。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;用这个标准回看马哲：它有科学的野心（认识世界、改造世界），但后来走向了信仰 — 它拒绝被证伪。它的「发展」有红线，只打补丁不改底层代码，这不是真正的发展。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;从科学变成信仰，就已经不是很科学的事情了。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这一路讨论的几个关键里程碑：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;为什么存在逻辑&lt;/strong&gt; → 信息不全时需要桥&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逻辑的本质&lt;/strong&gt; → 从已知推出大概率正确的结论&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;「既定」陷阱&lt;/strong&gt; → 从答案反推原因，条件容易被偷换&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学逻辑的目标&lt;/strong&gt; → 给自己装一个检票员&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;黄金屋理论&lt;/strong&gt; → 信息是推理的燃料，错误信息能被信息量压死&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量变引起质变的漏洞&lt;/strong&gt; → 「一定条件」是空洞占位符&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;宏大叙事的悖论&lt;/strong&gt; → 允许打补丁，不允许改底层代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;科学与信仰的分界线&lt;/strong&gt; → 科学愿意认错，信仰不愿意&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;核心收获不是记住了哪条定理，而是养成了一种思维习惯：任何一段推理，都问一句 — 前提成立吗？条件被换了吗？这个体系是为了解释世界，还是为了证明某个结论而建的？&lt;/p&gt;&lt;p&gt;检票员上岗了。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>如何高效阅读技术论文：一个本科生的实践方法</title><link>https://wzl12345.pages.dev/posts/sample-post/</link><guid isPermaLink="true">https://wzl12345.pages.dev/posts/sample-post/</guid><description>阅读技术资料是提升能力的关键，本文分享从筛选到精读的全流程方法。</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;阅读技术资料是程序员成长的核心能力。无论你处于哪个阶段，快速而深入地理解一篇技术文章或论文都是一项需要刻意练习的技能。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么要系统化读论文？&lt;a href=&quot;#为什么要系统化读论文&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;很多人一开始读技术文章的方式是”从头读到尾”，像是在读一本教科书。但技术文章并不是为线性阅读而设计的。一篇高质量的技术文章通常包含密集的信息，如果逐字逐句地阅读，很容易迷失在细节中，反而忽略了核心思想。&lt;/p&gt;&lt;p&gt;系统化的阅读方法可以帮助我们：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;快速筛选出值得精读的论文&lt;/li&gt;
&lt;li&gt;在有限时间内抓住核心思想&lt;/li&gt;
&lt;li&gt;建立论文之间的关联，形成知识网络&lt;/li&gt;
&lt;li&gt;为后续复现和拓展研究打好基础&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三遍阅读法&lt;a href=&quot;#三遍阅读法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我采用三遍阅读法：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;第一遍：粗读（5-10 分钟）&lt;a href=&quot;#第一遍粗读5-10-分钟&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;目标是判断这篇论文是否与自己相关。需要重点阅读：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;标题和摘要&lt;/strong&gt;：了解论文的主题和核心贡献&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;引言&lt;/strong&gt;：理解研究动机和问题背景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结论&lt;/strong&gt;：了解主要发现和未来工作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图表&lt;/strong&gt;：快速浏览实验效果&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;读完这四部分，你应该能回答：这篇论文在解决什么问题？方法的核心 idea 是什么？实验结果支持他们的结论吗？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第二遍：精读（30-60 分钟）&lt;a href=&quot;#第二遍精读30-60-分钟&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;对于值得深入阅读的论文，进行第二遍精读：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;仔细阅读方法部分，理解技术细节&lt;/li&gt;
&lt;li&gt;分析实验设置和评估指标是否合理&lt;/li&gt;
&lt;li&gt;标记出不清楚或值得质疑的地方&lt;/li&gt;
&lt;li&gt;在空白处写下自己的理解和思考&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;一个好的习惯是：读完一篇论文后，尝试用自己的话向别人复述这篇论文的核心贡献。如果你能讲清楚，说明你真的理解了。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第三遍：深读（1-2 小时）&lt;a href=&quot;#第三遍深读1-2-小时&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;只有少数与你研究方向高度相关的论文才需要第三遍阅读。这个阶段需要：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;深入理解每个技术细节，甚至推导公式&lt;/li&gt;
&lt;li&gt;思考方法的局限性和可能的改进方向&lt;/li&gt;
&lt;li&gt;阅读相关工作，将论文放入更广阔的学术脉络中&lt;/li&gt;
&lt;li&gt;考虑能否将方法应用到自己的研究中&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;文献管理工具推荐&lt;a href=&quot;#文献管理工具推荐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;工欲善其事，必先利其器。以下是我日常使用的文献管理工具链：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zotero&lt;/strong&gt;：文献管理的主力工具，通过浏览器插件一键抓取论文信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connected Papers&lt;/strong&gt;：可视化论文之间的引用网络，帮助发现相关文献&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notion&lt;/strong&gt;：记录论文阅读笔记，支持 LaTeX 公式和标签分类&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Obsidian&lt;/strong&gt;：建立论文笔记之间的双向链接，构建个人知识库&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;每篇论文读完，我都会在 Zotero 中标注重要程度和阅读状态，并在 Notion 中写一篇简短的阅读笔记，包括：论文信息、核心贡献、方法概述、优缺点和可借鉴的点。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;读论文是一个”量变引起质变”的过程。开始时可能很慢，但随着阅读量的增加，你会越来越快地抓住论文的核心。关键是保持持续阅读的习惯，并有意识地运用系统化的方法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考资源：&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Next.js App Router 深入浅出</title><link>https://wzl12345.pages.dev/posts/nextjs-app-router/</link><guid isPermaLink="true">https://wzl12345.pages.dev/posts/nextjs-app-router/</guid><description>App Router 的核心概念与架构，从路由设计到服务端组件的全面解析。</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Next.js 的 App Router 是一次彻底的路由革命。它不只是换了个文件组织方式，而是从根本上改变了我们构建 React 应用的方式——从客户端渲染走向服务端优先。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么 App Router 是一个大版本更新？&lt;a href=&quot;#为什么-app-router-是一个大版本更新&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Pages Router（即传统的 &lt;code&gt;/pages&lt;/code&gt; 目录模式）从 Next.js 诞生起就陪伴着我们。它的模型很直观：文件即路由，每个页面对应一个 React 组件。但随着 React 生态的进化，这种模式逐渐暴露了瓶颈。&lt;/p&gt;&lt;p&gt;App Router 的诞生带来了三个核心变化：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;服务端组件（RSC）&lt;/strong&gt;：组件默认在服务端渲染，减少客户端 JS 体积&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;嵌套布局&lt;/strong&gt;：通过 &lt;code&gt;layout.js&lt;/code&gt; 实现真正的布局复用，而非手工嵌套&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流式渲染&lt;/strong&gt;：结合 &lt;code&gt;loading.js&lt;/code&gt; 和 &lt;code&gt;Suspense&lt;/code&gt;，实现按需加载&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;App Router 的核心概念&lt;a href=&quot;#app-router-的核心概念&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;文件约定&lt;a href=&quot;#文件约定&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;App Router 使用一套约定式文件命名体系，每个特殊的文件名对应特定的 UI 行为：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;app/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── layout.js         # 共享布局（包裹子页面）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── page.js           # 页面内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── loading.js        # 加载态 UI&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── error.js          # 错误边界&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── not-found.js      # 404 页面&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── global-error.js   # 根级错误处理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── route.js          # API 路由（替代 pages/api）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;布局嵌套&lt;a href=&quot;#布局嵌套&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;布局是 App Router 最实用的设计之一。每个文件夹可以有一个 &lt;code&gt;layout.js&lt;/code&gt;，它自动包裹当前路径下的所有页面：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;app/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── layout.js           # 全局布局（导航栏 + 页脚）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── dashboard/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── layout.js       # 仪表盘布局（侧边栏）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── settings/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── page.js     # 同时继承两个布局&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这种机制意味着你不再需要手工组合布局组件，Next.js 会自动为你构建布局树。更重要的是，布局在导航时&lt;strong&gt;不会重新渲染&lt;/strong&gt;，只更新子页面内容。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;服务端组件 vs 客户端组件&lt;a href=&quot;#服务端组件-vs-客户端组件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;App Router 中，&lt;strong&gt;所有组件默认是服务端组件&lt;/strong&gt;。这意味着：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;你可以直接在组件中使用 &lt;code&gt;async/await&lt;/code&gt; 获取数据&lt;/li&gt;
&lt;li&gt;数据库查询、文件读取等操作在服务端安全执行&lt;/li&gt;
&lt;li&gt;减少发送到客户端的 JS 体积&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;当你需要使用 &lt;code&gt;useState&lt;/code&gt;、&lt;code&gt;useEffect&lt;/code&gt;、事件处理等交互功能时，在文件顶部声明：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;use client&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;useState&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;react&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Counter&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;setCount&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;button&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onClick&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setCount&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;button&lt;/span&gt;&lt;span&gt;&amp;gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;关键思路：只在需要交互的地方使用客户端组件，其余保持服务端组件。你的应用体积会大幅减小，性能自然提升。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;数据获取：服务端是起点&lt;a href=&quot;#数据获取服务端是起点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;App Router 推荐的服务端数据获取方式直截了当：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// app/posts/page.js — 这是一个服务端组件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getPosts&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://api.example.com/posts&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PostsPage&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getPosts&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;配合 &lt;code&gt;loading.js&lt;/code&gt; 和 &lt;code&gt;error.js&lt;/code&gt;，你可以轻松实现流式加载和错误处理，而不需要手动管理 loading/error 状态。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;路由组与并行路由&lt;a href=&quot;#路由组与并行路由&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;App Router 还提供了更高级的路由模式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;路由组（Route Groups）&lt;/strong&gt;：通过 &lt;code&gt;(groupName)&lt;/code&gt; 文件夹组织路由而不影响 URL 路径&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行路由（Parallel Routes）&lt;/strong&gt;：通过 &lt;code&gt;@slot&lt;/code&gt; 实现同一布局内多独立区域渲染&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拦截路由（Intercepting Routes）&lt;/strong&gt;：通过 &lt;code&gt;(.)&lt;/code&gt; 前缀实现模态框等模式&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;从 Pages Router 迁移建议&lt;a href=&quot;#从-pages-router-迁移建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你的项目还在使用 Pages Router，不必急于全量迁移。应用策略：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;新功能直接使用 App Router&lt;/li&gt;
&lt;li&gt;Pages Router 和 App Router 可以共存&lt;/li&gt;
&lt;li&gt;先迁移布局（layout），再逐步迁移页面&lt;/li&gt;
&lt;li&gt;注意 &lt;code&gt;getServerSideProps&lt;/code&gt; → 直接 &lt;code&gt;async&lt;/code&gt; 组件&lt;/li&gt;
&lt;li&gt;注意 &lt;code&gt;getStaticProps&lt;/code&gt; → &lt;code&gt;generateStaticParams&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;App Router 不是花哨的营销噱头，它是 React 全栈框架发展的必然方向。服务端组件 + 嵌套布局 + 流式渲染的组合，让开发者能够以更直观的方式构建高性能 Web 应用。如果你是 Next.js 新手，直接学 App Router 就好；如果已经在用 Pages Router，逐步迁移即可。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考资源：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs/app&quot; target=&quot;_blank&quot;&gt;Next.js 官方文档 - App Router&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://react.dev/reference/rsc/server-components&quot; target=&quot;_blank&quot;&gt;React 官方 - Server Components&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>搭建高效的开发工作流</title><link>https://wzl12345.pages.dev/posts/dev-workflow/</link><guid isPermaLink="true">https://wzl12345.pages.dev/posts/dev-workflow/</guid><description>从版本控制、自动化测试到 CI/CD，分享一套实战检验的开发效率工具链。</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;从毕业实习到独立维护项目，我踩过不少效率的坑——合并冲突打半天、测试只在上线前跑一次、手动部署到凌晨三点。后来我花时间系统地打磨了开发工作流，把重复劳动降到最低。这篇文章分享的是我实际每天都在用的工具链和规范，不是纸上谈兵。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;一、Git 工作流：分支策略与提交规范&lt;a href=&quot;#一git-工作流分支策略与提交规范&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;好的 Git 工作流是团队协作的基石。我团队采用的是简化版 Git Flow，适合大多数中小项目：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;main        ──── 稳定发布分支，只接受 PR 合并&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── develop    ──── 集成分支，日常开发基干&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│     ├── feat/xxx  ──── 功能分支，从 develop 切出&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│     ├── fix/xxx   ──── 修复分支&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│     └── refactor/ ──── 重构分支&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── hotfix/xxx ──── 紧急修复，从 main 切出并合回 main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;几条铁律：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不要直接往 main 推送代码&lt;/strong&gt;。所有变更通过 Pull Request 合入，即使是一个人开发，这条习惯也能帮你养成代码审查意识。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分支名称携带上下文&lt;/strong&gt;。例如 &lt;code&gt;feat/user-auth-jwt&lt;/code&gt; 比 &lt;code&gt;feature-v2&lt;/code&gt; 好一百倍——三个月后你看 log，光凭分支名就能知道当时在干什么。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;及时删除已合并的分支&lt;/strong&gt;。&lt;code&gt;git branch --merged | grep -v &quot;\*&quot; | xargs git branch -d&lt;/code&gt; 这条命令我每周跑一次。&lt;/li&gt;
&lt;/ul&gt;&lt;section&gt;&lt;h3&gt;提交信息规范&lt;a href=&quot;#提交信息规范&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我用 Conventional Commits 已经两年了，强烈推荐。格式很简单：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;type&amp;gt;(&amp;lt;scope&amp;gt;): &amp;lt;subject&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;常用的 type 包括：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;feat&lt;/code&gt; — 新功能&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fix&lt;/code&gt; — 修复 bug&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chore&lt;/code&gt; — 构建/工具变更&lt;/li&gt;
&lt;li&gt;&lt;code&gt;refactor&lt;/code&gt; — 重构&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docs&lt;/code&gt; — 文档变更&lt;/li&gt;
&lt;li&gt;&lt;code&gt;test&lt;/code&gt; — 测试相关&lt;/li&gt;
&lt;li&gt;&lt;code&gt;style&lt;/code&gt; — 代码格式（非逻辑变更）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;实际例子：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;feat(auth): 接入 JWT 令牌刷新机制&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 添加 refresh_token 接口与自动续期逻辑&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 前端 Axios 拦截器处理 401 自动刷新&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 更新相关单元测试&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;配合 &lt;code&gt;commitlint&lt;/code&gt; + &lt;code&gt;husky&lt;/code&gt;，在 commit hook 里自动校验格式，不符合规范直接拒绝提交。坚持一个月后，看 &lt;code&gt;git log --oneline&lt;/code&gt; 就像在读 changelog。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、编辑器配置：VS Code 效率翻倍&lt;a href=&quot;#二编辑器配置vs-code-效率翻倍&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;编辑器是开发者待得最久的地方，花一小时配置它，每天省下半小时。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;必装扩展&lt;a href=&quot;#必装扩展&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prettier&lt;/strong&gt; — 代码格式化唯一真理，团队统一配置 &lt;code&gt;.prettierrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESLint&lt;/strong&gt; — JS/TS 静态分析，配合 &lt;code&gt;save&lt;/code&gt; 时自动修复&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitLens&lt;/strong&gt; — 行内 git blame、历史对比，排查回归的利器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error Lens&lt;/strong&gt; — 行内错误高亮，不需要悬停才知道哪里错了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; — AI 补全，对模板代码和单元测试特别高效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path Intellisense&lt;/strong&gt; — 路径自动补全，少敲很多斜杠&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;settings.json 核心片段&lt;a href=&quot;#settingsjson-核心片段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;editor.formatOnSave&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;editor.defaultFormatter&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;esbenp.prettier-vscode&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;editor.codeActionsOnSave&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;source.fixAll.eslint&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;explicit&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;editor.minimap.enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;editor.cursorBlinking&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;phase&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;workbench.startupEditor&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;none&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;files.autoSave&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;onFocusChange&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;terminal.integrated.defaultProfile.windows&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;PowerShell&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;git.autofetch&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;几个值得注意的点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;关闭 minimap，节省空间留给代码本身&lt;/li&gt;
&lt;li&gt;开启 formatOnSave + ESLint fixOnSave，提交前几乎不需要手动格式化&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git.autofetch&lt;/code&gt; 自动拉取，避免每天上班第一件事就是 &lt;code&gt;git fetch&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;快捷键肌肉记忆&lt;a href=&quot;#快捷键肌肉记忆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;以下快捷键值得花一个周末形成肌肉记忆：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl+P&lt;/code&gt; — 快速打开文件（配合模糊搜索，比鼠标点目录快 3 倍）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+Shift+P&lt;/code&gt; — 命令面板，几乎任何操作从这里出发&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+D&lt;/code&gt; — 选中下一个相同的词，批量改名神器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Alt+↑/↓&lt;/code&gt; — 整行上下移动&lt;/li&gt;
&lt;li&gt;`Ctrl+“ — 打开/关闭终端&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、终端配置：告别低效敲命令&lt;a href=&quot;#三终端配置告别低效敲命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我用的是 &lt;strong&gt;Windows Terminal&lt;/strong&gt; + &lt;strong&gt;PowerShell 7&lt;/strong&gt; + &lt;strong&gt;Oh My Posh&lt;/strong&gt; 的组合。配置好后，终端不再是一个黑框，而是一个高效的命令行工作台。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Oh My Posh 主题&lt;a href=&quot;#oh-my-posh-主题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我用的是 &lt;code&gt;jandedobbeleer&lt;/code&gt; 主题，它会在提示符里显示：当前 Git 分支、状态（是否有未提交文件）、上一命令执行耗时、当前目录。视觉上就能感知仓库状态，不需要手动敲 &lt;code&gt;git status&lt;/code&gt;。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装（Windows）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;winget install JanDeDobbeleer.OhMyPosh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 配置到 PowerShell profile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;oh&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;my&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;posh init pwsh &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;config &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;env:POSH_THEMES_PATH&lt;/span&gt;&lt;span&gt;\jandedobbeleer.omp.json&quot;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;Invoke-Expression&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;实用别名&lt;a href=&quot;#实用别名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我在 &lt;code&gt;$PROFILE&lt;/code&gt; 里配置了这些别名，每个都省掉了不少打字量：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Git shortcuts&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gs&lt;/span&gt;&lt;span&gt;    { git status }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gp&lt;/span&gt;&lt;span&gt;    { git push }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gl&lt;/span&gt;&lt;span&gt;&lt;span&gt;    { git log &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;oneline &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;graph &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;all &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gc&lt;/span&gt;&lt;span&gt;&lt;span&gt;    { git commit &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;m &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;$args&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gco&lt;/span&gt;&lt;span&gt;   { git checkout &lt;/span&gt;&lt;span&gt;&quot;$args&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gcb&lt;/span&gt;&lt;span&gt;&lt;span&gt;   { git checkout &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;b &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;$args&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gd&lt;/span&gt;&lt;span&gt;    { git diff }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gst&lt;/span&gt;&lt;span&gt;   { git stash }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gstp&lt;/span&gt;&lt;span&gt;  { git stash pop }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Navigation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;    { &lt;/span&gt;&lt;span&gt;Set-Location&lt;/span&gt;&lt;span&gt; .. }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;   { &lt;/span&gt;&lt;span&gt;Set-Location&lt;/span&gt;&lt;span&gt; ..\.. }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt;   { &lt;/span&gt;&lt;span&gt;Set-Location&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$env:DEV_DIR&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这些 alias 不是我一口气写出来的，而是每次发现某个命令敲了超过三次，就顺手加一条。三周后，你会发现 80% 的 Git 操作只需要两三个字母。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;终端效率技巧&lt;a href=&quot;#终端效率技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ctrl+R&lt;/strong&gt; — 反向搜索历史命令，比 ↑ 翻历史快得多&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PSReadLine 的预测提示&lt;/strong&gt; — PowerShell 7 内置，灰色显示你可能会输入的命令，按 → 自动补全&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多 Tab + 分屏&lt;/strong&gt; — 一个 Tab 跑 dev server，一个跑 Git 操作，一个跑 ad-hoc 命令&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、CI/CD：让机器替你跑脏活&lt;a href=&quot;#四cicd让机器替你跑脏活&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;手动部署是焦虑的来源。配置 CI/CD 之后，每次合并到 main 自动运行测试、构建、部署，整个过程无需人工干预。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;GitHub Actions 基础配置&lt;a href=&quot;#github-actions-基础配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;一份典型的 Node.js 项目 CI 配置：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;.github/workflows/ci.yml&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;CI&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;branches&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;develop&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;pull_request&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;branches&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;jobs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;runs-on&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ubuntu-latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;steps&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;uses&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;actions/checkout@v4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;uses&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;actions/setup-node@v4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;node-version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;npm&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;npm ci&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;npm run lint&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;npm run test -- --coverage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;uses&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;codecov/codecov-action@v3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;needs&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;github.ref == &apos;refs/heads/main&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;runs-on&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ubuntu-latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;steps&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;uses&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;actions/checkout@v4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;npm ci &amp;amp;&amp;amp; npm run build&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;uses&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;peaceiris/actions-gh-pages@v3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;github_token&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;publish_dir&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;./dist&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里的三个关键设计：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;缓存依赖&lt;/strong&gt;：&lt;code&gt;cache: &quot;npm&quot;&lt;/code&gt; 让后续运行节省掉 &lt;code&gt;npm install&lt;/code&gt; 的时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分步执行&lt;/strong&gt;：lint → test → build → deploy，任何一步失败后续自动跳过&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境区分&lt;/strong&gt;：push 到 develop 只跑 lint + test，只有 main 才触发部署&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;更多实用 CI 技巧&lt;a href=&quot;#更多实用-ci-技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;concurrency&lt;/code&gt; 取消正在运行的旧流水线，避免同一分支排队&lt;/li&gt;
&lt;li&gt;PR 中显示测试覆盖率变化，用 &lt;code&gt;dorny/test-reporter&lt;/code&gt; 或 Codecov 的 PR comment&lt;/li&gt;
&lt;li&gt;Danger JS 自动在 PR 评论中提醒不符合规范的地方&lt;/li&gt;
&lt;li&gt;定时运行 &lt;code&gt;cron: &apos;0 6 * * 1&apos;&lt;/code&gt; 的依赖更新扫描（如 Dependabot）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、测试战略：分层而不重叠&lt;a href=&quot;#五测试战略分层而不重叠&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;很多人对测试的误解是”写了测试就完事”。实际上测试需要分层策略，否则要么测试太脆弱，要么覆盖率形同虚设。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;测试金字塔&lt;a href=&quot;#测试金字塔&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我遵循经典的测试金字塔，但做了微调：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单元测试（占比 60%）&lt;/strong&gt;：覆盖工具函数、hooks、API 服务层的纯逻辑。使用 Vitest 或 Jest，追求执行速度——整个套件 &lt;strong&gt;5 秒内跑完&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集成测试（占比 25%）&lt;/strong&gt;：覆盖 API 端点、数据库交互。用 Supertest（Node.js）或 Spring Boot Test（Java），启动一次测试容器跑完所有集成用例。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E2E 测试（占比 15%）&lt;/strong&gt;：覆盖核心用户流程（登录、注册、下单）。用 Playwright，只写 5-8 个最关键场景，不追求 100% 覆盖。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;实际经验&lt;a href=&quot;#实际经验&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;几条经过验证的原则：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;测试跟代码一起提交&lt;/strong&gt;。不是做完功能再补测试，而是写功能的同时写测试。我在分支合并前会检查 CI 上的测试覆盖率变化，不允许覆盖率下降超过 2%。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用 Arrange-Act-Assert 结构&lt;/strong&gt;。每个测试用例分成三段，保持可读性：&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// Arrange&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createTestUser&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;admin&quot;&lt;/span&gt;&lt;span&gt; });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;repo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserRepository&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// Act&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;repo&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;findByEmail&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// Assert&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toBeNull&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;toBe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;admin&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不用 Mock 你没有的代码&lt;/strong&gt;。过度 mock 会让测试与实现耦合，重构时测试先坏。能传真实实例就传真实实例，只在必要时 mock 外部服务。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、工作流自动化：串联起来&lt;a href=&quot;#六工作流自动化串联起来&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;上述工具链单独使用已经能提升效率，但真正的价值在于”串联”：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;在 VS Code 中编码，ESLint + Prettier 在保存时自动格式化&lt;/li&gt;
&lt;li&gt;git commit 时 husky + commitlint 校验提交信息格式&lt;/li&gt;
&lt;li&gt;pre-push hook 运行单元测试 + lint，未通过则拒绝推送&lt;/li&gt;
&lt;li&gt;push 到远程后，GitHub Actions 自动跑完整 CI 流水线&lt;/li&gt;
&lt;li&gt;CI 通过后，合并 PR 到 main，自动触发部署&lt;/li&gt;
&lt;li&gt;部署成功后，发送通知到飞书/钉钉群&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;这个链条把人工干预降到最低。我只需要专注于写代码和 Review PR，剩下的——格式化、测试、构建、部署——全部由工具链自动完成。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;效率的本质&lt;a href=&quot;#效率的本质&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;高效不是做更多的事，而是让机器做机器擅长的事，让人的精力集中在真正需要判断力的地方。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;回顾我搭建这套工作流的过程，最大的收获其实不是节省了多少时间，而是心态上的转变——当你信任自己的工作流时，你不会害怕重构，不会害怕改错代码，不会害怕上线。因为每一步都有工具在帮你兜底。&lt;/p&gt;&lt;p&gt;从明天开始，选一个你觉得最痛的点——可能是提交信息没有规范，也可能是 CI 每次跑 20 分钟——先动手优化。工作流不是一次搭建完成的，它是逐步迭代出来的。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>2025 年技术大会参会见闻</title><link>https://wzl12345.pages.dev/posts/tech-conference-2025/</link><guid isPermaLink="true">https://wzl12345.pages.dev/posts/tech-conference-2025/</guid><description>印象深刻的演讲与技术趋势：AI 辅助开发、WebAssembly、边缘计算。</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2025 年是我密集参加技术会议的一年。从年初的全球 AI 开发者大会到年末的开源峰会，走过了四个城市、六场会议。这篇文章从一个普通开发者的视角，记录这一年技术生态的变迁与我的观察。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么要去技术大会？&lt;a href=&quot;#为什么要去技术大会&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在短视频和直播盛行的时代，总有人问我：会议的内容不都可以在线看吗？何必花时间花钱跑去现场？&lt;/p&gt;&lt;p&gt;技术大会真正的价值不在演讲本身——尽管好的演讲确实能带来启发——而在那些计划之外的瞬间：茶歇时和邻座聊起的架构设计、午餐时偶然听到的团队招聘内幕、Workshop 里和讲师面对面调试代码的经历。这些无法被录播替代的偶遇，才是会议的精华。&lt;/p&gt;&lt;p&gt;我给自己定的原则是：每年至少参加两场线下技术会议，一场偏 AI/前沿方向，一场偏工程实践。今年的节奏正好验证了这个组合的价值。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;AI 辅助开发：从玩具到工具&lt;a href=&quot;#ai-辅助开发从玩具到工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果说 2024 年的 AI 编程还停留在”写个笑话”或者”生成一个 to-do list demo”的水平，2025 年则是质变的一年。&lt;/p&gt;&lt;p&gt;在四月的”AI + 工程实践”大会上，GitHub 的工程师演示了 Copilot 的全新 Agent 模式。让我印象最深的一个场景是：他直接输入”给我这个项目加一个用户认证系统，支持 GitHub OAuth 登录，用 Postgres 做 session 存储”，Copilot 依次创建了路由文件、数据库迁移脚本、中间件和前端登录按钮——一个在真实项目中需要大半天的工作，Agent 版本在一分钟内给出了可用的骨架。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;关键变化：AI 不再只是补全代码片段，而是开始理解整个项目的上下文，并独立完成多步骤任务。这意味着开发者角色的转变——从编写每一行代码，变成”设计师 + 审核者”。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;相比之下，Cline、Continue 等开源方案的进展同样迅速。Cursor IDE 在国内开发者圈中的使用率涨到了一个令我惊讶的比例。在会议的现场投票中，超过 40% 的开发者表示日常开发已离不开 AI 辅助。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;WebAssembly：浏览器之外的新战场&lt;a href=&quot;#webassembly浏览器之外的新战场&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;WebAssembly（Wasm）今年也不再只是浏览器里的”奇技淫巧”。几场关于 Wasm 的演讲都聚焦在服务端的实际落地。&lt;/p&gt;&lt;p&gt;在秋季的 Rust China Conf 上，来自字节跳动的团队分享了他们用 Wasm 做边缘计算网关的经验。核心思路是：用 Rust 编写高性能的数据处理逻辑，编译成 Wasm 模块，然后部署到 CDN 边缘节点。这样既得到了接近原生的性能，又解决了多租户环境下的安全隔离问题。&lt;/p&gt;&lt;p&gt;另一个让我兴奋的方向是 WASI（WebAssembly System Interface）的进展。有了 WASI 的支持，Wasm 模块可以直接访问文件系统、网络和时钟——这意味着越来越多后端服务可以用 Wasm 插件来扩展。比如一个 Web 服务器想要支持自定义路由逻辑，不再需要嵌入一个脚本解释器，而是直接加载一个 Wasm 模块即可。&lt;/p&gt;&lt;p&gt;会后我和几位演讲者深入交流了一下，大家的一致判断是：Wasm 在边缘计算和插件架构领域已经跨过了早期的”炫技”阶段，进入了真正的生产可用期。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;AI Agent 与工具使用架构&lt;a href=&quot;#ai-agent-与工具使用架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果用一个关键词定义 2025 年的技术趋势，我会选”Agent”。&lt;/p&gt;&lt;p&gt;几乎所有我参加的大会都设立了 Agent 专题。从 OpenAI 的 GPTs 到 Anthropic 的 Claude Computer Use，科技巨头和大模型团队不约而同地将目标从”更好的聊天机器人”转向了”能动手干活的智能体”。&lt;/p&gt;&lt;p&gt;在 AWS re 的远程参与环节（没能去成拉斯维加斯，有点遗憾），他们重点展示了 Amazon Bedrock 的 Agent 框架——说白了就是一个”思考 + 行动”的循环：Agent 拆解用户指令、调用各种 API/工具、处理返回结果、决定下一步行动。听起来简单，但真正做到可靠和鲁棒却极难。&lt;/p&gt;&lt;p&gt;让我印象最深的是一个关于 MCP（Model Context Protocol）的 Workshop。MCP 试图为 AI Agent 和外部工具之间建立一套标准协议——类似于 HTTP 之于 Web。有了标准协议，Agent 可以动态发现当前环境中有哪些工具可用、每个工具的输入输出格式是什么。这场 Workshop 的手写环节让我第一次真正理解了一个 Agent 系统的工作链路：用户请求 → 意图识别 → 工具选择 → 参数填充 → 调用执行 → 结果反馈。&lt;/p&gt;&lt;p&gt;有一位来自蚂蚁集团的嘉宾做了 Keynote，展示了他们内部使用的 Agent 编排平台，支撑着数百个业务场景的自动化流程。他说了一句让我反复回味的话：&lt;strong&gt;“Agent 不是替代开发者，而是把我们从机械重复中解放出来，让我们专注于真正需要创造力的部分。“&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;开源的黄金时代&lt;a href=&quot;#开源的黄金时代&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;今年开源界的活力让很多人惊讶。如果说前几年”大模型闭源、框架商业化”的声音让人担忧开源生态，2025 年的现实证明：开源比以往任何时候都强大。&lt;/p&gt;&lt;p&gt;在年底的开源年会上，几个数字令人振奋：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;国内活跃的开发者开源贡献者数量同比增长 67%&lt;/li&gt;
&lt;li&gt;超过 30 家企业正式建立了开源办公室（OSPO）&lt;/li&gt;
&lt;li&gt;Llama、Mistral、Qwen 等大模型的开源生态已经可以和闭源产品掰手腕&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我最喜欢的环节是”闪电演讲（Lightning Talk）“。每位演讲者只有 5 分钟，节奏极快。有人分享了自己为某个冷门库提交第一个 PR 的忐忑经历，也有人展示了用 Rust 重写 Webpack 替代品的实际数据。这些短小但真实的分享，远比那些充满高大上名词的 Keynote 更能打动人。&lt;/p&gt;&lt;p&gt;今年的社区圆桌也很有意思。来自不同公司的五位嘉宾讨论了”开源如何抗住商业化压力”。共识是：开源的护城河不是代码本身，而是围绕代码形成的社区。只要社区健壮、有参与感、有正向反馈，商业化的压力反而会倒逼社区进化。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;参会 Tips：如何让每一次会议都物有所值&lt;a href=&quot;#参会-tips如何让每一次会议都物有所值&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;参加了这么多场会议，踩过不少坑，总结几条实在的建议：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提前做功课&lt;/strong&gt;：拿到议程后，圈出必听的场次，同时留出 30% 的时间给”随机漫步”——按兴趣去看不熟悉的领域，往往有意外收获。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;带名片？不如带二维码&lt;/strong&gt;：现在谁还带实体名片？把自己的联系方式做成一个二维码放在手机锁屏上，加人更方便。推荐用 vCard 格式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要追着大牛合影&lt;/strong&gt;：大牛也是人，演讲完去厕所的路上、茶歇排队时反而更容易聊起来。真诚地提一两个具体问题，远好过”老师我仰慕您很久了”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;及时记录&lt;/strong&gt;：每次听完一个演讲，花 2 分钟在手机上记三件事——这个演讲的核心观点是什么？有哪些数据/例子特别有说服力？我回去可以尝试什么？第二天再整理成笔记。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;少拿周边&lt;/strong&gt;：那些帆布袋、贴纸、充电线终将被遗忘。会场最重要的资源是人和信息，而不是免费赠品。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;总结与展望&lt;a href=&quot;#总结与展望&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;回看 2025 年的参会笔记，变化最大的是两件事：一是 AI 从”能聊天”变成了”能干活”，二是整个行业从焦虑转向务实。2023 年大家还在讨论”AI 会不会取代程序员”，2025 年大家讨论的是”怎样让 AI 帮我把 CRUD 写得快一点”。&lt;/p&gt;&lt;p&gt;2026 年，我期待看到 Agent 架构从概念走向生产级的工程方案，期待 WebAssembly 在边缘计算领域更加成熟，更期待开源社区继续用协作的力量推动技术前进。&lt;/p&gt;&lt;p&gt;最后，分享一个习惯：每次参会回来，我会在个人仓库里建一个 &lt;code&gt;conference-notes/&lt;/code&gt; 文件夹，把整理的笔记和学到的东西沉淀下来。一年下来回看，会发现成长并不是一蹴而就的，而是这些会议、交流、反思的碎片拼凑起来的。&lt;/p&gt;&lt;p&gt;明年，继续出发。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;相关链接：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs/app&quot; target=&quot;_blank&quot;&gt;Model Context Protocol 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/generative-ai-for-beginners&quot; target=&quot;_blank&quot;&gt;WASI - WebAssembly System Interface&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>我的 22408 备考之路：目标是南邮，虽然没上岸</title><link>https://wzl12345.pages.dev/posts/22408-nupt/</link><guid isPermaLink="true">https://wzl12345.pages.dev/posts/22408-nupt/</guid><description>一篇诚实的复盘。记录备考 22408 一年的历程与思考。</description><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;出成绩那天，我盯着屏幕看了很久。总分离南邮的复试线还差一截。说不上意外，因为考完数学的那一刻我心里就有数了。但真正看到结果时，那种失落感还是比预想的要重。&lt;/p&gt;
&lt;p&gt;这篇博客不是成功经验分享，而是一次诚实的复盘。记录我这一年的备考历程，以及没上岸之后的一些思考。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么选 22408 + 南邮&lt;a href=&quot;#为什么选-22408--南邮&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;选择 22408（政治、英语二、数学二、408 计算机专业基础综合）的理由很简单：408 是计算机考研最硬的专业课，考察数据结构、组成原理、操作系统、计算机网络四门核心课程。虽然难，但我觉得作为一个科班生，这是打好基础的最好方式。&lt;/p&gt;&lt;p&gt;南邮虽然不是 985/211，但在计算机和通信领域的口碑很好，地理位置在南京，互联网公司校招资源丰富。加上往年分数线相对友好，我觉得自己努力一把是有机会的。&lt;/p&gt;&lt;p&gt;现在回头看，我对 408 的难度低估了，对自己的执行力高估了。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;备考时间线&lt;a href=&quot;#备考时间线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;3 月 - 6 月：基础阶段&lt;a href=&quot;#3-月---6-月基础阶段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;数学二跟着张宇的基础 30 讲过了一遍，课后题基本都能做下来。408 买了王道的四本书，配合视频课过数据结构与组成原理。这个阶段节奏还可以，每天图书馆坐得住 6-8 小时。&lt;/p&gt;&lt;p&gt;英语二背单词为主，用的墨墨背单词，每天 200 个，雷打不动。政治完全没动。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7 月 - 9 月：强化阶段&lt;a href=&quot;#7-月---9-月强化阶段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;暑假留校，以为能有大把时间学习，结果效率反而不如之前。数学进入 1000 题强化篇，难题开始卡壳，有时候一道题想半小时做不出来，心态开始波动。&lt;/p&gt;&lt;p&gt;408 过完四本书的第一轮，但合上书再做题，还是很多知识点记不牢。特别是计算机网络，各种协议记了又忘，忘了又记。&lt;/p&gt;&lt;p&gt;英语开始做阅读真题，一篇阅读错 2-3 个是常态。心态上已经有些疲惫了。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;10 月 - 12 月：冲刺阶段&lt;a href=&quot;#10-月---12-月冲刺阶段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是最难熬的三个月。数学真题做了近十年的，分数起起伏伏，有时候 120+，有时候 90 出头。408 开始刷真题，选择题还好，但大题一做就暴露问题，尤其是组成原理的计算题和数据结构的算法设计题。&lt;/p&gt;&lt;p&gt;政治 11 月开始背肖八肖四，英语作文背了模板但也写不利索。每天 10 小时坐在自习室里，但学习效率明显不如上半年。到 12 月的时候，我已经隐隐感觉这次可能不行了。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;成绩与分析&lt;a href=&quot;#成绩与分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;最后的成绩确实不理想。最拉分的是数学，比平时模拟低了近 20 分。408 也不算好，只有 90 多分。政治英语算是正常发挥，但也没拉到分。&lt;/p&gt;&lt;p&gt;复盘下来，几个问题比较致命：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数学练得太少。&lt;/strong&gt; 题量不够，考场上见到新题型就慌了。数学二现在越来越灵活，光靠刷老题不够用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;408 停留在”看懂”而非”会做”。&lt;/strong&gt; 王道书看了三四遍，但真题做得不够，特别是大题动手太少。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后期心态崩了。&lt;/strong&gt; 9 月之后明显焦虑，睡眠质量下降，复习效率打折扣。这是一个恶性循环。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计划不切实际。&lt;/strong&gt; 制定了一堆完不成的计划，每次完不成就更焦虑。“计划—完不成—焦虑—更完不成”，这个循环到后面基本把我拖垮了。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;没上岸之后&lt;a href=&quot;#没上岸之后&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;出成绩后的那两周确实很难受。看着朋友圈里上岸的同学晒录取通知，心里五味杂陈。也开始怀疑自己是不是不适合走这条路。&lt;/p&gt;&lt;p&gt;但冷静下来之后，我想明白了几件事：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;考研失败 ≠ 我这个人不行。&lt;/strong&gt; 只是一次考试没考好，不代表能力被否定。备考过程中学到的 408 四门课的知识，做过的几百道数学题，背过的几千个单词，这些不会因为没上岸就消失。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路不止一条。&lt;/strong&gt; 考研不是唯一出路。把备考的那股劲头用在提升工程能力、做项目、刷 LeetCode 上，明年春招秋招同样有机会。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;这次失败也是一份礼物。&lt;/strong&gt; 它让我更清楚自己的弱点在哪：抗压能力、计划执行力、数学基础。这些都是可以针对性改善的，而不是什么”天赋问题”。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;给后来人的建议&lt;a href=&quot;#给后来人的建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;虽然我没上岸，但这半年的试错让我有一些话想说给同样准备 22408 的人：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数学一定要多做题。&lt;/strong&gt; 看课看懂了不等于会做。660、880、108，该刷的题一本都不能少。考场上见真章的时候，只有做过的题量和总结的方法能帮你。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;408 真题要早刷。&lt;/strong&gt; 不要等到”复习完”再开始做真题，真题是最好的复习资料。早点做，反复做，搞清楚每道题为什么对、为什么错。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;照顾好身体和心理。&lt;/strong&gt; 每周至少运动一次。学不进去的时候不要硬撑，出去走走可能比在图书馆发呆更有效。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;给自己留条后路。&lt;/strong&gt; 不要说”考不上就完了”，这种想法只会增加不必要的压力。备考同时也可以刷刷 LeetCode，做做项目，就算考研没成，技术和项目经验不会白费。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;现在&lt;a href=&quot;#现在&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;写这篇博客的时候，我已经在认真学前端全栈了。做了这个博客网站，开始写技术博客，重新刷 LeetCode。考研备考时啃 408 打下的基础，让我现在学底层知识时理解得更快。那一年没有白费。&lt;/p&gt;&lt;p&gt;没上岸不是终点，只是换了一条路走。与所有没上岸的朋友共勉。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>用 LaTeX 写技术文档：从入门到实践</title><link>https://wzl12345.pages.dev/posts/latex-docs/</link><guid isPermaLink="true">https://wzl12345.pages.dev/posts/latex-docs/</guid><description>从模板选择到排版技巧的 LaTeX 实践总结，适合技术写作初学者。</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在技术写作领域，选择正确的工具往往比写作本身更能影响最终成果的质量。LaTeX 作为一个存在了四十多年的排版系统，至今仍然是学术界和工程界的首选。这篇文章将带你从零搭建 LaTeX 写作环境，并分享一些实践中积累的技巧。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么选择 LaTeX？&lt;a href=&quot;#为什么选择-latex&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;很多开发者初次接触文档写作时，会自然而然地选择 Word 或 Markdown。这两种工具各有优势，但在面对大型技术文档时，它们的局限性就显现出来了。&lt;/p&gt;&lt;p&gt;Word 的优势在于所见即所得（WYSIWYG），但当你需要维护一个包含数十个章节、上百张图表、数千条引用的技术手册时，手动调整编号、格式和交叉引用会变成一场噩梦。Markdown 虽然轻量且版本控制友好，但在复杂排版需求面前力不从心——表格不够灵活，数学公式支持有限，图片排版也难以精细控制。&lt;/p&gt;&lt;p&gt;LaTeX 的核心理念与它们截然不同：&lt;strong&gt;内容与样式分离&lt;/strong&gt;。你只需要专注于写作内容，排版交给 LaTeX 引擎处理。这意味着：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自动化编号&lt;/strong&gt;：章节、公式、图表、引用全部自动编号，无需人工维护&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一致的排版&lt;/strong&gt;：整篇文档的字体、间距、页眉页脚风格统一&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;纯文本源文件&lt;/strong&gt;：天然适合 Git 版本控制，协作 diff 一目了然&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图灵完备&lt;/strong&gt;：你可以在文档中定义宏、写循环、条件判断，生成复杂内容&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;一句话总结：如果你写过上百页的技术文档，就会理解为什么 LaTeX 爱好者会说”Word 是打字机，LaTeX 是排版系统”。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;环境搭建&lt;a href=&quot;#环境搭建&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;本地方案：TeX Live&lt;a href=&quot;#本地方案tex-live&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;TeX Live 是跨平台的 LaTeX 发行版，包含所有核心宏包和工具链。安装命令因系统而异：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# macOS (Homebrew)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--cask&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mactex&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Ubuntu / Debian&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;texlive-full&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Windows&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 从 https://tug.org/texlive 下载 install-tl-windows.exe&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;完整安装约 5-8 GB，如果你空间有限，可以选择 &lt;code&gt;texlive-base&lt;/code&gt; 或 &lt;code&gt;texlive-latex-extra&lt;/code&gt; 等精简方案。安装完成后，用 &lt;code&gt;pdflatex&lt;/code&gt; 或 &lt;code&gt;xelatex&lt;/code&gt; 编译即可。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;在线方案：Overleaf&lt;a href=&quot;#在线方案overleaf&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;对于不想折腾环境或需要协作的场景，&lt;a href=&quot;https://www.overleaf.com&quot; target=&quot;_blank&quot;&gt;Overleaf&lt;/a&gt; 是最佳选择。它提供：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;浏览器内编辑 + 实时预览&lt;/li&gt;
&lt;li&gt;多人协作（类似 Google Docs 的体验）&lt;/li&gt;
&lt;li&gt;丰富的模板库（论文、简历、书籍、演示文稿）&lt;/li&gt;
&lt;li&gt;Git 集成，方便本地备份&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我个人推荐的方式是：本地用 VS Code + LaTeX Workshop 插件编写，Overleaf 用于协作评审。VS Code 的智能补全、代码片段和 Git 集成让写作体验大幅提升。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;文档结构入门&lt;a href=&quot;#文档结构入门&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一个标准的 LaTeX 文档分为导言区（Preamble）和正文区。以下是中文技术文档的典型框架：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;% 导言区&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\documentclass&lt;/span&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;UTF8&lt;/span&gt;&lt;span&gt;]{&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ctexart&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;% 宏包引用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\usepackage&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;amsmath, amssymb&lt;/span&gt;&lt;span&gt;}   &lt;/span&gt;&lt;span&gt;% 数学公式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\usepackage&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;graphicx&lt;/span&gt;&lt;span&gt;}           &lt;/span&gt;&lt;span&gt;% 图片&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\usepackage&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;booktabs&lt;/span&gt;&lt;span&gt;}           &lt;/span&gt;&lt;span&gt;% 三线表&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\usepackage&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;listings&lt;/span&gt;&lt;span&gt;}           &lt;/span&gt;&lt;span&gt;% 代码展示&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;% 标题信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\title&lt;/span&gt;&lt;span&gt;{基于深度学习的图像分割技术综述}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\author&lt;/span&gt;&lt;span&gt;{王忠亮}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\date&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;\today&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\begin&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\maketitle&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\tableofcontents&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;% 正文区&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\section&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;引言&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\section&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;相关工作&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\section&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;实验分析&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\bibliographystyle&lt;/span&gt;&lt;span&gt;{plain}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\bibliography&lt;/span&gt;&lt;span&gt;{references}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\end&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;数学公式&lt;a href=&quot;#数学公式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是 LaTeX 最强大的领域之一。行内公式用 &lt;code&gt;$...$&lt;/code&gt;，独立公式用 &lt;code&gt;\[ ... \]&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;% 行内公式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;欧拉公式 &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;e^{i&lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;pi&lt;/span&gt;&lt;/span&gt;&lt;span&gt;} + &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; 被誉为最美公式。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;% 独立公式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span&gt;_{-&lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;infty&lt;/span&gt;&lt;/span&gt;&lt;span&gt;}^{&lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;infty&lt;/span&gt;&lt;/span&gt;&lt;span&gt;} e^{-x^&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;\,&lt;/span&gt;&lt;span&gt;dx = &lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;sqrt&lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;pi&lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;% 多行公式（align 环境）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\begin&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;align&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;E &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;= mc^&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;nabla&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;times&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;mathbf&lt;/span&gt;&lt;/span&gt;&lt;span&gt;{B} &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;mu&lt;/span&gt;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;mathbf&lt;/span&gt;&lt;/span&gt;&lt;span&gt;{J} + &lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;mu&lt;/span&gt;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;&lt;span&gt;0\&lt;/span&gt;&lt;span&gt;varepsilon&lt;/span&gt;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;frac&lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;partial&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;mathbf&lt;/span&gt;&lt;/span&gt;&lt;span&gt;{E}}{&lt;/span&gt;&lt;span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;partial&lt;/span&gt;&lt;/span&gt;&lt;span&gt; t}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\end&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;align&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;amsmath&lt;/code&gt; 宏包提供了几乎所有需要的数学环境：&lt;code&gt;align&lt;/code&gt; 用于多行对齐，&lt;code&gt;cases&lt;/code&gt; 用于分段函数，&lt;code&gt;matrix&lt;/code&gt; 用于矩阵。对开发者来说，掌握 10 个左右的数学环境就能覆盖 90% 的公式需求。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;表格与图片&lt;a href=&quot;#表格与图片&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;三线表&lt;a href=&quot;#三线表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;学术表格推荐使用 &lt;code&gt;booktabs&lt;/code&gt; 宏包的三线表风格，简洁专业：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\begin&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;table&lt;/span&gt;&lt;span&gt;}[htbp]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;\centering&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;\caption&lt;/span&gt;&lt;span&gt;{不同模型的性能对比}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;\begin&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;tabular&lt;/span&gt;&lt;span&gt;}{lccc}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;\toprule&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;模型 &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; 准确率 &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; 参数量 &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; 推理时间 &lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;\midrule&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ResNet-50 &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; 76.1&lt;/span&gt;&lt;span&gt;% &amp;amp; 25.6M &amp;amp; 12ms \\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ResNet-101 &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; 77.3&lt;/span&gt;&lt;span&gt;% &amp;amp; 44.5M &amp;amp; 19ms \\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ViT-B/16 &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; 78.0&lt;/span&gt;&lt;span&gt;% &amp;amp; 86.6M &amp;amp; 25ms \\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;\bottomrule&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;\end&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;tabular&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\end&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;table&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;插图&lt;a href=&quot;#插图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\begin&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;figure&lt;/span&gt;&lt;span&gt;}[htbp]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;\centering&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;\includegraphics&lt;/span&gt;&lt;span&gt;[width=0.8&lt;/span&gt;&lt;span&gt;\textwidth&lt;/span&gt;&lt;span&gt;]{figures/architecture.pdf}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;\caption&lt;/span&gt;&lt;span&gt;{模型整体架构图}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;\label&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;fig:architecture&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\end&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;figure&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;使用 &lt;code&gt;\label&lt;/code&gt; 和 &lt;code&gt;\ref&lt;/code&gt; 实现交叉引用，LaTeX 会自动维护编号，你只需要写 &lt;code&gt;如图~\ref{fig:architecture} 所示&lt;/code&gt; 即可。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;参考文献管理&lt;a href=&quot;#参考文献管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;BibTeX 是 LaTeX 生态中最经典的参考文献管理方案。你需要一个 &lt;code&gt;.bib&lt;/code&gt; 文件存放所有引用条目：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@article&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;goodfellow2014gan&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;     = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Generative Adversarial Nets&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;    = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Goodfellow, Ian and Pouget-Abadie, Jean and Mirza, Mehdi and others&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;journal&lt;/span&gt;&lt;span&gt;   = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Advances in Neural Information Processing Systems&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;      = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;2014&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;volume&lt;/span&gt;&lt;span&gt;    = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;27&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@book&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;knuth1984tex&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;     = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;The TeXbook&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;    = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Knuth, Donald Ervin&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;      = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;1984&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;publisher&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Addison-Wesley&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@inproceedings&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;vaswani2017attention&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;     = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Attention Is All You Need&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;    = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Vaswani, Ashish and Shazeer, Noam and Parmar, Niki and others&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;booktitle&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Advances in Neural Information Processing Systems&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;      = &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;2017&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在文档中通过 &lt;code&gt;\cite{goodfellow2014gan}&lt;/code&gt; 引用，LaTeX 会自动生成参考文献列表。配合 &lt;code&gt;natbib&lt;/code&gt; 或 &lt;code&gt;biblatex&lt;/code&gt; 宏包，还可以定制引用格式（数字标号、作者-年份等）。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;技巧提示：在 Overleaf 中可以直接搜索 DOI 自动生成 BibTeX 条目，也可以使用 JabRef（桌面）或 Zotero + Better BibTeX 插件管理你的文献库。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;中文支持与 ctex 宏包&lt;a href=&quot;#中文支持与-ctex-宏包&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;对于中文技术文档，&lt;code&gt;ctex&lt;/code&gt; 宏包是标配。它提供了：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;中文排版支持&lt;/strong&gt;：自动处理中英文混排、标点压缩、行距调整&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中文字体配置&lt;/strong&gt;：内置宋体（\songti）、黑体（\heiti）、楷体（\kaishu）等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文档类适配&lt;/strong&gt;：&lt;code&gt;ctexart&lt;/code&gt;（文章）、&lt;code&gt;ctexrep&lt;/code&gt;（报告）、&lt;code&gt;ctexbook&lt;/code&gt;（书籍）、&lt;code&gt;ctexbeamer&lt;/code&gt;（演示）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中文目录与标题&lt;/strong&gt;：自动将 “Contents” 变为 “目录”，“Abstract” 变为 “摘要”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;使用方式很简单，将 &lt;code&gt;\documentclass{article}&lt;/code&gt; 替换为 &lt;code&gt;\documentclass[UTF8]{ctexart}&lt;/code&gt; 即可。编译时推荐使用 &lt;code&gt;xelatex&lt;/code&gt; 而不是 &lt;code&gt;pdflatex&lt;/code&gt;，以更好地支持 Unicode 和中文字体。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;开发者专属宏包&lt;a href=&quot;#开发者专属宏包&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你的文档需要大量展示代码，以下两个宏包必不可少：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;listings — 轻量代码展示&lt;a href=&quot;#listings--轻量代码展示&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\usepackage&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;listings&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\lstset&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;language=Python,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;basicstyle=&lt;/span&gt;&lt;span&gt;\ttfamily\small&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;keywordstyle=&lt;/span&gt;&lt;span&gt;\color&lt;/span&gt;&lt;span&gt;{blue},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;commentstyle=&lt;/span&gt;&lt;span&gt;\color&lt;/span&gt;&lt;span&gt;{gray},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;numbers=left,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;frame=single,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;breaklines=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\begin&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;lstlisting&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def fibonacci(n):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if n &amp;lt;= 1:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return n&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return fibonacci(n - 1) + fibonacci(n - 2)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\end&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;lstlisting&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;minted — 高级语法高亮&lt;a href=&quot;#minted--高级语法高亮&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;minted&lt;/code&gt; 基于 Pygments 引擎，提供更强大的语法高亮支持。使用前需安装 Pygments：&lt;code&gt;pip install Pygments&lt;/code&gt;，编译时加 &lt;code&gt;--shell-escape&lt;/code&gt; 参数：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\usepackage&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;minted&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\begin&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;minted&lt;/span&gt;&lt;span&gt;}{&lt;/span&gt;&lt;span&gt;python&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; numpy &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;x &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; np.&lt;/span&gt;&lt;span&gt;linspace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;y &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; np.&lt;/span&gt;&lt;span&gt;sin&lt;/span&gt;&lt;span&gt;(x)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;Max value: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt;y.&lt;/span&gt;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:.3f&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\end&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;minted&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;minted&lt;/code&gt; 支持数百种编程语言，高亮效果比 &lt;code&gt;listings&lt;/code&gt; 精致得多。不过由于依赖外部工具，配置稍复杂。简单的代码片段用 &lt;code&gt;listings&lt;/code&gt;，复杂的项目代码推荐 &lt;code&gt;minted&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;其他对开发者有用的宏包还包括：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;algorithm2e&lt;/strong&gt;：伪代码和算法排版&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;glossaries&lt;/strong&gt;：术语表与缩写词管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hyperref&lt;/strong&gt;：PDF 超链接、书签和元数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cleveref&lt;/strong&gt;：智能交叉引用（自动加上”图&quot;&quot;表&quot;&quot;式”等前缀）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tikz&lt;/strong&gt;：直接在 LaTeX 中绘制矢量图形&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;工作流建议&lt;a href=&quot;#工作流建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;最后分享几条实践中的经验：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模块化组织&lt;/strong&gt;：将章节拆分成独立 &lt;code&gt;.tex&lt;/code&gt; 文件，用 &lt;code&gt;\input&lt;/code&gt; 或 &lt;code&gt;\include&lt;/code&gt; 引入，方便多人协作和大文档复用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;版本控制&lt;/strong&gt;：不要提交编译产物（&lt;code&gt;.aux&lt;/code&gt;、&lt;code&gt;.log&lt;/code&gt;、&lt;code&gt;.pdf&lt;/code&gt;），在 &lt;code&gt;.gitignore&lt;/code&gt; 中排除它们&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持续编译&lt;/strong&gt;：使用 &lt;code&gt;latexmk&lt;/code&gt; 自动跟踪依赖并增量编译，省去手工多次编译的烦恼&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模板复用&lt;/strong&gt;：维护一个自己的 LaTeX 模板仓库，从论文到技术手册统一风格&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;LaTeX 的学习曲线确实比 Word 陡峭，但它的回报同样丰厚。一旦适应了”内容与样式分离”的思维模式，你会发现写技术文档变成了一件极其愉悦的事——你关心逻辑，LaTeX 关心美观。对于需要频繁产出高质量技术文档的开发者来说，这一投入的性价比很高。&lt;/p&gt;&lt;p&gt;如果本文让你对 LaTeX 产生了兴趣，推荐从 Overleaf 的&lt;a href=&quot;https://www.overleaf.com/learn&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;开始，或者直接打开一个模板写一篇小文档试试。写得越多，掌握越深。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考资源：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.overleaf.com/learn&quot; target=&quot;_blank&quot;&gt;Overleaf 官方文档 - Learn LaTeX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tug.org/texlive/&quot; target=&quot;_blank&quot;&gt;TeX Live 官方网站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ctan.org/pkg/ctex&quot; target=&quot;_blank&quot;&gt;CTAN - ctex 宏包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/latex3/latex2e&quot; target=&quot;_blank&quot;&gt;LaTeX 源码仓库（GitHub）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item></channel></rss>