猛男养成记之饮食重构

上一篇我们聊了腹肌的架构设计、减脂公式和训练 CRUD。这一篇,聊一个我在「腹肌项目」上线后才发现的线上事故。

outlier 10 分钟 3816 字 1 0
上一篇:《猛男之八块腹肌养成记》

前言:一个程序员的告警

上一篇结尾我说:腹肌是吃出来的。

于是我开始认真地「吃」。为了增肌,每天算蛋白质,鸡蛋、牛奶、牛肉轮番上阵。小时候就有个朴素的认知:外国人为什么那么壮?因为吃牛肉、喝牛奶。长大开始健身,这个认知更坚定了——蛋白质嘛,当然是越多越好。

直到体检报告上弹出一条告警:

[ALERT] serum_uric_acid = 500 μmol/L
threshold = 420 μmol/L
severity  = WARNING

尿酸 500,超过了高尿酸血症常用的诊断界值 420。

作为程序员,我的第一反应是:这个 Bug 是我自己写进去的。 但真正 Debug 下去才发现,问题不是「牛肉吃多了」这么简单,而是——我根本没有一份像样的饮食规划,只是在疯狂堆一个参数。

所以这一篇,痛风只是引子,真正想聊的是:健身的人,到底该怎么规划饮食?


一、先看日志:尿酸是怎么积压的

尿酸的代谢,本质上是一个生产者-消费者模型:

flowchart LR subgraph 生产端["📥 生产端"] A["内源性嘌呤<br/>身体自己代谢<br/>约 80%"] B["外源性嘌呤<br/>吃进去的<br/>约 20%"] end subgraph 消费端["📤 消费端"] F["肾脏排泄 约 2/3"] G["肠道排泄 约 1/3"] end A --> E[("🗄️ 血液尿酸池")] B --> E E --> F E --> G E -->|"生产 > 消费,持续积压"| H["尿酸盐结晶<br/>痛风发作"] style B fill:#ff6b6b,stroke:#333,stroke-width:2px style E fill:#ffd700,stroke:#333,stroke-width:2px style H fill:#ff0000,stroke:#333

💡 划重点:吃进去的嘌呤只占大约两成。遗传、肾脏排泄能力、体重、胰岛素抵抗,这些「基础设施」层面的因素同样关键。所以不能把尿酸 500 全甩锅给牛肉——就像线上出问题不能全怪最后一次提交的那个人。

但饮食是那 20% 里我唯一能自己改的代码,而复盘下来,我的饮食确实有好几个 Bug。


二、需求澄清:增肌到底需要多少蛋白质?

在聊「怎么吃」之前,先把需求文档写对。

我以前的需求是这样的:

需求:增肌
方案:蛋白质越多越好
验收:肌肉变大

这就像写了一个没有上限的 while(true)。正确的需求应该是:

flowchart TB subgraph 依赖["🧩 增肌的四个核心依赖"] A["💪 持续有效的力量训练<br/>核心驱动"] B["🥚 每日总蛋白质够用<br/>1.6–2.2 g/kg"] C["🍚 合理的热量盈余"] D["😴 充足睡眠和恢复"] end A --> M["肌肉增长"] B --> M C --> M D --> M style A fill:#ff6b6b,stroke:#333,stroke-width:2px style B fill:#4ecdc4,stroke:#333,stroke-width:2px style C fill:#45b7d1,stroke:#333,stroke-width:2px style D fill:#96ceb4,stroke:#333,stroke-width:2px style M fill:#00ff00,stroke:#333,stroke-width:2px

对规律做力量训练的人,每天每公斤体重 1.6–2.2 克蛋白质,通常已经足够支持增肌。超过这个区间,边际收益很低——就像给一个不缺内存的服务继续加内存,性能不会再明显提升,账单倒是一直在涨。

def daily_protein_target(weight_kg: float) -> tuple[int, int]:
    """规律力量训练人群的每日蛋白质参考区间(克)"""
    return round(weight_kg * 1.6), round(weight_kg * 2.2)

daily_protein_target(75)  # (120, 165)
蛋白质摄入状态程序员类比
< 1.2 g/kg明显不够服务器内存不足,频繁 OOM
1.6–2.2 g/kg刚刚好资源配置合理,性能达标
远超 2.2 g/kg收益递减疯狂加机器,QPS 没涨,账单涨了

