


















Matrix 首页推荐
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
在上篇构建可持续发展的个人工作流 01:认识篇中,我们讨论了「重器轻用」vs「All-in-One」这种二分法的问题,并强调重点应该放在构建以输出为导向的稳定工作流上。为了实现这一目标,首先探讨了如何认清自己和工具,因为只有认清这两者,才能定义最适合自己的工具流。
正所谓「知之真切笃实处即是行,行之明觉精察处即是知」,要想深刻地理解,不仅需要思考,更要持续的实践和反思。
近来不时能看到类似「差生文具多」「一顿折腾猛如虎,输出一看原地杵」的调侃,诚然,我们要警惕过度折腾,但折腾在一定程度上是难以避免的。事实上,只有经历过一段时间的折腾,我们才能更加明确自己的能力边界和需求所在。这个系列的目标就是帮助更多人尽可能地降低折腾的成本。
接下来,我将按照「实践 → 系统 → 需求 → 工具 → 实践」的循环来介绍每个环节中的基本思维方式,展示可供选择的光谱,希望这种讨论能帮大家帮助理解工具的逻辑,更有效地构建适合自己的工作流。
如果你曾与这样的同事合作过——他们将自己的工作视为孤立的任务,仅仅完成分配给自己的工作而不考虑上下游的配合,那么你一定能理解系统性思维的重要性。万事万物都是相互联系的。很多时候通过提升视角,拔高层次,以「整体」的视角从更高的维度审视问题,就能够发现更优的解决方案。
在工具的使用上,我们同样需要培养一种系统意识:工具不应被视为孤立存在,而应成为某个系统的一部分。唐纳德·A. 诺曼在《设计心理学》中写道:
解决服务的复杂性的唯一方法是,将它们当做系统,把全部体验作为一个整体来设计。如果每个部分都被孤立地来设计,最终结果就是各个独立的部分不能够很好地配合在一起。
之所以需要有工具的系统意识,是因为真实的使用场景是灵活多变的。例如:
因此,理想状况下,流程之间不应该是孤立的,而是融合在一起,根据具体情况提供必要的协助。这种组合工具的使用,是更高维度的「服务」,也是我们所期望构建的输出导向的个人工作流。
那么,我们应该如何培养工具的系统意识呢?我的思路是「结构化」和「流程化」。
通过结构化和流程化构建的工作流,未来可以进一步进行标准化和自动化,并循序渐进地进行迭代,使其更加契合个人习惯。
尝试新的工具、设计新的工作流本身就能给人带来快乐,特别是与之对照,需要用工具完成的工作往往痛苦得多。但是,我们的最终目标始终是输出,因此不要为了工具而工具,有时需要自我克制这种折腾工具的欲望,只进行必要优化。
我会建议遵循奥卡姆剃刀原则「如无必要,勿增实体」,具体来说,有两点值得考虑:
接下来,我们要在自己的真实使用场景中发现内生的需求,这点在认识篇的「认清自己的需求」一节已有详细讨论。
就像项目需要拆解成任务来执行,工作流的构建也无法一蹴而就。那么工作流应该如何拆解呢?既然工作流是由要素组成的具有一定结构的系统,可以把它想象成是乐高积木组装的建筑,我们先顺着结合不那么紧密的地方,拆解为一个个更独立的模块,再根据个人需求,组装成更适合自己的工具。
用这样的方式,我们很自然地就构建了一个高内聚、低耦合的工作流——每个模块内部的功能紧密相关,就像每一块积木,有着特定功能和形状,这是高内聚;各模块又可以独立于其他部分进行调整改进,就像积木之间因为有通用的连接点,可以互相替换,这是低耦合。一个高内聚、低耦合的工作流,正是我们期望的能够适应个人需求变化而改进的工作流。相比「一出现当下工具无法达成的新需求,就准备迁移到新工具」,这种方式可以让我们在现有的工作流中找到合适的接口,加上新的积木;或者定位需要升级的模块,用新的积木替代它。如此这般,无疑更有助于个人的积淀,避免在各种软件之间换来换去,最后所得甚少的窘境。
在从工作流中拆解出不同的需求之后,我们可以很清晰地看到,不同需求所对应的工具,不管是软件的逻辑,还是选择的侧重点都有差异。而且就像层次步速理论(Pace Layering Theory)所言,建筑中的每个层次、社会中的各个领域都有自己的变化频率,不同类型工具的使用周期也是不同的。我们应该对那些核心的、基石般的工具事前精打细算、事后物尽其用,不要轻易大改,为整个工作流提供稳定性;而另外一些服务可以不用过分货比三家,只要满足当下需求就算物有所值,未来如果发现不合适,也可以快速找到替代或升级方案,在现有基础上优化。

