“i-have-adhd”这个项目名第一次出现在我屏幕上时,我就愣住了。这不是矫情,是一个做了很多年开发的人,终于肯给自己贴上的标签。ADHD,注意力缺陷多动障碍,听起来像小孩才有的毛病,但成年开发者里带着它工作的比例高得离谱:一边亢奋地写原型,一边连吃完饭都拖到下午;时间感知失灵,五分钟的活儿感觉像两小时,两小时的deadline像永远没有;脑子里同时跑着十个线程,最后哪个都没跑到终点。
所以我做了这个小项目,叫“i-have-adhd”。它不是什么医学诊断平台,也不是什么科学严谨的心理治疗工具。它就是一个普通开发者给自己搭的“外部大脑”系统:用一套极轻量的流程,把大脑记不住、管不住、看不见的东西,全部放到一个可交互的命令行工具里。我把它做成了开源项目,陆续有朋友在抄,也有人直接拿配置去改。这篇文章,就把整个设计和实现过程拆开来聊聊,适合同样觉得“脑子不好使”的人,也适合想帮朋友做点什么的人——你可以直接照着抄,也可以当一篇产品设计案例看。
1. 这项目是怎么来的
1.1 承认“我有ADHD”之后,我反而轻松了
很多人第一次意识到自己有ADHD,不是在诊室,而是在某一晚加班写代码的时候。就我自己来说,那阵子刚接手一个跨平台系统,任务拆了三十多张卡片,每一张都标注“紧急”。头两天我打了鸡血一样狂写,第三天突然打开项目文件就烦,于是去调字体、配编辑器主题、折腾快捷键。等到一周过去,代码没写几行,键鼠驱动倒是重装了四遍。最要命的是,真正重要的事情——比如月底要交的阶段性成果——我总会拖到最后一夜,然后靠肾上腺素硬扛。
后来去医院评估,医生说我的注意力系统对“奖励”的感知阈值比普通人高,越远的奖赏越刺激不了大脑,越紧急的最后期限反而越能启动多巴胺。听完我反而笑了:这解释了所有“明明能做却不去做”的时刻。可光有解释没用,日子还得过。所以我决定从工具角度下手,试试能不能通过外部机制骗过这个大脑回路。
项目取名“i-have-adhd”,其实是我每天要对自己说的话。它不是自我可怜,而是提醒:你的大脑确实和别人不一样,你不需要假装正常,你要用别的方法。
1.2 这个项目到底做什么,适合谁抄作业
它的核心用途是四件事:任务捕获、任务分解、时间盒提醒、每日复盘。听起来很像常见的待办事项App,对吧?区别在于三点:
第一,它运行在终端里,打开就是收件箱,没有任何社交、统计图表、会员体系。没有需要花费耐心去学的东西,输入一条待办,回车,结束。第二,它默认把每条任务拆到“能直接开干”的程度,不让你站在任务前思考“从哪开始”。第三,它的输出是纯文本,我可以把数据丢进微信传输助手的发送框,也可以同步到网盘,不会绑定任何服务。
哪些人适合试这个方案?首先是和我一样,用市面上所有任务管理工具都撑不过两周的人;其次是觉得“计划不如变化”但依然相信系统能帮上忙的人;最后是开发者,你可以直接改造和复用它的代码,把它变成自己的形状。如果你只是轻度拖延,用普通日历就够了;但如果你的问题是“知道该做什么但无法启动”,那这套系统可能真的对味。
2. 设计思路:给ADHD大脑做一套外部系统
2.1 得先搞清楚三件事
做工具之前,我花了不少时间梳理ADHD大脑最让人头疼的三件事。
一是工作记忆太小。普通人的工作记忆像是桌面,最多同时摆开四五样东西;ADHD的桌面却常常只有一张纸那么大,放不下两个任务。所以工具的第一要义是“随时清空脑内感想”:想到什么立刻记下来,不要在心里默念“我等会儿再写”,因为等会儿就没了。
二是时间感知失灵。我认识一个很优秀的插画师,她说她画一张图要多久,自己永远估计不出来,只能以“早上开始画了”和“天黑了”为标准。这种状态叫“时间盲”,手头正在做的事会让人完全感觉不到时间流淌。所以工具要主动提醒你:时间盒到点了,该换换脑子了。
三是启动阻力过大。对一个ADHD大脑来说,“把垃圾倒了”需要经历“从沙发上站起来、走到垃圾桶旁边、弯腰、拿袋、下楼、丢、回来”十几个步骤,每一步都是一种消耗。如果任务清单上写着“完成项目文档”,那启动阻力直接爆表,大脑会立刻去找别的刺激。所以,必须把大任务分解到“两步以内能迈开腿”的粒度。
2.2 三条铁律:摩擦为零、全部外置、进度可见
基于上面三个洞察,我给项目立了三条设计铁律。
第一条,摩擦为零。任何功能如果超过两次点击(或者两秒的思考时间),ADHD用户就会弃用它,然后开始研究“怎么把终端变成复古像素风”。所以命令一律极短,比如task 写博客大纲这一个命令就可以完成捕获,自动设置优先级、自动打时间戳。不需要先选列表再选标签再选日期,那些普通产品里理所当然的“规范”,到这里全是劝退开关。
第二条,全部外置。大脑只能当“创作者”,不能当“存储盘”。所有待办、提醒、日程、复盘内容都落到文件里,系统定时读取,在关键节点主动推送。人不管内存,人只负责输入和行动。为此我强迫自己接受一个习惯:想到的任何事情,哪怕只是“书架上那本书该还了”,也必须先敲进任务箱,然后才允许放在脑子里。
第三条,进度可见。ADHD患者对“看不到成果”的容忍度极低。一个任务做了一半,没有勾选、没有状态变化,就会觉得“白干了”。所以系统里每一项完成都会产出一个明确的“完成”标记,并写入当日日志。这样一来,哪怕今天只完成了三件小事,晚上打开日志也有三个实实在在的勾,比任何安慰都管用。
2.3 技术选型我就没纠结过
有些朋友看了我的演示视频,问为什么不用 Electron、不做一个 Web App、不搞个漂亮界面。我的回答是:ADHD用户根本不会为了“界面好看”天天打开一个软件。界面越是华丽,越容易引发研究主题皮肤之类的偏题行为。
技术栈我选得非常务心:Python 写核心逻辑,JSON + Markdown 当数据存储,系统自带的通知服务做提醒,定时任务用 cron。没有数据库,没有云服务,没有队列。依赖只有一个 Python 标准库加一个用于系统通知的库,如果实在没有网络环境,甚至可以退化成打印文字。
选它的理由也很直接:
- 纯文本存储意味着数据永远在我手里。今天用这个工具,明天不用了,信息还是普通文件,随便哪个文本编辑器都能打开。
- 终端操作可以直接嵌入肌肉记忆。开终端本来就是我每天的工作习惯,不需要额外点开某个软件,少一次点击就多一分坚持下来的可能。
- 模块拆得足够开。每个功能都能单独拎出来测,坏了也只坏一块,不耽误其他模块使用。
项目做出来之后,我的朋友 A 把它狠狠吐槽了一顿:“你这不就是个脚本合集吗?”我说,对,就是脚本合集。对我来说,能让人一直在用的脚本合集,远胜过一个打开率百分之一的精美应用。
3. 核心模块是怎么搭起来的
3.1 任务捕获与分解:把“做项目”变成“点下一项”
整个系统的入口是一个叫捕获的命令。它的结构非常直白:
task 给窗口换个密封条 task "写周报 30分钟" task "给客户回电话 #工作"捕获不是单纯记录,它内置了一个粗糙的解析器。普通输入会进入未整理箱;带#标签的会追加标签;带时间词的会生成对应的定时提醒。你不需要严格遵守格式,写得越随意越好,因为捕获的本质是“让大脑快速卸载”,而不是“录入档案”。
真正神奇的是后面的人工归类环节,每天我会用一个叫review的命令把未整理箱里的任务扫一遍。有几个问题会自动弹出:这件事还需要做吗?如果要做,下一个动作是什么?下一个动作需要多少分钟?然后系统会把任务改写成一个“最小可执行动作”,比如“联系老王”改成“给老王发条微信问他周三下午有没有空”。
这一步非常重要。ADHD大脑根本不适合面对“联系老王”这种模糊任务。它太开放了,会忍不住想“老王是谁来着?为什么要联系他?我给他发什么?”然后就走神了。但当任务变成“给老王发条微信问他周三下午有没有空”,大脑不用决策,直接执行,行动就特别顺畅。
3.2 时间盒:和“时间盲”和解
时间盒模块源自番茄工作法,只不过我做了一些针对性的改动。
标准番茄钟是“工作25分钟,休息5分钟”。但这个节奏对ADHD来说可能过于死板:有时候刚进入心流,25分钟到了,强切会非常恼火;有时候状态极差,25分钟都像坐牢。我的方案是引入“可选初始时长”和“强制结束提醒”。
focus 30会启动一个30分钟计时,期间终端会进入专注模式,不再输出别的任务提醒;到点时系统会弹出一条通知:“时间盒结束。要么站起来喝水,要么继续下一个25分钟。没有‘最后五分钟’。”诚实说,强制结束比强制开始更重要,因为ADHD的问题常常不是不开始,而是停不下来。一停,开始下一件事才变得可能。
时间盒模块还附带一个功能叫“余量预警”。比如你预估任务要30分钟,实际上第30分钟时如果还没完成,系统不会逼你继续,而是会问一个问题:“还剩多少?再估一个数。”这个再估的过程,其实是在训练大脑对时间的感知。用久了,我发现自己对“一个番茄钟到底能做多少事”的判断明显变得更准了。
3.3 提醒与回顾:靠系统不靠意志力
所有记忆型任务,比如“周三下午开会”“周五前交材料”,我都会直接交给系统。我不信任自己的脑袋,信任一条 cron 命令。
系统每15分钟扫一次今天的日程,如果到点了,就会向系统通知服务推送一条消息。比如:
你现在应该正在写周报,这个任务分配了45分钟。如果还没开始,请从“列出小标题”开始。
这里我踩过一个很有意思的坑:最初提醒文案写得很温柔,什么“没关系、慢慢来、你一定可以”,结果完全无效。后来发现,对我的大脑来说,“温柔”的提醒会被解读成“可以不做”。反而是“列出小标题”这种命令式文案能触发行动。所以提醒模块的文案系统改成了“状态判断 + 最小指令”的模板:
- 如果快到截止时间:输出“距离截止还有 XX 分钟,请先完成最小动作:……”
- 如果已经超时:输出“已超时超过 X 分钟,切换到另一个任务,不要继续耗。”
3.4 数据文件:用纯文本当数据库
我原本是想用 SQLite 的,但仔细一想,给自己用,数据量又小,SQLite 反而增加复杂度。最终所有数据分三个文件存:
tasks.json:当前任务清单、未整理箱、项目分解。log.md:每日完成记录,每完成一件事就追加一行。notes/:随手记的参考资料、闪念笔记,每个念头一个 md 文件。
访问方式全都封装在代码里,格式对外就是朴素的 JSON 和 Markdown。好处是,某个周六的晚上我忽然想统计自己过去一周完成了多少件事,不需要跑复杂的报表查询,直接写个 Python 脚本读 log.md 就行。坏处也有,就是多人协作时不好锁文件,但对我这种单人系统来说毫无影响。
4. 从零实操:跑通这套系统的完整过程
4.1 初始化:目录结构和数据文件
你完全可以在自己的机器上搭一个简化版。目录结构我长这样:
i-have-adhd/ ├── adhd.py # 主程序 ├── config.json # 用户配置 ├── data/ │ ├── tasks.json │ ├── log.md │ └── notes/ └── scripts/ ├── remind.py # 提醒脚本 └── review.py # 每日复盘脚本第一步,建目录,然后创建一个空的config.json:
{ "timebox_default": 25, "review_time": "21:30", "notify": true, "storage": "./data" }字段很好理解。timebox_default是默认专注时长,我建议一开始用25分钟,习惯后再调整;notify控制是否发送系统通知;storage是数据目录。
4.2 写命令:一个命令完成一次捕获
核心的捕获函数非常简单:
def add_task(raw_text): data = load_json("data/tasks.json") ts = datetime.now().isoformat() tags = re.findall(r"#(\w+)", raw_text) clean = re.sub(r"#(\w+)", "", raw_text).strip() item = { "id": uuid4().hex[:8], "text": clean, "tags": tags, "created": ts, "status": "inbox", "timebox": None } data.append(item) save_json("data/tasks.json", data) print(f"已捕获: {clean}")如果还想要通过命令行直接传参而不是交互输入,可以用sys.argv读取。比如执行python adhd.py 给显示器换根线,程序会直接把它存进去。这一步我做了个别名放在 shell 配置里:
alias task="python3 ~/adhd/adhd.py"这样每次只要敲task 某个念头就会自动记录。用顺手之后,这个命令变成了我脑中“念头卸载”的动作反射,比掏手机打开待办软件快十倍。
4.3 接通知:让系统主动来找你
先决条件是让系统能发通知。我用的方案是终端内调用系统通知脚本,Linux 上可以用notify-send,macOS 用osascript。我用一个很小的脚本封装:
import subprocess, platform def notify(title, message): system = platform.system() if system == "Linux": subprocess.run(["notify-send", title, message]) elif system == "Darwin": subprocess.run(["osascript", "-e", f'display notification "{message}" with title "{title}"'])然后配合 cron 定时调用。打开crontab -e,添加:
*/15 * * * * cd ~/adhd && python3 scripts/remind.pyremind.py会扫描tasks.json中带提醒时间的任务,时间到了就调用notify。这个套路不难,但用完真心觉得舒服:系统不会沉默,你一旦忘了重要的事,它会自己跳出来拍你肩膀。
4.4 定制化:把默认配置改成自己的
每个人的 ADHD 表现都不一样,配置必须可调。我经历了三个阶段才稳定下来:
第一阶段,完全用默认配置,不加任何自定义。这个阶段被强制习惯“输入数据”这个动作,别的都先不管。第二阶段,根据自己观察改时间盒参数。我发现下午2点到4点是我的低谷期,所以把下午的默认专注时长调成15分钟,并在配置文件里备注“下午只做维护类任务,不安排创造类工作”。第三阶段,加入自己的“彩蛋”——比如每完成三个任务,系统会随机打印一句当时的激励语录;完成了一个被拖延两周以上的任务,它会额外追加一条“这是本周期最大的胜利”。
配置本身其实很简单,核心在于你愿不愿意一次一次地改、一次一次地试错。不要期待搬到手就神效,它是你的工具,不是你的主人。
5. 真实使用中的坑,我替你踩过了
5.1 工具也会“陈旧化”,新鲜感一过就停用
这是最典型的问题。我刚做完这个项目的前两周,天天热情高涨地记录、时间盒、复盘;到了第三周,某天晚上忘了跑复盘,第二天就变成“补复盘”,第三天彻底不想打开。回头一分析,原因很朴素:新鲜感带来的多巴胺撑不住了。
我的解法是“降级使用”。不是断了这个工具,而是允许自己连续三天只做捕获,不做时间盒。哪怕系统里堆了一百条未整理任务,也允许它们堆着。核心原则是:不能断掉“外部存储”这个习惯。等到状态回暖,再清理。这个“低电量模式”非常管用,它让工具从“热血项目”慢慢变成了“日用家具”。
5.2 别把一个工具做成第二个负担
工具本身成了负担,这是很多人做个人系统的通病。我见过一个人花了大半周给任务系统加标签、堆图标、调颜色,结果本末倒置。ADHD工具最怕“功能膨胀”:每多一个功能,就多一分认知负担,到最后你花在维护系统上的时间,超过了它帮你省出的时间。
我自己也中过招。有一段时间我执着于“把所有笔记都自动结构化”,写了各种解析器、分类器,后来又想把笔记自动打上情绪标签。做了三天,终于意识到这纯粹是另一种拖延:看起来在生产工具,实际上在回避真正该做的事。最后我把这些“高级功能”全部删除。恢复简单之后,系统才重新变得可用。
5.3 问题排查速查表
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 每天早上一打开终端,就逃避使用 | 功能太多,产生了启动压力 | 恢复“低电量模式”,只留捕获命令 |
| 捕获记录倒是很多,但没行动 | 捕获和行动之间缺少“分解”步骤 | 执行review,把大任务一步步拆小 |
| 番茄钟响了我还不想停 | 正进入心流,但已经超时 | 允许“只加一个小番茄”,但必须设5分钟休息 |
| 提醒发了,我却完全忽略 | 无声通知或系统弹窗容易被忽略 | 换成有声音的提醒,并把重要提醒设置为全屏 |
| 复盘写不下去,觉得“今天没干什么” | 记录粒度太粗,看不到成果 | 每天允许记录3件“最早最小的事”,哪怕只是叠了衣服 |
这张速查表是从我的真实日志里整理出来的。如果你的症状不一样,建议花一周时间用笔记录“在哪个环节断掉”,再制定自己的对策。
6. 我的体会和还能玩出的花样
6.1 工具是拐杖不是神药
做完这个项目之后,有一个很深的体会:工具能帮你把碎片拼成图,但它不会让你瞬间变成蜈蚣一样高效的巨人。它更多像拐杖,你腿受了伤,拄着它能走得更稳,但真正把你推到终点的,还是你自己想往前走的念头。
我见过有人抱着工具找“终极效率心态”,搜了一圈觉得这个不顺滑、那个不漂亮,一周换一个软件,最后比不用工具更挫败。而“i-have-adhd”这种低技术含量的脚本合集,反而因为“接得住”被我一直用着。以前我总觉得,做工具要酷、要自动、要智能;现在我知道,对很多人来说,能做到“让你明天还愿意打开”就是最好的设计。我一直把它放在终端里,而不是做成一个需要“涮存在感”的应用,正是为了尊重这个真相。
6.2 后续想加的东西
现在这套系统已经成了我日常作息的一部分,我也在琢磨下一步扩展的方向。一个是“晨间一页纸”:每天早上自动生成一张当日卡片,上面只有三件事,其他统一收进存档,避免一上来就被几十项任务吓退。另一个是“任务能量值”:根据一天里的不同时段给任务标出“适合做”和“不适合做”,比如我的代码写作低谷期就绝不安排需要极度专注的调试工作。
还有一个更长远的方向是“同伴同步”。把一个任务清单放到局域网共享里,和同样有注意力困难的室友互相看进度。不需要说服对方,只是为了让对方知道“你不是一个人在挣扎”。这其实是 ADHD 支援里很关键的一部分——社群感。工具再轻,也得有人一起走。
最后分享一个小技巧:每周末我会把log.md里本周完成的事情快速扫一遍,选其中一件最有成就感的,把它复制到根目录的wins.md里。等哪一天觉得自己什么都没做成的时候,打开wins.md,里面全是过去打败过的怪兽。这套机制成本为零,却是我个人系统里最有价值的部分——它印证了:只要方法合适,一颗总是忘记灵感的大脑,也能留下一条又一条真实的足迹。