我开发了一个基于 Beancount 的账本托管服务 HostedBeans,欢迎大家来了解纯文本复式记账并试用我的服务。

HostedBeans: 基于 Beancount 的协作托管服务

我从 2019 年开始使用 Beancount 记账,作为一个开发者,我非常喜欢这样的纯文本工具 —— 纯文本意味着我可以使用我最熟悉的编辑器来编辑它、可以使用脚本进行批处理,还可以使用 Git 来进行版本控制,最大程度地利用我熟悉的工具。

在和蛋黄在一起之后,我们的资金和帐目不可避免地混在了一起,如果不把她产生的帐目一起记录进来,那么记账这个事情就显得没有什么意义了。但 Beancount 对于非开发者来说使用门槛还是太高了,需要在本地配置 Python、Git 等环境,前面提到的那样纯文本的优势对她来说其实是一种负担。所以她之前一直很难参与进来,即使只是查看 Fava 的图表,也需要我先在我的电脑上启动 Fava,然后把地址发给她。

为了让蛋黄至少能够随时查看图表,我调研了几个现有的 Beancount 托管服务,但我觉得它们都缺少了一些关键的能力:

  • Git 访问:纯文本是 Beancount 最大的特点,即使使用托管服务也不应该影响使用 Git 和本地编辑的工作流。
  • 多人协作:可以让多人共同访问一个账本,在 Web UI 对账本的修改也应该反应到 Git 中。

于是我开发了 HostedBeans 这个项目 —— 基于 Beancount 的协作托管服务,同时支持 Git 和 Fava 访问,可以为账本添加协作者并管理他们的权限,在 Web UI 上的改动也会以协作者的名字被自动同步进 Git。

使用 HostedBeans 你可以保持之前的工作流不变,在本地使用你熟悉的编辑器、使用 Git 进行版本控制,但同时解锁了随时随地打开 Fava 的能力,而且可以和你的家人共享这种能力,让他们参与到你的记账中来。

目前 HostedBeans 的功能已经全部可用,我还在继续进行一些细节调整来改善体验。如前面所说,HostedBeans 的目标是 Beancount 和 Fava 的托管服务,我今后我专注在「托管」这个方向上,不会添加「私有」的功能来锁定用户,确保用户可以随时迁移出来。比如 HostedBeans 不会自己实现任何实际的「功能」,而是会接入 Beancount 和 Fava 社区既有的插件,如有必要会直接在上游的开源项目中来开发功能。

欢迎访问 www.hostedbeans.io 注册帐号试用,我们的免费版本可以让你创建一个私有的账本并和其他一名协作者一起记账。如有疑问或者建议欢迎通过邮件、Telegram 或者 Twitter 联系我,联系我还可以免费获赠 Pro 帐号。

本文原载于 HostedBeans 的文档页面

离开 LeanCloud

从我 2015 年 加入 LeanCloud 已经 7 年多了,这是我人生中非常重要的一段时间,第一次独居、和蛋黄恋爱结婚、辗转三个城市、有了自己的积蓄、新冠疫情和封控,都发生在这期间。

我在 LeanCloud 一直在做 云引擎,加入公司两年后我就成为了这个产品的负责人。实际上在之前我就对后端托管很感兴趣,在 LeanCloud 这些年也是 Serverless 飞速发展的一段时间,我深度地参与到了云引擎的每一个方面 —— 无论是产品的设计、项目的管理,还是后端开发和运维这样的技术工作,尽我所能实现了这样一个适合于 LeanCloud 的产品形态,我也很高兴公司能在这个产品上给予我非常大的「自由发挥」的空间。

在这样一个技术主导、时间跨度接近十年的项目中,我得到了一个非常好的舞台去实践我的软件工程知识 —— 在开发功能的同时,我不断地在用我最新学到的知识来进行重构,为一些脆弱的实现寻找彻底的解决方案、降低代码的复杂度,用各种不同的方式来编写测试、文档、提升可观测性。同事们也都认可我在这些方面的努力,与大家的讨论也总是会给我带来新的想法。

江宏将 Google 的「工程师文化」带到了 LeanCloud,构建了一个对内透明、能够进行坦诚沟通的工作环境,并坚持执行了这么多年,实属不易。这样独特的文化也聚集了一群聪明、专业的同事。因为我的上一家公司番茄土豆同样非常独特,所以其实我是很晚才意识到 LeanCloud 的特别之处,意识到能和这样的同事一起工作是多么难得的事情。

