当编程变得不再有趣
作者通过dyld的__interpose机制拦截malloc等内存分配函数,编译动态库挂载到应用,当环境变量FAIL_NOW触发时,对≥100MB分配请求返回错误,结合mock server重现崩溃栈,精准定位问题。过程中AI工具Fable 5在五分钟内轻松解决难题,令作者震惊。作者回忆编程历史故事,如比尔·盖茨改造QDOS、求伯君用汇编写WPS、Linus Torvalds开发Linux,这些曾赋予编程魔法魅力。但AI介入后,编程乐趣发生变化,作者反思技术进步对编程体验的影响,探讨在AI时代如何保持创造性与挑战性,强调开发者需适应工具演进并持续学习。
代码在发臭:一个能"闻"出坏味道的 AI 技能,我拿它扫了最新的开源代码
代码坏味道是软件工程中的概念,指代码表面问题暗示深层缺陷,源于Kent Beck和Martin Fowler在1990年代的讨论。Fowler的《重构》一书列出22种坏味道,并配以重构手法。随着软件复杂度提升,坏味道分类扩展到8大类50+种,涵盖架构、耦合、内聚、设计、代码、测试、命名和复杂度等领域。在AI时代,代码生成加速导致坏味道产量增加,自动化检测变得关键。AI技能“/smell”能自动扫描代码库,识别坏味道并生成结构化报告。其工作流程包括确定扫描范围、并行使用启发式规则取证、生成带优先级的Markdown报告并落盘。实战中,扫描Go语言开源项目Gitlawb/zero,发现测试覆盖率良好但存在上帝对象(如4657行文件)和长文件问题,并提供重构路线图,如立即拆分超大对象、短期审查超长文件、长期优化复杂度。这体现了从直觉到自动化的发展,将主观焦虑转化为可执行清单,助力开发者提升代码质量。
我的 Claude Code 常用 SKILLS 和工具
作者基于长期使用Claude Code的经验,分享了常用的SKILLS和工具。SKILLS分为个人和工作两类:个人开发方面,agent-notifier实现在Agent任务完成时发送IM通知;kami可生成网页、简历、PPT等多种页面,展示其审美风格;ponytail以懒编程为核心,通过YAGNI原则、复用已有代码、优先使用标准库和原生特性来避免过度设计,支持lite、full、ultra三个强度级别;skilldeck提供可视化管理SKILLS的GUI工具,兼容命令行使用;web-access支持搜索引擎、网页抓取和浏览器CDP连接,实现带登录态的页面操作。工作场景中,generate-wiki适用于Java和gRPC项目一键生成静态wiki;starrocks-upgrade通过源码对比不同版本差异,评估StarRocks升级风险。工具方面,/tui fullscreen命令开启全屏模式,引入鼠标支持、无闪烁渲染和选中复制,增强文本编辑体验;statusLine接口允许通过自然语言描述自定义终端底部状态栏,显示模型、目录、Git分支、上下文使用率等信息,结合claude-hud插件提供更完整的监控。这些内容覆盖了从代码简化、页面生成到联网操作和版本管理的多种实用功能,体现了工具对开发流程的深度优化,旨在提升编码效率和终端交互体验。
Goal Workflow:目标驱动的研发闭环
Goal Workflow 是由 smallnest 开发的目标驱动研发闭环工具,基于流水线思维将功能开发从想法到上线划分为七个步骤:/prd 生成产品需求文档、/prd-to-spec 转化为技术规格(可选)、/to-issues 拆解为 Issue 卡片、/goal 基于 Issue 实现代码、/review-it 自动审查代码、/note-it 记录设计决策(可选)、/ship-it 提交 PR 并关闭 Issue。每个步骤定义明确的输入、输出和质量标准,步骤间无缝衔接,避免流程断点。与全自动工具如 autoresearch 相比,它在步骤间保留人工控制点,平衡自动化与用户干预,同时通过单 Agent 审查减少 token 消耗。工具基于 Skills 哲学,使用 npx skills 命令安装,支持 Claude Code、Codex、Antigravity CLI 等多种 AI 编码平台。文章详细介绍了安装配置、目录结构和平台兼容性,并对比了不同工具中 /goal 命令的实现差异,强调流水线思维如何提升 AI 辅助研发的可控性和效率。
重构:AI 时代的代码进化
在AI辅助开发时代,代码重构成为应对技术债的关键手段。重构旨在不改变外部行为的前提下优化代码内部结构,提升可读性和可维护性。技术债源于业务压力、缺测试等因素,AI加速代码生成可能迅速累积债务。Fowler的重构理论包括识别代码坏味道如过长方法、重复代码,以及应用手法如Extract Method。重构时机遵循三次法则:首次直接做,第二次忍耐,第三次开始重构;加功能、修bug或代码评审时也是自然时机。正确重构需确保代码变干净、不混入新功能、测试全通过。AI工具如goal workflow套件中的/refactor Skill,将Fowler的目录封装为AI Agent可调用能力,支持22种坏味道和40+种重构手法。它通过五阶段安全协议强制执行重构纪律,包括特征测试、小步提交和验证,将依赖自觉转为机器强制。/smell Skill提供更广泛的诊断,覆盖8大类50+坏味道,帮助优先处理问题。针对Java、TypeScript、Python等语言有特化指南,优化重构实践。AI时代,重构自动化不仅提高效率,还确保一致性,降低人为错误,促进代码库健康。
科技爱好者周刊(第 401 期):如何赚到10亿美元
科技爱好者周刊第401期整合创业见解与技术动态。创业部分引用保罗·格雷厄姆观点,强调通过高增长率(如月增15%)和庞大市场实现财富积累,举例说明指数增长潜力。技术文章介绍HTTP新增QUERY方法,作为带数据体的GET请求,不缓存参数;分析JWT令牌适用场景,建议仅用于跨机器状态转移而非用户登录;SQLite项目拒绝外部PR,因长期维护成本高昂。工具推荐Lore版本管理系统,优化二进制文件处理;DNS Pick命令行工具帮助优选DNS服务器;GitFolio提供轻量级Git仓库管理。AI工具包括Fishword背单词插件和OnePagent智能体工作台,增强开发效率。资源部分涵盖网页游戏和星空模拟器,文摘回顾米定义的科学演进。文章融合创业策略、技术更新与实用资源,为开发者提供多维度参考。
如何做决策 - 从 Go 的一个 issue 说起
本文由Go语言开源项目中一个重复提交提案的争议性issue切入,深入探讨了技术团队如何进行有效决策。文章引述了斯坦福教授John Ousterhout的“开放式决策”框架,其核心原则是:当试图推翻已定决策时,必须回答“你掌握了什么新的信息?”,若无则不予重新讨论。该框架将决策过程系统化为四个步骤:广泛收集意见、推动达成共识、清晰地宣布决定、以及基于新信息进行审慎的重新审议。文章强调,广泛收集意见需在“能改变结果”的阶段进行,并应尽早引入关键反对者。达成共识并非追求完全一致,而是通过透明投票获取多数认同,管理者应慎用否决权。决策的宣布必须明确且有据可查。文章还通过正反案例对比,分析了“害怕反馈”、“暗箱操作”和“草率收场”等常见误区,并讨论了该方法在鼓励建设性分歧、目标一致的中小型组织中尤为有效。最后,文章将其与“独裁者”式决策风格对比,指出后者依赖非凡直觉,难以复制。全文旨在为开发者和技术管理者提供一套可实践、可复制的工程决策流程,强调管理过程优于管理结果。
SPEC和PRD的区别
在软件开发中,产品需求文档(PRD)和技术规格说明书(SPEC)是两个关键文档,分别对应需求分析和系统设计阶段。PRD由产品经理主导,聚焦于“做什么及为什么做”,从用户与商业视角定义产品功能,包括用户故事、业务目标和信息架构,旨在转化商业需求为具体功能描述。SPEC则由技术主管或工程师负责,回答“怎么做及做成什么样”,关注技术实现细节,如数据库设计、API接口规范和系统边界,将PRD中的抽象需求落地为结构化标准。文章通过建造房屋的类比生动阐释:PRD如同业主需求清单(如“别墅两层”),SPEC则类似施工图纸(如“客厅面积45平方米,承重墙使用C30混凝土”)。此外,文章指出行业正从“看PRD写代码”转向规范驱动开发(SDD),因AI能高效执行高度结构化的SPEC,凸显其在自动化开发中的价值。在敏捷流程中,PRD先用于需求评审,SPEC随后指导编码和测试,确保从概念到实现的连贯性。
SPEC和方案设计有什么区别
在软件研发流程中,方案设计与SPEC(规格说明书)是两个关键但易混淆的文档类型。方案设计处于技术调研与评审阶段,核心是开放式的论证与权衡,通过对比多种备选方案(如缓存vs分库分表)来探索技术可行性,目的是暴露问题、达成共识,内容动态且可修改。SPEC则位于最终确认与开发阶段,作为闭环式的施工图,定义精准的技术细节,如API接口格式、数据库表结构和边界条件,提供静态、确定的执行标准,直接指导前端开发、测试用例编写等任务。例如,造桥场景中,方案设计讨论悬索桥与斜拉桥的选型理由,而SPEC规定斜拉索直径、混凝土标号等具体参数。实践中,团队可能将两者合并使用,前半部分写架构分析,后半部分写接口设计,以兼顾灵活性与确定性。理解区别有助于在不同研发阶段选择合适文档,提升协作效率与交付质量。
Seven Player:Windows上播放115网盘视频的增强工具
作者因115网盘的大空间和高速度优势,开发了Windows桌面播放器Seven Player。技术选型中,比较了Electron、Wails 3和Tauri 2.0,基于Go语言的熟悉度和Wails 3的轻量特性,选择Go + Wails 3框架。前端采用Vuetify组件库,数据库使用SQLite。开发过程中利用AI工具Codex辅助,但115开放平台审核暂停,转而参考开源项目webdav-115drive,通过Cookie获取数据并转出WebDAV协议。应用实现了文件浏览、外部播放器调用、云下载链接等功能,并自动过滤广告信息,以徽章显示技术名词。目前支持MPV、PotPlayer等主流播放器。资源库功能因数据刮削复杂而未实现。软件以Apache License 2.0开源,发布1.0.0版本,旨在简化115用户在Windows上的视频播放体验。
SmartPerfetto 2026.05.17-06.04 更新:Smart 模式、证据规则和四条 Runtime
SmartPerfetto v1.0.28 更新于2026年5月17日至6月4日,将工具从AI助手转向可复用Trace分析平台。新功能包括Smart模式,通过场景库存识别startup、scrolling、ANR等范围,用户可选择性深挖;选区快问利用Perfetto UI选择上下文,执行限定范围分析;CLI入口(smp capture/analyze)支持终端采集和分析,复用后端逻辑。证据规则扩展到Power、ANR、Input、Display、IO、Network、Observability等场景,确保报告结论基于结构化证据如SQL查询和Skill输出。引入四条Agent runtime:claude-agent-sdk、openai-agents-sdk、pi-agent-core、opencode,通过Provider Manager和环境变量选择,共享输出规范化流程。报告质量提升,包括最终报告检查、claim验证和诊断信息分离。改进包括trace processor预编译、Node 24硬化、Docker健康检查等。发布前进行严格E2E测试和验证。工具提供Docker、免安装包、源码、CLI等运行方式,适合Android性能分析团队使用。反馈指南强调版本、运行时和证据定位信息。
一个冷门的速查日历方法
终端中的 `cal` 命令是一款轻量高效的日历查询工具,特别适合开发者在编码过程中快速查看日期。其核心优势在于调用速度快,作为集成开发环境(如 VSCodium)终端面板的一部分,输入命令即可即时获取日历视图,无需切换至图形化应用。输出为纯文本格式,便于直接复制到笔记中进行后续整理或标注,契合偏好命令行操作的极简风格。 该命令提供多种参数以满足不同场景需求:通过 `cal 2025` 可直接查看指定年份的全年日历;`cal -m 3` 用于显示特定月份;`cal -3` 会同时呈现当前月及其前后月份,便于进行日期规划。进阶用法如 `ncal -w` 能够以每周一列的布局显示日历并附带周数,适合进行周期性任务管理。更多选项可通过 `man cal` 手册查阅,该命令历史悠久,自1971年首次出现在AT&T UNIX系统中,其稳定性和简洁性经受了长期考验。
Git 将某个文件恢复到其他分支的状态
Git 中恢复文件到其他分支状态有两种常用命令。假设当前在 main 分支,希望将 path/to/config.yaml 文件恢复到 dev 分支的状态,可以使用 git checkout dev -- path/to/config.yaml,或 git restore --source=dev -- path/to/config.yaml。这两种方法本质上相同,都通过指定源分支和文件路径,将目标文件从 dev 分支覆盖到当前分支,而不影响其他文件或提交历史。这种操作适用于版本控制中的局部文件恢复场景,例如在合并前同步配置或修复特定分支的代码差异。git checkout 是较旧的命令,而 git restore 是更现代且语义明确的替代,推荐使用后者以提高可读性。实际执行时,Git 会从 dev 分支提取文件内容,并更新当前工作区的对应文件,无需切换分支或创建额外提交。这两种方式都强调了分支独立性和文件级操作的灵活性,有助于维护代码库的一致性和可追溯性。
Stack Overflow: When We Stop Asking
Stack Overflow问题数量从2014年高峰的月均20万急剧下降到2026年不足3千,AI是直接冲击,但更早源于平台管理问题:为控制规模而过度关闭无法立即回答的问题,强调内容质量却导致社区封闭,新手难以提问且易受挫。AI虽提供快速答案,但生成的代码存在缺陷:Cornell研究表明AI代码更简单重复、有维护问题,MIT研究指出AI缺乏人类工程师
Star Trek : Captain's Chair 初体验
《星际迷航:船长之椅》是一款2025年发布的重度卡牌构筑桌游,规则复杂(BGG权重达4.06)。游戏核心在于动态管理卡组,通过LOG(永久移除)、deploy(部署至桌面)、beam(临时传送至飞船或星球)等多种机制进行灵活的卡组瘦身,显著提升了操作确定性。每张卡牌设计为一卡多用,且玩家在回合结束时可保留手牌、弃牌堆抽牌、新牌入堆位置可选等方式,深度调控牌堆轮转与升级节奏。游戏为每个舰长设计了差异化的初始牌组与固定补充卡堆,市场获取也改为通过特定行动卡实现。单人模式提供无干扰教学、对抗自动化Bot的不对称对战,以及可连续进行5-10局的长期升级“五年计划”。电子模拟版虽便捷,但实体版在触感、操作及反悔便利性上更具优势。作者学习过程中尝试使用AI(如Gemini)辅助理解规则,但AI对细节信息的处理常出现错误和“幻觉”,反映出在专业、小众领域辨别LLM信息价值的重要性。
读《控糖革命》
《控糖革命》一书挑战了传统的热量计算观念,指出维持健康的关键在于控制“血糖峰值”而非仅仅关注卡路里。血糖剧烈波动会引发氧化应激和糖化反应,损害细胞并加速衰老。尤其值得注意的是果糖,它无法像葡萄糖一样被储存,而是直接转化为脂肪,这也是甜食更易致胖的重要原因。 书中提出了九项实操技巧来平滑血糖曲线,其核心策略在于调整进食顺序:优先摄入纤维(蔬菜),接着是蛋白质和脂肪,最后才食用淀粉或糖。纤维能在肠道内形成缓冲层,有效减缓糖分吸收。其他实用方法包括:利用餐前蔬菜建立纤维屏障、警惕代糖的潜在误导、选择含蛋白质与纤维的早餐、避免单独食用甜点、餐前饮用醋或油醋汁,以及餐后进行轻微活动。这些方法旨在通过尊重代谢规律,而非极端节食,来自然改善精力、皮肤状态与身材管理。
Use Obsidian Sync on Desktop without Installing Obsidian
作者在使用Obsidian Sync时面临一个问题:Obsidian GUI是一个基于Electron的重型应用,运行桌面端同步时占用资源多,且一旦关闭同步就会中断。为解决此问题,作者采用了Obsidian发布的headless同步终端客户端obsidian-headless。该客户端通过CLI命令(如ob --continuous)实现笔记文件夹的实时同步,无需运行GUI应用。具体配置步骤包括:使用npm全局安装obsidian-headless,通过ob login和ob sync-setup
我让 Linux REAPER 实现了输入法的功能
Linux REAPER 长期缺乏输入法支持,作者自2017年起持续尝试解决这一问题,早期仅能通过复制粘贴或第三方输入框输入中文。2022年,作者在Fcitx输入法框架的讨论组获得开发者csslayer指导,明确了通过修改REAPER开源图形库SWELL来实现输入法功能的方向。这一突破得益于输入法框架的技术支持和Steam在Linux平台解决类似问题的启示。 实现方法基于编译或替换SWELL库文件。用户需先确保REAPER能显示CJK字符(通过fontconfig配置)并设置正确的输入法环境变量。安装可选择下载预编译的libSwell.so文件替换原有文件,或从源码编译,编译时必须启用SWELL_SUPPORT_IM=1选项,并配合SWELL_SUPPORT_GTK=1。该方案为Linux REAPER提供了基本的中文输入能力。 已知问题包括窗口重启后输入法候选框位置异常(如Media Explorer窗口未关闭时)以及不同DPI下候选框位置适配问题。作者建议手动调整编译参数以优化显示。该项目解决了Linux REAPER用户的中文输入需求,但仍存在部分交互细节待改进。
SetWindowText 引起的死锁
在基于ltask多线程框架的游戏开发中,使用sokol_app封装窗口时遇到了启动阶段偶发黑屏的问题。经排查,死锁源于跨线程调用SetWindowTextW修改窗口标题。由于该API内部通过SendMessageW投递WM_SETTEXT消息,要求窗口线程处理完毕才能返回,而窗口线程当时正阻塞在另一个同步锁上,形成循环等待。 Windows消息机制要求通过SendMessageW发送涉及字符串生命周期管理的系统消息,因此不能简单改用PostWindowTextW避免阻塞。最终解决方案是在ltask框架内创建一个独立服务来执行SetWindowTextW,通过服务间异步消息传递修改标题指令,从而避免阻塞主帧处理流程。这一案例揭示了多线程环境下GUI消息循环与任务调度器交互时的典型死锁陷阱,关键在于理解Windows线程消息队列的同步特性,并设计解耦的线程通信机制。
编写游戏程序的一些启示
在制作《Deep Future》桌游电子版的过程中,作者通过实践深入探讨了游戏程序开发的多个核心问题。他选择基于自研引擎进行开发,旨在理解游戏玩法设计与交互实现的难点,而非追求性能优化。在渲染架构上,他经历了从纯立即模式向混合模式的演进:保留模式用于管理如HUD布局和文本排版等静态层次结构,而立即模式则用于实现动态对象的灵活渲染。针对卡牌游戏特有的复杂图文混排需求,他借鉴了CSS布局思想并集成了Yoga库,同时通过自定义富文本协议解决了本地化与文本拼接的难题。 为分离游戏逻辑与视觉表现,作者引入了基于协程的状态机模型,以自然的时间序列模拟卡牌动画等流程。在交互管理上,他设计了兼顾立即模式风格的焦点轮询机制,通过平坦化的“区域”和“按钮”集合简化了事件处理。这些实践表明,游戏开发中合理的架构分层与状态管理是应对复杂性的关键,而持续的小幅迭代和反思比追求完美方案更能有效推动项目进展。