Lex Fridman对话Michael Paulson ThePrimeagen
以下是与 Michael Paulson 的对话,他在网上更广为人知的名字是 ThePrimeagen。他是一位程序员,激励了数百万人享受用软件构建事物的乐趣,无论你是新手,还是在软件工程领域摸爬滚打了几十年的资深开发者。简而言之,ThePrimeagen 是一位传奇程序员,也是一位伟大的人,他的人生故事充满了鼓舞人心的跌宕起伏。这里是 Lex Fridman 播客。如需支持,请查看描述中的赞助商。现在,亲爱的朋友们,有请 ThePrimeagen。
你最喜欢编程的什么?编程给你带来什么乐趣?
我可以告诉你我第一次在编程中感受到热爱、喜悦或兴奋的时刻——那是在大学里。那是第二堂课,数据结构,授课老师 Ray Babcock 正在讲链表。我在蒙大拿州立大学上学时必须学习 Java,所以他当时正在解释整个链表的东西,然后他展示了代码。代码中是抽象类 `node` 还是什么,我不记得了。然后它有一个私有成员,那个私有成员的类型是 `node`,我以前从未见过这种情况。这是一个名为 `node` 的类,它有一个成员是它自己。我第一次感到,“天哪。没有尽头。没有办法迭代。这不是一个包含10个项的集合。这是一个包含无限项的集合。”那一刻我的思绪仿佛爆炸了,就像是,“你能表达的东西太庞大了。我能看到内存是什么样子。我能看到它在空间中跳跃。”我只记得当时非常震惊,因为在那之前,一切都只是,“好吧,我有一个包含10个项的列表。我有一个包含20个项的列表。”对吧?它非常死板和狭小,我构建的东西都非常小而微不足道,突然间我觉得在那一刻我能构建任何东西。这太神奇了。我只记得坐在课堂上,我甚至不记得那些课有多长或任何细节,但我只记得自己被这个概念彻底而深刻地影响了。所以我只是坐在那里看着,我在一堂软件工程课上也有过完全相同的经历,当时我们谈到了装饰器模式(decorator pattern),你可以用这种递归的方式不断构建这些对象。并不是说我认为那样做是个好主意,但只是看着它,意识到解决问题有这么多奇特而独特的方法,你脑子里能想到的任何东西,你都可以创造出来。我只记得当时对“一切皆有可能”这种可能性感到无比兴奋。
是啊,我们来对链表进行一番哲学思考吧。它确实很深刻。对于不了解的人来说,链表中的一个节点对它所处的世界一无所知。它只知道它所链接到的东西,它的邻居。也许这是一种象征。它是我们所有人类的隐喻。这个星球上有数十亿人,我们只了解我们本地的小网络。这有点美妙。你会意识到,在这个简单的小数据结构中,你可以构建任意大的系统,它们就像穿梭于内存中的根系。当然,这就是所有编程语言的来源,它们允许你将垃圾倾倒到内存中并导致内存泄漏,从而在你试图找出那些未释放的内存时造成无尽的痛苦。对我来说,是的,可能……你表达的方式太美了。链表确实很美。递归对我来说也是如此,当我最终理解了编写递归函数意味着什么的时候。
那是什么?是什么让你学会的?因为我想我们都……你可能做过阶乘,你只是快速地计算它的阶乘。它就是没有触动你。是什么让你真正理解了它?
我不记得第一次了。我经历过太多次,以至于……
我记得我的第一次。你怎么会不记得你的第一次?那是魔法。
我是说,你是个 Lisp 爱好者。你可能已经很习惯递归了。是的,我只记得被括号的海洋包围着。我的意思是,那可能真的是我……高中时,我想是 Java 还是 C++。哇,我怎么不记得了?那一定是 C++。然后大学里,那些普通的、无聊的软件工程课是 Java,但那些特立独行的、酷的孩子们都在用 Lisp。那时你做 AI,当时所谓的“AI”,就是 Lisp。如果你想写一个国际象棋引擎,你会用 Lisp。所以对我来说,我真正爱上编程的时刻可能是 Lisp,以及编写黑白棋程序和国际象棋引擎,各种玩游戏的引擎,然后我可以和那个东西对战,而那个东西会打败我。被自己创造的东西打败的乐趣。哦,还有生命游戏(Game of Life)。元胞自动机(Cellular Automata)。那时我……我构建了那个,你知道,各种编程语言。那与其说是关于编程语言,不如说是关于你创建的系统。那让我充满了无限的喜悦,拥有……现在类似于链表的情况,创建一个系统,其中每个独立的单元格只知道它的邻居,并按照非常简单的规则运行。但当你将整个系统作为一个整体,并允许它随时间演化时,你可以创造出无限的复杂性。所以我就……天哪,那些都是很多“醍醐灌顶”的时刻,我只是看着元胞自动机所能创造出的美丽复杂性。那确实让我充满了无限的喜悦。但是,是的,我只记得括号。所以我的第一次记忆淹没在括号的海洋中。
哦,天哪。好吧,首先,我的是用 Java 写的,所以我的第一次经历有点更死板,你知道,有点像企业级的体验。但是……是的。我在一个实验室里,那时每个人都在用 CentOS……或者 Cent OS,随便你怎么说。我总是叫它 CentOS,那个“清新制造者”。所以就像我身处这个非常冰冷……谢谢。我身处这个冰冷、死板的环境中,用我的微软键盘,用 Java 编程。我仍然有这样一种……绝望的记忆,因为我热爱编程,这是在链表之后,但我无法理解递归。所以我去了大学书店,买了一本书,是 Deitel and Deitel 的《学习 Java》,里面有一个章节是“递归”,所以我打开它开始阅读,但它就是没有触动我。我陷入了这种困境,心想:“也许我不是一个程序员。也许我不配进入这个能搞懂递归到底是什么意思的人的圈子。”Deitel and Deitel 的书里,我仍然记得这句话,他们的原话是:“每个初出茅庐的年轻开发者都能解决这个递归程序”,而那个程序就是汉诺塔(Tower of Hanoi)。你猜怎么着?我不知道我至今是否能解决汉诺塔问题。这是一个非常难的递归问题。我就坐在那里想,“哦,天哪。我做不出来。”我在实验室里坐了八小时、十小时做这些事情,非常担心。那是递归周,我们必须完成一个实验作业。“我做不出来。”我只记得当时真的为此感到担忧。然后……因为我一直以来的大问题是,“好吧,做阶乘。”为什么不用 for 循环呢?“好吧,那斐波那契数列呢?”为什么不用 for 循环呢?我不明白。递归的目的是什么?我还不明白。它如此强大。为什么?它看起来就像一个非常复杂的 for 循环。所以我就是无法理解。然后那天实验课来了,任务是:“我给你一个二维数组,你必须从文件中读取。这是一个起始位置的样子。这是一个结束位置的样子。这是一堵墙的样子。我希望你找到一条穿过迷宫的路径。”所以我只是坐在那里想,“好吧,我想我可以向上走,然后创建一个已访问网格,这样我就知道不再访问这些地方了。”然后突然间,它就开始“咔哒”一声,明白了。就像是,“等等。我不知道迷宫,但如果我只是向上、向右、向下、向左走,每次我到过那个方格就跳回来,不再访问它,它就会一直走下去。”那一刻我意识到,“我真的明白了。我一直都理解递归,只是从来没有遇到过一个真正有意义地使用它的问题。而那是我最大的失败,就是我用我手头的问题来衡量我的理解,那些问题只是列表遍历,这不是递归的好用例。所以我只记得那种解脱……哦,天哪。递归。那是我生命中一个伟大的时刻。
我的意思是,公平地说,这确实需要一次信念的飞跃,因为人们会告诉你,那些墨守成规、教条主义的 Java 老师会告诉你,理解递归很重要。但这需要一次信念的飞跃,相信这是一种看待世界的不同方式,而且是一种强大的方式。实际上,我想我现在记得我的第一次了。好吧。我想那是在某个游戏中进行深度优先搜索(depth-first search),也许是黑白棋(Othello)之类的,并为此实现了递归。理解你可以通过状态空间搜索轨迹并递归地完成它?那真是令人震惊。只是想象那些可能性。你仿佛能看到一切。是的。是的,数字飞舞。就像《美丽心灵》(The Beautiful Mind)一样。那时我也发现了阴谋论,我看到了。我看到了真相。好吧,是的。那我们刚才在说什么?哦,编程对你来说最痛苦的方面是什么?你早期编程时有哪些深刻的痛苦记忆?
我觉得最让我印象深刻的经历有两次。第一次是在一家叫 Schedulicity 的公司,我……我不知道他们现在是否还在运营,但他们……哦,Schedulicity?是的。实际上,这个名字太糟糕了,以至于当你查看他们付费的 Google 广告词条时,他们会确保自己排在列表顶部,拼写简直是疯了,因为没人知道 Schedulicity 这个词怎么拼,所以 Google 对此的优化简直是滑稽。但好吧,回到正题。编程中最让我受不了的,我真正认为编程最糟糕的一点,就是当你什么都知道的时候。所以当我做这份工作时,每天来上班,都没有任何惊喜,也没有任何疑问。我不理解代码库,当然,这很公平。我没有理解代码库的所有东西。但我知道我会进去,从数据库中生成某种对象。我会从数据库中取出那个对象,然后将其映射并显示在网页上。没有创造力,什么都没有。这几乎就是流水线式的工作。那对我来说是一个非常艰难的时刻,就是……我不喜欢编程,因为我对它了如指掌。我已经确切地知道那天要做什么。我知道所有我必须克服的障碍。没有“未知的未知”,如果你愿意。它一直都是已知的。对我来说,那是编程最糟糕的部分,就是当你已经知道解决方案,而这只是一个你打字多快、如何将它从你的头脑中传达到你的手上的问题。
所以,缺乏不确定性,缺乏挑战,就是痛苦所在?这很深刻,Prime。这门槛很低。你如何定义自己?我喜欢问这种普遍性问题。男性。好的。你直播各种编程内容,但你是什么类型的程序员?你是全栈开发人员,还是做网页编程?也许你能列出所有不同类型的编程,然后根据你的身份,将自己置于其中。包括性取向。
是的,我们可以把所有这些都放进去。而且,显然这两者是紧密相连的。OCaml。来吧。谢谢 Dillon Mulroy。好的,所以我们先回答之前或中间的问题,也就是不同的原型。我认为这是一个非常有趣的问题,因为如果你上 Twitter 或者你是个新手,你可能会认为只有网页编程,也许还有其他一些东西,比如游戏编程,但你可能会觉得,游戏编程也是用 JavaScript 在网页上进行的。这种对编程世界的看法非常狭隘,我敢打赌,如果你现在问很多人最流行的编程形式是什么,他们可能会说是网页编程。如果你说哪个包含最多的仓库,GitHub 上有多少百分比的仓库是基于网页的,他们可能会说 90% 或某个巨大的数字。但现实是,有一个完整的嵌入式机器人世界。你知道,你熟悉机器学习(ML)方面的东西。还有网络、性能、操作系统、编译器。你可以从事的编程垂直领域有巨大的多样性。所以我们经常从网页的角度谈论编程,或者一些非常狭窄的东西,我认为这更多是 Twitter 的一种社会建构,实际上我不认为它能代表整个编程世界。我认为很多编程真的非常有趣。有一些非常棒的东西。构建自己的语言是一次非常有趣的经历。每个程序员都应该尝试一次,只是为了对事物在生活中如何运作有一个完全不同的视角。但就我所做而言,我一直将自己视为一名工具工程师。所以在我工作的时候,通常我会从用户界面(UI)开始,然后他们会说:“好吧,嘿,我们需要一个用于这个东西的库。”然后我就会是编写这个库的人。所以在 2012 年、2013 年,我正在为网页编写一个用户界面库,它可以像 iPad 一样操作,你可以捏合和缩放,但它仍然是一个网页。因为那时我们还没有这些东西。它是一个画布,必须进行所有的矩阵操作等等,才能……你知道,感觉就像你在 iPad 上,但实际上它不在 iPad 上。顺便说一句,这是 iPad 2 时代,所以是很久以前了。所以每次我找到一份工作,他们都会说:“好吧,嘿,我们需要做一个库。嘿,你能开发一个构建系统吗?”所以那时没有 Grunt,没有 Gulp,也没有任何这些东西,所以我不得不自己手动编写 JavaScript 构建系统。所以我总是从事为开发人员构建工具以帮助他们成功的工作。我一直非常喜欢这个领域。所以后来我在 Netflix 工作了 10 年,我想说我这 10 年的大部分时间都在为开发人员构建工具,让他们能够成功地完成工作。所以我一直非常喜欢这方面,因为你的股东和使用你程序的人都懂编程,他们会说:“嘿,我需要这个。”通常他们需要的东西,就是他们真正想要的东西。而对于普通人来说,他们想要东西,但他们真正需要的东西和他们真正想要的东西之间往往存在这种奇怪的分离。这就像亨利·福特(Henry Ford)那句老话:“我只想要一匹更快的马”,而他说:“不,你真正想要的是一辆汽车。”所以你必须玩这个游戏,努力弄清楚,而对于开发人员来说,就像是:“我知道你明白我在做什么。我知道你想要什么。我们一起搞清楚吧。”
实际上,这让你对编程有了非常好的宏观视角。所以我喜欢从界面开始的想法,比如你需要捏合等等,然后弄清楚实现这一切所需的全部内容,包括可能需要的辅助工具,如何使其更高效,所有这些东西。所以是整个事情。这真的很酷。好的,那么这算是全栈吗?按照全栈的普遍定义,意思是……与从底层开始,试图优化某种特定事物,而不考虑最终界面会是什么样子的系统相比。很多从事网页编程的人,他们从不超越事物外观的前端。他们总是认为会有某个人,某个在阴影中、在地下室黑暗中的苦力,会实现后端。
会有某个 Gilfoyle 在做后端。是的,我喜欢称自己为通才,只是为了提供一些想法。在 Netflix 的某个时候,我构建了 WebSocket 连接。所以对于电视来说,WebSocket 的工作方式就是我刚刚编写的代码。所以我构建了框架,在那之前我做过内存相关的工作,再之前我为某个工具构建了用户界面。我就是能把事情搞定。你告诉我做什么,我就会去做。我不会试图在某一项特定活动上做到非常出色。我不想成为一名 Kubernetes 工程师,尽管他们是世界上最棒的雇主,但如果我必须去学习 Kubernetes,我就会去学,学习如何部署一些东西,然后希望能转向下一件事,如果这说得通的话。
我在 Reddit 上发帖说我正在和你交谈,有很多很棒的问题。有人提到我应该问你关于 DevOps 的问题。你能解释一下 DevOps 是什么吗?它是一种程序员的特种部队吗?是开发人员的海豹突击队六队吗?DevOps 是什么?你能定义一下吗……你是一名 DevOps 工程师吗?
嗯,人们一直告诉我 DevOps 不是真的。实际上,你想要的是平台工程师、云工程师、基础设施工程师。我只是经常觉得,如果我们只是做一些基本的命名,最简单的方式就是,DevOps 是那些确保当你启动一个服务以及所有这些东西时,它不会凭空消失的人。它是能够在规模化运营的全部支柱。真的,如果你想想看,如果你只是在写一个夫妻店网站,那些用 PHP 做 WordPress 等等的人,他们会构建一些东西,然后把它交给,我不知道,Linode、DigitalOcean,某个公司。他们并不真正需要一个非常复杂的构建、部署等等。只是一个拥有简单网站的人,这样他们就可以销售他们的商品。所以他们并不真正需要那个。所以这就是我如何看待 DevOps 的,当事情需要扩展时,那就是你雇佣的人。
是的,那些人真的很棒。我在 Google 的时候,就像是,哦,是的,有很多花哨的机器学习人员,但那些运行基础设施的人,基本上就是确保系统不会崩溃的人,他们就像巫师一样,而且他们是必不可少的。
这是一个非常了不起的职业垂直领域。显然,我正在使用一个非常宽泛的术语来描述,我敢肯定,很多……你知道,因为确保东西不会崩溃,你也可以说那是一个 SRE,对吧?站点可靠性工程师。随便吧,那些在 Google 穿飞行夹克的人。所以当我们说 DevOps 时,我认为人们在这个类别中对术语非常讲究。他们会说:“嗯,实际上,你提到的是基础设施工程师而不是站点可靠性工程师。”这就像是:“好吧,是的,我明白了”,但通常当有人想到 DevOps 时,他们会想到管理服务器及其生命周期和可靠性的人。有 DevOps。它真实存在吗?我不确定。Vercel 扼杀了 DevOps 吗?
问号?是的。哇,你几乎是个记者了。那是个头条。让我们回到最初。小 Prime。你提到了 Netflix。对于那些不知道 ThePrimeagen 是谁的人来说,他几乎每隔一句话就会提到他非常成功并且在 Netflix 工作过。
没错。几乎和我提到 Neovim 的次数一样多。
哦,太好了。告诉我更多关于 Neovim 的事。不,请不要。那么,小 Prime。从一开始。你的人生经历非常坎坷,我认为这对很多人来说都是鼓舞人心的。你经历了很多痛苦的低谷,包括冰毒成瘾、失去,就像你提到的,你从中走了出来,成为一名成功的程序员,一个激励大量人进入编程领域并找到人生成功的人。所以也许……我希望你能从头开始,讲述你完整的人生旅程。
如果我们要开始这段旅程,最好从我四五岁的时候说起。那是我第一次接触到色情内容,它就像耳虫一样,在我生命的大部分时间里一直困扰着我。从我还是个小男孩,一直到二十多岁,我几乎每天都会想到色情内容,没有一天例外。即使那么小的时候,也是如此。它非常耗费我的心神、时间和思想,从很小的时候就开始困扰我。我七岁的时候,父亲去世了。那是一段非常艰难的时期。我仍然记得有一次去中国,我们被告知了一些规定,其中一条就是‘嘿,别谈论上帝,如果谈了,就用‘爸爸’这个词代替。’我当时就说:‘好的,爸爸!’那是我十七年来第一次说出这个词,或者说很久以来第一次。说出这句话感觉太奇怪了。我当时就想:‘哦,那是我这辈子说过最奇怪的话了。’感觉太不自然了。回过头看。随着年龄增长,我显然很擅长电脑,也很擅长获取色情内容,当然,还在网上玩电子游戏。一个有趣的小插曲。Twitch 上有个叫 Lord Toc 的人,我不太记得他的名字了,但他开发了一款游戏叫 Grail,G-R-A-A-L,也就是 Graal Online。我小时候玩的时候,它就像《塞尔达传说》一样,但它还有关卡编辑器和一种类似 C 语言的编程语言。我就是通过观察这些符号并弄明白它们的含义,然后让游戏里发生一些事情,从而学会了编程。这就是我接触编程的开端。所以,谢谢那位朋友,不管你的 Twitch 名字是什么。好吧,继续说。随着年龄增长,我的社交能力非常差。我不是一个很擅长社交的人。高中生活很残酷,我经常被嘲笑,真的不能说在高中过得很愉快。我肯定感觉格格不入,或者说有点错位,或者说不合时宜。我不太确定哪个词更准确。所以在那时候,我总是渴望被接纳,融入群体。我忘了说一个小插曲。我父亲去世后,我哥哥开始吸毒,他也因此让我接触了大麻,所以我八岁的时候吸了一段时间大麻,直到大概十一二岁,然后停了一段时间,再后来长大一点又吸了很多,但是……所以我在很小的时候就接触了很多这些东西。15到18岁,大量饮酒等等。当我高中毕业时,我感到非常悲伤。我对一切的进展感到非常难过,我曾试图自杀,显然那是一次非常糟糕的尝试,但我今天仍然在这里。我对此感到非常高兴。我很高兴我没有真的去做,当时不得不去了医院等等。当我康复后,我仍然记得走出医院的那一刻,感觉就像你内心有什么东西破碎了。你读过《时光之轮》(Wheel of Time)这本书吗?它大概有14000页,但在大约12000页的时候,主角 Rand 必须故意杀死一个女孩。那就是他崩溃的时刻,他进入了‘硬核 Rand’模式。对于那些了解《时光之轮》的人来说,会明白这一切。对于不了解的人来说,这可能很令人困惑,我理解。不是亚马逊的电视剧,不是那个《时光之轮》。在那一刻,我内心有什么东西破碎了,我不再在乎了。所以所有的社交尴尬,以及其他一切,都随之消失了。于是我开始吸食大量毒品。LSD、迷幻蘑菇、冰毒。吸了很多冰毒,做了很多那些事,然后去上大学,继续做很多那些事。我吸食了过量的迷幻剂,以至于好几年里,每当我走过高对比度的物体时,眼睛旁边都会出现小小的波浪线。所以那段人生时期,基本上就是由一系列糟糕的决定所构成。然后在我大约19岁的时候,某个晚上,我真切地感受到了上帝的存在,非常强烈和真实。我当时面临一个选择,就像 Frodo 站在刀刃上一样,如果我往任何一边走,我都会掉下去,我需要改变我的生活。你现在必须做出选择。你想这样做吗?所以我记得当时想:‘好吧,我确实想改变我的生活。我不喜欢这种经历。我不喜欢我正在过的生活。我仍然非常悲伤,仍然感到非常绝望。我仍然有所有这些感受。我只是在假装是另一个人。’然后那天晚上我就睡着了。我的生活没有任何改变。一切都还是老样子。第二天我醒来,还是同一个人,我当时就想:‘哦,那真是一次奇怪的经历。’然后我就继续我的一天。然后我记得,那天晚上,我看了色情内容,突然间我感到一种深刻的、强烈的羞耻感。我当时想:‘我这辈子从未感受过羞耻。我不知道现在发生了什么。’然后突然间,当我吸食大麻时,我感到深深的羞耻。当我伤害别人或做错事时,突然间……就好像从那天晚上起,我有了良知。如果非要说,那就是我的天赋。就在那时,我甚至没有选择。我必须改变我的生活,因为无论出于什么原因,我在那一刻被改变了。所以从那时起,我开始真正努力学习。我总是开玩笑说我高中成绩是2.14。有位老师亲手给我写了一张纸条,说我是她教过最差的学生。诸如此类。我真的不是一个好学生。然后在那一刻,我感觉:‘好吧,现在生活改变了,’我开始努力学习,努力成为一个好学生。结果发现这真的很难。我真的很差。我仍然只得了 C。我去学了预备微积分,结果没通过,我当时想:‘天哪,我以前是数学高手,现在却是个不及格的笨蛋。’所以我一直在质疑自己等等,我在学习中心、数学学习中心花了无数个小时。然后在这段旅程的某个时刻,大概是一年半之后,我突然开窍了,从一个最差的人立刻变成了最好的。那之后的一切,我不知道发生了什么。突然间我成了数学最好的人。我开始上我的计算机科学课。我真的什么都懂了。一切,在努力了几年之后,突然间变得容易了。我不确定这是否发生在几周之内,或者什么时候开始变得容易,但它首先是建立在巨大的困难之上的。然后,这就是我真正开始渴望和热爱学习过程的时候,也就是在经历了那些年之后,事情开始变得容易的时候。因为我只是被做某事的渴望所驱动,并没有想过它会变得更容易,然后突然间它就变得更容易了,这太棒了。那确实是我人生中最大转变的开始。我开始非常非常非常想再也不看色情内容了,因为每一次都带来巨大的羞耻感,我真的想戒掉。那是我迄今为止戒掉最难的瘾。戒烟也真的很难,难得令人震惊,但色情内容无疑是所有这些中最糟糕的。然后我想大概在22岁的时候,我终于戒掉了所有类型的瘾,然后我工作了一年,我想大概在21岁零九个月左右,我不太确定我是在哪里戒掉所有这些瘾的,但……至少是那些外在的瘾。然后,在某个时候,六个月后,一年后,我遇到了我美丽的妻子。事情开始变得越来越顺利。我越来越热爱工作。我热爱编程。我开始每天编程12小时。我看了电影《社交网络》(The Social Network),之后我就想:‘我要创业。’于是那天晚上我开始了我的第一个创业项目,它就是用 PHP 写的。
很好。
PHP,是的,5.2版本左右。很棒。那段时光很棒。我当时非常有动力去做这件事,我会一直编程……有时我会连续编程24、36小时,不间断,那是我当时唯一想做的事。我想我妻子有点受不了我了。她会说:‘你能送我去学校吗?’我就会说:‘不,我在编程。’我当时不是一个很好的人……我考虑事情不够周全。
嗯,是的。
我当时就是如此投入,不间断地做着,那个故事就是我如何成为现在的我的过程。
我们来试着逆向分析一下那些痛苦和成功。你有时把它说得很容易。我们试着更好地理解它,也许从你七岁的时候说起。你对当时失去父亲所经历的痛苦有什么看法?你觉得呢?它对你产生了什么样的影响?你当时有什么样的记忆?
我能说的最好的方式就是,我从来不知道父亲是什么。我当时还很小,也许能够压抑,甚至能够长期记住事情。因为我知道大多数人小时候的事情记不住多少,所以我也不太确定。如果我注定要失去父亲,我当时可能处于最好的年龄。你知道吗?如果你在11或12岁时失去亲人,那是个糟糕的年龄。我哥哥就是那样,他陷入了毒瘾,再也没能摆脱。所以我更多的是一种模糊的感觉和一种渴望。我只是希望我有一个父亲。
那种渴望对你的成长和生活产生了什么影响?
我想这就是为什么我社交能力那么差的原因,从某种意义上说,我一直在寻求认可,对吧?我需要认可。我想很多人都渴望那种认可或那种充满爱的形象,而我却没有。所以我想我只是在其他一切事物中寻找它,对吧?如果我要对我的行为进行心理分析的话。当时,我并不是主动地那样想,但是,我总是想要有什么东西来填补我所感受到的那种空虚。
我想很多听众会对你高中时的经历产生共鸣。作为局外人,被欺负,在家中经历许多不同的复杂情况。你会给他们什么建议?
高中最糟糕的部分是,你被一群同龄人包围着,感觉这种状态会永远持续下去。
嗯。
你不会觉得……你身边的人,你觉得他们会陪伴你一生。至少我是这么想的。直到很多年以后我才真正意识到,他们将是你生命中最不重要的人之一。
嗯。
这想起来非常令人震惊,特别是如果你现在正身处其中。
嗯。
对吧?现在他们就是你全部的经历,你的整个现实。然后有一天,这一切都停止了,真正的生活才开始。
嗯。
这真是令人震惊,如果我能告诉当时的自己,也许我就会成为一个截然不同的人。
说得太好了。我的意思是,这就像一次试运行。你知道电子游戏开始时会有一个小教程吗?高中生活就是那样。
嗯。
而实际上,那应该是一个尝试新事物、冒险的机会,因为真正的生活开始后,会有更多的后果。
嗯。
因为真正的生活开始后,会有更多的后果。
嗯。
在这里,如果你喜欢一个女孩,就约她出去。去尝试,去冒险。如果你被欺负了,就还击。去尝试一下。
我可不赞成打人。
我会的。狠狠揍他一顿,然后去学点柔术,学会怎么制服他。然后那个拒绝你的女孩就会想,‘嗯,也许我该给那家伙第二次机会。’做一个厉害的混蛋。这是一个尝试的机会。这是一段非常激励人心的演讲,教你如何大展身手。
确实如此。我的意思是,这确实有道理,我认为特别是……我不知道女孩子们的高中经历会是怎样的,但作为一个男生,高中时期肯定有很多身体上的要求。有很多身体上的衡量标准,至少在我成长的地方是这样。我想这可能并非所有高中都如此,但如果高中里都是男生,那很可能就是这样。所以,是的,做这些事情,去练巴西柔术(BJJ),参加任何这些活动,可能确实有帮助。因为即使你从不打人,仅仅拥有一定程度的自信心可能就是一件非常有价值的事情。但只要记住这只是你生命中一个短暂而微小的时刻,这本身就是巨大的帮助。
我的意思是,你表达的方式完全正确。感觉就是这样。感觉这些人会陪伴你一生,这就是整个世界。所以这意味着,如果有人欺负你,或者你在高中地位等级中处于低位,那就会产生巨大的影响,这意味着你将在世界的地位等级中处于低位,你的一生就完蛋了。这承载着巨大的分量。这就是为什么从心理上来说,成为一个高中生是极其困难的……我认为父母和社会常常低估了高中生的困难程度,心理上有多么困难,以及为什么有些人会患上抑郁症甚至濒临自杀,这都是非常非常困难的。
是的,我认为甚至……人们总是说,‘在我那个年代,’等等。我认为今天确实比以往任何时候都更难,因为在我小时候,人们是‘定性’的。意思是,这是个酷家伙,这不是个酷家伙。而今天,人们是‘量化’的。你有32,514个粉丝,你有12个。人们可以直观地……他们可以在你所在的任何平台上检查你的确切社会价值。那肯定要难得多。我可以想象,这会带来巨大的压力,以至于……不酷的感觉可能更糟糕,更具毁灭性,因为你有一个确切的数字来衡量你有多不酷。
是的。那里的挑战。任务,使命,就是记住,仅仅因为你的社交圈和高中里的人认为你不酷,实际上可能意味着你很酷。你需要找到那种酷,培养它,让它蓬勃发展,这样当真正的生活开始时,你就能全力以赴地冲出来,因为——
说得太好了。
我认为,如果说有什么的话,那就是高中在挑选酷人方面真的很糟糕。无论形成什么样的系统、等级制度,那都是一种非常肤浅的等级制度。你擅长的是非常普通的东西。这就是你晋升的方式。
你父母给你买了辆豪车。
豪车,对吧?
就是——
物质化的东西。是的,没错。
这是一种贪婪搜索。你看,他们没有一个合适的搜索方式,所以他们只是达到了局部最优。
但是……我的意思是,即使是那种贪婪搜索的目标函数也真的很糟糕,那些在高中游戏中获胜的人,往往不会是在更激动人心、更美好的生活游戏中获胜的人。所以,去做些了不起的事情,去尝试。怪咖才是会成功的人,高中里的怪咖。可能是因为他们也受到欺凌,心理上受到更多折磨,从而能够更多地探索自己的思想,思考作为一个人意味着什么。因为如果你在高中里是赢家,你就不会受到挑战,不会自我反省,不会去尝试新事物。所以,只要不把你击垮,受到一些折磨是有好处的。色情成瘾,这是另一个我认为会引起很多人共鸣的强大问题。你提到这是最难克服的成瘾之一,这很有趣。
让我这么说吧,有些成瘾在社会上更受关注,而色情成瘾不是其中之一,这使得它非常困难。你的朋友都不会为你加油。如果你在 Twitter 上说,‘我戒色情了,’他们会说,‘嗯,这对你很好,但不是每个人都……’没有人会对冰毒(meth)提出这种论点,对吧?没有人会说,‘嗯,不是每个人都必须戒冰毒,好吧。这实际上是一个很好的行业,那些生产它的人也很好,对吧?’没有人会提出那种论点。然而对于色情,你会遇到一堆事,朋友会觉得你这样做很傻或者什么的。就像你……它就是这样一种更难的成瘾。所以它感觉被接受了。
而且我认为它也是一种你可以私下进行、参与并向世界隐藏的成瘾。有些成瘾很难长时间向世界隐藏。而色情成瘾可能就是一种你可以持续多年,然后它会加深的成瘾。这可能是一个严重的问题。天哪,我真庆幸我是在互联网出现之前长大的,因为色情内容太容易获取了,太容易深陷其中了。我的意思是,你能谈谈它对你生活的影响吗?也许是一些低谷,但也要谈谈如何克服它?
我想就影响而言,你会对女性产生一种长期且扭曲的看法。从最根本上说,我……再说一遍,我只从男性的角度来说,色情内容最基本的一点就是你为了自己的欲望或需求而利用另一个人。它不是一种深层次的需求。色情内容没有必要。它纯粹是一种基于欲望或淫欲的活动,无论你想用什么词来形容。它纯粹是一种物化他人的活动。别人被展示出来供你享乐。所以我想你会一直带着这种观念。我确实认为,我在高中时期约会的女性,或者高中和大学毕业后的女性,我把她们看作是达到目的的手段。我认为色情内容极大地改变了我脑海中的这种看法,我没有给予他人应有的价值。总的来说,它真的贬低了人性,这是我的看法。然后它把人变成了商品。而我不认为人是商品。我认为每个人都有价值。所以在那段时间里,对我来说,色情内容最大的影响就是,它是消费主义或物质主义的失控,你可以这样问或争论。而且它极难戒掉,就像你说的,因为我可以看色情内容,然后出去吃午饭。没有人会知道。没有人会有任何想法。它非常私密,可以是短暂的会话。它不需要花费……你不能吸了迷幻药(acid)然后出去吃午饭,对吧?你的一整天都会非常不同。所以它非常快速、容易、方便。然后显然还有所有的科学和统计数据,比如男性在观看或接触性化图像后的一段时间内会做出更糟糕的决定。还有整个多巴胺效应,就是你不断需要更多的多巴胺。这就是为什么人们通常不会只看五分钟色情内容就结束一天。网上总有那个‘一百个标签页’的笑话。那是因为你一直在进行这种持续的多巴胺循环。所有这些说法都很好。我确信统计数据和科学以及所有这些东西对一些人来说是非常好的论据。但对我来说,归根结底就是,这真的是一件好事吗?这真的是我们想要的吗,以如此亵渎或漠视的方式去评价他人?我真的认为它对灵魂有害。即使所有数据都说它对你有好处,我仍然说它实际上是坏的。
是的。你必须着眼于长远的大局,以及它对你与他人之间人际关系产生的心理影响。这不仅仅是针对色情片,更普遍地说,我对所谓的“男性圈”的问题在于,我认为与许多女性发生关系很棒,很美好。但问题是,如果把这作为你人生的主要目标,就像色情片一样,你就会贬低最美好的事物之一,那就是亲密关系。这对于深厚的友谊是如此,对于恋爱关系也是如此。我认为色情片以其最纯粹、最黑暗的形式做到了这一点:重要的是性,而不是与他人之间深层次的连接。我认为,回到高中和男性圈,如果目标是发生性关系,这有助于提升地位和自信等等……所有这些都很棒,我认为。但它也可能是一种上瘾。然而,对许多人来说,更棒的是深厚的友谊,或者与伴侣之间深厚的亲密关系。那也他妈的太棒了,两者都很好。
客观上来说,拥有……我想说,没有任何理由可以证明,一个拥有无意义性生活的人,比我和我结婚15年的妻子拥有更好或更有意义的生活。我们拥有非常……在任何情况下我都可以依赖她。而如果你过那种生活,它当然可能……感觉很棒,但它没有任何意义。它没有任何实际的真正价值。
完全正确。我确实认为,发生性关系可以对年轻男性的自信心产生巨大的积极影响。我认为,通过一定数量的性伴侣,你可以收集到很多经验,这可以让你放松,不再那么紧张异性,不再那么紧张人际交往。这将使你更清晰地看待世界,并真正找到那个可以与你建立深厚亲密关系的伴侣。有时,围绕着社会赋予性关系的这种价值而产生的紧张感可能会蒙蔽你的判断。如果你通过多次性经历来释放这种紧张感,那么你就能清晰地看到,发生性关系远不如你所说的,找到对的人重要,包括我应该把深厚的、持久的友谊也算在内,而不仅仅是浪漫伴侣。
嗯,我的意思是,我认为你说得对,我们的社会非常强调性关系。我确信这在历史上任何时期的男性群体中都是如此。我确信这是一个从未停止过的常见玩笑。所以我确信它存在,但是……而且,在某种意义上,你经历过之后,可能确实有一些道理……是谁说的来着?吉姆·凯瑞(Jim Carrey)。“我希望每个人都能变得富有,这样他们就会意识到金钱解决不了你任何问题。”这种领悟,即社会告诉你极其重要的东西,实际上并不是最重要的部分。它是一个非常重要的……它是一个很好的标志,表明你的关系是健康的。就像如果我和我妻子连续几个月完全没有性生活,那肯定出了问题,这意味着什么……我们不再处于同一层面。但它也不是一个好的衡量标准。仅仅因为你有很多性生活,并不意味着你拥有良好的关系。所以它就像一个独特的……我忘了这里正确的术语是什么,但它是一种看待问题的独特方式。我们的社会给予了太多的强调。也许这就是为什么色情片如此难以戒掉的原因,但我猜这只是多巴胺效应。但对我来说,最重要的部分,以及真正有回报的部分,就是拥有……只有我的妻子。我不会看……我拼命努力不去看其他任何女人。我希望我不会像马克·扎克伯格(Mark Zuckerberg)在白宫那样被抓拍到。我不看色情片。我妻子对我完全信任,她不会有任何需要质疑我的情况。我认为这建立了一种更深层次的,非常深厚的关系,因为信任感更强。我认为关系的深度可能与你们彼此之间的信任程度成正比。没有信任很难建立深厚的关系。
是的。而且,信任的一个前提,也许是组成部分,就是脆弱性,即你冒险向另一个人展现脆弱。当这种脆弱性得到回应时,会建立起非常强大的信任,这是一件美好的事情。是的。我个人只是……考虑到我的身份,这更具挑战性,向世界展现脆弱,而外面有很多人想因此伤害你,但我认为无论如何都值得去展现脆弱。
这总是值得的。从某种意义上说,风险总是值得的。显然,每个人都有不同的生活,他们必须根据自己的情况来衡量行动,对吗?因为一个没有社交媒体关注者或任何东西的人,他们的风险回报可能只是局部影响,但这同样可能对他们造成毁灭性或伤害。所以,在我个人看来,风险总是值得的,因为找到我的妻子显然是我生命中最具影响力或改变性的事情。或者说是第二重要的,我会说与上帝相遇的那一夜可能是我生命中最具影响力的事情,它导致了其他一切,但妻子会是下一个最具影响力的。我的意思是,我现在开始整理自己的生活了。我变了。我是一个改变了的人。
我们能试着逆向推导你找到上帝的那一刻吗?19岁时发生了什么?因为感觉那是你摆脱痛苦、摆脱上瘾或开始那段旅程的一个巨大飞跃。你认为当时发生了什么?
我想当时的感觉就是……没有什么是我不愿意跨越的底线。一切都无所谓,就像……突然之间,就在那一刻,我好像有了一种深层的恐惧和领悟,我正在走一条路。这真的是你想走的路吗?我不知道那条路的结局会是什么,或者诸如此类。我倾向于不对我不理解的事情进行猜测。我只知道在那一刻我有了选择,我只是选择了……我不再想要那样了。对吗?这整个事情都混杂在一起,就好像我没有任何价值一样。我所有的意义或价值都寄托在性或发生性关系上,我拥有……所有那些我们刚刚谈论过的事情,那就是我所有的价值所在。而那是一个糟糕的价值寄托之处。一切都到了一个临界点。我无法告诉你那天是星期几,除了那是夜晚,我在蒙大拿州立大学(Montana State University)的南赫奇斯宿舍(South Hedges),加油,山猫队(Bobcats)!那就是……是的,那是我们在橄榄球比赛中做的手势。别担心。但我能告诉你的就只有这些了,因为那个夜晚并不比其他任何一个夜晚更特别或更不特别。它的特别之处在于我至少有机会做出选择。
因为你从中找到可以给别人的建议,现在可能有很多年轻人正在与色情成瘾作斗争。你能给他们什么建议?如何克服它?
对我来说,要克服它,我必须意识到我正在从我未来的妻子那里夺走一些东西。有些人会说:“哦,等你有了女朋友就可以停止了。”但事实是:“不,因为你从未停止过这个问题。”你不能通过替换来解决问题。所以当时我没有女朋友,我没有那些。我只是意识到我确实在从我未来的妻子那里夺走一些东西。那时我甚至不认识我现在的妻子。她当时还没有出现。我甚至不确定她当时是否在蒙大拿州立大学。所以就是这样……一旦我有了这个领悟,我想它就从我的头脑进入了我的内心,他们说这是宇宙中最远的距离。我终于明白了。那才是真正改变事情的地方。至于说什么能帮助你改变等等,我不知道是否有……我认为没有灵丹妙药,对吗?如果有人能给你一种药……我忘了是谁说的这句话,但有这样一句非常有趣的话,大概是说,他是一个非常抑郁的人,他正在与自杀作斗争,他在回忆录中写到了这一点。他去看医生,医生们实际上说:“嗯,这是抗抑郁药,它会帮助你。”他说:“问题是科学家告诉我,我只要触碰我的大脑就能让自己快乐,仅此而已。他们可以伸进去,配置一些东西,我就会快乐。”他说:“对我来说,这很像走到田野里,然后服用一种药就能看到雨一样。我可以看到雨,它会落下,银光闪闪,很美,但所有的庄稼仍然会枯死,因为实际上并没有下雨。我必须自己去发现如何才能快乐。”所以对我来说,我看色情片的原因是我不快乐。我试图寻找意义。我试图在某种事物中找到价值,对吗?某种本应最终给我带来这种终极满足感的东西。但它就是没有,无论你多么努力,无论你多么认为它会,没有任何逃避,没有任何色情片能给你带来你所寻求的那种满足感。这就是它令人上瘾的原因。这就是我呼吁你不要这样做的原因,但至于如何摆脱它,我只是通过领悟才摆脱了它。
我认为这描述得非常精彩。你知道你正在做的事情阻碍你找到未来的妻子,而未来的妻子更广义上可能意味着通往繁荣、美好生活的道路。我认为我们做出的很多选择都阻碍我们开启任何未来的大门。我认为真正好的做法是想象,就像我们谈论高中时一样,生活中有很多轨迹能让你真正快乐,你需要以一种让你有机会沿着这些道路前进的方式来构建你的生活。有很多上瘾,有很多选择阻碍我们沿着这些道路前进。所以,只要相信你将拥有一个美好的生活,并从你的生活中移除那些阻碍你走上这条道路的事物,这本质上就是你所做的。这是一个信念的飞跃,如果你放弃色情片,更好的生活就在前方等着你。
嗯。我肯定说不准这会花多长时间,才能过上更好的生活。但对我来说,如果我没有先迈出那些步子,我绝不可能拥有现在这种关系,因为我无法以她应有的方式去珍视我的妻子。我只会通过我当时看待事物的角度或标准来评价她。
我得问问。我从没吸过冰毒。我从没吸过冰毒。
顺便说一句,这真是个很好的过渡。
哦,天哪。说实话,我不知道自己在采访这方面到底在搞什么鬼。不过,是的,冰毒和LSD……我吸过ayahuasca。我吸过很多次迷幻蘑菇。关于这个话题,我应该说,在 Twitter 和整个科技界,很多人对ayahuasca持负面评价,也有一些人持正面评价。我认为这完全是碰运气。我曾有过不可思议的经历,但我不认为我会向任何人推荐它。这是一种风险,一种严重的风险。这真的像掷骰子一样,你可能会遇到你的心魔,它们可能会摧毁你,或者你可能会遇到你的心魔并放下它们。或者你可能会像我一样,从未……显然我没有心魔。我很确定它们藏在某个角落里,但我从没在吸毒时遇到过它们。我总是非常开心。我喝醉了也开心。吸食ayahuasca后我超级开心,充满爱意。我不明白,我不明白心魔在哪里,但那是我的生物化学反应,不管那是什么。对另一些人来说,一次体验可能很棒,而下一次就可能彻底毁掉你的人生。所以我不知道这方面的建议是什么,也许应该避免,但我们终将一死,人生嘛……我倾向于冒险,但毒品……如果你搞乱你大脑的生物化学,你真的会以一种会折磨你的方式毁掉自己。所以我通常会建议人们完全避免毒品,除非你是个疯子。Hunter S. Thompson。
这真是个开场白。
抱歉。冰毒是什么感觉?
这真是个很好的开场白。我喜欢……你说的非常正确,至少在致幻剂方面,你将经历的体验存在巨大的差异。而且没有保证,没有……你买了这东西,不代表你就能玩得开心,对吧?有很多……就我个人而言,我发现那东西非常……我相信精神领域,对吧?我相信魔鬼和天使都存在。我相信上帝存在。而那个领域就像……我不知道它会让你接触到什么,但那是一种非常非常不同的体验。现在,有些人会说,“哦,那只是一堆大脑里的化学物质。它们都混在一起了。LSD只是把你的所有通路都搅乱了。”然后就说,“是的,这些体验很深刻。”我曾有过一些非常离奇、非常酷、非常糟糕的……我体验过所有这些感受。我只能告诉你,我个人总是说同样的话。就像,我做出的选择无法收回。我绝不会剥夺自己这些经历,因为我不知道如果没有这些经历,我是否会成为今天的我。但如果你没有过那种经历,我支持你,或者至少部分支持你,甚至更强烈地认为,你不需要那些经历。我不认为它们会……你不需要经历那些来做出好的决定,或者意识到人的价值,对吧?你不需要那样做。那么,冰毒是什么感觉?冰毒就像……如果你吸过可卡因,可卡因一开始就像一场15分钟的舞会。就是……它就是那么强烈。它就是那么美妙。然后接着是大约五小时的……就是感觉浑身不自在,对吧?我不知道该怎么形容。冰毒也是那样,只不过我没有那么多的舞会感觉,甚至根本没有,但那种感觉持续了大约12小时。
嗯。
所以滑了很多滑板,到处跑,熬夜。
你会说那是一种愉快的感受,还是更像逃避生活的孤独?当下是愉快还是消极的?不是指后果,而是指当下那一刻。
所以我的意思是,这是一个非常有趣的领域,那就是并非……你不能一概而论。你经常会发现有两类吸毒者。一类喜欢阿片类药物,另一类喜欢兴奋剂。他们通常不喜欢……在毒品界,很少有人两者都吸。他们真的只是找到他们偏爱的一类,然后就沉迷其中。那么冰毒是每个人都会喜欢的吗?嗯,从根本上说,正如你所看到的,以及人们体验毒瘾的方式,答案是否定的。但对我来说,我只是真的……这有点符合 ADHD 的特质……因为你知道你精力充沛,你总是活在当下。所以你就是活在当下,但感觉就是,“哦,我活在当下!”一切都如此强烈!你就是想真正活在当下。所以它就是持续不断地体验那种感觉。那么那很棒吗?嗯,有些人……我妻子总是告诉我,紧张或者……我忘了,一种情况下的焦虑感也可以等同于刺激感。我忘了确切的说法。她可能对我搞砸了这一点感到非常失望。但你可以以截然不同的方式看待这两种体验。有些人站在人群面前感到兴奋。有些人站在人群面前,那简直是他们一生中最糟糕的经历。他们真的宁愿去死,这真是个疯狂的想法,也不愿站起来讲话。所以对我来说,冰毒是那种刺激的一面,但同时,它并没有完全给我想要的东西,无论我当时在寻找什么。我会用它来尝试获得我想要的东西,但它从未给我想要的东西。
嗯。对我来说,我所有经历都非常棒。不推荐这些。但就像迷幻蘑菇——
顺便说一句,那是 YouTube 的政策,你必须说,“顺便说一句,无论你做什么,都不要从事非法活动。”
ThePrimeagen 先生,我没有主人。我不在乎 YouTube 或其他什么。我想说什么就说什么。我只是——不。不,说实话,我不在乎 YouTube 或任何人。我只是对我说的话很谨慎,因为仅仅因为我曾有过积极的经历,我不想让听这个的年轻人认为他们应该尝试这种体验。我认为更强大的信息是,即使没有那些,生活也很棒。这方面我肯定在酒精方面进行过尝试。所以对我来说,我是一个内向的人。我害怕这个世界。社交让我充满焦虑。酒精有时确实能帮上忙,但我认为说实话,那甚至不是酒精,而是在别人和我说话时,我得做点什么。我只要喝点液体就行。“是啊。嗯哼。”这是一种社交行为。喝啤酒时,就像……“是啊。嗯哼。是啊,我们玩得很开心。”我认为……对我来说,它的作用和……如果液体看起来像酒,它通常也能起到同样的作用,因为酒精……如果你拿着威士忌或啤酒之类的东西,它会发出一个信号,表示我们应该玩得开心。所以我们在社交,对吧?我们玩疯了。然后那意味着……你实际上不需要酒精。你不需要酒精也能玩疯,但当你手里拿着酒时,会发生某种社交信号。所以我参加过一些聚会,我没有喝酒,只是假装喝酒,我也能玩得开心。所以我曾……但话虽如此,环游世界时,有时你确实需要喝下一瓶伏特加。这对我的工作来说非常重要,但这更像是一种文化体验,而不是成功社交互动和带来幸福的必要组成部分。所以不喝酒……我认为不喝酒也能玩得开心。所以所有这些……天哪,我非常小心地说毒品对我的生活产生了好的影响,因为我认为对大多数人来说,不,对绝大多数人来说,从长远来看,它们会产生负面影响。所以我认为如果你要二选一,那么不吸毒不喝酒意味着有一天你可以成为美国总统,孩子们。我应该说……哦,天哪。
那是他最搞笑的一句话,就是“如果我喝酒,你会讨厌我。”我就是喜欢……对我来说,那让我乐不可支。就像,“天哪,那真是句太好笑的话了。”
健怡可乐很棒。那里的自我意识和幽默感很棒,不过,是的。
但我支持你。我吸毒的所有原因,那都是某种程度上的逃避现实。我敢肯定那就像……会是原型或者我将其归类的范畴,或者是追求一种无法从它们那里获得的感受。这就像试图在工作中找到意义。你可以在你所做的事情中找到满足感。那是非常好的事情。你可以找到满足感,并对你所创造的东西感到满意。你可以被这种体验所震撼,但你无法找到……我怀疑你无法找到目的。也许某些特定工作中的人可以。我显然是在非常宽泛地概括。比如如果你是 EMT,你拯救了某人的生命,也许那整个经历中可以有目的,对吧?所以我不是说所有事情,但就编程而言,大多数程序员,你无法简单地找到自己的目的。吸毒也是一样,你无法找到你正在寻找的东西,但它们是非常好的消遣。然后到某个时候,这种消遣会带来沉重的代价。我想浮士德博士可能最清楚这种沉重的代价,但你只是在用一个东西换取另一个,到某个时候账单到期,那笔账单可能非常非常大。
你提到的另一个让我觉得非常鼓舞人心的时刻是,你预备微积分不及格。你在学校里真的很挣扎。你意识到学习真的很难,然后最终你能够坚持不懈,我不知道,突破那道挣扎的壁垒。你能否作为建议,弄清楚发生了什么,以及你能给那些正在挣扎的人什么建议?
嗯。我来更清楚地描述一下,或者说快速回顾一下:我学了预备微积分,挂了。我又学了一次预备微积分,又挂了,再学了一次预备微积分,得了C。所以我学了三次。然后我在夏天学了微积分,也就是微积分1。那次期末考试……期末考试是两个小时。我30分钟就做完了,而且那是全校最高分。之后我在所有微积分和微分方程的考试中都得了最高分。我是400人中唯一一个完成微分方程期末考试的人,而且我得了最高分。所以我就觉得……我变得非常厉害了。我不知怎么地就从非常差变得非常好了。我唯一……我所做的就是我必须赢,这不是一个选择。不是那种“哦,这会很棒”的感觉,而是“如果我做不到,我就毕不了业,也完成不了我的事情”。所以每天我起床后,就去上我的课,不管多少个小时。课后,我直接去了数学学习中心,做那些题目。回家后,我就拿出书,书后面有奇数题的答案。我一遍又一遍地尝试解决那些问题,直到我完全掌握。然后它就变成了一种,我……简单的死记硬背占据了主导,就像乘法口诀一样,但却是微积分的,所有东西都印在我脑子里。反三角函数替换、三角函数替换、泰勒级数和麦克劳林级数。所有这些东西,一遍又一遍地重复。最终它们变得容易了,变得非常容易。只是我必须硬塞进去。有些人,你听过这样的故事,他们几乎不来上课却能得A,我从来都不是那样的人。我总是那种必须坐下来,把所有东西都读一遍的人,而且我不擅长抽象概念。我喜欢从具体到抽象,而不是从抽象到具体。我非常不擅长理论上谈论事情,然后尝试应用它们。但如果我能实际操作一次,那么对我来说进入抽象就非常容易了。所以对我来说,就是……时间是无法替代的。所以如果我要给出建议,那就是你必须投入足够的时间。一小时又一小时会让你慢慢变好。一开始,它是令人沮丧的,是令人气馁的,而且不好玩,因为你很糟糕。但到某个时候,如果你坚持足够长的时间,你就不会那么糟糕了,你会开始变得还不错。然后到某个时候你甚至可能会变得很擅长。当你擅长某件事时,感觉棒极了。这就像一种探索性的体验。如果你曾经演奏过乐器,你就不必再思考所有那些微小的细节,才能正确地演奏出东西。你开始思考如何探索那个领域。……正确地演奏出东西,你开始思考如何探索那个领域。这就像一个完全不同的问题。编程也是如此,编程也有着同样的感觉。就像你会跨越那个障碍,它就会变得神奇,而不是一项苦差事。
嗯。一旦你跨过那个障碍,不知怎么地其他事情也会变得更容易。但如果你想拥有真正成功的人生,那么你就会找到下一个障碍。嗯,我一直都是这样。一切都来之不易。
嗯,我没有免费的午餐。一切都充满了痛苦和挣扎。
我想有人就这个话题说过,你认为‘更聪明地工作,而不是更努力地工作’这句话是你所不喜欢的。Reddit上有人告诉我这个。
嗯。我不只是不喜欢它。我讨厌那句话。
好的。告诉我你为什么讨厌它。你感觉如何?
我之所以不喜欢它,是因为它有一种隐含的暗示,那就是你已经知道什么是‘聪明’了,所以照做就行。也就是说,事情应该很容易。你不必那么努力。你只需要走那条快速、简单、显而易见的道路,然后砰,就完成了。我从来没有在我做过的任何事情中体验过这种感觉。实际上,每件事都非常困难,而且大多数时候我甚至不知道自己在做什么,所以我甚至不知道‘聪明’是什么样子。所以对我来说,我学习如何‘聪明地工作’的唯一方法就是非常非常努力地工作,并且知道没有捷径。然后当我最终弄清楚什么是‘聪明’时,当我既聪明又努力地工作时,效果会好得多。
我认为这其中蕴含着深刻的真理。
我们社会中有很多这样的短语让我抓狂,
但那句话是……抱歉,那句话如果能深入探讨一下,它确实很普遍,因为它也困扰着我。所以,你说的很好的一点是,它预设了事情应该很容易,如果你看不到简单的路径,你就是个失败者。这是一种隐含的意思。所以它让许多挣扎的人觉得自己是失败者,因为他们看不到。然后他们面临的选择是,好吧,我就偷懒,然后也许深刻的真理会以某种方式降临到我身上。嗯,我想我从来没有,而且我也不认为我遇到过能在没有极其努力工作的情况下找到‘聪明’方法的优秀工程师。那些优秀工程师令人恼火的是,回过头来看,他们忘记了那些努力工作,因为他们只记得现在从他们摸索出的高效、聪明的工作中体验到的所有乐趣。他们忘记了。所以当他们给出建议时,他们会给出愚蠢的建议,比如,好吧,就用简单的方法做,这就是简单的方法。但不是的,你必须投入时间。乐器就是一个很好的例子,比如吉他和钢琴。我投入了,我不知道多少千小时。现在当我解释柔术时,我也听起来像那些说‘放松’的人。顺便说一下,‘放松’对于像钢琴这样的体力活动来说确实是一件很棒的事情。但要学会放松你的手,放松你的思想,你的身体,并利用你身体的生物力学来施加正确的杠杆作用和时机等等,这需要数千小时的学习。仅仅是学会放松就需要大量的努力。在柔术中,这需要好几个月的时间,你一次又一次地被击败,直到你哭着坐公交车回家。你的自尊心彻底粉碎。然后,在深夜或第二天早上,一点点要素被领悟。从沮丧中,会生长出一朵洞察之花。你利用这种洞察力,然后在接下来的一个月和一年里再次被击败。然后你不断成长。从中你会发现柔术或柔道是多么地简单,就我个人而言,或者钢琴或吉他。然后是的,当你最终达到时,深刻的真理或一项技能的精通会感觉很简单,但对大多数人来说,这条路会很艰难。
我想我应该给那句话加一个补充,我认为那句话应该是‘努力工作,变得聪明’。
不错。那可以印在T恤上。
就应该是这样。
嗯,同意。好了,那是一个离题中的离题。
我还能再说一个我非常讨厌的文化短语吗?
可以。
‘过程比结果更重要。’每个人都听过这句话。花一秒钟思考一下这句话的含义。这意味着从现在开始,你永远只会走向一个更糟糕的地方。字面上就是这个意思。‘享受过程,庆祝终点’,这才是它应该有的样子,但不是。人们说这些短语,它们无处不在。这些非常肤浅的短语没有任何逻辑依据。你就会想,为什么过程会比终点更好呢?我想这甚至可能是C.S. Lewis的一句引言,C.S. Lewis就说过,不,这太糟糕了。过程实际上并不比终点更好。
我喜欢那些反鸡汤海报。‘进步,向前进总比向后退好,即使你仍然一无所获。’有很多——‘积极性,如果今天没有击垮你,别担心,明天它还会再试一次。’有很多非常棒的海报。
在加州待了几年,我对此深有体会,那太痛苦了。我甚至不知道有这种东西。
有这种东西。
天哪,我想要那个。
嗯。
嘿。大家好,我是ThePrimeagen。我在这个播客中忘记提及的一件事,我觉得自己太傻了,竟然忘了,那就是我妈妈在我生命中扮演了多么重要的角色。我爸爸去世后,她每天要工作18个小时。她真的让我们的家得以生存。我一直很敬佩她,一直觉得她很了不起。当我决定重新振作起来时,她真的是我内在的动力,让我能够继续前进,因为我真的想让她感到骄傲。那些年她付出了高强度的努力,我真的想让她知道我对此非常感激。所以,嘿,我只想说声谢谢。妈妈,我爱你。
对于不了解的人来说,你曾在Netflix工作过。
顺便说一下。
顺便说一下。那么,你是如何从我们提到的那些困境、挣扎、成瘾等等中走出来,到一个你能在这样一家了不起的工程公司工作,并在那里创造出很棒的东西的地方的呢?所以,讲讲你的Netflix故事吧。
是的,我之前提到过,我想创办自己的公司。所以,我忘了具体多久了,大概一两年或者两年半吧,我创办了一家公司。用的是PHP和jQuery,大家最喜欢的语言都凑齐了。你甚至可以用jQuery解决数学问题。所以我当时就完全沉浸其中,不停地做这件事。那是Stack Overflow最火的时候。我会在Stack Overflow上问一些很蠢的问题,比如‘什么更符合Pythonic风格?’然后就能得到很多赞,赚取很多‘Karma’,做这些事都很有趣。那段时光很美好。我当时完全投入,就像呼吸一样,每天都在做这件事。所以就是不停地创业。最终那家公司失败了,所以我不得不去找一份真正的工作。现在回想起来真是不可思议。在我告诉你那是什么之前,我想先快速讲一下我父亲的事。我父亲在90年代初,大概91、92年的时候,创办了一家电话卡公司,你可以预先购买长途通话时长。如果你还记得90年代末,大概97、98、99年的时候,10-10-220之类的各种长途电话预付费公司都出现了,而且非常非常大。所以我的父亲比这个概念早了六年,最终他的公司也失败了。但他确实在一个后来在电信领域非常非常流行的事物上起步太早了。我长大后也创办了自己的公司,我做的是短信营销。那是在2010年,你可以收到关于各种优惠的短信,诸如此类。当然,十年后的现在,你不停地收到短信,短信营销也大行其道。所以我也像我父亲一样,在电话营销领域创办了一家公司,只是早了大概五年。不,事实上,我并没有超前于时代。只是,有些人会说我在那种情况下运气不好。但当时我做的时候,这对我来说是如此显而易见,80%的手机都是功能机。大多数人用的都是翻盖手机。当我出去推销Via Text的时候,那是那个产品的名字。我们也有Via Text的短代码,所以很聪明,六位数。当我出去推销的时候,我当时只有一部翻盖手机。我甚至没有智能手机,因为对很多人来说,它们有点难以承受。所以回想起来那真是个疯狂的时代。但那之后,显然我不得不去找一份真正的工作。我们当时住在蒙大拿州博兹曼(Bozeman)校园旁边的一套公寓里。我们楼下的那个人肯定吸了毒。他好几次威胁要杀了我们,总是尖叫,精神失常。一个非常不正常的人,我们叫他‘楼下愤怒男’。有一次我妻子掉了一节电池,AA电池。好的,我们说的不是B型电池或D型电池。我们说的只是AA电池,掉下来,落在地上,他就喊‘我要杀了你。’简直疯了,楼下那人行为完全失控。所以我不得不去找一份真正的工作,我们需要搬离那里。我们要开始我们的生活了。所以我去了个小地方工作,[听不清],我之前也提过那里的无聊。后来去了WebFilings,在那里我工作了大量的时间。在那段时间里,我仍然在尝试创业。我还做了一个,你可以提前给朋友预设生日祝福信息,然后它会通过Facebook自动发送。我们称之为Greet Feed。这很巧妙。尽管如此,我讲所有这些故事是因为我所做的一切都是在探索、构建、完成事情、工作、了解企业生活、学习如何在企业生活中沟通、如何在工作中取得成功,以及了解我们所涉及的各种技术。当时的一项重要技术,特别是在2013年,是RxJS,如果你还记得的话,RxJS,它是从C#移植到JavaScript的一种链接。
对于不了解的人来说,C#最接近的‘邻居’是什么?Java吗?Java是——
他们显然在某个时候直接照搬了Java,但现在它已经成为一种如此动态、有趣的语言,看起来它可能在实用与非实用之间取得一个非常酷的平衡。只是我不太喜欢穿着打褶裤在微软公司编程。
打褶裤是必需品吗?
我想是的。
好的,我们稍后再谈这个。
我们能回到正题吗——这让我有点不适。
好的。WebFilings。
总之,WebFilings就是我必须处理所有矩阵相关的东西,构建系统,诸如此类。这真的让我很受挑战,因为他们还要求我每周工作60小时。工作与生活的平衡非常不健康。工作非常辛苦。那种非常辛苦的工作,接触前沿技术,真正理解这个世界,让我能够非常自信地谈论这些事情,因为我们必须为我们正在构建的用户界面(UI)构建非常复杂的状态机。所以当我开始使用LinkedIn等等的时候,不可避免地,仅仅因为我接触过所有这些技术,并且有一些书面记录证明我接触过这些技术,或者微软。该死,Lex
打褶裤。
打褶裤联系了我。不,是Netflix联系了我,说:‘嘿,我看到你用过RxJS。我们用得很多。你想来我们这里面试吗?’我一直被告知,永远不应该拒绝这种手写的个人面试邀请。这远在机器人出现之前,即使是机器人,也很容易分辨出来。这是Netflix的一位经理,Jeff Wagner,我的第一位经理。他写了一封非常友好的信,说:‘嘿,我看到你做了很多这些事情。我们确实需要JavaScript方面的帮助。我很乐意邀请你来面试。如果你对RxJS感兴趣,我们甚至也大量使用它。’所以我想,好吧,我可以来面试。结果,面试进行到一半的时候,我给我妻子打了电话,我当时感觉自己被打败了,彻底崩溃了,因为我说……她可能还记得,我说:‘我们现在必须做出决定了。我们到底要不要搬到加州去?’因为那时我已经知道我拿到这份工作了。我表现得非常出色。我做得非常棒。所以我确信,我会在Netflix得到这份工作。人们在面试之类的场合总是会非常紧张。而我幸运地避免了这一点。我没有考试焦虑,也没有任何那种感觉,因为当我进入这些情况时,我唯一的目标就是展示我已经知道的东西。所以就像我走进这个场合,我过去五年每周都在为此准备80小时。所以我就走进去,展示我所知道的一切。这在2013年,电视上的早期JavaScript时代,非常适合Netflix。所以这太棒了,一切都完美地解决了。我在那里被录用了。
所以我们在加州,和Netflix在一起。这是旧金山。
洛斯加托斯(Los Gatos)。如果你熟悉的话,人们通常会用这个经典符号来表示旧金山、奥克兰、圣何塞,洛斯加托斯就在圣何塞的南边一点,属于同一个大都市区。
《黄石》(Yellowstone)在蒙大拿州,就是那个剧。所以基本上就像那样吗,凯文·科斯特纳(Kevin Costner)骑着马?你当时是骑马去学校的吗?
不,但我喜欢那些刻板印象。说实话,在我15岁的时候,我曾经在现在非常繁忙的街道上开车,用点22口径的枪从车窗里射击地鼠。所以蒙大拿州曾经和现在很不一样。蒙大拿州还有很多地方仍然非常乡村化,仍然更像那个旧世界。所以,是的,你可以在蒙大拿州得到你想要的一切。就文化而言,我不太确定如何最好地描述加州和蒙大拿州之间的差异。只是期望不同。我真正欣赏加州的一点,或者至少当我提到加州时,我指的是硅谷。因为显然洛杉矶(LA)和硅谷(Silicon Valley)的态度和思维方式非常不同。你不能真正地将两者进行比较。我可以肯定地说,硅谷的一个非常积极的方面是,每个人都在努力构建或创造一些东西,这其中蕴含着一种非常令人兴奋的能量。你遇到一个人,他们有自己的初创公司,并且正在为之努力。这非常令人兴奋。这也有很多负面影响,我们都同意,我们整个生活都被商业化可能并不是一件好事。但身处其中,每个人都对创造事物充满热情的那种体验,真的很棒。
是的,真的很棒。那种兴奋感,那种能量。
是的,蒙大拿州没有那种氛围。
我对像《黄石》那样展现大自然的节目有一种浪漫的向往。很美。我喜欢骑马。还有人说Reddit上有很多关于你的‘智慧’。其中一些可能是假新闻,但有些是关于马之类的。你喜欢马,喜欢骑马吗?
我们有马……我们的邻居有更多丘陵地带的土地,其中一匹马摔断了腿,所以他们不得不把它安乐死。所以我们就说:‘嘿,我们的地势平坦得多。你可以把你的马放在我们的地盘上。’所以我们就有马在我们的地盘上跑来跑去——
那挤奶呢?有人问到牛和奶牛。
我只养过‘开放牛’。如果你不知道,‘牛’(cow)指的是母牛,‘开放’(open)意味着,他们尝试让母牛怀孕。这头母牛第一次尝试没有怀孕。所以他们认为这个基因不好,所以要淘汰它。这头‘开放牛’现在要被放到牧场上养一年,然后就会变成美味的T骨牛排和各种东西。所以我们会在我们的地盘上饲养‘开放牛’。所以不,‘开放牛’是不能挤奶的。如果你试图给‘开放牛’挤奶,它们会非常不高兴,因为它们不是奶牛。你必须让那头母牛怀孕。然后一旦它怀孕了,你就必须让它进入这种永久的挤奶状态等等。这比我们做的要复杂一些,我们只是让牛吃草,我不需要碰它们。
好的,那太棒了。
Reddit 不是一个能找到关于我的智慧的好地方。他们会给你最离谱的答案。
朋友,我们会一次又一次地回到 Reddit。你跳槽去了 Netflix,那是什么感觉?
谈到这件事,人们总喜欢轻描淡写,觉得“哦,你不过是跳槽到一家 FANG 公司,这算什么冒险?”但在2013年,这听起来风险极高。我妻子当时怀孕36周,我们不得不搬到一个人生地不熟的地方。我们即将迎来第一个孩子,甚至连医生都没有。如果你不了解生孩子是怎么回事,你会希望和医生建立关系,那里面有很多事情。所以那是一段非常艰难但也很棒的经历。我去了Netflix,当时他们的文化手册……Netflix 仍然带有一些老派的 X 世代(Generation X)风格。他们的文化手册写着“快速招聘,快速解雇”。它非常直白地告诉你:“嘿,我们就是这样运作的。如果你不达标,我们就会把你踢出去。”所以,我离开了一个更稳定的地方,去了一个我不认识任何人、工作上又声称会随意解雇员工的地方,而且我妻子即将生孩子。我来自蒙大拿州,每个蒙大拿人天生就对加利福尼亚州有种不喜欢。所有这些因素都汇集在一起,让人觉得“哇,这会是一次非常紧张的经历”。确实很难。这不是那种我们觉得“哦,我现在在 FANG 工作了”就能轻松搞定的简单经历。我们必须努力克服。生孩子非常困难。我们的第一个孩子非常难带。身边没有任何家人可以帮忙,这对我妻子造成的负担比我大得多,这是肯定的。
对你来说,技术学习曲线是怎样的?你穿着格子裤,打扮得很正式地出现了吗?
是的。
你需要学习哪些技术栈?因为我想象中 Netflix 拥有令人难以置信的基础设施,它必须传输海量数据。我对 Netflix 和 YouTube 都感到非常震惊,这些公司必须传输、服务海量数据。
Netflix 的情况最简单。在所有公司中,Netflix……尽管你可能会说我们在观看时长上可能超过了 YouTube,我不确定是否真的如此,但我们假设 Netflix 的观看时长是 YouTube 的五倍。无论如何,Netflix 面临的问题从根本上来说比所有其他公司都更容易。我们稍后再谈这个。我先告诉你技术栈,然后我会告诉你为什么它的问题从根本上来说更容易。所以当我刚到那里时,他们给了我一台 PlayStation 3。我的老板说:“去学一些代码。几天后回来告诉我你学到了什么,然后我就会开始给你分配 bug 来修复。”我当时在电视团队。我必须插上 PlayStation,开始在 PlayStation 3 上运行程序,并弄清楚如何在电视设备上运行 Netflix。那是2013年。当时就是那样。是的,没有那么多电视内置 Netflix,更不用说他们称之为“Darwin”的新应用程序了。所以如果你在那年早些时候买了 VIZIO 电视,你会得到他们的旧版本,叫做 Plus UI。所以没有多少设备有新版本。我们不再支持 Plus,也从未在 Plus 上积极开发,我们只在 Darwin 上做事情。所以我必须学习整个技术栈,后端或者说中间层,也就是实际后端和前端之间的中间层是用 Groovy 编写的。我四处了解后发现,如果你不熟悉 Jenkins,那么你可能从未接触过 Groovy。但 Groovy 是一种 JVM 语言。它是一种非常有趣的语言,但它在 Netflix 是这样开始使用的。
等等,PlayStation 3,你在说什么?
哦,所以你们有不同类型的设备。为什么是 PlayStation 3,还有其他不同的——
任何可以连接到电视的设备?好的,明白了。
哦,是 Apache。Apache Groovy 是一种强大的面向对象编程语言,运行在 Java 虚拟机上,于2007年发布。它已经发展成为一种多功能语言,结合了静态和动态类型功能。
好的,所以 AI 有点在骗你。Groovy 并不是一种强大优秀的语言。那个说法让它听起来比实际酷得多。你遇到一百个人中,只有一个接触过 Groovy 的人会说:“哦,是的,Groovy 很棒。”其他99个人都会说:“天哪,千万别碰那种语言。”所以当我到那里时,Netflix 没有一个人,那四十多名工程师中没有一个人真正知道 Groovy 是如何运作的。不知怎么的,人们只是把这些脚本拼凑起来,放在那里,然后它就运行了。这还是在 Groovy RX 端口出现之前。我们写了自己的版本,叫做 WX。那简直是噩梦,可观察对象(observables),所有这些东西。我记得有一次他们告诉我:“哦,是的,有了 RX 就很简单了。你只需要说你需要做什么,它就会映射出来,然后砰砰砰,一切都会运行。”我当时想:“哦,真的吗?”所以我所做的就是像 `observable.sleep(1)` 这样,因为我只是想看看它休眠然后做下一件事。结果发现,当一个线程自己休眠时,没有其他线程可以唤醒它。我只是把所有预发布环境(staging)都关掉了,因为我运行了大约10次。比如,“哦,它没响应了。哦,它没响应了。哦,现在它甚至不回来了。”把所有预发布环境都搞垮了。所以那天下午所有开发人员都无法工作,因为我锁定了所有实例,结果发现它实际上不是多线程的。我们被告知的每一个假设都是谎言。没有人知道他们在做什么。那是一段疯狂的时光。所以我自然而然地倾向于处理这些问题,因为我擅长打印调试(print off debugging)。我擅长做那些事情。所以我想,是的,我会在那里搞清楚。我会做这件事。所以我不得不重写电视前端的数据结构,从所谓的 LoLoMo(电影列表的列表)改为 LoLoRoMo(电影推荐对象的列表的列表)。我们为什么要这样做?想想看。你有两个列表,一个有《虎胆龙威4》(Live Free Die Hard),因为你喜欢布鲁斯·威利斯(Bruce Willis)。另一个也有《虎胆龙威4》,因为你喜欢硬汉做硬核工作。在那些日子里,我们只有一种方式可以显示你为什么想要它。所以我们不能说:“哦,因为你喜欢这部电影。”你点进去,它还是会显示同样的原因。所以我们必须增加一层间接性,以便我们可以用推荐信息来“装饰”视频。
好的。所以你可以抽象出推荐空间,而不是直接的电影空间。
是的。所以你不能把它挂在视频上,因为那样的话,所有显示相同视频的地方都会是一样的。
太棒了。
我必须做所有这些,我用 Groovy 编写了它,我只是做了——
真是个有趣的名字。
人们都问:“你是怎么用 Groovy 写出来的?”我只是说:“嗯,我读了一天的语言参考,然后就编程了。”嗯,你什么意思?可以说,这是一种非常激进的语言。所以我自然而然地成了了解这些事情的人,他们就给我分配了越来越多的相关工作。这就是我脱颖而出的方式,我愿意做别人都不愿意做的事情。
是的。你能谈谈打印调试(print off debugging)吗?你进入一个系统,世界上有很多这样的系统。Twitter 就是这样,当 Elon 收购 Twitter 并接手时,那里有一个老旧的、像一团糟的垃圾代码库,你基本上必须进行打印调试。进入一个代码库并弄清楚这到底是怎么回事的过程是什么?它是如何工作的?有什么缺陷?有什么假设?你必须逆向工程所有其他工程师在过去几个月甚至几年里所做的事情以及造成的混乱,你必须弄清楚这一切是如何运作的,才能进行改进。
我一直擅长打印调试(print off debugging),因为我最早的一个“支线任务”工作是在学校时为政府编写机器人程序。所以我每周会按合同工作很多小时。我的老板 Hunter Lloyd,顺便说一句,他是一位很棒的教授,他只是说:“嘿,这是你的电脑,这是机器人,这是你如何插电。这是你如何运行代码。你能写闪存驱动器、以太网驱动器吗?你能写行星式扁平电机(planetary pancake motor)吗?这里有一些手册,我缺了一些。自己搞定吧,我一会儿回来。”所以那对我来说就是政府工作。我当时想,好吧,我会把所有这些都搞清楚。我把它们都搞清楚了,唯一能从机器中获取信息的方法就是打印。所以我必须非常擅长通过打印来解决问题。所以这大概成了我掌握的一项技能,就是我可以通过打印调试来解决很多问题。显然我不是游戏开发者,那可能是一个不同的世界,可能应该使用……我想 John Carmack 在这里谈过调试器有多棒,那是另一个世界。因为我在 Netflix 的时候,有些机器存在于 AWS 的某个地方,我没有登录它们。我甚至不知道如何登录它们。我甚至不确定我是否有登录它们的凭据。它们在某个地方运行一次,我必须弄清楚发生了什么以及为什么会发生。所以就像我要成为……这就是我所训练的。我是一个打印调试冠军。所以我就可以非常快速地处理这些事情,并弄清楚它们为什么会以这种方式发生。
你真是个特别的人。我认为能够进入任何代码库、任何情况并进行打印调试,这是一项令人难以置信的技能。这意味着你身处一个黑暗的房间,摸索着试图弄清楚这个房间是什么样子。
嗯,我有代码,所以我就能大致描绘出正在发生的事情。我不理解服务或其他任何东西,但你可以很快地开始猜测哪里出了问题。
没错。但从打印输出的角度来看,它能帮助你验证直觉,测试直觉,并积累越来越多的信息。然后你开始从中构建出更宏大的图景,了解哪些是会破坏系统的边缘情况,哪些不会。我认为这种情境对很多工程师来说是令人生畏的,他们会在这一点上崩溃。我认为能够进入一个代码库,这确实是一项强大的技能,我们中很少有人能从零开始。而这实际上是网络开发和普遍存在的一个根本问题,他们会说,我不知道发生了什么,我要从头开始写我自己的东西。而不是在语言空间、问题空间上进行打印调试,因为这个代码库中已经包含了大量的智慧和已解决的问题。理解并学习过去的错误和智慧,从前人的经验中汲取教训并在此基础上进行构建,而不是全部抛弃从头开始,这是一项更重要的技能。这显然是你在每天都会看到的新 JavaScript 框架中经常发生的事情。
我有一个关于这方面的绝佳故事,我认为它极大地塑造了我对其他开发人员的看法。有位开发人员,他总是以一种我认为非常奇怪和离奇的方式编写代码,这与 Falcor 有关。它是我们 Netflix 的数据获取库,需要在移动设备上运行,所以我必须用 Objective-C 编写。它也必须在电视上运行,并且必须在网络上运行。所以它在所有平台上都运行。我和另一个人负责让它正常工作。在请求端,我们需要对已有的信息、待处理的请求和新数据进行去重。所以我必须根据用户的请求来处理所有这些,然后只优化请求我们没有的数据。他写代码的方式非常滑稽,我当时想,天哪,这家伙简直是个怪咖。于是我把他的代码全删了,然后开始自己写,心想:看,我的代码多好,看起来太棒了。然后我发现,哦,有一个边缘情况。好吧,我明白他为什么那样写了。但这没什么大不了的,我其他的代码真的很棒。到最后,我发现我几乎是逐行地复制了他已经写过的东西。只是稍微符合我的风格,但我写的代码和他的一模一样。我心想,我真是个白痴。在这种情况下,我才是白痴,因为那本来就是一个已解决的问题。我只是没有花时间去学习他做了什么。相反,我通过重写整个东西,重新学习了他所做的一切。
我认为这是一项对人们来说极其重要的技能。我在自己身上也看到了这一点。例如,在面对一个代码库时,这对我来说是一个持续的挣扎。但这普遍适用于生活,当有人做了大量工作来完成一件事时,你应该投入大量时间,并非常擅长弄清楚他们做了什么,为什么这样做。进行大量的打印调试来理解他们做了什么。这比从头开始更有效地深入理解问题。尽管总是有从头开始的诱惑,因为从头开始很有趣。你确实能解决难题等等。但这通常不是正确的做法。通常痛苦才是正确的做法,而对大多数人来说,理解别人的代码库是痛苦的。
如果你想理解一个概念,我强烈建议从头开始。你不知道 HTTP 服务器是如何工作的?创建一个 TCP socket,学习如何解析 HTTP。它会变得非常容易,你会发现,这就是为什么每当我收到请求时,我必须等待文本。我现在明白了为什么文本出于某种原因不在那里。我明白了。我现在理解了。所以你通过简单地解析一些东西,就能获得这些新的视角。
好的。回到 Reddit 的智慧。显然,关于你在 Netflix 的编程生涯,有很多梗和传说。你提到的 Falcor 系统,有人,我想是 Teej,顺便问一下,他的名字怎么发音?
Teej。
好的,Teej。
他的名字是 TJ,但我们叫他 Teej 或 Telescopic Johnson。
哦,天哪,这么多名字。DDoS,分布式拒绝服务攻击,你显然能够实现其简化版本,也就是 DoS。那是个传说。所以你基本上以某种方式破坏了系统。
是的。
你能讲讲那个故事吗?
我很乐意。所以有这个 Falcor 业务,我确实在其他人之前发现了这个 bug,我也向安全部门报告了,它非常糟糕。它甚至有了自己的名字,叫做“Repulsive Grizzly Attack”(令人厌恶的灰熊攻击),他们甚至给出了如何实施的例子。实际上,这意味着有一个请求同时针对内存和 CPU,并且会摧毁系统。看,Netflix 的下一个就是实际撰写的文章。我没有被提及,这有点令人沮丧,考虑到我是发现它并告诉所有人它有多糟糕的人。总之,我也有权进行修复,或者说是第一次修复。所以它是这样工作的,你也可以用 GraphQL 做类似的事情,它也有同样的危险。任何这种请求数据多寡的 RPC 框架都容易受到这种攻击。所以使用 Falcor,你给它一个数组。这个数组叫做路径,它是数据的路径。但有时你不想写出“我想要电影,我想要第零行或列表零或第零行第零列的标题。我想要第零行第零列的描述”。你不想写出所有这些。所以你可以直接说,我想要第零到第十行,第零到第十列,标题和描述。所以你可以用一种非常紧凑、漂亮的格式来写,它会给你所有这些数据。它会去服务器。服务器会把所有这些填充好并给你。哦,该死,列表三,它只有三个视频。那么当我尝试重新请求数据时会发生什么?我需要一种方法来告诉我的系统,你已经请求了数据,但那里什么都没有。所以这叫做一个“装箱值”(boxed value)。它会像类型、某种东西、值,那里什么都没有。我们已经请求过了,那里什么都没有。它就像一个哨兵值,如果你愿意,一个装箱值。我们有一个叫做“materialize”的特殊标志。这意味着当你请求一个路径时,我们会确保填充它,这样我们就不会意外地擦除任何东西。最后我们会说,好的,你所做的请求已经完成,但那里什么都没有。那么,如果我请求第零到一万行,第零到一万列,再加一万个项目,然后一大堆属性,然后要求它“materialize”呢?那么,我将会在 JVM 中创建数十亿个对象,机器会发生什么?它会停止运行。然后如果我们尝试 JSON 序列化……即使它能创建所有这些,我们再要求它进行 JSON 序列化,它也做不到。这是不可能的。所以这就是攻击向量,一个简单的循环就可以让 Netflix 停机很长时间。因为一个请求就会杀死 AWS 上的一台机器。这意味着它会把所有机器都关掉。这是在网站上吗?这是在电视上,在移动设备上。这影响深远。最糟糕的是,它已经在生产环境中运行了多年,所以我们甚至无法回滚。没有那种“哦,糟糕,让我们回滚到两周前,然后我们向前修复并找出解决方案”的情况。不,我们只能回滚到 2011 年。这是我们唯一的选择,就是 2011 年。所以我们必须想办法向前推进。所以,如果有人发现了这个漏洞,可能造成的损失是无法估量的。
澄清一下,提供视频的基础设施会关闭吗?
是的,用户界面,你无法在用户界面中执行任何操作。令人惊讶的是,你仍然可以播放视频,但你永远无法找到一个视频来播放。因为你采取的每一个操作都会被完全关闭。所以它不是 DDoS,因为你不需要大量计算机通过发出大量请求来压垮系统,一个请求就能搞垮一台机器。如果我们有 50 台机器处理数百万个请求,只需要 50 个请求就能关闭整个用户界面。
难道不可能对任何软件系统进行 DoS 或 DDoS 攻击吗?防御所有这些攻击向量可能真的很难。如果你拿任何一个足够复杂的软件系统,可能有很多方法可以压垮它。
是的,这就是为什么人们使用 CloudFlare。我认为 DHH 说得最好,就像我们有自己的网站,外面有一个强大的保镖。所以 CloudFlare 内置了许多实用工具。因为显然,这就是为什么每个人都讨厌所有这些连接到互联网的蓝牙设备,因为它们变成了攻击向量,人们利用它们来 DoS 或 DDoS 其他网站。所以你不需要复杂的东西,你只需要大量的请求涌入,你就可以搞垮网站。这就是为什么这些前端在发现这些问题方面非常出色。但 DoS 有点不同,因为它不必通过大量请求来耗尽资源。它真的只是意味着存在拒绝服务攻击。其中一个可能是曾经存在一个 RegEx 攻击,CloudFlare 实际上对自己进行了攻击并关闭了自己,那就是存在一个 RegEx 扩展攻击,在给定正确的 RegEx 的情况下,如果你知道有人正在运行特定的 RegEx,你实际上可以提供最糟糕的输入,然后那个东西就会进入超级处理状态。处理一个请求需要 10 秒,那么你只需要发出数百个请求就可以关闭整个服务。这不像你需要一些巨大的机器来发出万亿个请求。你只需要少量请求就可以完全摧毁一个服务。所以,网络是一个极其难以正确处理的地方。
这太引人入胜了。我也想知道有多少超能力的黑帽黑客,与好人与坏人相比。有多少坏人,以及坏人一方的技能分布平均水平如何,他们不断地试图攻击?
我猜想,可能有很多非常简单的攻击,比如脚本小子(script kitties),就是那些随便尝试做些事情的人。然后还有大量的社会工程学攻击,这种黑客行为不是通过电脑完成的,而是通过一些经典手段。凯文·米特尼克(Kevin Mitnick)在他的书里提到过一个例子:你打电话给某人,假装说:“查琳,我们正在进行审计,我觉得你的PIN码可能过期了。还是2323吗?”他们会说:“不,是4747。”你就会说:“哦,谢谢,莎伦。”砰!你就成功入侵了。对吧?人们天生喜欢纠正错误信息,这就像一个标准操作。所以人们有各种各样的黑客手段。我的假设是,有非常优秀的白帽黑客,也有非常优秀的黑帽黑客。但是,在漏洞领域,关键在于,如果你发现了一个漏洞却不告诉任何人,那么白帽黑客仍然需要自己去发现同样的漏洞。这就是我认为真正的症结所在:黑帽黑客在某种意义上工作起来更容易,或者至少他们可以利用漏洞更长时间。一种是发现谁在破坏系统的过程,另一种是试图找出如何破坏系统。而且大多数软件似乎都是用牙签和胶水粘起来的,每个部分都存在很多危险。
而且社会工程学方面,那是一个真正的攻击途径。我认为从长远来看,这将是世界上造成最大损害的攻击途径。特别是随着AI工具越来越容易大规模地劝说人们,比如那种“邮件诈骗奶奶”的骗局。我认为这是一个非常严重的攻击途径,涉及到人类心理学等等。我甚至觉得,每当有女孩接近我,那都是某种社会工程学项目,某种攻击途径,某个情报机构的行动。事实上,我非常确定——
我们又回到《美丽心灵》了,不是吗?
《美丽心灵》?是的。我楼上有一块白板,我会在上面计算所有事情,每个人的轨迹和动向。
不过你说的攻击途径没错,尤其是在AI时代。随着我们越来越多地整合AI,有一件事我认为很多人没有谈论,那就是提示注入(prompt injection)非常难以防御,因为目前还不清楚如何防御它。如果它最终只是一个“词语计算器”,输出词语。如果你能找出正确的“词语计算器”输入方式,它可能就会突破其界限,开始做一些不该做的事情。未来会有很多产品将面临他们从未想过的漏洞。编程时忘记一个边缘情况是一回事。现在你必须猜测人们可能会想到什么,让一个能够访问系统的东西去做。而且你没有办法去推断它的行为。它的推断能力来自Reddit以及它阅读过的其他词语,以及如何将它们组合起来。这是一个非常……一个即将发生的巨大领域。这就是为什么我个人认为,现在不要赋予太多权力。我们不知道即将发生什么样的攻击。
是的,我们赋予软件系统越多的权力,它们能造成的损害就越大。这确实是事实。但它们能做到的好事也越多,这就是我们人类文明共同携手前行的刀尖。我们会繁荣还是自我毁灭?这是个问号。Reddit上的好心人要求我问你,你搞垮生产环境那次。这和Falco有关吗?你搞垮生产环境了吗?这是假新闻吗?
我搞垮生产环境好几次了。我因为很多愚蠢的原因搞垮过生产环境。有一次,我搞垮生产环境是因为我当时用PHP,而PHP中“静态”(static)意味着在PHP的整个生命周期内都是静态的,而PHP的生命周期就是每个请求的生命周期,对吧?这就是为什么PHP效率低,因为每个请求都是一个独立的实例,因此静态内存是针对整个生命周期的。我当时可能没把这些联系起来。所以我把一些对象设为静态,因为我觉得,哦,我只需要它在请求的生命周期内有效。结果呢,它们并非只在请求生命周期内有效。一大堆错误数据到处都是。人们显示来自不同的国家,所有信息都错了,因为我只是……“哎呀,糟糕。”我因此制造了一大堆混乱。那是我搞砸的一次。另一次是,如果你在网站首页等待Lady Gaga的视频发布,看着倒计时归零,如果它归零了,显示板就会冻结,无法工作。如果你刷新一下,它就能工作。但那个揭示时刻,那个大揭示,我搞砸了,我老板非常生气,好莱坞的其他人也为此很生气。那次就像是,“我的错。对不起,Jeff Wagner,又是我。”我记得那一次,我特别记得那一次。还有一次,我发布了一个bug,同样是在显示板上,如果你点击“添加到我的列表”,我意外地编写了一个无限循环,然后你的整个网页就会冻结。
这些错误有些是不是很难发现,直到你开始——
现在回过头来看,那个错误似乎非常简单。
无限循环?是的。
实际上,那些日子我们有手动质量保证(QA)人员,他们应该检查所有东西。所以我没觉得那么糟糕,因为我的手动QA同事也漏掉了。我们都漏掉了。但它就是那么简单。只要按下那个按钮,砰,网站就完全冻结了。
用存储值的全局变量污染代码,SPHP(我猜)允许你这样做,这很难发现,因为你依赖它,然后可能有人会给它赋另一个值。
是的,到处都是数据竞争。我当时就是不明白……在我脑子里,静态(static)就是“哦,这是针对整个生命周期的”。我当时太沉浸在PHP的世界里了,以至于我犯了这样一个错误,现在回过头来看是如此明显。但在当时,这很难。
所以总的来说,关于推送到生产环境,我跟Peter Levels聊过这个。他显然主要作为一名独立开发者在运营,但他经常在网站上说有成千上万,而不是几十万人在使用。他经常直接上线,推送到生产环境,这意味着没有测试,就像直接推送修复一样。你觉得这种方法总体上有什么优缺点?
显然,你的组织规模越小,这样做就越容易。我想没有人会反对这种观点。如果只是你一个人在一个项目上工作,那么直接推送到生产环境显然要容易得多,因为你是唯一一个在工作的人。你了解所有的细节,如果出现问题,你也能发现。所以对我来说,这说得通。我认为他的操作方式非常适合他所做的事情。你不能把他那一套搬到微软、Netflix或谷歌,因为那显然会……那会是一场灾难,仅仅是因为有太多人同时推送到生产环境。所以我个人很喜欢这种方式。我认为你必须衡量你正在构建的应用程序及其复杂性,以及你正在推送的内容,还有有多少人在上面工作。我认为所有这些都决定了你如何操作。因为也不是所有应用程序都生而平等。我当时做的那个应用程序是关于缩放和滚动的,我们所有东西都是自己开发的。那是一个逻辑非常复杂的应用程序,无论网站上发生什么,大部分代码都是库代码。如果你没有一套好的测试套件和在推送前运行的东西,那就会变得非常困难。因为当你挤压那个球时,不同的东西会从不同的区域冒出来。这比你做视觉效果为主的应用程序要困难得多,因为视觉效果为主的应用程序,你只影响这个区域的视觉内容,你可以测试它,通常也就到此为止了。而……所以这取决于耦合度等等。顺便说一句,我非常喜欢他的方法。我对任何以这种方式操作的人都抱有极大的敬意,因为我认为这是一种很棒的方式,它之所以如此出色,是因为它打破了科技推特上的一种观念,即“哦,你必须使用所有这些昂贵的服务,你需要使用所有这些东西,因为如果你不使用所有这些东西,如果你不使用最新版本的React,如果你不使用最新版本的这个,你作为一家初创公司根本不可能成功。那是不可能的。”而事实是,“不,不,那不是软件的全部。”大多数软件都不是新东西。大多数软件都是需要有人维护的老旧糟糕的软件,但它实际上非常非常棒,并且有很多非常棘手的问题。如果你换个角度看,它实际上非常棒。
对于不了解他技术栈的人来说,在网页开发方面,他用的是PHP、jQuery和SQL。
是的,都是很棒的东西。我只是惊讶他还在用jQuery,考虑到在现代网络上,现在一切都变得很简单了,你有了`document.querySelector`和`addEventListener('click')`,对吧?它几乎包含了你所需的一切。它有`DOMContentLoaded`,我以前使用jQuery的所有原因都是因为给按钮添加点击事件很难。你必须处理IE7、IE8、IE9的兼容性问题。那些都是很难处理的差异。而现在,它变得如此简单。我只是惊讶他还在用这些。
那肯定是一种权衡。我仍然使用完全相同的技术栈:PHP、jQuery和不同类型的SQL。但问题在于,你继续使用jQuery是因为你可以非常快速地完成工作,而且你没有检测到明显的性能损失。所以,为什么要切换到其他东西呢?但正如我们接下来会讨论的,探索和学习总是好的。
并非所有工具都擅长解决所有问题。所以你认为真正的问题在于你遇到了这种权衡:你有一套非常熟练的工具,你了解所有的细节。没有未知的未知,也没有意外。你知道你在构建什么,你知道你将面临什么。你会顺利解决问题。但如果你尝试使用不同的语言或不同的经验,你会发现有些事情能够以更简单、更高效的方式表示状态。你可以在某些方面比其他方面更高效地解决问题。因此,如果你不花时间去探索,你可能会错过一些能让你在某个特定问题子集上效率翻倍的东西。所以,我重视能够审视所有问题。我不想只专注于一件事。我明白人们为什么会这样做,那都是为了效率。
让我们回到 Netflix 平台的底层架构,更普遍地来说,是 Netflix、Twitch 和 YouTube。每当我使用这些服务时,我都会被支撑这些服务所需的底层架构所震撼。YouTube 和 Twitch 与 Netflix 不同之处在于,创作者可以自行上传内容。在消费端,YouTube 每天有超过 1000 亿次观看,观看时长超过 10 亿小时。但在创作者端,每天有 100 万小时的视频被上传。100 万小时!这意味着你必须同时服务两端,并且要交付所有内容……这对我来说简直不可思议。你能否凭直觉,从宏观角度谈谈,交付这种基础设施需要什么?
对我来说,我觉得极其复杂且难以想象需要多少工程时间的事情是,在这种情况下你如何创建“边缘”(edge)?当人们说“边缘”这个词时,如果你没有经验,我的意思是,边缘是你交付数据的地方。你希望这个边缘尽可能靠近客户,因为数据就存在那里。这样客户和你所做的事情之间的通信量就会非常非常小。显然,光速会累积,跳数会累积,你需要远程调用的服务数量也会累积。它们都会累积,并给系统增加低效率。所以像 YouTube 这样的平台,他们希望能够尽快提供数据,但他们的数据不断变化,而且相关性几乎直接与内容的“新颖性”挂钩。那么,你如何缓存这些东西呢?你是怎么做到的?所以他们一定拥有一个令人难以置信的缓存网络,我甚至无法……我甚至无法想象做到这一点需要什么。这对我来说简直太令人印象深刻了。100 万小时的观看量,有多少种不同的分辨率,涉及多少数据?100 万小时的观看量是什么概念?是 4K 的 100 万小时,还是 1080p、720p、1440p 的总和?这个数字简直是天文数字。
实际上,你说的很棒,对于 YouTube 来说,新内容通常对所有人来说都极其重要。因此,你不能依赖缓存或简单的缓存机制。
是的。
你必须尽快交付新内容。是的,这太不可思议了。所以,整个系统,也就是推荐系统,它了解每个观看 YouTube 的个体用户,并且必须将新内容整合进去,同时还要缓存你可能感兴趣的、数量庞大的潜在视频。在 YouTube 的情况下,还要将广告整合进去,等等。
这是一个非常棘手的问题,因为你必须考虑它的缓存命中率是多少?因为现在问题实际上归结为空间,存储空间真的成了一个大问题。他们有多少数百 PB 的存储空间来决定“好吧,我们缓存什么,在哪里缓存?”这个数字,我想我们用千兆字节或兆字节来衡量,他们可能需要用我甚至不知道名字的字节单位来思考,对吧?这是一个如此不同的问题,这就是我提到 Netflix 的原因。Netflix 在缓存方面的工作要容易得多。如果你没查过,它叫做 OCA(Open Connect Appliance),我们知道要发布哪些视频,知道哪些视频在特定区域很受欢迎。这是一个非常有限的集合。我们不会突然遇到“哎呀,我们又多了 100 万小时的观看量”这种情况。我们甚至不需要担心这个问题。所以,就像是“好吧,我们知道《怪奇物语》第五季即将上线,我们会在全球每个 OCA 中预缓存《怪奇物语》第五季,因为那东西即将被大量访问。”所以它能够做出与 YouTube 截然不同的决策。而 Twitch 甚至更疯狂,因为你现在实际上是在摄取视频,并试图让所有视频同时播出,而且你必须将视频从任何格式和任何比特率转换为系统中更高效的格式。向 Twitch 的工程师们致敬,因为那真是了不起的工作。
而我,Lex,这个混蛋,却跑出来在 Twitter 上抱怨 YouTube 的功能。听着……
不过,你要求的功能并没有错。
我认为这是一个工程问题,即如何允许快速迭代和添加功能,而这些功能不应该需要整合或影响整个代码库。也就是说,在代码库的边缘改进某些功能,而无需咨询代码的“母舰”(核心)。
是因为团队庞大,对吧?那是根本问题。当你达到 YouTube 的规模时,会有专门处理数据仓库的团队/组织。有处理交付的团队/组织。还有像中间层一样的团队/组织,他们就像是与这些地方通信的小型微服务。然后你还有前端引擎。所以对于一个小功能,你必须联系中间层团队,联系后端团队,联系所有这些团队。举个例子,Netflix。你熟悉反乌托邦剧《黑镜》(Black Mirror)吗?
是的。
好的。《黑镜》第一季第一集。你知道第一季第一集吗?所有看过《黑镜》的人通常都知道这一集。
好的,是的。我不记得是哪一集了。
请原谅我的用词,但他们称之为“猪交配”那一集。
哦,是的,当然。
一旦你看过那一集,你就会知道是哪一集了。当 Netflix 引入这部剧时,我被叫进一个房间,里面有副总裁、产品设计师,他们说:“嘿,我们即将发布我们自己版本的《黑镜》,当时应该是第三季。我们不希望第一季第一集成为人们首先看到的内容。所以我们把季的顺序颠倒一下。”这需要我……我召集了大约 20 名工程师才能实现这个目标。这就是大公司的问题所在,最终每一个小事情都必须成为一个独立的团队。所以即使是小……根本就没有“小功能”这种东西。
仅仅是颠倒选择季的下拉菜单顺序,就需要和一群副总裁和工程师开会。这真的很有趣。
是的。
肯定有办法加速这个过程。公司的自然扩张和随之增长的官僚主义确实会减慢速度。但我看到 Elon 做了很多工作,他的团队即使公司规模扩大,也能保持非常快的速度。肯定有办法做到这一点,特别是对于“猪交配”那一集。我不知道这在优先级列表里排在哪里,但对于这类重要的事情,你应该能够快速完成。我不知道。你能谈谈你会怎么做吗?
嗯,我先说说当时是怎么做的。记得吗……所以在 Netflix 这样的地方,会有一个……我想当时它叫一个产品,叫 Dexter。我不记得了。我们有一个实际的电影元数据仓库,它将与好莱坞高度整合,由那一端来管理所有这些。所以我就说:“嘿,你们需要有能力标记那些需要颠倒顺序的东西,因为我们会遇到很多这种情况。”结果确实如此。我们遇到了不少需要颠倒顺序的话题性节目等等。所以就变成了:“我们需要能够颠倒剧集号、季号。我们需要能够隐藏季号或剧集号。”以《切尔西·汉德勒秀》(Chelsea Handler Show)为例,它是一个日播节目,所以你不需要剧集号,只需要最新的那一集。所以存在着整个问题。所以就变成了:“好吧,你们需要在你们那边的 UI 上处理这个问题,然后你们需要能够存储这些数据。然后我们需要去找那些能够从其中获取视频数据并提供给我们的服务层的人。我需要去和他们谈,说服他们需要提供新的方法和所有相关的东西来做这件事。然后我需要去编写获取数据的方法,然后我需要去 UI 端使其可访问。现在我需要去找网站团队、移动端团队、电视端团队。”
是的。
所以,你可以看到这件事像滚雪球一样发展。对我们来说,Netflix做得非常出色的一点是,在我与那些高层人员会面后,我就成了负责人。“我现在是负责人了。”所以我去找所有这些团队说:“嘿,经理,我需要一名工程师。我们得在接下来的几个月内完成这项工作,因为《黑镜》要上线了。”于是她会说:“好的,给你。”“地图团队,我需要有人帮我从lomo中获取数据。”所以就是:“好的,你和这位工程师合作。”我去找BMS团队:“好的,我需要这位工程师。”我去找广告牌团队:“我需要这位工程师。”我去了所有这些小地方,获取所有这些小块数据。然后我就是负责人,我说:“你负责这个,你负责那个,你负责这个,你负责那个,我负责这个。我们开始吧。”就这样,它奏效了。对于一家大公司来说,我们进展得相当快。尽管完成这样一个简单的任务需要20名工程师,但大约在三周内就完成了。但这仍然……我认为这很了不起,相比于其他团队的效率。
嗯,因为你有自主权去做这件事。你说了“船长”这个词。这确实很有力量。对于大公司来说,这是一种风险。因为你可能会搞砸。你可能看不到法律层面上的更广阔背景,看不到对行业的影响,或者所有签订的合同等等。所以这是一种风险,一种你必须不断承担的风险。当你搞砸了,你就去修正,然后可能为此付出法律代价,诸如此类。但从长远来看,这种风险是值得的,因为你会不断创造出越来越好的产品,顺应行业发展趋势,不断在行业发展之前进行创新,等等。是的。
不仅如此,我认为非常重要的一点是,是的,产品会变得更好,但你雇佣和留住的人也会变得更好,因为他们展现出成熟度。他们是那种你交给他们任务,他们就能召集人手,把事情办成的人。这是一群非常值得雇佣的人。因此,你也会自然而然地筛选出那些不仅擅长编码,还擅长解释和说服的优秀工程师。你必须创建一个非常精干的团队,能够快速行动。
我认为对于优秀的工程师来说,不得不等待,比如“好吧,我们下周三和副总裁们开个会……”这会磨灭他们的热情。他们要么不想再做贡献,要么离开公司,要么就变得麻木,戴上“金手铐”,买套好房子,专注于家庭。
是的。我感觉我会在那种情况下死去……说实话,那对我来说就是死刑判决,因为根本没有理由去尝试,没有理由去做任何事。我只会像僵尸一样度过一天,然后就那样了……我不想那样生活。我希望感觉自己正在努力做些什么。
除此之外,我还应该提到,你精彩地阐述了 Netflix 必须解决的挑战是多么不可思议。再加上 YouTube 的元数据问题,因为用户可以上传视频,并且有一个 API 可以让他们自动上传和自动更改所有这些内容。我们提到过,这些都可能成为攻击向量。这是他们在工程方面必须认真考虑的问题。而在法律方面,他们可能会以各种方式惹上麻烦。所以他们必须考虑所有这些,这很引人入胜。
法律方面是显而易见的,但我最初绝不会想到有人会上传你无权拥有或持有的图片。但我向你保证,这种事肯定会发生。然后还有儿童内容方面,对吧?我想想,当你把某个内容标记为儿童友好时,他们有多少次把色情内容偷偷塞进泰勒·斯威夫特的视频或其他什么里面?那是几年前的事了,有那么一个关于泰勒·斯威夫特还是什么的事件。我忘了具体是什么了,我以为是泰勒·斯威夫特。但会有这些伪造视频出现,然后就出事了。这真是个可怕的问题,我很高兴这不是我必须去解决的问题。
好的。所以是的,YouTube、Twitch 和 Netflix 都做得非常出色。你最终选择了,你这个疯子,离开 Netflix,开始一段新的旅程,成为一个“独狼”,开始直播。那是什么?那段故事是怎样的?
我已经直播了将近七年了。实际上是从 Netflix 开始的。我们做了一个慈善活动,Extra Life,特别感谢 Extra Life 开启了我的直播生涯,基本上就是你直播,然后你筹集到的所有钱都用于儿童癌症研究。他们是一个很棒的慈善机构,因为他们不收取管理费,并且为他们的网站和所有一切自行筹集捐款。所以这是一个非常棒、非常直接的慈善机构。我真的很喜欢他们所做的一切。这非常酷,因为我现在住在南达科他州,但我实际上可以直接选择资金流向的医院。所以从A到B有直接的影响。所以这是一个非常酷的组织。我的朋友 Guy Cirino,我喜欢叫他 Nice Try Guy,他可能是我一生中遇到过的最伟大的工程师。他当时就说:“嘿,来做这个吧。我们都要做这个。”所以我玩了《堡垒之夜》。在那之前,我就想,哦,我最好先学会直播。我最好获得合作资格,这样我就可以接受订阅。然后如果有人给我订阅,我也会把这笔钱捐出去。所以大概在2018年6月,我开始直播,直播一些《堡垒之夜》。最终获得了合作资格,最终完成了 Extra Life 的活动。我最终真的很喜欢它。我想:“这很有趣。”那时我在玩《堡垒之夜》。好的,请注意,那时我是一名《堡垒之夜》主播,我开始真正喜欢它。我一直这样做,然后有一天我决定做一些编程。因为我真的很喜欢 Vim,而且我觉得我用 Vim 很快,也许人们会觉得编程很酷。因为那时真的没有编程区。我做了。有大约30人来看,那简直是……当时感觉是不可思议的数字。所以我想:“天哪,有30个人在看我编程。”所以它就这样一直持续下去,一直发生,一直增长。我年复一年地这样做。我做我的工作,回家,和孩子们吃晚饭,那段时间我给他们读《指环王》和《霍比特人》,我给他们读半个小时,然后放下书。然后每周有三个晚上,我会编程到凌晨2点,或者玩电子游戏到凌晨2点,直播并建立起这个副业。我这样做了很长很长时间,然后最终它一直进展顺利,我开始制作 YouTube 视频。然后情况变得更好了。那是一段漫长而艰苦的磨砺,直到去年四月。我去了 Streamer Awards,我宣布了编程类别,还有 Pirate SoftwareOne。太棒了。那是一段美好的时光。在那期间,他给了我一枚挑战币,然后说:“你必须放手一搏。全身心投入。”所以我坐在那里,我妻子可以证明。那是一种情感上的挣扎,它需要很多,相当糟糕,因为 Netflix 是一个非常稳妥的选择。它既有趣又充满挑战。我喜欢很多与我共事的人,总的来说,那是一件非常棒的事情。我有一个非常棒的老板,我非常感谢他。我现在时不时还会给他发短信,他真是个很棒的人。所以,这就像我为了一个不确定的事情而放弃所有这些。现实是,直播和所有这些事情,人们今天爱你,明天可能就恨你。在公众面前,有所有这些事情。而我有 Netflix 作为后盾,所以如果公众第二天恨我,我就会说,再见,我走了。我不在乎了,现在就像,现在我要把这当作一份工作来做。所以整个事情都经历了巨大的内心挣扎。最终我只是说,好吧,我要做到这一点。当我第一次决定加入 Netflix 时,它与我产生了共鸣。我年纪越来越大了。做一些不寻常的事情的机会不多了。随着年龄的增长,这些机会不断减少。这可能是我能做的最后一件疯狂的事情了。我们试试吧。所以四月我开始全职工作,我想我从未后悔。我做这份全职工作还不到一年。这真的很有趣。最重要的是能够真正探索并在直播中做这些人们真正喜欢观看和参与的事情。这是一次很棒、很艰难、很有趣、很神奇、很困难的经历。
这是一个真正鼓舞人心的飞跃。出于你阐述的许多原因,这是一个非常艰难的决定,但还有它的孤独感,我认为这是一种相当孤独的追求。
确实如此。
只有你、摄像机、观众,以及其中的起起伏伏。而且没有真正的团队。
我确实有一件幸运的事情,那就是我的剪辑师 Flip,特别感谢 Flip。
Flip,特别感谢。
他说如果我说“特别感谢 Flip”,那对他来说意义重大。
我爱你,Flip。我们都爱你。
他当时一无所有。他有一个非常艰难的成长经历。他的人生中经历了很多艰难的抉择,现在他正在努力摆脱困境。他只是说,嘿,我来为你全职剪辑。所以我只是说:“好吧,五五分成,我在 YouTube 上赚多少钱,你就拿多少。我们要一起做这件事。”我们这样做了好几年,基本上每个月都赚0美元。所以这就像是一个巨大的飞跃,现在我们可以一起工作了。所以我确实得到了我认为非常好的团队协作的方面。但这不像在 Netflix 那样,我可以听到人们正在构建的东西,我没有团队,没有产品周期,没有一个我必须努力取悦的经理。它非常孤独。而且我认为很多人没有意识到它实际上有多么孤独。
是的。所以把那种孤独感,再加上,就我而言,我不知道有多少人攻击你。
我感觉我的攻击性出奇地低。
是的,人们通常……有时候开开玩笑之类的很有趣,但大多数时候你真的……你给世界带来了很多爱,激励了很多人,即使你在开玩笑的时候也是如此。但对我来说,这种孤独感加上非常猛烈的攻击,这很难。可能很艰难。从心理上讲,这是一段非常艰难的旅程。你怀念与团队合作吗?即使是从软件工程的角度,可以分享代码或讨论代码?或者讨论代码或其协作方面?
是的,有几点。第一,嘿,我们爱你 Lex,所以别让那些事情让你沮丧。
谢谢。谢谢。我也爱你。
谢谢。嘿,我们这里有点小小的亲密时刻。但我真正怀念的一件事是——
声明一下,不是那种性方面的。
气氛有点紧张。
我有点不舒服了。总之,团队。
我真正怀念的一件事是,即使我讨厌别人的做法,但看到别人如何解决问题,这真的很棒,很多人都拥有原始的创造力,你会觉得,哦,哇,我从来没想过会这样做。太疯狂了,对吧?哇,这太棒了。然后你会在内心消化这些,然后你会想,哦,我的工具箱里现在又多了一个小工具。因为在某个时候,当你刚开始编程时,年轻的时候,很难找到导师。我的意思是,任何有几年经验的人都会比你强很多,甚至可以说是无限强。感觉人们进步的速度简直是疯了。所以你必须找到导师,向别人学习。然后随着你变得更好,这种可用的机会就变得非常少。所以我真正怀念的是那种被迫一起解决难题的感觉。
我认为从他人那里汲取智慧也需要技巧。我通常会尝试接触即使是初级的人,年轻人。至少对我来说,在心理上,这就像一个窍门,假设他们是世界上最聪明的人,比我聪明得多。所以我把他们说的每一个字都当作潜在的智慧,这有助于我从中挖掘潜在的智慧。因为一旦你变老,就很容易评判,会说,是的,好吧,好吧。我经历过那个。我记得那种感觉。我记得那样想过。那是错的,随便吧。但只要假设我不知道自己在做什么,而对方是位智者。在这种互动中,我认为你确实可以学到很多东西。我最喜欢的互动是我们都这样想的时候。所以从那里,我认为这是良好协作和互动的催化剂。
这也让一切都变得更好了。与好斗和消极的人一起工作真的很糟糕。如果好斗是为了弄清楚现在最好做什么,我不介意,而不是仅仅因为你是一个消极的人,事情就必须以某种特定的方式进行,因为如果不是这样,世界末日就来了。那对我来说真的很难合作。
ThePrimeagen 这个名字的由来是什么?
ThePrimeagen 这个名字的由来是,你熟悉一款叫做 Turok 的电子游戏吗?Nintendo 64 上的。Turok 有 Turok I 和 Turok II。Turok II 是一款极其困难的游戏。那是在第一人称射击游戏时代,他们只会给你一定量的生命值,你必须去发现并获得生命值。你必须在不真正死亡的情况下通关整个游戏。那是第一个版本。就像 Turok I 和 Turok II。
Turok 是一个著名的第一人称射击视频游戏系列,以恐龙、动作和科幻元素为特色。该系列自 1997 年问世以来发展迅速。
就是这样。所以在 1998 年,你看,就在那里。
Turok II: Seed of Evil 于 1998 年推出,拥有更大的关卡、更具挑战性的谜题和更致命的敌人。
它的难度非常、非常、非常高。所以当我拿到它的时候,它是一个黑色卡带,不像标准的灰色 Nintendo 64 卡带,它是一个黑色卡带。很棒的游戏。我拿到它,放进去,然后每天玩 10 个小时,连续玩了一个月。我通关了。那是一次令人难以置信的、很棒的经历。Turok II 的最终首领叫做 ThePrimeagen。所以当我还是个孩子,五年级的时候,这超级酷,以坏蛋命名。所以在很长一段时间里,在任何互联网上,比如我之前提到的 Grail Online,我的名字都是 ThePrimeagen。这很棒。然后我最终成年了,就觉得,好吧,我是一个成年人了。我的名字是 Michael Paulson underscore。我在互联网上很长一段时间都用这个名字。我记得那大概是 2017 年、2018 年左右。我记得科技界变得有多糟糕。那是一个超级自命不凡的地方,充满了各种炫耀,所有的一切都糟透了。Ken Wheeler 因为玩 Circle game 被取消了。真的很难向那些没经历过的人描述,但那真的是最糟糕的地方。科技变得极其无趣。极其糟糕。一切都那么……它不是学术性的,因为它不是研究。它就像是我们在建造最复杂的东西,这是给聪明人用的,其他人都是笨蛋。别担心。我们会为你设计,笨蛋。我们会告诉你如何做出完美的架构。我记得我改了我的 Twitter 账号,因为我太生气了,就改回了我的游戏名字。我想,我希望事情变得有趣。我希望这一切停止。所以当我开始直播科技内容时,我的目标就是摧毁那种科技心态,因为它不包括任何人。每个人都认为自己是聪明人,他们为笨蛋设计。但我想说,不,我希望科技成为一个人们可以感到有创造力、兴奋并真正建造东西的地方。如果你是新手,犯傻和问傻问题都没关系。从你的愚蠢中学习。没有人期望你很聪明。选择你想要的。真正做点什么,玩得开心,建造你疯狂的想法。哦,你要重新发明轮子,那就重新发明轮子,理解你在做什么,好好学习,并进行互动等等。这与当时的情况截然不同。而这个名字……阿诺德·施瓦辛格(Arnold Schwarzenegger)谈到过一件事,当他刚开始演戏时,他的名字是人们讨厌的东西。正如他曾经说过的,你有一个奇怪的声音,你有一个奇怪的身体,你的名字,你的名字发音很困难。没有人会记住 Schneitzinfinitzel。他说,但现在这个名字是强大的部分。对我来说,我一直觉得与此相似,尽管我的名字远没有那么酷,我也不像阿诺德那么受欢迎,也不像他那么强壮、帅气或成功。但尽管如此,这个名字代表了我内心的一种反文化运动,我讨厌那里的一切,我想打败它。所以这就是一直以来的事情。现在人们因为我的名字很奇怪而很好地记住了我。所以无论出于什么原因,它都成为了它自己的一部分。所以这就是……现在我永远不会改变它,那时我也永远不会改变它,因为它是我反抗机器的时刻,如果你愿意这么说的话。
是的,我喜欢它作为反抗机器的象征,而且这种反抗是充满乐趣的。
是的。我只是希望人们能再次有创造力,玩得开心。没关系。
那胡子呢?那是一撮史诗般的胡子。它有自己的生命。它有起源故事吗?还是你们在某个时候发现了彼此?或者它从你生活挣扎的黑暗中出现?它从何而来?
嗯,最初的胡子是,在 Movember 出现之前,有不剃须的十一月(no-shave November)。那时候就是不剃须的十一月。不剃须的十一月过后,你就会有很多毛发。那么你自然要做什么呢?你得留一天胡子。所以每当我长时间忘记刮胡子,然后让它长得很长的时候,我就会想,哦,这有点好笑。我就留个胡子。所以有一天我直播的时候,就是我没刮胡子的时候,然后我就让它长着,然后我留了点胡子,然后就只留了小胡子。当我这样做的时候,人们就说,是的,是时候留胡子了。我就觉得,太棒了,这感觉像是一种生活方式的决定。这是快乐的时光。所以突然间,留胡子就变得很令人兴奋。我把它刮掉了,然后我想,哦,好吧。但后来我的一部分感觉是,留胡子会带来一种奇怪的能量。所以我想,我要把它留回来。告诉我的妻子,原谅她。她对我的长期留胡子的决定并不是那么兴奋,但我还是决定把它留回来,这是正确的选择。我一直以来的那种能量就是胡子。它一直都在那里。只是直到后来才变得可见。
是的,我们私下聊过,成功的关系的一个组成部分是牺牲,你的妻子愿意牺牲,允许你留胡子。
我显然不愿意牺牲不留胡子。
你做了一件不可思议的事情,你在直播时尝试了许多不同的编程语言。你全身心投入到某些编程语言中,比如 Rust,然后又尝试选择一门新的,而且还在不断地进行实验。所以我想问一个关于学习的问题。你学习一门新编程语言的方法是什么?当你开始这段旅程时,你对学习一门新编程语言有什么建议?
我尝试过很多不同的学习方法。显然,最成功的方法之一就是动手实践。尤其是如果你已经会编程,就直接开始敲键盘。你会想,我现在用的是 Zig 语言,怎么写一个 main 函数来运行程序?好,现在我知道怎么构建了。那怎么写 if 语句?它长什么样?怎么声明自己的函数?怎么使用模块?对吧?你就是这样通过 Google 搜索,一步步摸索,最终完成一个产品。这是一种很好的学习方式,因为我发现重复和死记硬背显然是最好的方法。你需要反复练习,这样你就能真正动手构建很多东西。我喜欢这种最初的适应过程。但除此之外,我发现这样做也会让你陷入陷阱。你可能会根据自己以往的经验去 Google 搜索,并尝试用这种语言解决问题。这样一来,你就无法掌握这门语言的独特之处,而只是沿用其他语言的特性。结果就是,你无法真正有效地使用它,尽管你确实能学到一些皮毛。所以,我最近尝试的第二种方法,灵感来源于 Ghosty 的创建者 Mitchell Hashimoto,那就是直接从头到尾阅读语言参考手册。所以最近我一直在通读这些语言的完整手册。比如 Zig 语言的,我快读完了。这大概需要八到十个小时的纯阅读时间,我还会拿出电脑,练习文档中的一些内容,这样我就可以学到所有东西。这样,当我再次开始构建时,我就会记得,哦,我知道这里有个东西,我可以回去再读一遍,因为我的大脑里已经有了它的索引,会记住它。所以我不认为有什么对错之分。我的意思是,归根结底,正确的方法始终是最终你必须动手构建一些东西。你不能只停留在阅读层面。你必须亲自动手敲键盘,构建出一些东西。一旦你这样做了,你才会真正发现它的痛点或优点。如果你不了解这门语言所提供的全部功能,你可能会因为不擅长使用它而感到痛苦。
你具体是在哪里读这些的?
语言参考手册。
语言参考手册。那可真不少。嗯。
它就是从头到尾地介绍每一个功能,对吧?每一种描述方式,所有不同的内容。我觉得 Zig 的手册篇幅适中,但它不仅仅是阅读文字。你还需要内化每一个概念。所以这需要很长时间。我读书比较慢。
所以,用 AI 的术语来说,你是在构建一个背景模型。我觉得你不能读完之后就直接开始构建,因为你可能已经忘了怎么写 for 循环了。你可能会忘记具体细节。你只是在建立设计选择、可用功能集、优缺点等等这些概念。然后你再开始构建。这真的很有趣。但这可能不是你会推荐给初级开发者,或者刚入门的人的方法。
如果你连 if 语句是什么都不知道,那这不是一个好的学习方法。对我来说,最好的学习方式是亲自动手敲键盘,构建极其简单的东西,然后慢慢增加复杂度。因为理解什么是类(class)、方法(methods)和实例(instances),以及作为蓝图的类、函数(functions)、模块(modules)等等这些概念,都需要时间去学习。所以那是一种完全不同的学习方式。
我在想,对我来说,现在学习 AI 帮助很大,但我已经有很多经验了。我在想,如果你是从零开始,这是否是个好主意。但我仍然认为这可能是一个非常好的主意,基本上就是用 AI 生成一些代码,然后通过修改不同部分来弄清楚它在做什么。也许你能评论一下这方面,比如将 AI 作为学习过程的一部分来使用?
关于这一点,我同时抱有希望和悲观的看法,这和 Google 或 Stack Overflow 的情况一样,都是在某种程度上让事情变得更加民主化。我可以用我自己的声音,用我自己的话,以最个性化的方式提问,它能够给出答案,并希望能指导我。现在,撇开它的错误和不准确性不谈,最终,仅仅将其作为一种学习工具,能够以你自己的方式组织和阅读答案,我认为这非常强大。而且我认为这非常了不起。但我认为真正困难的部分是,我们社会不再重视记忆事物。自从互联网出现以来,我就可以直接查。我可以直接查。你不需要背乘法口诀表。你可以直接用计算器。你可以做所有这些。我记得我当时坐在飞机上,看到有人在手机上做了十几次世界上最简单的加减法。你为什么不直接……你应该已经知道,你应该能够做这些事情。我意识到我们有点把大脑“卸载”了,对吧?哦,我不需要知道这些东西,因为我可以查到它们。从某种意义上说,这并不是一个糟糕的答案。我能理解。我不需要他们记住每一个细节,但它也让我意识到,你可能会养成一种习得性无助,当出现新错误时,我就会问 AI。AI 说,哦,好的,我得修复这一行。我修复了这一行。你实际上什么都没学到。你只是把它当作一种快速解决问题并继续前进的工具。所以你牺牲知识来换取速度,这在某些方面是件好事……在工程领域,我们总是需要做出这种权衡。有时你必须快速行动,以牺牲知识为代价,我完全赞同这一点,但我担心我们会培养出一整代不称职的程序员,他们能做好一些事情,但任何独特、定制化或需要额外努力的事情,都可能变得非常困难。这可能会导致一个巨大的鸿沟,让初级程序员永远停留在初级阶段。我不想看到那样。我希望看到人们成长。我希望看到人们真正能够将这视为一种精湛的技艺。所以,这既是我的希望,也是我的担忧,我认为 AI 确实可以两者兼顾。如果你可以问任何你想问的问题,而不必依赖一本书来给你确切的答案。如果书上写错了,你又无法理解,那就好像是,抱歉,你学不到这是什么。就像递归(recursion)对我来说,我花了太多时间才有人给我一个正确的问题来理解递归。你可以想象 AI 可以更快地为我解决这个问题,因为它能给我正确的问题,并更好地引导我。但如果我总是让它们解决递归问题,而不是自己真正学习呢?
所以如果我让 AI 生成代码来做某件事,实际上在很大一部分时间里,AI 生成的大部分内容对我来说都是正确的,但也有一定比例的时间它根本就是错的。而要我识别这两者之间的区别,我认为需要大量的经验。我认为要学习那种技能,即知道‘不,不,不,这里需要一个与你提供的不同的全新解决方案。你没有抓住重点。’这是一种技能,你如何学习它?你通过从零开始构建来学习。所以两者可能都非常必要。但我认为作为学习编程的第一步,生成一个函数,生成 for 循环等等,然后随意修改不同的代码行,尝试调整程序的行为,从程序行为的调整或 bug 的产生中,你就能学到语言的语法、语言的行为等等。所以我认为这是一种非常强大的学习方式。但是的,你还需要从零开始编写。
是的。在某个时候你必须摘掉辅助轮,因为我认为你真正发现的是阅读代码和编写代码之间的区别。我能很好地阅读很多语言。我能看懂发生了什么。我能理解它,但我不太擅长编写它。我能理解很多关于 C++ 的东西,也能阅读它,但我就是不擅长编写,因为我太久没写了。我不记得所有的分号、冒号,以及如何使用 public 和 private,如何进行命名约定?所有这些东西加在一起,你就会觉得,哦,我虽然能读懂,但写起来真的很糟糕。所以这两者之间存在着一道技能鸿沟。
好的。那我们来谈谈各种编程语言吧。那个老套又荒谬的问题:什么是最好的编程语言?或者说,每个人都应该学习的最好的编程语言是什么?也许我们可以列出前五名。我打算查一下 Stack Overflow 的开发者调查,因为我觉得我们有……你不喜欢他们吗?
你得记住,因为你是个数据专家。你了解数据中的偏见。Stack Overflow 自然会偏向什么?
嗯,他们有专业开发者、初级开发者等不同的分类。好吧,那偏见是什么?
我明白你的意思,但谁会填写 Stack Overflow 的调查问卷呢?是那些参与 Stack Overflow 的人。谁在参与 Stack Overflow?主要是非常非常新的用户,还有那个喜欢回答问题的人。所以我不确定 Stack Overflow 是一个获取数据的好地方。它可能是一组非常有偏见的数据。
真的只有新用户吗?
我的意思是,使用 Stack Overflow 的就是这些人。
好的。最受欢迎的技术。在这个……
JavaScript、HTML、Python、SQL。
SQL 是一种更通用的……我确定他们没有区分 SQL 的各种具体方言。顺便问一下,SQL 是读作 'sequel' 还是 'S.Q.L.'?
是 'squeal'。
'Squeal'?你读 'squeal'?
我认为 'squeal' 是正确的读法。
我之所以选择 SQL,是因为我不了解观众。我不知道他们是否能接受真相,也就是它的 SQL(谐音:尖叫)。
快乐的‘尖叫’,‘尖叫’……
SQLite,我的 SQL,Postgres SQL。
顺便说一句,不知为何,我刚才说‘pigfucker’这个词的时候感到很开心。
真是[听不清]。我是说,你相信那是我真实发生过的对话吗?
是的,确实是。TypeScript、Bash、Java、C#、C++、PHP。
这大致符合你所预期的世界,但是汇编语言(Assembly),为什么汇编语言比 Ruby 更受欢迎?谁会手动编写汇编语言呢……除了那个可能正在开发 TLS 1.3 并手动编写加密算法以使其尽可能快的人之外,没有人会手动编写汇编语言。
是的。汇编语言(Assembly)是个奇怪的。也许人们在学校里会写,但即使现在在学校里,对于操作系统课程或类似的东西,或者系统工程,我不知道他们是否还会编写汇编语言了。反正我觉得不会了。
Swift 和 Ruby 比汇编语言(Assembly)还不受欢迎,这看起来很荒谬。但无论如何,你明白我背后的想法了,但就前五名语言而言,这可能太宽泛了,因为你可以列举出太多。我认为你可能应该根据你想做什么来分类。所以,如果你想进入游戏开发领域,也许 C#、C++ 会是不错的选择。或者使用 JavaScript 和 Canvas 游戏,我也觉得可行。但显然,使用 JavaScript 会受到限制,因为它的语言速度不够快,无法做那么多事情。所以这是一个值得记住的好事情。如果你要做后端开发,如果你想找工作,也许 C# / Java,或者 JavaScript,或者 Go 会是很棒的选择。如果你想做嵌入式开发,你可能需要 C、C++,那会是一个不错的选择。所以我认为你必须首先确定你真正想实现什么目标。
如果你只是对编程感到好奇,我遇到很多人都是这样,是的,你可以考虑工作,但他们的问题基本上是,好的,我应该学习的第一门语言是什么,以及我应该探索的几门语言是什么?
我能说一些会让很多人不高兴的话吗?
当然。
我认为如果人们对编程一无所知,他们应该学习的第一门语言是 JavaScript。
是的。为什么那会让人不高兴?
哦,因为人们就是这样,首先,我不应该说 JavaScript 的任何好话。
是的,通常的梗就是你讨厌 JavaScript,对吧?
是的。不,JavaScript 是一门很棒的语言,它有很多非常好的地方,其中之一就是你可以用很少的精力表达任何东西。所以对于新手来说,我认为能够画一个方框并移动它真的很棒。这很棒。你可以直观地看到它。我认为 JavaScript 的一个非常棒的地方就是你可以做到这一点。然后你可以说,好的,我想了解后端。我现在想发出一个请求。你可以在其中快速编写一个后端。现在你开始对编程有点熟悉了。我可以把它保存到数据库中。我可以把它取下来。我可以把它放在屏幕上并进行动画处理,我甚至可以把它放在 Canvas 上并以 2D 或 3D 渲染。所以,JavaScript 可以做的事情种类繁多。它是入门编程的好方法。但到某个时候,你必须说,好的,我现在需要更多地了解这一切。
我是说,是的,就像你说的,你可以制作游戏,你可以做 Web 开发的前端和后端。
你甚至可以做嵌入式开发。他们实际上有……比如 Wes Bos 正在构建他的 Roomba 或类似的东西,并用 JavaScript 和 React 编程,这简直是嵌入式开发中最糟糕的语言选择,但你仍然可以做到。
此外,我们提到在应用方面,任何与数据或机器学习相关的东西,Python 都是那里的领导者,所以那是一个很棒的选择。
看起来 Python、CUDA 相关的东西和 C++ 在这方面会是一个绝佳组合,因为很多 Python 库都默认你在底层偷偷引入了 C++ 或 C。
好的,JavaScript。我说 Python。
Python 也是一个很棒的选择。你可以用它走得很远,但你不能编写前端。如果你喜欢前端怎么办?如果你真的只是想设计东西,而你却不知道呢?
嗯,没关系。所以对于那个,JavaScript。
但 Python 是一个不错的选择,因为在 JavaScript 中做机器学习相关的东西远没有那么容易。
我们把 HTML 和 CSS 算作编程语言吗?
我认为在某些技术定义上它是。如果你使用 CSS 和 HTML 的某种组合,它实际上可以成为一种图灵完备语言。但我的意思是,出于实际目的,不是。HTML 不是一种语言。对我来说,是的,图灵完备性是一个很好的标准,但对于那些不想那么学术化的人来说,如果我不能编写函数和 if 语句,我就不觉得那是……如果我不能循环、条件判断和函数,我就不觉得那是一种好的编程语言。
尽管现代 HTML 有很多功能。
它拥有的功能多得惊人,但它更多的是一种规范。我指定它是一个弹窗。我指定它具有这种可访问性,这种外观。在这些条件下看起来像这样,这样转换,移动到这里。
我不知道。我有点喜欢这个列表中的这些流行编程语言。我喜欢 JavaScript。
你喜欢 Bash 吗?
哦,是的。我非常喜欢 Bash。是的。为什么?
好的。Bash 属于那种,你真的喜欢它吗?我喜欢它,直到我需要一个数组。
哦,作为一种编程语言,不,但我喜欢命令行。
好的。
你喜欢 Bash 吗?不,没人喜欢 Bash。你是说——
现在有人要被冒犯了。
意思是,你经常使用它吗?是的。我是说,它值得学习,对吧?在命令行中感到舒适是件好事,因为它有点像一种超能力。就像,我想我在 Twitter 上关注了 FFMPEG。
是的。很棒的账号。
有些 Twitter 账号就是很靠谱。我认为 FFMPEG,他们有所有这些可以在命令行上添加的参数,它就像那些只有极少数高手才能理解的神秘语言之一。但一旦你开始慢慢理解,而我只是处于那段精通之旅的非常初级阶段,你每一步获得的力量,感觉就像呈指数级增长。我是说,FFMPEG 简直是不可思议的,你会称它为什么?一个库系统?它背后的人一定都是杰出的策划者,因为他们必须处理所有这些编解码器、所有这些容器,以及他们精通的媒体编解码器宇宙的所有奥秘。他们理解压缩,这是另一个超级引人入胜的技术问题,我不知道,FFMPEG 的存在就让我充满喜悦。但你需要那种 Bash 类型的舒适度,命令行舒适度,才能使用它并真正释放其力量。是的。
我认为 FFMPEG 可能是我们这个时代最重要的库之一,而且它的 Twitter 账号非常特立独行。看到它真是最令人惊叹的事情,因为我认为 FFMPEG 没有得到它应得的喜爱。每一个应用程序,OBS,底层可能都是 FFMPEG。所有东西,底层都是 FFMPEG,然而它们却没有得到应有的喜爱。我就是喜欢它。我就是觉得它们是最棒的。
是的,我会说 JavaScript、HTML、CSS、Python、SQL,我是说 SQL 是一种编程语言。它是一种极其复杂精妙的编程语言。对吧?
SQL 很有趣。我相信你可以将其归类为一种编程语言。它确实有 if 语句。你有 case 语句,你可以用它做的事情相当惊人。
你可以做函数,你可以做所有那些事情。你不应该这样做。
是的,对于存储过程,那就是你让你的生活变得一团糟的方式。我会说,所有那些顶级语言,没有一个是严格的静态类型语言。所以即使是 TypeScript,我也不喜欢它的 any 类型。所以对于学习者来说,学习一些更严格的语言会很棒。比如 Go、Rust,我是说甚至 C#、C++。任何能改变你对类型看法的语言,我认为都非常有益于学习体验。它们在这个最受欢迎的语言列表中没有得到应有的喜爱,但我认为它们非常棒。
好吧,如果我拿枪指着你的头,列出前五种语言。有一个眼神明亮的20岁年轻人问你,应该学习哪些顶级语言,五种语言?
如果我要选择五种我认为人们应该学习的语言,或者至少,我们这样重新表述吧,我会说几种语言,你应该至少探索其中的一些。我认为你应该探索一种松散型语言,比如 Python 或 JavaScript,它们实际上只有一种类型,那就是一个装箱值,它在底层是多变的、不同类型的。
你把它叫什么?松散型语言吗?
一种松散随意的语言。它是一种动态语言,所以我认为探索其中一种也非常好。所以我会把 Python 或 JavaScript 放在那里。甚至 Lua,把 Lua 也加进去。我认为你应该探索一种严格型语言,所以我选择 Rust、Go。我认为它们都非常非常棒。
C++ 呢?
你可以使用 C++。你可以在 C++ 中进行类型擦除(type erasure)。Go 也能做到,但 C++ 在这方面绝大多数情况下都是一门很棒的语言。它可能会变得有点复杂。新的 C++ 看起来很棒。每个人都告诉我新的 C++ 很棒。它拥有你想要的所有功能,以及你根本不想要的所有功能。
是的,没错。我的意思是,有智能指针(smart pointers),有普通指针(dumb pointers),各种各样的指针。没有内存泄漏。这不是问题。
有‘足枪’(foot guns),‘面枪’(face guns),‘软床’(soft beds)。里面应有尽有。
除非你喜欢内存泄漏,如果你想要那种东西,它也有。它很棒。
好的。那这个呢?我真正想学习的语言,至少在我好奇心清单上的。有三种语言:Swift、Elixir、OCaml,然后我还会加上 Odin,只是因为 Ginger Bill 很棒。但是 Elixir 和 OCaml,我还没有真正掌握一门强大的函数式语言。这确实是我所欠缺的。
是的,我听说过 Elixir、Odin 和 OCaml 的很多好话。显然,如你所知,我是一个热爱 Lisp 的人。
我从没用过 Lisp。Lisp 也可以归入那一类,或者说,我觉得现在大家都会让你用 Closure。
所以就 Lisp 而言,我不想说 Lisp 的坏话,但现代社区很重要,社区的样子很重要。Elixir、Odin 和 OCaml 似乎有一个活跃的社区,可能规模不大,但很活跃,这很有帮助。因为那样你就可以在 Twitter 上发一些类似‘我完成了这个’的内容。人们会很兴奋,这感觉很好。这是一种很好的感觉。
如果你用 Elixir 做了一些很酷的事情,你可以在 Twitter 上发文,然后会得到上千个赞,对于这样一个小众话题来说,能有这么多人点赞已经很多了。编程本身就已经是一个相当小众的话题了。然后你再深入到函数式编程。那是在一个小众话题里的小众话题。
是的。我没那么多赞。如果我发一些关于 Emacs 的东西,就会门可罗雀;如果我自豪地使用 Neovim,就会有很多人说‘干得好’。
因为它就是最好的编辑器。
是的,也许只是炒作。
回到这场‘内战’吧,Lex。
是的。有时候你不得不牺牲,放弃 Emacs 这种更优秀的编辑器,选择 Neovim 只是为了受欢迎。你为了人气牺牲了正直、价值观和质量。这是你做出的选择。
没错。我喜欢你的说法。
好的。话说回来,我们刚才在聊什么来着?我喜欢你这样成批地讨论。这很棒。
目前,我正在探索的一些‘副业’(side honeys)——
副业(Side honey)?
是的,‘副业’。它们不是我的主要方向。目前,Go 是我构建 Web 应用最喜欢的语言。如果我要构建一个包含大量复杂逻辑的后端,Go 用起来非常方便。但我对它表达我所需一切的能力感到非常沮丧。如果你有一个列表,一个异构列表,一个包含两种类型的列表,Go 用起来就真的不那么有趣了。我可以看到,我正在探索的语言是 Jai 或 J,或者像 Jonathan Blow 所说的语言,以及 Zig。它们都拥有强大的能力。它们都非常有趣。它们肯定有‘足枪’(foot guns)。它们肯定更难,不会让你轻松。Zig 看起来是一门非常棒的语言,Jai 也是。它们都非常酷。
是的。实际上,我看到了 Dave Plummer 对近百种语言进行的速度测试,Zig 名列前茅。
那是个错误。我的意思是,我说错误并不是针对 Dave Plummer。他是一位非常有才华的工程师。只是 Zig、C、C++,所有这些被测试的语言,它们都是 LLVM 后端,对吧?那是真正将代码转化为可执行部分的东西。如果速度有差异,那只意味着在某种语言中,你没有完全正确地表达你想要的东西。Twitter 上有一个一直在流传的语言球测试(language ball test)。Zig 大概排在第六或第七位,我忘了是哪种语言了。我试着修改了那个例子,在参数中添加了“no alias”这个词,这意味着进入这个函数的内存块,没有全局指针,没有任何关联,所以编译器可以进行这些非常酷的优化。我让它比 C 版本更快了。所以这只意味着它没有被正确地指定,仅此而已。
是的,但这仍然令人兴奋。对我来说,Zig、Rust 和 C++ 之间的竞争真的很有趣。一部分是为了速度。一部分是为了编写高性能代码的便捷性。
我想说点什么。这就是为什么我认为 Zig 相较于 C 或 Rust 来说如此有趣的原因。C 是一种终极语言。它无所不能,有预处理器或宏。你可以用它做很多事情,但它也非常困难。所以宏,你可以用它做很多事情,但它也非常困难,同时它又非常简单,你可以学习它。所以它有点像一种独特的‘野兽’。当你真正精通 C 语言时,C 是一种神奇的语言,人们对它非常擅长,并且评价很高。Rust 就像这种超安全的语言。你在 C 中能做的事情,在 Rust 中甚至无法表达。Rust 会像一个安全的男人,在夜晚抱着你,让你保持温暖,对吧?它会是最棒的。但 Zig 介于两者之间。Zig 有可选类型(optionals)。如果你不熟悉可选类型,那它只是简单地意味着这里有一个值,或者没有值,但你必须先检查它才能使用。所以它防止了整个空指针解引用(null pointer dereferencing)导致的段错误(segfault)问题。而这在 C 语言中默认是不提供的,你必须自己构建它。在 Rust 中,这是唯一的选择,但 Zig 说:‘嘿,如果你有一个指针,除非你标记它可以为空,否则你不能将其表示为空。’有其他方法可以绕过它,还有其他类型的指针等等可以做到这一点。但总的来说,Zig 在很大程度上会给你安全性。所以它有点安全,但更像 C。所以它在那个区域为你提供了你想要的一切,你可以在其中表达安全代码和不安全代码。它非常容易编写。它非常漂亮。或者至少它背后的理念非常漂亮。语言本身很平淡,但是……
哇,Prime,万物皆有美。
是的。
你用 Rust 编程很多。你喜欢 Rust 的什么?它的优点是什么?缺点是什么?也许你可以谈谈你已经提到的内存管理,以及这些语言中一些解决内存管理挑战的方法,但你喜欢 Rust 的什么?
我喜欢 Rust 的地方,我喜欢它释放你正在使用的内存的能力是直接与栈(stack)绑定的。所以每当你创建一些东西时,就会有一个栈变量或者一定量的栈内存,无论是指向堆(heap)的指针,还是一个指针和长度。所以一部分内存在栈上,一部分内存在堆上,因为一个字符串不完全在栈上,它一部分在堆上,一部分在栈上。当那个栈变量超出作用域并被清理时,它也会清理堆上的内容。所以它简化了‘哎呀,我忘了释放内存’的整个概念。它会自动为你完成。所以它不是垃圾回收器(garbage collector),垃圾回收器会在稍后某个时间进行。它也不像 C 语言那样你需要自己调用,它介于两者之间。现在,人们使用很多策略,比如竞技场(arenas)等等,这些都让 C 语言的这部分变得容易得多。我只是没有提及,但它确实让事情容易得多。但 Rust 做到这一点非常漂亮,这是一个非常酷的想法,我真的很喜欢。我认为 Rust 做的第二件非常好的事情是,一个东西的可变性(mutability)你必须明确指定。所以你不能只是创建一个变量然后修改它。你必须说这不仅是一个变量,它还是一个可变变量。我认为这使得代码非常可读和易于理解。因为任何旁边没有‘mut’(mutable)字样的东西,你都知道它肯定不会改变。虽然有一些规则,但你大致能明白。
与大多数编程语言不同,你必须明确声明这个变量将会被改变。
是的。
是的。这真的很有趣。我的意思是它很安全,它试图做到安全,而这种安全性可能会带来限制。让我们咨询一下 AI 大佬们。Rust 是一种极速、内存高效的系统编程语言,它强调性能、类型安全和并发性。正如你所说,该语言在不使用垃圾回收器的情况下强制执行内存安全,而是利用独特的‘借用检查器’(borrow checker)在编译时跟踪对象的生命周期。这可以防止常见的编程错误,如空指针解引用和内存泄漏等。是的。你还谈到了元编程(metaprogramming)。这些语言中你喜欢哪一种用于元编程?我喜欢 C++ 中的元编程,但它一团糟。至少在我使用 C++ 17 标准编程时,我相信它就是一团糟,尤其是调试起来一团糟。
是的,我自认为在元编程方面还是个新手。我只用它解决过一些问题。今年对我来说,就是想真正探索元编程的极限在哪里。所以对此我没有特别强烈的看法。Zig,我非常喜欢 Zig 的一点是,它的元编程就是语言本身。所以你不需要,它没有替代方案。而在 Rust 中,则有替代方案。当你创建一个宏时,你必须使用宏的语法。而在 Zig 中,它就是那样,你直接编写代码,如果你想让它只在编译时执行,就加上 comp time 这个词。所以你可以在 Zig 中在编译时创建质数列表,这是一种很有趣、很独特的功能。所以你的代码可以在编译时执行,然后你可以在运行时利用其结果。很巧妙,对吧?我是这么看的。但再说一次,我还没有深入使用到可以非常权威地谈论它的程度。
你一直没定下来,今年打算用什么语言?
我将继续把 Go 作为我的主力语言,而 Jai 和 Zig 则是我的两个“小甜心”(副业语言)。我打算用它们来探索并构建一个服务,这个服务可以与 ChatGPT 和 ElevenLabs 进行大量交互,并将内容发送给客户端,同时处理 WebSocket。我只是想看看它们在这个领域表现如何。我可能使用这些语言的方式不对,比如 Jai,它并不是为 Web 世界设计的。我刚写完读取 Twitch Chat 的功能,它要求我使用 Berkeley sockets。如果你不熟悉 Berkeley sockets,它就像是老式的方法,你在 C 语言中就是这样做的。所以你必须从头到尾自己创建连接。我必须自己创建连接,从 socket 读取数据,然后解析所有的 IRC 内容,对吧?你必须从零开始构建。没有那种直接连接到服务器的新 TCP 连接。你必须说,‘我正在创建一个 socket。’你将属于 IPv4 家族和 TCP,然后你得,我得获取你的地址,通过 DNS 查找你的地址,获取回地址后再连接到 TCP。所以它仍然要手动操作得多。在那个领域它更底层,但很有趣。
你在直播中做过哪些让你印象深刻的史诗级项目?
我最喜欢的,抱歉打断你。我现在真的很兴奋。好的。非常兴奋。我最喜欢的项目是去年做的那个。有人制作了一个 Doom 的 ASCII 移植版。所以你可以用 ASCII 玩 Doom。这意味着你可以在终端里玩。非常非常有趣,非常令人兴奋。所以我写了一个 Go 程序,可以生成 Doom ASCII 画面,然后我把这个 Doom ASCII 画面发送到浏览器,这样人们就可以在浏览器里玩 Doom ASCII 了。接着我让 Twitch 聊天可以控制这个 Doom ASCII 实例,通过导入 Twitch 聊天内容,计算一段时间内移动指令的平均值,然后像控制器一样重放这些指令。我让 Twitch 聊天通过狂发指令打通了第一关。但有趣的部分是我用了很多有趣的编码技术。我使用了四叉树来处理更小的数据量,并使用了行程长度编码。我尝试创建自己的压缩算法,因为如果你发送大量 ASCII 内容,它仍然相当昂贵,因为你必须表示颜色,而颜色并不便宜。除此之外,你还得表示它看起来是什么样子?ASCII 看起来是什么样子?嗯,我意识到有很多有趣的压缩技术可以使用,比如在许多这类引擎中,你发送的 ASCII 字符的形状实际上与该像素的亮度成正比。所以你会用数字 8 或井号来表示白色,但黑色的话,你会想用句号、逗号或竖线,一些更小的字符。所以我就开发了所有这些不同的压缩算法,它们能将大量数据转换,这些数据原本会占用,我忘了会占用多少。原本需要数千兆字节的数据才能发送给成千上万的人,让他们同时看到相同的图像,同时与 Doom 互动。我通过努力找出如何使其尽可能小并全部发送出去,将其从千兆字节变成了千字节。这超级有趣。玩得非常开心。
所以你实际上是把内容发送给了聊天室里的所有人。那么这个管道在哪里?聊天室是如何控制 Doom 的?
Twitch 聊天。是的,所以人们会狂发 W,如果大多数人在那个时间段内都发了 W,它就会按住 W 键 150 毫秒。
不错。好的。那他们是如何获取你在屏幕上的位置输入的?
所以最初我打算通过 Twitch 发送,但 Twitch 大约有五秒的延迟,这就是为什么我把它输出到一个网站,这样每个人都可以从我的电脑看到网站上的内容,通常延迟大约是 70 毫秒。所以他们基本上可以在那短暂的时间内看到发生了什么。这相当令人兴奋。所以我们有 1000 人,或者说我有大约 1000 到 1400 人在狂按 W 键,按 F 键开火,转弯,我们杀了一些僵尸。我们在第一关的最后炸掉了桶,杀死了小恶魔。
你是如何从 Twitch 聊天中获取 W 键输入的?有 API 吗?
我当时用的是 IRC,所以只是一个小小的 TCP socket,然后你解析 IRC 内容就行了。
好的。那里的延迟很小。好的。
是的,不过我觉得大概有几百毫秒。这足以让游戏变得有点困难,因为人们经常会转过头,然后往前走却错过了门,然后他们不得不回去……太棒了。所以我觉得那是我有史以来最喜欢的项目,就因为我从来没有机会做这么多编码工作。编码有点像,你通常会怎么做?好吧,我需要发送一些东西。我不知道,用 gzip 压缩一下,服务器会处理的。服务器会做正确的事情。我不需要考虑它。所以相反地,我思考它,我要发送正确的东西。
是的,你必须考虑压缩。是的。就是这样。这又增加了对 FFmpeg 的喜爱,因为他们需要大量考虑这些。
最终灵感来源于 FFmpeg 及其卓越之处。
那么你能谈谈一般的聊天社区吗?就直播而言,你所做的大部分工作都与那些与你实时交流的人有关。你能谈谈不同的聊天社区吗?首先,哪个是最好的聊天社区,YouTube、Twitch 还是 X?
说到这里,我为 YouTube 感到遗憾,因为我确实认为它在技术上是最差的,但这并不是 YouTube 的错。让我来解释一下原因。我知道你喜欢 YouTube,但让我解释一下原因:当你上 Twitch 时,你去任何一个频道,他们都有这种文化上的“人肉蜈蚣”现象,当梗(meme)涌入时,整个 Twitch 都会对这些梗做出反应并随之变化。所以你去的每个频道都有这种相同的文化。有很多相似的表情符号等等,所以它非常紧密。所以当我直播时,我看到的笑话和你在看 Sodapoppin 或 Asmongold 等任何大型软件直播主时看到的几乎一模一样。所有相同的梗都会通过完全相同的管道传播。所以它是一个非常整体的社区。所以每次你开玩笑时,你开的都是那种在“空气中”流传的玩笑。Twitter 也有点像这样。科技推特(Tech Twitter)也有一套固定的笑话,所以你也能看到。Twitter 聊天的问题是现在根本没人。通常来说,打个比方,我在 Twitch 上有大约 1500 到 3000 人,YouTube 上有 800 到 2000 人,而 Twitter 上只有大约 50 人。所以差距巨大。但 Twitter 也有那种正在发展的现象,就是梗在其中不断流动。所以它们之间联系非常紧密。YouTube 似乎就没有这种现象。他们只是一群人,人们去 YouTube 的原因各不相同。我去 YouTube 是为了学习。所以他们进来是想学习的。所以他们不在梗的列车上,也不在这股文化思潮的列车上。他们只会说,‘但是为什么在这种特定情况下你要用 if 语句而不是 switch 语句呢?’而你就会觉得,嗯,我在这里不是想讨论这个。
是的,你是想当梗列车的车长,还是想搭乘梗列车。
是的。或者你只是想在你的聊天室里创造一种文化,因为你的聊天室会是 Twitch 上那种文化思潮的某种变体。而且它在 X 和 Twitch 之间是相当连贯的。它和 YouTube 感觉就是格格不入。而且 YouTube 在这方面做得特别不好。有些人可能会说做得好,因为你可以‘游泳’。‘游泳’的意思是,你可以实际改变你所处的时间戳。所以突然间你可能会说,哦,对了,关于开着我的小货车去踢足球的事。然后 20 分钟后你可能在谈论 Zig,然后有人会说,‘我个人用什么什么去踢足球。’然后你就会想,‘我们在说什么?’所以 YouTube 的聊天也非常脱节,因为它取决于他们在视频中的哪个时间点。顺便说一下,‘游泳’这个词来自 Netflix,他们称之为‘游泳’。
这个词?
是的,人们说‘游泳’。
哦,所以你,好的。
在其中‘游泳’——
是的。所以你不是在编造这个词。谢谢。哇。
是的,但它可能就是编造的,而且可能只有 Netflix 的 10 个人说过,所以没人会知道,他们会说,‘是啊,没错。Netflix 上可没有这回事。’
那么回到项目,直播中的项目还是泛指的项目?
不,你需要回答为什么 YouTube 聊天是最好的聊天。
嗯,你有点说服我了。好吧,为什么 YouTube 是最好的聊天。嗯,我觉得我只是个“黑子”。归根结底就是这样,我只是在胡说八道。
喜欢。
我可能只是从旁观者的角度来看,因为 Twitch 有着非常有趣的梗文化。所以从外部“砸鸡蛋”到 Twitch 的房子上很有趣。然后我就坐在我的躺椅上,和 YouTube 的小社区一起“说闲话”。不,你说得完全正确。Twitch 确实能形成一种真正的社区感。但我就是喜欢 YouTube 的开放性。它更擅长向世界开放。它更容易访问,也更容易分享。它只是一个更成熟的平台,仅此而已。
完全同意这个观点。
对于开放的世界来说。我可以把它发给那些通常不看视频游戏直播或类似内容的人。
是的。如果你发一个 Twitch 链接,他们会说:“我不喜欢玩电子游戏。”然后你就会说:“其实它不是关于电子游戏的。”每次你提到 Twitch,这种对话都会发生,因为 Twitch 对此有一种 YouTube 没有的固有印象。
我刚参加了乔·罗根(Joe Rogan)的播客,我想当时提到了,他问了类似“Twitch 还在流行吗?”的问题。这就给你一个例子。然后 Jamie 说:“是的,是的,它肯定还在流行。它还在增长等等。”所以,是的,有很大一部分人没有参与到 Twitch 的领域中。是的,我就是喜欢开玩笑,所以就这样吧。
这是一个很棒的回答。
但你能在所有这些不同平台上提供访问,这很棒。我对 X 寄予厚望,但就功能而言,它还有很多成长空间。
那么人们为什么使用 X 呢?你通常去那里是为了查看基于文本的互动。所以我也认为他们需要改变用户预期。这需要一段时间。人们需要一些时间才能适应。我认为他们“音频优先”的想法是一个很好的第一步,人们可以听,也许把手机放一边。在 X 能在这方面取得成功之前,还有很多改变需要发生。
我的意思是,X 有着像 Reddit 一样出色的评论区,对吧?所以它就像——
你说“出色的”。那不是 Reddit。评论区,没错。
评论,是的。即使它……是的,它非常动态和活跃。技术平台是什么?界面和技术如何塑造讨论?这很吸引人,因为 X 的风格与 Reddit 不同,与 Facebook 不同,与 Instagram 也不同。这很有趣。所有这些评论区在技术上都不同,比如排序方式,以及围绕它建立社区的难易程度?因为 YouTube 并不是一个真正的社区。YouTube 上的每一个视频都有自己的迷你社区。你们都在那一个视频上讨论。但你不能跨越。
没有那种“嘿,Bill,嘿,George”的感觉。没有在多个视频中发生的交叉对话。
是的。但社区很棒。我喜欢社区。我喜欢社区的感觉,我想这正是 Twitch 真正提供的。
不过 YouTube 也有。他们有一个聚合社区。视频上有很多有趣的评论和点赞,然后你会看到有趣的讨论发生,那就像是社区,只是只有一部分人能看到。
我认为在 YouTube 的直播中更是如此。同样的人都会出现,他们开玩笑,他们庆祝,梗图列车也来了。
是的。
好的。那么现在,哪些项目塑造了你作为一个程序员?无论是你直播过的还是离线的。
对我来说,我不知道有没有一个具体的项目可以指出,但我可以指出一个我认为它发生的地方,以及一个我认为你可以从中学习很多的地方。任何你编写的小程序,代码量在 1,000 到 5,000 行之间,我都会认为是一个相当小的项目。你也可以把它与大型系统中的任何功能联系起来。网站上的一个特定功能可能就是一千行,或者几千行。有一个点,你所有的选择都会累积起来。我通常发现这大约在 5,000 到 10,000 行代码左右。你所做的选择要么让你感到沉重,要么让你感到自由。所以正是在那个阶段,我觉得我学到了最多,因为我喜欢在一个项目或代码库的某个小部分达到那个点,因为在那时我可以测试,A,我最初关于如何设计软件的直觉决定有多好,B,现在我需要回去思考如何以更有效的方式进行全面测试?我如何将其扩展到 20,000 行代码?我如何利用我现有的东西来做所有这些事情,或者我是否需要重新思考?我发现那才是真正发生最佳学习的地方,每个人可能都有一个不同的数字,当你达到这些数字中的每一个,或者你希望你的项目有多好或多整体时,我认为你会得出不同的数字。而且我认为随着你经验的增长,这个数字应该会变得更大。因为有些项目有数百万行代码,但它们肯定不是整体的,对吧?代码库的每个部分都在某个时间胶囊中,具有某种编程风格。有些是更函数式的,有些是更基于类的,如果它是 C++ 中的预处理器宏,那真是天助你。随着时间的推移,你会发现所有这些不同的东西。所以这就是为什么我尝试将其视为你正在处理的功能或事物。通常在 5,000 行左右,我发现事情会变得有点,我做了好的还是坏的决定?而我所有的学习都发生在这个阶段。我正努力达到这样的程度:我应该能够信手拈来地写出 20,000 行代码,而不会为此感到沮丧。
首先,就是享受你创造的东西,是的。大约在那里,你可以坐下来,看到所有的部分协同运作。对我来说,还有调试,你可以看到你所做的选择如何体现在调试的容易程度上。我是一个大力支持者,我想你以前也提到过,我到处都放断言(assert)。是的。真的吗?好的。所以对我来说,其中一个乐趣,无论是 try-catch 块,还是断言,还是通过测试,我都能看到我王国中布下的所有断言雷区的回报,那就是随着系统变大,我能多快地调试它。而且我首先可以在错误变成真正的 bug 之前发现它们,以及我能多快地解决这些错误。这给我带来了乐趣。对我来说,编程的很多乐趣在于创建强大的系统,它们不会崩溃,能正确运行,在大多数情况下都能正确运行。在那里,对系统进行压力测试,并从系统中获取所有信号,确保一切正常运行,这让我感到非常高兴,并确保系统确实有效。所以,是的,我不知道是 5,000 还是 10,000 行代码,如果是 Java 或 C++,那就是数百万行代码。但如果是 Python,是的,我会说 10,000 行代码。那时你才能第一次看到它的魔力。但无论如何,你刚才在说什么?
好的,你和约翰·卡马克(John Carmack)曾就断言(asserts)进行过一次对话。你提到了这种到处放置断言的想法,当程序中出现不应存在的状态时,这些断言会有效地使程序崩溃,而且你主动做出了这个选择。我以前从未这样做过。我知道这是一种老技术,我显然是太年轻或太笨,不知道人们曾经这样做过。我是在 Java 环境中长大的,我想这可能就是我没有遇到这种情况的原因。所以我看到后,就想,我很好奇如何更多地使用断言。然后我遇到了一个叫 Joran 的人。他是 TigerBeetle 的 CEO 和创始人。它就像世界上最快、最棒的金融数据库。它诞生于一家需要处理大量金融交易的公司。它用 Zig 编写,他们所做的是确定性模拟测试,他们只是使用 NASA 的那种保证来创建真正优秀的软件。所以不要使用 U size,在任何地方都指定你期望的精确 int 大小。他们做所有这些事情都是为了非常具体。其中之一是每个函数都应该包含两个断言。无论是正向空间,比如这些事情应该发生,还是负向空间,比如这个指针绝不应该为空。你正在编程处理那些绝不应该发生的事情。通常,你根本不会指定那些。你根本不会去想那些。所以每个函数都包含所有这些断言,而且这些断言在生产环境和测试环境中都会运行。它们总是开启的。然后他们进行确定性模拟测试,运行大约 200 年的随机数据,只是让完全混乱的数据通过系统,看看它能走多远。当断言发生时,他们会说,这是导致它的输入,这是发生的每一个小细节,现在你可以找出哪里出了问题。这太酷了。所以在你、约翰·卡马克(John Carmack)和 Joran 之间,我明白了,好吧,我真的得……还有 NASA,我也给 NASA 添一笔。NASA 也可以加入进来。我当时想,好吧,我想试试这个。我确实试了。我为自己构建了一个大型反向代理,尝试做一些游戏开发方面的事情。我只是在断言上大下功夫。然后我构建了整个模拟测试系统,它可以确定性地完成所有事情。所以即使请求的结果也会按特定顺序出现。我发现了一堆我根本不会发现的 bug。然后我把它用在我正在制作的一个游戏上。我发现了一些 bug,比如我的光标移出屏幕时,会导致所有这些不同的问题,因为我从未测试过它们。这非常有趣,而且是一种非常棒的编程方式。
是的,我认为这是一种随着时间推移而培养的技能。这不仅仅是需要你指定前置条件,确保所有必要条件都为真,还要加入一些你可能根本想不到的东西。你必须预料到一些非常奇怪的情况。如果你添加断言(asserts),尤其是在复杂的函数或类中,它们能够捕获非常异常的情况,这将为你省去很多麻烦,并帮助你更好地了解自己的代码。我想,Jonathan Blow 曾说过,无论是与你对话时还是在一次演讲中,他提到当他开始一个项目时,通常不知道如何实现它,也不知道它将如何运作。我想他当时是说他想要一种编程语言。这可能是在批评 C++,我不确定,他想要一种编程语言,能让他即使不知道自己在做什么、如何实现,也能尽可能轻松地快速找到解决方案。
我认为编程的一个基本部分是,在不完全清楚下一步要做什么的情况下构建东西。你可能有一个松散的设计,或者一个严格的设计,但实际上你正在解决的难题并非……从根本上说,它就像一个黑暗的房间。在那里,你必须预料到可能出现的各种奇怪情况,即使你并不完全了解所有事情。就像一片迷雾,战争迷雾。而预料到可能出现的问题并在其上设置断言(asserts),这确实是一项真正的技能。
对我来说,这在精神上也是一种很好的编程方式,就像在生活中建立非常严格的断言,它们会说:‘如果这个问题出现,你必须解决它。你不能视而不见。’这种将警告视为错误的想法。确保你的代码编译时没有任何警告。这对我来说是一个巨大的飞跃。以前会觉得,警告那么多,好像也不是很重要。但现在是:不,不,不能有警告。确保你认真对待每一个问题,即使是模糊的问题,因为从长远来看,这会创建出更容易使用、更有趣、更健壮、更能抵御各种异常的代码,等等。
所以这是一种不同的编码方法,可能更像 NASA 的风格,而不是网络编程的风格。但它确实让编程对我个人来说变得更有趣了,因为编程中最痛苦的事情之一是,当你的代码量超过一两万行时,你必须找到一个 bug。而这个 bug 可能需要数小时甚至数天才能找到,那简直是折磨。
是的。当你的系统变得足够庞大时,有些 bug 确实非常难以解决。向那些处理百万行代码库的人致敬,因为这确实如此。我无法告诉你我花了多少个日夜,仅仅是为了找出 bug 的根本原因,甚至还没到修复的阶段。就只是想弄明白为什么会发生这种情况?这太难了。
所以我喜欢这一点。我就是喜欢断言(asserts),因为我不太擅长它们,我能看出这绝对是一项我没有持续实践的技能,这意味着它不像肌肉记忆那样自然。所以这只是我喜欢的一点。这是一种解决问题的迷人方式,因为我以前从没想过,你知道我会怎么做吗?如果我错了,我就会让这个东西崩溃,而且就在这里崩溃,因为我不应该犯错。但现在你会想:‘哦,实际上这完全合理。我应该让这个东西崩溃。我在这里犯了一个严重的错误。为什么会存在这种情况?’然后你会觉得:‘这会解决一整类问题。’
是的。尤其是在生产环境中,用户会看到这个崩溃。是的,你应该尽量减少用户看到崩溃的次数,不是通过显示一个漂亮的蓝屏,而是真正地停止一切。这会促使你永远不让这种情况发生。你真的会投入时间去确保它永远不会发生。
好的一点是,对于网页应用等,你总是可以弹出一个提示,说:‘嘿,出错了,或者无法恢复。’你可以给他们一个友好的消息,然后记录下来以便你查看,并衡量这种情况发生的频率。我明白对于一个网页项目来说,这有点意思,比如你是否想让服务器总是崩溃?如果你发布了一个糟糕的版本,导致所有服务器持续崩溃,那确实有点冒险。那是你必须接受的痛苦。
我认为这更适用于单一系统,比如机器人等。你一直与 ADHD 作斗争。我认为很多人都深受鼓舞,因为你患有 ADHD 却依然能够高效工作并取得成功。你是如何克服它的?
嗯,ADHD 影响很多方面,所以我将从一些最简单的事情开始说起,因为有些是直接适用的,然后还有一些是附带影响。所以,真正帮助我应对 ADHD 的一件事是成熟。我认为这是每个人都需要更多的一种品质。这意味着,当我尝试坐下来阅读时,我发现自己变得非常不安和失控,我根本无法应对。我感觉自己读了一页,但什么也没读进去。我心里有个声音会说:‘天哪,我根本做不到。’我不得不停止听从那个声音,然后说:‘不,我要重读这一页。’我记得大学时有些页面我连续读了 18 遍,就像我强迫自己以正确的方式完成这件事。
所以,成熟的一个方面确实很有帮助,无论如何,我都会做我打算做的事情,并且会做好,也许会花更长时间,但这没关系。这不是重点。重点是我正在做这件事。所以,我认为这普遍有帮助。无论有没有 ADHD,韧性,尤其是情绪韧性,都是一个非常重要的方面,它确实有帮助。所以我认为这在很大程度上帮助了我。
我显然还有一些挣扎的地方。很明显我在某些方面真的很糟糕,我只是努力思考所有我不擅长的事情。我不擅长的事情比我擅长的事情多。所以编程显然有某种魔力,能让我保持专注,这就像是我的一个强项。所以我一开始只能做一点点,然后通过那种情绪韧性,我能够越来越多地投入其中。所以现在我一次可以做 10、12、15 个小时,我非常喜欢它。所以它变成了一种乐趣。就像演奏乐器一样,我非常投入。
但如果涉及到:‘嘿,你需要去预约牙医,做所有这些其他事情,或者确保孩子们为一周的饭菜准备好这些东西。’我历来在这方面很糟糕,而且可能还会继续很糟糕。所以我必须说,我之所以能如此出色,其中一个原因是我有一个非常好的妻子,她帮助我清理了生活中很多让我陷入困境、分心而一事无成的事情。所以她真的帮了我很多。
所以如果我声称自己独自战胜了 ADHD,那将是愚蠢的,相反,我发现我在真正能控制的方面做得很好,而那些我显然需要做得更好的事情,我的妻子帮了我很多。所以我有点作弊了。也许我找到了一个作弊码,一个充满爱意的妻子。但这确实是真正帮助我的事情。
你说了许多有趣的事情。关于阅读,对我来说也包括听有声书,我也会做同样的事情,而且现在好多了,就是我精神会走神,读了一页却什么也没理解。你实际上并没有读进去。是的,我强迫自己重读或者重听有声书,这现在对我来说是一个更常见的问题,我强迫自己真正地集中注意力。因为我跑步时经常听有声书,太容易走神了。
这是一种技能。我以前没有意识到听有声书是多么需要技巧,尤其是在跑步时还有其他感官输入的情况下。所以我必须强迫自己真正注意每一个字。如果我走神了,不记得过去 30 秒听了什么,我就会强迫自己重听。有时这意味着要听五遍,就像惩罚自己一样:‘你将一遍又一遍地听这些东西,直到你掌握那种专注的小技能。’然后你会想,是的,有人在做事情,有大自然,但这不重要……
是的,有人在做事情,有大自然,这不重要。你正在听每一个字,并将其吸收,努力保持专注,即使你周围有那么多干扰。是的。
这绝对是一项后天习得的技能,需要大量时间。当我说‘哦,我能从这里做到这里’时,我指的是我每天这样做,持续了大约五年。这不是什么小事……不过,这个决定的好处是,你今天就可以做出这个决定。你现在就可以做出。你会说:‘从现在开始,我再也不会犯那个错误了。我会说我要读 50 页,我就会坐下来读 50 页,当我分心时,我会回到我记得的最后一个地方,然后重新开始。’这就是你可以做出的决定。这是一个成熟的、非情绪化的决定。你可以做到这一点,只是在做出这些决定的最初几年可能会非常痛苦。然后它会变得更容易,然后变得更容易,然后改变自己就会变得更自然。
是的。对于每一种媒介,每一个平台,我认为这都像是一种新技能。对我来说,使用社交媒体就是这样,我太容易在平台上陷入‘末日滚动’(doom scrolling)。一个解决方案是完全不看,这基本上是我现在主要倾向的做法,但我感觉我应该能够查看,只是阅读,感受一些东西,学到一些东西,然后放下,而不是眼神呆滞,不再真正注意,内心空虚,事后感觉糟糕透顶。我不明白。
刷完之后那种糟糕的感觉真的很严重。我绝对……我百分之百能注意到,我花在刷手机上的时间越多,我就越焦虑。
是的,是的。
我能感觉到。就像我内心深处有什么东西……我不知道该怎么说,它好像想挣脱出来,但我又不知道那是什么。它不是愤怒,但也不是……它就是非常焦虑。
这和我早上醒来感觉良好,看着大自然,看着太阳,听着鸟儿鸣叫时的感觉完全相反。刷社交媒体,即使是那些超级积极的内容,也和鸟儿鸣叫的感觉不一样。Instagram 上的鸟鸣和现实生活中的鸟鸣是不同的,因为 Instagram 上的鸟鸣,我会一直刷下去,直到我脑子里有各种各样的“恶魔”在打架,然后是各种焦虑、不安全感,诸如此类。简直就是混乱的混合体,而现实生活中的鸟鸣是美好的。但话说回来,这和听有声书是一回事。归根结底……那些谈论冥想的人,我觉得他们可能……是发现了什么,因为冥想就是能够平静而专注地专注于一件事,无论是阅读、听有声书还是存在本身。当他们观察呼吸时,你就能让其他一切都安静下来,把其他一切都从注意力中移除。是的。那是一种技能。那是一种技能。
我听过一个非常精辟的说法,那就是我们美国人对自由(liberty)的理解有误,因为我们通常把自由理解为想做什么就做什么的自由。而那个观点是,自由不是想做什么就做什么的自由,而是能够做你“意愿”做的事情的自由。你真正想做的事情,有多少次你没有去做,因为你被困在做一些你在一时冲动下说服自己想做的事情上?所以就像是,“我想要自由。我想要能够控制我的精力,去做我想做的事情,而不是被数百万的干扰分散和摧毁。”有些人拿到了一手烂牌,有些人拿到了一手好牌,但我认为在这个技术时代,没有人不为此挣扎。
是的,这就是技能。关于在编程中实现专注的技能,你有什么看法?你有没有一套坐下来尝试解决问题的方法?那么,所有这些不同的,不仅仅是干扰,还有启动项目、思考设计时的挑战,如何保持真正的专注,因为这确实是一项非常困难的智力活动。
现在我很幸运,但当我刚开始编程时,我记得编程的每一个部分。我必须去查,去读,我总是有“支线任务”。每一步都是一个支线任务。为什么当我尝试渲染这个东西时屏幕会闪烁?哦,我不知道双缓冲。为什么会这样?我甚至怎么才能在屏幕上写东西?我怎么……一切都是问题。我的问题比答案多。所以我总是遇到支线任务的问题,我觉得那非常耗费精力。但当我非常非常熟练地掌握了我的“工具”后,我就没有那么多支线任务了。我越来越能够专注于我想做的事情。我发现这超级超级有用。所以,当我说我有点幸运时,意思是我的生命中大部分时间都在为这一刻做准备,现在当我有机会做某事时,我就可以直接去做,而不用……比如我可以在飞机上编程好几个小时。我不需要查任何东西。我不需要做任何事情。我甚至不需要测试代码。我可以在飞机上写1000行代码,而且我非常有信心它会是98%的优秀代码。我对此非常高兴,因为这让我能够专注于解决我正在尝试解决的问题。这样我就可以用100%的脑力来解决问题。这也是为什么我……这也是我推荐学习打字和熟练掌握你的编辑器,以至于你甚至不需要思考操作的原因,因为那些必须……即使你只是低头看一眼,那仍然是你必须花费的脑力来看着一个你已经知道按键在哪里的键盘。你会的。到了这个阶段,如果你已经打字了几千个小时,你知道按键在哪里,就别再低头看了,你会很快学会的。所以就像是这样一件事,就是“我不会花所有那些时间和所有那些脑力去查东西。我只会记住……我只会把它内化,然后我就可以快速地进行。”感觉很好。所以这就是我如何“击败”它的方式,因为现在我可以做一些没有更多疑问的事情。现在我只是通过这种媒介表达自己,感觉真的很好。
我确信仍然会有一些东西吸引你,比如好奇心、干扰,像是“哦,我想知道怎么……”任何时候你只要能上网,你就会变得——
Twitter 在这方面是个大问题。是的。
……你会对各种事情感到好奇,包括,我猜你是在说编辑器中的所有优化,但是,好吧,你总是可以改进东西。你总是可以找到更好的插件和宏,然后说:“哦,让我……你知道吗,这个东西解决了这个痛点,我刚刚发现这个小痛点,让我花接下来的五天时间为我的编辑器创建一个插件,或者随便什么,来消除那个痛点。”而实际上你应该继续下去,而不是去接支线任务。
所以,我有一个规则,除非发生某种灾难性的事情,比如有人更新了一个插件,我不知道他们更新了,现在我的编辑器里出现了一个硬错误,我必须继续前进,否则我不会编辑我的 RC 文件。但我有一个规则,我每年只会编辑一次我的 RC 文件,我的 Neovim RC 或任何其他配置。困扰我的东西,我会写下来,记住它。我会想,“好吧,我想改变那个,”但我就是不会再回去弄它。现在,偶尔我也会打破这个规则,如果我知道,如果像是,“哦,我想要一个新的重映射来执行这个命令,那只需要13秒,比如复制粘贴,做这个,砰砰砰,完成。好吧,我有这个新的重映射,在这种情况下它非常合理。”但我不会去探索插件。我不会尝试解决每一个问题。我不需要一个完美的编辑器,因为那是一个永无止境的追求。我只是说,“这样就行了,一个好的断点,我不会再做了。”所以,上个月我可能花了上百个小时来编辑我系统启动的每一个可能的东西,并使其……我现在几乎可以在瞬间让一台电脑从零到完美运行,所有东西都按照我想要的方式,Neovim 和所有东西都完美设置。足够满意了,我不会再碰那个系统了。也许明年我会碰它。也许我会休息一年。我对此很满意。我接受不完美。
好的,从零到六十,我们来谈谈完美的设置。你理想的编程设置是什么?键盘、操作系统、多少屏幕、椅子?
好的,我喜欢所有这些。
IDE,开始吧。
那么,键盘,你正在用的就是我最喜欢的键盘,Kinesis Advantage。它拯救了我的职业生涯。漂亮的键盘。凹陷设计和拇指键区非常重要,因为如果你仔细想想,特别是如果你使用 QWERTY 布局,当你按下标准键盘上的符号键时,你一直在做这个动作:退格键、回车键、符号键。你一直在做这个动作,这会不断地损伤你的手腕。还有当你不断地按 Ctrl 和 Shift 键时。它就是会让你感到不适,所以它就在这里。这在生活中好多了。所以,键盘是最重要的,我想说。搞定它。
对于不了解的人来说,Kinesis 键盘,我认为你体验最深的就是你刚才说的,退格键非常容易按,而普通键盘则不然。所以,退格键通常象征着你正在删除一个东西,它象征着一个错误。不,不是象征,它通常意味着一个错误。所以你不仅在打字时犯了错误,你还必须采取一个身体上痛苦的、令人烦恼的动作来纠正那个错误。对我们大多数人来说,我们犯很多错误,所以 Kinesis 让纠正错误在身体上变得愉快、快速和容易。这可能是我选择 Kinesis 的第一大原因。其他一切,是的,宏和定位,你提到的凹陷设计,都是超级加分项,但他们的错误是令人愉快的。
是的。我支持这个观点,所以我喜欢它。我会说那是最重要的几件事之一。接下来我觉得非常非常重要的一点是,一个显示器。我是一个只用一个显示器的人。
什么?真的吗?
所以,当我编程时,或者做任何事情时……现在,当我直播时,我显然会用第二台电脑来运行直播,因为我有时会把电脑搞崩溃,需要重启什么的。所以,我确实有一个副屏用来显示内容,但大多数时候你会注意到,即使我在直播时(你也在场),我必须手动切换到直播聊天频道才能阅读,那是因为我只用一个主屏幕操作。因此,我有一套自己喜欢的导航方式,灵感来源于《星际争霸》,那就是我信奉“按一个键,就能去你想去的地方”的理念。所以我的所有设置都是基于“按一个键”来实现的。比如,当我想去 Twitch 聊天时,按 Alt-2,就到了 Twitch 聊天界面。当我想去浏览器时,按 Alt-1,那就是我的浏览器。Alt-3,那是我的编程界面,显然是我的“主力键”,用中指直接按下去。Alt-6 是 GIMP,也就是我的 GNU 图像处理程序,如果我想画图,就去那里。
我以前用 Slack 的时候,是 Alt-5。如果我有一个备用终端需要运行一些额外的东西,那是 Alt-4。我把所有这些……一切都完美地映射到了单个按键上。然后,当涉及到使用 Tmux 时,我把所有的终端都整合到一个单一的终端里。现在我可以在它们之间切换。前缀键加 1 会进入我的 Vim 编辑器。无论我在哪个项目里,它总是第一个 Tmux 标签页,如果你愿意这么称呼的话。我不确定……他们称之为会话(session),但如果你不熟悉 Tmux,我不知道该怎么描述。一个标签页(tab)。第二个是我的备用终端,第三个是我的长时间运行进程终端,第四个也是长时间运行进程终端。所以我把一切都设置好了,这样我进入的每个项目都会自动生成会话一:Vim,会话二:备用终端,会话三也会打开,所以一切都准备就绪了。
所有这些都经过了优化,以便我能这样做。如果我想进入一个项目,按 Ctrl-F,任何终端都会弹出一个模糊查找列表,列出我操作系统上的所有文件夹,我只需敲击几下键盘,‘砰’的一声,我就进入那个文件夹了。所以,这套系统非常注重尽可能快地找到我需要去的地方。
通过键盘操作。
通过键盘操作。然后我在 Vim 中开发了一个名为 Harpoon 的插件,我按一个按钮就可以将一个文件固定到一个临时缓冲区中。我觉得 Emacs 里的 Projectile 可能和这个有点像。我不记得 Projectile 是不是……我觉得 Projectile 更接近我的会话脚本。总之,现在我有四个固定的文件,我只需敲击一个键就能跳转到其中任何一个。所以现在就是……因为每次你开发一个功能时,通常你主要会用到大约三个文件。我可以模糊查找其他文件,但通常我就是在这三个“主力文件”之间来回切换。所以现在一切都变得很简单,比如“我想去浏览器”,按一下键就行。“我想去我的工作站”,按一下键就行。“我想去某个特定文件夹,需要切换文件夹”。
有时你会在两个不同的项目之间工作,所以在 Tmux 中,前缀键加大写 L 会在你的最后两个项目之间切换。所以,我有备用项目,我甚至可以用一个键在项目之间切换。所以,这就像是‘哒哒哒’,只是为了优化它,让我不用思考那么多,因为我认为搜索疲劳是一个巨大的失败,你不得不去寻找它。当我看到 Mac 用户这样做,然后把所有不同的窗口都展开时,我就会感到焦虑。我就想,‘你为什么要用眼睛去寻找你想做的事情?’把它变成一个按键操作,然后就再也不用去想它了,永远不用。
你让我一直在思考我是否能适应你的系统,以及它是否更好,因为它感觉更好。
至少在理智上感觉更好。对某些人来说可能不太适用。
嗯,你说了几件很有深度的事情,比如你实际切换的窗口或任务数量,无论是编程还是处理文件,在任何一个时间点,比如20分钟内,这个数量都是很少的。所以,好吧,这是一个深刻的道理。有时我们觉得,‘哦,我需要完全的搜索自由’,但其实你不需要。你通常只处理很小一部分内容。但我想其中的权衡是……我总是用三台显示器,旅行时除外,但我的‘舒适区’是三台显示器。这就像是,你真的需要它们都显示在那里吗?所以你得转动你的头。现在,我用的显示器有两台是垂直放置的,这对于某些类型的内容来说更好。它们垂直放置,所以你可以阅读。你可以用眼睛快速浏览。
有意思。我甚至不那样做。我把显示内容放大到,我的27英寸显示器上任何时候可能只有大约25行代码。
是的,我觉得……我觉得当我无法看到更多内容时,会感到根本性的限制,因为你的眼睛很擅长快速跳转。你可以——
为什么不搜索呢?为什么不多按几下键盘呢?Ctrl-U,Ctrl-D,上下翻半页。
因为猿类的视觉系统就是为了……你正在加载大量信息。如果每次你都要查看这张表格,这张表格上有什么,你都必须按一个键,你确实可以培养整合这些信息的技能,但这真的……有一种有效的方式是,如果你有一张像这样的纸,我看着它,我的眼睛就能加载信息的结构和主题。我觉得你可以做得更快。虽然多一台显示器成本很高,但有些内容在垂直放置时确实更适合垂直显示。你看,代码有点特殊,因为代码一次显示25行,我觉得你可以做很多事情。这更适用于文章,尤其是那些包含视觉信息或文档的文章,你可以更快地跳转。但我正在尝试……当你如此雄辩地讲述时,我一直在想,‘我只是在欺骗自己我需要那个吗?我能不能把所有东西都用键盘快捷键操作,然后只用一个显示器?’那可能是我应该尝试的事情,因为我非常支持用键盘自动化一切,因为你可以移动得非常非常快,而且你不需要思考。因为我也做一些创意工作,无论是录制音乐还是视频编辑。这很难……有些程序仍然让你觉得用鼠标操作非常方便。在 Windows 上,用 AutoHotkey 你可以做很多事情,但键盘操作的局限性仍然存在。所以,不得不使用鼠标真的很痛苦,但是,伙计,你真的让我深思了。
即使是文本内容,阅读方面,我基本上同意你的观点,你可以看到更多,并且可以上下浏览,看到这两部分内容。而且可能在文章或类似的东西中,如果下面有一个非常大的图表,占据了你整个屏幕加上文字,我能理解为什么缩小视图,以便获取所有信息会非常有益,但对我来说,我只能看大约一平方英寸的区域。真的,我的眼睛实际能聚焦的就只有那么大。所以,当我阅读时,我的视线就在这里。然后我必须结构性地尝试模式匹配,以判断信息看起来像什么。然后我才开始阅读。所以,我不太确定屏幕上显示大量内容是否真的能给我带来任何实际好处,相反,我可以让我的眼睛非常放松,甚至不需要聚焦。字都很大。我编程时实际上是放大显示的。我编程时的文字比现在这个还大,所以就是因为它太舒服了,我甚至不需要费力去阅读代码。
但你必须训练你的大脑,让它知道你可以通过按键进行空间导航。
对了,我用的是 Neovim。
哦,也许这都和 Neovim 有关。好吧。
好的。然后 Neovim 显然是下一个重要的东西。我喜欢 Neovim。原因在于,我认为你可以就哪个编辑器最好提出所有你想提出的论点。但我认为你无法论证 Vim 的操作方式不是更优越的。
来了。你能解释一下 Vim 的操作方式吗?这是什么?所以,Neovim……Vim 是一个老派的编辑器。Neovim——
它是对老派编辑器的一种现代化诠释。
是的。那用最简单的话解释一下(ELI5)是什么?使用 Neovim 需要什么?
哦,好的。我以为你是在说一个 Vim 动作。就是那种……我知道,但你知道那个梗吗,就是那种‘嘿,Jarvis,我能给你讲讲 Vim 动作吗?’因为他们脑子里除了 Vim 动作什么都装不下。你说 EL5,解释得像我五岁一样,但在我脑子里,它就像是‘好的,E 是跳到单词末尾,L 是再多一个……’老兄,我简直被搞坏了,听到字母我就想‘好的,Vim 动作’。是的,所以你可以这样想,Vim 有一套语言来描述文本中的移动,因为它的主要操作模式是操纵或编辑文本。所以,它是一套经过深思熟虑的动作集合,包括删除、复制(yank)、粘贴、复制(copy)等等,这些动作都经过优化,非常适合处理代码。举个例子,假设你有三行代码要删除。如果你在 VS Code 中,拿起你漂亮的小鼠标,选中这些内容,然后按退格键。这很棒。你的手离开了键盘。虽然操作很简单,但对初学者非常友好。顺便说一句,我曾经是一个极度讨厌 Vim 的人,所以我想让你在开始之前知道这一点。我可能是最讨厌 Vim 的人。如果说有从扫罗到使徒保罗的转变,那么我就是 Vim 的扫罗到使徒保罗,这样你就能明白这差距有多大了。或者你可以做一些类似的事情……我不知道 VS Code 的快捷键是什么,但我确定你可以按一些键来删除当前行。删除、删除、删除,你可以就这样做。在 Vim 中,我可以输入 DAP,删除一个段落。所有连续的代码。我要删除,所以是 D,然后我可以选择我想要的动作,AP,围绕段落。或者我可能想用 DF,意思是跳到下一个匹配我将要按下的字符的字符。所以,DF 加左括号会删除从光标到第一个左括号之间的所有内容。所以,你可以用这些小小的按键来描述你的动作。当你变得非常熟练时……你见过那些能精通 Fortnite 的人,精通 Vim 动作也是一样的道理。当你变得如此熟练时,你不再思考每一个单独的动作,而是直接想‘删除这个段落,跳到这里,跳到那里,高亮这个,复制这个,做这个’,它变得如此之快,你可以以非常快的速度出色地编辑文本。当你非常了解你的语言,非常了解你正在处理的问题时,编辑文本和输出代码实际上会成为众多瓶颈之一。人们总是说,‘嗯,大多数时候我在思考……’大多数时候我不是在思考,我是在编程。我知道我想做什么,我想尽可能快地完成,因为我已经做了这么久,对这个领域非常熟悉,所以这对我来说成了一个大问题。我无法告诉你,有多少次我纯粹因为打字不够快,需要把脑子里的东西尽快输入到文本编辑器中而受阻。所以这就是为什么我认为 Vim 动作在所有方面都更胜一筹。它能让你的手保持在键盘上,在主行上,并且能够以非常广泛和快速的方式操纵文本。
哦,所以,这不仅仅是关于编写文本,更是关于修改文本。它主要是关于修改文本的。
是的。
我确信大多数编辑器,包括 Emacs、包括 VS Code 都能做所有这些相同的事情,但有些东西……它们只是不鼓励你去发现这些功能。这就像很多技术和编程语言的一个重要特点,它们中的很多都能做很多事情,但无论是社区、语言风格还是其他什么,总有一些东西会鼓励你一开始不要偷懒,学习快速编辑文本的方法,在这个特定的例子中,就是如何使用键盘。这真是技术使用方式的一个迷人现实。你希望被鼓励尽快找到快速的方法,这样从长远来看,使用起来既高效又有趣。
是的。这需要很长时间才能看到回报,真的很长时间,但除此之外,请注意我没有说 Vim。我不是说‘去用 Vim’,我说的是‘Vim 动作’。我再给你一个例子。我非常喜欢。假设你有一行代码,其中包含某个变量,某个函数调用,它接受一个字符串作为参数。你需要再次执行这个操作,所以你通常会复制那一行,然后粘贴到下面,进入字符串并修改它。假设它正在调用某种配置,你需要用三个不同的配置字符串调用它三次。在 Vim 中,我喜欢用 Shift-V 来高亮整行,然后按 Y。有些人会用 YY,但我不喜欢按两次。我喜欢用两根不同的手指来操作,因为这样比一根手指按两次快得多。这对我来说只是一个小小的优化,因为你无法那么快地按。所以,总之,我的方法非常优化,我复制(yank)那一行,粘贴那一行。CI 加双引号会删除第一个出现的字符串内部的所有内容。然后我可以输入字符串,按 Escape,保存。所以它就是如此优化,我可以在其中快速跳转,而复制和粘贴行可能速度相同,但导航到字符串、删除字符串中现有内容,然后……这在 Vim 中是一个非常快的动作,我总是这样做。
回到之前的问题,一个非常蠢的问题,CI,输入字母和使用字母进行导航和编辑有什么区别?你如何在两种模式之间切换?
好的,插入模式(insert mode)意味着你只是在输入文本,而普通模式(normal mode)意味着你在移动光标。
那这两种模式之间怎么切换呢?
Escape 键。Escape 键从插入模式(insert mode)进入普通模式(normal mode)。要进入插入模式,按 I 会在当前光标位置插入,按 A 会在当前光标位置后插入,大写 A 会移到行尾并进入插入模式,大写 I 会移到行首并进入插入模式,O 会在当前行下方插入新行并将光标置于适合该语言的正确缩进位置,Shift-O 会在当前行上方插入新行。你可以看到,有很多——
所以你经常按 Escape 键。
是的,我映射了我的键。我用 Ctrl-C。Ctrl-C 的作用相同,除了一个特殊情况。人们讨厌那样。我之所以习惯它,只是因为我当时在使用 IntelliJ,而且我真的很讨厌按 Escape 键,所以我只是习惯了按 Escape。
如果你在使用 Neovim,把 Escape 键映射到其他键上似乎是必不可少的操作。
Caps Lock 会是你的标准选择。
哦,是的,我也映射了。酷。我明白了。我明白了。
是的,所以这样按起来就非常容易,砰砰砰,一点都不麻烦。但是,是的,我认为如果你愿意学习它,这些动作是更优越的,但如果你不愿意学习,那么它们就不是优越的。你就不应该用它。如果你愿意忍受痛苦,那它很好。如果你不愿意,那它实际上会糟糕得多。糟糕一百倍。
对,所以如果你喜欢痛苦,你就用 Neovim。完全正确。我明白了。
是的,你完全理解了。
百分之百。
看,现在你明白了。
如果你喜欢快乐,你就用 Emacs。
抱歉,抱歉,Emacs 什么时候有过一个好的文本编辑器?我知道它是一个很棒的操作系统,但我从没听说它有一个好的文本编辑器。
操作系统?我的朋友,我想你被误导了。所以,Reddit 要求至少花 30 分钟讨论 Emacs 和 Neovim 的对比。你真的用过 Emacs 吗,才能说出这么多废话?还是没有?
我用了一年。
你用了一年?
是的,是的。Doom Emacs、Spacemacs 和普通的 Emacs。
但你甚至不懂 Lisp,所以你真的用过它吗?
我有点像摸索着搞定的,比如‘好的,这是如何配置……’你可以这样摸索着完成所有这些。
所以,你推荐精通 Neovim 并真正深入学习它,但 Emacs 只要随便用用就可以下判断了。我想每个人……
你抓到我的把柄了?
是的,不,Neovim 是用什么写的?是 Lua 吗?
是的,Lua 是配置语言,但它……它是用 C 语言写的,但你有 Lua 4。而且 Lua 是一种非常简单的语言。任何人都可以用 Lua 编程。
我其实不知道为什么……我想是因为我对 Lisp 的热爱,所以我选择了 Emacs。我想你只是选择了一条路,然后就沿着这条路走下去了。而且因为这两个社区之间存在着如此活跃、激烈的争斗,你只是因为其他人都在争斗而开始争斗。然后有一天,你骑着马,成为一名老战士,你开始思考,‘这一切是为了什么?’说真的,直到今天我还没有尝试过 Neovim,这挺令人难过的。我想是因为它有学习曲线。很多这些编辑器都有学习曲线。
是的。要真正学会它。
要真正学会它。我认为这可能是对 VS Code、Sublime 或 Atom 的一些批评,就是它们太容易让人不去真正学习,只是敷衍了事地使用。而拥有那些迫使你经历一些学习曲线的编辑器,让你认真对待编辑的艺术、科学和程序,这有很大的好处。因为你花了很多时间在上面,所以你最好还是学会如何使用它。
我的主要观点,我用这么多话想表达的是,我真的不认为……编辑器显然不能造就程序员,但我认为如果你不了解如何熟练使用你的编辑器,这很能说明你作为程序员的特质。有些人愿意将一生奉献给编程,一生中花费5万小时从事一项活动,却从不花时间彻底学习他们的编辑器。这看起来很奇怪。你绝不会在其他领域看到这种情况,人们能够建造或做某事,却完全忘记这些东西是如何运作的,而只专注于他们技艺的一部分。所以对我来说,你如何使用它并不重要,我只想看到那些知道如何使用它,并且能熟练使用它的人。当出现问题时,他们能说出问题存在的原因,然后去解决问题。对我来说,这就像是:“你做到了。你现在已经掌握了你的工具,去用它征服一切吧。”
特别是对于你经常使用的工具。
[听不清]
你必须审视你的一生,如果你是一名开发者或其他任何职业,你做得最多的事情是什么?
会议。
是的,是的。
抱歉。你继续说。
问一个问题:如何能做得更好?因为你每天都要花好几个小时做这件事,你花了多少时间思考如何做得更好,或者在会议的情况下,是否根本就不该做?令人惊讶的是,人们做得不够。我看到,回到柔术(jujitsu)上,很多人来练习柔术或武术,他们总是以同样的方式练习,投入了巨大的精力。但他们不问:‘我怎样才能以不同的方式更快地提高?’在柔术或任何运动中,就像练习钢琴或吉他一样,他们虔诚地投入大量时间,并从进步中获得很多乐趣。他们没有足够地问那个元问题:‘我怎样才能做得更好?’对于编辑器,人们如此频繁地这样做,这令人惊讶。对于打字,很多人也这样做,这令人惊讶。就像你说的,他们是点按式打字或低头看键盘。通过学习盲打,通过不看键盘打字,你可以获得的这种生活质量的提升是无法估量的。你给你的生活带来了很多乐趣,因为我们所有人都在大量打字。我使用 Emacs 效率极高的原因……感觉 Neovim 有更大的空间来实现我使用 Emacs 时那种效率,能够像你描述的那样快速编辑。这是一种真正的乐趣。它不仅仅是效率,当你熟练使用一个编辑器时,你还能获得一种自由。我选择使用 VS Code 的原因是,感觉它将迎来功能上的加速,而 Neovim 或 Emacs 将无法赶上,我指的不是未来五年,而是未来三十年。而且感觉我几乎想承受不断学习新编辑器、不断切换和学习的痛苦,因为我使用 Emacs 已经非常舒适了,配合 Kinesis keyboard,所有的快捷键,我都知道如何编程,感觉这不会……Neovim 在50年后可能就不存在了。也许会存在,我不知道,但感觉你想要不断学习这些不同的技术。Cursor 就是一个很好的例子。我现在主要使用 Cursor。我在 VS Code 和 Cursor 之间切换使用。使用 AI 的技能是一种真正的技能,从快捷键到时机,从窗口布局到我如何思考在哪里、何时以及如何使用 AI,它不会分散我的注意力,而是赋予我力量,不仅仅是为了好玩,而是为了实际的生产力衡量。这是一种技能。我觉得如果我一直使用 Emacs,我可能会陷入舒适的局部最优。也许对于 Neovim 来说,我也应该如此。我应该认真尝试一下。我确信有一个插件,就像你可以用 Neovim 设置的 Copilot 那样。我应该考虑一下。但是 Cursor 在 IDE 方面做了很多非常棒的事情,不仅仅是生成代码然后手动编辑,它就像能够持续重写代码一样。它的理念是不断地 Tab、Tab、Tab,移动光标,同时也能很好地修改部分代码并进行差异比较,至于 Cursor 还是 VS Code 能在与 Copilot 的这场竞争中胜出,我不知道。但这感觉与你刚才向我推销 Neovim 时描述的那种高效、愉快的体验有着根本性的不同。它目前没有 AI,但你可以。
我完全同意 Cursor 看起来是一个很酷的产品。我认为所有这些都将带来很多很棒的东西。我可能会从 Neovim 转向其他。我使用 Neovim 并不是因为我爱 Neovim,我使用 Neovim 是因为我喜欢我演奏的这个工具。所以,如果 Cursor 能满足这些需求,我可能会转用它。我并没有对它产生某种痴迷的依恋。不过我很好奇,每次我使用 AI 时……我觉得我只是技能有问题。我觉得在使用 AI 方面,我充满了技能问题,我还没能以一种我真正喜欢的方式来使用它。
我们稍后再谈,但在此之前——
哦,坐球。我忘了说,坐球。桌子的高度需要调整合适。一个显示器。眼睛应该在屏幕三分之二的高度。我不喜欢转头。我喜欢双手保持在手枪中立姿势。就这样。
一个坐球。瑜伽球。
瑜伽球。
那是关于什么?
它只是帮助保持良好的姿势,因为当我有东西可以靠时,我就会这样。
你坐了好几个小时,没有……等等,你在做什么?
我坐在球上,然后我弹跳。
你的背有靠着什么东西吗?
没有。
搞什么?
不然你怎样——
你是世界上唯一一个编程时坐在瑜伽球上好几个小时的人。你意识到这一点了吗?
感觉很棒。问题是,每当我靠着椅背时,我就会弓着背,然后发现自己变得不舒服。然后我就想,‘我不舒服。’我的肩膀也变得不舒服。我总是伸着脖子。这就像——
但你能在瑜伽球上保持姿势好几个小时吗?
是的。所以我就可以那样做。然后我发现,如果我弓着背,我就会想,‘不行,得坐直。’
你是有很强的背部肌肉还是怎么回事?
不。我不认为这需要很强的背部肌肉才能——
保持姿势。
……保持直立。我认为那是一个相当基本的人体功能。我不会认为自己是一个强壮的人。
基本的人体功能。我不知道。
事实和逻辑。
一个屏幕。Neovim。什么操作系统?
Linux,因为我想要一个好的窗口管理器。这就是按一个按钮就能打开 Chrome 的全部。我用的是 i3。我确信我可以用比 i3 更好的东西。人们总是告诉我所有这些窗口管理器都非常棒。但我只有那三个屏幕可以切换,所以我并不……我不在乎我用什么,只要我能按一个按钮就能切换就行。
我也是,所以一半一半。一半 Linux,另一半 Windows with Linux,也就是 WSL。那是什么?Windows Subsystem for Linux。
Weasel。
Weasel。肯定有更好的、更积极的说法。Weasel 听起来——
这听起来很符合 Microsoft 的风格。这看起来很完美。
人们经常指责我是某个人的托儿,有时是独裁者的托儿。如果我是任何人的托儿,那就是 Windows 的。我每周都从——那里领薪水。
天哪。被 Bill Gates 收买了。
他已经不是 Microsoft 的人了。
我知道。
开发者,开发者,开发。我需要尝试 Mac。我需要尝试。我周围都是用 iPhone 的人。我用 Android。
我用 Android。
哦。
我们都是失败者。
沉船上的失败者。向你的朋友 Teej 表达爱意并致敬。
他有直播。
他是一名主播。我订阅了。我一直很喜欢。我的忠诚正在慢慢从你转向他。他的质量远胜一筹,外貌、智力、技能,一切都远胜一筹。
你知道你让他今天很开心。
他提到他喜欢 Neovim,因为它让他能够避免做他不喜欢的事情。这是一种很好的方式来描述你所说的自动化过程,即自动化地处理事情,为那些令人痛苦的事情分配快捷键。我想知道你是否同意这一点。
完全同意。在 Neovim 的使用、人们为何应该使用它以及如何熟练使用它方面,我们有非常相似的心态。他可能将其推向了更深的程度。他花更多时间进行自动化。我并不一定从获得完美设置中获得很多乐趣。但有很多值得学习的地方。他非常擅长他所做的事情。他30岁,编程时间不长,但他绝对是最有天赋的开发者之一。看到一个人能有多聪明,这非常令人震惊。
大家可以去 teej_dv 看看他。Teej。
DV。他的姓是 DeVries。DeVries。
哦,不是 developer。好的,明白了。
是的,是的,就是 TJ。只是他的名字拼写得比较有趣。
好的,Teej。你喜欢他什么?
哇。他付了你多少钱让你问这些问题?
几千美元。几千。
好多钱啊。
我都数不清有多少钱了。
信任。显然,信任是最重要的,尤其是在所谓的“流媒体”YouTube世界里。很容易找到想参与各种事情的人。人们倾向于抓住一些东西,但很难找到一个你真正、真正可以信任的人。所以他就是我能真正信任的人。他总是说实话。在这种事业中,他具备一个好朋友的所有优点。
作为好朋友,他告诉我一些可以用来“捅刀子”的问题。
好吧,我讨厌他。我忘了我有多不信任他了。
说到 Harpoon,你提到了它。他说要问你,基本上需要多少年或几十年才能过渡到 Harpoon 2,并实际发布、开发它等等。你能描述一下 Harpoon 是什么,以及为什么你似乎无法完成任何一个项目?
这个问题提得真好。Harpoon 2 其实已经完成了。我是这样做的:为了避免我不可避免地会收到成千上万个问题,我把主分支保留为 Harpoon 1,而 Harpoon 2 则作为 Harpoon 2 分支。那些不看说明文件就说我现在只用 Harpoon 2 的人,那是他们的错。就是这样。我真的不喜欢回答关于开源项目的几百个问题。我以前很喜欢做开源项目之类的,但在 Falcor 的那些年里,我的热情被磨灭了,所以我想我只是对成为一个真正活跃的维护者过敏。我所有的东西都只是为我自己而构建的。Harpoon 实际上就是为我而构建的。我花了三个月时间试图找出文件最优化导航方式,这就是我得出的结果。Harpoon 是对 alternate file 的一种改进。如果你熟悉 alternate file,通常在所有编辑器中你都可以回到你刚才所在的那个文件。这意味着你可以有效地在两个文件之间来回切换。你可能经常使用它;这是一种非常快速的导航方式。做起来很不错。我想要 alternate file,但要有三四个,所以 Harpoon 的全部功能就是能够固定一个文件。所以我有一个按钮可以按下去到一个文件,另一个按钮到另一个,再一个到另一个。这样我最多可以有四个。我只是用了我的四个“主力手指”。对于 Dvorak 来说,那是什么?那是 HTNS。如果我按 Ctrl H、T、N 或 S,它就会跳转到四个文件中的一个。就是这样。它的全部功能就是这些。而且你理论上可以把它做得更强大,可以添加函数并能够外部执行任务。你可以打开终端,可以向服务器发送请求。你可以做任何你想做的事情,我只是主要把它设计用于打开文件。
既然你提到了,你用什么键盘布局?你用 Dvorak 吗?
我用 Dvorak,但我用的是 Dvorak 的一个自定义版本。我之所以用它,是因为在2017年,我们刚有了第二个孩子,当时是圣诞节,我的手臂非常疼痛,我坐在那里吓坏了,心想:“天哪,这是我职业生涯的终点吗?我不能再编程了吗?一切都结束了吗?” 所以我决定创建自己的键盘布局,优化它以防止我正在经历的疼痛,所以我以 Dvorak 为基础,然后以对称、合理的方式排列符号,这样就是开、关、开、关、开、关。它们都在这里。我实际上需要按住 Shift 键才能输入数字。符号实际上是我第一个要按的东西。所以它非常适合笔记本电脑键盘布局,这样我就可以非常高效、舒适地使用我的笔记本电脑。这就是我开始使用 Dvorak 的原因。我实际上不会推荐它,因为当时我没有 Kinesis。我甚至不知道 Kinesis 当时存在。所以当我在2017年也发现了 Kinesis 时,我才意识到:“哦,好吧。”
你会向人们推荐 Kinesis 吗?
我名义上是 Kinesis 的赞助商,所以很难让人相信一个被赞助的人说的话。但我确实在获得赞助之前就使用它了。他们是我唯一主动联系并说:“我需要你们的赞助。无论如何我都会用你们的产品。你们可以拒绝,但我真的很喜欢它。” 在使用 Kinesis 的前三年里,他们免费给我 Kinesis 键盘,作为我的赞助。
Kenisi。是的,我总是很纠结。我尝试过离开它很多次。
你不能。它太好了。
但是,你看,我带着它旅行的情况很荒谬。
我懂。
是的。我真的要去乌克兰的战区,我带着一个 Kinesis 键盘、一台笔记本电脑,还有一些其他小东西,就这些。这就像是,Kinesis 键盘真的要占你带到战区物品体积的30%吗?但是——
看来答案是肯定的。
是的。你真的能从中获得那么多价值吗?我觉得对我来说,它可能更多是精神或心理上的。它感觉像家一样。它带来了一种舒适感。我尝试过离开它。
我喜欢这种体验。这就像你和这个东西之间的一种关系。
确实如此。但我正在努力弄清楚这是否是一种有毒的关系。我想这主要是爱。我想这就是爱。就像所有关系一样,总会有一些推拉和复杂之处,但是——
他们说距离产生美,所以也许有时候 Kinesis 键盘需要留在家里,而笔记本电脑键盘可以成为你的伴侣,这样你的心会更加依恋,那种联系也会变得更深。
你这么一说,我已经开始想它了,所以我不知道。我想它会跟着我所有的旅行。不过,如果它坏了……我曾担心 Kinesis 这家公司倒闭了。我就想,他们的商业模式是什么?到底谁会用这些键盘?但显然他们仍然发展得很好。
是的。谁会用这些键盘?当你用着键盘说“我必须把它带到任何地方”时,我真想知道谁会用这些键盘。
是的。嗯。我应该提一下,当我第一次成为你的粉丝时,我听到你谈论咖啡和终端……顺便说一句,我仍然不明白你在说什么。我需要实际使用一下。但是,在众多事情中,你经营着一家咖啡公司。天哪,这个闻起来真香。这是暗黑模式、深度烘焙、全咖啡豆。上面有 seg origin,dash,dash location。巴西。
是的,上面有很多东西。
上面有很多很“开发者”的东西。Shop,server,web。你真的可以通过 SSH 订购咖啡吗?
目前,你获得咖啡的唯一方式就是通过 SSH。好吧,我能给你讲讲它的起源故事吗?
是的,是的。对,我本来想用某种命令行。比如请求命令或者 --help 之类的,或者——
命令咖啡?
命令咖啡。
好的。TJ 和我,还是那个 Teej,Teej TV,大概……顺便说一下,David Hill 做的设计非常棒。它们非常非常好。让我说说基本想法。大概一年半前,TJ 和我聊天时说:“嘿,这些有一定粉丝群、有一定线上影响力的人,他们总是在卖东西,”但我没什么可卖的。我不太想做周边产品。我从来没有真正喜欢过做周边产品。我只是觉得,我不知道,对我来说没那么有趣。
不想来点龙舌兰酒吗?
我不想喝龙舌兰酒。我想要一些——
像巨石强森那样。
而且我还想要一些我卖了不会觉得不好的东西。很多人会在网上为一大堆产品做宣传,比如“哦,好的,试试这个,试试那个。” 这就是为什么我只真正做过 Kinesis 的原因,因为我可以指出我生活中曾经非常糟糕、非常害怕的事情,而现在它不再糟糕了。这就像,好吧,那个说得通。但其他所有事情总是……对我来说更难。所以我们聊了很久,我们都喜欢 Neovim,所以我们就在想:“为什么我们不能从 Neovim 做点什么呢?” 我们笑着说,从 Neovim 订购简直太荒谬了。然后某个时候,我们就在想:“等等。也许我们可以做咖啡。每个开发者都喜欢咖啡。也许我们可以搞清楚这个咖啡生意。” 所以我有一个好朋友叫 Dax,THDXR。Dax,是的,Dax。活着的男人中最“傲娇”的。
“傲娇”?
哦,是的,他很“傲娇”。
有胡子吗?
是的,他有胡子。他做 SST。他做很多事情。非常有才华。我们称他为 DevOps 工程师。他不仅仅是这些。但他非常有才华。他和另一个人叫 Adamdotdev,顺便说一下,他是素食主义者,很棒的人。我们总是带他去吃韩国烤肉。他什么都不吃。还有 Liz,她对这家终端咖啡公司非常重要。我想没有她,我们不可能做到我们所做的。还有设计师 David Hill,他做 Laravel。他为 Laravel 设计。非常有才华的设计师。所以我们都聚在一起。我们只是笑着说,我们怎么能做一些如此荒谬的事情呢?这就是我们想出来的。是的,就是这样。你打开网站。你真的无法订购。我们实际上不允许你订购。
这个网站看起来就像终端。使用下面的命令订购你美味的全咖啡豆。SSH terminal.shop。
是的。你只能通过 SSH 登录。你需要复制那个命令并粘贴进去。如果你想为你的已知主机添加终端商店,你可以这样做。
你们如何处理支付?
通过 Stripe。其中一件事是,我们将添加移动支付功能,我会在终端显示一个二维码,你可以在手机上结账。但目前,你需要输入你的凭据,然后通过 Stripe 完成支付。
全部通过终端,比如 SSH?
是的,SSH,它显然代表 Secure Shell(安全外壳)。它使用椭圆量子安全算法来确保你的数据不会被拦截。
是的,但他使用 AI 吗?
我很确定 Dax 使用 AI。那——
你说了量子,所以我不知道。
量子 AI?
这能——
融合量子 AI?
如果它不使用 AI,这还能算是一家公司吗?
我们有一些加密链,带有由 Fusion 驱动的量子 AI,所以这相当疯狂。总之,是的,我们当时聚在一起,想着……那是从迈克·泰森(Mike Tyson)的拳击赛来的。那天晚上迈克·泰森亲吻了记者,然后光着身子走了出去。我们为某人做了一个广告。但我们决定开一家咖啡店,然后我们想,与其只做 Neovim,不如从 SSH 入手呢?因为每个人都有 SSH。你有 VS Code。启动 VS Code。你可以在 VS Code 里面点咖啡。因为你的底部小终端可以访问 SSH,一切就搞定了。这很有趣。所以我们真的——
我喜欢这个。
我们只是想做一些事情,让我不会因为销售它或人们购买它而感到不适。这是优质的道德咖啡。我们开发了整个供应链和所有环节。它都是独立包装的,都是精品。这是相当高端的咖啡。味道真的非常好。现在,我不喜欢喝其他咖啡了。我为此感到不高兴,因为它没有我们的好。所以很有趣,我爱上了自己的产品。我现在对自己的产品非常满意。我刚订购了 16 袋,分发给我的家人,试图说服他们。但这只是一种感觉,就像我没有向你推销一个可能导致灾难的软件产品,也没有说服你做一堆会改变你职业生涯的事情,我只是说,‘嘿,这里有一些咖啡。’这是一种有趣的体验。
是的,这很有趣,一切都很好。它的幽默感很棒。人们应该去 terminal.shop。
SSH terminal.shop。
我是在对那些不知道 SSH 是什么的人说。在那里,你可以阅读命令,然后弄清楚如何使用 SSH 来……这是一种文档,对吧?
是的。
在网站上。
如果你不会用 SSH,你可能就不用担心买我们的咖啡了。这就是全部——
嗯,你可以学。
你可以学。如果你很活跃,是个电脑爱好者,喜欢启动终端并感觉自己像个黑客,那就去尝试吧。我们甚至还有订阅服务。
我希望看到的是……我想这在光标(cursor)对话中提到了,我希望如果有一个 AI 代理能做到这一点,比如 Anthropos 的计算机使用(computer use)或其他类似的,在编程时实际执行订购咖啡的操作。
是的,比如,‘嘿,给我点些咖啡’,然后它真的去执行。‘给我深烘焙的。’点咖啡。它真的可以完成整个订购流程。
是的,整个流程。但更好的是,如果你没有要求它点咖啡,你要求它做别的事情,然后作为旁支任务,它完成了点咖啡。计算机使用(computer use)就是这样。他们展示了它能够去 Google 搜索一些图片,暂停一下,然后继续做其他事情。总之,是的,这个想法超酷。喜欢。说到这个,我们来谈谈 AI 吧。
好的。
你对 AI 在整个编程和软件工程体验中的作用,既有积极的看法,也有消极的看法。就目前而言,你认为如何?你对 AI 的总体看法是什么?它擅长什么?不擅长什么?
好的,我的总体看法归结为一点,那就是:如果你做的事情非常可预测,AI 会非常好用。当你做的事情不可预测时,AI 就不是很好用。如果你使用任何更前沿的东西,AI 不会使用它,或者 AI 在处理这些东西时不会很好。它不擅长 Zig,因为 Zig 的文档较少。它非常擅长 TypeScript。我认为通过 AI 会出现很多有趣的事情,很多人还没有真正做好准备或没有深入思考。TJ 是这个想法的提出者,但我认为通过 AI 会有很多市场操纵,如果你愿意这么说的话。意思是,嘿,你想研究,比如说,最好的木工工具。有人会购买广告位。有人会购买优质的训练数据。他们是那些在大型语言模型(LLMs)中获得巨大提升的人。但 LLMs 实际上不必像广告那样进行营销,因为它不是直接的广告,它们只是在训练数据中拥有一个更优质的位置,或者说,多了一点额外的学习。有很多关于 AI 的事情让我感到担忧。很多时候,这都归结于人们不学习,或者只看重生产力而做出权衡。但我认为生产力不是唯一重要的。如果你想构建复杂而困难的东西,生产力不是唯一。你实际上需要进行深度学习,并超越基础知识。所以我认为 AI 是一个非常酷的东西。它感觉像一个魔术。我记得我第一次使用它时,我获得了 GitHub Copilot 的早期访问权限。事实上,Nat Friedman 看到了我在 Twitch 上请求 GitHub Copilot 的片段,他亲自给了我早期访问权限。这太棒了。当我使用它时,它正确地预测了一个 if 语句,我的思绪完全被震撼了,因为在那之前我什么都没有,而现在就像是第一次。我当时就想,天哪,这会极大地改变编程。然后我用得越多,我就越……就我个人而言,我不断引入 bug,却搞不清楚为什么。我意识到我发展了……我不是很好地在“副驾驶”(copiloting),我更像是在“自动驾驶”(autopiloting)。我阅读代码的能力和我批判性思考及编写代码的能力,它们绝对是不同的技能水平。当我只是阅读代码时,我不会像我编写代码时那样仔细思考。所以我在这方面遇到了困难。
我确实认为那是一种技能。
是的。肯定是技能问题。
技术问题。对于不了解的人来说,这是一个有时带有嘲讽意味的标签。这里面有几层嘲讽的含义,但也有严肃的一面,意思是批评是基于你缺乏某种技能,而不是某种根本性的真理。是的。我认为我之所以经常使用 Copilot Cursor,就是为了培养编辑 AI 的技能,这样我就可以不断地做得更好。因为我认为我做得越好,我就越能更好地利用 AI。目前,它有点像样板代码生成器,但你可以从头开始做出开创性的新颖设计决策或棘手的设计决策,然后使用 AI 填充内容,再学习修改的技能。
我个人觉得……用 AI 编程更有趣。即使我删掉很多代码,也更有趣。它不那么孤独。这就是我所想象的结对编程。我从未尝试过,但它给人的感觉是,当你盯着一个空白的东西时,那种阻力就不存在了。空白函数、空白类,就是更有趣,不那么孤独。
而且我确实认为,对于许多更简单的编码类型,它真的很有帮助,比如与 API 交互,那些我通常需要去 Stack Overflow 查找的基本操作。它在这方面非常快。举个例子,仅仅是与 YouTube API 交互。YouTube API 的文档不是很好。你可以把所有内容都加载进去,让它生成一组访问 API 的函数,包括各种读写操作,它都能搞定。当然,你确实需要阅读。你必须阅读并检查所有内容。
然后你开始培养一种技能,即理解它在哪里误解了任务。那是什么技能?我甚至不知道。你必须对 AI 及其局限性抱有同理心。很多时候,这与提示工程有关。你必须同时理解 AI 知道什么。你实际给了它什么数据来生成代码?很多时候,我们没有意识到我们没有给它足够的信息。好的,好的,好吧。你必须有同理心。比如,好的,这些是它知道的文件。这是你问它的问题的具体细节。你必须想象你是一个什么都不知道的实习生。
通常,我们希望 AI 能自行理解那些未言明的事情。但你无法知道这些,你必须明确指定它们。所以你必须在指定事物时更加深思熟虑和严谨,要把它详细说明。因此,我保存了大量的提示,我正在建立一个不同提示模板的库,这很混乱。我确信很多开发者也有类似的混乱。
从长远来看,很多问题都与将要改进的工具链有关。首先,当你不那么需要细微差别时,系统会变得更加智能。其次,将会有工具允许你指定这些内容并正确加载,提供系统做出正确决策所需的所有上下文。也许系统还会向你提出后续问题,比如“这里有些你没有说清楚的地方”,等等。
很多都与界面,与工具的实际设计有关。就像我们说的 Cursor,它会变得越来越好。我的感觉是,开发者们普遍应该学习这个,以免落后,看看如何将其用作提升生产力、效率和编程乐趣的超能力,而不是将其视为竞争对手之类的东西。
但对我来说,它已经极大地提高了生产力。如果你衡量实际完成一件事的速度,它带来了巨大的提升……而且不仅仅是按分钟和小时衡量,还包括按天衡量。有时我不得不做一些不那么重要的事情,我就会因为拖延而推迟。
我明白。
AI 确实能帮助我完成任务,因为就像我之前提到的,那个空白页面,它能帮助我编写、完成、测试并交付。也许只是因为与 AI 合作不那么孤独。我不知道。我不知道这些是否有道理,但是——
这完全说得通。我真的很喜欢‘它让编程不那么孤独’这句话。我认为这很有趣,因为它不仅仅是像 LSP 自动补全那样的交互,而是更进一步,它真的在思考,你可以看到不同的思路,然后你会想,‘哇,这和我本来会采取的方法完全不同。嘿,这很酷。我喜欢这类东西。’
而且,我并不是一个对 AI 持负面态度的人。我能理解为什么人们非常喜欢它。我从 Nat 给我权限开始,一直到大约六个月前,都在使用 Copilot。我用了相当长一段时间。我确实很享受它带来的便利。但它对我来说却起到了反作用。我感觉自己更多是在审阅而不是编写,我感觉自己更多是在放任自流,没有深入思考。我也没有那么投入。所以我就想,‘好吧,这里有点不对劲。’这只是我个人的问题。我承认这不是人们应该对待这些事情的方式。这不是你是否应该使用 AI 的好理由。我只是觉得那样不对。我或许可以纠正过来,找到更好的使用方法。
我一直想再尝试一下 AI,所以我在想,也许我只需要在 Cursor 中花两周时间,完全接受成为这样的人意味着什么?我能用这些新能力做些什么?它们是否已经改进到真正好用的程度?对我来说,因为我做的很多决定,我写的小函数,并不是为了解决某个问题而写这个函数,而是因为我写这些函数或这组函数,不仅是为了解决这个问题,更是因为我知道在再写大约 2000 行代码来构建所有其他东西时,我将需要开始进行下一个活动。这就像我试图真正地将自己像下棋一样布局到精确的位置,而当我让事情进展得更快时,我就会在那个棋步上崩溃。这又是我的技术问题。我指的是最真实意义上的技术问题,就像我正在提出批评,因为我没有很好地使用它。
我不知道这是否是一个普遍规律,这只是我的个人经验数据。你编程越好,你就越不想使用 AI,它就越会碍事。优秀的程序员——
就我所知,这很公平。
越是初级程序员越乐意使用 AI。当我使用 AI 时,它是为了基本的……我不知道有没有更好的词。它不是样板代码,但它是相当简单的编程。那种编程更容易完成。我认识的那些超级高效、才华横溢的 10 倍程序员(不是用这个梗),他们讨厌 AI。他们会说,‘这根本达不到要求。’这其中有些道理。我仍然认为他们应该使用 AI,仅仅是为了学习,因为它会变得越来越智能,越来越好。这就像你超级优化 Neovim 或超级优化 Emacs 一样,你可能不会发现正在开发中的新事物,所以以这种方式进行训练总是好的。
让我问你一个问题,只是为了我的理解。你提到了你有很多 LLM 提示,所有这些混乱的 LLM 提示的巨大积压,你为它们准备了模板,可以执行各种操作。你有一些策略让它自我解释,然后做正确的事情。据我所知,这在很多人身上都是根深蒂固的。
那么,你又说,在某个时候,界面会变得更好,也许它能更好地完成很多事情,以至于我不再需要那些。那么我的问题是,如果那样的话,是不是有人因为不使用 AI 而真的落后了呢?因为如果界面会发生如此巨大的变化,以至于你所有的习惯都需要根本性地改变,并且它能够澄清并做出所有那些陈述,那我到底有没有落后呢?或者下一代会和当前这一代如此不同,以至于就像,是的,你现在还在做打孔卡 AI。我将进入编译时 AI,它会如此不同,以至于打孔卡是什么?
显然这是一个开放性问题。它很引人入胜。我个人认为,是的,你会落后。不是你,而是如果你不——
可能是我,可能是我。
……不玩它,你就会落后,因为我用提示词做的事情是你在学习,你在建立关于 AI 如何工作的直觉。你正在理解它的优点和缺点是什么?甚至不仅仅是当前版本,还有下一个版本等等。教一个 AI 系统关于世界意味着什么?它需要什么样的信息才能做出有效的决策?我认为这确实会转移到越来越智能的模型上。随着时间的推移,你将需要给出不那么严格和具体的详细指令,但你仍然需要具备那种能力。
我认为这几乎是一种与 AI 系统共情的能力,因为它不知道……你知道它缺少什么吗?它缺少常识。它缺少长期记忆。很多时候,当我们与其他人交谈时,他们对现实有基本的常识,而 AI 系统通常缺乏这种常识。而且它们也不记得事情。你必须意识到它总是在不断地清空。这几乎就是一种与我正在训练的 AI 系统对话的技能。通过编写所有这些提示并来回沟通以了解哪种提示效果更好,你就能建立起这种直觉。还有就是阅读别人代码的原始技能。也许对于在大型团队工作的人来说,这是一种已经发展起来的技能。对我来说,则不然,所以学习如何修改别人写的代码是一项真正的技能。
另外,你提到的另一件事,就是从另一个角度看待一段代码,这真的很好,但理解‘好的,这是你做的’也是一种技能。有一种技能是向生成的代码提问,这样你就可以就所采取的方法进行对话。我认为在合作编写代码的过程中,有很多微妙的小技能,就像你和 Teej 在制作‘两个白痴,一个键盘’视频时,你们之间确实存在技术问题一样。大家应该去看看。
你们拍了那个《两个白痴,一个键盘》的视频,大家应该去看看,你们显然玩得很烂。
对,协同使用。
那很酷,你们做到了,就是用两个不同的键盘控制一个 Neovim 界面。
是的。然后我们每个人都有一定的字符或操作权限。
是的。所以你们俩必须互相沟通。那是一项真正的技能。我确信你们可以非常高效地做到,但这需要时间来学习。所以,我认为它有一定价值,但也有一个学习曲线。
有一点需要明确的是,我实际上经常使用 AI,只是不用它来编程。我一直在尝试让它能够进行长时间的访谈,或者理解 Twitch Chat 在说什么,然后变成 Twitch Chat,并能像 Twitch Chat 一样说话。我尝试学习如何以不同的方式进行提示。所以我觉得这些事情对我来说真的很有趣。我尝试让它学习玩塔防游戏。我用 Zig 制作了一个塔防游戏,然后让它玩塔防,接着让 Claude 3.5 和 OpenAI 对战。Claude 3.5 在白天表现更好,而 OpenAI 在晚上表现更好。我不知道为什么,我完全不明白那里发生了什么,但一个会开始赢,另一个会开始输。这非常奇怪。所以,我正在学习如何更好地进行提示,但我正在一个非常不同的方向上学习提示。我只是觉得它在编程方面还不是很实用。
在编程方面。我还应该说,我在生活的方方面面、各种情境中都在使用它。我用同样的方式探索提示等等,我正在使用和学习。我认为它本身确实是一个完整的领域。
是的。
提示工程以及如何与 AI 系统交互,我认为这值得投入。你能具体谈谈吗?因为我看到你基本上是从 Twitch Chat 中提取内容,然后让 LLM 说话。我之前没意识到,你不是在读取确切的聊天信息。
是的。
你是在做某种总结吗?
是的。所以我最终向 OpenAI 发送了大约八个查询,第一个就是让它有一个默认的人格。“嘿,你是 Randall,经理,你是一名软件工程经理。”然后解释他们的职位,他们喜欢什么,不喜欢什么,然后说:“这些是你脑海中的想法列表,你需要和这个人交谈并向他们提问。”
这太棒了。
“给我10个你认为可能是你有的想法并且想问的回复。”让它给你一个列表,然后说:“好的。”然后重新提示,说:“嘿,你是 Randall,你是这样、这样、这样、这样、这样的人。你面前有这10个问题,现在你需要选择其中一个,并以听起来更像你,也就是工程经理的方式重新措辞。”我一直在尝试让它自我迭代,而不是一次性完成。我发现如果我迭代太多,它会失去最初想问的内容;如果我迭代不够,它又会与 Twitch Chat 的内容过于偏离。所以,我这个想法还有很多需要改进的地方——
澄清一下,你是把 Twitch Chat 聊天内容输入进去,然后说“你是一名经理,这些是你脑海中的想法,挑出一些最深刻的想法”吗?
差不多是这样。这取决于我希望它做什么,我仍在努力为它开发一个更好的系统。
太棒了。
所以就像是,“我如何能让 Twitch Chat 发声?我能让它创建与 Twitch Chat 对抗或支持 Twitch Chat 的角色吗?我能整合 YouTube 吗?”诸如此类。以及你如何向 LLM 描述让它扮演某个角色?所以只是在思考这些事情。所以也许我确实有一些提示技能,但它还没有进入编码领域。
当然。
总有一天我会达到那个水平的。
我看到你在玩不同的声音。有一个听起来很性感的吗?
那最初是一个法语声音——
法语声音?
……然后发现 ElevenLabs 根本做不出一个法国女士的声音。当你选择多语言的法国女士时,她就开始说话,就像是,“什么?这是什么?”
我收听了你的一次直播,里面有一个听起来很性感的女士声音。
这变得太搞笑了。所以我们叫她“非法国版斯托米·丹尼尔斯”(Not French Stormy Daniels)。
哦,不错。
是的。但我想回到 AI 和它的一些方面。
当然。
我对 AI 的主要不满与它的能力无关。它的能力完全符合预期,因为那是人们编程出来的。我真正不喜欢的是,A,有一群人就是说:“末日将至。AI 来了,你只需要停止编程。”我无法告诉你,甚至你之前提到了 Peter Levels,他发了一条推文,其中一个人的回复是:“2025年或以后,任何人都不要再学习硬技能了。你应该有效地把一切都交给 AI。”这些对年轻人来说真的是非常有害的建议。年轻人被告知永远不要成为任何领域的专家,而应该总是外包。问题是,任何有真才实学的人都会告诉你,AI 尽管可以生成代码,但在绝大多数情况下都会出错。而且随着代码变得更大、更复杂或输入更多,它就会在 bug 之间来回摇摆。所以如果你没有那些硬技能,并且最终不是主导者,你真的会遇到一些困难时期,你的进步能力将直接取决于 LLM 的好坏。所以如果你相信 LLM 在明年会远远优于人类,那也许是个不错的赌注。但如果不是,那么你的技能上限就受限于它们的能力。甚至除此之外,还有一个信息问题,那就是,“我们是否有足够的计算能力来解决这种真实规模的问题?”即使有,如果每个人现在都开始使用它,“我们是否有足够的计算能力让每个人现在都使用它?”有很多限制性问题,有隐私问题,我只是不希望人们做出那种即时或看似显而易见的选择,即你不需要硬技能,你不需要这些东西,我们只需要创造性地思考。我觉得不是这样。我认为这些硬技能在 AI 大幅改进的情况下,还会存在相当长一段时间,据我所知,你还需要经常介入很长一段时间。
但我还认为,除此之外,仅仅是掌握硬技能,或者说,例如在编程语境中从头开始编程,这会让你更好地引导 AI,不仅仅是纠正 AI,而是引导 AI。我认为这有点像,如果你知道计算机如何工作,你就能更好地编写 Python 程序。这可能有点反直觉,但如果你了解底层抽象,对它有一些直觉,你就能更好地引导高层抽象。
是的。
但这似乎就是事实。除非 AI 真的变得超级智能,比现在高出许多个级别,但这在短期内不太可能。从长远来看,随着它变得越来越好,能够驾驭这种改进的浪潮仍然是好事。
是的,我非常支持这个观点。
很多人给我写信,我认为很多开发者、程序员都非常担心在 AI 系统快速改进的背景下,他们职业的未来。那么你认为 AI 最终会取代程序员吗?
这个短语的难点在于你用了“最终”这个词,意思是说我是在想五年、十年还是一百年?这个词到底意味着什么?我认为在某个时候,如果一切都以目前的速度持续改进,确实会有一个点,编程作为一项硬技能变得不再必要。在某个最终的、非常遥远的未来,是的。我不知道那个点会是什么样子。我不知道它什么时候会发生。我甚至不尝试对此做出预测。但我们仍然需要取得一些巨大的进步。我的意思是,即使从社会层面来看,也有很多公司甚至不允许你使用 AI。我的意思是,存在一些实际问题。所以这是一个我尽量不直接回答的问题。如果人类继续存在,并且一切都朝着积极的方向发展,那么总有一天,由于巨大的计算系统,许多技能将变得过时。所以,是的,我承认这一点。但就像是,我认为它在短期内不会有任何影响,迄今为止,没有任何计算机改进没有带来更多的工作岗位。
是的,绝对如此。我想说,我认为这还取决于你如何定义编程,因为当社区从汇编语言转向 C,从 C 转向,我不知道,Python 和 JavaScript 时,那是进化。这对许多习惯于编写低级语言程序的人来说是非常痛苦的,所以会有一个持续的进化。也许这意味着有了 AI,将会有越来越多地向自然语言演进,作为工具链的一部分,比如学习如何编写合适的提示。是的,因为自然语言仍然是一种语言。从长远来看,很大一部分编程可能是自然语言。可能仍然会有一些百分比不是,那将是极其结构化的语言。
目前,我认为我们离自然语言编程还很遥远,因为它具有歧义性。我认为,随着人们在这方面投入大量精力,最终我们会看到某种伪语言(pseudo-lang),它将成为一种用于与AI交互的提示语言,歧义性会更小。人们会不断努力,使其达到更少歧义的状态。到那时,你只是在编程中实现了向更高级语言的又一次演进。也许未来人们会拥有一种更简洁的语言。我只是不确定它还能简洁到什么程度。
我的意思是,在我看来,如果你说自然语言可以用于开发流程,那你就意味着会有更多人成为程序员,这意味着最终会创造出更多的软件,也意味着需要维护的软件会更多,这会产生一个巨大的滚雪球效应。
但有些程序员确实在担心自己的工作。这并非完全取代,而可能是程序员这一职业意义的快速演变。就像你提到的,如果自然语言成为一种沟通或编程的方式,这意味着能够从事编程工作的人群会迅速变化,所以他们非常担忧。
在某种程度上,无论我们多么强调AI有多好,总会遇到这样的情况:存在一个bug,或者一个大型软件需要修改,而描述这些修改需要大量的篇幅,以至于由人来快速完成会显著更快或更容易。这里面肯定存在一个平衡点,并非完美的取舍。所以我认为人们应该停止担忧,思考如何整合AI,并尝试,比如向自己证明。他们真的会变得无关紧要吗?如果你真的让自己变得无关紧要,我会反驳说你只是在做一些稍微复杂到无法完全自动化的事情。如果你只是从后端到前端编写简单的CRUD应用和表格显示,是的,也许我们以前无法完全自动化这些,而现在有了能做得更好的工具,所以这些被自动化了,但这并不是真正的编程。那更像是搭乐高积木,设计图已经确定,你只需要把零件从袋子里拿出来放到正确的位置。
嗯。你有什么建议,开发者或程序员如何避免被AI自动化取代的情况?
我认为,你能管理的项目越大,能构建的东西越宏大,你对技术栈上下游的理解越深入,你的价值就越大。因为如果你了解如何在前端构建东西,那么现在你可以启动某种LLM任务,它会去修改前端。好的,当它在做这些的时候,你可以去启动CLI工具中的某个任务,你也可以去其他地方启动一些任务。当这些任务返回结果时,你可以审查结果,确保它符合你的要求,进行修改,提交,然后进行下一个任务。只有当我们真正达到AI能够做到这一点的状态时,你才会像你最后所说的那样,变得更高效。
我认为与AI协作是一种技能,这也是我很高兴看到你不断尝试的原因。
是的。
我们还不完全清楚它如何融入,但感觉AI应该能提升生产力。我绝对认为它能提升编程的乐趣。我认为很多人,是的,这虽然是一份工作,但它也是意义和快乐的来源。编程很有趣,你在创造一些很酷的东西,而且可能很多人都会使用它。
有一件事让我非常沮丧,这有点涉及到Devin这个范畴,那就是我想要一个有责任心的实习生。你无法从LLM那里得到这种东西。它不关心,意思是,我不想它只是按照我的要求为我制作一个显示这些图标的UI,我希望它能关心,希望它能思考,希望它能向我展示,然后我能说‘哦,是的,太棒了’,然后我再进行修改。然后过了一会儿,它会说:‘实际上,我重新考虑了一下,如果我们改变……会好得多。’它并不真正关心这项技艺。但当你和实习生或其他人一起工作时,他们会关心。当他们考虑某个因素时,他们会真正地去思考,然后说:‘哦,是的,这其实有点糟糕。我稍后会再来处理。’他们完成这个,然后回到这里,把它做得更好。他们真正关心事物本身。这是一种完全不同的体验。我只是想要一个同样关心并希望把事情做得更好,而不仅仅是完成任务的东西。我知道我要求太多了,这已经不是……现在我们谈论的是《银翼杀手》(Blade Runner)级别的AI了。我只是觉得我缺少了那种东西,它只会按照它理解的我的提示来完成任务,但它并不真正关心它。
我的意思是,‘关心’有很多方面,而其最简单的版本就是一种不断追求改进的‘不安’,我认为AI非常能够做到这一点,它会不断地问自己:‘我能做得更好吗?’如果它一直这样做,很可能会把它带到一个荒谬的境地,所以实际上,它也需要知道何时停止。我认为培养一种你可以称之为‘品味’的东西,就像不断尝试、极其努力地工作、持续改进,直到它感觉对了。就是这样了。我认为这是AI不擅长的地方,它不会说:‘是的,就是这样了。’
我曾让它迭代了三次,第三次就是——
是的,就是这样。我们现在已经达到了。我认为最终,这就是人类的惊人之处,即知道什么时候是正确的,比如:‘就是这样了。’特别是当你理解并在一个特定行业、特定应用场景中培养出‘品味’时,你会知道:‘就是这样了。是的,这个按钮的圆角,就是这样。太美了。’所以这是一种美感,一种功能感,一种效率感等等。是的,但人类在这种情况下几乎可以对AI系统进行监督。
是的。
是的。你曾对Devin大发牢骚,充满愤怒。
我的意思是,首先,Devin的开发者们都非常友善。我希望大家明白这一点。我并没有对他们有什么不满或类似的情绪。其次,Devin在编程方面就像一个完整的解决方案。所以它会是这样的:你给它一个任务和一个代码库(repo),它会去理解代码库和任务,通过探索来修改代码库,然后实际向GitHub提交一个commit并解释它做了什么。所以希望你能拥有这种完全离线的工作方式,这也是我真正喜欢AI的另一个方面,就像是:‘去修复这个东西。’然后我就可以去解决问题,修复这个东西,回来后说:‘好的,够好了,合并,搞定。’我想要那种能够自主运行、完成任务的能力。我认为理想的解决方案是,你可以开始给它一些小bug,它会去修复这些bug,你就可以回来处理那些没人做的积压工单(backlog tickets),它真的会开始处理这些积压工单,这实际上是一种非常棒的体验。所以我喜欢这个想法。我想我们都同意这听起来很棒,但每次我尝试并多次要求它,并试图不断缩小问题范围时,问题越具体,它做得越好。所以如果我说:‘只添加一个图标。当它被点击时,我希望你只在控制台输出‘点击我’。至少给我创建一个SVG并把它放在合适的位置。’任务越具体,成功的可能性越大。存在一个特定的指定程度,如果你指定得太多,它就做不到。如果你指定得太少,它就会做一些奇怪的事情。所以这有点像一种非常有趣、独特的平衡游戏,你必须掌握这种平衡。但到目前为止,每次我做这些事情,我最终都会想:‘天哪,我应该自己把Tailwind学得更好,然后自己写。’因为我总是回去重写,然后就觉得:‘该死。我到底省了什么?’我觉得我目前还没有节省任何东西。这就像是:‘我太想要它了。’我确实希望AI能变得很棒,因为那样我真的可以飞速前进。我的意思是,我本来就可以快得惊人,但我总是会想:‘天哪,我应该自己把Tailwind学到极致,然后飞速前进。’
是的。我们还应该提到,调试——这可能听起来直观或反直觉——AI非常不擅长。
是的。
那是最困难的事情之一……它实际上让你意识到人类是多么特别,以及调试任务是多么困难。显然,对于简单的调试,也许你可以找到bug,但编程真正的艺术在于发现bug,逻辑bug,极其复杂罕见的bug,以及边缘情况。AI可以提供帮助,但那些困难的bug真的需要大量的上下文、大量的经验、大量的直觉,再次强调,是在充满不确定性的迷雾中操作。这很难。
是的。
当然,AI也许可以创建日志、进行追踪,并加载人类无法处理的大量数据,但最终这只意味着它在调试中可以成为一个更好的助手,而不是真正的首席调试员。
如果它们能做到,那会很棒。它能做到的越多越好,因为据我所知(如果我说错了请纠正我),目前调试的现状是,它会查看代码,查看错误问题,然后尝试进行文本预测,找出最可能准确的位置,然后尝试修复那个点。所以它会说,很可能是这个地方,你提到了管理面板,它稍微有点偏差,这个、那个。它可能就是这个位置,这实际上是进行搜索的一个很好的方式,让我进行语义搜索,指出这是哪里,因为这也许是浏览大型代码库的一个很好的方式。这就像智能搜索。与其让它直接完成任务,不如让它帮助你精确定位问题。我希望看到更多这样的情况,因为对我来说,这才是令人兴奋的部分。有一篇关于 curl 的创建者或维护者写的很棒的文章,其中提到 LLM 中的“I”代表智能(intelligence)。他编写并维护 curl。curl 一直被安全问题困扰,而这些问题都来自于 LLM,它们会说:“哦,我发现了一个安全漏洞。这是安全漏洞,”并在代码中详细说明。而他就会说:“好吧,你是怎么重现的?给我看看,”因为如果你看这里的代码,你所说的情况实际上是不可能发生的。现在安全领域就是这样循环往复,漏洞赏金计划被 LLM 提交的响应淹没,因为它们无法真正分析代码,只能进行基本的文本预测。比如:“哦,这是一个 strcpy。strcpy 通常被提及,等等等等。看,这就是漏洞。”而他就会说:“不,这实际上是不可能的,因为前面的 if 语句如果字符串太长就会退出函数,所以我们甚至不会遇到这种情况。你说的根本不可能。”所以调试非常有趣。
对我来说,如果它能解决这个问题,不,不是解决,而是改进这个问题,那将是巨大的进步,无论是通过代理(agents)还是将 LLM 集成到 IDE 中。
我认为存在一种“注意力剥夺”的说法。我认为将出现一种全新的攻击向量。我们正在使用 LLM 生成虚假的错误报告,以及所有这些虚假信息,目的就是有效地打击和伤害开源项目的维护者。Polykill 是第一个出现这种经历的漏洞,这是一种“注意力剥夺”,一个活跃的恶意维护者不断骚扰项目所有者。然后一个“白骑士”出现,提出要从他们手中购买一些东西。当他们购买后,实际上用恶意代码替换了它,然后使用了。所以,围绕着以非常激进的方式使用这些技术,整个安全领域正在发展。
我们正在进入一个引人入胜的世界,但我确实同意你的看法,人类开发者将是这个世界的重要组成部分。
是的。
这份工作可能会演变,但它会一直存在。如果可以的话,我没有真正看过这一页,我觉得和你一起看看会很酷。这又是——
Stack Overflow,我的最爱。
……Stack Overflow 开发者调查,谈论他们对 AI 系统的看法和使用情况。总体的看法是,61% 的人说他们使用 AI,25% 的人说不使用,也不打算使用。所以大多数人都在使用它,大多数人对它持积极态度,包括积极、非常积极或中立。这看起来超过了 90%。
这么多人根本不打算研究 AI,这真的很令人惊讶。尽管我不喜欢用它来编码,但我希望有一天我能更多地使用它。所以对我来说,我总是在寻找下一个事物。我只是惊讶于人们对此如此固执。显然,第二个,AI 工具态度,考虑到受访者的数量,它肯定只包括了对第一个问题中前两个选项做出回应的用户。
我想知道那些说“不”和“不打算”的人,是不是那些尝试过之后很快就有了“这真的很糟糕”这种直觉的人。
是的。
所以他们可能是经验丰富的程序员。他们会说:“不,这并没有让我更高效。”81% 的人同意,提高生产力是开发者认为 AI 工具最大的好处。好的,那么好处是什么?提高生产力、加速学习、提高效率、提高编码准确性、使工作量更易管理、改善协作。乐趣在哪里?增加乐趣呢?对我来说,那应该是第一位的。
也许加速学习是乐趣的一个子类别。如果你能学到更多,变得更好。对我来说,这听起来不错。
我不知道。这不一样,因为生产力也是乐趣的一部分。有一种轻松感。我的意思是,也许是改善协作,所有这些元素肯定都有。
我使用 Copilot 的那段时间,确实有一段时间会产生一种惊奇感,它能做到的事情简直令人惊叹。
是的。
即使我不使用它,它能做到的事情也让我印象非常深刻。我们能拥有如此接近的工具,这对我来说很了不起。
就 AI 工具的准确性而言,只有 2.7% 的人高度信任——
我会说,如果你认为应该高度信任 AI 的输出,那你一定是个非常新手。你应该非常怀疑。
是的,我不知道我站在哪一边。可能有些不信任。高度不信任似乎过于激进。
确实有点,没错。你应该总是假设它有问题,然后从那里开始去验证它。
然后是关于 AI 能否处理复杂任务的评估,大多数人认为它不能处理复杂任务。我的意思是,人们似乎对它能处理什么和不能处理什么有很好的判断。
我认为人们对编程中的“复杂”是什么并没有很好的理解。
当然,是的。
如果你说:“给我写一个快速排序(quicksort)”,有些人会觉得快速排序超级复杂。但我认为,这实际上可能是你能要求 AI 做的最简单的事情。对于那些有充分文档记录的东西,它会做得很好。
是的。可能是高层设计决策,人们现在甚至不使用 AI 来做这些,我想代理(agents)应该就是做这类事情的。那可能是最困难或最有影响力的事情,或者说最困难的事情是发现错误。
是的。
明年的 AI 工具,编写代码,等等。
现在,这个,伦理部分。我真的非常好奇你对伦理的看法。我们会看到欧洲制定一些新的法规吗?艺术家们怎么办?那些真正……因为编码和艺术家之间的区别非常非常简单。如果你给我一张纸,我可以给你画一只螃蟹。你会说:“那是一只螃蟹。”但你不能对编码这样做。它要么是对的,要么是错的。对于螃蟹是什么,没有解释上的变体。它就像是:“不,你不能那样说。”它能表达的东西非常受限。我能理解为什么艺术家会觉得那是一个非常令人沮丧的地方。然后谁会因此得到回报?然后还有关于编码和许可证的整个问题。你认为他们抓取了多少 GPL 许可证的代码并用作训练数据?GPL 强制开源。你打算怎么处理这个问题?这意味着你的模型可能需要开源。如果 OpenAI 的任何旧有内容有任何 GPL 的迹象,他们可能不得不被迫开源。
是的,那是个奇怪的问题。这确实是个非常奇怪的问题,因为我认为这些模型大多数都在使用它们在技术上没有权利用于训练的数据进行训练。
是的,有很多问题。
有一个不成文的,这真是一个“狂野西部”。
因为你可以想象,我总是以欧洲为例,因为他们可能拥有最多的消费者保护法。你可以想象,如果出台一项法律,规定如果你使用的模型生成了可能包含 GPL 许可的代码,你就必须开源,那会发生什么?有多少公司会惊呼:“天哪!”比如:“你有一年的时间来清除所有由模型生成、可能源自 GPL 的代码。”你可以想象那将是多么巨大的恐慌。那会是一场代码的甩卖。
那么,鉴于所有这些,你能给年轻程序员一些建议吗?这是 Reddit 上的另一个问题,来自 Reddit 的无限智慧。“一个二十出头的人应该怎么做才能在科技行业中前进?”这个问题还有一个有趣的补充:“这样做,会不会是走别人的老路?”
我会尽力回答这个问题。我认为,如果你正在进入科技界,我花很长时间才学会的最难的一条建议是,我曾经沉迷其中。显然,我们谈过我编程时间过长,以至于忘记了陪伴妻子、朋友的时间,所有这些都让我完全沉浸在一项活动中。我认为尽管这造就了今天的我,但这可能是一种不健康的、不明智的行为。所以,我能给出的最好建议是,你必须培养对它的热爱、技能和渴望。无论是仅仅使用AI代理,自己编程,使用Zig还是编程JavaScript,无论哪种方式,只要能让你每天都回来,就像在健身房里为编程“训练”一样。但也要懂得珍惜有价值的东西,不要迷失方向,不要为了创建下一个最伟大的初创公司而牺牲健康和人际关系。更糟糕的是,你牺牲自己的道德去走捷径,而这些捷径在生活中可能不应该走,只为了实现这些目标。因为我敢肯定,你可以听到数百个恐怖故事,讲述人们为了金钱上的成功而牺牲道德。
是的,某种程度上,“金手铐”带来的安逸感会摧毁灵魂。所以这一点非常重要,需要记住。有些年轻人可能会想:“我现在还想当程序员吗?” 看起来AI在编程方面越来越强。如果他们正在做这个决定,你还会说:“是的,如果这能让你感到快乐的话”吗?
如果我能回答的话,我仍然希望我的孩子学习编程,如果这算是一个足够好的答案——
是的,这是一个非常有力的回答。
……因为我的孩子比现在正在学习编程的年轻人要小几十岁。所以我希望我的孩子能在 Roblox 里随心所欲地运行和构建。我给他看 ChatGPT,然后说:“好吧,我们来提问。我们怎么做这个?” 对他来说,做这些事情仍然非常困惑。所以就像是:“我们来做这个。” 我希望他学习并变得高效,也许有一天他会在20年后放弃所有这些技能。但我敢打赌,无论他放弃了什么技能,或者他不得不放弃什么硬技能,一个我们从未想过全新领域将会出现,就像如果你在70年代问某人关于社交网络,他们会说:“你到底在说什么?” 未来将会存在截然不同、疯狂而令人兴奋的事物。
也许在虚拟现实中。
没错。
也许我们所有人最终都会只是在制作电子游戏。
只是为了所有人的娱乐,我们世界的“美丽新世界”?
嗯,我认为娱乐是对电子游戏可能性的某种简化。就像,生命的意义到底是什么?我的意思是,它可能是一个能带来深刻满足感的电子游戏。它不一定只是多巴胺的刺激。它可以是教育性的,可以是令人恐惧的,可以是挑战性的,迫使进化,跳入冒险,从而构成一个充实的人生。那可能就是电子游戏。谁知道呢?尤其是在虚拟现实中。我倾向于……这是另一回事。我玩很多电子游戏。我认为让电子游戏变得深刻充实还有很大的空间,还有很多发展方向。
我不知道你玩很多电子游戏,因为当我特意问你“我应该玩《魔兽世界》(World of Warcraft)还是做 Advent of Code”时,你回答说:“Advent of Code,Advent of Code。”
哦,那可能意味着我从未玩过《魔兽世界》,因为有些游戏我避开。顺便说一句,我认为《堡垒之夜》(Fortnite)就是其中之一,因为我担心它会让我太上瘾。
是的,是的。
所以有些游戏我就是知道我不会特别上瘾。比如,我非常害怕《文明》(Civilization)。我从未玩过《文明》系列游戏,因为我担心。我担心它会把我引向黑暗的道路,因为有些游戏真的会让你深陷其中。我更擅长玩那些可以控制游戏时长的游戏,这就是为什么我玩《上古卷轴:天际》(Skyrim)或者《博德之门》(Baldur’s Gate)。它们可以像一生的伴侣,而不是那种让你上瘾到天亮,然后你问自己“我的生活怎么了?” 发现自己赤身裸体地躺在某个垃圾箱后面,只是想知道发生了什么。是的,这就是我选择电子游戏的方式。
你不是第一个特别提到《文明》的人。
是的。
我不止一次听到有人,而且是科技界地位很高的人说:“《文明》是我的克星。如果我靠近那个游戏,我就完了。”
是的。
我甚至从未玩过这个游戏。现在这让我觉得:“老兄,我得试试这个。听起来太疯狂了。”
是的。而且新版本据说真的非常非常好。我们刚才在说什么?对了。对于同样的年轻开发者,你有什么关于职业发展路径的建议吗?所以你最初是在 Schedulicity 工作?
是的,那是我第一份全职工作……之前我做过一份政府合同工,那不算完全全职。是用 C 语言开发的,很有趣。然后我自己创业了一段时间。所以如果你把其中任何一个算作全职,那它们就是全职。Schedulicity 是正式记录在案的。
跳槽,在不同的公司工作,以找出什么能带给你快乐,这有价值吗?
我认为这很有道理,因为你得到的每份工作都不会是完美的。你的第一份工作可能会让你觉得你讨厌编程。确实发生过,我曾在一家公司实习,我总是不断地告诉你我过去做过的更多事情,我曾在——实习。
天啊。你做了这么多事。太不可思议了。
……一家叫做 Total Information Management System 的地方。还记得我几个小时前谈到过的,关于医疗保健和工业运输等等吗?那是一家 C# 公司。它糟糕到我做完之后,大学第一学期就去改了机械工程专业。我当时想:“好吧。其实我喜欢计算机科学。我讨厌编程。” 所以仅仅因为你有一份工作,并不意味着它就是你最终的选择。而且,最棒的是,如果你得到一份工作,你喜欢它,想做它,而且它令人兴奋,你就不需要改变。我认为很多人会说:“哦,我得找下一份工作了。我在这里待了两年了。” 有这种“你必须跳槽”的心态。我不认为你必须跳槽。我不认为这会损害你的职业生涯。因为如果你不跳槽,你会获得更多责任,并且能够以更有权威的方式说话。下次你面试时,你会更倾向于说:“哦,是的,我必须让这些人去做所有这些事情。” 就像你如果在一个地方待得更久,你就能以更大的权威说话。在我看来,这只有好处。只有当你因为害怕或不想改变而留在一个地方时……你已经有了一份适合你的工作,你只是不想改变,你只是想:“我可以进去,然后完全不用动脑。” 我认为如果你无脑地工作几年,你会发现自己……那才是唯一的真正危险。你最终会一无所获。
天啊。天啊。尤其当你年轻的时候,那才是重点。你会说:“去冒险。跳到下一件事,再到下一件事。” 不是为了钱,而是为了个人的快乐,纯粹的快乐。
而且钱最终也会随之而来,这才是最棒的部分。当你不是为了钱而奋斗时,有时钱反而自己就来了。
是的。而让生活值得的,是你一起工作的人,一个好的团队。有些方面,虽然听起来很泛泛,但文化很重要。只要是让你快乐的就行。比如,我不会点名具体公司,但有些公司每个人都非常朝九晚五。即使工作很令人兴奋,我也会说他们工作不够努力。我是那种喜欢全力以赴,喜欢被充满激情的人包围的人。公平地说,他们很多人没有家庭或者没有——这是一个引人入胜的选择。我真的不想贬低任何选择,比如工作与生活的平衡与否,我认为两者都是美好的道路。如果你真的从工作中获得了巨大的价值和快乐,那么全身心投入,至少在你生命中的某个阶段,是一件美好的事情。就是全力以赴,充满激情,牺牲很多社交生活,所有这些。我不知道。那也可能很美。
是的。从某种意义上说,这可能非常非常令人兴奋,特别是如果你正在创建自己的事业。我可以想象那会非常令人兴奋。如果我是 Amazon 的 Jeff Bezos 在创建 Amazon,可以想象那些早期岁月可能非常艰难,他投入的时间也可能非常非常多。但我想说的是,在我们的文化中有一个独特的方面,我们把家庭和工作看作是等价的权衡,比如“哦,你有没有孩子都行”。而我对此唯一的真正看法是,在你有了孩子之前,你永远不会知道自己爱的能力有多大。你就是不知道。有些人会说:“哦,是的,但我爱我的狗。” 就像我也爱我的狗一样。然后我有了孩子,现在我的狗就变成了:“它们还行。我喜欢它们。”
我明白了。
我回家摸摸我的狗Indy,我会说:“哦,Indy。”然后我就说:“好的,Indy再见。”我甚至无法形容两者之间的区别,它们根本不是一回事。这种权衡取舍,没有人能告诉你那是什么感觉,因为现在有一个真实的现实,我百分之百确定我妻子也是如此,那就是如果现在我们得到消息说你必须接受某种医疗程序,如果我们这样做,你会死,但你的孩子会活下来,我内心毫无疑问会选择那样做。如果我能预见未来,如果我现在必须死去,而我的孩子会因此过上更好的生活,他们会更快乐,更充实,以及所有这些,我向你保证,我妻子或我都会毫不犹豫地选择那样做。这就像你永远无法对大多数事情说出那样的话。人们会开玩笑地说,直到真正面临抉择时。但有了孩子,你就会有这种强烈的保护欲。我光是想到有人虚构地把我的孩子推倒在地,我就会出汗,身体会产生真实的肾上腺素反应。所以这是一个如此不同的世界,很难解释。你年轻时永远无法说服我,这会是如此重要。
是的,是的。
是的。我以为我懂,但我其实不懂。
但除此之外,我认识的一些最成功、最高效的人都有孩子。所以我不知道这是否算是一种权衡。你感受到的那种爱,似乎是一种催化剂,让你时间更少,但你会更好地利用这些时间来提高效率。
我认为这确实很大程度上改变了我的生活,以及我处理问题和一切事物的方式,变得非常不同。
让我问一些来自 Reddit 的随机问题。从1到10分,你有多讨厌微软(Microsoft)创造的每一款产品,为什么是10分?我想我们已经讨论过这个问题了。
我们还没有严格意义上地讨论过。
好了。请继续。请继续。
好的。
请利用你的时间。
我唯一想说的是,我不喜欢微软(Microsoft)假装是好人,而他们真正想做的是让你沉迷于他们的产品,让你尽可能多地使用他们的产品,这样他们就能从你身上榨取尽可能多的钱。
嗯,在这个世界上,真的有好人吗?
这是一个很好的观点。我认为 Neovim 是个好东西。他们没有办法赚钱。Justin Keyes 是一个仁慈的独裁者,他深入思考产品,并努力使其做到最好。而像微软(Microsoft)这样的公司,他们把 VS Code 作为亏损产品来推广。Copilot 可能也在亏损运营。这些东西都在让你深陷其中,GitHub、远程工作区、CI、Copilot,你变得像被困住的永久用户,如果价格上涨,在某个时候转换成本会非常高,以至于你永远无法切换。我唯一的担忧是,微软(Microsoft)曾被指控实行 EEE 策略(Embrace, Extend, Extinguish,拥抱、扩展、消灭),现在感觉他们又在故技重施。
是的,我担心批评一件好事,因为你可以看到做那件好事的动机,比如谷歌(Google)创建了所有这些不赚钱的服务,比如 Gmail。你可以讽刺地说,他们这样做只是为了把你绑定到他们的生态系统中,这样他们就可以基本上让你终身使用。但同时,他们创造了 Gmail 也很棒——
是的。
……而且他们创造了一款令人难以置信的产品,所以——
在这一点上我同意你的看法。它确实是一个好产品。VS Code 是一个好产品。
是的。
现在,我想别把那放在……但没关系。他们做得很好。
是的。所以这些公司背后会有经济动机。顺便说一句,我为微软(Microsoft)辩护——不,不是辩护,而是说些好话——只是为了能和 Prime 抬杠。但那……
顺便说一句,我喜欢那样。
是的,Linux 是我的初恋也是我的终极之爱,它确实……Linux 和开源的精神是美好的,所以我确实认为,当这些大公司,即使他们试图做好事,往往利润驱动就会占据主导,他们就会腐化自己,而微软(Microsoft)在自毁方面有着悠久的历史。
是的。
话虽如此,他们也做了很多,你可以说出于犬儒主义的原因,因为他们想在开发者中显得像个好人,但他们确实为开源做了很多贡献。就像 Meta 一样,Meta 也做了大量——
是的。
……来支持开源。你可以说,实际上对于这一点,我甚至不知道能否从财务或犬儒主义的角度来解释为什么 Meta 要开源 Llama 和这些——
是的,那个有点令人困惑。它看起来很棒。
也许是为了招聘。但不,我认为那是合法的,只是一个道德上非常强大的决定。有时这些公司,因为他们有很多现金,可以做出正确的、做正确的事情。
是的。这是一个非常积极的看待方式,我觉得这很好。
嗯,我们应该永远保持怀疑。
是的,我的意思是,归根结底,公司既不好也不坏,它们在道德上是中立的。是那些经营公司的人,是那些人做出的决定,才是真正产生好与坏的根源。
另一个问题,问他是否知道如何挤牛奶?我已经问过了。答案是——
不知道。
哦,不,你不知道。
我从来没有挤过牛奶。
从来没有挤过牛奶。
差点被牛杀死,但从来没有挤过牛奶。
你骑过公牛吗?
没有。
好的。为什么是男模?
好的,我可以解释一下。我会说一些比如:“我真的很不喜欢紫色,因为紫色让我不高兴。”我不知道,就是一些很无害的话。但紧接着就会有人问:“但你为什么不喜欢紫色呢?”然后就会像……就像《祖兰德》(Derek Zoolander)一样。我刚花五分钟讲完,然后下一个问题就是:“但说真的,为什么呢?”就像那句“为什么是男模?”
是的。所以那是《祖兰德》(Zoolander)的梗,当他长篇大论解释为什么是男模,然后他同意了又忘了。
是的。
Ligma 是什么?
我被 Ligma 坑过好几次了。你知道 Ligma 的起源故事吗?就是著名的主播 Ninja,有人用 Ligma 梗来套他,问他:“哦,你听说过 Ligma 吗?”他回答:“没有。”那人就说:“哦,Ligma balls。”然后 Ninja 被这个梗弄得很受伤,他开始在聊天室里封禁任何说 Ligma 这个词的人。所以如果你不接受这个梗,你就会被“摧毁”。当然,他被“摧毁”了,所以现在大家的目标就是,能不能用 Ligma 梗来套我?TJ 用了 iladies。他问:“哦,你听说 E-girls 改名为 iladies 了吗?”我根本没料到。我当时就说:“什么?”然后他说:“iladies nuts on your face。”然后我就:“天哪。”然后一个叫 Pirate Software 的也用这个梗套我,问:“哦,你听说过谷歌(Google)的 SIMA 吗?”SIMA 确实是谷歌(Google)的一个真实产品。我当时就说:“哦,是的,我听说过这个。这又是什么?”他说:“SIMA balls。”对吧?我就想:“该死!”我怎么才能避免……?所以我在直播中被套路过很多次。我被 Ligma 坑得最多。
请问他关于他的 dict 的大小。
好的,那是 dict,在 Python 里是 dictionary(字典)的意思。
谁不喜欢 dicts 呢?
是的,这是个好问题。用 Python 的时候就是一场 dicts 派对。
我爱 dicts。
那应该做成一件 T 恤。那真是一件搞笑的 T 恤。所以在 Stack Overflow 上,你可以问任何你想问的问题,有一天我决定在 Stack Overflow 上精心设计一个问题,标题是“如何测量你的 dict 和字节”。然后我开始详细解释所有不同的事情,比如:“那么,字符串和引用的成本是多少?”当你真正双手操作你的 dict 并深入研究它时,这非常困难,我真的加入了一些双关语。Stack Overflow 团队删除了这个问题,然后有人手写了一封邮件给我,解释了他们为什么删除这个问题,并称赞我这个问题多么彻底和深思熟虑,巧妙地融入了双关语,整个团队都印象深刻,但它不合适,必须删除,并且不要再犯,否则他们会封禁我的账户。所以那是一个非常有趣的时刻,我当时想:“哦,这事真好笑。”那是大约六年前的事了。去年我参加一个会议,有一个人戴着 Stack Overflow 的名牌,我问:“哦,你在 Stack Overflow 工作吗?”他说:“哦,是的,我工作。”我说:“我有个故事要告诉你。”然后他说——“不,等等。你是那个 dict 男吗?”他唯一的问题就是这个。我当时就想:“太棒了!”我甚至什么都没说,他就立刻知道我是那个 dict 男。
哦,不。是的。我应该认真地说,我认为我在 Python 领域有过很多次对话,每次我不得不提到这个数据结构的名称时,都会让我感到不舒服。
这是一个非常不幸的词语缩写。
Dict。这就像我去五金店买填缝剂(caulk),总会遇到一位和蔼的老太太,我问她在哪儿能找到,这感觉非常尴尬。我尽量清晰地发音。
把‘L’音发出来,就像‘caulk’(填缝剂)那样。
澄清一下,是‘caulk’。整个过程都尽量避免眼神交流。你曾说过上帝在你生命中占据了很大一部分。能多谈谈吗?上帝是谁?他对你的生活产生了什么影响,扮演了什么角色?
我确实谈到过那个重要的夜晚,当时我不知为何,在那一刻获得了觉醒。很明显,我从小到大,可以说是一个“功能性无神论者”。我去过几次教堂,但不太记得作为家庭成员一起去教堂的经历。所以,我和教堂之间并没有什么特别紧密的联系。就像90年代在美国长大的其他人一样,你生命中的某个时刻总会与教堂有所接触或交集,这可以说是一种非常普遍的现象。所以当那件事发生时,我感到相当惊讶。我当时并没有朝着那个方向发展,也没有决定做任何那些事情。对我来说,那显然是我人生的转折点。没有它,我无法想象现在的我会是怎样。我只能告诉你,我不会有现在的动力。我可能不会完成大学学业。我可能不会找到我的妻子,也不会有我的孩子。我不会懂得如何尊重他人。我认为如果没有那一切,我对人的价值观念会非常非常小,因为我可能会继续以我过去的方式将人“物化”。也许最重要的一点是,有一段经文——我甚至不知道它在哪里——它大意是说,我们爱,因为他首先爱了我们。所以对我来说,我觉得如果没有这个,我可能永远不会过上幸福的生活。我甚至不知道那对我来说是一个选择。我从来没有真正地……那对我来说是非常艰难的几年,我非常非常悲伤,总是不断地寻找能充实我的东西。所以我没有自信,也没有喜悦。我感到非常悲伤。而那一刻,我第一次突然觉得我不需要达到某种标准。这些标准已经被“支付”了,一切都已完成,那是免费的礼物,那是交换。所以,就像是第一次,我不需要成为一个酷炫的人,不需要说所有正确的话,不需要去感受,不需要通过性征服来寻找自我肯定。我不需要做任何那些事情,这让我感到无比的自由。那么,上帝是谁?这也许更像是一个教义问答的问题。人是什么?上帝是谁?这些是更难的问题。我相信,任何时候当你试图深入描述上帝是谁时,你通常会陷入基督教异端。但对你来说——
他给了你一个获得幸福的机会。
是的。他不仅给了我获得幸福的机会,也让我第一次真正感受到被宽恕,并且能够原谅那些伤害过我的人。很久以来,我一直背负着对高中时期以及所有那些事情的憎恨所带来的重担。通过那次经历,我写下了每一个人的名字,并且把这份名单随身携带了一段时间,这是我原谅的人的名单。我读了几遍。我不能让自己被那种愤怒或情绪所吞噬,因为仇恨是如此顽固,它会纠缠一生。仇恨真正的解药只有一种,那就是宽恕。我认为没有它,你无法摆脱仇恨。所以我选择原谅这些人,然后继续前进,这真的让我获得了某种程度的自由。如果我自己没有首先体验到宽恕,我永远不会想到宽恕是带来这种改变的方式。
从哲学角度来看,爱在人类境况中扮演着什么角色?爱在你的生活中又扮演了什么角色?
显而易见,每个人都渴望爱。我妻子最近说服我陪她看了一次《盲目之恋》(Love is Blind)。如果你不熟悉这个节目,你会觉得它就像一场为了制造疯狂剧情而进行的灾难性实验。但无论如何,它的理念是,如果你不见面,你可以在10天或很短的时间内爱上一个人并想和他们结婚。而你最终真正看到的是,所有这些人都极度渴望爱。其中有一部分……我告诉我的妻子:“这就像是爱的角斗士。”我们看着人们为了戏剧效果而争斗,但他们真正想要的是爱。如果你愿意,这就像他们为了爱而殊死搏斗。看着这一切,会有一种近乎悲伤的感觉。所以我认为很难界定它在人类体验中的作用,因为我认为它不仅仅是我们都自然渴望的东西,更是我们所必需的。我不认为你能真正进步,当我提到“爱”这个词时,我想把它稍微限定一下。我指的不是希腊词“Eros”(情欲之爱),我认为父爱和友爱都极其重要。我认为“agape”(神圣之爱)也非常重要。Agape之爱凌驾于所有其他形式的爱之上,但它显然不同,也与亲情之爱等共同需要。所以你需要这些爱的混合体,每一种爱都有其不同的原因和适用之处。所以我不认为……我无法想象一个没有爱作为基础的、任何形式的良好世界。因为,我来这里并不是想引用任何经文,但它说,不是钉子把他钉在那里,而是爱。这就是这些事情发生的原因。所以,如果宽恕是某种意义上消除仇恨的必要条件,那么爱就必须是宽恕的动力。
是的,那是生活的悲剧性一面。我认为我们每个人内心深处都有一种深刻的孤独感,以及渴望成为某个更宏大事物一部分的向往。这种向往就是一种爱,它有许多名字,但确实如此。是的,爱的这一面,是生命中美好的一面,而悲剧、孤独和不幸的苦难是生命的基本组成部分,美好的一面则是爱。
是的。
我觉得现在是时候再提一下 Reddit 了,那个充满永恒积极和爱的地方。有人写道:“请替我感谢他(你),感谢他永恒的积极性,并替我给他一个大大的拥抱。”所以我不会在镜头前给你一个大大的拥抱,因为我怕我会勃起,那会非常尴尬。
嘿,我们别再提‘dict’了,好吗?
那是我最喜欢的数据结构。就像我说的,我喜欢‘dict’,各种各样的‘dict’,有序的‘dict’——
无序的。
……无序的‘dict’。我从不歧视。是的,但我想对你说声非常感谢。我经常听你的节目,我真的很喜欢……我自己也经历了很多糟糕的事情,但你的积极性,即使你在做最无聊的事情时,那种积极性也从你身上散发出来,你激励我成为一个好人。你激励我创造东西。所以谢谢你。我相信还有很多很多人因为同样的原因听你的节目。所以谢谢你的积极性。谢谢你成为许多人生命中的光,也谢谢你和我交谈,兄弟。
哇。那真是太好了。我真的很感谢所有这些非常好的话语,即使是来自 Reddit。这非常令人惊讶。但谢谢你。我的意思是,我知道你知道有许多人的生活,我相信你也收到过因为你的行动、言语和所做之事而改变的信件。所以,做这一行的好处之一就是你有机会潜在地改善某人的生活。而你采访了很多人,有很多人听了 克里斯·拉特纳(Chris Latner) 的话,看到了他对 Swift 的热情,然后可能去学习了 Swift,然后找到了非常棒的工作,而这一切都可以追溯到你那次采访。所以这些都是很棒的事情。同样,你也是如此,你做了很多好事。
兄弟,这话也送给你。谢谢你今天来交谈。感谢收听与 Michael Paulson,也就是 ThePrimeagen 的对话。要支持本播客,请查看描述中的赞助商。现在,让我用 保罗·科埃略(Paulo Coelho) 的一句话来结束:“当我们努力变得比现在的自己更好时,我们周围的一切也会变得更好。”感谢您的收听,希望下次再见。
Comments
Post a Comment