2009 年我读了李笑来老师的《把时间当朋友》,知识了柳比歇夫的时间记录法。当时激动坏了,马上动手实践起来。一开始的时候,是用一个小本子,走到哪儿都带着。完成一件事,就记录一下花费的时间。这样的做法持续了一周多的时间,我发现每天浪费在 Google Reader 上的时间大幅度减少了。那个时候,我使用的是一部 Nokia S40 手机,可以上网。于事,又在淘宝上买了一个 PHP 空间,用 PHP(好像是Yii2)做了一个在线版的。一直用到过年(这书是夏天发布的)。然后就悲剧了。卖我 PHP 空间那个店跑路了,我的大概一两个月的数据就那样没有了。当时非常的受打击。一下就没有心情做记录了。

大概又过了一年,我有了一台 S60 的手机。然后尝试过用各种方法再写一个时间记录的工具。但都感觉很难用,还不如手记的方便。后来因为学业之类的问题,这个工具也就没有继续做了。

2014年左右,我的手机已经换成了 Android,那时候设计了一个叫 ToDo-Doing-Done 的时间记录工具,和现在的 aTimeLogger 有一点像。只是我多了一个 ToDo 的功能。这个东西也是各种方案去尝试,体验都差得我自己都不想用。

到了2016年,我重新开始尝试做时间记录。一开始尝试使用 WPS 的手机版来记录,也用过 Google Docs,还有番茄土豆,最后还是使用了 aTimeLogger。在记录的过程中,我反复思考和感觉自己在时间记录上有什么样的需求。aTimeLogger 能不能完全满足我的需要。最后,我想到了现在这个项目:DailyTick。

aTimeLogger 做为时间管理的工具,已经是非常好用的了。其实还有一个也不错的,而且 UI 做的比 aTimeLogger 好看多了的 Mr.Timer。但是,仔细看李笑来老师的文章,你会发现,他反复强调的一点是:时间是不能管理的,能管理的只是我们自己的注意力。我反复思考、对比他所谓“时间不能管理”这个说法和主流的时间管理概念有什么不同。我一开始的感觉,这不都是一样的事情吗?不就是规定自己一天中的哪段时间应该干什么。然后严格执行这个计划。比如:看书1小时,写作1小时,给某某打电话30分钟。或者就算用番茄工作法,也不过是把这个时间变成一个番茄时间而已啊?!

然后我又仔细回忆柳比歇夫的故事,慢慢想通了一点(也可能是我想错了):在柳比歇夫的故事里,并没有提到他计划干什么事情需要多长时间。他只是在记录自己做每件事情的时间。然后对这些时间进行统计。也就是说,我们要把自己的生活在时间这个维度上数字化。我应该是在2016年5月到6月这个时间段里想通这个问题,并开始设计 DailyTick 的。但一真没有时间动手开发。在那之后,我尽量用 aTimeLogger 模仿 DailyTick 的思想去记录每天的行程。然后在周末的时候整理、统计,对比本周和前一周的各项记录项目和时间使用量。看看哪个多花了时间,哪个少花了时间,哪个可以削减,哪个应该增加。如此一直从9月搞到12月。

我发现 aTimeLogger 最大的问题就是统计不方便,记录也太麻烦。先说记录麻烦:每当要开始一个任务的时候,总有一个难题,就是这个事情是什么分类的事。如果记得太粗,你能看到的每天的时间花费都是非常整块和时间。而这段时间里的效率没法分辨。如果记得太细。那就需要在干这个事情的时候,去找到对应的类别。而有的时候,一件临时插进来的事情,很可能找不到分类。如果这个时候你要新创建一个分类——哈哈,你懂的。

再来说一下统计的功能。aTimeLogger 是把一天里(或者一周、一年)按照分类来加总,形成一个饼图。就如刚才说的,如果你要统计得细,那就需要创建很多的分类。虽然 aTimeLogger 可能考虑到这个问题,提供了一个分组的功能。但分组的选择有时候也是一个灾难。比如你创建了一个“工作”分组,里面有“打电话”、“发邮件”和“面谈”。那么不常用的工作可能会被你折叠到“工作”这个分组的内部。一段时间不用,甚至会忘记一个类别在哪个分组里(如果分组和类别太多和话),然后还要一个分组一个分组的找(好像又说回到上一个话题了)。总之就是统计功能太单一。我的做法只能是在备注里写上工作或者学习的内容,然后周末再自己一条一条的加起来。由于这种方式很麻烦,一段时间之后,我就放弃了,只记录“工作”、“阅读”、“学习”这样的整块的时间,不再统计细部的时间了。

那么,DailyTick 的设计哲学是什么呢?我举了个比较形象的例子(其实是我不想画图了^_^):你有一个圆形的钟表。表转一圈是24小时。早晨8点起来,你在表盘上画了一个记号。然后去洗漱。洗漱完——可能是花了10分钟——你回来,又在表上做一个记号。诸如此类。当然,你还需要一个本子,用来记录每个记号代表的事件。同时,还可以给这个事件做一个标签。于是,这个时间记录就丰富起来。

比如:8点30分从家出门,步行到公交站,记录了一下(事件:走路到公交站,标签:走路、通勤);坐上公交,到了公司,再记录一下(事件:坐公交到公司,标签:公交、通勤)。看到了吗?你不但可以记录做了什么事(就像 aTimeLogger 的分类一样),还可以给每个事件增加新的统计纬度。比如,如果你经常出差,还可以在标签里记录事件发生的地点,这样你就可以知道自己一个月在哪个城市待的时间最长。