三、饮食架构设计:蛋白质是接口,不是实现

我之前最大的 Bug,是把「补蛋白」硬编码成了「吃牛肉」:

class Protein:
    def source(self):
        return "beef"  # 硬编码,技术债的开始

蛋白质应该是一个接口,背后挂多个实现,按需组合:

flowchart LR P{{"🥩 Protein 接口<br/>每日目标 1.6–2.2 g/kg"}} P --> E["🥚 鸡蛋<br/>性价比之王"] P --> M["🥛 牛奶 / 酸奶<br/>蛋白 + 钙"] P --> C["🍗 鸡胸肉<br/>高蛋白低脂"] P --> F["🐟 鱼类<br/>部分提供 Omega-3"] P --> T["🧈 豆腐 / 豆制品<br/>植物蛋白"] P --> B["🥩 牛肉<br/>铁、锌、B12"] P --> W["🥤 乳清蛋白<br/>补差额的工具"] style P fill:#ffd700,stroke:#333,stroke-width:2px style E fill:#96ceb4,stroke:#333 style M fill:#96ceb4,stroke:#333 style B fill:#ff6b6b,stroke:#333

蛋白质来源对照表

食物大约蛋白质嘌呤水平程序员类比
鸡蛋 1 个~6 g低标准库函数,到处能用
牛奶 250 ml~8 g低轻量级依赖,顺手引入
希腊酸奶 150 g~15 g低好用的工具类
鸡胸肉(熟)100 g~30 g中主力框架,扛大部分流量
鱼(熟)100 g~20 g中(沙丁鱼、凤尾鱼等偏高)性能好,但要挑版本
北豆腐 100 g~12 g中低国产替代,靠谱
瘦牛肉(熟)100 g~26 g中功能强大的第三方库,注意调用频率
乳清蛋白 1 勺~20–25 g低补丁,不是主程序
动物内脏高高已废弃的 API,能不用就不用
数值为大致参考,不同品种、做法差异较大。

蛋白质还有一个容易被忽略的点:分配。一顿塞进去 80 克,和分成 4 顿各 30–40 克,效果不一样。肌肉合成更像是一个有并发上限的处理队列,均匀投递比一次性灌满更高效。


四、实战:一天的饮食排期

以 75 kg 为例,目标定在约 150 g(落在 120–165 g 区间内):

gantt title 一天的蛋白质排期(75kg,目标约 150g) dateFormat HH:mm axisFormat %H:%M todayMarker off section 早餐 ~26g 鸡蛋×2 + 牛奶250ml + 燕麦 :a1, 07:30, 30m section 午餐 ~42g 鸡胸肉120g + 杂粮饭 + 蔬菜 :a2, 12:00, 45m section 练后 ~23g 乳清1勺 + 香蕉 + 大量喝水 :a3, 18:30, 20m section 晚餐 ~46g 鱼150g + 豆腐100g + 蔬菜 + 主食 :a4, 19:30, 45m section 睡前 ~15g 希腊酸奶150g :a5, 22:00, 15m
meals = {
    "早餐": 12 + 8 + 6,   # 鸡蛋×2 + 牛奶 + 燕麦
    "午餐": 37 + 5,       # 鸡胸肉 120g + 主食
    "练后": 22 + 1,       # 乳清 + 香蕉
    "晚餐": 30 + 12 + 4,  # 鱼 + 豆腐 + 主食
    "睡前": 15,           # 希腊酸奶
}
sum(meals.values())  # 152 g ✅ 在 120–165 区间内

牛肉去哪了? 不是删掉,而是降级成「每周两三次」的轮换选项,比如把某天晚餐的鱼换成牛肉。中国居民膳食指南给的参考是:畜禽肉每周 300–500 g,鱼每周 300–500 g,蛋每周 300–350 g。按这个量吃,牛肉完全可以留在菜单里。

饮食配置文件

# diet.v2.yaml
protein:
  target: "1.6–2.2 g/kg"
  per_meal: "20–40 g,分 3–5 顿"
  sources: 多样化                   # 不再硬编码 beef
  red_meat: 每周 2–3 次,控制总量
  processed_meat: 尽量少             # 香肠、培根、火腿

