我的 AI 采纳之旅【译】

本文原文地址,使用claude进行了翻译,作者是HashiCorp的创始人Mitchell Hashimoto。 作者:Mitchell Hashimoto | 原文日期:2026年2月5日 我在采纳任何一款有价值的工具时,通常都会经历三个阶段:(1)低效期、(2)适应期,最终才到达(3)彻底改变工作流程乃至生活方式的顿悟期。 大多数情况下,我必须强迫自己熬过第一阶段和第二阶段——因为我通常已经有一套令自己满意且顺手的工作流程。引入新工具意味着额外的付出,我实在不想花这份力气,但出于对所在领域的全面性追求,我通常还是会去尝试。 这篇文章记录了我如何在 AI 工具链中找到真正价值的历程,以及我正在探索的下一步方向。在一片夸大其词、充斥炒作的声浪中,我希望这篇文章能呈现一种更细腻、更审慎的视角,如实反映我对 AI 的看法是如何随着时间推移而演变的。 本文完全由我亲手写就,字字出自本人之口。这句话放在这里本不必要,但鉴于文章的主题特殊,我想明确声明。 第一步:放弃聊天机器人 立即停止通过聊天机器人(如 ChatGPT、Gemini 网页版等)完成有实质意义的工作。聊天机器人确实有其价值,也是我日常 AI 工作流程的一部分,但在编程场景下,其效用极为有限——因为你基本上是寄希望于模型凭借预训练知识碰巧给出正确答案,而纠错则需要人工(即你本人)反复告知它哪里错了,效率极低。 我认为,几乎所有人与 AI 的第一次接触都是聊天界面。同样,几乎所有人第一次尝试用 AI 辅助编程,也都是向聊天界面输入需求、让它生成代码。 在我还是个坚定的 AI 怀疑论者时,我第一次发出"哇哦"的感叹,是将 Zed 命令面板的截图粘贴给 Gemini,让它用 SwiftUI 复现出来——它的表现之出色令我真正震惊。如今 Ghostty macOS 版中内置的命令面板,正是在 Gemini 几秒内为我生成的代码基础上,仅做了极少量改动后发布的。 但当我试图将这种成功经验复制到其他任务时,却屡屡失望。在存量代码库(brownfield project)的上下文中,聊天界面产出的结果往往很差,我发现自己在代码和命令输出的复制粘贴上来回折腾,效率明显低于亲自动手。 要真正发掘价值,你必须使用智能体(Agent)。智能体是业界公认的术语,指能够在对话循环中调用外部能力的大型语言模型(LLM)1。至少,该智能体必须具备以下能力:读取文件、执行程序,以及发起 HTTP 请求。 第二步:用智能体重现自己的工作 在探索历程的下一阶段,我尝试了 Claude Code。直说吧:最初我并不买账。每次会话产出的结果都不尽如人意,几乎每次都需要大量的后期修改,这比自己动手还要耗时。我读了不少博客文章、看了不少视频,但依然兴趣寥寥。 没有放弃,我强迫自己用智能体重做所有原本手动完成的提交(commit)。我字面意义上把每件事做了两遍:先手动完成,再与智能体较量,迫使它在质量与功能上达到相同水准(当然,不让它看到我的手动方案)。 这个过程极其痛苦,因为它妨碍了"把事情做完"这一最直接的目标。但我与非 AI 工具打交道的经验足够丰富,深知摩擦阻力是一种自然现象,不把精力耗尽就无法得出坚实可靠的结论。 然而,专业认知在磨砺中逐渐成形。我从第一性原理出发,很快就亲身验证了别人已有的发现——而正因为是自己发现的,底层理解也更为深刻: 将会话拆分为若干清晰、可执行的独立任务,切勿试图在一次超长会话中"一步画完猫头鹰"。 对于模糊的需求,应将工作分拆为独立的规划会话与执行会话,分步推进。 若为智能体提供校验其工作成果的手段,它在大多数情况下能够自主纠错,并有效防止功能退化(regression)。 更宏观地看,我也摸清了当时智能体的能力边界——它们擅长什么、不擅长什么,以及对于它们擅长的任务,如何获得满意的输出。 这一切带来了显著的效率提升——我开始自然而然地使用智能体,感觉不比自己亲手做更慢(尽管也没感觉更快,因为我大部分时间仍在充当"监工")。 这里有一个值得反复强调的"负空间":效率提升的一部分,恰恰来自于清楚地知道何时不该使用智能体。让智能体去尝试它很可能失败的任务,显然是巨大的时间浪费;而掌握这种判断力、主动规避,本身就是一种节省2。 第三步:下班前的智能体任务 为了进一步挖掘效率空间,我开始尝试一种新的工作模式:每天预留最后 30 分钟,用于启动一个或多个智能体任务。我的假设是:如果智能体能够在我无法工作的时间里取得实质进展,或许就能在时间之外创造时间。也就是说:与其在现有的工作时间内多做事,不如在原本"空置"的时间里多做事。 和之前一样,起初我觉得这既无效又令人烦躁。但我很快又梳理出了几类真正奏效的工作: 深度研究型会话:让智能体梳理某个领域,例如找出某种语言中采用特定许可证的所有库,并为每个库生成多页摘要,涵盖优缺点、开发活跃度、社区口碑等维度。 并行探索模糊构想:同时启动多个智能体,分别尝试我还没时间着手的不同想法。我并不指望它们产出可上线的成果,但希望它们能帮我在第二天真正着手时,提前发现一些"未知的未知"。 Issue 与 PR 的分类梳理:智能体善用 gh(GitHub CLI),我编写了一个简单脚本来并行启动多个智能体做 Issue 分类。我不允许智能体直接回复,只需要隔天早上看到报告,帮助我识别高价值或低难度的任务。 需要说明的是,我没有像某些人那样,让智能体整夜不停地循环运行。大多数情况下,任务在半小时内就会完成。但工作日下午的后半段,我通常已经精力耗尽、离开心流状态,个人效率大打折扣——将这段精力转移到启动智能体任务上,让我第二天早上能够"热启动",比以往更快进入工作状态。...

