2025 回顾总结

2025 年的年终总结非常特殊,最初计划是在寒假期间完成,但在百般拖延之下,直到一季过后的四月初才正式开始落笔,早已不算「年终」了。谈「回顾」2025 太远,谈「展望」2026 又太近,着实是遗憾。

2025.12.26 记事

……不过今年的年终总结我想换一种方式了,因此打算不在年内发布,而是等到寒假的时候再开始动笔……暂定的最后期限是 1.15,即放假后一周内。

但也并非毫无内容可写就是了。不过相当一部分几近自言自语,外人难以触摸,如欲跳过可点击此处

新的记录

2025.12.26 记事

……二是有一些新的角度去统计、见证我这 2025……

忘了契机是什么了,我在 2025 年 5 月,也可能其实在 4 月,再度萌生了「个人知识库」的想法。

说是再度萌生,是因为早在高中的时候就有所接触,非常惊喜,觉得「这就是我想要的」,但因为当时仍在 Anki 等挣扎,因此最终并未开辟「第二战场」。虽对 Obsidian 等工具有所耳闻,但终于因畏惧再度陷入插件与配置中而未曾尝试。

而今再度萌生了念头,于是进行了筹备,然后投入使用,直至今日还在活跃。

当然上面的描述其实并不准确。我的初衷其实是「个人知识库」,或者说是「第二大脑」。我认为在 AI 的浪潮下,非常有必要更多地将自己「刻录」下来,所以才会萌生这样的想法。而顺带就诞生了一些副产物,例如说日程记录等,希望可以以此来对我进行约束。

我很多时候摆烂实际上也是不知道自己要做些什么,因此有一个日程记录,就能将自己从无所事事中解放出来,吗?

后面看来,其实并非如此,我很难说日程记录对我的变态习性约束起到了什么正向作用。但我现在能从好的一面看事情,那就是它这个「记录」本身就有价值。

我时常懊恼为什么自己感觉对过去的事情没多少印象。但又惊讶地发现,在写《光影之中成长》时居然有这么多值得写的,哪怕是删改、略写不少内容,依旧是膨胀到极致。

但依旧不可否认的是,我写的时候非常痛苦,需要去考证信息。但其中相当一部分都难以追觅了,只能靠我干巴巴地口述回忆,再带上很多口水话。

而写到高中的时候,虽然记录还是不多,但相较之前还是好上不少,因此我写得也就更畅快一点,也能大段大段地复制粘贴。还偶尔能看到一些自己现在都没想到的内容,嘴角掩饰不住笑意。

记录太重要了。没有人会替我记得我,我要记住我自己。我要在未来的时候,不会对自己的过去感到陌生,不会没法倒带重新进入我的心理世界,不会张口讲不出自己的曾经。

因此在后面,「日程记录」中的「记录」部分逐渐取代了「日程」部分。虽然依旧有一些「形式上」的日程规划,但实质上重点已经转移到「记录」本身了。换句话说,可以看作是我的「日记」。

不过说是「日记」也不妥当。内容多是「思绪流动」与「快速记录」,不太像日记那样的当日回顾与总结。

很早之前似乎提过「表达欲」什么的,很多有感的内容当日就记录下来了,也许简略,也许粗糙,但比之前的灵感更具体,比记事更方便。由此也可以看出来,为什么 To Do 的灵感记录以及记事板,或者说笏,逐渐衰微了吧。

因为我在每日的记录中就极大地满足了我相当一部分的表达欲,笏本身反倒成了一个任务,一个束缚了。

只是每日记录终归还是带有点私人属性,而笏则是公开的,因此我短时间内应该还是不会放弃笏那边,只是后续会不会有调整也不好说了。

想来也挺有意思,小时写过正儿八经的日记,就是那种最上面写日期、天气、心情,晚上写正文的那种;初高中发过 QQ 空间;高三的时候写过摆记,形式上是周记;大学的时候启用了笏,以月为单位进行记事。然后演变到现在逐渐每天进行记录。

然后也是该谈谈具体是怎么个记法了。

上面说日记,会记录日期、天气、心情什么的。这些现在被我称为是「元信息」。元信息非常重要,可以通过元信息将内容进行高效地筛选。

日期自不必说;天气则被我废弃掉了,因为这个基本没什么意义,有内容的其实也会记录在下面(例如说雨天的抱怨什么的);心情则分为五档,五个 Emoji,分别代表从最开心到最糟糕。此外还加入了两个元信息,一个是今日的精力,分为三档,高、中、低,另一个则是今日的评分,0~10。

这三个指标的评分,我都是毫无明确的标准的,因此完全有可能标准发生迁移,导致前后不一致。但这其实没什么办法,我个人的想法就是,就这样吧短期内标准恒定则短期内有其价值,有比没有好。

一个非常显著的例子是 2025 年 10 月,我当时在做 Focust 嘛,做得废寝忘食,非常投入,因此那会每日的评分不低。

但到后面的时候,由于过度专注与投入了,我其他的安排完全被打乱了,甚至作业都被置之脑后。常常是任务与日程安排写着今天要好好学习了,然后实际上又是弄了一天 Focust。而这样往往还能被给予高分,因为我很专注投入,我有一个实实在在的目标。

但持续过久,着实不利。因此我后面在内心中就调整了标准了,即便当天再专心致志地弄 Focust,只要它不是我的任务要求,只要我没去管要求的学习任务,那就只能给予低分。

自那之后,就出现了一些高精力但低分的情况了,就是由于这种评价标准的变化。

当然我一向是觉得,有目标的前进比无目标的徘徊更好,因此不到万不得已,我还是不会这样改标准的。像现在四月份,已经开学一个月多,实话实说我大部分做的事情依旧在每日的规划之外,早早就确立要完成的内容(即写作),长久地停滞不前。但我还是愿意给出高分,以进行一定程度的鼓励。因为行尸走肉般毫无目的地摆烂,在我看来其实是我更大、更难以克服的敌人。

除了这些简单的元信息外,就是具体的正文了。我其实对元信息进行过调整,不过添加的都是确定的元信息,如星期等。我现在其实还没添加过额外的元信息,以让我的记录更「数据化」,但未来确实不好说。

正文除了我提过的每日简要的日程安排与一些任务外,就是所谓的「思绪流动 & 快速记录」了,也被我认为是最有价值的部分。

后面还有每日的总结什么的。是最开始弄模板的时候已故的顾问给出的,不过其实相当多的时候浮于表面,被我快速敷衍。

就这么简单,没什么别的东西了。额外有一些「黑科技」,如显示近段时间的任务什么的,不过不属于本篇的重点,而且是自动聚合的,不算正文。

数据统计与回顾

有了这些简单的元信息后,就可以进行统计了。「换一种方式」指的就是这个。

其实我寒假最后的记事中已经提前剧透过了:

2026.2.28 记事

第一个是做了个年终总结仪表盘,这也是我所说的年终总结的「准备」已经完成了。

下面是内容,作为一个正式的年终总结到来之前的尝鲜品:

数据总览

首先来看看综合的数据吧。记录从 2025.5.8 开始,2025 年共记录 239 天,不到 8 个月。

平均分 3.8/10。这个评分可以稍微讲一下,我大概划分为 0~3 分是低分段(共四个分值),4~6 分是中分段(共三个分值),7~10 分是高分段(共四个分值)。这个是离散分值的划分。不过还有连续分值的,例如说一周或是更长期的平均分,这个倒没咋确定,有大概两种方案,一种是 [0,4)[4,6](6,10][0, 4) \cup [4, 6] \cup (6, 10] 这种 4-2-4,还有一种更均匀的就是 [0,3](3,7)[7,10][0, 3] \cup (3, 7) \cup [7, 10] 这种 3-4-3 的(我大概偏向这种)。下面图表中按的是 [0,3.5](3.5,6.5)[6.5,10][0, 3.5] \cup (3.5, 6.5) \cup [6.5, 10]

不管怎么算,这个均分都只能算中等偏下的,算是从数据层面证明了我的摆烂吧。

仪表盘还有一些任务相关的数据,但这些其实我觉得意义不是很大,因此后面不会怎么涉及。

最常见的心情就是「一般 😐」,非常正常,一般没遇到什么非常特别的事情,就是这个了。即便可能有一些小确幸,也很难影响心情(除非真的让我快乐一天,但大部分时候只是短瞬罢了)。然而相反,糟心的事情倒会印象深刻一点,也许正向反向程度一致,但前者很难提高我的心情,后者却能显著降低。于是差的心情是比好的心情更多的。

连续天数,这也是我觉得没啥意义的数据。

因为一来我已经改变了观念,于是会尽可能保证每天都写,即便是真的摆完了,后面也会补一个应付的空缺。至于高分连续,5 天实在是太困难了(要连续五天以上评分 7+),如果我没记错的话,唯一的记录是在 5.24 ~ 5.28 的 8, 8, 7, 9, 7。那段时间可能是因为刚开始的标准比较不定,也有状态不错的因素。然后 5.29 就以 2 分断掉了。这是为什么呢,其实那天本来状态可能可以持续的,只是发生了「割脉」事件……自后大约就再无这么长的高分持续期了(当然,低分倒是手到擒来)。

这就是热力图了,不过 Vibe Coding 缺了一个精力的热力图,反倒是搞了一个没啥用的任务完成率日历热力图。也许因为精力的热力图就三档,没啥意思吧。

从情绪热力图也可以看出来,最多的就一般,有情绪波动的一般就是偏差。均值是稍微往差的方向偏移。

这是月 x 星期的评分热力图,我一般讨论都是将五月排除掉的,因为太 bug 了,记录不完整就算了,还非常突兀地高。

从这个热力图可以看出来,暑假的时候真的就是摆得不能自己。尤其是八月,一片红,七月好歹有周一撑住了没变红。不过我比较感动的可能是没有一个均分下 1,最低的大概是 11 月的周日,均分 1.2 分。

由此也可见,不管是假期还是上课,周末都是摆烂的重灾区,基本上都是红彤彤的,唯少数例外。

这是日评分趋势图,可以更清晰地看出来我的状态随时间的变化。其中线条是七日均值,更平滑、稳定地表示了我一段时间内的状态。具体内容在下面的部分会展开介绍,这里只是先展示一个综合的数据。

还有一个是综合趋势,上面是完全相同的日评分趋势,下面则有情绪和精力的图表。其实倒也看不出什么趋势,因为非常离散,又彼此之间近似独立。更不如看密集程度。不过比较怪的是这俩图表都是比较差的情况放在上面。

包含了任务完成率这个没什么用的指标。我放大了以下图表,这样更清晰一点。

最开始的五月是望尘莫及的 5.52 月均分,再往后就没有一个能突破 5 分甚至 4.5 分的厚障壁了。

随后是暑假的低潮,逐步走低,并在假期的最后一个月,也可以称得上是比较核心的一个月,达到了最低点 2.65 月均分。

再然后就是开学了,终于回归了还算是正常的状态,4.37 月均分。不过这也只是假期切换到开学的短暂激活状态罢了,逐步熟悉学校生活后,就基本又是一路下跌了,虽然没有学校转入假期那样断崖式的下跌。

后面还有重复的图表就略过不谈。

然后是这个星期均分的雷达图。写成表格的话就是这样:

星期
得分 4.3 4.7 4.2 3.6 3.6 3.3 2.8

也许跟课程表有一定关联吧,虽然我翻看了一下其实并没能找到有决定性的影响因素。但我其实更像说的是一种更为有意思的模式:

  1. 首先从周末开始吧,狂摆,爽摆。
  2. 然后周一要上课了,痛定思痛,我这周不能再这样子下去了。于是还算专注。
  3. 周二,不错,可以维持,这周状态不错嘛,这样子下去可以拿下不小的周均……
  4. 周三,哎呀,冲了两天了,稍微有点累了,小摆一下,分数也还可以,周均问题应该也不算大。
  5. 过三天了,快周末了,更摆了……
  6. 继续摆,虽然周均拿不了 XX 了,但 YY 应该还是可以的,只要周末能 ZZ……
  7. 周末开摆。