基于上述目标,我采用计算机领域经典的二分法:关于「数据」的需求和关于「程序」的需求。更通俗地讲,也可以说是关于「文件」的需求和关于「流程」的需求。
或许程序类的需求相对小众,但只要是数码用户,肯定都有数据类的需求。我把以下三者都归到数据类的需求:
浏览和编辑毋庸赘述,我们来看看最核心的管理功能。文件管理功能是如此基础,以至于所有的操作系统都会自带文件管理器;用户的文件管理需求又如此多样,因此很多人都有过寻找系统文件管理器之外、更强大的文件管理器的经历。就个人而言,尽管换成 macOS 多年,我依然没有发现一个能够完全满足自身需求的文件管理器,结果还是开着 Parallel Desktop 运行 Total Commander 来管理 macOS 中的文件。
随着系统的更新换代,文件管理工具也在不断迭代升级,但是再怎么优化,也无法解决系统层面的局限:文件只能放在单一目录,而现实世界的分类往往需要多个维度。此外,不同媒介类型的文件管理有其独特性,很难被通用的文件管理工具满足。这些限制催生了库管理工具的发展。它在传统文件管理基础之上,加入了元数据管理,使得文件的组织和检索更加灵活,大大提升了效率。下篇还会进一步讨论不同的管理方式:除了传统的文件管理和库管理,二者之间还有一个选择的光谱;二者也并非全然对立,还存在一些兼容不同管理方式的解决方案。此处不再展开。
为了帮助大家更好地理解三类文件需求的区别,在此简单列出不同媒介类型的典型管理、编辑和浏览工具:
| 管理 | 编辑 | 浏览 | |
|---|---|---|---|
| 图书 | calibre | Sigil | 多看阅读 |
| 音乐 | Foobar、Roon | XLD | Symfonium、椒盐音乐 |
| 论文 | Zotero、JabRef | Adobe Acrobat Pro | PDF Expert |
| 电影 | tinyMediaManager、Jellyfin | ffmpeg | PotPlayer、mpv |
| 图片 | Eagle、Picsee | Photoshop | Irfanview、XnView |
程序/流程类的需求通常是面向高阶用户,所有程序类需求都是「what」(实现哪些功能)和「how」(如何调用这些功能)的结合。有的工具只关注 what,例如脚本编辑器,提供了创建和编辑脚本的功能,但是脚本的调用需要在系统设置中配置;有的工具只关注 how,例如 crontab 命令,专注于任务的调度和执行时间。更多的工具是把二者结合起来,提供整合的解决方案,例如 Tasker、n8n、Keyboard Maestro 等各种通用自动化工具,以及专门针对某一模块的设置工具(macOS 上设置鼠标和触控板行为的工具,安卓上的各种启动器等)。
IFTTT 的名字「If This Then Trigger That」,就是理解程序类需求的绝妙范式:
不同程序类工具的区别主要在于「what」和「how」的支持范围和配置方式的不同。对于专门针对某一模块的设置工具,how 一般内置在工具的逻辑中,不需要用户自行配置,用户只要设置 what 就好。例如设置鼠标行为的工具默认在有鼠标操作时触发,安卓上的各种启动器默认在返回主屏幕时触发。而通用自动化工具需要用户自行配置 what 和 how。
IFTTT 可谓是最简单的通用自动化工具了,从工具支持的服务范围中,手动选择相应的 how 和 what 就好。