掌控 LLM 输出:API 层的干预手段

你买不到模型的权重,但你可以在 API 层实施"外科手术式"控制。本文用 OpenAI Go SDK 演示每种干预手段在真实业务中的完整用法。 前置准备 go get github.com/openai/openai-go // client.go — 全文共用的客户端 package main import ( "github.com/openai/openai-go" "github.com/openai/openai-go/option" ) func newClient() *openai.Client { return openai.NewClient( option.WithAPIKey("sk-..."), // 或读取 os.Getenv("OPENAI_API_KEY") ) } 1. System Message — 给模型装"人格芯片" 原理 System Message 是发给模型的"宪法",在对话开始前设定角色、禁忌和回答格式。它不会被用户消息覆盖(模型会优先遵从)。 业务场景:客服机器人只允许回答产品相关问题 package main import ( "context" "fmt" "github.com/openai/openai-go" ) func customerServiceBot(userQuestion string) (string, error) { client := newClient() resp, err := client.Chat.Completions.New(context.Background(), openai.ChatCompletionNewParams{ Model: openai.F(openai.ChatModelGPT4o), Messages: openai....

Bun ORM 全面指南:Go 语言高性能数据库操作利器

(本文内容基于 Bun ORM 官方文档 翻译整理) 1. 简介:什么是 Bun ORM? Bun 是一个 SQL 优先的 Go 语言 ORM(对象关系映射)框架,支持 PostgreSQL、MySQL、MSSQL 和 SQLite。它旨在提供一种简单高效的方式来操作数据库,同时利用 Go 的类型安全特性并减少样板代码。 核心特性 基于标准库构建:构建在 Go 标准 database/sql 包之上 类型安全:提供类型安全的查询构建器,性能卓越 复杂关系支持:支持复杂的关系和连接操作 迁移支持:提供迁移和架构管理功能 强大的扫描能力:全面的数据扫描功能 钩子和中间件:支持钩子和中间件 生产就绪:经过广泛测试,可用于生产环境 为什么选择 Bun? Bun 通过 SQL 优先 的理念区别于其他 Go ORM,不试图对开发者隐藏 SQL。这种方法具有以下优势: 可预测的查询:你确切知道生成的 SQL 是什么 高性能:对原始 SQL 的开销最小 渐进式采用:易于集成到现有代码库 灵活性:需要时可降级到原始 SQL 类型安全:大多数操作的编译时检查 2. 安装与配置 安装 Bun 要安装 Bun 和所需的数据库驱动: # 核心 Bun 包 go get github.com/uptrace/bun@latest # 数据库驱动(选择一个或多个) go get github....

