写代码写了这么多年,我一直觉得编程和生活是两个完全不相干的世界。直到最近读了《模仿欲望》这篇文章,我才恍然大悟:原来我的生活,早就被写进了别人的代码里。
vx公众号:TSing_addiction
01. 我们都在implements一个看不见的接口
做TypeScript开发的人都知道,interface是定义一个对象"应该长什么样"的蓝图。我们常常这样写:
ts
interface IdealLife {
fancyCar: boolean;
luxuryWatch: boolean;
weekendTravel: boolean;
perfectSkin: boolean;
}
然后我们拼命让自己去"实现"这个接口,买各种东西,去各种地方打卡,仿佛不这样就不是个"合格的对象"。
上周我刷小红书,看到一个和我同龄的博主展示他的"程序员精致生活":苹果全家桶、最新款机械键盘、咖啡店远程工作照。我的第一反应不是"这很酷",而是"我怎么没有这些"。那一刻,我突然意识到:我正在试图implements一个从未明确定义、却无处不在的社会接口。
最可怕的是,这个接口不是写在代码里的,而是通过算法悄悄注入到我们脑海中的。就像TypeScript的类型推断,我们甚至没有意识到自己正在被定义。
02. 闭包里的无限循环
在编程中,闭包是指函数记住并访问它的词法作用域,即使这个函数在其作用域外执行。这听起来很技术,但其实我们每天都在经历:
那天晚上,我本来只想刷5分钟抖音,结果两小时后才放下手机。算法给我推荐了第一个露营视频,我点了赞;然后是第二个、第三个...每一个互动都被记住,用来决定下一个推荐什么。我就这样被困在一个闭包里,不断循环,无法跳出。
就像这段代码:
ts
let timeSpent = 0;
function scrollFeed() {
timeSpent += 15; // 每次刷15分钟
if (timeSpent < 120) { // 两小时后才意识到
scrollFeed();
} else {
console.log("天啊,已经凌晨1点了!");
}
}
我们的注意力就这样被算法捕获,形成一个完美的闭包,而我们甚至不知道自己被困住了。
03. "精致穷"就像危险的类型断言
做前端开发的都知道,TypeScript中有一种操作叫类型断言------你告诉编译器:"相信我,这个变量就是这个类型"。有时候这很危险,特别是当你断言一个不可能的类型时。
ts
// 明知工资不高,却断言自己能过上博主的生活
const myWallet = { balance: 5000 } as LuxuryLifestyleWallet;
在编译阶段(发朋友圈时),一切看起来完美无缺。但到了运行时(月底交房租时),就会抛出一个残酷的错误:Uncaught BalanceError: Insufficient funds for projected lifestyle。
我有个朋友就是这样。他月薪1万,却买了3万的相机,理由是"博主都用这个"。结果是接下来三个月天天吃泡面。这不就是把BudgetReality强行断言为InfluencerBudget的后果吗?
04. 职场内卷:递归函数没有退出条件
在编程中,递归是很强大的工具,但必须有明确的退出条件,否则会导致栈溢出。现在想想,职场内卷不就是这样一个没有退出条件的递归函数吗?
ts
function workHarder(colleagues) {
// 看到同事加班
const maxOvertime = colleagues.reduce((max, c) =>
Math.max(max, c.overtimeHours), 0);
// 于是你也加更长时间的班
myOvertimeHours = maxOvertime + 1;
// 但没有人问:为什么要加班?
return workHarder(updatedColleaguesList);
// 没有退出条件,直到精神崩溃
}
我们团队就有这样的情况。一开始只有一两个人晚走,渐渐地,七点下班变成了常态,然后是八点、九点...没有人明确要求这样,但就像递归函数没有base case,我们陷入了无限循环。
最讽刺的是,项目进度并没有因此加快多少。就像算法复杂度,我们的努力是O(n²),但产出只是O(n)。这种内卷,本质上就是一段写得很烂的代码。
05. 重写人生代码
意识到这些问题后,我开始尝试"重构"自己的生活代码。这不是件容易事,就像重构一个老旧的系统,处处都是隐患。
首先是依赖注入的问题。以前我的消费决策严重依赖外部注入:小红书推荐、博主种草、同事攀比。现在我尝试这样写:
ts
class MyLife {
private coreValues = ['growth', 'health', 'authenticity'];
decidePurchase(item: any): boolean {
// 不再依赖外部注入
return this.coreValues.includes(item.value) &&
this.budget.allows(item.price);
}
}
其次是打破那个闭包。我给自己装了个屏幕时间管理app,设置每天刷短视频不超过30分钟。第一次看到自己一天刷了4小时短视频时,我惊呆了。这就像在调试时突然看到一个函数被调用了几百次------你必须找出为什么循环停不下来。
还有很重要的一点:接受自己不是泛型。TypeScript中有泛型,可以适配各种类型。但生活不是代码,我们不必成为"通用模板"。我开始允许自己:
- 用便宜的键盘写代码(只要它好用)
- 周末在家休息而不是去网红地点打卡
- 穿舒适的衣服而不是"程序员该穿"的潮牌
06. 从any到明确类型
TypeScript最强大的功能之一,就是将JavaScript的"any"世界变成明确类型的系统。我们的人生也需要这样的转变------从"别人怎么做我也怎么做"(any)到"这是我真正想要的"(明确类型)。
以前,我的消费决定就像这样:
ts
// 以前的我
let wantToBuy: any = trendingOnXiaohongshu;
现在,我尝试这样:
ts
// 现在的我
let wantToBuy: unknown = trendingOnXiaohongshu;
function isRealNeed(item: unknown): item is GenuineNeed {
return (
typeof item === 'object' &&
'solvesMyActualProblem' in item &&
item.solvesMyActualProblem
);
}
if (isRealNeed(wantToBuy)) {
buy(wantToBuy);
} else {
ignore(wantToBuy);
}
这种转变并不容易。有时候看到同事换了新手机,我还是会心动;刷到精致生活的内容,依然会感到焦虑。但至少现在,我有了一个"类型守卫"来检查这些欲望是否真实。
最后
作为一个程序员,我习惯了相信代码是理性的、有逻辑的。但我没想到,我们的欲望和行为,也早已被写入了某种看不见的代码中。
这篇文章不是要批判所有消费或所有社交媒体的使用。就像代码本身没有好坏,关键是谁在控制它,以及它服务于什么目的。
当我开始用程序员的眼睛观察生活,我发现自己不再那么容易被算法操控。当我看到小红书推送"必买清单",我会想:"这是callback hell,我不能陷入这个异步循环。"当同事炫耀新买的奢侈品,我会提醒自己:"不要进行不安全的类型断言。"
或许,理解这些"代码"就是夺回控制权的第一步。就像我们重构一段混乱的代码,生活也可以被重构成更真实、更符合自己核心价值观的样子。
下次当你想买一个东西、做一个重要决定,或者感到莫名焦虑时,不妨问自己:这真的是我的需求,还是我在implements别人的接口?我的人生代码,到底是谁在编写?
写完这篇文章,我要去关掉手机通知,好好享受一个没有算法干扰的周末。毕竟,最好的代码,是能服务于人,而不是让人服务于它的代码。