编写程序对比一帆风顺和历经波折两种状态下的作品风格,利用低谷心境打造差异化创意。
顺境与低谷的双面镜:用 Python 对比两种心境下的作品风格,把"至暗时刻"变成创意差异化引擎。
说明:本文为纯技术实践分享,不涉及任何课程推广、营销引流或商业产品。所有代码可在本地离线运行。
一、实际应用场景描述
在《心理健康与创新能力》课程中,有一个让我久久不能平静的发现:"人在顺境中产出的作品,往往精致但趋同;而在低谷中产出的作品,往往粗糙但独特。"
教授播放了两段对比素材:同一位摄影师在事业巅峰期拍摄的时尚大片,和在抑郁症康复期拍摄的街头快照。前者构图完美、光线精准、无可挑剔——但也"没什么记忆点"。后者画面摇晃、曝光不准、人物表情模糊——但每一张都让人移不开眼睛。
他说了一句我至今记得的话:"顺境让人追求正确,低谷让人追求真实。而真实,才是差异化的唯一来源。"
这句话像一根针扎进了我的日常。我回顾了自己的代码仓库:
- 状态好的时候写的代码:架构清晰、注释完整、测试覆盖率 90%、CI/CD 流水线绿得发亮——但拿给别人看,得到的评价通常是"嗯,写得不错"。
- 状态差的时候写的代码:一个周六凌晨三点,睡不着,爬起来写的一个小脚本——没有测试、没有文档、变量名全是 a/b/c——但它解决了一个我自己都没意识到的问题。后来这段代码被我改造成了公司内部工具,现在每天有几十个人在用。
我最好的作品,几乎全部诞生在状态最差的日子里。
但问题是:低谷中的作品通常被我自己嫌弃。写完就丢在那儿,觉得"这什么垃圾",永远不会拿出来给人看。我一直在用顺境的标准去评判低谷的产物——当然会觉得它不合格。
于是我写了一个本地命令行工具:
系统性地记录你在"顺境"和"低谷"两种心境下产出的作品,从多个维度对比它们的风格差异,识别出低谷作品的独特基因,并有意识地将其转化为你的差异化创意标签。
典型使用场景:
- 每次完成一个作品(代码/文章/设计/任何创作),记录当时的心境状态和作品特征
- 程序自动归类到"顺境集"或"低谷集"
- 对比两组作品在风格、深度、独特性上的差异
- 提取低谷作品的"差异化基因",生成创作建议
- 所有数据保存在本地,不上传、不联网
二、引入痛点
在创作和心理健康的互动关系中,存在着三个被普遍忽略的问题:
1. 顺境的"甜蜜陷阱"
人在状态好时,执行力强、审美在线、工具熟练。但心理学中的"功能固着"(Functional Fixedness)在顺境中更容易出现——你用已知的正确方式做事,不太会跳出框架。结果是:你的作品"没问题",但也"没惊喜"。课程中将这种现象称为"高功能平庸"。
2. 低谷作品的自我否定循环
低谷中产出的作品通常伴随着强烈的自我怀疑:"我今天状态这么差,写出来的东西肯定不行。"这种预设导致两个后果:一是直接放弃不写,二是写出来也不敢示人。但实际上,低谷恰恰打破了你的"习惯性正确"——你不再追求完美,反而更容易触碰到一些平时被压抑的表达。
3. 缺乏系统化的风格对比
大多数创作者从未认真对比过自己在不同心境下的产出差异。你觉得自己"风格统一",但其实你的顺境作品和低谷作品可能有着截然不同的气质。如果能看清这种差异,你就可以有意识地选择何时调用哪种风格——而不是被动地等待状态来找你。
我们需要一个工具来:
- 客观地记录不同心境下的作品特征
- 量化对比顺境与低谷作品的风格差异
- 识别低谷作品的"差异化基因"
- 将低谷中的创造力转化为可复用的创作策略
三、核心逻辑讲解
本程序的核心是"心境-作品风格对比引擎",逻辑流程如下:
[记录每次创作:心境 + 作品特征 + 自评]
↓
[自动归入"顺境集"或"低谷集"]
↓
[多维度对比:复杂度/实验性/情感浓度/独特性]
↓
[提取低谷作品的差异化基因]
↓
[生成"低谷风格"创作建议]
↓
[长期追踪:你的差异化标签是什么]
关键设计点
1. 心境的五维评估
每次创作时,记录五个维度的状态(1-5分):
-
"energy":精力充沛度
-
"mood":情绪积极度
-
"confidence":自我确信度
-
"clarity":思路清晰度
-
"pressure":外部压力感
综合得分 ≥ 16 → 归入"顺境集"
综合得分 ≤ 10 → 归入"低谷集"
中间地带 → "平近期"(不作为对比样本)
2. 作品的六维风格标注
每条作品记录标注六个风格维度(1-5分):
-
"complexity":结构复杂度(精巧/繁复 vs 简单/直接)
-
"experiment":实验性(突破常规 vs 遵循惯例)
-
"emotion":情感浓度(克制/冷静 vs 浓烈/外露)
-
"uniqueness":独特性(像别人的 vs 只属于你的)
-
"polish":完成度/打磨程度
-
"risk":冒险程度(安全牌 vs 险棋)
3. 对比分析的核心指标
程序计算两组作品在每个维度上的平均分,重点关注:
- 实验性差距:低谷作品是否比顺境作品更具实验性?
- 情感浓度差距:低谷作品是否情感更浓烈?
- 独特性差距:低谷作品是否更难被替代?
- 完成度与独特性的反比关系:低谷作品是否"越糙越独特"?
4. "差异化基因"提取
当低谷作品在"独特性"和"实验性"上显著高于顺境作品时,程序会提取这些作品的共性标签,生成类似这样的洞察:
"你的低谷作品倾向于:极简结构 + 高情感浓度 + 非常规表达。这正是你的差异化基因。"
四、代码模块化实现
项目结构:
mirror_mood/
├── main.py # 命令行入口
├── models.py # 数据结构定义
├── classifier.py # 心境分类器
├── comparator.py # 风格对比引擎
├── storage.py # 本地持久化
├── data/
│ └── works.json # 作品记录
└── README.md
models.py —— 数据结构定义
"""
数据模型层
定义作品记录和心境评估的结构
"""
from dataclasses import dataclass, field
from typing import Optional
from datetime import datetime, date
import uuid
@dataclass
class MoodState:
"""创作时的心境状态"""
energy: int = 3 # 精力 1-5
mood: int = 3 # 情绪 1-5
confidence: int = 3 # 自信 1-5
clarity: int = 3 # 清晰 1-5
pressure: int = 3 # 压力 1-5(反向计分:压力越大分越低)
@property
def composite_score(self) -> int:
"""心境综合得分(越高越顺境)"""
return self.energy + self.mood + self.confidence + self.clarity + (6 - self.pressure)
@property
def label(self) -> str:
"""心境标签"""
score = self.composite_score
if score >= 18:
return "顺境"
elif score <= 12:
return "低谷"
else:
return "平稳"
@dataclass
class WorkRecord:
"""一次作品记录"""
id: str
title: str
description: str = ""
category: str = "other" # code/writing/design/music/other
created_date: date = field(default_factory=date.today)
# 心境
mood_state: MoodState = field(default_factory=MoodState)
# 风格六维
complexity: int = 3 # 结构复杂度
experiment: int = 3 # 实验性
emotion: int = 3 # 情感浓度
uniqueness: int = 3 # 独特性
polish: int = 3 # 完成度
risk: int = 3 # 冒险程度
# 自评
satisfaction: Optional[int] = None # 创作满意度
external_feedback: str = "" # 外部反馈摘要
tags: list = field(default_factory=list)
recorded_at: datetime = field(default_factory=datetime.now)
@property
def mood_label(self) -> str:
return self.mood_state.label
def to_dict(self):
return {
"id": self.id,
"title": self.title,
"description": self.description,
"category": self.category,
"created_date": self.created_date.isoformat(),
"mood_state": {
"energy": self.mood_state.energy,
"mood": self.mood_state.mood,
"confidence": self.mood_state.confidence,
"clarity": self.mood_state.clarity,
"pressure": self.mood_state.pressure
},
"complexity": self.complexity,
"experiment": self.experiment,
"emotion": self.emotion,
"uniqueness": self.uniqueness,
"polish": self.polish,
"risk": self.risk,
"satisfaction": self.satisfaction,
"external_feedback": self.external_feedback,
"tags": self.tags,
"recorded_at": self.recorded_at.isoformat()
}
@classmethod
def from_dict(cls, d):
ms = d.get("mood_state", {})
mood_state = MoodState(
energy=ms.get("energy", 3),
mood=ms.get("mood", 3),
confidence=ms.get("confidence", 3),
clarity=ms.get("clarity", 3),
pressure=ms.get("pressure", 3)
)
return cls(
id=d["id"],
title=d["title"],
description=d.get("description", ""),
category=d.get("category", "other"),
created_date=date.fromisoformat(d["created_date"]),
mood_state=mood_state,
complexity=d.get("complexity", 3),
experiment=d.get("experiment", 3),
emotion=d.get("emotion", 3),
uniqueness=d.get("uniqueness", 3),
polish=d.get("polish", 3),
risk=d.get("risk", 3),
satisfaction=d.get("satisfaction"),
external_feedback=d.get("external_feedback", ""),
tags=d.get("tags", []),
recorded_at=datetime.fromisoformat(d["recorded_at"])
)
classifier.py —— 心境分类器
"""
心境分类模块
负责判断作品所属的心境集合
"""
from models import WorkRecord, MoodState
class MoodClassifier:
"""
心境分类器
将作品归入顺境集、低谷集或平稳期
"""
HIGH_THRESHOLD = 18 # 综合分 ≥ 18 → 顺境
LOW_THRESHOLD = 12 # 综合分 ≤ 12 → 低谷
def classify(self, work: WorkRecord) -> str:
"""返回心境分类"""
return work.mood_label
def is_extreme(self, work: WorkRecord) -> bool:
"""是否为极端心境(顺境或低谷)"""
return work.mood_label in ("顺境", "低谷")
def categorize_batch(self, works: list[WorkRecord]) -> dict:
"""批量分类"""
result = {"顺境": [], "低谷": [], "平稳": []}
for w in works:
result[w.mood_label].append(w)
return result
comparator.py —— 风格对比引擎
"""
风格对比引擎
负责对比顺境和低谷作品的风格差异
"""
from models import WorkRecord
from classifier import MoodClassifier
from typing import List
class StyleComparator:
"""
心境-作品风格对比引擎
核心思想:低谷中的作品往往具有更高的差异化和独特性
"""
DIMENSIONS = ["complexity", "experiment", "emotion", "uniqueness", "polish", "risk"]
DIMENSION_LABELS = {
"complexity": "结构复杂度",
"experiment": "实验性",
"emotion": "情感浓度",
"uniqueness": "独特性",
"polish": "完成度",
"risk": "冒险程度"
}
def __init__(self):
self.classifier = MoodClassifier()
def compare(self, works: List[WorkRecord]) -> dict:
"""对比顺境和低谷作品的风格差异"""
categorized = self.classifier.categorize_batch(works)
highs = categorized["顺境"]
lows = categorized["低谷"]
if not highs or not lows:
return {"error": "需要至少一条顺境和一条低谷作品才能对比"}
high_avg = self._average_scores(highs)
low_avg = self._average_scores(lows)
diff = {}
for dim in self.DIMENSIONS:
diff[dim] = {
"high": high_avg.get(dim, 0),
"low": low_avg.get(dim, 0),
"gap": round(low_avg.get(dim, 0) - high_avg.get(dim, 0), 2)
}
return {
"high_count": len(highs),
"low_count": len(lows),
"dimensions": diff
}
def _average_scores(self, works: List[WorkRecord]) -> dict:
"""计算一组作品的平均分"""
if not works:
return {}
result = {}
count = len(works)
for dim in self.DIMENSIONS:
result[dim] = round(sum(getattr(w, dim) for w in works) / count, 2)
return result
def extract_differentiation_gene(self, works: List[WorkRecord]) -> str:
"""
提取低谷作品的差异化基因
找出低谷作品中显著高于顺境的维度
"""
comparison = self.compare(works)
if "error" in comparison:
return comparison["error"]
dims = comparison["dimensions"]
strengths = []
for dim, values in dims.items():
gap = values["gap"]
if gap >= 0.5: # 低谷比顺境高 0.5 分以上
strengths.append({
"dimension": dim,
"label": self.DIMENSION_LABELS[dim],
"gap": gap,
"low_score": values["low"],
"high_score": values["high"]
})
if not strengths:
return "暂未检测到明显的差异化基因。继续积累作品吧。"
strengths.sort(key=lambda x: x["gap"], reverse=True)
lines = ["🔬 你的低谷差异化基因:\n"]
for s in strengths:
lines.append(
f" • {s['label']}:低谷 {s['low_score']} vs 顺境 {s['high_score']} "
f"(差距 +{s['gap']})"
)
lines.append("\n💡 创作建议:")
lines.append(" 当你的作品需要差异化竞争力时,尝试主动调用低谷期的创作模式——")
lines.append(" 降低完成度预期,提高实验性和情感浓度,允许自己冒险。")
return "\n".join(lines)
def generate_report(self, works: List[WorkRecord]) -> str:
"""生成完整对比报告"""
comparison = self.compare(works)
if "error" in comparison:
return comparison["error"]
lines = []
lines.append(f"📊 心境-作品风格对比报告")
lines.append(f"{'='*50}")
lines.append(f"\n 顺境作品:{comparison['high_count']} 件")
lines.append(f" 低谷作品:{comparison['low_count']} 件\n")
lines.append(f" {'维度':<12} {'顺境':>6} {'低谷':>6} {'差距':>8}")
lines.append(f" {'-'*36}")
for dim, values in comparison["dimensions"].items():
label = self.DIMENSION_LABELS[dim]
gap_str = f"+{values['gap']}" if values['gap'] > 0 else str(values['gap'])
lines.append(f" {label:<12} {values['high']:>6} {values['low']:>6} {gap_str:>8}")
lines.append(f"\n{'='*50}")
gene = self.extract_differentiation_gene(works)
lines.append(f"\n{gene}")
return "\n".join(lines)
storage.py —— 本地持久化
"""
存储模块
所有数据以 JSON 格式保存在本地
"""
import json
from pathlib import Path
from models import WorkRecord
DATA_DIR = Path("data")
WORKS_FILE = DATA_DIR / "works.json"
def _ensure_file():
DATA_DIR.mkdir(exist_ok=True)
if not WORKS_FILE.exists():
with open(WORKS_FILE, "w", encoding="utf-8") as f:
json.dump([], f, ensure_ascii=False, indent=2)
def load_works() -> list[WorkRecord]:
_ensure_file()
with open(WORKS_FILE, "r", encoding="utf-8") as f:
return [WorkRecord.from_dict(d) for d in json.load(f)]
def save_work(work: WorkRecord):
works = load_works()
works.append(work)
with open(WORKS_FILE, "w", encoding="utf-8") as f:
json.dump([w.to_dict() for w in works], f, ensure_ascii=False, indent=2)
def get_by_mood(mood_label: str) -> list[WorkRecord]:
"""按心境标签筛选"""
works = load_works()
return [w for w in works if w.mood_label == mood_label]
main.py —— 命令行入口
"""
主程序入口
提供命令行交互界面
"""
from datetime import date, datetime
from models import WorkRecord, MoodState
from classifier import MoodClassifier
from comparator import StyleComparator
from storage import load_works, save_work, get_by_mood
def record_work():
"""记录一次作品"""
print("\n📝 记录一次作品\n")
title = input("🎨 作品名称:").strip()
if not title:
print("❌ 名称不能为空")
return
desc = input("📄 描述(可选):").strip()
print("\n📂 类别:1.代码 2.文字 3.设计 4.音乐 5.其他")
cat_map = {"1": "code", "2": "writing", "3": "design", "4": "music"}
cat = cat_map.get(input(" 选择:").strip(), "other")
print("\n😶 心境五维评估(1-5分):")
try:
energy = int(input(" 精力充沛度:").strip() or "3")
mood = int(input(" 情绪积极度:").strip() or "3")
conf = int(input(" 自我确信度:").strip() or "3")
clarity = int(input(" 思路清晰度:").strip() or "3")
pressure = int(input(" 外部压力(1=极大 5=无压力):").strip() or "3")
except ValueError:
energy, mood, conf, clarity, pressure = 3, 3, 3, 3, 3
print("\n🎭 作品风格六维(1-5分):")
try:
complexity = int(input(" 结构复杂度:").strip() or "3")
experiment = int(input(" 实验性:").strip() or "3")
emotion = int(input(" 情感浓度:").strip() or "3")
uniqueness = int(input(" 独特性:").strip() or "3")
polish = int(input(" 完成度:").strip() or "3")
risk = int(input(" 冒险程度:").strip() or "3")
except ValueError:
complexity = experiment = emotion = uniqueness = polish = risk = 3
tags_input = input("\n🏷 标签(逗号分隔,可选):").strip()
tags = [t.strip() for t in tags_input.split(",")] if tags_input else []
mood_state = MoodState(energy=energy, mood=mood, confidence=conf, clarity=clarity, pressure=pressure)
label = mood_state.label
work = WorkRecord(
id=str(int(datetime.now().timestamp()))[-8:],
title=title,
description=desc,
category=cat,
mood_state=mood_state,
complexity=complexity,
experiment=experiment,
emotion=emotion,
uniqueness=uniqueness,
polish=polish,
risk=risk,
tags=tags
)
save_work(work)
print(f"\n✅ 已记录。心境判定:{label}")
if label == "低谷":
print("💡 低谷作品往往藏着你的差异化基因。别急着否定它。")
elif label == "顺境":
print("💡 顺境作品是你的基本功展示。保持这个水准,已经很棒了。")
def show_comparison():
"""显示对比报告"""
works = load_works()
comparator = StyleComparator()
report = comparator.generate_report(works)
print(f"\n{report}")
def show_by_mood():
"""按心境查看作品"""
print("\n1. 顺境作品 2. 低谷作品 3. 平稳期作品")
choice = input("> ").strip()
mapping = {"1": "顺境", "2": "低谷", "3": "平稳"}
label = mapping.get(choice, "顺境")
works = get_by_mood(label)
if not works:
print(f"📭 暂无{label}作品")
return
print(f"\n📋 {label}作品({len(works)}件):\n")
for w in works:
print(f" • {w.title}")
print(f" 风格:实验{w.experiment} 情感{w.emotion} 独特{w.uniqueness} 完成{w.polish}")
if w.tags:
print(f" 标签:{', '.join(w.tags)}")
print()
def main():
print("🪞 顺境与低谷的双面镜")
print("核心理念:低谷中的作品不是垃圾,而是你的差异化基因\n")
while True:
print("\n请选择操作:")
print("1. 📝 记录一次作品")
print("2. 📊 心境-风格对比报告")
print("3. 📋 按心境查看作品")
print("q. 退出")
choice = input("\n> ").strip()
if choice == "1":
record_work()
elif choice == "2":
show_comparison()
elif choice == "3":
show_by_mood()
elif choice == "q":
print("\n👋 再见。愿你学会欣赏低谷中的自己——那是你最真实的样子。")
break
else:
print("❌ 无效选择。")
if __name__ == "__main__":
main()
五、README.md 与使用说明
# 双面镜:心境-作品风格对比工具(Mirror Mood)
一个本地运行的 Python 工具,用于记录不同心境下的作品,对比顺境与低谷的风格差异,提取低谷中的差异化创意基因。
## 设计背景
本项目基于《心理健康与创新能力》课程中的核心观点:
- 顺境作品往往精致但趋同,低谷作品往往粗糙但独特
- 低谷打破了"习惯性正确",反而触及更真实的表达
- 识别并利用低谷风格,可以建立个人创作的差异化标签
## 功能特性
- ✅ 记录作品时同步评估心境五维(精力/情绪/自信/清晰/压力)
- ✅ 自动归入顺境集或低谷集
- ✅ 六维风格标注(复杂度/实验性/情感/独特性/完成度/冒险)
- ✅ 两组作品的多维度对比分析
- ✅ 自动提取"差异化基因"
- ✅ 完全本地运行,无网络请求,无数据上传
- ✅ 零第三方依赖(仅 Python 标准库)
## 安装与使用
### 环境要求
- Python 3.9+
### 安装
bash
git clone <repository-url>
cd mirror_mood
python main.py
### 使用流程
#### 记录作品
选择 `1`,依次填写:
- 作品基本信息
- 心境五维评分
- 作品风格六维评分
程序自动判定该作品属于"顺境""低谷"还是"平稳期"。
#### 查看对比
选择 `2`,生成完整对比报告,包括:
- 各维度平均分对比
- 差距最大的维度
- 差异化基因提取
- 创作建议
#### 按心境浏览
选择 `3`,分别查看不同时期的作品列表。
### 心境判定标准
| 综合得分 | 标签 | 含义 |
|---------|------|------|
| ≥18 | 顺境 | 精力充沛、情绪积极、自信清晰 |
| ≤12 | 低谷 | 疲惫低落、自我怀疑、思路模糊 |
| 13-17 | 平稳 | 中性状态 |
### 数据文件
- `data/works.json`:所有作品记录
## 示例报告
📊 心境-作品风格对比报告
顺境作品:8 件
低谷作品:5 件
维度 顺境 低谷 差距
结构复杂度 4 3 -1.2
实验性 2 4 +2.0
情感浓度 2 5 +3.0
独特性 3 4 +1.0
完成度 5 2 -3.0
冒险程度 2 4 +2.0
🔬 你的低谷差异化基因:
• 情感浓度:低谷 5 vs 顺境 2 (差距 +3.0)
• 实验性:低谷 4 vs 顺境 2 (差距 +2.0)
• 冒险程度:低谷 4 vs 顺境 2 (差距 +2.0)
💡 创作建议:
当你的作品需要差异化竞争力时,尝试主动调用低谷期的创作模式——
降低完成度预期,提高实验性和情感浓度,允许自己冒险。
## 局限说明
- 评分完全依赖主观自评
- 样本量较少时对比结果可能不稳定
- 无图形界面,仅命令行交互
- 不构成心理诊断工具
## 适用人群
- 希望理解自己创作风格变化的创作者
- 想从低谷中提炼创意价值的人
- 对"差异化"和"个人风格"感兴趣的实践者
## 许可证
MIT License
六、核心知识点卡片
知识点 来源领域 工程映射
高功能平庸 创新心理学 Local Optimum——在局部最优解附近打转
低谷创造力 创伤后成长(PTG) Fault Injection——主动引入异常以发现隐藏路径
差异化基因 品牌定位理论 Unique Value Proposition——唯一不可替代的特征
功能固着 认知心理学 Design Pattern Lock-in——被既有模式锁死
情感浓度 艺术治疗 Signal Amplitude——噪声中的强信号更容易被接收
完成度与独特性的反比 产品管理 MVP vs Polished——粗糙的原型往往更接近本质需求
七、总结
这个项目让我做了一件以前从未做过的事:认真回看了自己低谷期的作品,并且没有嫌弃它们。
我发现那些在凌晨三点、失眠、焦虑、自我怀疑中写出来的代码和文字,确实有一个共同特质——它们不漂亮,但它们真。它们没有试图讨好任何人,包括我自己。它们只是把那一刻的我原封不动地倒了出来。
而恰恰是这些"不漂亮的真相",成了我最独特的创作标签。
课程结束时教授说:"不要等风暴过去才开始创作。风暴本身就是你的颜料。"
这个工具不会帮你避免低谷——没人能做到。但它会帮你做一件更有用的事:在低谷中拿起笔,而不是放下笔。
因为你最独特的声音,往往出现在你最不想开口的时候。
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!
