多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Feishin 开发实践:Ponytail 技能与 YAGNI 懒惰开发方法论

Feishin 开发实践:Ponytail 技能与 YAGNI 懒惰开发方法论 桌面应用音视频前端【免费下载链接】feishinA modern self-hosted music player.项目地址https://gitcode.com/gh_mirrors/fe/feishin点击查看免费下载导读本文以 Feishin 仓库内实际启用的.claude/skills/ponytail/SKILL.md技能文档为核心系统讲解懒惰高级开发者Lazy Senior Developer这一编码方法论如何用最短的可工作方案Shortest Working Diff解决真实问题避免过度工程化。你将掌握 YAGNI 阶梯The Ladder的七级决策流程、lite / full / ultra三档强度模式、根因优先的 Bug 修复原则以及先彻底理解、再刻意懒惰的边界纪律。文章同时结合 Feishin 仓库源码如 shuffle.ts、random-string.ts、sanitize.ts与 AGENTS.md 工作模式配置给出可直接复用的落地样例。一、Ponytail 是什么一份被 Feishin 纳入开发工作模式的技能文档Ponytail 是 Feishin 仓库.claude/skills/目录下的一组 Agent 技能之一其来源记录在 skills-lock.json 中source: dietrichgebert/ponytail采用 MIT 许可。它并不直接实现音乐播放业务而是定义如何写代码的工程方法论。该技能在仓库中的地位并非装饰AGENTS.md 的 Working mode 一节明确写道Ponytail (lazy senior / YAGNI ladder) on coding tasks. See theponytailskill.也就是说Feishin 的 Agent 编码任务默认运行在 Ponytail 模式下。技能文档同时定义了它的触发词与禁用场景适用任何编码任务 - 编写、新增、重构、修复、评审、设计代码、选择库或依赖当用户说出 ponytail、be lazy、lazy mode、simplest solution、minimal solution、yagni、do less、shortest path或抱怨过度工程over-engineering、样板代码boilerplate、多余依赖时触发。禁用非编码请求常识问答、散文、翻译、摘要、菜谱等。一句话概括其世界观原文The best code is the code never written- 最好的代码是未曾写下的代码。Lazy 在这里被重新定义为高效而非粗心一个见过各种过度工程化代码库、凌晨三点被电话叫醒去修 bug 的高级开发者最清楚哪些代码不该存在。二、核心决策框架YAGNI 阶梯The LadderPonytail 方法论的骨架是阶梯The Ladder从最懒的选项开始逐级向下停在第一个能站住脚的台阶。阶梯问题含义1这个东西需要存在吗投机性需求Speculative need 跳过它用一句话说明理由YAGNI2代码库里已经有了吗已有 helper、util、type 或模式 → 直接复用跨几个文件重复造轮子是最常见的slop低质量冗余代码3标准库能搞定吗用它4平台原生特性能覆盖吗input typedate优于日期选择器库、CSS 优于 JS、数据库约束优于应用层代码5已安装的依赖能解决吗用它绝不为了几行代码能做的事引入新依赖6能一行搞定吗就一行7只有到最后写最少的工作代码阶梯的两个关键约束原文强调阶梯是本能反应不是研究项目- 但它运行在你理解了问题之后而非替代理解。先读任务、读相关代码、端到端追踪真实流程然后才爬楼梯。两级都能站住时取更高级更懒的那级并继续前进。第一个能用的懒惰方案就是正确方案- 前提是你确实知道这次改动需要触碰什么。阶梯在 Feishin 源码中的实际体现Feishin 仓库中随处可见阶梯思维的具体产物。例如 random-string.ts 全文只有 9 行一个randomString函数用字符集 Math.random()生成随机串默认长度 12。没有引入nanoid、uuid等依赖没有配置对象没有抽象接口 - 完全符合阶梯第 5、6 级已安装依赖优先于新依赖、能一行就一行。再看 shuffle.ts实现的是经典的 Fisher-Yates 原地洗牌shuffleInPlaceshuffle只负责先拷贝数组再调用。值得注意的细节是随机源没有用Math.random()而是用crypto.getRandomValues实现的cryptoRandom()返回契约与Math.random()一致的[0, 1)浮点数。这恰好印证了文档 Rules 中的一条两个标准库选项大小相同时选在边界情况下正确的那一个。Lazy 意味着写更少的代码而不是选更脆弱的算法。在洗牌这种需要均匀分布的场景密码学安全随机源是更稳的选择而多出的代码只有 3 行。三、规则体系八条不可逾越的编码纪律阶梯之外技能文档给出了八条硬性规则用于约束懒惰的边界不做未请求的抽象不写只有一个实现的接口、不写只有一个产品的工厂、不为从不变化的值引入配置。不要样板代码、不要为将来搭建脚手架- 将来需要时它自己会搭。删除优于新增枯燥优于花哨- 花哨是凌晨三点被叫醒的人要解码的东西。尽可能少的文件最短的可工作 diff 获胜- 但前提是你理解了问题。在错误位置做最小改动不是懒惰是第二个 bug。复杂请求直接交付懒版本并在同一回复中质疑Done X; Y 已覆盖。需要完整版 X 吗说一声。 - 永远不要因为一个你能给出默认答案的问题而卡住。两个标准库选项同等规模时选边界情况下正确的那一个见上文 shuffle 案例。标记有意的简化当简化确实切掉了一个有已知天花板的真实角落如全局锁、O(n²) 扫描、朴素启发式用ponytail:注释标明天花板和升级路径例如# ponytail: global lock, per-account locks if throughput matters。第 7 条在 Feishin 中同样有对应实践 - sanitize.ts 没有自研 HTML 清洗逻辑而是直接使用 DOMPurify标准/社区成熟库只在afterSanitizeAttributes钩子里补充了几行行为//开头的协议相对链接强制补成https:、a统一加target_blank与relnoopener noreferrer。这就是已安装依赖解决它就用它绝不为几行代码能做的事引入新依赖阶梯第 5 级的样板 - 清洗逻辑交给被广泛验证的库自己只补业务策略。四、输出格式代码优先解释最多三行文档对交付物有严格的表达纪律代码优先。随后最多三行短句跳过了什么、什么时候该补回来。不要散文、不要功能巡礼、不要设计笔记。如果解释比代码还长删掉解释- 每一段为简化辩护的段落都是用散文形式偷运回来的复杂性。用户明确要求的解释报告、走查、分阶段笔记不是债务应当完整给出规则只针对未被请求的散文。标准输出模式为[code] → skipped: [X], add when [Y].即[代码] → 跳过了[X]当 [Y] 时补上。五、强度级别lite / full / ultra 三档技能通过argument-hint: [lite|full|ultra]暴露强度参数默认是full可用/ponytail lite|full|ultra切换级别在会话结束前持续生效。级别行为变化lite构建用户要求的东西但用一行点出更懒的替代方案由用户选择full强制运行阶梯标准库与原生特性优先最短 diff、最短解释默认ultraYAGNI 极端主义者删除优先于新增交付一行方案的同时当场挑战需求其余部分文档用为这些 API 响应加个缓存给出了三档的完整对比示例lite: Done, cache added. FYI:functools.lru_cachecovers this in one line if youd rather not own a cache class.full: lru_cache(maxsize1000)on the fetch function. Skipped custom cache class, add when lru_cache measurably falls short.ultra: No cache until a profiler says so. When it does:lru_cache. A hand-rolled TTL cache class is a bug farm with a hit rate.三档的核心差异在于质疑的强度lite 允许先做再提示full 强制走阶梯ultra 连需求本身都要被挑战。六、持久性与退出机制技能默认ACTIVE EVERY RESPONSE每次响应都生效不会漂移回过度构建不确定时依然生效。退出命令stop ponytail或normal mode恢复正常模式。级别持久化直到被修改或会话结束。边界说明Ponytail 管构建什么不管怎么说话可搭配 Caveman 技能实现极简文风两者职责分离。七、什么时候绝不允许懒惰文档用 When NOT to be lazy 划出红线以下内容永不简化信任边界上的输入校验input validation at trust boundaries防止数据丢失的错误处理安全措施无障碍基础能力accessibility basics任何被明确要求的内容- 用户坚持要完整版就完整构建不再争辩这三条保证懒惰不会滑向危险可以砍掉投机性抽象但永远不能砍掉让系统在真实世界中存活的基本防护。八、理解优先懒惰从不豁免阅读这是技能文档中分量最重的警示原文用一整节强调Never lazy about understanding the problem. The ladder shortens the solution, never the reading.即阶梯只缩短解决方案从不缩短阅读。修改前必须追踪整个链路 - 改动会触碰的每一个文件、真实的数据流 - 然后才选阶梯。跳过理解、只为交付小 diff 的懒惰是危险的那种它把自己装扮成效率交付一个自信的错误修复。正确姿势是Read fully, then be lazy先完整阅读再懒惰。配套还有一条针对 Bug 修复的硬性原则Bug fix root cause, not symptom.报告命名的是症状。动手前grep你要改的那个函数的每一个调用方。懒惰的修复就是根因修复在共享函数里加一个守卫diff 比在每个调用方各加一个守卫更小 - 而只修补 ticket 点名的那条路径会让所有兄弟调用方继续带着 bug。在所有人汇聚的地方修一次。这条原则在 Feishin 这类大型渲染器代码库中尤其重要一个被 20 处调用方共享的 util 函数如 sanitize.ts 的sanitize如果在单点修好就避免了 20 处重复修补和遗漏。九、最小可运行检查懒惰代码必须自证文档对测试的态度同样遵循 YAGNI非平凡逻辑一个分支、一个循环、一个解析器、一条金钱/安全路径必须留下一个可运行的检查- 能证明逻辑坏了的最小东西基于assert的demo()/__main__自检或一个小型test_*.py。不用框架、不用 fixture、除非被要求否则不建逐函数测试套件。平凡的一行代码不需要测试 - YAGNI 同样适用于测试。这与 Feishin 仓库的 CI 策略形成呼应AGENTS.md 规定类型检查在 CItest.yml中运行而非本地本地只跑pnpm lint:staged对暂存的 TS/TSX/CSS/SCSS 做 eslint stylelint 自动修复 - 保持最小检查而非最大套件。十、硬件世界的例外物理世界需要校准旋钮技能文档特别指出一个反直觉的例外硬件从来不是纸面上的理想状态 - 真实时钟会漂移、真实传感器读数会偏差、PCA9685 会快几个百分点。在这种情况下留下校准旋钮calibration knob而不只是更少的代码- 物理世界需要微调而最小模型看不见这种偏差。这条提醒懒惰的边界在于算法可以极简但对抗物理现实的调节能力不能省。结语最短的路径就是正确的路径Ponytail 方法论的核心可以浓缩为其最后一句话The shortest path to done is the right path.到达完成的最短路径就是正确路径。它通过 YAGNI 阶梯、八条纪律、三档强度与理解优先的硬边界把懒惰重新定义为一套可执行的决策系统。在 Feishin 仓库中这套方法论不是停留在文档里AGENTS.md 把它设为默认工作模式shuffle.ts、random-string.ts、sanitize.ts 等源码则是阶梯决策的活样本 - 标准库优先、边界情况正确、删除优于新增、理解先于动手。对任何想减少样板代码、对抗过度工程的开发者这份技能文档都值得作为日常编码的默认参考。赞分享桌面应用音视频前端【免费下载链接】feishinA modern self-hosted music player.项目地址https://gitcode.com/gh_mirrors/fe/feishin点击查看免费下载相关推荐Ponytail OpenClaw Skill 解析让 AI Agent 按懒惰资深开发七级阶梯写最少代码Ponytail OpenClaw Skill 解析让 AI Agent 按懒惰资深开发七级阶梯写最少代码 本文以 .openclaw/skills/po人工智能AI 技能AI 插件提示工程AI 评测CMake Presets完全攻略vscode-cmake-tools中配置、构建与测试的最佳实践CMake Presets完全攻略vscode cmake tools中配置、构建与测试的最佳实践 vscode cmake tools是一款强大的Visuaponytail-mcp把 Ponytail 的“懒高级开发”规则集通过 MCP 暴露为 Prompt 与 Toolponytail mcp把 Ponytail 的“懒高级开发”规则集通过 MCP 暴露为 Prompt 与 Tool 本篇围绕仓库中 ponytail mcp人工智能AI 技能AI 插件提示工程AI 评测上一篇ItChat 通讯录管理全指南好友、公众号、群聊的获取、搜索与 Uin 唯一标识详解下一篇5大核心策略揭秘Taste-Skill如何让AI设计摆脱平庸模板化困境创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表