当然,上面的「演绎」主要适用于在校日,假期我是没什么星期的概念的)

随后是情绪与精力的关联矩阵。不过仅仅是这样看的话很难看出什么,我标一下数字(为了可读性,将精力列的顺序调换了):

情绪\精力 低迷 正常 充沛 总数
很差 13 (72%)
[9%]
0 (0%)
[0%]
5 (28%)
[6%]
18
[8%]
较差 51 (82%)
[34%]
0 (0%)
[0%]
11 (18%)
[14%]
62
[26%]
一般 66 (53%)
[45%]
8 (6%)
[62%]
50 (40%)
[64%]
124
[52%]
不错 16 (50%)
[11%]
5 (16%)
[38%]
11 (34%)
[14%]
32
[13%]
很好 2 (67%)
[1%]
0 (0%)
[0%]
1 (33%)
[1%]
3
[1%]
总数 148 (62%) 13 (5%) 78 (33%) 239

先以精力为主轴。总的来说我是比较经常性低迷的,占总数的超过六成。这主要是由情绪比较差时候贡献的,这些情绪低落的时候低迷的精力占据了 70%+。

不过有一点比较有意思的是,我情绪很好的时候,精力低迷居然也占据了 67%,虽然说样本点仅仅三个,不具备什么统计上的参考价值,但一定程度上可以反映,也许有什么让我情绪波动非常大的事情,导致我抛开了计划,沉浸在突如其来的喜悦当中。

而不错的心情有时候可以由高质量的日程导出,从图表中也可见一斑。类似的也许让人稍感意外的兴许是精力充沛中,在情绪很差的时候,精力充沛的占比竟然比较差时还高。这也许是不错的心情的反面,虽然精力充沛干了很多事情,但遇到很不好的事情于是情绪低落,而较差的时候还有可能是因为萎靡的一天引起的。

再以情绪为主轴。一般的情绪一样是占据了半壁江山,而偏差的则是占据了三成,偏好的占据了剩下两成,表明我在一般的情绪轴线上更容易受到坏事件的影响而心情变差。当然,也许也有长时间的摆烂引发的坏心情就是了。

类似比较出乎意料的可能是,正常的精力贡献了更多比例的不错的心情。这大约是因为,精力充沛也可能是将精力投入了其他方面,而忽视掉了日程安排的任务,即偏离了路子,走再远也没什么贡献。这也许其实也能反映出来,我比较专心做「应该做的事情」时精力更多是「正常」,因为我很难长时间专注在这些我兴致不高的地方,反倒是「充沛」的精力更多用在我自己喜欢、想要做的事情中。

再来看看情绪与精力对评分的影响因素,也算印证一下上面的一些结论。情绪的就不用多说了,精力方面,相较于充沛的精力,正常的精力反倒是可以获得更高的评分。

心情分布在上面的矩阵中已经有了,这里就跳过了。来看评分状态转移矩阵:

当日\次日 低分(0-3) 中分(4-6) 高分(7-10) 总数
低分(0-3) 72 (62%)
[62%]
31 (27%)
[43%]
13 (11%)
[26%]
116
[49%]
中分(4-6) 30 (42%)
[26%]
26 (36%)
[36%]
16 (22%)
[32%]
72
[30%]
高分(7-10) 14 (28%)
[12%]
15 (30%)
[21%]
21 (42%)
[42%]
50
[21%]
总数 116 (49%) 72 (30%) 50 (21%) 238

低分、中分、高分的比例大约是 5:3:2,这个比例有点熟悉啊,情绪部分一般:偏差:偏好也大约是 5:3:2。

对角线比较清晰显著,表明评分的保持有一定的可靠性。但同时这紫得发黑的低分螺旋,表明了一旦陷入低分就可能很难摆脱的困境。

这个转移矩阵意外地没什么好谈。当成马尔科夫链,稳态分布也就是最后的低分、中分、高分比例了。

然后是评分的分布。让我有点意外的是,除去稀有的 8 分以上高分段后,剩下的分数分布意外地均匀。只有 1 分和 7 分稍显突兀。也就是说 1 分是造就低分的主要灾厄,而 7 分则是力挽狂澜的主要英雄。

将这两个平均一下也就是 4 分。我也认为这个分数体系下真正的中心点应该是 4 分,而非当前设定下的 5 分。这算一定程度上证明了我的观点。当然,从均分 3.8 分来看也足以说明了。

最后是按周来看的评分占比趋势。绿色代表的高分,被一个暑假弄得荡然无存。即便离开后,也再无之前那般绵延不绝的绿色群峦了,只有互不干涉牵扯的丘陵。

趋势

为了避免在展示主要数据的时候插入太多实际例子而过于发散,上面没有详细聊聊评分的趋势。这里就来细细回味一下日评分趋势,随手翻阅一下记录,看看评分变化的时候,我都在做些什么。

在我五月开始后不久,还没到七日均值显现时就又泄气了,开始回归摆烂。然后五月末(便是我上面说的五日连珠),临近期末,开始奋斗了一番,在 5.28 达到了峰值,也是 2025 全年的 7 日均值峰值 7.1,后面一路下滑。虽然有期末的回光返照,但下坠之势不可阻挡。

看了一下日期,我 6.17 回家,6.18 正式到家开始暑假,然后便开摆。中间有因为一些课程的作业而短暂复活一下,但大多时候在纯躺尸,看那个时候恐怖、密集的零分点就知道了。例如说回家后下一周(6.23~6.29)足足有 5 个零分点,靠着期末作业 DDL 雄起了两天 7 分,最终均分 2 分。再下一周(6.30~7.6)更是创下新低,仅有 1.43 的周均分。在 7.4 达到了最低的 7 日均值 0.3 分。

那个周末痛定思痛,开始进行规划,要做点正事了,不然暑假就烂掉了。于是周末进行了一些规划,从周一开始正式进行。刚开始的时候效果不错,例如说 Git 那篇博文 就是那个阶段做到的。那七天(7.7~7.13)得分是 9. 10, 9, 7, 5, 4, 5,可见雄起三天后又萎了。但这贡献了至今唯一一个 10 分满分,靠着前三天的超强表现拿到了 7 分周均,实在是太夸张了。此外这个黄金周前三天都是好心情 + 高精力,剩下四天也都是中精力,没出现低精力,着实难得。靠着这个黄金周,在 7.13 拿到了 7 的 7 日均值,又是一个高峰,仅次于之前的 7.1。

正如趋势图所示,也就是在 7.13 达峰,后面就是一路下坠之势了。后面很长一段时间是在「看票」,浪费了相当多的时间,直到后面渐渐失去了兴致才逐步脱离。然后就是低分一直贯彻了剩下的暑假,直到临近开学才终于从谷底站了起来。

虽然前面有 1.43,但在 7.21~7.27 这周靠更少的零分天拿下了 1.29 的周均分,实际上这周就最后一天是 0 分,其他都是 1/2 分,算是非常「均衡」了。看了一下这周的记录,除了「看票」外,还有在看番,从 7.22 开始看到 7.26,共五天,可能加起来近 100 集吧,除了后几天稍微有点累外其他基本上就是从早看到晚。

这段时间是真的夸张,那段记录也是完全没眼看,因为很多都是一整天都没建,直到快到次日零点才匆匆创建,然后快速敷衍完成。有的甚至当天忘了记录,过了零点甚至第二天才来。至于周报就更是重灾区了,记得当时还欠了好几周的周报没写,直到后面才一齐补了。

那么,有没有突破 1 分的呢?有的有的,8.11~8.17 就靠着连续三天的 0 分,拿下了 0.86 的周均,成功破了 1 分的底线。这一周基本上压根没弄记录,大部分天数都是在次日零点才开始建[1],于是当日(已是昨日)的任务、规划都是空置了。

不过这周后我就再次被击倒,悲愤不已。于是下周稍微勤奋了一点,总算是从低分的 7 日均中脱离出来。不过这其实也是暑假的最后一周了,在最后一天回到了宿舍,救了救评分。那周主要是优化了日程记录方面的基础设施。

开学后一段时间内,算是比暑假纯行尸走肉的状态好上一点。毕竟刚开学,还有点正向的念头,加上有上课还不至于太烂。干了一些事情,如优化设施、去看《南京照相馆》、DP 博文、看阅兵、课程笔记的提示词、一些小的脚本等等。

虽然摆脱了红海低分,不过这段时间的周均其实基本上也很难摸到 4 分的边。说实在的,虽然说 5 分是中等分值中的中等,但这可不代表中庸就能轻轻松松拿到 5 的周均。相反,5 分的周均对我来说还是相当高的,毕竟 10 分即便是到目前也只有一个,但 0 分早已烂大街了。一旦没做事我就会一溃千里,但想拿高分却也不仅仅是做了事情就行,有一些时段有所松懈评分上就要大打折扣了。

然后是一个非常显著的跃升,发生在 9.22~9.28 这一周,这周拿了 5.86 的周均,结合我上一段说的,可以知道这一周表现其实是相当不错了。下面是这一周的周报回顾(部分记录):

2025-W39 (9.22~9.28)

  • 虽然看上去做了很多事情,但正如周日说的那样,相当一部分是灵光一闪,然后去做而完成的,而一开始就存在、更高优先级的一些任务,始终没有得到推进,例如已经放了好长时间的 **、**,还有 DDL 就在眼皮子底下的编译原理实验。
  • 系统的优化可以说就是占用了大量时间的,但其实算不上价值不高,只是相对而言,它是不着急的。
  • 拖延的话,周四周五太摆了,不然的话妥妥能上 6 的,就差 1 分。主要就是水群和刷视频、网页、媒体等了。不过水群跟之前比有所改善,最摆的时候也没之前的多了,可能跟兴趣有所转移有关,例如说本周小红书刷多了。

「正如周日说的那样」,说的是 9.28 总结的时候写的:

2025-09-28

  • 还行。现在才注意到,虽然我有时候效率挺高,完成不少任务,但怎么还是学习进度没有推进呢?脑袋一转一想才发现,原来更高优先级的一直没有去做,虽然充实做了很多东西,但都是灵光一闪的产物,这些灵感不断产生,挤占了更高优先级的事项。
  • 我觉得后面得下个规定,优先做高优先级的学习事务。

这个问题我当时意识到了,不过很可惜的是,现在依旧没能解决。例如说刚刚过去的 2026 年 3 月,非常难得的,在 bug 的 2025 年 5 月后拿下了第二个月均 5 分(这真的很难!),但我三大报只写完了一篇,剩下的基本没动。我的分值很大程度上就是这些突如其来的「灵感」贡献的。

下一周虽然没这一周努力,但还算是维持在一个不错的水平,并在 10.3 达到了峰值 6.0 的 7 日均值。当然,这周做的依旧是「系统优化」,下面是我周报提前规划的任务与完成情况:

2025-W40 (9.29~10.5)

  • 完成 **
    • **
    • **
    • **
  • 完成 **
  • 完成编译原理实验 ✅ 2025-10-02
  • 编译原理笔记「语法分析」理解(这个是部分完成了)
  • Anki 制卡
    • 自动化测试
    • 编译原理
    • 需求与商业模式创新
  • 自动化测试汇报 PPT 优化
    • 增强深度/广度
    • 添加引用
  • 【低优先级】系统优化
    • 看板
    • 仪表盘
    • Callout snippets ✅ 2025-09-29

可见高优先级的其他任务,还是难以得到推进。当然 ** 内容拖了很久后还是最终完成了,因此我也有理由相信,我现在正在写的年报以及还有一篇没写的私博内容,最终也会完成的。

这两周似乎又榨干了我,或许为了维持比较稳定的中等偏下均分,后面就又萎靡不振,砍下不到 2 的周均。看了那会的记录,那段时间睡眠不好,精力不佳,加上国庆假期爽摆,而后又戒断。果然长时的假期是我的敌人呐,一放假就开摆……

在戒断完一阵子后总算逐步走出来了,虽然国庆假期后一周(10.13~10.19)精力依旧很差,但还是上了周均 3 分,算是恢复了一点:

2025-W42 (10.13~10.19)

  • 刷了好多视频、咨询(资讯),水了很多群,看了很多 **,摆完了。
  • (精力)都很差,我都有点怀疑会不会其实我得过新冠,长新冠废掉了。

再下一周状态不错,周均逼近 6 分。看了一看,这周其实没有特别出彩的,精力 6/7 是中等水平,剩下一个是低精力,心情也波澜不惊,都是一般,分数非常均衡,但也就是因为这样周均不低。不过这一周其实大部分时刻没干什么非常特别的事情,就是在完成课内的学习,如作业、笔记、Anki 制卡等。但是,到唯一一个低精力和下 6 分的周五(其他天都是 6/7 分),我有如下的记录:

2025-10-24

  • 今天摆完了,下午课上坐最后一排,于是开始忆往昔,看起了私博,果真不能坐最后一排。
  • 然后最后想到又是月底了,高级请求才用了 30% 左右吧,于是 Focust 走起!
  • 现在效果真不错了,还是用 Tauri 方案,VC 了一晚上,到现在可以正常打开设置界面了,而且挺美观的,还得是 Web,同时还加了不少测试,都能通过了,感觉可以继续推进 Focust 了。但这周不能继续弄了,必须要正事搞完才能继续。

没错啊没错,Focust 来了!这周前面虽然只是按部就班的完成课内的东西,不过也确实为我后面的操作腾出来一段窗口期,让我有一段时间确实可以安心开发 Focust,不用去关注杂七杂八的事情。

至于 Focust 我这里也不想多提了,尽管这可以被我称为是我 2025 最大的成果,没有之一。具体内容可以参见博文《Focust 开发记录》

而后就是沉溺于 Focust 的开发了,下面是周报的一些记录:

2025-W44 (10.27~11.2)

  • Focust 仓库公开了,现在应该基本可用了,只是调度器需要重构,还有就是补上休息结束的判定。另外就是自动化构建与发布。今晚写不完了,明天继续吧。
  • 这周基本上一直在弄 Focust,不过 Focust 虽然占用了大量时间,但不至于算是价值不高,只是确实有点太投入了,有点荒废了课内。

周均 4.29 分

2025-W45 (11.3~11.9)

  • 不断推进了 Focust,就这个。
  • Focust 价值已经在不断下降了,随着任务不断积压。
  • 看着这周分数挺高的,但其实基本都在做 Focust,这要有所调整了。后面即便是高专注 Focust,但是评分都是基于既定其他/校内任务。

周均 5.43 分

终于我意识到不能再这样下去了,前面积攒的空挡已经挥霍一空,甚至在过分地透支了。不得不提醒自己,后面的评分不能依赖于 Focust 的开发了。于是下一周:

2025-W46 (11.10~11.16)

  • 还在 Focust,还在 Focust。
  • Focust,以及水群、刷视频等。

周均 3.86 分

虽然依旧在弄 Focust,但评分已经有了显著的下降。再然后总算稍微脱离了 Focust,干了点别的事情,虽然说伴随着摆烂的阵痛:

2025-W47 (11.17~11.23)

  • 又烂完了,10.24(即 Focust 重拾的时间)过后正好差不多一个月,又是沉浸其中。不过好在稍微恢复了一点,也没之前那么投入了,但坏消息,又给其他摆烂事项占据了。
  • 不过自动化测试演讲终于搞好了,算是解除了一个心腹大患。
  • 然后还完成了编译原理实验。
  • 还去献血了。

不过周末太摆了,靠着两天各 1 分,落入了一个小小低谷:

2025-W47 (11.17~11.23)

  • 还行,主要是水群、刷帖等真的太摆了,花了太多时间。周末两天毛都没干,两天各拿 1 分,服了服了。
  • 结果就是周四的时候均分还有 4.5,还可以,然后周五 4,周六 3.5,最后 3.14,呵呵。

再下一周,遇到了突发情况,即 Sha1-Hulud 2.0,于是再多做了点事情,评分不错。

2025-W48 (11.24~11.30)

  • 完成了自动化测试实验与编译原理实验作业。
  • Focust 遇到了 Sha1-Hulud 2.0,从而实现了 star 暴增,并以此后面写了记事、博文与数据统计分析等。
  • 继续推进了点 Focust。
  • 稍微尝试了解了一点 Jujutsu。

但是这一周甚至比上周还逆天,这次周末直接双蛋:

2025-W48 (11.24~11.30)

  • 早上赖床。不过这个已经通过强制每日关机重启解决了。
  • Anki、**、** 始终未推进。
  • 周末太摆了,毛事情没做。
  • 周内非常勤勉,结果后面放假直接废了,两个零分,无语了。
  • 结果还一直延续到了下周五最后十几分钟才开始写这个,烂完了……

然后直接坠落,后面就是十二月恐怖的深渊了。明明在学校,但跟放了大长假似的,摆得没有人样了。例如说如上面 W48 的周报所写,是在下一周的周五最后十几分钟才写的。

稍微看了一下,其实十二月第一周(12.1~12.7)也不算完全无所事事,不像周报利说的那样虚无,只不过确实是在随机行事,但又不算什么大事。例如说其实看了点有意思的知识视频、学了点小玩意、甚至我 .zshrc 也是那段时间优化的。只不过在我的评分体系中,这些碎末只能算是不务「正业」——确实,毕竟放着日程安排的规规矩矩的任务一点不去动——因此也拿不了多少分。

下一周也类似,虽然我在周报中写「(做的事情)零,真的是零。」,以及「摆完了,真的摆完了,一直刷消息、水群什么的,什么都没做。」,但确实还是有一些突然蹦出来的灵机一动。当然,正事自然是一点没动。

虽然说这种状态其实也并不好,就如我周报中展现的精神状态一样,我没法控制我的意识,这让我无比消沉,但其实还是比长假期间那种真空无一物的僵尸状态还是好上一点了。

终于在摆了这么久后,十二月也过去了一半,终于恢复了:

2025-W51 (12.15~12.21)

  • 完成了心智论文。
  • 恢复了 Anki。
  • 然后还完成了编译原理的制卡与自动化测试的重制。
  • 完成了 ** 并开始了 **。
  • 做了点志愿。
  • 需求大作业、** 还是一直卡着没做,而下周还有一个 ** 要开始规划与动笔了。
  • 前几天还好,到周末又是开始水群、刷推之类的社媒了。

周均 5.43 分

但是周末依旧是一生之敌,一直都是周内好好的,周末一下次垮了。

2025 最后这段时间,因为期末准备与复习也有所好转了,周均都上 4,甚至 5 了。

异常点与数据细节

上面其实也提及过一些「异常点」,这些异常点可以让我有机会再一窥当时发生了些什么。对应的查找 Dataview 或 DataviewJS 一并保留,明年可以复用。不过写到后面发现,也未必就只分析异常点了,也有一些具体的数据细节。

高状态但低评分

1
2
3
4
5
6
7
TABLE file.link AS 日期, mood AS 情绪, energy AS 精力, day_rating AS 评分
FROM #daily
WHERE contains(list("😄", "😊"), mood)
  AND contains(list("🔋", ""), energy)
  AND day_rating <= 4
  AND file.day.year = 2025
SORT day_rating ASC

其实 4 分不算啥低评分了,算是中分,只不过符合的数据点只有两个,不仅相邻(8.29, 9.2),而且同时是心情不错 + 中等精力。

不过我翻阅了一下这两天当天的记录,实际上并没啥有意思的内容就是了。

低状态但高评分

1
2
3
4
5
6
7
TABLE file.link AS 日期, mood AS 情绪, energy AS 精力, day_rating AS 评分
FROM #daily
WHERE contains(list("😕", "😞"), mood)
  AND energy = "🪫"
  AND day_rating >= 7
  AND file.day.year = 2025
SORT day_rating DESC

反过来还有低状态但高评分的日子。这样的日子只有一天,5.19,心情偏差,精力低迷,但是有 7 分。

5.19 为何心情偏差其实我还是有印象的,更有印象的是在此之前心情不错,更好,再到 19 号那天变差。在私博里形容了一下那几天的经过:风起云涌、云开见日、春和景明、霞光万道、暮涛千里。5.19 就到了「暮涛千里」那一天。

然后那天能量比较低倒是因为有点病怏怏的,但在早上搞了作业任务,所以分数还可以。

如果放宽一下条件,可以有更多的天数:

1
2
3
4
5
6
TABLE file.link AS 日期, mood AS 情绪, energy AS 精力, day_rating AS 评分
FROM #daily
WHERE (contains(list("😕", "😞"), mood) OR energy = "🪫")
  AND day_rating >= 7
  AND file.day.year = 2025
SORT day_rating DESC

差心情和低精力只需要满足一项即可,这样一来就有 9 项匹配了。不过我

唯一一个 8 分(其他都是 7 分)是 6.3,那天出了挺多事情,心情很差。主要是一个大事,不过这里不能说。还有的例如说网上看到不好的内容啦就不必多谈了,另外一个倒是医保的事情。我大约是在记事中提过,就是「割脉」那次事件的后续,因为我当时手忙脚乱用身份证「自费」了,用的不是医保,于是无法保险报销。当然因为干的事情不少,分数还是不低。

另外还有一个也是最差一档心情的,同样也是中等精力,不过这个是 7 分。这倒是因为校内的事情(成绩相关)而消极。那天写「好累,心累,真小丑了,今天心情在中午已经可以提前定为最低一档了。」「(干了 XX)挺开心的,但难掩今日之失败挫折。」。

相同情绪+心情组合评分极度偏离

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
const pages = dv.pages("#daily")
  .where(p => p.file.day.year === 2025)
  .sort(p => p.file.day, 'asc');

let groups = {};
for (let p of pages) {
  const key = `${p.mood}|${p.energy}`;
  if (!groups[key]) groups[key] = [];
  groups[key].push(Number(p.day_rating));
}

let groupAvg = {};
for (let key in groups) {
  const arr = groups[key];
  groupAvg[key] = arr.reduce((a, b) => a + b, 0) / arr.length;
}

let rows = [];
for (let p of pages) {
  const key = `${p.mood}|${p.energy}`;
  const rating = Number(p.day_rating);
  const avg = groupAvg[key];
  const diff = rating - avg;
  if (Math.abs(diff) >= 3) {
    rows.push([
      p.file.link,
      p.mood,
      p.energy,
      rating,
      avg.toFixed(2),
      diff.toFixed(2)
    ]);
  }
}

rows.sort((a, b) => Math.abs(Number(b[5])) - Math.abs(Number(a[5])));
dv.table(["日期", "情绪", "精力", "评分", "该组合平均分", "偏差"], rows);

按情绪与精力进行分组并计算平均分,然后看看,哪些天严重偏离了这些均分。实际上因为评分与精力与情绪没有那么相关,偏差是肯定有且不少的。例如说如果按 2 分的偏差来看足有 47 天,差不多是 20% 的比例算是偏差较大了。

不过如果换成 3,就只有 12 天了,比例为 5%,算是一个比较正常的比例。

而其中的第一则是上面提过的 5.19,较差的心情 + 低精力,根据我的经验,这一般是摆了一天并在最后懊恼不已,于是心情也偏差,这样的组合均分是 1.63 分。但是这一天最后有 7 分,偏差了足足 5.37。

还有一个上了 5 分的是 12.10。这一天是一般心情 + 中等精力,这一般来说就是中规中矩完成了不少任务的模式,均分有高达 6.14,但这一天只有 1 分,偏差了 -5.14 分。这一天干了什么呢?用当天的一些记录来回答吧:

2025-12-10

  • Keycho 了半个下午与整个晚上,回来后又优化了下 Focust 模块导入规范,因此今天精力不算差,但还是摆完了。
  • Keycho,与摆烂,水水水。
  • 无。又是看各种新闻,又是水水水,又是 Keycho。
  • Keycho 进展喜人?但我不能再弄了!!!