更高阶的需求就需要对 what 进行手动组装,需要 how 支持多个触发条件了。下图的两个自动化工具(n8n 和 Keyboard Maestro)虽然看上去差别很大,但这只是交互和呈现逻辑的区别,本质是相同的。只要把握了工具的内在逻辑,很容易进行迁移。

再高阶的需求难免要写代码。大部分情况下是 what 使用代码实现,在工具中手动配置对应的代码文件路径来实现 how,例如 LaunchBar 中:

最自由、最强大的方式是 what 和 how 都由代码逻辑实现。例如 Emacs 中的 what 部分对应一个 elisp 函数,而 how 可以是绑定到快捷键、点击一个按钮、选择一个菜单项、在工具空闲时自动运行,或是添加到 hook 变量以便在特定事件发生时执行。这些都是使用代码来实现的。在掌握基本的 elisp 后,非常个性化的小需求可以轻松用几十行代码解决。例如,我习惯把对自己有启发的句子保存到一个名为 epigram.org 的单独笔记文件中。虽然平时在记笔记、写文章时,也会搜索这些格言并引用,但还是希望日常能更高频率地看到它们。放在 anki 这样的工具进行记忆对我来说太重了,放在桌面上随机展示更适合这个场景。加之我原本就更习惯搜索,不会在桌面上放文件或应用的图标。因此,我写了一个简单的 elisp 函数,每当我保存 epigram.org 文件(how),就会把其中的格言、作者信息结构化地提取到另一个 json 文件(what):

这个 json 文件会被 macOS 上的 Ubersicht 访问、展示在桌面。同时会同步到安卓平板,被一言工具访问、展示在桌面。

现实中,程序和数据之间的关系暧昧不清。一方面,哥德尔在证明不完全性定理时,把数论命题转化为编码,与「程序即数据」的思想相呼应;另一方面,把数学理解为计算,例如把 PI 的计算过程和计算结果区分开来,导致了计算中心这一20世纪科学界最大的思想转向。
在工具中,我们也可以看到上述分类并非泾渭分明:
这种情况的出现正是因为工具为了应对认识篇中所说的「随着工具数量的增加,使用的摩擦也会增加」的问题。哪些功能整合到工具内(做加法),哪些功能超出了工具的边界(做减法),有赖于产品的把控。一个专业的产品(这点在上一篇的「如何判断一个软件未来发展态势」也有讨论)可以同时满足工具内部的功能性和外部的兼容性,找到最佳平衡点,而非一味地做加法来迎合用户需求,或者做减法来满足个人审美。
因此,进行程序和数据的区分并非由于真有这么一道明晰的边界,而是因为这种分类可以成为我们理解应用逻辑的思考工具。了解所属的类别后,我们可以更好地:
举例来说,如果我们需要一个自动化工具,那么通过运用「If This Then Trigger That」这个思考框架,了解其所支持「what」(实现哪些功能)和「how」(如何调用这些功能)的情况,就可以很快地了解工具的核心。由于通用自动化属于中枢工具,因此会有心理预期需要花一定时间来学习和配置。自动化工具的配置有三种形式:手动选择、手动组装、写代码。根据自身的需求和能力,从中选择当下最适合的形式。如果未来需求不满足,也可以明确升级优化方向是什么。
之后的文章,我们会把构建工作流的重点放在「数据管理」上,因为:
综上所述,后续文章不再对流程类需求、文件的编辑和浏览需求进行深入讨论,而是聚焦在管理:首先明确管理需求的底层逻辑,包括存储方式、组织方式、数据格式、备份与同步等。再以管理为核心,探讨在实践中,具体可以怎样拆分和组合工具,从而打造适合自己的工具流。
让我们期待下篇的再会。
> 关注 少数派公众号,解锁全新阅读体验 📰
> 实用、好用的 正版软件,少数派为你呈现 🚀
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。