进阶 iced.rs 2026-09-13 21:01:26 · 0 阅读

第2章 哲学

iced 是一款非常有主见的软件。它凝结了我近 20 年来与永恒之敌——复杂性1——斗争的成果。

复杂性是个坏东西。它悄无声息地潜入代码,不知不觉间,慢慢地扼杀一切。这样的场景我见过太多次了,我的许多代码库都在它手中缓慢而痛苦地死去。

在一堆腐烂的代码中,我学会了“忘却所学”2。每一次,都让我对一个更大谜题的理解又深了一层。直到有一天,因为接触了 Elm,一切似乎豁然开朗。

我并不认为自己掌握了全部答案,但如今我很少再为复杂性所困扰。我已经形成了一套直觉——一种编程哲学——并凭本能遵循它。在设计库的时候,我会尽可能地把这套哲学融入其中。

iced 就是我尝试打造的一个 GUI 工具包,力求把我的编程哲学体现到极致。如果这些原则不能引起你的共鸣,我建议你换一个库,否则注定会用得很痛苦。

本章将介绍 iced 最重要的(也是最具争议的!)设计原则,既有技术层面的,也有理念层面的。

开源不是为你而存在的

开源只是一个授权与分发机制,仅此而已。它的意思是:你能拿到软件的源代码,并且有权使用和修改它。所有与之相关的社会性期待——包括“社区驱动开发”的理念——都是新近发明的神话,与实际情况几乎毫无关系。这种神话带有邪教式的色彩,既排斥事物运作方式的多样性,又弥漫着一种对社区权益的病态索求。

— Rich Hickey,Open Source is Not About You

iced 并非寻常的热门开源项目。它不隶属于任何公司,不是一个品牌,不是一门生意,最重要的,也不是社区合作成果。

iced 纯粹是我个人的项目。我按照自己的节奏和时间来开发,并以开源形式免费分享。

这么做是因为我喜欢独自构建有用的东西。我并非为了结识新朋友,不是为了与他人协作,也不是为了交朋友。若这些附带发生固然很好,但这并不是我分享工作成果的主要动机。

这种情况相当罕见,因此其他开源项目中理所当然的某些预期,在这里并不适用。例如:

  • 我不会刻意对新的贡献者格外友好。
  • 我不在意推广库以追求广泛采用。
  • 我不刻意维持“职业化”形象。
  • 我不会分配任务以快速落地新功能。
  • 我毫不犹豫地引入破坏性变更。

“大人!这合法吗?”3 当然合法!所以,如果你预期这里是一个稳定、专业、政治正确且对贡献者友好的开源项目……你大概率会非常失望。

但在你慌乱离开之前,请给我个机会讲讲这种工作方式的优势。是的,确实存在一些优势:

  • 我不花时间在引导新贡献者上,而是把更多时间投入到我最擅长的事情:写代码
  • 我不刻意推广库,而是采用完全诚实、直接的沟通方式。你看到的即是你得到的。
  • 我不追求“职业化”,而是可以亲切、感性、直率、诚实、有争议性,最重要的是——有趣。我是一个,而非试图维持外表的冰冷机器。
  • 我不委派任务,而是亲自构建和审查每一个功能;这使代码库具备许多其他项目无法实现的高内聚性
  • 我不维护稳定的 API,而是自由重构,让代码库随着新方案的发现而自然生长

听起来挺酷,对吧?凡事皆有取舍,这些正是适合我和我的项目的那种取舍。

基于以上种种,你可能会觉得 iced 的用户社区规模不大。毕竟,我既不主动推广这个库,也不欢迎外部贡献者。谁会留下来呢?但事实上……很多人确实留下了4

以我的经验来看,颇具讽刺意味的是,这种异于常人的开源做法反而催生了最优质的社区。极高的观点鲜明度、诚实与透明度让用户能迅速做出判断,减少挫败感,而留下来的用户往往价值观趋同。

Rust 已足够

iced 彻底拥抱 Rust。你将使用纯粹的 Rust 编写所有代码。

这里没有用于定义视图逻辑的Domain-Specific Language(领域特定语言)。也没有那些为了简化视图代码编写而设计的繁琐 procedural macro 魔法。

虽然宏是 Rust 的一部分,但它是一种逃生舱。编写宏以有意义地扩展语言,等同于承认 Rust 本身不够强大。这与放弃无异,意味着语言失败了。

我相信 Rust 本身足够强大且优雅,能够以美观的方式表达用户界面代码,且我绝不愿在未做抗争前就放弃它。如果我想用另一种语言编码,当初我就会选择那门语言。

row! 和 column! 宏,其语义与无处不在的 vec! 宏相同——它们都按特定顺序构建项目集合。

简而言之,iced 期望你用 Rust 编写所有 GUI 代码,充分利用变量、match 语句、嵌套作用域、迭代器、函数和泛型。

Web 是一团乱麻

起初,这只是一项用于在全球范围内分享超文本文档的简单发明,如今却已演变为一系列不连贯的补丁和标准的混合体;其中大多数是为了追求速度或向后兼容而强行塞入的。

这一切的核心,是一个糟糕的症结:把结构、样式和逻辑拆成三种不同的语言——HTML、CSS 和 JavaScript,看似无害,实则不然。

问题在于,这种分离根本行不通,过去不行,将来也不行。各个层面的关注点不断互相渗透,缺乏一致的原则,三部分之间时刻需要互相了解。于是 Web 开发者的工作就成了不断构建抽象来应付这三个层次,同时努力营造一种浑然一体的假象——就像马戏团里的魔术师。

正是这个分离的症结,催生了迄今为止大多数 Web 框架。它们为一个早已存在的、凭空捏造的问题提供解法,无异于用鸦片治疗自找的病痛。整个 Web 就是建立在一堆糟糕的历史包袱之上的。

不知道你怎么想,反正我受够了这场马戏。

iced 彻底拒绝了这种分离——它根本毫无道理,只会让人抓狂。更进一步,iced 刻意远离一切哪怕稍微沾边 HTML、CSS 或 JavaScript 的东西,因为它们各自都是不完整的方案。

在 iced 中,布局、样式和逻辑全部直接用 Rust 编写,浑然一体,并尽可能利用类型安全和编译器保证。

代码是被发现出来的

写代码本质上是一个发现的过程。

问题是你的起点,语言是你的地图,编译器是你的指南针,解决方案是你的目的地。

程序员要做的,是尽可能准确地界定起点,然后让指南针为你引路。

用你的语言准确陈述和定义问题至关重要。这一步出错,你就会走上错误的道路——很可能是撞了一阵墙之后,抵达错误的地方。

要把问题形式化,关键是把它提炼到本质。你必须避免把脑海中预设的解法混入问题本身,否则你将无缘简洁——而简洁只能自然生长出来。

iced 是应对向用户展示交互信息这类问题的一整套具体解决方案。因此,在探索阶段的初期,该库会尽量保持克制,直到方案雏形初现时才介入——它通过将自己与你的类型、数据结构和业务逻辑解耦来实现这一点。

作者注

本章尚未完结。

仍有几个原则我希望能补充写作:

  • 基础设施代码是根基
  • 通用问题是一种错觉
  • 纯度守护理智
  • 要么胜任,要么更强

将直觉转化为文字需要灵感,所以我不确定何时能写完。敬请期待!


  1. 古鲁脑开发者

  2. 学习如何遗忘

  3. 加入我们的 Discord 服务器

评论 (0)