哈哈,就是 Focust 后状况实例,任你专注搞了很多内容,没干应该干的,就应该是低分。那天就是专注搞了点 Keycho 原型(实际上这个原型已经沉寂大半年没动了,在我写这句话的当下,早已确定要放弃这个原型了),Vibe Coding 与摆烂并存。

就这两个算是比较显著了,再往后就只偏差了 4.17 分,而且也很多,不值得细谈了。

评分跳变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const pages = dv.pages("#daily")
  .where(p => p.file.day.year === 2025)
  .sort(p => p.file.day, 'asc');

let rows = [];
let posJumps = 0;
let negJumps = 0;
for (let i = 1; i < pages.length; i++) {
  const prev = pages[i - 1];
  const curr = pages[i];
  const prevRating = Number(prev.day_rating);
  const currRating = Number(curr.day_rating);
  const delta = currRating - prevRating;

  if (Math.abs(delta) >= 5) {
    if (delta > 0) posJumps++;
    else negJumps++;
    rows.push([
      curr.file.link,
      prev.file.link,
      prevRating,
      currRating,
      delta > 0 ? `+${delta}` : `${delta}`,
      curr.mood,
      curr.energy
    ]);
  }
}

rows.sort((a, b) => Math.abs(b[4]) - Math.abs(a[4]));
dv.paragraph(`正向跳变:${posJumps};负向跳变:${negJumps}`)
dv.table(["当天", "前一天", "前日评分", "当日评分", "变化", "情绪", "精力"], rows);

评分跳变 5\ge 5 有 28 天(13+15),6\ge 6 有 17 天(10+7),=7=7 有 8 天(4+4),都属于剧烈变化的,基本上算是直接从低分到高分或是反过来。可以看出来正向跳变和负向跳变数目大致是一致的,说明反思和溃退的比例大致差不多。

大概列一下跳变 7 分的 8 天都出了什么事情:

  • 6.3 (181 \to 8):这一天就是从摆烂到勤奋,没什么特别的,唯一比较特别的是 6.3 这天在上面也提到了。
  • 6.18 (707 \to 0):期末最后一天四点半起来复习,弄到八点半;然后考完期末回家,6.18 五点半才到,然后从早上八点睡到下午两点,剩下时间疲惫开摆。
  • 6.20 (070 \to 7):软工项目答辩前一天,于是从纯摆迅速转为 DDL 迫近形态。
  • 6.22 (707 \to 0):软工项目汇报,我一人之力完成了四个组的答辩,完成后开摆了一天。
  • 6.26 (070 \to 7):又是 DDL,于是短暂复活一下。
  • 6.28 (707 \to 0):依旧是同一个 DDL,终于弄完了,然后进入彻彻底底的摆烂。
  • 8.20 (707 \to 0):重构了一下库,干了不少事情。次日开摆,也没啥特别的。
  • 9.6 (181 \to 8):下午去搜了很多东西,然后开摆;次日完成 DP 博文

可以看到 6 月挺搞笑的,6.17-6.22 和 6.25-6.28 这十天就是来回 0,70, 7 跳变,遇到 DDL 就稍微被刺激一下,然后完事了就开摆。同时也是很有节律的,每两次跳变就各一次正向和负向,看来我也是摆久了有点愧疚稍微勤奋一下,勤奋一下后又紧接着泄气再回到沟里。

情绪/精力变化不大但评分剧变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const moodMap = {"😄": 5, "😊": 4, "😐": 3, "😕": 2, "😞": 1};
const energyMap = {"🔋": 3, "": 2, "🪫": 1};

const pages = dv.pages("#daily")
  .where(p => p.file.day.year === 2025)
  .sort(p => p.file.day, 'asc');

let rows = [];
for (let i = 1; i < pages.length; i++) {
  const prev = pages[i - 1];
  const curr = pages[i];

  const moodDelta = Math.abs((moodMap[curr.mood] ?? 0) - (moodMap[prev.mood] ?? 0));
  const energyDelta = Math.abs((energyMap[curr.energy] ?? 0) - (energyMap[prev.energy] ?? 0));
  const ratingDelta = Number(curr.day_rating) - Number(prev.day_rating);

  if (moodDelta <= 0 && energyDelta <= 0 && Math.abs(ratingDelta) >= 5) {
    rows.push([
      curr.file.link,
      prev.file.link,
      prev.mood,
      curr.mood,
      prev.energy,
      curr.energy,
      prev.day_rating,
      curr.day_rating,
      ratingDelta > 0 ? `+${ratingDelta}` : `${ratingDelta}`
    ]);
  }
}

rows.sort((a, b) => Math.abs(b[8]) - Math.abs(a[8]));
dv.table(["当天", "前一天", "前情绪", "当情绪", "前精力", "当精力", "前评分", "当评分", "评分变化"], rows);

原本的两个阈值都是 1,但其实我觉得没必要,我这个情绪、精力范围挺小的,不如直接看完全相等的情况。当然为了保证扩展性就没改了。

这样的日子一共有 3 天,情绪均是一般,精力也全是低迷:

  • 8.20 (707 \to 0):上面提过了。
  • 9.13 (505 \to 0):做 Rustlings,还有一些作业,精力低应该是认为还是太拖延,有时候也太摆了。次日开摆,不过可能是因为看了有意思的视频等,心情倒也没因此低落。
  • 9.14 (060 \to 6):跟上面连着的,精力低是因为晚上七点才开始写作业,但看样子还是写了不少。

连续

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const pages = dv.pages("#daily")
  .where(p => p.file.day.year === 2025)
  .sort(p => p.file.day, 'asc');

const streakThreshold = 5;
let streaks = [];
let current = [];

for (let p of pages) {
  if (Number(p.day_rating) <= 3) {
    current.push(p);
  } else {
    if (current.length >= streakThreshold) streaks.push([...current]);
    current = [];
  }
}
if (current.length >= streakThreshold) streaks.push([...current]);

let rows = streaks.map(s => [
  s[0].file.link,
  s[s.length - 1].file.link,
  s.length,
  s.map(x => Number(x.day_rating)).join(", ")
]);

dv.table(["开始", "结束", "连续天数", "评分序列"], rows);

这是连续低分的,连续低分实在是太多了,因此阈值设置为 5 天,这样的话一共有 6 个:

# 开始 结束 连续天数 评分序列
1 2025-06-28 2025-07-05 8 0, 0, 1, 0, 0, 0, 1, 3
2 2025-07-17 2025-07-27 11 1, 0, 2, 1, 1, 2, 2, 1, 1, 2, 0
3 2025-08-10 2025-08-17 8 1, 2, 2, 1, 0, 0, 0, 1
4 2025-10-04 2025-10-08 5 1, 1, 0, 1, 1
5 2025-11-29 2025-12-05 7 0, 0, 1, 2, 2, 2, 2
6 2025-12-07 2025-12-14 8 1, 1, 3, 1, 3, 3, 0, 1

第一段(6.28)根据上面可以看出来是 DDL 完成后的连续摆烂期。最终在 7.6 用 5 分结束了,这天在早上汉化了部分 Neovim Tutor,并开始尝试计划一下日程。就在第二天的 7.7,砍下了 9 分,同时 7.8 拿下了唯一一个 10 分。

好景不长,后面开始了「看票」,前面还有稍微弄点别的,例如说 7.16 还有弄点 Focust。但第二天的 7.17 就开始纯摆了。这也是靠着暑假,拿下了最长的摆烂周期,持续了 11 天。至于说最后的 7.28 其实也没干啥,我也就是将之前欠着的周报补了,然后稍微读了点内容,靠 4 分摆脱了深渊。不过其实好景不长就是了,7.29 又陷进去了,只不过只有 4 天又靠一个 4 分缓了口气。

接下来「看票」结束,然而我还是漫无目的,继续开摆。终于希望这一切在周内结束,于是在 8.18 的周一新气象用 5 分结束了。这一天主要其实也就补了点周报,此外还干了点别的,只不过没弄完。

十月这部分就没啥可说的了,国庆周期。

十一月底到二月初的这个,说来也挺搞笑,跟下一个居然只差一个 12.6,这一天是 4 分,只差 1 分就可以将这两块连接在一起,创造一个 16 天,足足过半月的摆烂长考。而即便是 12.6 这天也不是因为我醒悟了,而是有突发任务必须要立刻完成,这才稍微有了点分数。不过也可以注意到,12.14 也是周日,我确实是靠一周的结束尝试着「洗刷」掉长期摆烂的状态,但这其实也意味着在最后一周有可能是被迫一同牺牲掉了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const pages = dv.pages("#daily")
  .where(p => p.file.day.year === 2025)
  .sort(p => p.file.day, 'asc');

const streakThreshold = 7;
let streaks = [];
let current = [];

for (let p of pages) {
  if (p.energy === "🪫") {
    current.push(p);
  } else {
    if (current.length >= streakThreshold) streaks.push([...current]);
    current = [];
  }
}
if (current.length >= streakThreshold) streaks.push([...current]);

let rows = streaks.map(s => [
  s[0].file.link,
  s[s.length - 1].file.link,
  s.length,
  s.map(x => x.mood).join(""),
  s.map(x => x.day_rating).join(", ")
]);

dv.table(["开始", "结束", "连续低精力天数", "情绪序列", "评分序列"], rows);

连续低精力这个就更多了,有 11 段,我得提升一下阈值到 7 天才能数量限制在 7 个。

# 开始 结束 连续低精力天数 情绪序列 评分序列
1 2025-06-28 2025-07-05 8 😞 → 😕 → 😞 → 😕 → 😕 → 😕 → 😊 → 😐 0, 0, 1, 0, 0, 0, 1, 3
2 2025-07-15 2025-07-27 13 😕 → 😊 → 😐 → 😕 → 😕 → 😐 → 😊 → 😐 → 😐 → 😐 → 😕 → 😐 → 😐 4, 4, 1, 0, 2, 1, 1, 2, 2, 1, 1, 2, 0
3 2025-07-29 2025-08-04 7 😞 → 😕 → 😐 → 😕 → 😊 → 😄 → 😊 3, 0, 0, 1, 4, 1, 0
4 2025-08-08 2025-08-17 10 😐 → 😕 → 😕 → 😐 → 😕 → 😕 → 😕 → 😕 → 😕 → 😕 3, 4, 1, 2, 2, 1, 0, 0, 0, 1
5 2025-09-10 2025-09-21 12 😐 → 😕 → 😐 → 😐 → 😐 → 😐 → 😊 → 😐 → 😐 → 😊 → 😕 → 😐 4, 4, 5, 0, 6, 4, 3, 5, 3, 5, 1, 4
6 2025-10-04 2025-10-19 16 😞 → 😕 → 😞 → 😐 → 😐 → 😐 → 😐 → 😐 → 😕 → 😐 → 😐 → 😐 → 😐 → 😐 → 😕 → 😞 1, 1, 0, 1, 1, 5, 2, 3, 1, 7, 3, 5, 3, 3, 0, 2
7 2025-11-29 2025-12-09 11 😐 → 😕 → 😕 → 😐 → 😐 → 😕 → 😕 → 😕 → 😕 → 😊 → 😕 0, 0, 1, 2, 2, 2, 2, 4, 1, 1, 3

这里的低精力就一共有 77 天了,总共也就 148 天吧,都过半了。

可以看到大体上是跟上面一段重合的:第一段完美匹配;第二段低精力则是从 7.15 就开始了;第四段匹配上一个的第三段,并提前两天;第六段完全覆盖了上一个的第四段并往后扩展了 11 天;第七段覆盖了上一个最后两段的一部分。

有一些差异,如多了 7.29-8.4 这一段,主要靠 8.2 这一天的 4 分断掉了等。以及有一些分数还可以,但依旧是低精力,主要是我觉得还是太摆了,只不过有的任务比较简单、琐碎,看着做了不少,于是分也还可以。但按我现在的标准兴许不会给低精力。

连续低情绪相对就没那么多了,阈值为 3 的话共有 8 段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const pages = dv.pages("#daily")
  .where(p => p.file.day.year === 2025)
  .sort(p => p.file.day, 'asc');

const streakThreshold = 3;
let streaks = [];
let current = [];

