Tyme + OmniFocus 时间管理从未如此简单——我的自动化这一年
编注:本文是少数派 2020 年度征文活动 的入围文章。本文仅代表作者本人观点,少数派对标题和排版略作调整。
2021 年已经开始了 1/6 即将过去,两个月也是各种忙碌,才回过头开始写 2020 年度总结征文。
回想起 2020 年,是充满变数离别,包含压力抑郁的一年,同时也是快速成长学习的一年。这一年里我 Quit 了我的 PhD,开始了转行 CS 之路,也开始了对编程的学习。我想,这一年对我最大的改变,就是编程之于我带来的改变和思维的培养。本来想写一个『编程给我带来了什么』,又觉得可能会过于空旷,因此我就集中于时间管理,来分享我这一年通过编程学习,构建时间管理自动化体系的过程和自我思考吧。
如果你还没有看过我的前一篇文章时间管理下的 2020,聊聊我的这 3000 小时,可以先进行阅读该文章。本文主要进行方法论分析和实际工作流的搭建尝试,同时加深一些对时间管理的思考。
希望本文能给大家提供一些思路分享,不囿于这样的系统,可以根据实际情况搭建属于自己的自动化体系和工作流。如果你使用 Tyme 和 OmniFocus,可以在文章结尾获得今天我文章中分享的所有的脚本链接,不要忘记点个 Star 哦。
首先,先明确一下我的自动化时间管理体系的功能需求,我到底有哪些操作或哪些过程需要进行自动化,痛点在哪里。
在之前的文章中说到,我最后选择了柳比歇夫这种时间管理方式,因此其实时间管理过程就分为两个过程:
柳比歇夫最传统的时间记录和分析工具就是纸笔,在当时的时代下,由于和他的职业工作也比较相契合,其实并没有显得这个系统非常难用。然而在当下,由于工作种类的变化,工作方式的变化,事务规模的增多,纸笔这种传统方式显得有点局促,难以满足需求。因此,如何使用现代化的工具,贴合当下的工作体验,进行高效的时间记录和分析,便成了首要的系统需求。
当我们去打开 App Store,搜索『时间管理』、『任务』、『清单』等关键词,会发现有各种各样的 App,也是应用商店里最繁多的一个分类了。然而,为什么这么多时间管理软件不好用呢?
一个有趣的现象,大部分我们看到的时间管理软件,宣传截图都是『工作』、『运动』、『阅读』等,我们可以称之为 Preset Category Tracker。因此大部分的交互都是我们点击某一个类别,开始计时对应类别。因此大部分时间管理软件的一大痛点就是我们只能记录规定好的大类的时间,而无法记录每一个任务的时间。
而且大部分软件都没有全平台同步,即使你真的不怕麻烦,想手动输入任务并进行计时统计,也会存在输入困难的问题,用户体验非常差。同时带来的一个问题就是,这些软件的项目层级一般都非常扁平,虽然设置了『类别』和『任务』的区别,但大部分形同虚设。实际使用中,多个『任务』带来的会是时间记录交互的麻烦,和统计时分析功能孱弱的诟病。
大部分软件的计时方式的 trigger 都是需要手动点击开始记录,才会记录时间,这固然没有问题。大部分入门时间记录的人最后放弃的原因,其实就是因为经常忘记点击开始记录。由于难以维持时间记录的完整性和持久性,很多人都放弃选择『我还不如不记』。后面也有一些软件提供了一些简单的方式进行记录,如『时间块』:
这个软件通过『模糊化记录』的方式来优化了时间记录的过程,通过用户自定义的 intervals 来提供不同粒度的记录,相对应的带来的就是,时间精确度的下降。对于我们想要实现的功能,其实并不是非常的合适。
而且,对于『记得开始时间记录』这个过程,其实是有一个重要的影响因素的,就是我们记录的是什么。如果像之前讲到的,我记录的就是些日常生活,将工作都 aggregate 到『Work』分类中,那么好像其实就没有那么有意义。我记录,也是一个模糊的结果,不记录,亦如是。
前面我们讨论的主要是在『时间记录』方面的问题,下面我们来分析一下『分析记录』方面的问题。目前大部分的时间记录软件的另一个问题就是分析功能弱,远达不到需求。目前大部分的报表分析功能都是基于类别的饼图或者时间轴或日历的分布图,看起来确实很有成就感,但是其实除了让自己开心一下,并没有什么太多用处。
由于我们记录时间的原因主要是为了分析自己的时间用量,以及培养对时间的感觉,更好的预估和计划时间,而不是为了这种有点『自欺欺人』的成就感。除了这种 aggregation 的分析,其实我更想要的是针对每一个任务我可以看到自己的实际工作时间和预估时间的差异,可以方便记录进行分析原因和调整以后的计划。也因此带来了下一个问题,可扩展性差,难以输出形成分析闭环。
现在大部分的时间管理软件都支持了导出 csv 文件便于手动进行分析,然而这个功能需要大量的手动导出,分析,即使可以用脚本自动分析,然而总会是和我们的任务管理系统是脱节的。
以软件『Hours』为例,这款软件在时间记录软件中可以说是很好的一个软件了,支持『Siri 建议』启动时间记录,也支持全平台同步,定位记录的是工作事务,也可以使用 Apple Watch 进行记录,可以说是一个很棒的 option 了。抛开它的分析功能不谈,为什么我不去选择它呢?
因为它足够的闭源。
在之前的文章我讨论过,目前的时间管理软件都各自为战,想要加上任务管理,项目管理,然而远远无法满足 GTD 任务管理的需求。因此我的 GTD 系统和时间管理系统是需要形成闭环,便于进行信息分析和再计划,因此这个过程中信息的流动我需要避免系统间的转移成本。如果有自动化的 workflow 来帮助我们处理,那就是非常好的一个选择。然而这些软件的 integration 功能都较差,不支持 IFTTT 这种基于 Cloud 的自动化处理,也无法通过 Script 进行手动 batch processing,因此会有较多的时间成本。
同时,大部分时间记录软件都在软件内部有一个日历视图,可以看到具体的当天 timeline。我更想要实现的是我可以将这个日历和我每天事务管理用的 Calendar 能够 integrate 起来,有一种快速的方式可以看到具体的实际事务时间,和预估或预订的事务时间的差异,进行记录和反思,也没有办法很好的实现。
其他的如大部分番茄工作法,Forest 这类软件在上一篇文章我都详细进行了讨论,这里不做赘述。这里我想讨论的是另一个让我纠结了一些时间的一款软件,『滴答清单』。
滴答清单在近几年添加完善了很多功能,也支持了一系列新的时间管理方式,『预估番茄』就是其高级版功能中的一个主打。可以基于任务进行番茄钟的预估,同时进行番茄钟或正计时的记录,统计实际执行情况。
这是一个我非常喜欢的功能,自己也试用尝鲜了一段时间,后来没有继续使用的原因主要如下:
其实滴答清单是一款很不错的软件,如果大家还没有 GTD 软件,或者没有我这么专的需求,其实可以尝试一下,上手体验一下自己对时间管理和任务管理的思考。
因此,在我研究比较了这些时间管理软件后,我发现很难有一个软件能够满足自己的需求,也就是不存在这样的一个软件系统可以满足自己的需求,毕竟 App 是服务于大部分用户的。因此我的思路就转变成如何基于我的任务管理体系,来 extension 添加『时间记录』模块构建一个『自己的系统』。
因此相当于我对自己的 system 进行了 partition,转换到寻找一个 extension 和 integration 功能较好的『时间记录』App 来提供想要的功能,并能够通过 workflow 自动化方式来实现自己想要的逻辑。虽然这样两款软件会产生一些 coupling,但是只要 workflow 设计得没问题,那么就一定可以满足自己的需求。
因此,最后我选择了 Tyme 作为我的时间记录软件:
选择 Tyme 主要有以下几个原因:
其实 Tyme 主要用途是用于公司 team 的工作时长 tracking 和 payroll 计算,因此设计非常地 professional,主要定位也不是记录那些日常时间分类。因此它的报表分析真的非常详细:
整体分析结果支持按年、月、日、季度的 aggregation 分析,同时支持基于项目,任务和类别的 category 的 aggregation 和 filter,响应速度很快:
可以设置 workload 的目标,按月视图显示 workload 的分布。除了直方图,饼图也是一样支持基于项目和基于分类的分析:
同时支持时间分布的可视化:
也支持我想要的预估时间 vs. 时间时间,当然这个后续我使用自动化方式进行了额外的处理,这里我们可以看一下原生的时间比较:
上面介绍了这么多,也秀了这么多 fancy 的图,那么我们的自动化体系应该如何搭建呢?我的任务管理软件是 OmniFocus,时间记录软件是 Tyme,下面我来分享一下我的搭建和思路和自己的一些脚本。
其实还是一样,按照我们之前分析的过程,我们其实将这个自动化体系进行分解,逐个击破就可以了:
主要就是这两个 flow,当然实际使用过程中会有一些其他的 case:
下面我们就来介绍一下吧,首先分享一下脚本如何使用。我分享的 github repo 中有三类脚本:
对于这三种脚本的使用方法,只是存放的路径不一样。
Tyme Hook 脚本:
将下载的 tyme3_applescript_hooks.scpt
文件添加到文件夹 ~/Library/Application Scripts/com.tyme-app.Tyme3-macOS/
中即可,如果不存在,手动创建一个就行了。
由于 Tyme Hooks 我定义了不同的功能,我分开成了多个文件,在实际使用时可以选择自己需要的功能,将代码复制粘贴进 tyme3_applescript_hooks.scpt
文件即可。有兴趣开发也可以参考官方脚本文档 Scripting with Tyme 和 Tyme 的 AppleScript API package 来自行定义。
其他脚本:
其他额外的 Python 脚本,AppleScript 脚本可以直接用 Terminal 进行运行,或通过第三方启动器如 Alfred 进行启动。需要根据自己的存储路径,调整对应的一些路径名称。
将下载的 .scpt
文件添加到 OmniFocus 的脚本文件夹:
~/Library/Application Scripts/com.omnigroup.OmniFocus3
也可以通过 『帮助』菜单快速找到文件夹:
下面我们就来看下这些脚本该如何使用来连接起来我们的整个记录+分析系统。具体的脚本可以直接在我的 Github repo 中根据名字找到对应的文件,因此我就不单独附上链接了。
这是目前最最重要的一个需求,我们之前分析到时间管理软件的痛点就是无法快速输入添加需要 track 的条目。在这里我们由于支持 AppleScript,可以直接从 OmniFocus 同步我们需要的任务到 Tyme 中进行跟踪记录。
当我们在 OmniFocus 中建立了任务以后,可以直接点击运行我们写好的脚本将任务发送到 Tyme 中。我一开始使用的是 Tyme 官网推荐的 Alexander Fu 创建的 Tyme 2 + Fantastical 的脚本 中的 omni2tyme.osasript
脚本,由于 Tyme 进行了升级,其实只需要修改 application name 即可。想省事的话,可以直接在我 Github repo 中下载升级后的版本。
对于这个脚本,我们不需要保证在 Tyme 中一定存在这个 Project,如果不存在,会自动创建对应的 Project 再添加任务。同时对于包含子任务的任务,我们可以多选所有的子任务如 subtask1.1
和 subtask1.2
,转移到 Tyme 中。也可以只选择 Parent 即 Task1
,会自动将所有子任务都转移到 Tyme 中。
在 OminFocus 中我们可以设置每一个任务的预估时间,这个预估时间也会同步到 Tyme 中作为该任务的预估时间,同时截止时间也会自动同步过去。
由于 Tyme 中我不想保留太多活跃的任务,一般我都是在当天检查今日事项时,将今日的任务同步到 Tyme 再执行,这样就不会让 Tyme 任务积压过多,难以快速找到某一个任务。
这样我们会觉得,可能 OmniFocus 对于大型 project 的任务规划会有一点麻烦,这个我后续会再写文章详细分享一些我的 OmniFocus 的自动化 flow,本文主要讲 Tyme。这里分享一个自己常用的规划项目时的自动化脚本。
当项目任务很多时,往往用 OmniFocus 进行组织项目,规划预估,截止时间等会非常麻烦。因此一般我会用一些 Markdown 文本编辑器来理清思路,使用 Markdown 格式进行细化项目,可以选择添加一些关键词如 @tags()
添加标签,@due()
添加截止时间,@estimate()
添加预估时间,@flagged
表示重点标记。
Project Name:
- Task Name @tags(tag1, tag2) @due(Friday 23:30) @flaaged
- Subtask Name @due(Friday 23:30) @defer(Wednesday)
- Subtask Name @due(Friday 23:30) @defer(Wednesday)
之后就可以运行脚本在 OmniFoucs 中生成对应的任务了。可以使用 Terminal 在当前文本文件所在的目录下运行该 Python 脚本,Markdown 文本见下图右边:
也可以通过配置 Alfred 第三方启动器软件进行运行该脚本:
除此之外,可以根据自己的需求定义一些比较 Specific 的脚本,如我会通过将思维导图导出来的 markdown 提纲,生成 OmniFocus 中的写作任务:
这样就可以在 Script 中进行 Project 名称和子任务的处理,添加对应的标签,并在最后添加一个预估时间长度为 1 小时的『发布 XXX』的任务,从而满足自己的 workflow。
以上抛砖引玉,希望能给大家有所启发。
同步之后我们需要的功能,就是开始任务计时。我们当然可以选择去 Tyme 中找到对应的任务,开始计时,也可以用下面的脚本进行:
在 OmniFocus 端同步完任务后,可以直接开始开始指定任务的计时。这更符合我平时的 GTD 流程逻辑,理清今日任务,然后开始按优先级执行任务:
我在时间记录过程中,发现其实只有之前的同步方式,是不足够的。因为我们经常会遇到被打断,或者突发事务的情况,如果我们去忙了,转去做别的事情了,那么往往我们回来后,需要补记时间记录。如果次数多了,还是挺烦人的一件事。
因此我创建了另外一个 Alfred flow 同时运行两个 Script 用于处理这样的情况,在 OmniFocus 和 Tyme 中同时创建两个任务,并直接再 Tyme 中开始运行刚创建的任务,以应对这样的紧急情况:
创建的任务默认属性(1 小时等)可以通过在脚本中进行修改传入的字符串的值即可,对于 Tyme 中创建使用的是 AppleScript,对于 OmniFocus 是通过 url 的方式传递:
url = "omnifocus:///paste?target=/task/" + proj_name + "&content=" + quote(task_name)
webbrowser.open(url)
只要通过打开 url 即可在 OmniFocus 中创建对应的任务,有编程经验的小伙伴也可以自己动手满足一下自己的 work flow。
由于我在 Tyme 中设置的是『不允许』同时运行多个 Timer,因此新的任务开始计时,上一个任务一定会停止计时。因此我没有去添加停止的 script,真的就是想停止的话,也可以切到 Tyme 的界面,通过自己设置的快捷键进行停止任务。
由于每次想要完成一个任务的时候,我们需要去 OmniFocus 或者 Tyme 中去找对应的任务,其实是需要花一点时间的。有的时候,我们在做当前的任务,我们发现已经做完了,其实可以直接通过 Script 来找到当前正在 track 的任务,停止当前记录的任务,然后完成对应的任务,并在 OmniFoucs 中更新信息:
由于当时购买了 Tyme 2,后来升级成 Tyme 3 后 Tyme 2 还可以使用。因此我就在 Tyme 3 中进行工作生产力类计时,用 Tyme 2 进行日常计时。因此我吃饭前或玩手机前直接在 Tyme 2 中运行对应的计时器,通过脚本自动会停止 Tyme 3 中计时器。
由于 Tyme 3 支持 shortcuts,也支持 Apple Watch,因此可以创建 shortcuts 在 iPhone 或 Watch 上运行从而结束任务。Tyme 3 支持的 Shortcuts 操作有 4 种:
直接创建一个 shortcuts,停止所有 timer 即可。除此之外我们根据自己的使用逻辑,进行一些自定义,如『开始阅读』:
停止所有 Timer → 开始『读书』Timer → 打开『微信读书』
我来举一个自己的例子,分享一个少玩手机的的小技巧。
可以通过自定义 Shortcut 来完成我们想要的逻辑,比如一般玩手机我们往往停不下来,因此可以创建一个玩手机前需要运行的 shortcuts:
停止所有 Timer → 开始『手机』Timer → 设置 15 分钟计时器
我们可以将计时器闹钟设置为『停止播放』,时间到了自动就锁屏了。同理其他 flow 也可以用类似思路处理,由于 Tyme 3 同步速度非常快,电脑端收到停止请求后瞬间就停止计时。效果如下:
然后 Tyme 2 会运行『Phone』开始计时,同时有一个 15 分钟的倒计时:
也可以在 Apple Watch 上运行相同的逻辑:
如果你没有购买 Tyme 2,只是 Tyme 3 的新用户,也想进行生活时间记录的话,可以使用免费的 Toggl 软件,设置 Shortcuts 即可:
对于 Tyme 的统计结果,我是希望能够在 OmniFocus 和 Calendar 中看到具体的时长便于后续任务分析预估,因此我们想要的两个功能是:同步实际完成时间到 OmniFoucs 和同步实际时间段到 Calendar。
由于 OmniFocus 中存放的 record 都是 Task,这些数据我们可以通过脚本进行修改一些 field 的值,我考虑再三,觉得如果将完成时间添加到备注,不容易看到,如果将预估时间修改为实际时间,又无法去进行比较。因此最后我的选择是在任务标题后加上一段内容,表示 实际时间/预估时间
。通过 Hooks 脚本,可以在 Tyme 中完成任务时触发:
也可以在 OmniFocus 中检查任务时,发现任务已经完成,通过点击完成任务时触发:
由于 Tyme 自身集成了同步完成的任务到 Calendar 的功能,但是由于每次都会同步到同一个订日历『Tyme』中,我更想要的是一个 dispatch 的功能,根据在 Tyme 中 project 去同步到 Calendar 中的对应日历列表。因此可以通过脚本来自定义,将对应的 project 归类到对应的日历列表中。
我使用的 BusyCal 这款软件,支持 URLScheme
比较方便,如果有兴趣可以阅读官方文档提供的 URL Handler APIs。如果使用 Fantastical 或者原生 Calendar,可能需要手写原生的 AppleScript 来进行处理,这里我就不做太多研究了。
因此我们在日历中可以看到自动创建出来的不同事件,我都创建了 Complted 标签,因此如果只想看一些日程规划,也可以通过过滤筛选掉这些完成的任务,只关注我们想看的。
通过这样的方式,我们将时间记录的结果和自己的任务管理体系可以组织性地同步起来。因此,后续可以通过 OmniFocus 脚本进行周报总结时通过脚本生成 Task 的 markdown:
生成的 Markdown 文件格式如下:
## Completed Tasks in Last 7 days
YYYY/MM/D1 - YYYY/MM/D7
### YYYY/MM/D1
- [x] Task Name - [*Project Name*]
然后可以复制到具体的笔记软件中进行周报总结,进行分析任务的完成情况,可以看到时间的预估值与实际值的差异,以及本周在不同项目的任务完成情况,与自己的 Tyme 本周 report 进行联系讨论。
我一般使用 Day One 或 Notion 进行每周总结和月总结,根据个人需求建立模板:
对于每周回顾总结主要会去 tabulate 一些量化的结果,以及关注这些数据背后反映出来的问题,进行记录自己的收获和要注意提高的地方。上面的 markdown 就可以直接复制添加到 achievement 部分:
上面的每一个任务都已经包含了时间属性,即预估和实际投入的情况对比,在 time 部分我会将时间的投入情况分布也会进行整理:
因为我在设置项目时都使用了渐变色进行排列,因此这里的时间分布也可以很好的进行区分和 aggregation:
对于日常时间的记录,我以前有进行很多的分析,但是后来其实很少关注了,只有在效率比较低下的周总结时,会去检查一下时间究竟花费在什么地方了,并在下一周进行相对应的总结和自我提醒,提高效率。我们的目标其实是为了让我们高效完成工作和学习任务,让我们有更多可以支配用于休息,用于思考,用于生活的时间,因此我后来对日常时间的态度有了一个较大的转变。
对于使用 Tyme 2 没有升级 Tyme 3 的朋友,我也制作了一个 Python 脚本,可以通过导出的 .csv
文件生成时间分布图,有兴趣的可以尝试一下:
为什么我会又要去总结时间分布,又要总结任务完成情况,又要总结任务时间预估与完成情况呢?因为我们的时间投入,其实无法和效率和成就划上等号。时间管理中有一个『二八原则』:
80% 的回报由 20% 的事情所决定,而完成这些事情所需要的时间在自己付出的时间里又占据了 80%。
因此当我们可以从 OmniFocus 生成 Task 列表每周回顾自己所做的事情,以及从 Tyme 中回顾自己的时间分配,进行自己投入的分配调整,从而集中在我们真正所关注的『目标』上,才能真正的 Get Things Done。
当我们每周回顾自己的时间,发现大部分时间都是投入在我们当前最需要的事情,或者是『大目标』上面,那我们才能更快地实现自己的计划目标,否则计划就真的只是计划了。
同时,我们也可以对自己的单位时间产出水平有一个更深刻可感的认识。你会有感觉『原来有的时候我觉得有成就感的结果,竟然磨叽花了这么久!』,或者『其实这种事务我就保持这样,快速搞定就完事了』。只有能够客观衡量并提高自己的单位产出时间,才能提升工作效率。
毕竟时间对于每个人而言,就是那些,我们所能做的就是更快的做完事,或者相同时间做更多的事,这样才能给你真正在乎的其他留下时间,如家人,兴趣,朋友等等。
通过这样的方式,我实现了自己想要的『时间记录+分析』的自动化系统,最大程度地降低了记录时间的难度,可以轻松同步和进行时间记录。因为记录时间其实是一个非常需要自制力,非常麻烦的事情,即使养成习惯,还是会有很多的麻烦和补记录等。我的思考是,如果可以通过效率手段来最大化程度减少自己在时间记录时所需要的步骤,那么养成这个习惯就非常快,当它已经成为习惯时,其实都不需要什么意志力了。
当然,虽然不可避免会将 OmniFocus 和 Tyme 建立了一些 coupling,但是也使用了一些思路进行优化和避免冲突。可以说,Tyme 的高效同步和开放性接口真的是自动化工作流可以实现的关键。本文由于篇幅问题,没有讨论太多时间记录的颗粒度,后面我也会再写一篇文章讨论一下颗粒度思考和一些其他的思考。敬请期待。
回看 2020 年,自己收获了不少,也完成了不少。时间记录是一个漫长的过程,对于这个系统我也是先从一个可行的 solution,不断优化。可以说,编程带给我了什么,带给我的是更加系统思考的过程,解决问题的方式和最关键的,实现所想的能力。
以前刚开始学习编程时一个朋友说,你要找到一些 Technical Habit,到现在我才体会到他的意思,折腾这些脚本,debug 的过程,成功运行后的成就感真的非常强烈。这种 positive feedback 也是后面继续学习的动力。
我觉得这一年我最大的收获是什么,就是面对一个崭新的问题,我不再会慌乱,我学会了该如何去 approach,并一步步实现。『实现所想的能力』并不是因为你学了计算机和编程才有的能力,而是你与生俱来的。只不过,你的思维方式,和自信,才是 drive the power 的关键。
愿新的一年里,不负初心,方得始终。感受时间,尊重时间,时间才会尊重你。
我的 Script Github Repo:
https://github.com/zdong1995/OmniFocus-Tyme-Script
如果有用,点一个 star 支持一下呀~谢谢!
> 下载 少数派 2.0 客户端、关注 少数派公众号,解锁全新阅读体验 📰
> 实用、好用的 正版软件,少数派为你呈现 🚀
https://dongxiaoran.com 微信公众号:董小染