在Dokploy中通过Cloudflare Tunnel发布应用

通过 Cloudflare Tunnel,你可以不需要公网 IP、不需要在路由器/防火墙开启 80 或 443 端口,就能安全地将 Dokploy 上的应用发布到互联网。 核心流程图 用户 -> Cloudflare 域名 (HTTPS) -> Cloudflare 隧道 -> Docker 内部网络 (HTTP) -> 你的应用容器 第一步:在 Cloudflare 创建隧道 (Tunnel) 登录 Cloudflare Zero Trust。 进入 Networks -> Tunnels -> Create a Tunnel。 选择 Cloudflared,起个名字(如 my-server)。 在安装页面,找到 Connector Token(那一长串字符串),复制备用。 第二步:在 Dokploy 中部署隧道服务 在 Dokploy 中新建一个 Compose 服务(建议命名为 cloudflare-tunnel),使用以下配置: services: cloudflared: image: 'docker.1ms.run/cloudflare/cloudflared:latest' environment: - 'TUNNEL_TOKEN=你的TOKEN' # 建议在 Environment 变量中设置 networks: - dokploy-network # 必须加入此网络 restart: unless-stopped command: ["tunnel", "--no-autoupdate", "run"] networks: dokploy-network: external: true 第三步:部署应用 (以 Excalidraw 为例) 部署应用时,务必确保它与隧道在同一个 Docker 网络中,以便隧道能通过“服务名”找到它。...

Git Filer Repo快速指南

本文使用claude code编写,旨在提供一个详尽的 git-filter-repo 使用指南,涵盖安装、基础概念、路径和内容过滤、实用场景、高级功能、安全机制、完整工作流示例、故障排除、性能优化、常见错误与陷阱、与其他工具配合以及最佳实践总结等方面的内容。 什么是 git-filter-repo? git-filter-repo 是一个快速、功能强大的 Git 历史重写工具,是 git filter-branch 的官方推荐替代品。它由 Git 项目贡献者 Elijah Newren 开发,速度比 filter-branch 快 10-100 倍以上。 核心原理: git fast-export <options> | filter | git fast-import <options> git-filter-repo 同时扮演管道编排者和中间过滤器的角色,基于 fast-export 和 fast-import 实现高效的历史重写。 为什么选择 git-filter-repo? vs git filter-branch 特性 git filter-branch git-filter-repo 速度 极慢(大型仓库几乎不可用) 快 10-100 倍 安全性 易出错,可能静默损坏数据 内置多重安全检查 易用性 复杂的 shell 语法 简洁的命令行参数 跨平台 依赖 shell,跨平台问题多 纯 Python,跨平台一致 官方态度 已废弃,不推荐使用 Git 官方推荐 Git 官方警告: filter-branch 的问题无法向后兼容地修复,强烈建议停止使用。...

Calude Code编写的Ent ORM 完整指南