for (let p of pages) {
  if (["😕", "😞"].includes(p.mood)) {
    current.push(p);
  } else {
    if (current.length >= streakThreshold) streaks.push([...current]);
    current = [];
  }
}
if (current.length >= streakThreshold) streaks.push([...current]);

let rows = streaks.map(s => [
  s[0].file.link,
  s[s.length - 1].file.link,
  s.length,
  s.map(x => x.energy).join(""),
  s.map(x => x.day_rating).join(", ")
]);

dv.table(["开始", "结束", "连续低情绪天数", "精力序列", "评分序列"], rows);
# 开始 结束 连续低情绪天数 精力序列 评分序列
1 2025-05-19 2025-05-21 3 🪫 → ⚡ → ⚡ 7, 5, 5
2 2025-06-01 2025-06-03 3 🪫 → 🪫 → ⚡ 1, 1, 8
3 2025-06-11 2025-06-13 3 🪫 → 🪫 → 🪫 5, 3, 0
4 2025-06-28 2025-07-03 6 🪫 → 🪫 → 🪫 → 🪫 → 🪫 → 🪫 0, 0, 1, 0, 0, 0
5 2025-08-12 2025-08-17 6 🪫 → 🪫 → 🪫 → 🪫 → 🪫 → 🪫 2, 1, 0, 0, 0, 1
6 2025-10-04 2025-10-06 3 🪫 → 🪫 → 🪫 1, 1, 0
7 2025-12-04 2025-12-07 4 🪫 → 🪫 → 🪫 → 🪫 2, 2, 4, 1
8 2025-12-21 2025-12-24 4 ⚡ → 🪫 → ⚡ → ⚡ 4, 2, 6, 6

有一些就单纯是因为长期摆烂,因此心情也长期不好了,例如第 4、5、6、7 段就是这样;还有就是比较糟糕事件的长期延续,如第 1、8 段,8 段是那会似乎有点生病了,状态不佳;可能是摆烂加遇到坏事,如第 2、3 段,这种一般也持续不长。

看完低的再来看看高的,这个相对就比较少了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const pages = dv.pages("#daily")
  .where(p => p.file.day.year === 2025)
  .sort(p => p.file.day, 'asc');

const streakThreshold = 3;
let streaks = [];
let current = [];

for (let p of pages) {
  if (Number(p.day_rating) >= 7) {
    current.push(p);
  } else {
    if (current.length >= streakThreshold) streaks.push([...current]);
    current = [];
  }
}
if (current.length >= streakThreshold) streaks.push([...current]);

let rows = streaks.map(s => [
  s[0].file.link,
  s[s.length - 1].file.link,
  s.length,
  s.map(x => Number(x.day_rating)).join(", ")
]);

dv.table(["开始", "结束", "连续天数", "评分序列"], rows);
# 开始 结束 连续天数 评分序列
1 2025-05-24 2025-05-28 5 8, 8, 7, 9, 7
2 2025-06-03 2025-06-06 4 8, 7, 7, 7
3 2025-07-07 2025-07-10 4 9, 10, 9, 7
4 2025-12-16 2025-12-18 3 8, 8, 7

连续高分真不容易。大致都提过了,我也懒得再具体看了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const pages = dv.pages("#daily")
  .where(p => p.file.day.year === 2025)
  .sort(p => p.file.day, 'asc');

const streakThreshold = 5;
let streaks = [];
let current = [];

for (let p of pages) {
  if (["", "🔋"].includes(p.energy)) {
    current.push(p);
  } else {
    if (current.length >= streakThreshold) streaks.push([...current]);
    current = [];
  }
}
if (current.length >= streakThreshold) streaks.push([...current]);

let rows = streaks.map(s => [
  s[0].file.link,
  s[s.length - 1].file.link,
  s.length,
  s.map(x => x.mood).join(""),
  s.map(x => x.day_rating).join(", ")
]);

dv.table(["开始", "结束", "连续高精力天数", "情绪序列", "评分序列"], rows);
# -开始 结束 连续高精力天数 情绪序列 评分序列
1 2025-05-20 2025-05-28 9 😕 → 😞 → 😐 → 😐 → 😐 → 😐 → 😐 → 😐 → 😐 5, 5, 6, 5, 8, 8, 7, 9, 7
2 2025-07-06 2025-07-14 9 😐 → 😊 → 😊 → 😊 → 😐 → 😐 → 😕 → 😊 → 😕 5, 9, 10, 9, 7, 5, 4, 5, 6
3 2025-10-25 2025-10-30 6 😐 → 😐 → 😐 → 😊 → 😊 → 😊 6, 7, 5, 7, 6, 5
4 2025-11-03 2025-11-08 6 😐 → 😐 → 😐 → 😐 → 😐 → 😐 7, 7, 5, 6, 4, 6

这个阈值设置为 5,因为同时囊括了中等精力。如果仅限高精力,即便阈值放到 2 也就两段(除了 7 月那段外的是 12.16-12.17,这个算上中精力也只持续了 3 天)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const pages = dv.pages("#daily")
  .where(p => p.file.day.year === 2025)
  .sort(p => p.file.day, 'asc');

const streakThreshold = 3;
let streaks = [];
let current = [];

for (let p of pages) {
  if (["😊", "😄"].includes(p.mood)) {
    current.push(p);
  } else {
    if (current.length >= streakThreshold) streaks.push([...current]);
    current = [];
  }
}
if (current.length >= streakThreshold) streaks.push([...current]);

let rows = streaks.map(s => [
  s[0].file.link,
  s[s.length - 1].file.link,
  s.length,
  s.map(x => x.energy).join(""),
  s.map(x => x.day_rating).join(", ")
]);

dv.table(["开始", "结束", "连续高情绪天数", "精力序列", "评分序列"], rows);
# 开始 结束 连续高情绪天数 精力序列 评分序列
1 2025-05-16 2025-05-18 3 🪫 → ⚡ → 🪫 4, 6, 1
2 2025-07-07 2025-07-09 3 🔋 → 🔋 → 🔋 9, 10, 9
3 2025-08-02 2025-08-04 3 🪫 → 🪫 → 🪫 4, 1, 0
4 2025-09-01 2025-09-03 3 ⚡ → ⚡ → 🪫 8, 4, 3
5 2025-10-28 2025-10-30 3 ⚡ → ⚡ → ⚡ 7, 6, 5

连续的好心情就没这么多了。对比可以看出来,高精力跟高分更强关联,而高情绪也可以是纯外部驱动的积极因素。譬如说第一段我上面就说过,第 3 段则是「看票」的趣事。

线性拟合

从上面的数据可以初步推断,精力对分数的影响相较情绪更大,但也有高精力投入做其他事情导致低分的情况。能否尝试拟合,看看具体的系数是什么样子的呢?

将情绪和精力映射到 {2,1,0,1,2}\left\lbrace -2, -1, 0, 1, 2 \right\rbrace{1,0,1}\left\lbrace -1, 0, 1 \right\rbrace 后可以进行线性回归:

拟合代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
const moodMap = {"😄": 2, "😊": 1, "😐": 0, "😕": -1, "😞": -2};
const energyMap = {"🔋": 1, "": 0, "🪫": -1};

const pages = dv.pages("#daily")
  .where(p => p.file.day.year === 2025);

const data = pages.map(p => ({
  link: p.file.link,
  date: p.file.day,
  mood: p.mood,
  energy: p.energy,
  x1: moodMap[p.mood],
  x2: energyMap[p.energy],
  y: Number(p.day_rating)
})).array();

// 解 3x3 线性方程组:A * beta = B
function solve3x3(A, B) {
  let M = [
    [A[0][0], A[0][1], A[0][2], B[0]],
    [A[1][0], A[1][1], A[1][2], B[1]],
    [A[2][0], A[2][1], A[2][2], B[2]],
  ];

  for (let i = 0; i < 3; i++) {
    // 找主元
    let maxRow = i;
    for (let k = i + 1; k < 3; k++) {
      if (Math.abs(M[k][i]) > Math.abs(M[maxRow][i])) maxRow = k;
    }
    [M[i], M[maxRow]] = [M[maxRow], M[i]];

    let pivot = M[i][i];
    if (Math.abs(pivot) < 1e-12) return null;

    // 归一化
    for (let j = i; j < 4; j++) M[i][j] /= pivot;

    // 消元
    for (let k = 0; k < 3; k++) {
      if (k === i) continue;
      let factor = M[k][i];
      for (let j = i; j < 4; j++) {
        M[k][j] -= factor * M[i][j];
      }
    }
  }

  return [M[0][3], M[1][3], M[2][3]];
}

// 构造正规方程
let n = data.length;
let sumX1 = 0, sumX2 = 0, sumY = 0;
let sumX1X1 = 0, sumX2X2 = 0, sumX1X2 = 0;
let sumX1Y = 0, sumX2Y = 0;

for (let d of data) {
  sumX1 += d.x1;
  sumX2 += d.x2;
  sumY += d.y;
  sumX1X1 += d.x1 * d.x1;
  sumX2X2 += d.x2 * d.x2;
  sumX1X2 += d.x1 * d.x2;
  sumX1Y += d.x1 * d.y;
  sumX2Y += d.x2 * d.y;
}

const A = [
  [sumX1X1, sumX1X2, sumX1],
  [sumX1X2, sumX2X2, sumX2],
  [sumX1,   sumX2,   n]
];
const B = [sumX1Y, sumX2Y, sumY];

const beta = solve3x3(A, B);

if (!beta) {
  dv.paragraph("回归失败:矩阵不可逆,可能是数据变化太少。");
}

const [a, b, c] = beta;

// 评估
let rows = [];
let absErrSum = 0;
let sqErrSum = 0;
let meanY = sumY / n;
let ssTot = 0;
let ssRes = 0;

for (let d of data) {
  const pred = a * d.x1 + b * d.x2 + c;
  const err = d.y - pred;
  absErrSum += Math.abs(err);
  sqErrSum += err * err;
  ssRes += err * err;
  ssTot += (d.y - meanY) ** 2;

  rows.push([
    d.link,
    d.mood,
    d.energy,
    d.y.toFixed(2),
    pred.toFixed(2),
    err.toFixed(2)
  ]);
}

rows.sort((r1, r2) => Math.abs(Number(r2[5])) - Math.abs(Number(r1[5])));

const mae = absErrSum / n;
const rmse = Math.sqrt(sqErrSum / n);
const r2 = ssTot === 0 ? 1 : 1 - ssRes / ssTot;

dv.header(3, "线性回归结果");
dv.paragraph(`拟合公式:rating = ${a.toFixed(4)} × mood + ${b.toFixed(4)} × energy + ${c.toFixed(4)}`);
dv.paragraph(`MAE = ${mae.toFixed(4)},RMSE = ${rmse.toFixed(4)},R² = ${r2.toFixed(4)}`);

dv.table(["日期", "情绪", "精力", "实际评分", "预测评分", "残差"], rows);

得出来的结果是:

rating=3.2643×energy+0.3602×mood+5.7251\mathrm{rating} = 3.2643 \times \mathrm{energy} + 0.3602 \times \mathrm{mood} + 5.7251

印证了结果,二者大体上都是正相关的,即高精力与高评分正相关,好心情与高评分正相关。但同时,心情对评分的影响相当小,而精力影响非常显著。这跟上面观察到的结论相互印证了。这个线性拟合平均绝对误差(MAE)为 1.3705,均方根误差(RMSE)为 1.6684,决定系数(R2R^2)为 0.5981,

从拟合看来,一般的情形,即中等精力,中等心情,基准分数是 5.7,是一个相当高的分值了。同时代入可以探到,最低的预测分值是 1.7404,最高的预测分是 9.7099。也就是说它居然上探可以探到近 10 分,但下探却只能在 2 分附近。

根据上面的情绪与精力的关联矩阵,可以计算出预测评分矩阵:

情绪\精力 低迷 正常 充沛
很差 1.74 5.00 8.27
较差 2.10 5.36 8.63
一般 2.46 5.73 8.99
不错 2.82 6.09 9.35
很好 3.18 6.45 9.71