在被收购后我在很努力地了解大公司工作的方式,但大公司终究难以兼容之前的团队文化,并有着它自身的「大公司问题」,随着业务重心和管理风格的变化、很多一起工作多年的同事的离开,这份工作逐渐变得不那么特别了。

同时,这么长时间地在一份工作上也让我在业余时间少了很多创作的灵感。因为工作本身就会占用大量精力,加上工作中的开发有着更强、更确定的正向反馈(其中最大的当然是按时间计算的工资),导致相比之下更难在业余项目上集中注意力,有点类似于 Overjustification effect 中所描述的,因为外部激励过强影响到了人内在的兴趣。

所以我觉得是时候离开寻求一些变化了,接下来我会休息一段时间,然后和蛋黄一起去加拿大学习、工作,之后的一段时间对我们来说应该会充满未知与挑战。

为什么我选择 Apple 设备

在最近几年,我发现自己渐渐买齐了差不多所有的 Apple 设备,我使用 MacBook Pro 在写这篇文章、工作时使用 Mac mini、手机是 iPhone、手上戴着 Apple Watch、使用 AirPods 听播客、在床上用 iPad mini 看视频,蛋黄同样也有自己的 iPhone、MacBook Air、iPad Pro 和 AirPods,我们家里还有一个 HomePod mini。

数据安全与隐私

我选择 Apple 的第一个理由是数据安全,iPhone 和 Mac 都是在业界率先普及全盘加密,并在近些年开始使用硬件安全隔区(Secure Enclave)强制加密的。就像 Apple 的很多功能一样,因为其对软硬件的垂直整合能力,Apple 可以在其所有品类的设备上,提供水平相当的数据安全保证。Apple 也在其在线服务中尽可能使用端到端加密,iMessage、健康、家庭等功能此前已经是端到端加密,2023 年起包括备份、文件、照片、备忘录、iMessage 聊天记录在内的几乎所有 iCloud 服务也都支持了端到端加密(Advanced Data Protection)。

在隐私保护方面,Apple 也是最特别的一家厂商 —— Apple 八成以上的收入来自于消费级硬件的销售,这也是 Apple 唯一的主营业务。这意味着 Apple 的商业模式决定了,相比于主要收入来自于广告和增值服务的互联网公司、相比于消费者业务仅占收入一小部分的软件公司,Apple 更有可能与消费者站在一起。

因此 Apple 的设备上你几乎见不到广告,Apple 也不会帮助第三方收集行为数据和投放广告,在互联网公司千方百计地希望你将数据上传到云端时,Apple 则是唯一坚持设备端机器学习的厂商 —— 将(明文的)数据留在设备端,使用设备端的机器学习芯片来提供 AI 能力。

我知道在一些人看来 Apple 不配于谈隐私,如果注重隐私的话应该使用能够自己掌控所有数据的开源方案。但我仍希望选择一家商业公司来获得更多便利和保证,Apple 则是其中最好的一个选择。

软件生态

对于大部分普通用户来说,Apple 最吸引人的是它的第一方软件生态,这些软件和系统、硬件有着深度的整合,有着非常不错的跨设备使用体验,也贯彻了前面提到的对数据安全和隐私的保护,以及 Apple 的对美学、工具和创造、社会责任和家庭等方面的追求。

照片可能是普通人在工作之外所产生的最多的「数据」了,Apple 在自己的生态内提供了一套无缝的照片管理体验。包括对 Raw 和 HDR 的支持、够用的照片编辑功能、对照片进行分类和搜索、用 AirDrop 或共享相册来分享照片等等。对照片的改动可以通过 iCloud 同步到所有设备上(包括手机、平板和电脑);但你也可以选择不使用 iCloud,因为所有的功能(包括机器学习驱动的功能)都是可以本地使用的。

这种贯穿所有设备的一致体验在所有第一方应用上都有体现,比如我平时每天都会用到的 Safari、备忘录、邮件、地图、播客等应用,虽然相比于更专业的第三方应用,这些系统内建应用的功能都比较有限,但它们共同保证了 Apple 设备的体验下限。曾经摄像头对我来说也是「扫个二维码而已」,但正是因为 Apple 提供了这样的照片拍摄、整理、处理的体验,才让我在最近几年慢慢喜欢上了摄影。