本文由claude code生成。作为备忘录和分享,欢迎指正和补充。 一、Ent简介 Ent是一个简单但功能强大的实体框架,用于Go语言,使构建和维护具有大型数据模型的应用程序变得容易。 Ent是由Meta(Facebook)开源团队构建的ORM框架,提供了一个API,用于将任何数据库模式建模为Go对象。 核心特性 Ent的主要特性包括: Schema As Code:将任何数据库模式建模为Go对象 轻松遍历任何图结构:运行查询、聚合并轻松遍历任何图结构 静态类型和显式API:100%静态类型和显式API,通过代码生成实现 多存储驱动支持:支持MySQL、PostgreSQL、SQLite和Gremlin 易于扩展:使用Go模板简单扩展和自定义 Ent是一个相当新的ORM,使用代码优先的方法,在Go代码中定义模式。Ent之所以流行,是因为它能够优雅地处理复杂的数据模型和关系。 二、快速开始 2.1 安装Ent # 初始化Go模块 go mod init myapp # 安装ent CLI工具 go install entgo.io/ent/cmd/ent@latest # 或者使用go get go get entgo.io/ent/cmd/ent 2.2 创建第一个Schema # 创建User实体 ent new User 这会在 ent/schema/ 目录下生成一个基础的schema文件: package schema import ( "entgo.io/ent" "entgo.io/ent/schema/field" ) // User holds the schema definition for the User entity. type User struct { ent.Schema } // Fields of the User....

在Go里面实现Google和Apple OAuth登录

