杰夫·阿特伍德:Stack Overflow 与 Coding Horror
Jeff Atwood: Stack Overflow and Coding Horror
Stack Overflow 联合创始人聊程序员问答社区的兴起、技术写作与职业成长。
2018 年,Stack Overflow 满十岁。杰夫·阿特伍德(Jeff Atwood)在博客里写了一篇纪念文章,标题大意是《Stack Overflow 长大后想成为什么》。文章里没什么庆功的味道,他花了大半篇幅解释一件事:这个网站为什么对新人这么凶。
他自己先给了答案:Stack Overflow 从来就不是给初学者准备的。
这句话从一个把「帮程序员解决问题」做成全球基础设施的人嘴里讲出来,值得琢磨。一个看起来应该张开双臂欢迎所有人的问答网站,为什么要刻意维持一种近乎冷淡的严格?答案藏在他对社群、对人、对软件该怎么被造出来的一整套理解里。而这套理解比问答网站本身有意思得多。
驱动程序员的是解谜,钱和名声排在后面
访谈开场,Lex 问了个看似简单的问题:是什么在驱动大多数程序员?名声、财富、编程本身的过程,还是对社群的归属感?
阿特伍德的回答很短:是解谜。
他描述的那种状态很具体。一个人把自己关起来,对着一个问题反复敲打,用近乎蛮力的方式一遍遍试,直到它跑通。电脑太快了,人要算一辈子的东西,机器几秒钟跑完几百万次。程序员享受的正是这种用蛮力换答案的过程。听起来不优雅,可这确实是很多人写代码时最真实的快乐来源。
他举了个例子。大部分程序员写过的洗牌算法其实有缺陷,那种朴素写法会让某些排列出现的概率明显偏高。你要是在赌场干活,正好碰上一个不太老练的程序员写洗牌逻辑,后果可能很难看。这个问题怎么被发现?不需要多聪明,把洗牌跑十亿次,看看每种排列落进桶里的分布,答案自己就浮出来了。
蒙提霍尔问题(Monty Hall problem)是同一回事。三门问题里该不该换门,直觉上让人抓狂,你写个程序跑一遍「永远换」和「永远不换」,两组数据一对比,结论就摆在那儿。你想不明白没关系,跑出来就行。
你不需要聪明,你只要用数据把它跑出来就行。(杰夫·阿特伍德)
这种「用实验代替推理」的路子,其实也解释了 Stack Overflow 后来为什么会变成那个样子。它服务的人群很明确:手里有具体阻塞问题、需要可验证答案、愿意自己动手验证。这类人不太需要安慰,需要的是能编译通过的代码。
语言也是代码
阿特伍德说自己现在很少写代码。Discourse 这家公司里,他做的是管理工作。而他年轻时当程序员,最看不起的就是管理者,觉得那是一群自己什么都不干的人。
后来他的看法整个翻了过来。他发现一件挺有意思的事:语言本身就是代码。当你能够清晰地指挥别人做事,你能完成的东西比一个人单干多得多。写代码是用一种形式语言告诉机器做什么,说话是用自然语言告诉人做什么,底层是同一个动作,只是抽象层级不同。
什么样的领导算好的?他给了两条。
第一条是以身作则。这话听起来是老生常谈,但他讲了个特别具体的观察:有了孩子之后你会发现,孩子无时无刻不在看你,甚至在那些你已经看不见自己的地方。人最难看清的就是自己。你看别人一眼就能下判断,看自己却带着巨大的偏见,而且往往对自己比对别人苛刻得多。
所以作为领导者,你得非常勤快地反问:我现在的行为,是不是我希望别人做出的行为?他说很多领导者在这件事上栽跟头,做出来的决定传递出去的信号完全是反的。
第二条是真正投入。他看重的是对问题本身的真实热情,加班时长他并不在意。对解决方案有热情的人,听到反对意见会防御;对问题有热情的人,听到更好的解法会兴奋。这两者的区别,几天就能看出来。
他自己举的例子是 Discourse 要解决的问题:怎么让一群人在线上沟通的时候,不至于退化成狼群互相嚎叫。怎么处理 troll,怎么让人用完整的句子说话,怎么让人在讨论里不互相伤害,最后还能就某个议题达成共识。这些事听起来琐碎,可每一个线上社群每天都在面对。
自我认知从哪里来
Lex 追问了个更尖锐的:你说人很难看清自己,那你怎么知道自己哪些行为是错的?尤其是那些你压根没做的事,同样在传递信号。
阿特伍德的回答分两层。
第一层是机制。Discourse 有三个联合创始人,他们在做决定之前会定期讨论。多人讨论的价值在于,误解和盲点能被提前捞出来。至于单个人会不会犯错,那几乎不用讨论。他对「一个领导者拥有绝对权威」这种结构评价很低。一个社群要是由一个人说了算,那个人总会有倒霉的一天,出事的时候整个社群跟着完蛋。所以他主张让多个人共同承担领导责任,彼此给对方反馈。
第二层更微妙。他说每个人心里都有一个小声音,你的直觉,你的良心,随便你怎么称呼。大多数人是有道德感的,是想做对的事的。也许有极少数反社会人格不在乎,可绝大多数人希望别人觉得自己是个好人。你做的每个决定让你感觉如何,这个信号值得留意。
他同时承认这有副作用。程序员群体里,那个「魔鬼」的声音往往太响,自我批评过度,内向型人格尤其明显。这就引出了更大的问题:当你必须做一个不受欢迎的决定时,怎么办?
答案是:把决策过程完整地讲给别人听。
这也是他反复强调博客和沟通重要的原因。直接甩一句「这是决定,执行吧」,没人会服气。换个说法:「我们为这个问题想了很久,中间发生了这些事,我们的目标是这个,我们看了这几个选项,其中第二个更好。」对方的反应就会变成「行,我可能不完全同意,但我大概能理解你是从哪儿来的」。
关键区别在这里:决定要让人听得出是从一个具体的人嘴里说出来的,天上火云里砸下来那种感觉要尽量避免。如果你们的目标本来就不一样,那达不成一致完全合理。这跟谁是坏人没关系,只是出发点不同。
Stack Overflow 的诞生:一次投票和一堆失败案例
回到源头。2004 年,阿特伍德开始写博客 Coding Horror。名字来自史蒂夫·麦康奈尔(Steve McConnell)那本《代码大全》(Code Complete)里的一个侧边栏插图,画的是一个标示危险的图标。他特别喜欢那张图,因为它说的正是编程的核心洞见:每次你写下一行代码,都要想「我会怎么把自己坑死」。人太容易犯错了,所以你得在每一步都设计好,让之后的自己不会把事情搞砸。
他专门写信给麦康奈尔要授权使用这张插图,对方同意了,而且一直同意到今天。
博客写了几年,积累了大约四万名订阅者。他当时在一家制药公司工作,编程不是公司的核心业务,身边没人可以聊技术。于是他把对编程的痴迷全部倾泻到博客里。他给自己的定位是执行者,出点子这件事并不擅长。所以博客写着写着,他想做点更大的事,又不知道做什么。
转折点是乔尔·斯波尔斯基(Joel Spolsky)。乔尔的想法很明确:有个叫 Experts Exchange 的网站,数据很好,体验极差,像二手车销售一样想方设法骗你。他们决定做一个更好的版本。
Stack Overflow 这个名字是博客读者投票选出来的。他感慨,给东西起个好名字是计算机科学里最难的问题之一。早期 beta 用户几乎全部来自他和乔尔的博客读者。这种重合来自他刻意的经营:先通过长期写作建立一个小社群,然后邀请他们一起参与建设。当人们看到你在认真听取反馈,他们会跟着你走。
你不可能听取所有反馈,那是不可能的。但你确实在等我们的反馈,你在乎我们在做什么。(杰夫·阿特伍德)
关于这段创业,他还讲了一个反直觉的方法论:不要只盯着成功案例,去看失败案例。所有人都盯着成功产品看,那些东西很无聊。真正有意思的是失败的东西,因为那里有人在实验,有人在推进,只是最后没成。他们失败的原因,往往跟他们的想法本身的质量无关。
Stack Overflow 的设计是把一堆已知有效的元素拼起来,像个科学怪人:Digg 和 Reddit 的投票排序、维基百科式的可编辑、博客式的署名归属感,再加上声誉系统。声誉系统来自一个关键洞察:同行的认可,是程序员最初做事的动力。老板发的钱撑不了太久,同行说一句「这人真的懂」才有效。
严格本身没什么可追求的,它只是达成结果的手段
系统跑起来之后,他们很快发现一个现象:有些问题下面会有几百个回答。一个编程问题怎么可能有五百个答案?点进去一看,那些根本算不上问题,全是讨论。「你最喜欢的编程食物是什么」「你看过最好笑的编程漫画是什么」。这些早期被允许,后来全部禁掉。
判断标准是什么?他给了一条特别好用的线:这是不是你工作中真实遇到的问题?没人上班上到一半说「我干不下去了,因为我不知道最好笑的编程漫画是什么」。
第二条线关于学习方式。他把学习分成两种。一种叫「意外学习」,像刷 Reddit 一样,本来没打算学,刷着刷着知道了树蛙只活三年(这个数据是他随口编的,他自己也承认)。另一种叫「有意图的学习」,你遇到一个具体问题,需要围绕这个问题把相关知识补齐,可能是理论,可能是编译器原理,但都为目标服务。Stack Overflow 只服务第二种。
这套规则随着时间越来越严,原因之一是声誉系统自己带来的张力。如果有人靠一个笑话或者一张别人的漫画拿到五百个赞,其他程序员会不爽:凭什么他靠别人的作品拿走声誉?这跟写出一条刁钻的正则表达式、并附上详细解释说明为什么会这样、以后怎么避免,完全不是一回事。后者的声誉是应得的。
他打了个比方:严格的类型系统最终会赢。早期 Ruby 社群觉得动态类型很爽,不用声明变量,出问题靠单元测试兜底。然后微软的 C# 之父 Anders Hejlsberg 做出 TypeScript,硬给 JavaScript 套上严格类型,现在所有人都在说「我们上线 TypeScript 之后发现了五十个潜伏的 bug」。
严格并不意味着刻薄,也不意味着凶,它只是严格。他把这个区分讲得很清楚,因为很多人在这一点上误解了 Stack Overflow。
程序员为什么会变得像电脑
访谈里有一段特别有意思的推论。Lex 问,为什么程序员有时候给人感觉很刻薄?
阿特伍德说,你想想程序员整天跟谁一起工作。如果你每天跟一群混蛋工作,你最后会变成什么?混蛋。那么,除了电脑,还有谁是世界上最大的混蛋?
电脑对你的废话零容忍。你只要犯一个错,一切就崩了。一个分号能让太空任务失败。你把这种环境内化之后,会开始觉得:哦,我的同事,也就是这台电脑,严格得要命,一点情面不讲,所以我也该这样,因为我必须在所有事情上服从它的规则。
好程序员像电脑一样思考,因为那是他们的工作。可如果你内化得太深,你自己就变成了那台电脑。(杰夫·阿特伍德)
这就像侦探小说里的套路:最好的侦探能像罪犯一样思考,因为他们自己也沾了点罪犯的影子。程序员也一样。你开始觉得「错误代码 56249」是个完全合格的报错信息,因为电脑就是这么告诉你的。你忘了怎么当一个人。
这里没有恶意,你只是失去了对「不严格」的耐心。你非常简洁,非常不说废话,非常「错了,下一个」。别人问「你能帮我看看怎么修吗」,你的反应还是「错了,下一个」。对电脑来说这很正常,可对面坐着的是个人。
向上抽象:从代码到人
作为一个写了十几年代码、后来又做了两个大项目的人,阿特伍德说了一句听起来很打击人的话:要成为一个有效的程序员,你最终得停止写代码。
他自己也知道这话对听众不友好,所以赶紧补充:写代码这件事,会变成用越来越高级的语言在写。
最早你写汇编,硬编码到具体架构上。然后有了 C,可以跨架构抽象,编译到 ARM 或者 x86。再往上,Python、Ruby 这类解释型语言。再往上呢?他想再抽象一层,比编程语言更高的抽象是什么?
是自然语言。
你在用英文或者中文写作、说话、激励别人、给出方向、说「如果我们这样做会怎样」。这是最高层级的编程语言。他说自己意识到这一点的时候有点难受,因为这确实是很多程序员不愿意接受的事实。Patrick McKenzie(也就是 patio11)写过一篇很有名的文章讲这个:把自己叫作「程序员」,在某种程度上是职业发展的天花板。
因为代码周围的所有事情,比如人,才是真正难的部分。他在博客里早就反复写这个:编程更多是关于人,关于代码的比重没那么多。听起来不合逻辑,可事实如此。这些人能不能彼此相处?能不能互相理解?你能不能跟我讲清楚你到底在做什么?你解决的是不是正确的问题?
他推荐了另一本经典:《人件》(Peopleware)。核心观点是,软件就是人。人本身就是软件。
他把这个逻辑推到底:一旦你的编程能力过了某个门槛,任何合理的工程问题你都能解决。你不需要从零写算法,那种事基本不会发生。所以技术问题很少是瓶颈。真正的瓶颈是「我的经理是个混蛋」,这个问题你没法用代码解决,可它对你的伤害比「我们得用那个我讨厌的框架」大得多。Dave 在角落里写着谁也看不懂的东西,Sam 天天提交烂代码,这些都没那么致命。真正让整个团队停摆的,是那个有毒的同事或者上级,所有人都被压得喘不过气,谁也没法干活。
心跳:迭代速度是软件公司的核心竞争力
这是整场访谈里最实用的一段。
阿特伍德说,Discourse 早期他和 Robin Ward 两个人干的时候,他意识到一件事:每当他跑去问 Robin 一个关于 Ruby 的蠢问题,Robin 就在花时间回答他,而这段时间本来可以用来写 Discourse 的第一个 alpha 版本。对两个人的时间都是浪费。解法很干脆:去雇更多合格的程序员。至于「我要自力更生学 Ruby」这条路,他很早就放弃了。
然后他给出了一个判断软件公司健康度的指标。他发过一条推文,很多人喜欢:你想衡量任何一家软件公司的核心能力,就看这样一件事,从有人提出「我们产品里这个词该改一下,用户会更清楚」,到这个词真正改完、上线、送到用户手上,需要多长时间。
这就是你的生命周期。这就是你的健康度,你的心跳。如果你的心跳特别慢,你基本上已经死了。(杰夫·阿特伍德)
他说得很重。如果一个词的修改要花两周甚至一个月,那这家公司就没救了。这跟闲着没事改词玩是两个概念,一个明显更好的改动,所有人都同意,然后花了几个月才上线。这意味着你没法迭代,你什么都做不了。
他也澄清了另一面:心跳快不等于要像蜂鸟一样狂跳。重点是健康,是合理。可必须跳得起来。因为软件开发就是这么工作的:你做出改变,推上线,跟它相处一段时间,看看感觉如何,然后说「天啊,这主意太糟了」,或者「如果加上 Y 会更好」,接着继续转曲柄。你转得越多,最终跑得比竞争对手越远。一年之后你已经在几英里之外,他们才追上来。
他还提到一个反直觉的点。用户抱怨「软件又变了」的时候,他的反应是「对,就该变,一直变」。可塑性恰恰是软件最酷的地方。你反抗这个特性,等于在跟你所建造之物的本质作对。当然他也承认有些改动确实很烂,但总体而言,拥抱这种流动才是对的。
Discourse:社群应该拥有自己
讲完 Stack Overflow,话题转向 Discourse。为什么一个做问答网站的人,要跑去做论坛软件?
起因是 Stack Overflow 的边界被看清了。它只适合那些答案可以被验证的领域,有数据、有事实、有科学依据,或者有一本权威的知识典籍可以翻。一旦离开这个范围,引擎就失灵。
他们做过实验。Stack Exchange 网络允许用户提议新的问答站点,票数够了就开站。有人提议了「扑克」和「乐高」,结果惨败。为什么?这两个领域太社交了。玩扑克的人真正想聊的是「我们抽什么雪茄」「用什么牌好看」「这手牌我该怎么打」,乐高玩家想说的是「看我搭的这个,帅不帅」。这些都不是问题,是分享,是讨论。
没有人会因为「我拿到同花顺时该怎么办」而被卡住。那算不上会阻塞你的问题,只是一个聚在一起聊天的机会。(杰夫·阿特伍德)
于是他转向论坛。2012 年底到 2013 年初他重新看了一圈论坛软件,发现从四年前他上次看的时候到现在,一点进步都没有。这让他很生气,因为他喜欢那种一群人围绕共同热爱的东西聊天的社群,而他们居然没有像样的工具。
他讲了一段经历。很多创业者来找他,说「Jeff 我有个创业点子」。他第一句话总是「你为什么要问我?我又不懂你这行。你为什么不去问你的用户,问对这个社区感兴趣的人?」对方说「好主意,怎么问?」这时候他就在心里拉起了悲伤的长号,因为所有能让创业者和用户、客户、受众对话的软件,全都烂得他不愿意推荐给别人。
而那恰恰是创业者能拿到最有价值输入的地方。Stack Overflow 自己就是这么做的。他花了大量时间泡在 Meta Stack Overflow 上,那是公开的社区反馈站点。90/10 法则:90% 的反馈没法用,可能是烂反馈、疯反馈,或者你现在根本没法执行的反馈。剩下 10% 是金子,是钻石,是对核心产品的真正改进,而且不太难实现。其中他最喜欢的那 5%,是他完全没想到的:「天啊,我从来没想到这个,但这主意太棒了。」Stack Overflow 的很多功能就是这么来的。
Discourse 的核心理念是兴趣图谱,跟 Facebook 的关系图谱对立。Facebook 理解的世界是状态更新:你的朋友在餐厅吃了饭。论坛围绕的是一个具体兴趣:我热爱电动车,我热爱特斯拉,我热爱他们解决问题的方式、创始人的风格、设计的伦理。他引用 The Oatmeal 那篇关于特斯拉的漫画,说那篇东西基本上就是所有兴趣社群的起源神话:一个人把自己热爱的东西挖到极深,然后分享出来。
他对自己的描述是:他是那种会对少数几件事极度投入、然后一头扎进去好几年的人。广泛地浅尝不是他的方式,深入扎几件事才是。论坛正好解锁了这种体验。
然后是那句最关键的话:
我不想要一个一切都属于 Facebook 的世界,至少我不想要。我想要一个社群能够拥有自己的世界。(杰夫·阿特伍德)
他打了个特别形象的比方。你每周四在 Barnes & Noble 书店聚会,某天书店说「你们走吧,你们买的书不够多」,那你就完蛋了,因为书店拥有你。换到自己有聚会空间、有俱乐部小屋,你就能定自己的规则,决定聊什么,产出比在书店角落里挤着好得多。
他对 Facebook 的评价很有意思。他先夸:Facebook 的执行力非常强,收购 WhatsApp 和 Instagram 是极其聪明的决定,他们还免费送 VPN 软件,间接把所有流量数据喂回给 Facebook,让他们看到什么在变流行。紧接着一句:Facebook 没什么道德指南针,Facebook 只在乎 Facebook。它不在乎你和你的问题,只在乎自己能做多大。
社群怎么从零长起来
Lex 问了个很实际的问题:怎么把一个社群从一个人做到一千人?运气、技巧、时机还是坚持?
阿特伍德的答案回到他关于博客的那套话。他引用一位他很敬佩的人的说法:所谓写博客,就是你必须有一些有意思的东西要说,而且用有意思的方式说,然后坚持十年。
「有意思的东西」意味着不是所有人都在说的东西。「有意思的方式」意味着一种带娱乐性的表达方式。
然后是仪式感。你宣布「我每周写三篇」,然后你必须做到。因为在你坚持几年之前,你根本到不了任何地方。这件事要花好几年。如果你真的热爱它,它就不会感觉像工作。
他特别提到写作的一个技巧,说这可能是他能给的最好的写作建议:
把文章大声读出来,读好几遍,让它听起来像你在说话。因为好文章的目标就是这个。(杰夫·阿特伍德)
好的写作应该听起来像你说的话,只是措辞稍微好一点,因为你有更多时间思考。它念出来要自然。
关于选题,他的方法是从旧书里挖。世界上的有趣事物太多了,如果你一天想不出一个可以聊的有意思的点,那是你不够努力。读经典编程书是一条很好的矿脉,那些书里提出的概念往往经久不衰,你可以拿几句话出来,同意或不同意,比较两个概念,或者讨论「这在今天还适用吗」。你不用假装是自己的原创,可你有了一个可以持续聊下去的常青话题。
2007 年,有人出价大约八万到十万美元要买他的博客。那是一年的工资,一次性到手。他犹豫过,跟人聊过,最后还是拒绝了。理由很简单:卖了之后,这个博客就不再属于他了。
他给了一条他自己也不太爱给人建议、可觉得确实有用的原则:当你面对一堆选项时,选那个让你稍微有点害怕的。跳崖那种害怕不算在内,要的是让你紧张的那种。选安全的那个,通常意味着你没在推自己,没在选那个能让你成长的东西。
对他来说,更可怕的选择是说不。「不,我们就看看这事能走到哪儿。」因为这样它还是他的。
他说,假如当年说了 yes,世界会多不一样。可能就没有 Stack Overflow 了。
关于未来:手机是文化变迁,AI 还没到魔法
访谈后半段聊到未来。Lex 问了两个方向:智能手机和人工智能,会不会根本改变编程这件事。
阿特伍德对智能手机的判断是:它带来的主要是文化层面的转变,编程层面的变动没那么大。2010 年之后,每个人都随身带着一台电脑,这确实是巨大的社会变化,我们到今天还在消化它的正面和负面影响。他提到自己作为极客的梦想世界就是「人人随时随地都在电脑上」,然后补了一句「小心你许的愿」。现在人人都有电脑了,可它没能长成我们想象的乌托邦,电脑能被用来做很多未必好的事。
至于编程本身,他越来越相信 Unix 那套。命令行、基础工具,这些东西在未来很长很长时间里还是编程的样子。他不相信会有什么神奇的可视化编程颠覆这一切。他甚至想不出手机上有什么操作能跟编程直接对应,想半天也没想出什么。
关于人工智能,他的态度是:这个概念被过度吹捧了。很多所谓的 AI,本质上是「人非常可预测」。他举了 Discourse 里的一个检查:你一小时前从纽约登录,现在从旧金山登录,那就标记为可疑。那只是条启发式规则,一小时跑两千英里不合理。你可能用了 VPN,可这条规则建立在「人基本上不会到处移动」这个观察之上,非常朴素。
他说好的软件应该预判你的需求,比如 Google 预测你的通勤路线。电脑在这块能做得更好,可他不太愿意把它叫「完整的 AI」,那只是电脑变强了。现在人人有智能手机,我们突然有了大量以前没有的位置数据、通信数据,喂给一些基础的启发式,再加点漂亮的算法,就变成了对你需求的预测。就像一个朋友说「我看你到家了,要不要一起吃个饭」,因为这是我们这个点通常会做的事。
落到编程过程本身,他觉得 AI 确实有可能帮上忙,因为编程里重复太多。他举的反面教材是 Clippy,那个「看起来你正在写一个 for 循环」的曲别针。他更看好的方向是「更好的乐高积木,更大的乐高积木」:库本身就是这类东西。你不用自己写 HTTP 请求库,用一个久经考验的现成的就行。WordPress 在他看来就是一个让非程序员也能做出东西的工具,通过插件,你可以把它变成任何东西,甚至有点疯狂。他说未来可能更多是「粘合」而不是「真正的编程」,这是好事,因为你需要的大部分东西已经在外面了。
至于 Unix会不会一直被沿用,他的回答很干脆:会。他年轻时是 Windows 的忠实信徒,觉得 Unix 是浪费时间。后来他完全翻转:Unix 那帮人基本是对的,微软和 Windows 在服务器端和桌面端,至少在那个年代,基本是错的。现在苹果的桌面系统底层也是 Unix(Darwin)。他说,不管上面套了多少层外壳,剥掉一两层,底下还是 Unix,这个状态会持续很长时间。
他还顺带提了一句 Discourse 自己的架构。Discourse 就是客户端编程,服务器把一大碗 JavaScript 递给你,剩下的排序、分页、基本计算全在你自己的机器上跑。数据当然还是要从服务器拿,可本地的算力用得越来越多。这是编程重心往客户端偏移的一个例子。至于服务端那部分,他的判断是 Unix 哲学会继续赢下去。
为什么 Discourse 不做广告
聊到商业模式时有一段很有意思。Lex 提到,广告在最理想的状态下其实是在服务用户,把用户和他们感兴趣的东西连接起来,这跟 Discourse 连接兴趣社群的逻辑一致。
阿特伍德说自己对广告持一个反常的看法:他其实同意这个观点。如果广告就是「把你会感兴趣的东西推给你」,那挺好,甚至是件好事,通过看广告来支持做这些工作的人也是合理的。
可他还是装了 Adblock,而且装得很不情愿。原因很实际:现在的广告太重,为了给你看广告要加载三四十兆的东西。他说现在的广告像当年的 Experts Exchange,等你做出 Stack Overflow 的时候,它就什么都不是了。广告技术领域公司多到离谱,一张图上密密麻麻全是 logo,小到看不清。
然后他回到现实:非常非常少的 Discourse 站点能靠广告模式活下来。太分散,太奇怪,给的钱太少,用户还讨厌它。理论上他同意「干净、快速、正好是你感兴趣的广告」很棒,可我们离那个理想状态太远了。连 Google 在重定向那块也只是做得还行。
真正有效的是订阅、Patreon、亚马逊联盟链接这类。有人点了一个链接去亚马逊买了东西,站点拿 2% 到 5% 的佣金,他觉得这完全公平。你在他站点上看到一辆溜溜球,点过去,买了,他分一点,合理。他自己帮过一个站长,基本上算是付钱让对方换到 Discourse,理由很直接:「这软件太烂了,我没法再来了。」同时他建议对方别再做用户讨厌的广告,全力做 Patreon,做亚马逊联盟。那个人照做之后效果很好,尤其是对一个内容创作者来说,这条路走得通。
机械键盘是一种信仰物品
访谈最后聊到 Code Keyboard,阿特伍德自己参与设计的机械键盘。Lex 说自己用 Kinesis,楼上就有一把。
阿特伍德的坦白很有意思。他说机械键盘带不来任何功能上的必需性,你在任何键盘上都能编程,甚至屏幕键盘也行(说这话的时候他自己都觉得可怕)。薄膜键盘也能用,只是手感很差,那种薄薄的橡胶膜,按下去没有明确的反馈点。
它本质上是一种信仰物品。它真正表达的是:我在乎键盘,因为键盘是我和电脑沟通的主要方式。就像播客要用好麦克风一样,你想要一把好键盘,因为它有明确的触感反馈,你按下键的那一刻能清楚感觉到那一下咔哒。
它表明你关心基础。因为你知道什么让你成为一个好程序员吗?打字快。(杰夫·阿特伍德)
这句话他说得很认真。打字足够快,能把脑子里的想法搬到代码库里,本身就是一项核心技能。练打字真的能让你成为更好的程序员。
更深一层,是那种触感带来的愉悦,最终反哺热情。他说自己弹钢琴,道理一样,技术性的、触觉性的东西会让人开心。他提到机械键盘社区已经爆炸了,Massdrop 上可能有五百个键盘项目,他关注的一个前 Tech Report 作者每周都在发键盘图,各种炫酷的键盘,多到他数不过来。
Lex 说自己有一堆溜溜球,阿特伍德说这正是他讲的道理。技术上你只需要一个,可你就是喜欢很多个。机械键盘也是一样。
他的结论是:这些非必需的、近乎宗教性的物品,恰恰构成了人之所以为人的那部分。它让生活值得过。严格来说它们都不必要,可你想想,什么东西是真正必要的呢?
一个普通程序员能从这里拿走什么
这场对话跨度很大,从算法聊到领导力,从社群治理聊到键盘手感。如果只挑几条能马上用上的,大概是这些。
- 遇到搞不懂的问题,先跑数据,别硬想。洗牌算法、三门问题、任何反直觉的逻辑,写个程序跑一百万次,看分布的桶,答案比推理可靠。这也是为什么哪怕你已经在做管理,最好还是保留一点动手做实验的能力。
- 把决策过程完整讲出来。带团队也好,在社区发言也好,别只抛结论。讲清楚背景、目标、你考虑过哪些选项、为什么选这个。别人的反对往往会变成「我理解你的出发点,虽然不完全同意」,这跟「凭什么」是两种完全不同的对话。
- 衡量所在团队的健康度,看「改一个词要多久」。从提出改动到用户看到改动,这个时间就是团队的脉搏。两周以上就是警讯,一个月以上基本停摆。想办法缩短它,比优化任何单点技术都更值。
- 写东西的时候,把稿子大声读出来。读好几遍,直到它听起来像你在说话。这是区分「能读」和「好读」最有效的一招,成本几乎为零。
- 在重要选择上,挑那个让你稍微紧张一点的。跳崖那种冒险不算,要的是让你心里发紧的那种。安全的选项通常意味着原地踏步。当年拒绝卖掉博客的阿特伍德,后来做出了 Stack Overflow。
- 如果你是新手,别把 Stack Overflow 当学习平台。它服务的是「有具体阻塞问题、需要可验证答案」的人。新手真正需要的是实时屏幕共享、聊天、可以随便玩的沙盒,这些它从来不提供。找错工具,受伤的只会是你。
- 想建社群,先写十年博客。这话不是比喻。先有值得说的东西,有有意思的说法,有稳定的节奏,然后邀请读者一起参与建设,让他们投票命名、参与测试。社群拉不来,只能长出来。
- 开会前先问一句:我们聊的是问题还是解决方案?对解决方案有热情的人容易防御,对问题有热情的人容易吸收。团队里这两种气氛的差别,几个月就能体现在产出上。
最后那条关于键盘的建议,阿特伍德自己也承认它是非必需的。可他讲得对:一把手感好的键盘,会让你更愿意坐在那儿多敲一会儿。而多敲一会儿,往往就是所有进步的起点。
整场访谈里他说的最实在的一句话,可能是那句「你不需要聪明,你只要用数据把它跑出来就行」。这句话能用在算法上,也能用在带团队上,还能用在写作上。把想法变成可以跑的东西,看看结果,然后改。这可能就是他十几年里做的全部事情。
那场关于旧金山的对话,后来没人再提
访谈里有个细节容易被略过。阿特伍德讲到 Discourse 里那个异地登录检测的时候,语气很轻松:「你一小时前在纽约,现在在旧金山,嗯,这挺有意思。」他把这当作启发式规则的一个平凡例子,用来论证所谓 AI 没那么玄。可这段话背后藏着一个更大的判断:软件对用户行为的预测,大部分时候只是把人类的重复性写成代码。
他说人非常可预测。你每天大致在同一时间起床,走同一条路去上班,在同一个便利店买咖啡。Google 预测你的通勤路线,靠的就是这份重复。它没什么魔法,只是把你的行为模式记住了。他说这更像一个朋友说「我看你到家了,要不要一起吃饭」,因为它知道你这个点通常干这个。
问题在于,这套逻辑在社区产品里会变得微妙。预测得准,用户觉得贴心;预测得太准,用户觉得被盯着。Discourse 是开源软件,每个站点自己托管数据,这件事上他站在用户这边:数据在你自己手里,你才有可能决定它被怎么用。这又绕回他那个核心主张,社群应该拥有自己。
为什么他总在夸对手
整场访谈里有个反复出现的模式,值得单独说一句。他批评 Facebook 的时候,一定会先夸一句「他们执行力非常强」「收购 WhatsApp 和 Instagram 是极其聪明的决定」。他批评微软早年的方向,紧接着承认 TypeScript 出自 C# 之父 Anders Hejlsberg 之手,是软件史上最聪明的头脑之一。他谈到自己已经完全转向 Unix 阵营,仍然会说苹果的桌面系统底层也建在 Unix 上。
这种既能批评又能准确承认对方强项的能力,在技术圈并不常见。多数人一旦站定阵营,就会把对面的所有东西都归为垃圾。他的做法更像一个工程师在评估方案:这个选择在什么条件下是对的,在什么条件下是错的。他讨厌 Facebook 的道德取向,可他不会因此说 Facebook 的技术烂。这两件事在他脑子里是分开的。
这可能也是他做社区能做这么久的原因。一个总觉得对手一无是处的人,没办法设计出一个真正好用的替代品,因为他不知道对手到底做对了什么。
十年这个数字,他反复提到过
把访谈里散落在各处的「十年」串起来看,会发现一条挺清晰的线。
他说写博客要「坚持十年」,才可能到任何地方。Discourse 一开始他定的是五年计划,很快就改成十年,因为三年才能把产品做成你想要的样子,而第一版一定是烂的,可你还得先把它发出去。Stack Overflow 到 2018 年正好十年,他写文章反思它长成了什么样子。学 Unix 的知识几十年不失效,学人性的知识也同样耐用。
十年在他这里像是一个基本单位。短于这个尺度的事情,他没太大兴趣谈成功或失败。这个时间感跟当下技术圈的主流节奏差得很远,今天的标准节奏是三个月做出 MVP,一年内找到 PMF,两年内要么规模化要么死掉。他那套「三年才做出想要的产品,十年才算走完一轮」的说法,听起来像是另一个时代的话。
可他自己给了辩护。他说你转曲柄的次数越多,最终跑得越远。转曲柄这件事本身需要时间,而时间没法压缩。你能压缩的只有每次转动的周期,也就是他说的那个心跳。心跳快一点,同样十年能转更多圈。这可能就是他全部方法论里最核心的一条:把循环周期压到最短,然后一直转下去。
算法是这样,跑十亿次看分布。写作是这样,每周三篇读出来听。社群是这样,每次反馈都回应。公司也是这样,一个词的改动从想法到上线,越快越好。
这套东西朴素到有点无聊。可他在访谈里从头到尾没换过别的说法。
本集资源与出处
- 视频在 YouTube 收看
- 音频官方 MP3 直链来自 lexfridman.com 官方播客 RSS
- 官网Lex Fridman 官网本集页面
- 文稿HappyScribe 版文稿