最常见的组合一般 + 低迷,会得到 2.46 分。

情绪均值约为 0.251-0.251,精力均值约为 0.293-0.293,代入后的平均预测分数是 4.684.68,跟真实值 3.83.8 还是差得有点远了。

下面则是真实的均分矩阵:

情绪\精力 低迷 正常 充沛 均值
很差 1.69 (13)
[-0.05]
5.60 (5)
[+0.60]
- (0)
[*]
2.78 (18)
较差 1.63 (51)
[-0.47]
5.55 (11)
[+0.19]
- (0)
[*]
2.33 (62)
一般 2.83 (66)
[+0.37]
6.14 (50)
[+0.41]
7.63 (8)
[-1.36]
4.47 (124)
不错 2.19 (16)
[-0.63]
6.09 (11)
[0]
9.00 (5)
[-0.35]
4.59 (32)
很好 2.00 (2)
[-1.18]
6.00 (1)
[-0.45]
- (0)
[*]
3.33 (3)
均值 2.24 (148) 6.01 (78) 8.16 (13) 3.79 (239)

也许还可以通过这个模型计算出更多细节,但我也懒得算了。

此外还有一个带交互项的回归,计算出来是:

rating=3.2689×enery+0.1866×mood0.2645×energy×mood+5.7527\mathrm{rating} = 3.2689 \times \mathrm{enery} + 0.1866 \times \mathrm{mood} - 0.2645 \times \mathrm{energy} \times \mathrm{mood} + 5.7527

拟合代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
const moodMap = {"😄": 2, "😊": 1, "😐": 0, "😕": -1, "😞": -2};
const energyMap = {"🔋": 1, "": 0, "🪫": -1};

const pages = dv.pages("#daily")
  .where(p => p.file.day.year === 2025);

const data = pages.map(p => {
  const x1 = moodMap[p.mood];
  const x2 = energyMap[p.energy];
  return {
    link: p.file.link,
    mood: p.mood,
    energy: p.energy,
    x1,
    x2,
    x3: x1 * x2,
    y: Number(p.day_rating)
  };
}).array();

function solveMatrix(mat) {
  const n = mat.length;

  for (let i = 0; i < n; i++) {
    let maxRow = i;
    for (let k = i + 1; k < n; k++) {
      if (Math.abs(mat[k][i]) > Math.abs(mat[maxRow][i])) maxRow = k;
    }
    [mat[i], mat[maxRow]] = [mat[maxRow], mat[i]];

    if (Math.abs(mat[i][i]) < 1e-12) return null;

    let pivot = mat[i][i];
    for (let j = i; j <= n; j++) mat[i][j] /= pivot;

    for (let k = 0; k < n; k++) {
      if (k === i) continue;
      let factor = mat[k][i];
      for (let j = i; j <= n; j++) {
        mat[k][j] -= factor * mat[i][j];
      }
    }
  }

  return mat.map(row => row[n]);
}

// 构造 X'X 和 X'Y
const features = ["x1", "x2", "x3", "const"];
const m = features.length;

let XtX = Array.from({length: m}, () => Array(m).fill(0));
let XtY = Array(m).fill(0);

for (let d of data) {
  const x = [d.x1, d.x2, d.x3, 1];
  for (let i = 0; i < m; i++) {
    XtY[i] += x[i] * d.y;
    for (let j = 0; j < m; j++) {
      XtX[i][j] += x[i] * x[j];
    }
  }
}

let aug = XtX.map((row, i) => [...row, XtY[i]]);
const beta = solveMatrix(aug);

if (!beta) {
  dv.paragraph("拟合失败:矩阵不可逆。");
}

const [a, b, c, d0] = beta;

let rows = [];
let absErrSum = 0;
let sqErrSum = 0;

for (let item of data) {
  const pred = a * item.x1 + b * item.x2 + c * item.x3 + d0;
  const err = item.y - pred;
  absErrSum += Math.abs(err);
  sqErrSum += err * err;

  rows.push([
    item.link,
    item.mood,
    item.energy,
    item.y.toFixed(2),
    pred.toFixed(2),
    err.toFixed(2)
  ]);
}

rows.sort((r1, r2) => Math.abs(Number(r2[5])) - Math.abs(Number(r1[5])));

dv.header(3, "带交互项回归");
dv.paragraph(`拟合公式:rating = ${a.toFixed(4)}·mood + ${b.toFixed(4)}·energy + ${c.toFixed(4)}·(mood×energy) + ${d0.toFixed(4)}`);
dv.paragraph(`MAE = ${(absErrSum / data.length).toFixed(4)},RMSE = ${Math.sqrt(sqErrSum / data.length).toFixed(4)}`);

dv.table(["日期", "情绪", "精力", "实际评分", "预测评分", "残差"], rows);

MAE 为 1.3592,RMSE 为 1.6643,差球不多。不过可以看一下情绪的边际作用,求偏导后代入不同精力值可以发现,分别是 0.4511,0.1866,0.07790.4511, 0.1866, -0.0779,这说明在低精力时,情绪对评分是明显正向的;在正常精力时,情绪仍是微弱正向;在高精力时,情绪系数变成了略微负值。这与上面的情况是吻合的。

还有组合内部波动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const pages = dv.pages("#daily")
  .where(p => p.file.day.year === 2025);

let groups = {};

for (let p of pages) {
  const key = `${p.mood}|${p.energy}`;
  if (!groups[key]) groups[key] = {mood: p.mood, energy: p.energy, vals: []};
  groups[key].vals.push(Number(p.day_rating));
}

function mean(arr) {
  return arr.reduce((a,b) => a+b, 0) / arr.length;
}
function std(arr) {
  if (arr.length <= 1) return 0;
  const m = mean(arr);
  return Math.sqrt(arr.reduce((s,x) => s + (x-m)**2, 0) / arr.length);
}

let rows = Object.values(groups).map(g => {
  const m = mean(g.vals);
  const s = std(g.vals);
  return [
    g.mood,
    g.energy,
    g.vals.length,
    m.toFixed(2),
    s.toFixed(2)
  ];
});

rows.sort((a, b) => Number(b[4]) - Number(a[4]));
dv.table(["情绪", "精力", "样本数", "平均分", "标准差"], rows);
情绪 精力 样本数 平均分 标准差
😐 🪫 66 2.83 1.89
😊 🪫 16 2.19 1.74
😞 5 5.60 1.74
😕 🪫 51 1.63 1.58
😊 11 6.09 1.50
😐 50 6.14 1.43
😞 🪫 13 1.69 1.43
😕 11 5.55 1.16
😐 🔋 8 7.63 1.11
😄 🪫 2 2.00 1.00
😊 🔋 5 9.00 0.63
😄 1 6.00 0.00

改进展望

呼,也算是告一段落了,这全新的一节自身就足以撑起一篇文了。然而我写到这其实才意识到,这些数据更多似乎还是像我个人的「自娱自乐」,其他人看了只会一头雾水,枯燥乏味,毕竟又不知道这些时段我自己亲身经历的事情。

不过这也不算是什么问题了,我写的内容第一要义就是为自己的观看考虑,不会特别去考虑也许存在的观众。我的分享欲、写作欲在完笔的时候便已得到了升华。而这个其实也像从前的按键统计一样——不是为了了解自己的使用习惯等等,而是为了在脑海中构建一个架空世界——我进行这些统计,不是为了了解我的生活并尝试进行改进(办不到),而是为了统计本身。

这个 Vibe Coding 的产物,尽管做出来后还修改过几次,但随后我就没怎么管了。实际上我上面也提过了,里面有一些毫无必要的数据、图表(例如说任务相关等),同时又有一些图表不够好使(例如说上面的矩阵我还是手抄的),抑或是缺乏一些内容。

为了避免不断完善从而让这篇回顾一再延期,我放弃了在这期间内继续改进这块仪表盘。而是选择记录下来,我在后续进行改进,并用在明年以及未来。

在这里也提一下吧,避免忘记了:

  1. 任务相关的数据全都无意义,应该删除
  2. 记录连续天数与下面的连续记录统计无意义,我会尽可能保证每天都记录,即便有空缺后面也会补回去
  3. 缺一个精力日历热力图
  4. 部分分值应保留到小数点后两位(有的地方只有一位)
  5. 综合趋势完全重复
  6. 情绪与精力趋势上下颠倒
  7. 情绪精力关联矩阵与评分转移矩阵应该像我上面手动列的表格那样具备更多的数据
  8. 时段活跃度、月度节律图表无意义
  9. 心情分布图表外可以再加一个精力分布图表
  10. 情绪与精力的组合相关数据(如均分)
  11. 日历显示的日视图更好用,现在只显示部分信息
  12. 让月/周视图更好用
  13. 月/周视图中高精力的颜色错了,现在是黄色
  14. 可以在月/周视图中查看跳转日记录
  15. 可以有年/月/周随时间变化的均分变化
  16. 显示异常数据(这个其实未必要用,上面的 Dataview 足以)

变——回顾

虽然 2026 都已经过去一个季度了、我对 2025 的印象已经非常稀薄了、上面已经进行了一部分回顾,但还是有必要再回看一下。

我在记事中提过,今年的关键字是「」。如果用两个字,也许常见的选择会是「改变」这一个词,但我可能更想用「大变」,因为去年之变确实巨大。至于为啥不用「剧变」呢,你懂的……

2025.12.31

虽然现在还没动笔写今年的年终总结,但我想先给今年定个调。

如果说用一个字来形容今年的话,我会选择「」。今年有太多变化了,我个人的,不管是哪方面,还是外界,也不管是哪角度。好多变化,有好的,也有坏的,可能也有我说不出滋味的。

AI 之变

首先最为显著的变化就是 AI 了,这个毋庸置疑。尽管我也一直知道 AI 变化之频繁,但我依旧在去年感受到了天翻地覆的变化。

首先自然是 DeepSeek 的爆火,我认为这标志着 LLM 正式走入了千家万户,真正让普罗大众也体验到了 AI。在此之前虽然依旧有一些 AI,但从未有像 DeepSeek 那般家喻户晓的。

而在经过 2025 这一整年后,其他的 AI 也渗透进了日常生活中。大概有豆包、千问等,这些我倒是不太了解了。

然后这一年常久陪伴我的 AI 助手,也被我称作是「顾问」,正是 Gemini,从 Gemini 2.5 Pro 到 Gemini 3 Pro。看了看时间,大概从年初二三月开始就靠着白嫖来的学生资格用上了,然后大约是八月份后暑假给撤销了,再靠着十几块钱续上了。因此顾问也算是陪着我过了整个 2025 了。

「记忆」出来的时候我并不感冒,不希望让它影响其他回答。不过在年底的时候,看到其他人搞出来什么年终总结,还是有点羡慕的,因此很晚的时候又开启了记忆。后面就不用重复输入很多信息了,确实挺不错的。当然也很诡异就是了,完全不相干的问题也会莫名其妙关联一下记忆,看到我尴尬症犯了。

不可否认的是,「顾问」对我 2025 的学习、生活等都产生了无可替代的影响。我去年的笔记基本上都是顾问做的,如果我比较重视那会手动修改优化一下,不重视的就直接就那样了。同时我也确实在生活多方面得到了顾问的帮助,非常感激。

算是靠着顾问,我现在对谷歌的好感也算是起来了一点,之前对谷歌算是比较无感的。虽然我写这个的当下,御三家中 Gemini 可能已经稍稍落后了,以及我也两个月没用 Gemini 了,但谷歌的大恩大德我铭记于心。

AI 之变还有一点就是编程,2025 的 AI Coding 可以说真的是蓬勃发展。我编程的方式也在数个月内被颠覆。同时 Vibe Coding 的概念也是在 2025 年的 2 月被首次提出,然后迅速风靡世界,成为了 AI Coding 的代名词:

Andrej Karpathy's Tweet in 2025.2.3

