大家好,这里是最佳拍档,我是大飞。一个只占几百K内存的小工具,静静地运行在全球超过两百亿台设备上。这个数字什么概念呢?地球上的人口也就八十多亿,也就是说人均分到两三台。从你手里的iPhone、安卓手机,到Windows、Linux、macOS这些操作系统;从任天堂Switch、Xbox、PS5这些游戏机,到智能手表、汽车、打印机;甚至智能厨房、医疗设备、机器人。你能想到的几乎所有带网络功能的设备里面,都有它的身影。
它甚至运行在两个星球上:地球和火星。2021年,它随着毅力号火星车一起登陆了火星。这个工具叫cURL,说白了就是一个命令行网络数据传输工具,用来在各种协议之间发送和接收数据。它的作者——瑞典程序员丹尼尔·斯滕伯格(Daniel Stenberg),用了接近三十年的时间,把一个不起眼的小工具打磨成了世界上最流行的软件。从最初大约一百行代码,到现在十八万行。
期间有一千四百名作者参与过贡献,另有三千五百人出现在致谢名单里。但是,开发了这样一个无处不在的工具的人,不仅没有因此过上什么人生赢家的生活,甚至还收到过死亡威胁。今天就来聊聊这段故事。在FOSDEM大会上,丹尼尔讲述了他和cURL的故事,以及开源项目在AI时代面临的全新挑战。
FOSDEM是欧洲最大的开源开发者大会,每年在布鲁塞尔举办。这场演讲的标题叫“开源与AI的博弈”。这是丹尼尔第十六次在FOSDEM上台演讲了。光从这个数字你就能感受到他坚持了多久。要理解cURL的故事,得从最初的需求说起:cURL的诞生,最初只是为了满足一个再普通不过的小需求。
丹尼尔想写个自动脚本,从某个网站上自动下载汇率数据。对于上世纪九十年代的瑞典金融行业来说,汇率数据的实时获取是一个非常实际的需求。和大多数程序员一样,他没有从零开始造轮子,而是在网上找了一个叫httpget的开源项目,用得不亦乐乎。
httpget顾名思义,就是一个用HTTP协议从网上获取数据的命令行小工具。为了让它更好用,丹尼尔陆续给这个项目增加了对Gopher和FTP协议的支持。Gopher是早期互联网的一种信息检索协议,比万维网还早出现几年,后来逐渐被HTTP取代了。FTP则是文件传输协议,用来在网络上传输文件。这两个协议的支持让这个小工具的能力范围一下子宽了不少。
后来丹尼尔顺势接管了该项目,成为了维护者。随着功能越来越多,继续叫httpget就显得不够准确了,因为它已经不只是HTTP了。1998年,丹尼尔正式将项目改名为cURL,“C”代表Client(客户端),“URL”就是统一资源定位符,合在一起就是“客户端URL工具”的意思。那一年,cURL仅有三百次下载,但丹尼尔觉得这已经酷毙了,因为三百个用户已经远远超过了他的朋友数量。
当时的丹尼尔完全没有什么改变世界的野心,他的数学甚至算得很“可爱”:两年有了三百个用户,那再过二十年,岂不就能有三千个用户了?现在回头看,这个估算差了大概好几个数量级。那一个三百次下载的项目,后来凭什么走到两百亿台设备上呢?
我相信很多人都会好奇这个问题。当cURL取得巨大成功之后,不少人问丹尼尔究竟凭什么?他的回答非常朴素:“我只是投入了更多的时间。”这句话听起来简单,但背后的代价不是每个人都能承受的。很少有项目能一夜爆红,开源世界里最不缺的就是创意和同类软件。要做到脱颖而出,靠的不是天赋异禀,而是日复一日的投入。
每个人都有家庭和生活,要把时间留给开源,就必须牺牲其他东西。比如,丹尼尔从来不玩电脑游戏,他把节省出来的所有闲暇时间都砸在了cURL上。对于一个程序员来说,完全不碰游戏这件事本身,就需要不小的克制力。在cURL还不出名的时候,大部分时间只有丹尼尔一个人在默默开发。
那种孤独,就像在黑夜中独自漫长地行走:没有人评论、没有人反馈、没有人告诉你这个东西到底有没有价值。你甚至不知道有没有人在用。日复一日地写代码、修Bug、发版本,回应你的只有沉默。为了给项目增加一点人气,甚至发生过一件让人心酸又好笑的事:丹尼尔曾假装成其他用户,给自己的项目提交PR(Pull Request),热切期盼能有路人来评论互动。
你能想象那个画面吗?一个人自己给自己写代码提交,然后满心期待地等着有没有人来评论。但大多数时候依然无人问津,丹尼尔只能默默切回主账号,自己把请求合并,然后继续往前走。这个画面其实挺让人感慨的:一个后来影响了全球基础设施的项目,早期连个互动的人都没有。
这也不禁让人想起早期的腾讯QQ:马化腾假扮女生陪用户聊天,一个人撑起一片社区的感觉。很多伟大的东西,在起点上都是这样孤独的。一个人默默坚持是一回事,但是当你的软件跑在全球两百亿台设备上的时候,责任就是完全另一回事了。任何软件都有漏洞,这很正常;没有不存在漏洞的软件。
但对于一个安装量超过两百亿次的软件来说,任何一个哪怕极小的安全漏洞,都可能引发全球性的基础设施危机。想想看:全球的银行系统、医疗设备、汽车导航里面都可能跑着cURL,一个漏洞影响的可能就是数以亿计的设备和用户。丹尼尔坦言,当严重漏洞出现的时候,他经常焦虑得夜晚难以入睡。
这是他自己的软件,他必须扛起这份责任,没有别人可以替他扛。cURL的安全团队有七个人,每次收到安全报告,胃里都会涌起一阵不好的预感:“是不是又有坏事了?”为了把风险降到最低,丹尼尔建立了一套极其严苛的品质保障体系:包括编写极具可读性的代码(让别人更容易审查和理解)、撰写极其完善的文档(确保每一个功能的行为都有据可查)。
进行浩瀚如海的单元测试,覆盖各种使用场景和边界条件;使用各种现代化工具进行静态分析(在不运行代码的情况下扫描出潜在的代码缺陷);引入高强度的Fuzzing测试,通过向程序输入大量随机甚至畸形的数据来发现潜在漏洞。还设立了漏洞赏金计划:严重漏洞奖励一万美元,低危漏洞奖励五百美元。
他拿出真金白银,鼓励安全人员认真找漏洞。但是到了2026年(注:原文如此),丹尼尔不得不宣布关闭了这个赏金计划。原因不是没钱,而是AI。这是他在FOSDEM演讲中花最大篇幅讲的一个主题:AI工具让提交漏洞报告的门槛降到了几乎为零。
过去,一个人要报告安全漏洞,得花好几个小时深入研究代码、复现问题、编写报告。这本身就形成了一道天然的筛选门槛。但是现在,只需要对AI说一句“帮我找找这个项目的安全漏洞”,几秒钟就能生成一份看起来非常专业的报告,然后直接提交。丹尼尔说:“以前六份报告里大概有一份是真的,现在二十份到三十份里才有一份是准确的。”
2025年底到2026年初,AI生成的报告一度占到所有提交的30%到70%。他甚至给这种现象起了个名字,叫“恐怖式报告”(terror reporting),因为那种感觉就像被源源不断的垃圾信息轰炸,让人精疲力竭。丹尼尔在台上展示了一个让他印象深刻的案例:2025年5月,有人提交了一份关于HTTP/3流依赖循环漏洞的报告。
标题标着“严重”,报告内容长达五百多行,包含完整的环境搭建步骤、漏洞利用代码、GDB调试会话的截图、寄存器数据分析、内存损坏证据。从外行角度看,这份报告简直天衣无缝,像一部精心制作的刑侦剧一样。但是丹尼尔花了不少时间仔细一看,发现了问题:报告里说在某个函数上设了断点然后运行,但是那个函数根本不存在。
整个GDB调试会话是完全编造的,寄存器里的内容也对不上。所有声称发生的事情从未真正发生过:五百多行报告,从头到尾全是虚构的。提交者自己也不知道这些是真是假,他只是把AI生成的结果直接发了过来。这件事让丹尼尔后来形成了一个习惯:收到长报告后不再花时间通读,而是先反问对方几个问题,让对方用十行以内的话解释清楚。
因为一旦追问,AI生成的回答就会暴露:它会用极其礼貌的语气说“你说得完全正确,我搞错了。非常抱歉。”然后再生成两百行新的废话。那怎么判断一份报告是不是AI生成的呢?丹尼尔总结了几个特征:真正的安全研究员提交报告时,通常态度比较强硬,会带着怨气说“你这个Bug太愚蠢了”;而AI生成的报告开头永远是道歉式的,会说“抱歉,但我发现了一个问题”。
人类写作总会有拼写错误和语法瑕疵,AI生成的英语却完美无缺。AI还喜欢用混用大小写的写法;代码示例里会莫名出现emoji;每段后面都跟三个要点。一份报告能写十几段、每段三个要点,这种格式人类基本不会用。最荒唐的是,还有人报告说cURL的Git仓库可以在网页上看到源代码(这是严重安全漏洞)。
因为AI被训练过,知道可以用file协议访问本地文件,所以就把这种正常功能也当成了漏洞反复报告。2026年1月的第一个周一,假期刚结束,丹尼尔打开邮箱发现了七份安全报告。他花了一整天的时间阅读、回复、和提交者争论,这意味着整个团队没法做别的事了。这种过载不仅仅是浪费时间,它实实在在地影响了项目的进度和团队的心理健康。
更严重的是:cURL作为全球基础设施级别的软件,如果维护者因为疲劳和厌倦而变慢或者出错,最终影响的是整个供应链的安全。丹尼尔很直白地说:“这种过载让人怀疑人生。”面对这个问题,很多人给丹尼尔的建议是用AI对抗AI。但丹尼尔不这么看:他说问题不在AI本身,问题在中间那个人——是人决定把AI生成的东西不加验证地提交过来。
不管AI变不变好,人的愚蠢不会改变。只要提交门槛这么低,就会有人继续这么做。所以他在演讲当天正式宣布关闭漏洞赏金计划,断掉金钱激励这条线,看能不能让洪水退一退。不过故事还有另一面:AI对cURL来说也并不全是坏事。丹尼尔在演讲中花了相当篇幅,讲AI工具如何帮到了项目。
他开始使用几款AI驱动的代码分析工具后,已经修复了超过一百个其他工具从未发现的漏洞。这些AI工具能做到一些传统工具做不到的事:比如cURL支持二十九种网络协议,人类审查代码时很难记住每个协议规范的每个细节,但AI可以。有一次AI工具提示说:“这段代码在Telnet协议里使用了八进制252这个值,但Telnet规范规定这是无效的。”
这种跨规范的一致性检查几乎像魔法一样。没有人从2012年以后再翻过Telnet规范了,但AI知道。还有一个很实用的功能:AI能发现代码和代码上方的注释不一致的情况(注释说函数做A,代码实际做了B)。这种不一致往往是Bug的温床。AI还能发现你在其他二十八处都用了一种写法,唯独这里没有,问你为什么?
这些事情人类也能做,但人类做代码审查的时候会累、会走神、会偷懒。而机器不会:凌晨两点你写完代码提交的时候,同事不在,但AI审查机器人却在。丹尼尔用了三个不同的AI审查机器人,有趣的是它们各自发现的bug各不相同:虽然都基于同一类AI,却各有各的盲区和强项。
不过丹尼尔也明确说了:他不觉得AI生成的修复补丁好用,发现问题是AI的强项。但修复代码仍然应该由人类来做:一个有经验的工程师做的修复,质量远好于AI自动生成的。AI生成的补丁从没让他满意过。他也不使用AI来写代码,cURL项目里他(丹尼尔)也不认为有人在用AI写代码。但AI作为提建议的角色,像一个热情的初级工程师给你一堆建议让你挑——好的留下,不好的丢掉就行。
他反复强调:测试用例仍然比AI审查更重要。如果有人用AI生成了一堆垃圾代码提交过来,CI(持续集成)测试会全部飘红,直接关掉就行。除了漏洞报告的问题,AI爬虫也给开源项目带来了巨大的基础设施负担:cURL项目每月承受七十五TB的AI爬虫流量。幸好有CDN赞助商承担了这个成本,但丹尼尔也很清醒地知道:不是所有的项目都有这种待遇。
大量没有赞助的小型开源项目,面对同样的爬虫流量可能直接被拖垮。而他在带宽统计里甚至能看到流量分布,但是因为没有日志和追踪,他也不知道这些爬虫到底在做什么。写代码本身已经够难了,但和代码比起来,和人打交道才是开源维护者面临的最大挑战。随着cURL的项目规模越来越大,各种声音也随之而来:有人指责他选错了编程语言(而且无论选哪种语言都会被骂)。
选C语言有人说太老了,换个语言又会有人说“为什么不选C”。有人抱怨技术太老、太笨、太烂;还有人因为cURL无法解决他们特定的私人问题而大发雷霆,哪怕cURL根本就不是为了解决那种问题而设计的。只要有一点让人不满意,就会有人用极其咄咄逼人的语气提出质问。为了维护一个友好的社区氛围,丹尼尔练就了一套情绪管理法则:回复时先做深呼吸。
如果依然觉得被冒犯或不安,就先放下,绝对不立刻回复。尤其是你一个人花了自己的业余时间维护一个免费给大家用的工具,换来的是劈头盖脸的指责。这种心理落差不是那么容易消化的:开源就是这样,只要一切正常运行绝不会有人夸你一句;可一旦出现一个小漏洞,马上就会有无数人疯狂抱怨。
cURL至今拥有两百亿次安装,但仅有一千四百名作者(贡献者)。这个对比是相当悬殊的:而且大部分人只是提交了一个修复拼写错误的补丁,就再也没出现过。不过偶尔也会有惊艳的开发者突然出现,带着一份对cURL架构理解极深的高质量补丁。这足以让丹尼尔兴奋许久。真正让这件事变得危险甚至荒诞的,是后来发生的一连串事件:为了符合开源协议,丹尼尔把自己的个人邮箱写在了许可证的版权声明页面上。
这在开源圈子里是常规操作,但是引发了一连串让人苦笑不得的奇葩事件:由于cURL被广泛嵌入到各种软件中,许多普通用户在软件报错的时候翻到了版权声明里的邮箱,就把丹尼尔当成了官方万能客服。各种跟cURL本身毫无关系的问题都会发过来:丹尼尔在苦笑之余倒也大为震撼,“原来我的cURL还运行在这么多酷炫的设备里”。
但最可怕的,是随之而来的黑客攻击事件与死亡威胁。曾经有一名用户的系统遭到了黑客攻击,损失了价值数百万美元的项目。在排查过程中,受害者在日志里看到了cURL的踪迹,竟误以为是丹尼尔开发了攻击软件。Curl作为一个网络数据传输工具出现在攻击日志里是很正常的,因为黑客的工具链里也可能用到cURL来发送和接收数据。
但它只是个工具,不是攻击者:就像一把锤子出现在犯罪现场,不代表锤子制造商就是罪犯一样。但受害者当时满腔怨气无处发泄,把怒火全部撒到了丹尼尔身上,甚至给他发出了极其疯狂的死亡威胁。面对真正的生命安全威胁,丹尼尔选择果断报警。几个月后,该受害者才终于冷静下来意识到自己的愚蠢,并向丹尼尔发信道歉。
事情的荒诞之处在于:你开发了一个让全球受益的工具,却因为有人误读了日志,差点招来杀身之祸。故事讲到这里,可能很多人心里都会有一个疑问:一个人怎么可能辛辛苦苦在同一个开源项目上坚持接近三十年呢?从上世纪九十年代中期起步,到他在FOSDEM台上讲述这些故事的时候,中间经历了互联网泡沫、移动互联网崛起、云计算时代、AI浪潮。
技术世界的热点换了一轮又一轮,而丹尼尔始终守着这个小小的网络数据传输工具。丹尼尔在演讲中多次强调一句话:“Have Fun”(享受乐趣)。他不认为自己是什么天才,或者多么惊世骇俗的人物。他只是想开发一个好用的网络数据传输工具:他觉得做自己觉得有意思的事情,本身就是回报。这不免让人想到Linux之父Linus Torvalds的那本自传:书名就叫《Just for Fun》。
这两位深刻影响了全球技术基础设施的人,都不约而同地把乐趣放在了最核心的位置:一个最初只为了下载汇率数据的小工具,最终跑到了火星上;一个从来不玩游戏的瑞典程序员,用接近三十年的坚持把三百次下载变成了两百亿台设备上的基础设施。这中间有孤独,有焦虑,有不理解;有死亡威胁,还有AI时代的全新冲击。
但支撑这一切的,就是最朴素的两个字:乐趣。这或许也能给所有在技术行业里摸爬滚打的人一个启示:真正能走得远的,往往不是最聪明的那个,而是真正乐在其中的那个。天赋决定起点,但乐趣决定能走多远。感谢收看,我们下期再见。