我为什么开始用 Beancount
两年前,我做了一个看起来很"反直觉"的决定:放弃了所有那些漂亮、智能、自动同步的商业记账 App,转而用纯文本记账。
是的,你没看错。现在我每一笔消费、每一笔收入,都记录在一个 .bean 文件里。没有图表,没有自动分类,没有"云端同步"。只有我、文本编辑器、和一些看起来像会计分录的 plain text。
很多人听到这里就会问:为什么?
被锁死的数据
故事要从我换手机说起。
那时候我用某款记账 App 用了三年。记录了三千多条交易,标签打得整整齐齐,每个月还能导出漂亮的报表分析——只要续费会员。
有一天我换了新手机,发现这个 App 的云端同步需要会员才能用。我的数据在他们的服务器上,但我拿不回来。导出功能?付费。批量导出?更贵的会员。
那一刻我突然意识到:这些数据不是我的,是他们的。
我花了三年时间帮他们的平台完善数据,现在他们要我把数据"赎"回来。
寻找属于我的记账方式
我开始寻找替代方案。主要诉求就两个:
- 数据必须在我手里- 格式要是开放的,不能被某个产品绑架找了很久,最后发现了 Beancount。 一个 Python 开发的复式记账工具。没有数据库,所有账目存在纯文本文件里。格式简单到令人发指: 2024-07-15 * "星巴克" Assets:Checking -35.00 CNY Expenses:Coffee:Shop 就这么简单。日期、交易对方、两个账户、金额。 ## 为什么是 Plain Text? 选择纯文本不是因为我喜欢复古,而是因为: 1. 永远不会过期 文本文件是计算机世界最通用的格式。十年后、二十年后,只要有文本编辑器,我就能看懂我的账目。不需要担心某个公司倒闭、App 下架、云端服务关闭。 2. 版本控制友好 我的账目目录是个 Git 仓库。每次记账 git commit 一下。我有完整的历史记录——可以追溯任何一笔修改是什么时候、为什么做的。这不是云端同步能比的。 3. 可编程 既然是文本,就能用代码处理。Beancount 本身就是 Python 生态,我可以写脚本自动抓取银行流水、自动分类、生成报表。这不是"高级功能",而是文本格式天然带来的自由。 4. 真正的复式记账 之前用的记账 App 大多是"单式记账"——记录"花了多少钱"。但复式记账要求每一笔交易都有来源和去向。钱从"现金"到了"餐饮",或者从"工资"到了"储蓄"。 这听起来很会计,但好处是:账永远不会不平。 如果漏记或多记,Beancount 会直接报错。 ## 踩坑实录 当然,这条路不是一帆风顺的。 第一周: 我把"贷"和"借"搞反了 N 次。复式记账的逻辑需要一点时间适应。 第一个月: 发现手动录入太慢,开始研究自动导入。花了一整周末琢磨如何把支付宝账单转成 Beancount 格式。 第三个月: 终于建好了自己的账户体系。但发现早期记录的分类太混乱,又花了一个周末批量重命名账户。 现在?现在我已经 800 多天没有断过记录。每天花 5 分钟,甚至少于一分钟。 ## 我学到了什么 这两年的 Beancount 实践,让我对"个人数据"有了新的理解: 数据主权不是一句口号。 当你的数据存储在别人控制的平台上,你就是租客。他们可以改规则、可以涨价、可以关停服务。而你的数据——那些记录了你生活轨迹的数字——本质上不属于你。 Plain text 是最彻底的数据主权。因为没人能阻止你打开一个文本文件。没人能因为你没续费就锁住你三年的回忆。 ## 写在最后 我不是说 Beancount 适合所有人。 如果你需要自动同步银行账户、需要漂亮图表、需要开箱即用的体验,那商业记账 App 可能更适合你。 但如果你和我一样:在意数据主权、喜欢可定制、愿意花一点时间建立自己的系统——那 Beancount 可能会打开一个新世界的大门。 我的账目文件目录现在是这个样子: beancount/ ├── main.bean # 主账本 ├── prices.bean # 价格记录 ├── accounts.bean # 账户定义 └── .git/ # 完整历史 简单、透明、永远属于我。 如果你也对 Beancount 感兴趣,可以从官方文档开始:beancount.github.io 中文社区也有不少资源,byvoid 的系列教程很值得一看。
Top comments (0)