Nix,Typst,Zig,Polars,Ghostty,Helix
作为一个技术工作者和爱好者使用趁手的技术工具不但能提高工作效率,也更有乐趣。开源软件世界中每年都有新的工具涌现,我会经常关注但一般不会轻易切换,因为时间精力有限,除非新工具有非常明显的优势,否则学习使用的投入回报比不高。
但有少数新工具确实很有优秀,能够显著提升效率和使用体验。2024年我发现和日常用上了这些:Nix,Typst,Zig,Polars, Ghostty, Helix。
Nix
首先是操作系统和包管理软件全面Nix化。之前我的所有电脑,除了Macbook Pro上使用原生的MacOS和Homebrew包管理软案件,都使用Archlinux以及附带的Pacman包管理系统。
Archlinux作为一个老牌发行版具有软件包覆盖面广,更新快的特点,适合喜欢尝试新功能的用户,我作为技术爱好者从2006年开始差不多使用了二十年时间。但随着毕业、工作、成家,人生进入新的阶段,能够折腾电脑的时间越来越少,Archlinux不再符合我的需求,具体有几个方面:
- 首先,Archlinux系统是滚动发行版,基本需要每天更新,占用精力;
- 另外Archlinux更新有一定失败的概率,失败后需要手动修复,比较麻烦;
- 每次换电脑,为了重建使用环境需要手动安装常用软件包和修改配置文件;
- 当然最主要的是几个开发项目的依赖软件包存在版本冲突时管理繁琐易出错。
NixOS和Nix包管理系统完美的解决了以上几个问题:
- 系统的所有状态,包括软件包和配置,可以写入一个配置文件。基于这个配置文件换电脑时可以自动化重新构建出一模一样的使用环境。
- 不需要频繁更新,更新失败时可以方便回滚到前一个成功状态。
- 系统原生建立、管理多个虚拟开发环境,避免依赖版本冲突。
除了这些实际的好处外,从理念上Nix基于不可变数据和纯函数的架构,更符合我对的程序设计的审美。
Typst
写作是技术工作的重要组成部分,美观的排版不但能提高读者的阅读意愿,更重要的是提高作者的写作积极性。
TeX/LaTeX是最排版语言的事实标准,最早明确了“排版就是编程”的思想,广泛应用于学术界。作为一个有半个世纪的程序,TeX/LaTeX的优势是功能非常全面,各种偏门的功能都有人实现。但另一方面,由于当时的软硬件技术限制,TeX系统的一些设计选择已经跟不上时代,造成性能、易用性、可扩展性方面的问题。
首先,从编程语言分类看TeX本质上是一种宏语言,依靠字符串替换实现功能组合。当前这属于很过时的设计,无论是表达能力、严密性、易用性能远远不如基于语法树的现代语言。其次,TeX那个年代计算机技主要术只存在于英文世界,所以TeX设计之初没有考虑非西文语言支持。后续虽然有一些扩展,但非西文支持一直落后。最后也可能最重要的一点是,TeX的源代码是CWEB,一种试验性的C语言扩展,提高了加入开发的门槛。
这些年来试图替代TeX的软件时有出现,但现在开来Typst是最有希望成功的一个。与TeX相比Typst有以下改进:
- Typst本质上是一门函数式编程语言,设计合理,表达能力强。
- Typst原生支持多种语言、文字。
- Typst用Rust语言开发,更容易理解。
最近一年撰写幻灯片、讲义、试卷都转到Typst上,使用体验良好。
Zig
计算机语言种类成百上千,但其中一类系统编程语言有特殊的重要性,是开发高性能底层系统的刚需。系统编程领域C/C++多年来处于垄断地位。
最近十年情况有所改变,出现了一些新的挑战者,其中最有希望的是Rust和Zig。两门语言的总体思路类似,都是在保留C/C++操纵底层硬件的基础上,让语义更正规化,工具链更完善。但是两者的具体策略有所不同。
Rust更强调内存安全性,在语言和编译器层面加入引用检查,但是随之带来语言复杂、编译器复杂、编译速度慢等一系列问题。而Zig语言的设计更像瑞士军刀,语言简单、功能全面、编译器小、编译速度快。有人比喻“Rust更像改进版C++,而Zig更像改进版C”。
就我个人感觉,两者完全可以互补。Rust更适合写抽象化更高的复杂系统,Zig更适合写靠近硬件需要极致优化的系统。
Polars
Python数据处理生态中Pandas曾经是主流的DataFrame软件包,近年来Polars异军突起,有取而代之的趋势。与Pandas相比,Polars虽然作为后来者功能还不够完善,但设计更合理,更有发展潜力。
- 首先Polars的API基于函数式编程思想,围绕所谓的表达式设计。这个设计不但让使用流程更有条理,更是方便系统内部实现一些高级的性能优化,例如多线程、超内存计算、消极计算。
- 计算核心用Rust编写,基于Arrow的列优先存储布局,效率更高。
基于以上原因,对于我的日常应用,Polars在易用性和计算效率上都好于Pandas。甚至Polars数据可视化主要依赖的Altair软件包表现都好于Matplotlib。