也许你会说:我要上公交了,哪儿有时间做记录?!所以,这里的记录方式非常简单:你只需要在通知栏里点一下,就相当于刚才在表盘上刻了一个记号,等你到了公司,把把事件和标签补上(感觉像刻舟求剑)。也许你还会说:我记录了一堆,都忘了哪个事情对应的是哪个时间了。那我好像帮不了你了。只能提醒你:要经常做好记录,不要等一天的最后再记录,那样很多事情都记不得了。另外,标签这个事情,其实只要事件记录了,标签什么时候加并不重要。这个可以在一天的最后,边回忆一天的工作,边加上标签。我会把最常用的6个标签和最近使用的6个标签直接显示出来,剩下的就只能自己输入了(可能会有 autocomplete)。

有了这些记录和标签,再做统计就方便多了。当然,如果你统计也不想做,我应该会推出一些增值服务:把一段时间的记录导出成,比如 PDF 文件、Excel 文件。当然既然是增值服务了,这部分是要收费的。

DailyTick 会使用 Xamarin 来开发,客户端的源码是开放的。和另一个项目 CoreCRM 一样,开发的过程也会记录在这个博客里。服务器(也就是所谓的增值服务)是不开源的。当然,在客户端,这部分通信的代码也不开源。可能会留一个接口文件。

DailyTick 的 GitHub 地址:https://github.com/holmescn/DailyTick

DailyTick 开发实录 —— 开始的更多相关文章

  1. DailyTick 开发实录 —— UI 设计

    上次的文章中描述了 DailyTick 的设计理念.经过两周左右的设计和开发,现在 DailyTick 的主要 UI 已经完成了原型的设计和初步的实现.既然是原型,当然看起来就有点粗糙. 主 UI 主 ...

  2. Google Chrome Native Messaging开发实录(二)Chrome Extension扩展

    接上一篇<Google Chrome Native Messaging开发实录(一)背景介绍>的项目背景,话不多说,有关Chrome Extension介绍和文档就不展开了,直接上代码. ...

  3. 【视频开发】ONVIF、RTSP/RTP、FFMPEG的开发实录

    ONVIF.RTSP/RTP.FFMPEG的开发实录 前言 本文从零基础一步步实现ONVIF协议.RTSP/RTP协议获取IPC实时视频流.FFMPEG解码.开发环境为WIN7 32位 + VS201 ...

  4. 【开发实录】在鸿蒙开发板上使用websocket(移植自librws库)

    librws: Tiny, cross platform websocket client C library 相关代码可在下面下载,也可进入librws: 将librws移植到鸿蒙Hi_3861开发 ...

  5. CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]

    上一篇文章我提到:为了使用"国货",我把 Linux 上的构建和测试委托给了 DaoCloud,而 Travis-CI 不能放着不用啊.还好,这货支持 macOS 系统.所以就把 ...

  6. CoreCRM 开发实录——想用国货不容易

    昨天(2016年12月29日)发了开始开发的文章.本来晚上准备在 Coding.NET 上添加几个任务开始搞起了.可是真的开始用的时候才发现:Coding.NET 的任务功能只针对私有的任务开放.我想 ...

  7. CoreCRM 开发实录——开始之新项目的技术选择

    2016年11月,接受了一个工作,是对"悟空CRM"进行一些修补.这是一个不错的 CRM,开源,并提供一个 SaaS 的服务.正好微软的 .NET Core 和 ASP.NET C ...

  8. Jquery EasyUI 开发实录

    有好几年没有用过EasyUI了,最近在外包做的一个项目中新增功能时,又用到了,本以为和按照以前那样用就可以了,可当我真正用的时候,发现许多地方不一样了,就连官网的文档都更新了,最突出的就是不知道什么时 ...

  9. CoreCRM 开发实录 —— 单元测试、测试驱动开发和在线服务

    测试不是问题,问题是怎么测试. ## 单元测试 我认为单元测试已经是无可争议的最佳开发实践之一.但是很多人并不同意这个观点.他们的说法无非是:写测试需要花很多时间,需求又经常变动,一但变动,一大片测试 ...

随机推荐

  1. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点

    在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity ...

  2. 自己实现一个javascript事件模块

    nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...

  3. Hbase的伪分布式安装

    Hbase安装模式介绍 单机模式 1> Hbase不使用HDFS,仅使用本地文件系统 2> ZooKeeper与Hbase运行在同一个JVM中 分布式模式– 伪分布式模式1> 所有进 ...

  4. obj.style.z-index的正确写法

    obj.style.z-index的正确写法 今天发现obj.style.z-index在js里面报错,后来才知道在js里应该把含"-"的字符写成驼峰式,例如obj.style.z ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. Performance Monitor4:监控SQL Server的IO性能

    SQL Server的IO性能受到物理Disk的IO延迟和SQL Server内部执行的IO操作的影响.在监控Disk性能时,最主要的度量值(metric)是IO延迟,IO延迟是指从Applicati ...

  7. VB.NET设置控件和窗体的显示级别

    前言:在用VB.NET开发射频检测系统ADS时,当激活已存在的目标MDI子窗体时,被其他子窗体遮住了,导致目标MDI子窗体不能显示. 这个问题怎么解决呢?网上看到一篇帖子VB.NET设置控件和窗体的显 ...

  8. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

  9. Linux监控工具介绍系列——vmstat

      说来惭愧,玩Linux这么久了,居然没有玩转vmstat这个命令,对很多指标的具体意义都有点模糊不清,花了点时间好好学习.整理一下这个命令的相关资料.因为这个命令确实比较重要,而且频繁用到. 命令 ...

  10. Spring代理模式及AOP基本术语

    一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...