carbs:
  prefer: [糙米, 燕麦, 杂粮, 薯类]
  timing: 训练前后可以适当多一些

fat:
  prefer: [橄榄油, 坚果, 鱼类]

veggies_fruits: 每餐都有蔬菜,水果吃整个不喝果汁

hydration:
  daily: 全天足量喝水
  post_workout: 练完先喝水,不是先喝奶茶

blacklist:
  - 动物内脏
  - 浓肉汤 / 火锅汤底
  - 啤酒和烈酒
  - 含糖饮料

🎯 Joey 的血泪教训:我以前练完一身汗,水没喝几口,先来一瓶冰可乐「奖励自己」。后来才知道:脱水会让尿酸排得更慢,含果糖的饮料会让尿酸产得更多——等于同时「加大生产、降低消费」,队列不爆才怪。


五、常见 Bug 与 Debug 指南

Bug 1:蛋白质越多越好

flowchart TD A["今天蛋白质吃够了吗?"] --> B{"达到 1.6 g/kg 了吗?"} B -->|"没有"| C["补齐:优先鸡蛋、奶、<br/>鸡肉、豆制品"] B -->|"达到了"| D{"超过 2.2 g/kg 了吗?"} D -->|"没有"| E["✅ 刚刚好,去练吧"] D -->|"超过很多"| F["❌ 收益递减<br/>把预算分给蔬菜、碳水、睡眠"] style E fill:#4ecdc4,stroke:#333 style F fill:#ff6b6b,stroke:#333

Bug 2:只靠一种食物补蛋白

原因:单一依赖。牛肉吃多了,嘌呤、饱和脂肪一起上来;而且天天吃牛肉,鱼、豆、蔬菜、全谷物都被挤出去了。

解决方案:多源化。参考上面的对照表,每天至少挑 3–4 种来源轮换。

Bug 3:一顿补齐全天蛋白

原因:白天忙着写代码,晚上一顿吃两斤肉。

解决方案:分 3–5 顿,每顿 20–40 g。早餐最容易缺,几个鸡蛋加一杯奶就能补上二十多克。

Bug 4:只监控肌肉,不监控代谢

原因:体重、围度、卧推重量每周都记;尿酸、血脂、血糖、肝肾功能从来不看。

解决方案:补监控。

# metabolic-alerts.yaml
- alert: UricAcidHigh
  expr: serum_uric_acid > 420   # μmol/L
  action: 调整饮食,找医生评估
- alert: AnnualCheckup
  expr: days_since_last_blood_test > 365
  action: 复查 尿酸 / 血脂 / 血糖 / 肝肾功能
顺带一说:IARC(世卫组织下属的国际癌症研究机构)把加工肉列为 1 类致癌物,红肉列为 2A 类。这个分类表示的是证据有多确定,不是危险有多大——不是吃一口就致癌,问题在长期大量摄入。

六、平台兼容性:同一份代码,跑在不同的运行时

Debug 尿酸的时候顺便学到一个很有意思的知识:很多疾病有明显的性别差异。 痛风就是典型:绝经前女性的雌激素能促进尿酸排泄,相当于运行时自带了一个「消费端加速器」,男性没有这个默认配置。

男性明显更容易患的疾病

疾病男女发病差异主要原因
痛风男性约为女性的 2–4 倍雌激素促进尿酸排泄
肾结石约 1.5–2 倍代谢及尿液成分差异
帕金森病约 1.5 倍激素、神经保护机制差异
食管癌约 2–4 倍饮酒、吸烟及其他因素
肝癌约 2–3 倍激素、代谢及生活方式
胃癌约 1.5–2 倍环境、饮食及生物学因素
冠心病男性较早发病,绝经前女性风险较低雌激素及心血管代谢差异
腹主动脉瘤约 4–6 倍血管结构及吸烟等因素
睡眠呼吸暂停男性更常见上气道结构及脂肪分布
肺癌男性总体较高(各国差异大)历史吸烟率及环境暴露

女性反而更容易患的疾病

