2025-08-02 08:00:00
看到有不少人推荐这本书,就把它放到了待看列表里,最后是哭着看完的。
这本书的书名并没有夸大其词,作者 特雷弗·诺亚 的出身在当时就是一种罪:在种族隔离时期的南非,他的白人父亲(瑞士-德国裔)和黑人母亲(科萨族)之间的结合是违法的。特雷弗因此被归类为“有色人种”,在一个严格实行种族隔离的社会中,他不属于任何一个阵营。
这本书的核心是诺亚与他母亲帕特里夏的深厚关系(看的过程中我总是会想到史铁生的《我与地坛》)。她是一位极具韧性、虔诚且思想独立的女性,用智慧、幽默和坚定的爱武装特雷弗,教他如何利用语言和思想去打破种族和社会的壁垒。因为他的特殊身份,加上淘气的天性,结合南非当时的社会环境,让他的童年和青少年总是在滑稽可笑和惊心动魄之间切换:被母亲从行驶的汽车中扔出以躲避危险;在不同社区间利用语言优势游刃有余;从经营盗版CD生意,到与家暴的继父斗争等等。
他能够相对平和地度过童年和青少年,并以健康的身心进入成年,在事业上取得成功,他的妈妈功不可没。她在一个传统的黑人家庭长大,却从小就展现出非凡的独立和反叛精神。她拒绝被传统的性别角色和社会期望所束缚,坚持学习打字,成为了一名秘书——这在当时对于黑人女性而言是极不寻常的。正是这种精神,让她敢于与一个白人男子建立关系并生下孩子。她也深知,要让儿子在这样一个扭曲的社会中生存下去,必须赋予他最强大的武器——知识和语言。她坚持让特雷弗学习英语作为母语,因为她认为英语是通向更广阔世界、获取知识和财富的钥匙。同时,她也确保他学习南非的多种语言,如科萨语、祖鲁语和南非荷兰语。她用一种独特的方式教育特雷弗。她带他去白人社区、黑人社区和有色人种社区,让他亲身体验不同世界的规则。她用幽默化解生活的苦难,用坚定的信仰作为精神支柱。
母亲的远见很快得到了验证。在一个由种族决定一切的国度里,语言成为了特雷弗的“变色龙”皮肤。他发现,只要他能说对方的语言,就能在瞬间打破隔阂,获得认同。当一群祖鲁族男孩准备抢劫他时,他用流利的祖鲁语与他们交谈,对方立刻将他视为“自己人”,从而化解了危机。这个经历让他深刻理解到:“语言,比肤色更能定义你的归属。” 他凭借这项技能,在不同种族群体之间游走,既不完全属于任何一方,又能与各方建立联系。
身为局外人,你可以缩进壳里,默默无闻,让别人看不到你,或者你可以走上另一条路。你通过敞开自己的方式,从而保护自己。你不用因为自己是谁而希望被某个小团体接纳,你只要愿意分享自己的一小部分就可以了。对我来说,那部分就是幽默。我了解到,即使我不属于任何一个小群体,但我可以融入所有正在开怀大笑的小团体里面。我会突然出现,分发零食,讲几个笑话。我可以取悦他们,参与他们的一小部分对话,了解一点儿他们的圈子,然后转身离开。我从来不会在哪个圈子里停留过久。我并不受欢迎,但我也不会被排斥。我可以在任何地方,和任何人打交道,与此同时,我又完全是孤单一人。
但随着继父亚伯的到来,特雷弗的家庭生活开始笼罩在恐惧的阴影之下。亚伯不仅对帕特里夏进行身体和情感上的虐待,也与日渐成长的特雷弗关系紧张。亚伯代表了南非社会中大男子主义和父权文化的毒瘤。他无法容忍帕特里夏的独立和坚强,试图用暴力来维护自己的“权威”。特雷弗亲眼目睹了母亲所承受的痛苦,这让他对暴力和家庭关系有了早熟而深刻的认识。他与亚伯之间的冲突不断升级,最终导致他决定搬出去独立生活。
看到这里时,我其实也有跟特雷弗一样的疑惑,为什么不离开?答案其实很简单:离开之后,去哪儿?
从外人的角度指责这个女人,说“你走不就行了”,实在太容易。我的家庭并不是唯—一个发生过家暴的家庭。在我的成长过程中,周围经常有这样的事。在索韦托的街道上,在电视里,电影里,我看到过无数次家暴。如果这是社会范例,那一个女人能去哪儿?当警察都不肯帮她的时候,当她自己的家人都不肯帮她的时候,她能去哪儿?离开那个打他的男人,找到第二个男人很可能还是会打她,而且比第一个更凶的时候,她能去哪儿呢?当一个女人带着三个孩子,而周围的社会会给没有丈夫的女人打上贱民的标签时,她能去哪儿呢?当所有人都会觉得她是个荡妇,她能去哪儿呢?她能怎么做呢?
特雷弗离家后,亚伯的暴力变本加厉。他无法接受帕特里夏的离开,最终在她回家的路上开枪射中了她。一颗子弹穿过她的腿,另一颗子弹奇迹般地擦过她的头骨后部,从鼻孔穿出,没有伤及大脑和重要血管。
当特雷弗赶到医院,看到幸存下来的母亲时,帕特里夏依然不改其幽默本色,她对儿子开玩笑说:“你看,特雷弗,现在你才是家里长得最好看的人了。” 甚至还说:“至少你现在可以说你妈妈被人‘爆头’了,这在街头很酷。”
这一事件是全书的高潮,也是让我哭着看完的部分,当他接到弟弟打来的电话时,我就感觉到不太妙,他妈应该是出事了,但没想到这么严重,更没想到这种情况下居然还能活下来,而且没什么大碍,可能冥冥之中,上帝也进行了干预吧。
直到今天,也没人能够解释发生的一切。就连警察都不明白。因为那把枪不是不能用。它开过一枪,然后开不了了,然后又开了最后一枪。任何懂一点儿枪支的人都会告诉你,一支9毫米口径的手枪绝对不会像那把枪那样哑火。但是在犯罪现场,警察在车道上用粉笔画了很多小圈,都是亚伯开枪后散落的弹壳,而在他在我妈身旁站立的那个位置上,掉着的是四颗完好无损子弹—没人知道这是为什么。
但好像又干预地不太彻底:
亚伯就这么出来了。案件在法律程序上缓缓推进,但所有事情都开始倒向不利于我们的一边。由于我妈妈奇迹般地躲过了一劫,所以对亚伯的指控只能是谋杀未遂,加上此前亚伯的那些家暴,在我妈报警后并没有留下任何记录,所以亚伯没有犯罪案底。而且,他还请了个好律师,一直在法庭上强调,他家里还有孩子在等着他抚养。结果,这个案子根本没有进入正式的审判环节。亚伯认了谋杀未遂的罪,然后被判了三年缓刑。他一天都没有在监狱里蹲过,并且还继续拥有两个儿子的共同监护权。直到今天,他还在约翰内斯堡的大街上,行动完全自由。我上次听到有关他的消息是,他还住在高地北附近的某个地方,离我母亲的住所不太远。
作者特雷弗从一个在夹缝中求生的孩子,成长为一个懂得利用自己“局外人”身份,观察并解构世界的喜剧演员。他的经历让他能够以一种独特的视角看待种族、权力和社会不公。这本书不仅是他个人的回忆录,更是写给他母亲的一封情书,致敬那位教会他如何思考、如何欢笑、如何在一个试图将他定义为“罪恶”的世界里,骄傲地活出自己的女人。
2025-07-12 08:00:00
家附近有一个叫 35mm 的咖啡馆,以前经常去,某天心血来潮就想,会不会 35mm.coffee 正好是个可以注册的名呢?就上 Cloudflare 上看了下,果然可以,于是就注册了。即然注册了,就想着拿来做点什么,一开始把使用地限制在了 35MM 咖啡馆,也就是只有在那里才能使用,后来又将它改造成了只有晚上才能访问的网站,之后去掉了时间限制,改成可以随时访问的小 Twitter,还是不满意,总觉得少了一个明确的主题。
我是一个创作者,平时喜欢做点小东西,也会接触很多创作相关的内容,但总有种孤独感。回想起一开始入行的时候,学的是 ActionScript,那时经常逛一个论坛,氛围挺好的,自己写了一个什么小程序,或者学到了什么都会在那里分享,也从那里学到了不少,在交流过程中也结识了一些志同道合的朋友。
现在论坛已经成了过去式,创作者能逛的地方更多了,小红书、微博、推特、V2EX、知乎等等,但好像都没有特定主题的社区那种特有的氛围,也少了那种相对深入的、持续的、互相启发式的交流。Discord 其实蛮适合的,但它的封闭性和糟糕的桌面端是很大的问题。我开始思考,35mm.coffee 这个域名,是不是可以成为一个契机,重新找回那种失落的连接感,让它成为一个能让创作者们找到共鸣、答疑解惑、分享经验、甚至共同创作的地方?
35mm 代表着胶片时代经典的视角,一种记录真实、捕捉瞬间的工具。对于创作者而言,我们其实也正是在用自己的方式,记录着、捕捉着这个世界。
在这里,你可以:
最后,希望这个小站能重新找回那种失落的连接感,让创作之路不再孤单。
2025-07-08 08:00:00
大概 4 年前,我注册了一个域名 before.town,因为脑海中忽然闪过「避风塘」,好像正好可以对应英文的 before town,而 town
又可以作为域名的后缀,就搜了一下,果然可以注册,就毫不犹豫地下手了,这一放就是 4 年。
生活中,总是会有一些瞬间,让我们忍不住拿起手机记录下来,但其实也没有太 Special,这些照片你想与别人分享,但好像又不够精致到值得发个朋友圈或 Instagram,于是就只能默默地住在相册里。我有时会想,这些照片它们会不会也想有一个出口呢?
「避风塘」的概念和这些照片好像挺契合的,带着这个想法,我决定让 before.town 成为这些「不够精致」但充满生活气息的照片的避风港。
它不是一个追求完美构图和滤镜的平台,更像是一个数字化的「避风塘」,让那些在主流社交媒体中找不到位置的照片,能够在这里找到一个安静的角落。你可以在这里分享你随手拍下的街角风景、一杯咖啡的特写、或者只是一个不经意的瞬间。它们可能没有华丽的辞藻来描述,也不需要精心的排版,但它们都带着你生活的温度和独特的视角。
最后,欢迎来避风塘分享你的日常 🙃。
2025-06-29 08:00:00
前几天在看跑男,有一个游戏环节是这样的:嘉宾通过努力得到一个笔画,目标文字中如果包含该笔画就会出现。感觉挺有意思的,对它稍加改造,于是就有了这个小游戏:笔画猜成语
游戏机制是这样的:
和周围的人玩了下,还是挺有乐趣的。如果你也感兴趣的话,可以在这里体验哦。
2025-06-28 08:00:00
最近,我通过 Vibe Coding 的方式完成了三个个人项目:
在开发「五子棋」时,由于初次尝试 Vibe Coding,经验不足,踩了不少坑,但最终坚持了下来,算是摸到了一些门路。有了此前的经验,做「笔画猜成语」时更加得心应手,效率也大幅提升,大约只花了 3 天时间,就将一个模糊的想法变成了一个功能完整的 Web App。而「歌曲转视频」项目,更是在 2 个多小时内就产出了可运行的核心脚本。
我最初使用 Cursor,但在看到越来越多的人推荐 Claude Code(以下简称 CC)后,决定一试,结果确实令人惊喜。我的习惯是在 Cursor 的终端里打开 CC,这样 CC 可以直接访问当前项目的文件上下文(当然,在独立的终端里使用也完全可行)。
通过两个简单的例子就能看出 CC 与 Cursor 的能力差异:
重构组件属性:我让 Cursor 移除一个 React 组件中未使用的属性。它的做法是给这个属性一个别名,在前面加上下划线 _
,以此「欺骗」编译器,绕过检查。当我追问该属性是否无用时,它才承认并将其删除,但却忽略了检查调用该组件的其他地方,工作只完成了一半。我撤销修改后,将同样的指令交给 CC,它一次性就完美地完成了任务,干净利落。
代码结构优化:在开发五子棋的禁手功能(黑棋不能走出三三、四四或长连)时,我有一个核心的协调文件 gomoku-ai.ts
。Cursor 的做法是直接将禁手判断的复杂逻辑堆砌到这个协调文件中。而 CC 则展现了更优秀的设计能力,它创建了一个独立的 forbidden-move.ts
文件,专门用于封装所有禁手检测的逻辑,再由 gomoku-ai.ts
进行统一调度,使得代码结构更清晰,职责更分明。
类似的例子还有很多,这让我越来越依赖 CC。Cursor 更像一个初级程序员,优先考虑完成当前任务,对代码质量、复杂度和可维护性的考量不足,倾向于「能加代码就不改代码」。而 CC 在理解意图、分析代码结构以及构建更优代码方面表现更强。当然,它也并非完美,有时也会在「奋战」十分钟后报告任务完成,但却没有解决问题。
我喜欢将 Coding Agent 比作一匹马,这能强化我们对其「驾驭」和「驯服」的过程。不同的马有不同的脾性与能力(所以摸清每个 Agent 的能力圈很重要),选择一匹既强大又易于驾驭的马,才能事半功倍。以下是我总结的一些通用技巧:
在开发五子棋 Web App 时,我犯了一个错误。在 v0.dev 上设计好页面后,就把整个实现任务直接丢给了 Agent,以为五子棋算法早已成熟,AI 肯定了然于胸,加上最终的目标界面,应该很快就能做完,结果却不尽人意。
我耐着性子,以产品经理和 QA 的身份不断提出修改意见。噩梦从此开始:AI 修复一个 Bug 的同时,往往会引入新的 Bug,或是让之前修复过的问题重现,陷入「按下葫芦起了瓢」的循环。
检查代码后我发现,AI(当时使用的还是 Cursor) 写的算法冗长复杂、职责不清,上百个测试用例中充斥着大量敷衍了事的断言(比如只检查返回值是不是布尔类型,而不关心是 true
还是 false
)。基于这样的代码迭代无异于在沙地上盖楼。
最终,我决定放弃原有算法,从一个成熟的开源项目中剥离出经过验证的五子棋算法,然后让 CC 将其整合进现有项目——相当于给汽车换了个引擎,问题迎刃而解。
吸取教训后,在做「笔画猜成语」时,我首先对目标进行了细致的拆解。
如图所示,页面的核心是成语笔画展示区。这意味着我需要一个组件,它能接受一个汉字和对应的笔画序号,并使用 SVG 数据将其绘制出来。我的第一个子任务就是寻找一个合适的汉字笔画库,并让 Agent 基于这个库构建出核心组件。
任务分解还能带来意想不到的好处:掌控感、大局观和节奏感。
Agent 并不总能选择最佳实现路径,如果不加干预,可能会在错误的方向上浪费大量时间和 Token。例如,在生成带注音和翻译的歌词图片时,我希望实现这样的效果:
CC 最初的方案是使用 sharp
配合 canvas
绘制,这不仅实现复杂,效果也未必理想。此时就需要人为干预,我给出的策略是:利用无头浏览器渲染一个包含 ruby
标签(HTML 原生支持注音)的页面,然后对该页面进行截图,这个方案更简单、效果也更好。
Review 同样至关重要,尤其是在商业项目中。在做「笔画猜成语」时,我要求每天提供一个固定的新成语。Agent 实现时用了一个简单的哈希算法,导致每天的成语都非常相近(如昨天是「坐享其成」,今天是「坐井观天」)。如果没 Review,这个问题可能只有上线后才能发现。我让它改进,它又手动实现了一个伪随机算法。我再次给出 Input,让它使用 seedrandom
这个成熟的库来确保高质量的伪随机性。
如果 CC 尝试了 5 次左右仍未完成任务,或者在执行一个明确的任务时消耗了大量时间却最终失败,就需要立即干预。这通常意味着任务粒度过粗、描述不清、AI 的策略有问题或者当前项目复杂度太高。 如果任务分解地很好,这种情况发生的概率不高,但一旦发生,很有可能会把之前节省下来的时间都还回去···。
CC 支持一个非常实用的「计划模式」。在执行一个有难度的任务前,可以让它先拟定一份行动计划。只有在你确认计划可行后,它才会开始实施,这极大地提高了复杂任务的成功率。
过去,我们常因耗时费力而忽略一些重要的开发实践,如编写测试或使用 Storybook。但现在,Agent 以其不知疲倦的特性,让这些「最佳实践」的落地变得轻而易举。测试驱动开发(TDD)等过去只存在于书本中的理念,现在完全可以在 Agent 的协助下融入日常开发流程。
「日文歌曲转成带翻译的视频」这个 Project 我其实酝酿了蛮久的,如何实现也有大概的思路,但一想到要手动去实现里面的代码,要去熟悉 ffmpeg
的调用,还是会下意识地去拖延。但 CC 大大降低了我创建这个项目的阻力,虽然还是需要花一点时间描述清楚这个项目,对其进行分解,但相比自己去实现已经方便了很多。
我还记得当时是 10 点左右,我想测试下「笔画猜成语」在 0 点时能否正常切换到新一天的成语,既然还有两个小时,不如就来做这个项目吧,结果真的在 12 点多,就把它做出来了。
这便是 AI Agent 的魅力,它将那些看似遥不可及的「Someday」,变成了触手可及的「Today」。 那些曾经因为技术门槛、因为预想中的繁琐而搁置的想法,如今有了一个快速验证的通道。从一个模糊的概念到看得见、摸得着、能分享给朋友的作品。
在这个访谈视频中,极限编程(XP)之父、《测试驱动开发》作者 Kent Beck,一位拥有 52 年编程经验的传奇程序员,分享了他对 AI 时代程序员能力转变的看法。他将 AI 编程工具比作一个「难以预测的精灵」 [06:44],它能实现你的愿望,但结果未必如你所想。
他的一段话精辟地总结了 Vibe Coding 「迫使」程序员做出的改变[01:12:42]:
I had this tweet two years ago where I said “90% of my skills just went to zero dollars and 10% of my skills just went up 1000x”. And this is exactly what I’m talking about - having a vision, being able to set milestones towards that vision, keeping track of a design to maintain or control the levels of complexity as you go forward. Those are hugely leveraged skills now compared to knowing where to put the ampersands and the stars and the brackets in Rust.
我两年前的一条推里说「我的 90% 的技能价值归零,而 10% 的技能价值增长了 1000 倍」。这正是我所说的——拥有一个愿景,能够为这个愿景设定里程碑,并在前进过程中跟踪设计以控制复杂性。与知道在 Rust 中如何放置符号和括号相比,这些才是现在被极度放大的核心技能。
这里的「迫使」是积极的。Agent 的出现,将程序员从繁琐的具体代码实现中解放出来,让我们能像 Kent Beck 所说的那样,去思考「真正宏大的想法」 [01:13:36]。我们的核心竞争力不再是写代码的速度或对语言语法的熟练度,而是产品感、架构能力、任务拆解能力和战略眼光。
编程的本质正在回归——将复杂的问题,分解成计算机可以理解并执行的简单步骤。只不过这一次,我们操作的「计算机」拥有了更强的理解力和执行力。这要求我们站得更高,看得更远,专注于创造真正的价值。
2025-06-23 08:00:00
萌生出做这个 App 的念头源于一个非常朴素的需求:我想在干活时,放一些舒服的背景音乐。这个需求有很多现成的解决方案,但没有太满意的。我希望它是
论曲库的话,YouTube 是最全的,Lofi、钢琴曲、Jazz 等等,只要愿意花点时间,总能找到满意的,听腻了的话,也很容易找到新的。但我不想打开 YouTube,一个是不够方便,另外就是干扰因素太多,还容易被推荐视频吸引而掉进兔子洞。
于是我就想,不如做一个可以播放 YouTube Playlist 的 Mac App 吧,这就是 LimTube 这个 Mac App 的创作初衷。
既然能添加 Playlist 了,我也会顺手把 YouTube 上感兴趣的 List 加进来,省的每次都要打开 YouTube。那既然 Playlist 可以添加,Channels 不加好像也说不过去,于是就变成了这样。
自己用了一段时间,感觉还是挺方便的,如果你也有类似的需求,欢迎使用和反馈。