2026-10-02 08:00:00
最近做了一个新的开源项目,叫留白(LeftBlank)。这是一个基于 Typst 的 macOS 写作工具,可以用来写文章、技术笔记,也可以写比较长的文档。程序免费,代码也开源,目前已经有一个可以下载使用的开发预览版。
我平常主要做后端开发,这次做一个桌面软件,有不少东西需要重新学习。这篇文章介绍一下留白现在能做什么,以及之前用 Emacs 时接触到的一些设计,怎么影响了这个项目。
写文档时通常有两件事要做,一件是把内容写清楚,另一件是把页面排好。对于技术文档,公式、表格、代码和图片又会增加一些工作。Markdown 很适合记笔记,但是需要控制页面布局的时候,就得再找其他工具。
Typst 提供了一个挺好的选择。它是一个基于文本的排版系统,文档本身是普通的源文件,可以用标记和函数来描述内容与样式,再编译成 PDF。下面就是一个简单的例子:
= 一份技术笔记
这里可以写普通的文字,也可以写公式:
$ f(x) = x^2 + 1 $
#table(
columns: 2,
[项目], [说明],
[编辑器], [留白],
[排版引擎], [Typst],
)
可以看到,文字、公式和表格都放在同一个文档里。需要更复杂的功能时,还可以使用 Typst Universe 里的包,比如画图或者给代码块加上行号。
有了排版引擎,编辑器还有很多可以做的事。比如怎么方便地找到一个命令,怎么在源文档和页面之间跳转,怎么让一篇长文章读起来更舒服。留白主要想把这些日常使用的问题处理好,让写作和看排版结果可以在一个程序里完成。
我在 2020 年写过一篇 Spacemacs 的介绍。当时那篇文章很简单,主要列了一些常用的操作和按键。其中一个我很喜欢的设计,就是按下前缀键以后,可以看到接下来有哪些命令可以用。
编辑器的功能越来越多,快捷键也会越来越多。平常经常用的几个很好记,但是偶尔才用一次的功能,下次需要的时候很可能就忘了。Spacemacs 和 which-key 的做法很实用:把命令按用途分组,每按一步,都提示下一步能做什么。
留白也采用了类似的方式。按下 ⌘J 会打开命令面板,然后可以按照提示继续选择。例如插入一个表格:
⌘J 打开命令面板。i 进入插入分组。t 插入表格。如果不知道一个功能属于哪个分组,可以按 / 搜索所有命令。常用的操作也有直接快捷键,用熟之后就可以直接执行。
2026-10-02 08:00:00
I recently started a new open-source project called LeftBlank, or 留白 in Chinese. It is a macOS writing app built around Typst, for articles, technical notes, and longer documents. The app is free, the source is open, and a development preview is already available to download.
Most of my work is on the backend, so building a desktop app has given me quite a few things to learn. In this post, I want to introduce what LeftBlank can do today and explain how some ideas I encountered through Emacs influenced the project.
2026-02-21 08:00:00
2023 年我把 duckdb-rs 交给 DuckDB 官方维护之后,心里一直有个没做完的题:
如果 DuckDB 在单机进程里已经足够强,那怎么把这份能力变成一个更容易接入、可部署、可观测的服务?
SwanLake 就是我给这个问题的答案。
它本质上是一个基于 Rust 的 Arrow Flight SQL Server,底层执行引擎是 DuckDB,同时围绕 DuckLake 做了数据湖场景的能力扩展。更准确地说,SwanLake 的核心组合是 DuckDB + DuckLake + Arrow Flight SQL。
我最早做 duckdb-rs 的时候,目标是把 DuckDB 更自然地带到 Rust 生态里。这个目标后来基本实现了,但新的问题也很明确:
所以 SwanLake 从一开始就不是“再封一层 API”,而是想做一个可以真正放进生产系统的分析服务入口。
SwanLake 可以按 5 层来理解:
服务对外暴露 Flight SQL 接口,查询和更新请求都从这里进入。这个协议的核心价值是跨语言和高吞吐,仓库里的 Rust/Go/Python 示例就是围绕这层展开的。
2026-02-21 08:00:00
After handing duckdb-rs over to the DuckDB team in 2023, one question kept coming back to me:
If DuckDB is already great in-process, how do we turn that power into a service that is easier to integrate, deploy, and operate?
SwanLake is my answer to that question.
It is a Rust-based Arrow Flight SQL server, powered by DuckDB, with DuckLake-oriented extensions for datalake scenarios. In practice, SwanLake is built around a three-part combination: DuckDB + DuckLake + Flight SQL.
2025-12-31 08:00:00
“这就意味着宇宙普适的物理规律不存在,那物理学……也不存在了。“汪淼从窗外收回目光说。
——《三体》
多年以后,面对黑色屏幕上闪动的白色光标,我们将会回想起,那个 AI 编程横空出世的 2025。
2025 年是 AI 编程的大年,从 OpenRouter 的年终统计 来看,AI 编程用的 Token 占了整个 Token 使用量的一半左右。

作为“资深程序员”,我今年也贡献了很多的 token 使用量,深切感受到 AI 编程对于软件开发领域带来了不可逆的影响。至少从技术上,我认为这些影响绝大部分都是正向的。
之前写程序一定程度上是“体力劳动”,不管有多宏大的想法,代码总要一行一行写。 AI 编程让程序员向脑力劳动又前进了一步,我们需要更激进地学习新知识、使用新工具,从这个角度来说,我认为 AI 编程是提高了对计算机从业者的要求,而不是某些媒体鼓吹的“技术平权”。
这篇文章总结下我对 AI 编程现状的观察,以及对后续发展的预期。
首先从开发工具讲起。明星创业公司 Cursor 因为 VS Code + Claude 一夜走红,算是彻底带火了 AI 编程。但是我想讲的不是这个,而是为什么突然所有的公司都开始做 CLI 工具,比如 Claude Code, Codex, Gemini CLI 等等?
我认为这里有三个方面的原因:
总结来说,2025 年大部分人应该都能通过大模型加速写代码,我认为 2026 年开发者需要找到自己的工具,把工作并发起来,而且这可能不能单纯靠等待市场上产品成熟,也需要自己做好准备,比如开发规范、测试规范、发布流程等都配套跟上。
2025-08-04 08:00:00
如果用一个词来总结我在字节的日子,我想我会用成长。用这个词也很自然吧,毕竟初入职场后最重要的十年待在字节,并且还是一家成长这么快的公司,经常我还会反思自己的成长速度远远没有跟上公司的需要。对于字节我只有感恩,他不仅给了我超预期的工资回报,更重要的是给我有挑战的项目帮助我成长和证明自己,也给了我很多可以联系一辈子的朋友。
我要感谢我在字节的 leader 们,谢谢你们对我的指导和信任,特别是早期的 leader 容忍了我很多不成熟的做法;对一起合作过的同学,过往如果有沟通方式或者做事方式不对的地方,这里说一声抱歉;对于我之前指导过或者帮助过的同学,你们都有一个美好的未来,而且其中有不少已经做到了比我更重要的岗位。
字节依旧是一家伟大的公司,依旧会有很好的发展,祝福在字节奋斗的小伙伴们!