👀 最新、最有用的AI编程姿势,总来自「知识药丸」
《贾杰的AI编程秘籍》付费合集,共10篇,现已完结。30元交个朋友,学不到真东西找我退钱;)
以及我的墨问合集《100个思维碎片》,1块钱100篇,与你探讨一些有意思的话题(文末有订阅方式
写在前面
用 Claude Code 写代码,它自己改文件、跑命令、提交代码,我在操作全自动编程机。但问题来了:我只是在旁边看着,什么都没学到。它写了一堆代码,我看都没看懂就提交了。
这种感觉很诡异——虽然任务完成了,但我好像什么技能也没获得。
直到我发现了这个 learning-output-style 插件,一切都变了。
我发现的问题
我先来说说传统的 AI 辅助编程是什么样的。
我提个需求,AI 哗啦啦写了一堆代码,然后我要么全盘接受,要么复制粘贴到自己的项目里。听起来很高效对吧?
但实际上呢?我只是个搬运工,我并没有真正理解代码的设计思路,没有参与到关键决策中。这就像是——我请了个装修师傅帮我装修房子,他干活很快,但我完全不知道为什么水管要这么走,为什么电路要那么布。
等到下次遇到类似问题,我还是不会。
我理解的 Learning 插件核心思想
这个插件的理念非常优雅:不要让 Claude Code 把所有事情都做完,而是让它成为我的导师。
它会在关键决策点停下来,让我自己写 5-10 行真正有意义的代码。
注意,不是让我写那些无聊的模板代码(boilerplate),也不是让我填无脑的 CRUD 操作,而是让我参与到那些真正需要思考的地方:
- • 业务逻辑有多种实现方式时,我会选哪种?
- • 错误处理策略是宽松还是严格?
- • 算法要优先考虑性能还是可读性?
- • 用户体验和安全性该如何权衡?
这些决策会真正影响产品的行为,而这正是我应该学习和掌握的地方。
我研究了它的工作原理
整个插件的实现非常简洁,核心就是一个 SessionStart Hook。
我先来说说 Claude Code 的 Hook 机制(这个设计真的很聪明)。
Hook 是什么?
在 Claude Code 里,Hook 是用户定义的 shell 命令,会在 Claude Code 生命周期的特定时刻自动执行。它们提供了确定性的控制——不需要依赖 AI 模型"记得"去做某件事,而是通过应用层代码保证每次都会执行。
Claude Code 提供了 8 种 Hook 事件:
- •
PreToolUse: 在工具调用前执行(可以拦截) - •
PostToolUse: 在工具调用后执行 - •
PermissionRequest: 权限请求时执行(可以自动批准或拒绝) - •
UserPromptSubmit: 用户提交 prompt 时 - •
Stop: Claude 响应完成时 - •
SubagentStop: 子代理任务完成时 - •
SessionStart: 会话开始时(这是我们今天的主角) - •
SessionEnd: 会话结束时
其中 SessionStart Hook 会在 Claude Code 启动新会话或恢复现有会话时触发,我的脚本输出会被添加到对话上下文中。这意味着,无论 Claude 回答什么问题,它都会先"看到"这段上下文。
我看到的插件结构
我研究了一下这个插件的目录结构,非常清爽:
plugins/learning-output-style/ .claude-plugin/ plugin.json # 插件元信息 hooks/ hooks.json # Hook 配置 hooks-handlers/ session-start.sh # 实际执行的脚本 README.md
关键在于 session-start.sh 这个脚本。它的作用就是输出一段 JSON 格式的指令,告诉 Claude:"嘿,你现在进入 Learning 模式了,记得让用户参与编程。"
我来看看这段脚本的核心(简化版):
`#!/usr/bin/env bash
cat << 'EOF'
{ "hookSpecificOutput": { "hookEventName": "SessionStart", "additionalContext": "你现在处于 'learning' 输出风格模式..."
}
}
EOF`
没错,就是这么简单。通过 cat 命令输出一段包含详细指令的 JSON,Claude Code 会自动把这段内容注入到会话的上下文中。
我总结的 Learning 模式行为准则
插件注入的指令里包含了非常详细的行为准则,我把核心内容提炼一下:
1. 什么时候请求我贡献代码?
当遇到以下情况时:
- • 有多种有效的实现方式可选
- • 需要在安全性和用户体验之间权衡
- • 设计模式的选择会影响架构
- • 我的领域知识能改进解决方案
2. 什么时候不请求?
- • 模板代码或重复性代码
- • 显而易见、没有选择余地的实现
- • 配置或设置代码
- • 简单的 CRUD 操作
3. 怎么请求?
这里有个非常优雅的模式:
首先,Claude 会:
- 1. 创建文件并填充周围的上下文代码
- 2. 添加函数签名和清晰的参数/返回类型
- 3. 用注释解释目的
- 4. 用 TODO 或占位符标记位置
然后,Claude 会告诉我:
- • 它已经构建了什么,以及为什么这个决策很重要
- • 具体在哪个文件的哪个位置
- • 需要考虑的权衡、约束或可选方案
- • 这个输入如何影响功能的行为(而不是无意义的填空)
- • 建议的代码量(5-10 行)
我试了一个实际的例子
假设我在做一个用户认证系统,Claude 可能会这样跟我互动:
Claude: 我已经设置好了认证中间件的基础结构。现在有个关键决策需要你来做——会话超时行为。
这是个安全性 vs 用户体验的权衡:
- • 自动延长会话:用户体验好,但会话可能保持更长时间
- • 硬超时:更安全,但可能打断活跃用户
请在
auth/middleware.ts中实现handleSessionTimeout()函数来定义超时行为。
看到了吗?Claude 不是直接把代码写完,而是:
- 1. 解释了上下文(已经做了什么)
- 2. 说明了决策的重要性(权衡点在哪)
- 3. 给出了清晰的位置(哪个文件的哪个函数)
- 4. 提供了思考的方向(两种方案各有什么优劣)
然后轮到我了。我会写下类似这样的代码:
function handleSessionTimeout(session: Session): boolean { const now = Date.now(); const elapsed = now - session.lastActivity; if (elapsed > SESSION_TIMEOUT) { return false; // 硬超时,更安全 } session.lastActivity = now; // 延长会话 return true; }
这 5-10 行代码,你真正思考过,真正做出过选择。下次遇到类似场景,你会知道该怎么做。
双重功能:Learning + Explanatory
有意思的是,这个插件其实融合了两种模式:
- 1. Learning 模式:让你主动参与编程
- 2. Explanatory 模式:提供教育性的见解
在写代码的前后,Claude 会用这种格式给你提供见解:
☆ Insight ───────────────────────────────────── • 为什么选择这种数据结构而不是那种 • 这个设计模式在我的代码库中如何应用 • 这个权衡决策的长期影响 ─────────────────────────────────────────────────
这些见解不是泛泛的编程概念(比如"什么是闭包"),而是针对我的代码库、我的具体实现的深度分析。这才是真正有价值的学习内容。
我理解的它与 CLAUDE.md 的关系
细心的读者可能会问:这和 CLAUDE.md 有什么区别?
CLAUDE.md 是项目级的配置文件,而 SessionStart Hook 是更灵活的机制,允许通过插件分发。
我的理解是:
- • CLAUDE.md: 静态的项目说明书,适合描述项目结构、代码规范等
- • SessionStart Hook: 动态的行为指令,可以执行脚本、读取环境变量、甚至调用外部 API
两者可以完美配合。CLAUDE.md 告诉 Claude "这是什么项目",而 SessionStart Hook 告诉 Claude "你应该怎么工作"。
我是怎么使用这个插件的?
使用非常简单(前提是我已经安装了 Claude Code):
- 1. 把插件代码放到我本地某个目录
- 2. 在
.claude/settings.json中配置插件路径 - 3. 启动 Claude Code,插件会自动激活
需要注意的是,Claude Code 会继承我的 bash 环境,能访问所有工具。对于自定义的 bash 工具,需要在配置中说明,否则 Claude 不知道它们的存在。
我注意到的安全性问题
这里有个非常重要的点我必须强调。
Hook 会在代理循环中以我当前环境的凭证自动运行。这意味着,恶意的 Hook 代码可能会:
- • 窃取我的数据
- • 修改敏感文件
- • 执行危险命令
所以,Claude Code 包含了一个保护机制:直接编辑 Hook 配置文件需要在 /hooks 菜单中审查后才能生效。
我永远不会盲目安装来源不明的插件。在使用任何插件之前,我务必检查它的代码,特别是 Hook 脚本。
为什么我觉得这个设计很棒?
通过研究这个插件,我发现它体现了几个优雅的设计理念:
1. 最小化的实现
整个插件的核心就是一个 shell 脚本和一段 JSON 配置。没有复杂的依赖,没有晦涩的 API,任何懂一点 bash 的人都能看懂、修改、扩展。
2. "Learn by doing" 的教育理念
被动观察永远不如主动实践。通过让用户在有意义的决策点贡献代码,这个插件确保你通过实践来发展实用技能。
3. 灵活的 Hook 机制
SessionStart Hook 不仅可以注入静态文本,还能执行脚本、读取文件、调用 API。这为无穷无尽的自动化场景打开了大门。比如我可以:
- • 读取 git 状态和 TODO 列表
- • 从项目管理工具拉取当前 sprint 的任务
- • 检查代码覆盖率并提醒 Claude 关注
- • 动态加载团队的编码规范
4. 可组合性
插件可以和其他 Claude Code 功能完美结合:MCP servers、自定义命令、其他插件。我可以构建一个强大的开发工作流,而所有这些都是用简单的配置文件拼接起来的。
我能想到的改进方向
当然,这个插件也不是完美的。我能想到一些可以改进的地方:
1. 更智能的决策点识别
现在 Claude 需要自己判断什么时候应该请求用户贡献。如果能有一些启发式规则或者代码分析工具来辅助判断就更好了。比如:
- • 检测到多个 if-else 分支 → 可能需要用户决策
- • 发现关键的配置常量 → 询问用户的偏好
- • 识别到性能敏感的代码段 → 讨论优化策略
2. 学习进度追踪
如果能记录我参与的决策点和学习轨迹就太棒了。比如:
- • 这个月我参与了 15 个架构决策
- • 我在错误处理方面的决策越来越成熟
- • 推荐我学习的下一个领域是...
3. 社区知识库
我在想,如果有个平台让大家分享"典型决策点"和"最佳实践"会怎样?比如:
- • "Express.js 中间件设计的 3 个关键决策点"
- • "React 状态管理:何时用 Context,何时用 Redux"
- • "数据库索引策略:性能 vs 存储的权衡"
我的总结
这个 learning-output-style 插件虽然代码量很小,但思想很深刻。
它回答了一个核心问题:在 AI 辅助编程的时代,我作为开发者应该扮演什么角色?
我的答案是:不是"旁观者",也不是"搬运工",而应该是"决策者"和"学习者"。AI 处理繁琐的细节,我负责关键的思考和选择。
通过 SessionStart Hook 这种简洁的机制,Claude Code 让这种协作模式变得自然而优雅。我不需要学习复杂的 API,不需要配置重量级的框架,只需要一个 shell 脚本和几行 JSON 配置。
如果你也在用 Claude Code,我强烈建议试试这个插件。它会让你从"被 AI 喂饭"变成"和 AI 一起做饭"——后者显然更有成就感,也更能让你真正成长。
P.S. 记得在使用任何插件前检查代码,安全第一。
参考资料
- • Claude Code 官方文档
- • Claude Code Hooks 指南
- • Claude Code 最佳实践
- • Anthropic GitHub - claude-code
- • Claude Code 钩子配置深度指南
坚持创作不易,求个一键三连,谢谢你~❤️
以及「AI Coding技术交流群」,联系 ayqywx 我拉你进群,共同交流学习~