本文由claude code编写,仅供参考。 在现代应用开发中,提供第三方登录已经成为标配功能。本文将详细介绍如何在Go语言中实现Google和Apple的OAuth登录,以及如何处理iOS和Android的原生登录。 一、OAuth 2.0 基础概念 OAuth 2.0是一个授权框架,允许应用在用户授权的情况下访问用户在第三方服务上的资源,而无需获取用户的密码。主要流程包括: 授权请求:引导用户到OAuth提供商的授权页面 授权确认:用户同意授权 获取授权码:重定向回应用并携带授权码 交换令牌:使用授权码换取访问令牌 访问资源:使用访问令牌获取用户信息 二、Google OAuth登录实现 2.1 前期准备 首先需要在Google Cloud Console创建项目并配置OAuth 2.0凭据: 访问 Google Cloud Console 创建新项目或选择现有项目 启用Google+ API或Google Identity服务 创建OAuth 2.0客户端ID(Web应用、iOS、Android分别创建) 配置授权重定向URI 2.2 安装依赖 go get golang.org/x/oauth2 go get golang.org/x/oauth2/google go get google.golang.org/api/oauth2/v2 2.3 Web端Google登录实现 package main import ( "context" "encoding/json" "fmt" "log" "net/http" "os" "golang.org/x/oauth2" "golang.org/x/oauth2/google" oauth2api "google.golang.org/api/oauth2/v2" "google.golang.org/api/option" ) var googleOauthConfig *oauth2.Config func init() { googleOauthConfig = &oauth2....

Homebrew Tap 仓库简明指南

本文为Claude整理编写。 什么是 Homebrew Tap Homebrew Tap 是第三方的 Homebrew 软件包仓库。通过创建自己的 Tap,你可以发布和分发自己的软件包,而不需要将它们提交到官方的 Homebrew 仓库。 Tap 的命名规则: homebrew-<tapname> 用户使用时的格式:username/tapname/软件名 Formula vs Casks:核心概念 这是 Homebrew 中最重要的区别,理解这一点对于正确组织你的 Tap 至关重要。 Formula(公式) 用途: 安装命令行工具、从源代码编译的软件、开发库和服务 特点: 可以从源代码编译或安装预编译二进制 安装到 /usr/local/bin(Intel)或 /opt/homebrew/bin(Apple Silicon) 在终端中运行 文件放在 Formula/ 目录 安装命令: brew install git brew install python brew install myapp 适用场景: ✅ 命令行工具(git, wget, curl) ✅ 编程语言(python, node, ruby) ✅ 开发库(openssl, libpq) ✅ 后台服务(redis, nginx, postgresql) ✅ 系统工具和实用程序 Casks(桶) 用途: 安装 macOS 原生应用程序、字体、驱动等...

Hertz使用笔记

Hertz的优缺点 优点 中文社区维护 稳定,字节产品,有相关的开源项目参考,比如coze和coze studio hz的模板支持,使得代码生成更加灵活 缺点 工程体验上,不如go-kratos等项目。比如不能很好得支持buf等第三方生态。代码生成的使用场景,如多service模式下体验不好。 Template 模板 之所以将模板放在第一,是因为Hertz里面模板是过不去的坎。😄官方的一个mvc的template 或者 cwgo内置的模板 自动生成路由注册 新建一个template/package.yaml layouts: # 覆盖默认 router.go 模板 # 关键:将 Register 函数名改为包含服务名的唯一名称 - path: router.go delims: ['{{', '}}'] body: |- // Code generated by hertz generator. DO NOT EDIT. package {{$.PackageName}} import ( "github.com/cloudwego/hertz/pkg/app/server" {{- range $k, $v := .HandlerPackages}} {{$k}} "{{$v}}" {{- end}} ) /* This file will register all the routes of the services in the master idl....

Omarchy 使用笔记

omarchy是DHH发布的一款Arch内核的Linux发行版。最近安装了下,稍作记录 特色功能 命令行 可以使用 eza替换ls 快捷键 导航快捷键 Super + Space:应用启动器 Super + Alt + Space:Omarchy 控制菜单 Super + Escape:锁定、暂停、重启、关机 Super + Ctrl + L:锁定计算机 Super + W:关闭窗口 Ctrl + Alt + Del:关闭所有窗口 Super + T:切换窗口的平铺/浮动模式 Super + O:切换窗口为粘性浮动模式 Super + F:全屏显示 Super + Alt + F:全宽度显示 工作区快捷键 Super + 1/2/3/4:跳转到指定工作区 Super + Tab:跳转到下一个工作区 Super + Shift + Tab:跳转到上一个工作区 Super + Ctrl + Tab:跳转到之前的工作区 Super + Shift + 1/2/3/4:移动窗口到指定工作区 Super + Shift + Alt + 方向键:将工作区移动到指定显示器 窗口管理快捷键 Super + 方向键:将焦点移动到指定方向的窗口 Super + Shift + 方向键:与指定方向的窗口交换位置 Super + Equal:向左扩展窗口 Super + Minus:向右扩展窗口 Super + Shift + Equal:向下扩展窗口 Super + Shift + Minus:向上扩展窗口 Super + G:切换窗口分组 Super + Alt + G:将窗口移出分组 Super + Alt + Tab:在分组中的窗口间循环切换 Super + Alt + 1/2/3/4:跳转到分组中的指定窗口 Super + Alt + 方向键:将窗口移动到指定方向的分组中 Super + Ctrl + 方向键:在平铺分组中的窗口间移动 Super + S:显示便签工作区覆盖层 Super + Alt + S:将窗口移动到便签工作区 系统控制快捷键 Super + Ctrl + A:音频控制(wiremix) Super + Ctrl + B:蓝牙控制(bluetui) Super + Ctrl + W:WiFi 控制(impala) Super + Ctrl + S:共享菜单(通过 LocalSend) Super + Ctrl + T:活动监视器(btop) 应用启动快捷键 Super + Return:终端 Super + Shift + B:浏览器 Super + Shift + Alt + B:浏览器(隐私/无痕模式) Super + Shift + F:文件管理器 Super + Shift + M:音乐(Spotify) Super + Shift + /:密码管理器(1password) Super + Shift + N:Neovim Super + Shift + C:日历(HEY) Super + Shift + E:邮件(HEY) Super + Shift + A:AI(ChatGPT) Super + Shift + G:消息(Signal) Super + Shift + Alt + G:消息(WhatsApp) Super + Shift + Ctrl + G:消息(Google) Super + Shift + D:Docker(LazyDocker) Super + Shift + O:Obsidian Super + Shift + X:X 通用剪贴板快捷键(统一系统) Super + C:复制 Super + X:剪切(终端中不可用) Super + V:粘贴 Super + Ctrl + V:剪贴板管理器 注意:在 Linux 上,通常需要在终端中使用 Ctrl + Shift + C/V 进行复制粘贴,而在其他地方使用 Ctrl + C/V。Omarchy 的统一剪贴板快捷键在所有地方都有效(文件管理器除外)。...