你有没有注意到一个有趣的现象?同一个团队里的两个 Go 工程师,打开电脑后的第一件事可能完全不同——一个正在等 docker-compose up 把容器启动起来,另一个已经用 go run 跑起了服务。
工具选择,往往比技术选型更能暴露一个工程师的性格和价值观。
最近听了 Go Podcast 第 72 期,两位主持人 Dominic St-Pierre(2001 年就开始写代码的老兵)和 Morten Vistisen(全栈合同开发者)花了一个多小时聊他们每天在用的工具。有趣的是,他们在几乎每个话题上都产生了分歧——但这些分歧恰恰是最有价值的部分。
我把他们讨论的核心内容整理出来,加上自己的理解,分享给你。
Podman 对阵"我就不装 Docker"这可能是整期播客里最激烈的讨论。
Dominic 是 Podman 的坚定拥护者。他的核心论点很直接:
"
Podman不需要root权限,完全运行在用户空间。对我来说,这带来了很多好处。"
Podman 作为 Docker 的替代品,最大的卖点就是 rootless。不需要守护进程,不需要特权模式,命令行接口和 Docker 几乎一模一样。如果你一直对 Docker Desktop 的许可证变更、资源占用或者 root 权限要求心存不满,Podman 值得一试:
# Podman 的命令和 Docker 几乎完全兼容
podman run -d --name pg -p 5432:5432 -e POSTGRES_PASSWORD=dev postgres:latest
podman run -d --name redis -p 6379:6379 valkey/valkey:latest
但 Morten 的态度截然不同。他更喜欢直接在本地安装依赖:
"容器化开发环境的承诺很美好,但实际体验总是比直接运行慢很多。"
Dominic 立刻反驳:"如果你需要 Valkey、Redis、Postgres 和一堆其他服务,你不想全装在本地机器上吧?"
Morten 倒也坦诚——他承认自己创建过大量 Docker Compose 文件为团队提供开发环境,但个人开发时,他更喜欢知道每样东西装在哪里,自己管理。
我的看法:这其实是两种工程师思维的碰撞。Dominic 追求的是环境一致性和隔离性,Morten 追求的是性能和掌控感。没有对错,关键看你的场景——如果你在一个多人团队里,容器化几乎是必选项;如果你是独立开发者,直接装也未尝不可。
Caddy:被低估的 Go 基础设施利器这是整期播客里两人最一致的话题——都对 Caddy 赞不绝口。
Caddy 是用 Go 编写的 Web 服务器和反向代理,自动 HTTPS 是它的招牌功能。但 Dominic 提到了一个更强大的特性——动态 SSL 证书按需生成:
"你可以让
Caddy接受所有流量。如果某个域名没有SSL证书,它会调用你指定的API,获取允许的域名列表,然后自动生成证书。这个功能让我震惊了。"
这对 多租户 SaaS 架构来说简直是天赐之物。想象一下:每个客户有自己的自定义域名,你不需要手动管理任何证书,Caddy 自动搞定一切。
Morten 的用法略有不同,他主要通过 Caddy 的 Admin API 动态注册域名,无需重启或修改配置文件:
# 通过 Caddy Admin API 动态添加路由(无需重启)
curl localhost:2019/config/apps/http/servers/srv0/routes \
-X POST \
-H "Content-Type: application/json" \
-d '{
"match": [{"host": ["newclient.example.com"]}],
"handle": [{"handler": "reverse_proxy", "upstreams": [{"dial": "localhost:8080"}]}]
}'
相比 Nginx 的配置文件地狱和 Traefik 的复杂标签系统,Caddy 的简洁程度确实令人印象深刻。而且,它本身就是 Go 写的——如果你需要自定义行为,直接写 Go 插件就好。
作为一个终端重度用户,Morten 推荐了两个值得关注的数据库工具。
USQL——通用 SQL 命令行USQL 是一个 Go 编写的通用数据库 CLI,支持 PostgreSQL、MySQL、SQLite、SQL Server 等几乎所有主流数据库,而且统一了操作语法:
# 连接不同数据库,同一套命令
usql postgres://localhost/mydb
usql mysql://root@localhost/mydb
usql sqlite:///path/to/db.sqlite
# 在任何数据库里都可以用 \dt 查看表(沿用 psql 习惯)
\dt
"我不需要在
psql和MySQL CLI之间来回切换了。它就像是psql的薄包装层,但支持所有数据库。"
DBLab——终端 UI 数据库客户端如果你想要比纯命令行更直观,但又不想离开终端,DBLab 提供了一个 TUI(终端用户界面)。
不过 Morten 也坦言,在生产环境他还是用 DBeaver——因为 GUI 客户端有更好的安全防护机制,能避免误操作。
Dominic 则聊到了 SQLite,对它的设计赞不绝口。SQLite 作为一个嵌入式数据库,代码质量和测试覆盖率在整个软件工程界都是标杆。如果你还没有把 SQLite 纳入你的工具箱——无论是做数据分析、本地缓存还是嵌入式存储——我建议你认真看看。
AI 辅助开发:用 20 美元换来的纪律性AI 编程是当下最热的话题,两位主持人的态度非常务实——用,但有边界。
Morten 订阅了 Anthropic 和 OpenAI 的 20 美元月度计划。他说了一句很有意思的话:
"额度刚好够用。不总是够,但这迫使我保持在一个中间点——我仍然在写代码,仍然在仔细审查
AI的输出。"
20 美元的限制反而成了一种自律机制。 因为 token 有限,你不得不思考什么值得交给 AI,什么应该自己写。
Dominic 的用法更偏向非代码场景。他让 Claude 审查自己开源项目的营销网站:
"我给了很多上下文,然后说:给我诚实的评审。结果被残忍地烤了。但那种没有情感、纯粹技术性的反馈,确实很有价值。"
关于 Go 代码生成,两人的态度出奇一致地保守:
AI 写 Go 代码(对输出质量不满意),但前端和 React 代码完全交给 AIAI 当头脑风暴伙伴和迁移工具,架构决策自己做Morten 提出了一个我认为非常深刻的观点:
"如果你用
AI来加速写代码,就必须接受代码会变得马虎。不可能又快又好。"
他们还提到了一个令人警醒的案例:某个 AI 辅助开发的项目导致数百万驾照信息通过不安全的 S3 存储桶泄露。AI 能帮你写代码,但安全审查的责任永远在你身上。
Docker 还是裸奔?部署策略上,两人再次展现了不同的风格。
Morten 的 SaaS 产品直接在裸机上通过 systemd 部署——编译出二进制文件,配一个 systemd service,完事。这种方式简单直接,但零停机部署是个挑战。
# 一个典型的 Go 服务 systemd 配置
[Unit]
Description=My Go API Server
After=network.target
[Service]
Type=simple
ExecStart=/opt/myapp/server
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
如果你用 Docker + Traefik 的组合,零停机部署是现成的——Traefik 自动检测新容器,无缝切换流量。但对于小规模运营,Dominic 的态度很实际:几秒钟的停机,谁在乎呢?
这让我想到一个原则:不要为了解决你没有的问题而引入复杂性。Kubernetes 很强大,但如果你的服务只跑在一台机器上,systemd 就够了。
播客中还提到了几个有趣的工具:
工具 | 类型 | 亮点 |
|---|---|---|
Crush | AI 编程助手 | Go 编写,带 LSP 集成,前身是 OpenCode |
MailPit | 邮件测试 | 本地邮件服务器,开发测试邮件功能的利器 |
Traefik | 反向代理 | Go 编写,自动服务发现,和 Docker 无缝集成 |
Whisper | 语音转文字 | OpenAI 的 STT 模型,可用于开发工作流自动化 |
最后,两人聊了一些他们想做但还没做的工具——这些想法本身就很有启发性。
Dominic 想做一个 CLI 邮件客户端。不是 TUI,而是真正的命令行工具——执行完每个操作后回到 shell 提示符,用 IMAP/SMTP 协议,用文本表格显示邮件列表。
Morten 想做视频转录和自动剪辑工具,用 Whisper 做语音识别,自动切割视频中的无声片段。他提到 YouTube 创作者 Dreams of Code 已经用 Rust 实现了类似的工具。
这两个需求有个共同点:用 Go 的 CLI 生态来解决日常工作流中的摩擦。 这可能也是 Go 最擅长的事——快速编译、单一二进制文件、跨平台——天然适合做 CLI 工具。
这期播客让我最有感触的,不是某个具体工具的推荐,而是两位资深 Go 工程师在工具选择上展现的务实态度:
Docker 做开发,不是因为不会,而是直接安装对他更高效AI 订阅限制反而帮助保持代码审查的习惯systemd 够用就不上 Kubernetes,几秒停机可以接受就不折腾零停机Caddy、Traefik、USQL、Crush——用自己熟悉的语言构建的工具,出问题时你能读源码AI 是工具,不是替代品。 用它做无聊的迁移,用它当评审,但架构和安全决策必须自己做选择工具和写代码一样——最好的方案不是功能最多的那个,而是摩擦最小的那个。
Podman: https://podman.io/Caddy: https://caddyserver.com/USQL: https://github.com/xo/usqlDBLab: https://github.com/danvergara/dblabCrush (Go 编程助手):https://github.com/charmbracelet/crush本文基于 Go Podcast Episode 072 的内容整理改写,加入了笔者的个人理解和补充。如果你对 Go 开发工具链感兴趣,推荐直接收听原节目获取更多细节。