薪资计算器只计算收入多少,编写程序,换算每份工作时消耗的内心热情值,优先推荐热情损耗最低的岗位,而非单纯高薪岗位。
项目名:PassionCalc — 内心热情值岗位推荐系统
一、实际应用场景描述
在心理健康与创新能力课程中,有一个被广泛验证却难以落地的命题:
"薪资本身不是动力,热情才是可持续创造力的燃料"
现实场景包括:
- 高薪岗位让人"看起来成功",内心却日益枯竭
- 职业选择工具只对比薪资、福利、通勤时间
- 没有人量化"每天上班前,你是期待还是抗拒"
- 长期热情损耗导致职业倦怠(Burnout),创造力归零
心理学与创新研究指出:
- 内在动机(Intrinsic Motivation)比外在奖励更能驱动创造力(Deci & Ryan, Self-Determination Theory)
- 热情损耗是职业倦怠的早期信号(Maslach Burnout Inventory)
- 长期做"高薪但无意义感"的工作,创新产出反而下降
PassionCalc 的目标不是"劝你别赚钱",而是:
在职业决策中,把"内心热情损耗"从隐形感受,变成可量化、可对比的结构化指标
二、引入痛点
现有薪资计算工具的盲区
维度 薪资计算器 PassionCalc
核心指标 月薪、年薪、税后 热情值、意义感
决策导向 收入最大化 热情损耗最小化
隐性成本 忽略 核心考量
输出结果 "这份工作值多少钱" "这份工作消耗你多少"
真实痛点
- 职业选择 = 人生最大决策之一,工具却只算钱
- "高薪 = 好工作"的默认假设无人挑战
- 热情损耗是"软性"的,缺乏可操作的记录方式
- 创新课程讨论"内在动机",但学生缺乏个人实验工具
三、核心逻辑讲解(先讲思想)
核心隐喻
薪水是外在回报,热情是内在资本——后者耗尽,前者毫无意义
程序做了什么?
1. 定义"热情值"评估维度
- 意义感(是否认同工作的价值)
- 自主性(能否主导自己的工作方式)
- 成长感(是否在学习和进步)
- 社交滋养(同事关系是否 energize)
- 心流频率(是否经常进入专注忘我状态)
2. 每份工作 = 一组维度评分
- 每个维度 1-10 分
- 综合计算"热情净值"
3. 引入"热情损耗率"概念
- 不是静态评分,而是"每天消耗多少"
- 高薪但低热情 = 高损耗
- 中薪但高热情 = 低损耗
4. 推荐逻辑反转
- 传统:按薪资排序,取最高
- PassionCalc:按热情损耗排序,取最低
关键设计原则
- 不否定高薪的价值
- 不替代薪资计算,而是平行增加"热情维度"
- 所有评分主观自评,程序只做结构化呈现
四、代码模块化设计
项目结构
passion_calc/
│
├── README.md
├── requirements.txt
├── main.py
├── core/
│ ├── passion_metrics.py # 热情值维度定义与计算
│ ├── job_profile.py # 岗位档案
│ ├── comparator.py # 岗位对比与推荐
│ └── reporter.py # 报告生成
└── data/
└── job_profiles.json
五、核心代码实现(Python)
1️⃣ 热情值维度定义与计算(passion_metrics.py)
# core/passion_metrics.py
from dataclasses import dataclass
from typing import Dict, List, Optional
@dataclass
class PassionScore:
"""
一份工作的热情值评分
全部为主观自评,无客观标准
"""
meaning: int # 意义感:1-10(我觉得这份工作有价值吗?)
autonomy: int # 自主性:1-10(我能自己决定怎么做吗?)
growth: int # 成长感:1-10(我在变强吗?)
social_energy: int # 社交滋养:1-10(周围人让我更有活力吗?)
flow_frequency: int # 心流频率:1-10(我常进入忘我状态吗?)
def validate(self):
for field_name, value in self.__dict__.items():
if not 1 <= value <= 10:
raise ValueError(f"{field_name} 必须在 1-10 之间,当前为 {value}")
def raw_score(self) -> float:
"""热情原始分(简单平均)"""
values = [v for v in self.__dict__.values() if isinstance(v, int)]
return sum(values) / len(values)
def weighted_score(self) -> float:
"""
加权热情分
意义感和自主性权重更高(基于 Self-Determination Theory)
"""
weights = {
"meaning": 0.30,
"autonomy": 0.25,
"growth": 0.20,
"social_energy": 0.15,
"flow_frequency": 0.10,
}
score = 0.0
for dim, w in weights.items():
score += getattr(self, dim) * w
return round(score, 2)
def to_dict(self) -> Dict:
return {
"meaning": self.meaning,
"autonomy": self.autonomy,
"growth": self.growth,
"social_energy": self.social_energy,
"flow_frequency": self.flow_frequency,
"raw_score": round(self.raw_score(), 2),
"weighted_score": self.weighted_score(),
}
class PassionCalculator:
"""
计算"热情损耗率"
核心公式:
热情损耗率 = 1 / 加权热情分
(热情分越低 → 损耗率越高 → 越不推荐)
"""
def compute_drain_rate(self, score: PassionScore) -> float:
"""
热情损耗率:每天上班消耗多少"内心燃料"
范围约 0.1(极低损耗)~ 1.0(极高损耗)
"""
weighted = score.weighted_score()
# 避免除零
if weighted <= 0:
return 1.0
drain = round(1.0 / weighted, 3)
return min(drain, 1.0) # 上限 1.0
def interpret(self, drain_rate: float) -> str:
"""将损耗率翻译为可读提示"""
if drain_rate < 0.15:
return "极低损耗 — 这份工作在滋养你"
elif drain_rate < 0.25:
return "低损耗 — 热情可持续"
elif drain_rate < 0.40:
return "中等损耗 — 需要主动补充能量"
elif drain_rate < 0.60:
return "高损耗 — 长期可能倦怠"
else:
return "极高损耗 — 警惕职业枯竭"
设计说明
热情损耗率 = 1/热情分,这个倒数关系模拟了"热情越低,每天消耗越剧烈"的非线性感受
2️⃣ 岗位档案(job_profile.py)
# core/job_profile.py
from dataclasses import dataclass, field
from typing import Optional
from .passion_metrics import PassionScore
@dataclass
class JobProfile:
"""
一份工作的完整档案
包含薪资(传统维度)和热情值(新增维度)
"""
name: str
company: str
annual_salary: float # 年薪(万元)
passion: PassionScore # 热情评分
work_hours_per_week: int = 50 # 周工时
commute_hours_per_day: int = 1 # 单程通勤
notes: str = ""
def daily_drain(self) -> float:
"""每天消耗的热情值"""
from .passion_metrics import PassionCalculator
calc = PassionCalculator()
return calc.compute_drain_rate(self.passion)
def weekly_drain(self) -> float:
"""每周总消耗"""
return self.daily_drain() * self.work_hours_per_week
def annual_drain(self) -> float:
"""年化热情消耗"""
return self.weekly_drain() * 52
def salary_per_passion_unit(self) -> float:
"""
每单位热情消耗的薪资回报
类似"性价比",但反过来:
你每损失 1 点热情,赚回多少万?
"""
if self.annual_drain() == 0:
return float("inf")
return round(self.annual_salary / self.annual_drain(), 2)
def summary(self) -> dict:
return {
"岗位": f"{self.name} @ {self.company}",
"年薪(万)": self.annual_salary,
"周工时": self.work_hours_per_week,
"通勤(h/天)": self.commute_hours_per_day,
"热情加权分": self.passion.weighted_score(),
"日损耗率": round(self.daily_drain(), 3),
"年损耗总量": round(self.annual_drain(), 1),
"万元/损耗单位": self.salary_per_passion_unit(),
"解读": PassionCalculator().interpret(self.daily_drain()),
}
设计说明
"salary_per_passion_unit" 是最反直觉的指标:高薪岗位如果热情损耗巨大,这个比值可能很低
3️⃣ 岗位对比与推荐(comparator.py)
# core/comparator.py
from typing import List
from .job_profile import JobProfile
from .passion_metrics import PassionCalculator
class JobComparator:
"""
对比多份岗位,按热情损耗排序推荐
"""
def __init__(self, jobs: List[JobProfile]):
self.jobs = jobs
self.calc = PassionCalculator()
def rank_by_drain(self) -> List[JobProfile]:
"""按热情损耗从低到高排序(损耗越低越推荐)"""
return sorted(self.jobs, key=lambda j: j.daily_drain())
def rank_by_salary(self) -> List[JobProfile]:
"""按薪资从高到低排序(传统方式)"""
return sorted(self.jobs, key=lambda j: j.annual_salary, reverse=True)
def rank_by_efficiency(self) -> List[JobProfile]:
"""
按"万元/损耗单位"排序
综合考虑薪资和热情的性价比
"""
return sorted(
self.jobs,
key=lambda j: j.salary_per_passion_unit(),
reverse=True
)
def comparison_table(self) -> str:
"""生成对比表(文本格式)"""
lines = []
lines.append(f"\n{'=' * 100}")
lines.append(f"{'热情损耗排序':^100}")
lines.append(f"{'=' * 100}")
ranked = self.rank_by_drain()
lines.append(f"\n{'排名':<4} {'岗位':<35} {'年薪':<8} {'热情分':<8} {'日损耗':<8} {'年损耗':<10} {'解读'}")
lines.append("-" * 100)
for i, job in enumerate(ranked, 1):
summary = job.summary()
lines.append(
f"{i:<4} {summary['岗位']:<35} "
f"{summary['年薪(万)']:<8} "
f"{summary['热情加权分']:<8} "
f"{summary['日损耗率']:<8} "
f"{summary['年损耗总量']:<10} "
f"{summary['解读']}"
)
lines.append(f"\n{'=' * 100}")
lines.append(f"{'传统薪资排序(对比)':^100}")
lines.append(f"{'=' * 100}")
salary_ranked = self.rank_by_salary()
lines.append(f"\n{'排名':<4} {'岗位':<35} {'年薪(万)'}")
lines.append("-" * 50)
for i, job in enumerate(salary_ranked, 1):
lines.append(f"{i:<4} {job.name} @ {job.company:<25} {job.annual_salary}")
# 关键对比
best_drain = ranked[0].name if ranked else "N/A"
best_salary = salary_ranked[0].name if salary_ranked else "N/A"
lines.append(f"\n📌 关键对比:")
lines.append(f" 热情损耗最低:{best_drain}")
lines.append(f" 薪资最高:{best_salary}")
if best_drain != best_salary:
lines.append(f"\n ⚡ 热情推荐 ≠ 薪资推荐 — 这正是本工具存在的意义")
return "\n".join(lines)
设计说明
三种排序(损耗 / 薪资 / 效率)并列呈现,让使用者看到"不同价值观下的不同答案"
4️⃣ 报告生成(reporter.py)
# core/reporter.py
from .comparator import JobComparator
class Reporter:
"""生成岗位热情分析报告"""
def __init__(self, comparator: JobComparator):
self.comparator = comparator
def generate(self):
print(self.comparator.comparison_table())
# 额外洞察
jobs = self.comparator.jobs
if len(jobs) < 2:
return
print(f"\n{'=' * 100}")
print(f"{'💡 深度洞察':^100}")
print(f"{'=' * 100}")
# 洞察 1:薪资与热情的相关性
salaries = [j.annual_salary for j in jobs]
passions = [j.passion.weighted_score() for j in jobs]
# 简单相关系数(教学用)
avg_salary = sum(salaries) / len(salaries)
avg_passion = sum(passions) / len(passions)
numerator = sum(
(s - avg_salary) * (p - avg_passion)
for s, p in zip(salaries, passions)
)
denom_s = sum((s - avg_salary) ** 2 for s in salaries) ** 0.5
denom_p = sum((p - avg_passion) ** 2 for p in passions) ** 0.5
if denom_s > 0 and denom_p > 0:
corr = numerator / (denom_s * denom_p)
print(f"\n1. 薪资与热情的相关性:{corr:.2f}")
if corr < 0:
print(f" → 负相关:薪资越高,热情可能越低(需要警惕)")
elif corr > 0.5:
print(f" → 正相关:薪资与热情方向一致,较为理想")
else:
print(f" → 弱相关:薪资和热情基本独立,需要综合判断")
# 洞察 2:万元/损耗比
print(f"\n2. 薪资-热情综合效率排名:")
eff_ranked = self.comparator.rank_by_efficiency()
for i, job in enumerate(eff_ranked, 1):
eff = job.salary_per_passion_unit()
print(f" {i}. {job.name} @ {job.company} — 每单位损耗赚 {eff} 万元")
print(f"\n📌 教学提示:")
print(f" 1. 本工具不替代职业决策,只提供结构化视角")
print(f" 2. 热情评分完全主观,建议间隔 1-2 周重复评估")
print(f" 3. 同一岗位在不同阶段,热情评分可能变化")
print(f" 4. '高薪低热情'不一定是坏事,关键是你要'知情选择'")
5️⃣ 主程序(main.py)
# main.py
from core.passion_metrics import PassionScore
from core.job_profile import JobProfile
from core.comparator import JobComparator
from core.reporter import Reporter
def main():
# 定义几份候选岗位(实际应由用户输入)
jobs = [
JobProfile(
name="高级后端工程师",
company="大厂 A",
annual_salary=65,
passion=PassionScore(
meaning=4, # 做业务系统,意义感一般
autonomy=3, # 需求驱动,自主性低
growth=5, # 技术栈成熟,成长中等
social_energy=4, # 团队氛围尚可
flow_frequency=3 # 很少进入心流
),
work_hours_per_week=55,
commute_hours_per_day=1.5,
notes="高薪但重复性工作居多"
),
JobProfile(
name="独立开发者",
company="自由职业",
annual_salary=30,
passion=PassionScore(
meaning=9, # 做自己热爱的产品
autonomy=10, # 完全自主
growth=8, # 什么都得学
social_energy=5, # 独处多,社交少
flow_frequency=8 # 经常进入心流
),
work_hours_per_week=45,
commute_hours_per_day=0,
notes="收入不稳定但极其充实"
),
JobProfile(
name="产品经理",
company="中厂 B",
annual_salary=45,
passion=PassionScore(
meaning=7, # 影响用户生活,有意义
autonomy=6, # 有一定自主权
growth=7, # 跨部门协调,学习面广
social_energy=6, # 人际密集
flow_frequency=5 # 偶尔心流
),
work_hours_per_week=50,
commute_hours_per_day=1,
notes="平衡型选择"
),
]
# 对比分析
comparator = JobComparator(jobs)
reporter = Reporter(comparator)
reporter.generate()
if __name__ == "__main__":
main()
六、README 文件
# PassionCalc
一个"内心热情值"岗位推荐工具。
## 目的
- 在职业决策中引入"热情损耗"维度
- 不替代薪资计算,而是与之并列
- 帮助个人做出"知情选择",而非盲从高薪
## 使用说明
### 运行环境
- Python 3.8+
- 仅使用标准库
### 启动
bash
python main.py
### 添加岗位
修改 main.py,创建 JobProfile:
python
from core.passion_metrics import PassionScore
from core.job_profile import JobProfile
job = JobProfile(
name="你的岗位名",
company="公司名",
annual_salary=40, # 年薪万元
passion=PassionScore(
meaning=7, # 意义感 1-10
autonomy=6, # 自主性 1-10
growth=7, # 成长感 1-10
social_energy=5, # 社交滋养 1-10
flow_frequency=4 # 心流频率 1-10
),
work_hours_per_week=48,
commute_hours_per_day=1
)
### 热情维度说明
| 维度 | 问题 |
|---|---|
| meaning | 我觉得这份工作有意义吗? |
| autonomy | 我能主导自己的工作方式吗? |
| growth | 我每天都在进步吗? |
| social_energy | 同事让我更有活力还是更疲惫? |
| flow_frequency | 我常进入忘我的专注状态吗? |
## 输出内容
- 三种排序:热情损耗 / 薪资 / 综合效率
- 每份岗位的详细指标
- 薪资与热情的相关性分析
- 教学提示
## 适用场景
- 职业选择决策辅助
- 心理健康课"职业倦怠预防"模块
- 创新能力课程中的"内在动机"讨论
- 个人年度复盘
## 核心原则
- 所有评分为主观自评
- 不替代决策,只提供视角
- 高薪 ≠ 坏选择,低热情 ≠ 不能选
- 关键是"知情",而非"正确"
七、核心知识点卡片(去营销化)
卡片 1:内在动机与外在动机
- 关键词:Self-Determination Theory、Deci & Ryan
- 要点:外在奖励(金钱)短期有效,内在动机(意义感、自主性)才是创造力的长期燃料
卡片 2:职业倦怠的早期信号
- 关键词:Maslach Burnout Inventory、情感耗竭
- 要点:热情损耗先于身体症状出现,是更早、更敏感的预警指标
卡片 3:多维度决策模型
- 关键词:加权评分、价值观澄清、知情选择
- 要点:好决策不是"选最好的",而是"知道自己选的是什么"
八、总结(工程师视角)
这个程序不是在"劝你别赚钱",而是在悄悄追问一个更深的问题。
技术层面
- 用不到 300 行标准库代码,构建了一个"反主流"的职业评估框架
- 三种排序并列呈现,拒绝"唯一正确答案"
-
"salary_per_passion_unit" 这个指标本身就是一种价值观宣言
心理层面
- 把"上班前的内心感受"从模糊情绪,变成可观察、可记录、可对比的数据
- 帮助使用者从"我是不是不够努力"的 self-blame,转向"我的热情在怎样被消耗"的self-awareness
最终价值
不是告诉你:
"别去大厂,去追梦"
而是给你一个安静的工具,让你在拿到 offer 的那天,能诚实地问自己:
"如果我五年都做这份工作,我的热情账户会怎样?"
答案没有对错——但"看见",本身就是力量。
利用AI解决实际问题如果你觉得这个工具好用,欢迎关注长安牧笛!