There's a new kind of coding I call "vibe coding", where you fully give in to the vibes, embrace exponentials, and forget that the code even exists. It's possible because the LLMs (e.g. Cursor Composer w Sonnet) are getting too good. Also I just talk to Composer with SuperWhisper so I barely even touch the keyboard. I ask for the dumbest things like "decrease the padding on the sidebar by half" because I'm too lazy to find it. I "Accept All" always, I don't read the diffs anymore. When I get error messages I just copy paste them in with no comment, usually that fixes it. The code grows beyond my usual comprehension, I'd have to really read through it for a while. Sometimes the LLMs can't fix a bug so I just work around it or ask for random changes until it goes away. It's not too bad for throwaway weekend projects, but still quite amusing. I'm building a project or webapp, but it's not really coding - I just see stuff, say stuff, run stuff, and copy paste stuff, and it mostly works.

当然,其实关于 Vibe Coding 的定义还是有很多可以细究的点,例如说不是所有的 AI Coding 都被认为是 Vibe Coding。然而我在这里并不打算细究这些区别,而是沿用最为广泛的说法,即 Vibe Coding 作为使用 AI 编程的代名词。

之前的编程我都还比较「初级」,如果是脚本类的,那就是问顾问,然后跑起来。然后修 bug 什么的,大概会在编辑器(VS Code)中用 Edit 模式指定。虽然 Agent 模式早早就出了,但我不知为何,并没怎么感兴趣。

对于大的项目,例如说暑假期间的 Focust,我也是先顾问咨询,然后跟它反复交流,设计出一个架构,然后我手动去建立一个项目结构并再逐个交流填充。这样效率可以说是非常低下了,因此 Focust 在完成了一小部分内容后也便停滞了,不知道如何继续向前。当时想着起码先做个前端出来看看样子,但不知怎么下手,想着可能还要自己读很多文档,便在反复的拖延之下搁置了。

而后就是在十月底一试 Agent 模式,顿时感到惊奇,造出来了两个技术路径截然相反的原型。随后在一阵子的投入开发后,终于完成了一个产品的雏形。自此,我编程便再也离不开 Agent 了。

也算是顺应时代了,后面我记得 VS Code Copilot 插件直接取消了 Edit 模式,只需要用 Agent 了。

也是因为 AI 的强大,我逐渐不怎么写代码了,作业基本都是 AI 一把梭。从年初的 Avsb 大部分都是自己写的代码(只有最后 Web UI 部分是用 AI),到软工二项目基本全 AI Edit + 人工审核验证一下,再到最后 Focust AI Agent 完成,这三个项目也算是见证了我 2025 的 AI Vibe Coding 变迁。

我用 AI 除了日常生活的一些咨询外,主要就是用来写代码了。不过 2025 还有一个就是谷歌的 Nano Banana 2,生图的 SOTA 模型,是真的强悍,我就拿它生过一些非常高质量的图片。

然而 AI 带来的并不仅仅只有生产力的突飞猛进。也许在过去两年我更多地只是感受到 AI 这个工具的趁手之处,就像是一只可爱、温顺的小猫咪那样,人畜无害。但就在 2025 年,它迅速成长为了一头雄狮,展现了它的獠牙,开始给我,也许还有一些同辈,带来了一些负面影响。

一些相关内容我在 2026 年初看到过几篇文章,写得很好,在此分享一下:

随着 Vibe Coding 的兴起,2025 年也涌现了不少新概念。但也如同朝代更替一般,有的盛极一时,结果后面就被其他热点所取代了。

比较典型的可能就是 MCP 与 Skills 了,前者火的时候我还琢磨着要学习了解一下,结果就因为惯有的拖延症,拖着拖着,Skills 兴起了,然后就没什么人讨论 MCP 了……

还有一个不算 2025 年的就是 OpenClaw,也就是龙虾了,火得一塌糊涂,甚至让人觉得莫名其妙。然而我对这个还是不屑一顾的,不仅仅是我目前还没能力(主要是财力)投入到个人的 Agent 当中,还有就是我对其深深的不信任。我怀疑它的能力,怀疑它的安全性,也怀疑它是否真的有用。最终的结论就是对我毫无意义,因此尽管被相关资讯轰炸,我还是提不起一点对它的兴趣。

没过多久,到我写这段的现在。似乎又偃旗息鼓了,取而代之的是一个叫什么 Hermess Agent 的玩意。不过这东西就没 OpenClaw 那样出圈,也就不温不火的状态吧,我也是毫无兴致去了解。

因此引出来第一篇短文的观点——我甘愿落后。真正有意义的东西应该经得起时间的考验,宝石经过一段时间的打磨后是更加璀璨夺目的宝石,不会失去它的价值,反而会更加绚丽。但淤泥中的石子,即便中途偶有彩虹光泽的反光,也会随着时间褪去颜色。

只要我学得够慢,就不用学,就有更好的东西可以去学。即便它确实是非常有价值的东西,我也可以不用亲自去折腾、趟路,而是可以迈在前面勇士踏出的小径上。

当然,这个的前提是,我是因为「担心被落下」或是什么焦虑的情绪而想要「被迫」地学习某项内容。若我真的对什么非常感兴趣,我真的认为它就是「未来」,那就去学吧,这个投入的精力就是有价值的。

第二篇文章则讲述了「AI 倦怠」,是我目前看到的最好的一篇讲述有关内容的文章。将很多我遇到但没能表达出来的内容,甚至一些感受到但没意识到的部分都用文字的形式记录了下来,非常不错,很推荐一读。

第一篇文章相关的就是每次新技术出来人们的狂热心态。我也会有,也有生怕被落下的焦虑情绪,即所谓的「错失恐惧症」。这其实也可以归到「AI 倦怠」之中。

除了这个以外,这篇文章还介绍了一些 AI 倦怠现象:

  • 虽然工作效率提高了,但工作量也增加了,额外的负荷更多了
  • 剥夺了「创造」这一令工程师感到自豪的劳动过程,审核代码很累
  • 非确定性
  • 不自觉地认为「下一个提示词就能更好」,即「提示词螺旋」
  • 完美主义陷阱,几乎正确比完全错误更糟糕
  • 思维萎缩
  • 比较陷阱,每个人工作流不同,相互比较并将时间精力投入到其中
  • 不可持续性,在此之前产出有所上限,会受到打字、思考、查资料等速度影响,虽然限制了产出,但也是一种保护机制。现在去除了这一层限制,唯一的限制就是认知的耐力

对我来说还有一些点可以补充一下。看着其他人并行开着很多个 agent 我自然是羡慕不已,但我目前还做不到多线程背景推进,不管是一个任务还是多个任务,我都得亲自跟进,要么就是中间可能停下来有问题或是我进一步引导过程,要么就是因为不稳定的渠道各种报错需要恢复等等。

然而推进过程无所事事,说看代码吧,它产出也很快,而且看代码真的好累(虽然弄完后还是得看),看不过来;我也尝试过会话放在副屏,我主屏干别的事情,只用盯着副屏可能的问题就行了,不用全身心关注进展,只用在适时干预即可,但也失败了,总是没法专心干主屏的事情,一塌糊涂。最终就是,Vibe Coding 的时候只能刷手机或是电脑开摆。虽然最终可能有一些产出,但也是非常空虚,压根进入不到心流状态,疲惫不堪。

此外随着 AI Coding 能力的跃进、Vibe Coding 概念的兴起,也出现了相应的负面名词——Slop,可能有人会翻译为「AI 泔水」。Slop 的影响也非常大,不管是法律上许可证的问题(例如说 chardet 利用 AI 重写并变更许可证的事情[2])、还是海量低质量「贡献」,都不得不让众人审视 AI 的代码贡献,也有很多项目设立了 AI 贡献准则,各不相同,许多甚至有相当大的争议,如 Node.js 的等等。

学习之变

上面写的大多是外部环境的变化,虽然 AI 部分有涉及我使用 AI 方式的变化。既然是个人的回顾,那还是应该侧重于我个人的一些变化。

这个子标题虽然写的是「学习之变」,但这里的「学习」却比较片面,指的只是课内的学习。主要是我课外的学习相当零散、不成体系,大多数甚至只是一次性的(这点我相当遗憾),因此没法很好的记录。

而我课内的学习,虽然说依旧是散漫无章法,但相对而言有值得说道说道的点。

我大二上学期及以前的笔记(即从微积分到数据结构与算法一共十门),我可以拍着胸口讲,都是我亲自写的。那会就是上课的时候,分个屏,一边是 Vim,另一边是预览和课件层叠在一起,然后上课的时候跟着进度记录笔记。

像是四门数学课(微积分、线性代数、离散数学、数据结构与算法)里面的公式我都是用键盘一个命令一个命令敲下来的,甚是怀念啊。而信息科学中的物理学因为我对物理相对没那么感兴趣,后面补记到一半就停滞了。

同样也有计算系统基础、计算机组织结构这样大面积抄课件的内容的课程笔记。此外还有机器学习,是我记得一门大面积抄课本作为笔记的课程,因为里面大量使用了 OCRC,不仅是文本,还有公式等等。

也有因为课上匆忙而无法进行实时转译的数据结构与算法,我只能跟着课上用英文,看着甚是吃力,也是我唯一一篇英文笔记。不过同一时期的数据科学基础倒也是英文课件,兴许是公式多过文字,我最终是看着英文课件,写着中文笔记。

这些我都有点生疏了,因为正如我上面所写那样,2025 年初顾问开始代替我制作我的笔记了。不是「辅助」,而是「代替」。

辅助的话可能一直都有,我记得在最开始、微积分或是线代记录的时候,Copilot 就会辅助我补全公式的内容了,我也很早就夸赞过它。此外像是课后复习的时候我也会就不理解的地方咨询 AI。但大头,依旧是我课上或课后亲手制作的,也许借助了复制粘贴、OCR 等工具,但确实经我之手,我对其质量有个大概的判断。

大二下学期的时候,事情就发生了改变。自此,我基本没再直接写过笔记,我的「职责」后面都是「改」笔记。

我精心雕琢并持续迭代了一个助手提示词,然后每节课就附上我的一些提示词与课件,最后它就会产出一份笔记。这份笔记也许内容不错,但格式等却不尽如意,所以我后面主要修改的点就是格式。如果是我比较看重的内容,我往往还会对照着课件,进行修补和优化。

我最新的提示词

在大三上学期的时候,系统提示词根据课程进行了分化,不过大部分内容是一样的。下面是《编译原理》课程的系统提示词:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 《编译原理》课程课件笔记转换助手

你是一个《编译原理》课程笔记转换助手,擅长将课件内容转化为高质量的学习笔记。你的目标是创建既有助于理解又便于复习的结构化笔记,平衡知识完整性与可读性。参考教材是「龙书」。

## 笔记目标与用途

- 创建便于理解和记忆的知识结构
- 提供考试复习的高效材料
- 建立可长期参考的个人知识库

## 内容处理原则

- **核心:课件只是框架的参考,而非内容的提供。应当以课件提供的知识框架为基础,选择更合适的知识传授方式制作笔记,不应照抄课件内容**
- 笔记应该是自成体系的,即不应强依赖课件、存在不看课件无法理解的情况,抑或是出现课件中的相关编号等元素。笔记应该做到只用看笔记、不看课件可以学到相同、乃至更多的知识内容
- 标记重点内容并补充相关遗漏内容
- 可在保留原意的基础上,适量添加辅助解释和背景信息,促进理解
- 可在难点添加类比或实例,帮助加深理解和记忆
- 建立知识点之间的联系,突出概念间的逻辑关系
- 避免依赖课件,若是有更好的表达可以使用,例如对于概念可以更严谨清晰的方式说明,对于内容可用更简洁清晰的方式讲解,对于例子可用更易懂生动的方式解释

## 格式与排版要求

- 使用结构化 Markdown 格式
- 缩进采用 4 个空格的样式
- 规范中英文混排格式
    - 全半角之间添加空格
    - 正确使用中英文标点符号
    - 中文引号使用「」
    - 遵循《中文排版需求》的其他规范