疾病女性风险特点
骨质疏松明显更高,尤其绝经后
类风湿关节炎约为男性的 2–3 倍
系统性红斑狼疮约为男性的 9 倍
甲状腺疾病明显更常见
多发性硬化症更常见
偏头痛约为男性的 2–3 倍
倍数为大致范围,不同国家、人群和统计口径会有差异。
flowchart LR U["同一份饮食和训练代码"] --> M["👨 男性运行时"] U --> W["👩 女性运行时"] M --> M1["重点监控:<br/>尿酸、血脂血压<br/>饮酒对肝的影响<br/>体重与睡眠呼吸"] W --> W1["重点监控:<br/>骨密度、钙和维生素 D<br/>甲状腺功能<br/>绝经前后的变化"] style M fill:#45b7d1,stroke:#333,stroke-width:2px style W fill:#ff6b6b,stroke:#333,stroke-width:2px

对健身的人来说,这张表的意义是:别人的最佳实践,不一定能直接复制粘贴到你的环境里。

  • 男生:尿酸、血压血脂、酒精,是需要重点监控的指标;体重控制好,对睡眠呼吸暂停也有帮助。
  • 女生:力量训练对骨密度是实打实的好消息,再配合足够的钙和维生素 D,等于提前给骨质疏松打补丁。
  • 至于自身免疫类疾病,饮食和训练管不了太多,定期体检、有症状及时就医才是正解。

七、终极问题:我们到底在练一个什么样的身体?

上一篇我把腹肌当成「最终产出」。尿酸 500 之后,我开始怀疑这个需求定义本身。

做过系统设计的人都知道,需求分两种:功能需求和非功能需求。

腹肌、胸肌、倒三角,这些是功能需求——用户(镜子、朋友圈)一眼就能看到。但一个系统好不好,往往取决于那些看不见的非功能需求:

flowchart TB subgraph 功能需求["🎯 功能需求:看得见的"] A["腹肌"] B["肌肉围度"] C["体脂率"] end subgraph 非功能需求["⚙️ 非功能需求:看不见但更重要"] D["性能:力量、心肺耐力"] E["可用性:不受伤,关节灵活"] F["稳定性:尿酸、血脂、血糖、血压"] G["可维护性:睡眠、恢复、情绪"] H["可扩展性:老了还能爬楼、搬东西"] end 功能需求 --> S["一个好的身体"] 非功能需求 --> S style S fill:#00ff00,stroke:#333,stroke-width:2px style F fill:#ffd700,stroke:#333,stroke-width:2px
维度身体上对应什么程序员类比
性能力量、心肺耐力QPS 和响应时间
可用性不受伤、关节灵活全年 99.9% 在线,不宕机
稳定性尿酸、血脂、血糖、血压都在正常区间监控面板一片绿
可维护性睡得好、恢复快、情绪稳代码好读好改,不靠加班续命
可扩展性年纪大了还有足够的肌肉和骨量架构能扛住十年后的业务量

一个只有腹肌、但尿酸 500、天天腰疼、睡不好觉的身体,就像一个 Demo 做得很漂亮、但一上生产就报警的系统。

能跑通不代表没问题,单项指标好看也不代表系统健康。


八、写在最后

小时候觉得外国人壮,是因为他们吃牛肉、喝牛奶。

现在才明白,牛肉确实是好东西,但好东西也要讲究用量;蛋白质确实很重要,但它只是增肌的四个依赖之一。

作为一个程序员,这次我给自己的身体重新写了一份需求文档:

  • 饮食是输入数据:不只要够,还要多样,垃圾进垃圾出
  • 训练是算法优化:持续迭代,但别把系统跑崩
  • 睡眠是内存清理:省不得
  • 体检是监控告警:别等线上出事才看面板
  • 身体是长期项目:不追求一次发版,追求十年稳定运行

最后送你一句话:

健身不是把自己吃成一头牛,而是让自己拥有一个更好的身体。

腹肌是给别人看的,代谢指标是给自己看的。增肌很重要,但健康才是长期主义。

如果你看完觉得太麻烦想放弃,没关系——毕竟这个系列叫「从入门到放弃」。但如果你真想练出一个又好看又好用的身体,记住:

每一次想用可乐「奖励自己」的时候,想想你的尿酸;每一次想一顿吃两斤肉的时候,想想你的肾。

我们健身房见!💪

本文仅为个人经验分享,不构成医疗建议。尿酸明显偏高或出现关节红肿疼痛,请及时就医。

评论

还没有评论,来说点什么吧。

发表评论

Ctrl + Enter 快速提交
Enter 搜索Esc 关闭