编写程序统计纯粹为了自我满足而创作的作品数量,以此作为衡量人生充实度的核心标准。 为自己而做用 Python 统计无用创作重建人生的充实度量尺。说明本文为纯技术实践分享不涉及任何课程推广、营销引流或商业产品。所有代码可在本地离线运行。一、实际应用场景描述在《心理健康与创新能力》课程中有一个让我沉默了很久的观点如果一个人生命中所有产出的东西都指向外部评价——老板的认可、市场的回报、同行的点赞——那么这个人的精神世界实际上处于一种租赁状态他从未真正拥有过自己的创作。教授说这话的时候我在笔记本上写了一行字我上一次纯粹为了自己高兴而做一件事是什么时候然后我发现我想不起来了。我写代码是因为这是工作我写技术博客是因为要维护行业影响力我给开源项目提 PR是因为要让简历好看我甚至周末折腾 HomeLab潜意识里也在想这个可以写篇博客。一切都有目的。一切都在被衡量。这不是我一个人的问题。整个社会已经把有用变成了唯一的价值标准。你做一件事之前脑子里会自动弹出一个问题这有什么用如果答不上来这件事就不值得做。但课程里给出了一个反直觉的指标纯粹为了自我满足而创作的作品数量——那些没用的东西——才是衡量人生充实度的最核心标准。因为当你做一件事完全不为任何外部回报时你是在为自己而活而不是为任何评价体系打工。于是我写了一个本地命令行工具记录每一件你纯粹为了自我满足而做的事统计它们的数量、频率、类型分布让你看到为自己而活的刻度到底在哪里。典型使用场景- 你花了一晚上写了一段毫无用途但很好玩的代码 → 记录- 你随手画了一张丑萌的涂鸦 → 记录- 你给朋友写了一段没有任何商业目的的祝福视频脚本 → 记录- 月底打开程序看到这个月的无用创作数量 → 如果为零就该警惕了所有数据保存在本地不上传、不联网。二、引入痛点在个人心理健康和创造力维护方面有三个被系统性忽视的问题1. 有用性暴政社会评价体系已经内化到了我们的每一个决策里。做一件事之前大脑自动进行 ROI 计算花这个时间能换来什么如果答案是什么也换不来大脑就会拦截这个冲动。这种机制在职场上很有用但在人生层面是毁灭性的——它会让你变成一个永远在投资、从未在享受的人。2. 外部评价的成瘾循环点赞、转发、晋升、加薪——这些外部反馈会触发多巴胺分泌形成正向强化。久而久之你会发现自己越来越难从没有观众的创作中获得快乐。这是一种内在动机的萎缩。心理学上的过度辩护效应Overjustification Effect表明当外部奖励取代了内在兴趣一旦外部奖励撤走行为就会停止。3. 缺乏自我满足的计量方式我们用 OKR 衡量工作目标用 GPA 衡量学业用 Star 数衡量开源项目的影响力。但我们从未用任何指标来衡量我为自己活了多少。这不是因为这件事不重要而是因为它太私人了以至于没有人替你统计。所以我们需要一个工具来- 给无用创作一个正式的记录位置- 用数据呈现你与纯粹自我满足之间的距离- 在外部评价体系之外建立一个完全属于你自己的价值坐标系三、核心逻辑讲解本程序的核心是自我满足创作计数器逻辑极其简单但背后的设计选择别有深意[记录一次纯粹自我的创作]↓[标注是否有任何外部目的]↓[仅当答案为否时计入统计]↓[按月/季/年汇总数量与类型]↓[计算充实度指数 无用创作数 / 总创作数]↓[可视化趋势提供自我觉察]关键设计点1. 纯粹性的判定门槛一条记录要被计入统计必须通过以下问题- 这件事有任何外部观众吗包括潜在的- 这件事有任何变现可能吗- 这件事对你的职业发展有任何帮助吗- 你做这件事是因为应该做还是想做全部为否才计入。 这个门槛故意设得很高——因为我们要捕捉的不是半心半意的兴趣而是完全的、无杂质的自我满足。2. 充实度指数程序不只统计绝对数量还计算一个比例充实度指数 纯粹自我创作数 / (纯粹自我创作数 外部驱动创作数)这个比例比绝对值更有意义。如果你的纯粹创作数量是 0即使总创作数是 100充实度也是 0%。3. 类型分布分析程序对创作进行分类标记代码/文字/图像/音乐/手工/其他帮助你发现我到底在什么形式上最容易进入纯粹状态。这可能是你真正的天赋所在。4. 零评价原则程序不会对任何记录打分、评级、排名。它甚至不会说你的充实度太低了。它只呈现数据解读权完全在你。四、代码模块化实现项目结构self_fullfillment_counter/├── main.py # 命令行入口├── models.py # 数据结构定义├── analyzer.py # 统计与分析引擎├── storage.py # 本地持久化├── data/│ └── creations.json # 创作记录└── README.mdmodels.py —— 数据结构定义数据模型层定义创作记录的数据结构from dataclasses import dataclass, fieldfrom typing import Optionalfrom datetime import datetime, dateimport uuiddataclassclass Creation:一次创作记录id: strtitle: str # 创作名称description: str # 描述category: str other # 类型code/writing/image/music/craft/othercreated_date: date field(default_factorydate.today)# 纯粹性判定全部必须为False才能计入纯粹创作has_audience: bool False # 有任何外部观众吗has_monetization: bool False # 有变现可能吗has_career_value: bool False # 对职业发展有帮助吗is_for_should: bool False # 是因为应该做而不是想做# 纯粹创作只读属性由系统自动判定propertydef is_pure(self) - bool:是否为纯粹的自我满足创作return not (self.has_audience or self.has_monetizationor self.has_career_value or self.is_for_should)joy_level: Optional[int] None # 做这件事时的愉悦度 1-5flow_duration: Optional[int] None # 进入心流状态的时长分钟recorded_at: datetime field(default_factorydatetime.now)def to_dict(self):return {id: self.id,title: self.title,description: self.description,category: self.category,created_date: self.created_date.isoformat(),has_audience: self.has_audience,has_monetization: self.has_monetization,has_career_value: self.has_career_value,is_for_should: self.is_for_should,joy_level: self.joy_level,flow_duration: self.flow_duration,recorded_at: self.recorded_at.isoformat()}classmethoddef from_dict(cls, d):return cls(idd[id],titled[title],descriptiond.get(description, ),categoryd.get(category, other),created_datedate.fromisoformat(d[created_date]),has_audienced.get(has_audience, False),has_monetizationd.get(has_monetization, False),has_career_valued.get(has_career_value, False),is_for_shouldd.get(is_for_should, False),joy_leveld.get(joy_level),flow_durationd.get(flow_duration),recorded_atdatetime.fromisoformat(d[recorded_at]))analyzer.py —— 统计与分析引擎分析模块负责计算充实度指数、类型分布和趋势from datetime import date, timedeltafrom models import Creationfrom typing import Listfrom collections import defaultdictclass FulfillmentAnalyzer:充实度分析引擎核心指标纯粹自我创作的比例和趋势CATEGORY_LABELS {code: 代码,writing: 文字,image: 图像,music: 音乐,craft: 手工,other: 其他}def __init__(self, creations: List[Creation]):self.creations creationsdef total_count(self) - int:总创作数return len(self.creations)def pure_count(self) - int:纯粹创作数return sum(1 for c in self.creations if c.is_pure)def external_count(self) - int:外部驱动创作数return sum(1 for c in self.creations if not c.is_pure)def fulfillment_index(self) - float:充实度指数 纯粹创作数 / 总创作数0.0 完全没有为自己而活1.0 全部为自己而活total self.total_count()if total 0:return 0.0return round(self.pure_count() / total, 3)def monthly_pure_counts(self, months: int 12) - dict:最近N个月的纯粹创作数量today date.today()result {}for i in range(months):y today.yearm today.month - iwhile m 0:m 12y - 1key f{y}-{m:02d}result[key] 0for c in self.creations:if c.is_pure:key f{c.created_date.year}-{c.created_date.month:02d}if key in result:result[key] 1return dict(sorted(result.items()))def category_distribution(self) - dict:纯粹创作的类别分布dist defaultdict(int)for c in self.creations:if c.is_pure:dist[c.category] 1return dict(sorted(dist.items(), keylambda x: x[1], reverseTrue))def avg_joy_for_pure(self) - float:纯粹创作的平均愉悦度pure [c for c in self.creations if c.is_pure and c.joy_level]if not pure:return 0.0return round(sum(c.joy_level for c in pure) / len(pure), 1)def avg_flow_for_pure(self) - float:纯粹创作的平均心流时长分钟pure [c for c in self.creations if c.is_pure and c.flow_duration]if not pure:return 0.0return round(sum(c.flow_duration for c in pure) / len(pure), 1)def generate_report(self) - str:生成文字报告lines []lines.append(f 总创作数{self.total_count()})lines.append(f 纯粹自我创作{self.pure_count()})lines.append(f 外部驱动创作{self.external_count()})lines.append(f)lines.append(f✨ 充实度指数{self.fulfillment_index():.1%})lines.append(f 纯粹创作占总创作的比例)lines.append(f)if self.pure_count() 0:lines.append(f 纯粹创作平均愉悦度{self.avg_joy_for_pure()}/5)lines.append(f 纯粹创作平均心流时长{self.avg_flow_for_pure()} 分钟)cats self.category_distribution()if cats:lines.append(f)lines.append(f 创作类型分布)for cat, count in cats.items():label self.CATEGORY_LABELS.get(cat, cat)lines.append(f {label}{count} 件)fi self.fulfillment_index()if fi 0:lines.append(f)lines.append(f 提示你的充实度为 0%。试着做一件完全没用的事吧。)elif fi 0.2:lines.append(f)lines.append(f 提示纯粹创作比例较低。你的创造力大部分在为他人服务。)elif fi 0.5:lines.append(f)lines.append(f 提示你的充实度健康。继续保持为自己而创作的习惯。)return \n.join(lines)storage.py —— 本地持久化存储模块所有数据以 JSON 格式保存在本地import jsonfrom pathlib import Pathfrom models import CreationDATA_DIR Path(data)CREATIONS_FILE DATA_DIR / creations.jsondef _ensure_file():DATA_DIR.mkdir(exist_okTrue)if not CREATIONS_FILE.exists():with open(CREATIONS_FILE, w, encodingutf-8) as f:json.dump([], f, ensure_asciiFalse, indent2)def load_creations() - list[Creation]:_ensure_file()with open(CREATIONS_FILE, r, encodingutf-8) as f:return [Creation.from_dict(d) for d in json.load(f)]def save_creation(creation: Creation):creations load_creations()creations.append(creation)with open(CREATIONS_FILE, w, encodingutf-8) as f:json.dump([c.to_dict() for c in creations],f,ensure_asciiFalse,indent2)def get_recent_pure(count: int 5) - list[Creation]:获取最近的纯粹创作creations load_creations()pure [c for c in creations if c.is_pure]return sorted(pure, keylambda x: x.created_date, reverseTrue)[:count]main.py —— 命令行入口主程序入口提供命令行交互界面from datetime import datefrom models import Creationfrom analyzer import FulfillmentAnalyzerfrom storage import load_creations, save_creation, get_recent_puredef record_creation():记录一次创作print(\n 记录一次创作\n)title input( 名称).strip()if not title:print(❌ 名称不能为空)returndesc input( 描述可选).strip()print(\n 类型)print( 1.代码 2.文字 3.图像 4.音乐 5.手工 6.其他)cat_choice input( 选择1-6默认6).strip()cat_map {1: code, 2: writing, 3: image, 4: music, 5: craft}category cat_map.get(cat_choice, other)print(\n 纯粹性判定全部选否才计入纯粹创作)audience input( 有任何外部观众吗y/n).strip().lower() ymoney input( 有变现可能吗y/n).strip().lower() ycareer input( 对职业发展有帮助吗y/n).strip().lower() yshould input( 是因为应该做而不是想做y/n).strip().lower() yprint(\n 体验反馈可选)try:joy input( 做这件事时的愉悦度1-5).strip()joy_val int(joy) if joy else Noneexcept ValueError:joy_val Nonetry:flow input( 进入心流状态的时长分钟).strip()flow_val int(flow) if flow else Noneexcept ValueError:flow_val Nonecreation Creation(idstr(int(date.today().strftime(%Y%m%d)) hash(title) % 10000),titletitle,descriptiondesc,categorycategory,created_datedate.today(),has_audienceaudience,has_monetizationmoney,has_career_valuecareer,is_for_shouldshould,joy_leveljoy_val,flow_durationflow_val)save_creation(creation)if creation.is_pure:print(f\n✅ 已记录为「纯粹创作」。这是你为自己而做的一件事。)else:print(f\n✅ 已记录。这是一次外部驱动的创作。)return creationdef show_report():显示分析报告creations load_creations()if not creations:print( 暂无数据。去创作点什么吧——最好是没用的那种。)returnanalyzer FulfillmentAnalyzer(creations)print(f\n{*55})print(f 人生充实度报告)print(f{*55})print(f\n{analyzer.generate_report()})print(f{*55})def show_recent_pure():显示最近的纯粹创作recent get_recent_pure(5)if not recent:print( 还没有纯粹创作记录。)returnprint(f\n 最近的纯粹创作)for c in recent:print(f • [{c.created_date}] {c.title})if c.joy_level:print(f 愉悦度:{c.joy_level}/5, end)if c.flow_duration:print(f 心流:{c.flow_duration}分钟, end)print()def show_monthly_trend():显示月度趋势creations load_creations()if not creations:print( 暂无数据)returnanalyzer FulfillmentAnalyzer(creations)monthly analyzer.monthly_pure_counts(12)print(f\n 最近12个月纯粹创作趋势)for month, count in monthly.items():bar █ * count if count 0 else (空)print(f {month}: {bar} ({count}))def main():print( 自我满足创作计数器)print(核心理念纯粹为自己而做的无用之事才是人生充实的真正度量\n)while True:print(\n请选择操作)print(1. 记录一次创作)print(2. 查看充实度报告)print(3. 最近的纯粹创作)print(4. 月度趋势)print(q. 退出)choice input(\n ).strip()if choice 1:record_creation()elif choice 2:show_report()elif choice 3:show_recent_pure()elif choice 4:show_monthly_trend()elif choice q:print(\n 再见。愿你的生命中有越来越多没用的美好。)breakelse:print(❌ 无效选择。)if __name__ __main__:main()五、README.md 与使用说明# 自我满足创作计数器Self-Fulfillment Counter一个本地运行的 Python 工具用于记录纯粹为了自我满足而做的事用无用创作的数量来衡量人生充实度。## 设计背景本项目基于《心理健康与创新能力》课程中的核心观点- 纯粹的自我满足创作是心理健康的基石- 外部评价体系会侵蚀内在动机- 无用的东西恰恰是最有价值的## 功能特性- ✅ 记录每一次创作并判定其纯粹性- ✅ 计算充实度指数纯粹创作占总创作的比例- ✅ 按月展示纯粹创作趋势- ✅ 分析创作类型分布- ✅ 追踪愉悦度和心流时长- ✅ 完全本地运行无网络请求无数据上传- ✅ 零第三方依赖仅 Python 标准库## 安装与使用### 环境要求- Python 3.9### 安装bashgit clone repository-urlcd self_fullfillment_counterpython main.py### 首次运行程序会自动创建 data/ 目录及 creations.json 文件。### 使用流程#### 记录创作选择 1输入创作的基本信息然后回答四个纯粹性问题- 有任何外部观众吗- 有变现可能吗- 对职业发展有帮助吗- 是因为应该做而不是想做全部为否→ 计入纯粹创作。#### 查看报告选择 2查看充实度指数、类型分布和趋势。#### 月度趋势选择 4看到最近12个月纯粹创作数量的柱状图。### 数据文件- data/creations.json所有创作记录### 示例 人生充实度报告 总创作数47 纯粹自我创作8 外部驱动创作39✨ 充实度指数17.0%纯粹创作占总创作的比例 纯粹创作平均愉悦度4.4/5 纯粹创作平均心流时长52 分钟 创作类型分布代码3 件文字2 件其他2 件图像1 件 提示纯粹创作比例较低。你的创造力大部分在为他人服务。## 什么是纯粹创作纯粹创作必须满足以下全部条件- 没有任何外部观众包括潜在的- 没有任何变现可能- 对职业发展没有任何帮助- 是因为想做而不是应该做换句话说这件事做了不会让任何人高兴除了你自己。## 充实度指数参考| 指数 | 含义 ||------|------|| 0% | 全部创作都指向外部——精神世界处于租赁状态 || 10-20% | 偶尔为自己活——有意识但频率不高 || 30-50% | 健康平衡——在外部责任和内在满足之间找到了节奏 || 50% | 高度自足——内在世界丰盈 |## 局限说明- 纯粹性判定依赖主观诚实度- 愉悦度和心流时长为自评可能有偏差- 无图形界面仅命令行交互- 不构成心理健康诊断工具## 适用人群- 感到一直在为他人而活的人- 希望重建内在动机的创作者- 对自我量化感兴趣的个人- 想在生活中找回无用之美的实践者## 许可证MIT License六、核心知识点卡片知识点 来源领域 工程映射内在动机 自我决定论Deci Ryan Internal-only 服务——不对外暴露端口过度辩护效应 社会心理学 缓存污染——外部缓存覆盖了内部数据源心流Flow 积极心理学Csikszentmihalyi 最优负载区间——CPU 利用率恰好匹配任务复杂度无功利创作 人文主义心理学Maslow 自我实现的进程——从满足需求到表达存在外部评价依赖 社会比较理论 轮询机制——不断请求外部状态来决定内部行为充实度指数 主观幸福感研究 SLA 达标率——但衡量的是为自己而活的可用性七、总结这个项目对我最大的冲击是让我看到了一个数字17%。这是我运行程序一个月后算出的充实度指数。47 次创作中只有 8 次是纯粹为自己做的。其余 39 次全部指向某种外部回报——工资、影响力、简历、社交货币。17%。也就是说我一个月里只有不到五分之一的时间是在为自己而活。这个数字让我沉默了很久。但我没有因此自责。因为这就是记录的意义——不是评判而是看见。看见了才有可能改变。课程里最后一节课教授说你们将来会遇到很多衡量成功的尺子——薪水、职位、粉丝数、论文引用量。但请记住这些尺子都是别人设计的。你需要一把自己的尺子去衡量那些没用的东西。因为正是那些没用的东西定义了你是谁。这个工具就是那把尺子。它不会帮你涨薪不会帮你涨粉不会帮你拿到任何外部认可。它只会帮你回答一个问题这一周我有为自己而活吗如果答案是有哪怕只有一次——那就够了。利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛

本月热点