十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

告别伪学霸:MkDocs+GitHub Actions构建技术笔记验证系统

告别伪学霸:MkDocs+GitHub Actions构建技术笔记验证系统 “冒充学霸并不难暴露学渣更容易。”这句话放在技术人的学习场景里真的非常扎心。很多同学一开始学编程时都会经历一段“看起来很努力”的阶段今天收藏一篇《MySQL 索引优化指南》明天把某个开源项目的 README 读了个遍后天又把某套中间件面试题背得滚瓜烂熟。可一旦让你从零搭个项目或者用大白话把原理讲给别人听瞬间就卡壳了——这种现象本质不是智商问题而是学习闭环中少了“输出验证”这一步。这篇文章我会从程序员学习的痛点出发分享一套可落地的“学习验证系统”。我们会用到 MkDocs、Git、GitHub Actions 和 Python 脚本把“输入→整理→输出→验证→复盘”做成一套相对自动化的流程。最终目的不是让你在收藏夹里攒下更多“学霸感”而是帮你把每一个知识盲区提前暴露在本地构建、自动化检查和公开文档里避免到面试和线上故障时才“原形毕露”。1. 伪学霸为什么会露馅1.1 技术学习中的“伪学霸症状”我以前见过不少“知识收集型学习者”他们的共同特点是学习痕迹非常多知识留存率却很低。典型的症状是这样的看到好文章先收藏收藏完就等于读完了。看视频教程时习惯“听懂了”手却不跟着敲。复制别人的 Demo 后能跑通但一换环境、一换版本就不知所措。面试前背了大量八股文能说出几个名词但解释不了底层原理。简历上写着“熟练使用 Redis”实际只跑过set / get两个命令。这些行为用一个词来形容就是“冒充学霸”。因为单看浏览记录、收藏数量和网盘资料库你确实很像一个学习狂人。但你有没有真正掌握只需要一个很简单的测试就能暴露给你一台新电脑、一个空目录让你不带资料写出一个可运行的最小工程。写不出来或者遇到报错不知道怎么解决就说明之前的学习停留在表面。1.2 为什么“暴露”是必然的技术学习不是“看过”和“听过”就能完成的它最终要落在“能决策、能实现、能排错”。比如你读了 Spring Security 的认证流程知道了SecurityFilterChain、AuthenticationManager这些名字。如果只是阅读概念你不太容易发现自己的漏洞。可是一旦要求你新建一个 Spring Boot 项目引入 starter-security配置一个内存用户写一个接口并测试未认证访问的返回结果再解释为什么登录页会自动出现。刚才背过的那些名词就会开始脱节。你会发现自己可能连依赖坐标该写在哪都不知道或者连 Maven 依赖冲突都分不清。这种“一动手就露馅”的时刻虽然不舒服但它其实是最有价值的反馈信号。所以这篇文章想转一个思路不要害怕暴露“学渣”反而应该主动给自己创造低成本、低风险的暴露环境。你可以在本地博客、私有仓库、自动化构建里先暴露问题。这样等真正上了生产环境或面试官当面提问时你已经把坑填得差不多了。2. 用“输出验证闭环”替代“收藏式输入”2.1 什么才是有效的学习闭环通常我们说“学了就忘”是因为学习过程只停留在输入层。一个相对有效的学习闭环至少包含四步输入通过阅读文档、源码、专栏或课程接触新知识。加工整理用自己的语言写笔记、画流程图、整理 Demo而不是直接复制粘贴。输出分享把整理结果写成技术文章、录成短视频或者讲给同事听。验证反馈把示例代码真正跑起来让构建工具、测试脚本、真实用户来评判你掌握得怎么样。很多人以为自己学不会是因为记忆力差。实际上多半是缺少第 2 到第 4 步。如果你能坚持“每次学完都产出一个最小可运行示例 一篇能讲清楚原理的笔记”学习效果会高很多。“冒充学霸”的本质是只做了第 1 步而“暴露学渣”的本质是你终于开始做第 4 步了。验证就会暴露问题暴露问题才能补全知识盲区。2.2 为什么需要一套笔记系统有人会说我也知道要写笔记但用 Word 写、用 Markdown 写、用云笔记写好像差别不大。差别确实有尤其在“验证”这一步。普通笔记软件可以帮你存储文字但它没法自动帮你检查这篇笔记是否已经写完里面的代码示例有没有语法问题知识库是否能构建成在线文档有没有遗留 TODO/FIXME 等未完成标记如果我把笔记放在一个 Git 仓库中并且用 MkDocs 这类静态站点工具来构建就可以把这些“验证动作”全部变成命令和 CI 任务。每次提交代码系统都会自动构建只要有一个笔记缺少文件、标签不完整、页面导航失效构建就直接失败。这样就形成了一种“强制暴露”机制你不完整它就不给你通过。基于这套思路我们开始搭建自己的技术学习工作台。3. 环境准备与版本说明3.1 工具清单本文的实操会用到以下工具工具用途备注Python 3.9运行 MkDocs 与自检脚本建议 3.10 或 3.11MkDocs把 Markdown 笔记构建成静态站点需要 pip 安装mkdocs-material 主题提供阅读体验较好的文档页面需要 pip 安装Git版本管理学习笔记需要本地安装并通过命令行使用GitHub / 其他 Git 托管平台远程保存仓库并触发自动化构建如果你使用 GitHub可使用 ActionsVS Code 或任意编辑器编写 Markdown 和代码不强制看你习惯版本这里要特别说明一下技术工具迭代比较快我不建议死记硬背某一套特定版本。下面的示例以我在写这篇文章时常用的环境为基础实际安装时请以你本机当前能获取到的稳定版本为准。关键是理解整体流程遇到版本差异时按官方文档调整即可。3.2 安装基础依赖先确认 Python 和 pip 已经可用。在终端里执行python3 --version pip --version如果你使用的是 Windows并且 Python 是通过官网安装包安装的可能需要把命令替换成python --version python -m pip --version然后安装 MkDocs 和 Material 主题pip install mkdocs mkdocs-material这里补充一句为了避免污染系统 Python 环境更推荐先在项目目录下创建一个虚拟环境。不过为了演示简单我这里直接用 pip 安装。实际项目里可以用python -m venv .venv创建隔离环境。创建一个项目目录并初始化 Gitmkdir tech-learning-site cd tech-learning-site git init后面所有操作都在这个目录下完成。4. 从零搭建“学霸型”笔记系统4.1 初始化 MkDocs 项目MkDocs 提供了一个非常方便的初始化命令mkdocs new .执行完成后项目根目录下会有两个东西mkdocs.yml站点配置文件docs/index.md默认首页。你还可以把整个目录结构调整成适合技术学习的状态。下面是一个我比较推荐的结构tech-learning-site/ ├── docs/ │ ├── index.md │ ├── journal/ │ ├── os/ │ ├── language/ │ ├── framework/ │ └── database/ ├── scripts/ ├── .github/workflows/ ├── site/ ├── requirements.txt ├── mkdocs.yml └── README.md说明一下每个目录的作用docs/journal存放每日学习记录相当于学习日记。docs/os操作系统、网络、部署相关的笔记。docs/language编程语言级笔记。docs/framework框架和中间件笔记。docs/database数据库相关笔记。scripts存放自动化检查脚本。.github/workflows存放 GitHub Actions 工作流。siteMkDocs 构建产物目录后面构建时会自动生成。手动创建这些目录mkdir -p docs/journal docs/os docs/language docs/framework docs/database scripts .github/workflows4.2 配置主题与导航编辑mkdocs.yml一个最小但可用的配置如下site_name: 我的技术学习实验场 site_description: 通过输出倒逼输入暴露盲区把知识变成能力 site_author: your-name repo_url: https://github.com/your-name/tech-learning-site theme: name: material language: zh features: - navigation.instant - navigation.tracking - content.code.copy palette: - media: (prefers-color-scheme: light) scheme: default toggle: icon: material/weather-sunny name: 切换深色模式 - media: (prefers-color-scheme: dark) scheme: slate toggle: icon: material/weather-night name: 切换浅色模式 markdown_extensions: - pymdownx.highlight - pymdownx.superfences - toc: permalink: true nav: - 主页: index.md - 操作系统: - 网络排查手册: os/network-check.md - 编程语言: - Python 虚拟环境: language/python-venv.md - 框架中间件: - Spring Security 最小认证流程: framework/spring-security-basic.md - 数据库: - MySQL 索引失效场景: database/mysql-index-failure.md这里的theme.name是 Material 主题。content.code.copy会在文章代码块右上角生成一个“复制”按钮。palette则用来支持亮色/暗色模式切换。配置文件中nav下面的路径必须真实存在于docs目录否则构建时会出现警告或错误。为了让站点能构建通过你还需要先创建这些 Markdown 文件。4.3 创建第一篇可验证笔记空笔记没有意义。我们试着写一个“框架笔记”用来验证自己是否真的理解了 Spring Security 的最小认证流程。创建文件docs/framework/spring-security-basic.md# Spring Security 最小认证流程 ## 一句话结论 在 Spring Boot 项目中引入 spring-boot-starter-security 依赖后 所有接口默认会被保护请求未认证时会跳转登录页或返回 401。 ## 最小验证步骤 1. 新建 Spring Boot 工程 2. 在 pom.xml 中加入依赖 3. 启动项目 4. 访问任意接口观察未认证时的行为。 ## 依赖坐标 下面是核心依赖片段 xml dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-security/artifactId /dependency需要注意的细节默认用户名是 user密码是启动时打印到控制台的一段随机字符串。 实际项目应该通过配置或数据库来管理用户不能使用默认密码。如果你还没学过 Spring Security看到这个文件也没关系。这个例子的价值在于用“一句话结论 验证步骤 依赖坐标 注意事项”来逼自己梳理学习成果。就算内容还不完整先留一个 TODO 标记也比空白笔记要好。 ### 4.4 生成每日学习模板 每日学习记录最好有个固定模板否则很难坚持。我们可以让 Python 脚本帮我们自动生成当天的 Markdown 文件避免每次手动复制。 创建 scripts/new_note.py python # -*- coding: utf-8 -*- 生成当日学习笔记模板。 import sys from pathlib import Path from datetime import date ROOT Path(__file__).resolve().parent.parent JOURNAL_DIR ROOT / docs / journal def generate_note(topic: str) - Path: today date.today().isoformat() title f{today}-{topic} file_path JOURNAL_DIR / f{title}.md file_path.parent.mkdir(parentsTrue, exist_okTrue) template f# {title} 一句话讲清楚今天我到底学会了什么。 ## 1. 今天要解决的问题 ## 2. 核心概念拆解 ## 3. 最小可行示例 ## 4. 验证与结果 ## 5. 踩到的坑 / 暴露的知识盲区 file_path.write_text(template, encodingutf-8) return file_path if __name__ __main__: topic sys.argv[1] if len(sys.argv) 1 else daily-topic print(generate_note(topic))执行python scripts/new_note.py git-rebase脚本会在docs/journal/下生成一个类似2024-05-20-git-rebase.md的文件。以后每天学习前先跑一遍这个脚本相当于给自己立了一个“今天必须输出一页笔记”的承诺。5. 让代码替你检查健康度自检脚本5.1 为什么要写自检脚本笔记写多了以后文件数量会越来越多。这时人工检查“哪些笔记还没写完、哪些地方有 TODO、哪些文章构建不过”很不现实。最好的方式是把这些判断交给代码。自检脚本可以做的第一件事是扫描所有 Markdown 文件里是否还有占位标记。下面我们写一个简单的health_check.py它会找出包含TODO、FIXME、待补充、待验证的文件。创建scripts/health_check.py# -*- coding: utf-8 -*- 扫描学习笔记中的占位标记用于提醒未完成内容。 import sys from pathlib import Path ROOT Path(__file__).resolve().parent.parent DOCS_DIR ROOT / docs KEYWORDS [TODO, FIXME, 待补充, 待验证] def scan_docs(): issues [] total 0 for md_file in sorted(DOCS_DIR.rglob(*.md)): file_text md_file.read_text(encodingutf-8) lines file_text.splitlines() for line_number, line in enumerate(lines, start1): for keyword in KEYWORDS: if keyword in line: issues.append((md_file.relative_to(ROOT), line_number, keyword, line.strip())) total 1 return issues, total def main(): issues, total scan_docs() if issues: print(f检查完成发现 {total} 处待处理标记\n) for file_path, line_number, keyword, content in issues: preview content[:60] print(f - {file_path}:{line_number} [{keyword}] {preview}) sys.exit(1) print(所有学习笔记均未包含 TODO/FIXME/待补充 等标记状态健康。) if __name__ __main__: main()这个脚本的退出码很有用只要发现待处理标记就返回 1。我们可以把它和 MkDocs 的严格构建结合起来让未完成的笔记在本地就被拦下来。执行脚本python scripts/health_check.py如果你还没有创建任何包含待处理标记的笔记输出会提示状态健康。如果你在文件里写了“TODO: 继续补充”脚本就会列出行号和具体内容。5.2 在文档笔记中故意留一个坑为了让你看到效果可以先在某个 Markdown 文件中写一行TODO这里需要补充一个真实的运行结果截图。再次运行python scripts/health_check.py你会看到类似下面的输出检查完成发现 1 处待处理标记 - docs/framework/spring-security-basic.md:12 [TODO] TODO这里需要补充一个真实的运行结果截图。这其实就是“暴露学渣”的过程。以前我们的 TODO 藏在文档里几天后自己都忘了。现在脚本会主动把未完成内容翻出来提醒你这篇笔记还没真正闭环。5.3 在本地构建中强制校验MkDocs 提供了一种比较严格的构建模式mkdocs build --clean --strict--clean会先清理旧的站点文件--strict会将文档中的警告也当作错误处理。这样即使某个页面导航路径写错、图片引用失败构建也会失败。在此基础上我们可以把健康检查脚本也加入本地发布流程。先用一条命令完成检查python scripts/health_check.py mkdocs build --clean --strict如果前面的脚本退出码为 1后面的构建就不会执行。这相当于给学习成果加了一道质量门禁。本地预览使用mkdocs serve --dev-addr127.0.0.1:8000浏览器打开http://127.0.0.1:8000就能看到站点效果。6. 发布到 GitHub Pages用 CI 暴露问题6.1 推送到远程仓库本地内容已经能构建接下来要把它发布到公网。公网内容可以被同事、网友甚至未来的自己访问本质上是把“私人学习笔记”升级为“可被验证的输出”。先把本地仓库关联到远程仓库git add . git commit -m 初始化技术学习站点 git branch -M main git remote add origin https://github.com/your-name/tech-learning-site.git git push -u origin main如果你的仓库还没有创建需要去 GitHub 上先建一个空仓库再把地址替换成自己实际的项目地址。6.2 编写 GitHub Actions我们希望每次推送代码后GitHub 都会自动执行以下动作拉取最新代码安装 MkDocs 依赖运行自检脚本执行严格构建把构建产物部署到 Pages。在.github/workflows/deploy-mkdocs.yml中写入name: Build docs and deploy to Pages on: push: branches: [main] workflow_dispatch: permissions: contents: read pages: write id-token: write concurrency: group: pages cancel-in-progress: true jobs: deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkoutv4 - name: Set up Python uses: actions/setup-pythonv5 with: python-version: 3.11 - name: Install dependencies run: | pip install mkdocs mkdocs-material - name: Run health check run: | python scripts/health_check.py - name: Build with MkDocs run: | mkdocs build --clean --strict - name: Upload Pages artifact uses: actions/upload-pages-artifactv3 with: path: site - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pagesv4这段工作流有几个关键点permissions.pages: write允许工作流写入 Pagesactions/upload-pages-artifactv3会把site目录上传为 Pages 构建产物actions/deploy-pagesv4负责部署动作如果python scripts/health_check.py检测到未完成标记退出码为 1后续构建会直接失败部署自然也不会执行。你需要到仓库的Settings - Pages - Build and deployment - Source中把发布来源改成 “GitHub Actions”这样上面的工作流才能正确部署。6.3 发布后的验证动作当工作流执行完成后在 Actions 页面可以看到运行记录绿色代表通过站点已部署红色代表失败需要点进去看哪一步报错。常见失败点就是我们特意加进去的 “Run health check”。比如某天你写了一份很潦草的笔记随手留了一个FIXME仓库收到代码后CI 会第一时间告诉你这篇笔记还没验证完。这就把“自己检查”变成了“系统检查”把暴露问题的时间点大大提前。等部署成功后任何人访问你的 GitHub Pages 地址都能看到你的学习站点。这会给写笔记增加一种仪式感既然发布出去了就不能再随意留一堆半成品。7. 常见问题与排查思路在实际运行这套流程时你会遇到不少环境或配置问题。下面整理了一些高频问题问题现象常见原因解决思路mkdocs: command not foundMkDocs 未安装或未激活虚拟环境执行pip install mkdocs如果使用虚拟环境需要先激活运行mkdocs serve报端口被占用8000 端口已被其他进程使用换端口mkdocs serve --dev-addr127.0.0.1:8080页面打开后没有样式Material 主题未安装或配置缩进错误执行pip install mkdocs-material检查mkdocs.yml中theme.name是否正确mkdocs build --strict报 Navigation 配置错误nav中写了不存在的 Markdown 文件检查nav路径与docs下的真实文件是否一致Markdown 渲染后代码块异常代码块三个反引号没有闭合检查原文中围栏是否成对在 VS Code 中开启 Markdown 预览辅助定位GitHub Actions 中 pip 安装依赖太慢默认源可能较慢或网络受影响可在requirements.txt中固定依赖并在工作流里使用镜像源但要确保生产环境兼容python scripts/health_check.py退出码不为 0笔记中有未处理的 TODO/FIXME 等标记按照输出路径定位文件补充内容后删除占位标记GitHub Pages 没有更新部署来源没有选 “GitHub Actions”到仓库 Settings - Pages 中设置构建来源actions/setup-pythonv5或actions/checkoutv4报错使用的 Action 版本较老或仓库环境限制查看仓库 Actions 页面提示升级到对应版本即可核心逻辑不变这些问题的解决思路有一个共性先看报错发生在哪一步再缩小范围到配置文件还是代码文件。不要一遇到问题就重新安装整台电脑的环境。8. 工程建议把“学渣模式”变成学习步骤8.1 每次学习都给出可验证目标很多学习计划失败是因为目标不可验证。“今天我学习了 Spring Security”这种目标很难说清是否完成。而“今天我能写出一篇带最小 Demo 的 Spring Security 笔记并且本地构建通过”就是一个可验证目标。你可以把目标写进每日笔记模板的## 1. 今天要解决的问题中。等章节全部写完代码运行通过再把## 4. 验证与结果填上这篇笔记才算真正完成。8.2 复盘时不要只记录“学会了”真正的复盘应该包括“哪里还没学会”。建议每次学完一个主题都回答三个问题这个技术解决什么问题我这次是背出来的还是确实动手验证过哪个环节最让我卡壳我下一次怎么避免第三个问题往往最有价值。卡壳的地方往往就是你从“学渣”变成“学霸”的必经门槛。8.3 刻意暴露盲区的三个时机“暴露学渣更容易”本身是中性的。问题在于你是选择在可控环境下暴露还是在不可控环境下暴露。我建议你刻意选择这三个时机写第一篇笔记时没人看你的仓库你可以放心地写出错误理解隔几天后重新检查再修正对比。本地构建失败时这是成本最低的失败。一条警告就能提醒你文档路径错了、代码块没闭合、思想没写透。文章发布到公网后当读者提出你没想过的问题时不要急着删评论把它当成一次免费的技术评审。8.4 警惕“收藏式输出”陷阱有些同学学习之后也写笔记但笔记内容是全文复制别人的文章这不是输出而是搬运。判断标准很简单如果三天后你重新打开自己的笔记是否能用自己的语言解释清楚如果还需要再去翻原文那说明这篇笔记基本没有完成“加工整理”。所以我的建议是引用别人的观点可以但必须标注来源复制代码片段可以但必须亲自动手运行一遍写完笔记后把原文合上尝试只根据笔记复述一遍核心逻辑。9. 总结与下一步技术学习最怕的不是“暂时不会”而是用大量收藏和浏览来伪装“已经学会”。冒充学霸并不难难的是愿意把自己放在输出和验证的回路里让每一个知识盲区尽早暴露。MkDocs、Git、GitHub Actions 和自检脚本组合在一起只是帮你实现这件事的工具核心仍然是你的学习习惯。今天你可以做三件事创建自己的tech-learning-site仓库按第 4 节的方法初始化站点并写一篇笔记配上 GitHub Actions让每天的提交都被自动验证一次。以后遇到报错或面试中答不上来的问题不要焦虑把问题记录下来回到学习仓库里写一篇新的验证笔记。坚持一个月后你再回头看最早那些空泛的笔记会被你不断迭代成真正经得起推敲的内容。这个过程才是从“学渣状态”走向“技术扎实”的必经之路。
返回列表