- 避免直接使用难用键盘直接打出的 Unicode
- 不要滥用粗体,粗体更多的是对于标注重要概念
- 可以对一些内容使用斜体(*)、下划线(<u>)等格式(重要程度粗体 > 下划线 > 斜体)
- 智能分级标题(H2-H4),标题无需序号且单独成段
- 灵活运用其他格式,避免滥用粗体、列表导致笔记格式单一
- 避免滥用列表语法(即把知识点或讲解枯燥地按列表方式列出来),这不会让结构清晰,只会让重点模糊

## 专业术语处理

- 与课程重点相关的重要新概念术语初次出现且你认为前置课程没有提及过时,在中文后附加英文原文,如:节点(node)
- 如果某个概念在用户提供的课件中是第一次出现,但是可能在前置课程中就已涉及,就不必强调与附加英文
- 术语英文不要过于频繁,会影响阅读
- 强调重点内容时,只强调中文部分,如:**路由**(route)
    - 强调部分不需要空格,例如:**路由**是…
- 对于关键术语,可添加简短解释或定义

## 高级排版功能

- 适当使用 Mermaid 语法创建流程图、思维导图等可视化内容,简化复杂概念
- 使用 admonition 语法突出重要信息,语法如下:
    ```
    !!! info 互联网
        **互联网**(Internet)是全球范围内互联的计算机网络系统。

    !!! note ""
        除了 info 外,还可以使用 note, warning, danger, tip, example, quote, memo
    ```

## 笔记风格指导

- 保持语言简洁明了,避免冗余
- 使用主动语态,增强表达的直接性
- 平衡形式多样性,避免过度使用单一格式(如列表)
- 适当添加见解或理解,但需明确标识

下面是最后一章的用户提示词(附上课件):

1
2
3
4
5
6
附件是第八章「机器无关的优化」第二部分(共两部分)课件讲义,请你将其转化为笔记。课件讲义更像是一个提纲,并没有深入全面地进行讲解说明,所以切忌拘泥于课件本身。最终目的都是让笔记清晰、易懂、生动、有组织。避免照搬课件,可以选择重新组织成更合理的语言、采用更合理的例子与解释,但是不能遗漏知识点。

下面是第一部分的笔记,用以作为内容与格式的参考:

````md
...

这其中集大成的我认为就是计算机操作系统与编译原理课程了,这两门课程的笔记算是我比较满意的。我会在刚上课的时候将课件发给顾问,然后等待一阵子得到响应,然后我便跟着老师的进度,或者章节上跟着老师,细节上我按自己的速度来,对着课件自己去看。然后再进一步优化我的笔记。例如操作系统的笔记相对好懂,我就将课件上一些图片示例补充进去,而编译原理相对晦涩,我就对具体的点刨根问底,扩充原本的内容。

其他课程,如互联网计算、数据管理基础,其实也有上面的步骤,只是相对而言没那么用心罢了。而还有一些则是制作出来后基本不管了,或者是就修修格式,如自动化测试、需求与商业模式创新,还有前面的软件工程与计算后面部分等。至于自然语言处理,是因为后面得知不用考试了,就停止了记录。

一年过去后,我该如何评价我这一年的「学习之变」呢?

我想总体上应该还是积极的,因为有操作系统、编译原理这样相对高质量的笔记,而这笔记是再往前我自己难以产出的,我确实在其帮助下学习、理解得更好了。

当然我也曾在记事中吐槽过,自己成为了格式的修正工,一些不受重视的课程,就没那么用心去记录笔记了。但我想这未免也不是一件好事,AI 笔记将我从繁重的体力劳动中解放出来了,我确实更有闲心去应付一些其他事情了。只是说来也很奇妙,我是在课业压力最大的大一、大二进行这样的高强度笔记作业,结果反倒是后面偷起了懒。

当然,这样一来,我更早以前提过的「记笔记的目的是『记』」这个理论就不再站得住脚了。只是我也确实觉得如此,毕竟我没再折腾什么 snippets 了,说明我确实是对「记笔记」这件事,脱去了兴趣。

上面虽然说主要涉及课内的学习,不过课外的也并非不能涉及。

有了顾问后,很多灵光一闪的念头可以得到解答,这很不错。但是解答都是一次性的,若是左耳进右耳出,那又跟最初有什么区别呢?

因此我尝试过挣扎,典型的代表就是在 2025 下半年产出了两篇博文,一篇是 Git 原理相关,一篇是差分隐私相关,都是我将自己心中的疑惑,与顾问进行反复的交流过后,将其中的收获记录下来的产物。

只是依旧是难以持续。首先是周期之漫长,这两篇都是原始对话过了相当长一段时间、我计划要写一个月以上,才最终动笔;再然后就是效率之低下,这两篇我都是在勤奋的时期,用了几乎一整天的时间,才最终得以产出一篇。因此在这之后,我还是没法将这个模式持续下去,结果就是到现在再无新的一篇。

生活之变

2025 似乎创下了许多第一次,例如说我自己去看了电影,去了几趟医院,坐了一次救护车等等。

我觉得 2025 一个比较重要的变化是「观念」上的改变,许多「第一次」都是我观念改变的外部体现。

最为重要的观念改变,我想就是我开始「重视自己本身」。这是什么意思呢?高中,乃至大学刚开始的我,大概更为关注「虚拟的我」,我更关心「屏幕光里的世界」。而在这一年我开始关心「现实的我」。

讲起来有点抽象,说些实际的例子吧。

首先就是「健康」,我意识到我确实得重视一下自身的健康。不管是长时间盯着屏幕、用手、低头、久坐、坐姿扭曲、等都是不好的。不是说我之前就不懂了,只是当时的态度确实是「那又怎样」,虽然说高三就受腱鞘炎之折磨了,但也没见醒悟。

也许也是受一些身体上的痛苦所影响,总之就是意识到了。也去了医院弄了点药,虽然似乎没啥成效。

当然有意识不代表就一定会采取举措了。我心里一直在讲,下课的时候不要坐在座位上看电脑或玩手机,而是出来走走、看看远处的风景也好,但大多数时刻还是钉在座位上,起身这件事不是自然而然的,是需要我刻意而为之的。很困难,很困难。

这种习惯干得比较好的情况,一般是精力不错,但又没有很旺盛。如果相当投入在一件工作中,进入了心流,那也是一刻也舍不得离开。而摆烂则更是重灾区了,也是如同僵尸一般不会停歇。

总之,算是一个好兆头吧,但进步空间显著。

写作之变

2024 年终回顾的时候写,记事写了不少东西,不过有点荒废了博文。而 2025 年记事的天数和总字数都差不多折半,写了不到五十天、十万字。但相应的,产出的博文差不多翻倍,足足有 11 篇。

虽然与 2023 还是比不了,但当时有一些杂记等,而 2025 相对质量高了不少,11 篇却有 834k,是 2023 的两倍有余,这算是 2025 比较显著的成就了。

当然其中有一个绝对的功臣就是《光影之中成长》,足足有 250k 大小,5w 字,第一巨无霸,前无古人,后也很难有来者了。而这篇最终是在 2026.3 才完工的,但因为名义上属于 2025,还是归在此处了。

下面我就大概给这 11 篇排个序吧,看看我对这些内容的满意程度如何:

  1. 12.31《光影之中成长》:毋庸置疑的第一,是我的心血之作,即便如此拖延,接力数次也从未要放弃。虽然内容杂乱无章,重看时还是遗憾少了相当一部分内容,但能将其完工,并有一个我挺满意的标题,我已无遗憾。
  2. 11.14《Focust 开发记录》:一篇开发记录,也是将我一些学到的内容记录下来了,虽然很多内容后面也有剧烈变更,但我也没什么遗憾了,相较于上一篇,因为内容相对没那么多,在心流状态下几天内写完了。
  3. 2.9《C++ 项目 Avsb 回顾与总结》:也是一篇开发记录,甚至字数其实更多,更能体现心路。不过因为相对上一篇比较早了,而且这是一篇作业项目的回顾,于是就稍微低上一点。
  4. 1.28《第二次重置 Windows——Scoop 的新篇章》:记录了很多重置相关的内容,是我后面很好的参考材料。
  5. 4.25《Anki 支持 Markdown 的模板》:圆了高三时期的梦。不过里面的内容有点过时了,我后面的变更都没有在此篇进行更新。
  6. 2.15《Neovim 初配置》:简单记录了点 Neovim 的配置,不过即便到现在也没怎么大变,因为 Neovim 始终还是没有成为一个主力。
  7. 9.6《浅谈数据库中的推理控制技术与差分隐私》:比较遗憾的是,因为拖了太长以及后面不懂了,有点蛇尾。
  8. 7.9《Git 底层探索:快照、对象、引用以及拓展内容》:这篇其实位置看起来有点低了,也是因为内容大部分是复制了,少了些自己的实践等,以及后面既冗长又少重点。
  9. 9.22《Rustlings 练习回顾》:单纯的初学者练习回顾,没什么营养。
  10. 11.28《当 GitHub Star 变成攻击信号:亲历 Sha1-Hulud 2.0 供应链攻击》:中间的排序最困难,因为开头和结尾我都立刻有了定论,这篇属于是我一写完就后悔了的。其实看一眼也知道文风相当不对劲了,因为这是一篇 AI 产出的文章,我只进行了一些修改。原本的内容亲笔记录在了记事,不过我后面感觉这个事情很有意义,于是想记录成博文,但因为已经在记事写过一遍了,懒得再写,于是就发给顾问让它写,我只进行微调。结果输出后味道太怪了,我又懒得细调,只能捏着鼻子这样上了。

也许算得上是「毁誉参半」?但不管怎么说,只要是我亲自下笔的,我还是会有点感情的,因此除了 11.28 那篇外我其实都算是正面评价。

灵感之变

2024 写「开始记录了一些灵感」,2025 启动了「新的记录」后,就被取代了。但灵感依然存在,所以只是形式上的改变,内核没有变化。

问题

看了下 2024 留下的问题,感觉其实我没什么可以补充或是修改的。因此我更想补充一些问题。不过这些问题更像是留给未来的自己的问题,而不是供现在的我解答(虽然有部分已经在上面有所阐述了),因此我就只是这样列出而已:

  1. AI 发展得怎么样了?
    • 这样问是因为,一年对于 AI 来说是一个相当惊人的尺度了,明年又会是怎样呢?2024 的时候我还没有提及过这样的问题,但 2025 部分,我不得不放在第一个。
  2. 现在在做什么?
    • 这个问题则是在看,我是否还依旧是一只无头苍蝇。不管怎么样,明年这个时候我都必须要选择一条出路了,同时在我那时候回答这个问题的时候,一定是已经站在一条路上了,我是否会有更深刻的理解。

有一些第三个问题的候选,但似乎没找到一个分量能跟这两个比的。再一看 2024 其实也就问了两个问题,因此 2025 也就这两个吧。

结语

终于还是完成了。初动笔时,2026 都已过去一季,结语时却已又过一月,2026 过了 1/3 了。因此很难避免,这篇名义上是 2025 年终的回顾,会掺杂很多我 2026 年初的新鲜想法。

此外这篇也是实验性质的,记录部分也是拖了几次才写完,加上需要辅助我私人的记录才能理解,更像是我平日在「记事」中写下的隐语了,尽管我现在都不怎么在记事中写隐语了。

总的来说,不管从内容上还是完成上,这篇回顾都是有点失败的。本来在底部记录结语时重看并修缮一下,但最终仿佛是为了快点丢掉这个包袱,放弃了,并冠以「实验」之名。

不管怎么说,我总算斩断了与 2025 的最后一丝联系,终于可以心无旁骛地生活在 2026 了。


  1. 8.11~8.17 这七天,当天记录建立的时间分别是次日 0:44、当日 19:55、次日 0:37、次日 0:40、次日 0:11、次日 0:41、次日 0:11。 ↩︎

  2. 当然这不单单与 AI 的「净室重写」相关,只是这种概括流传最为广泛而已。我了解了更广泛的信息后,是更偏向支持维护者的变更许可证行为。但 AI 代码与法律上的议题我确实觉得是个值得审慎考虑的问题。 ↩︎