Apple 对于第三方应用有着非常强的控制,或者换一个角度来说是 Apple 非常善于搭建一个生态让第三方应用能够接入其中,权衡哪些部分应该由系统控制,哪些应该由应用发挥。例如 CloudKit、MapKit、HomeKit、HealthKit 这些框架为第三方应用的开发提供了便利,让第三方应用之间能够互相配合工作,降低用户的学习和迁移成本。出现新的软件或硬件功能时,也可以让第三方软件自动或简单地接入。所以我觉得不能简单地把 Apple 的生态描述为「封闭」,设计一个受控制但又能发展出繁荣生态的系统是非常困难的。

对于开发者来说,macOS 上有着社区驱动的 Homebrew,我几乎所有的软件都是用 Homebrew 安装的,可以让所有软件无论是 CLI 工具、各类 SDK 和 Runime 还是 GUI 应用都处于管理之下,可以一键安装、升级或卸载。因为 Homebrew 主要被使用在开发环境而不是生产环境,所以它会类似一些滚动更新的 Linux 发行版,通常只对最新版本的软件提供支持,刚好符合我的需要。

对于独立开发者来说,Apple 生态有着简单的学习路径、清晰的盈利模式,也正是因为如此,Apple 平台上有着大量高质量的独立软件,充分发挥比如 iPad、Apple Watch、Apple TV 这样的设备形态的独特优势。

硬件

Apple 在每个产品线上仅提供少量的 SKU,无论是不同产品线还是前后的两代产品,其设计都有着非常强的延续性。就我个人来说我更偏好这样有着清晰产品路线和规划的厂商,由厂商来对各种设计进行权衡,消费者只需做很少的选择。

因为 Apple 单个产品极大的出货量,Apple 是目前市场上为数不多能真正地按照自己的想法来决定产品的技术方向的公司 —— Apple 可以投入更多的资源去研发新技术,供应链的上下游也愿意配合 Apple 去将新技术落地。对于消费者来说,极大的出货量带来的好处则是更长的硬件支持时间、在遇到问题时更多的资料和配件,以及保值的二手价格。

实际上 Apple 也确实是在按照自己的标准在做硬件。你很难用其他厂商们都在竞争的屏幕刷新率、电池容量、相机像素数、内存容量去衡量 Apple 的产品,在很多配置参数上 Apple 确实并不占优,因为 Apple 的卖点始终都是包括软件功能在内的综合体验,硬件是为体验服务的,而不是为了与其他厂商竞争的。

不过作为一家公司,Apple 必须要让愿意花更多钱的客户能够有理由花更多的钱 —— 在 SKU 比较少的情况下,Apple 选择了用扩展内存和存储空间达到这一目的,这也是被很多人诟病的一点。

垂直整合

前面聊了几个具体的方面,但如果说有一个最本质的原因导致了这所有的结果的话,我觉得就是「垂直整合」。所谓垂直整合就是指 Apple 一家公司同时完成硬件的设计和制造、操作系统和第一方应用的开发维护、提供 iCloud 这样的软件配套服务,最后还通过 App Store 控制着第三方软件生态。

这种垂直整合使得 Apple 能够对其产品在消费者手中的体验有着完全的控制,贯彻一致的产品设计逻辑,同时也对所有的体验负责。因此 Apple 并不急于使用新的技术去与其他厂商竞争,而是可以以自己的节奏进行打磨,推出系统性的解决方案(例如 Mac 到 ARM 的转型、未来的 visionOS)。

所以说 iPhone 的对手并不是 Android,而是每一个 Android 设备厂商;Mac 的对手也不是 Windows,而是每一个 Windows 设备厂商,而整个 Apple 在个人计算设备领域则完全没有相同体量的对手。

12384

精子生于 1995 年,英文 ID jysperm.

订阅推送

通过 Telegram Channel 订阅我的博客日志、产品和项目的动态:

王子亭的博客 @ Telegram


通过邮件订阅订阅我的博客日志、产品和项目的动态(历史邮件):

该博客使用基于  Hexo  的  simpleblock  主题。博客内容使用  CC BY-NC-ND  授权发布。最后生成于 2023-12-20.