今天的节目:如何辞掉工作并全职从事开源工作。这个故事说明了一切——平衡业余项目和全职工作,建立足够的支持来离开你的工作,并向你的家人和朋友解释辞职。还有:如果你的项目成功了,然后有人分叉并围绕它建立商业业务,你会怎么做?您如何处理黑客新闻反馈?我们如何改进 C 编程语言?在此处订阅 注意:此播客旨在供人们聆听。如果可以,我们强烈建议您收听音频,其中包括页面上没有的重点 Andrew:让我澄清一下。商业分叉 Zig 很好。它是 MIT 许可的,就像去一样。但是他们对 Fork 所做的事情非常棘手,对吧?因此,他们实际上删除了许可证文件,将他们自己的许可证放入其中,看起来您必须为该软件付费。所以,他们欺骗了人们。这就是他们所做的问题。亚当:你好,欢迎来到 Corecursive。我是亚当·戈登·贝尔。每一集都有人分享一个正在构建的软件的故事。今天的节目,如何辞掉工作并全职从事开源工作。这个故事说明了一切,平衡开源工作和全职工作,建立足够的支持者和足够的储蓄来离开你的工作。对我来说最困难的部分是向你的另一半以及你的家人和朋友解释离开你的工作。然后,如果你的项目成功了,然后有人分叉并围绕它建立商业业务,你会怎么做?还有很多处理黑客新闻反馈、如何改进 C 编程语言以及如何在不显得傲慢的情况下雄心勃勃。我的客人就是这个人。
安德鲁:我叫安德鲁·凯利。我是 Zig 软件基金会的首席软件开发人员和总裁。 Adam:Zig 是一种编程语言,我们将探讨为什么需要它,但 Andrew 开始使用 Zig 是因为另一个副项目。安德鲁:我开始做一个音乐工作室项目,在这个音乐工作室项目中,你有比其他编程项目更困难的要求。因此,例如,如果有人要现场使用您的音乐工作室软件进行现场表演,则您有一个热循环,您绝对不能跳过音频,否则他们的整个表演可能会受到影响。所以,你只是有这些新的约束,你真的需要控制它的工作方式。同样,如果您想支持与此相关的所有硬件,很多时候您将无法依靠其他人的第三方库来为您做这件事,您将不得不进入 OC、C++ 或其他低级语言,这些语言可以为您提供所需的控制权,我注意到的另一件事是,当我尝试使用其他人的库时,如果遇到问题,我将无法修理它。太慢了。我正在努力在这个大项目上取得进展,并且我学到了在这里发明东西的价值,对吧?人们总是告诉你,“不要发明。”不要 NIH 综合症,但我学到了实际上的价值,是的,有时这样做是正确的。如果你真的想要那么多的权力和控制,你就必须去做。所以,那是我开始真正从头开始使用 C 或 C++ 进行编程的时候。安德鲁:我认为自然的第一个冲动是,如果其他人解决了问题,就去使用他们的解决方案,对吗?已经完成了。你写了胶水代码,然后你就离开了。在很多方面这很聪明,因为我们只有这么多时间,我们只有这么多能力来分析问题空间。而另一个人已经完成了那部分。那么,让我们看看这是一个很好的例子。音频库就是一个例子。所以,我尝试使用端口音频。我想我尝试过使用 SDL。这些项目大多有效,但问题是它们解决了 90% 的问题,如果你想缩小最后 10% 的差距,你必须重新开始。所以,我最终编写了自己的跨平台音频抽象,称为 libsound.io,这让我可以做其他库不允许我做的事情。因此,例如,我能够只显示输入设备列表并让它自动刷新。如果你拔掉麦克风,它就会消失,如果你插入麦克风,它就会出现。
看起来很简单,对于用户体验来说似乎是一件很合理的事情,但是其他这些库就是没有这种能力。老实说,我可能需要数年时间才能将功能引入这些库,然后有足够的时间让这些库将更新添加到打包库的各种开源发行版中。因为如果您使用第三方库,人们希望使用预先打包的版本。所以,你甚至在等待他们的发布周期。然后,您正在等待下游维护者获取它,但是如果您将其放入自己的代码库中,那么您只需在想要发布它时发布它,对吗?并且这些语言有很多问题阻碍了进展,错误需要很长时间才能找到和修复,进展比预期的要慢。所以,那是汁液开始流动的时候。我想,“我想我可以做得比这更好。”我想我看到了这些语言带来了什么,我想我可以将它们提升到一个新的水平。亚当:你有没有对抗这种冲动?您是否立即在构建语言或那里发生了什么事情上偏离了方向?安德鲁:我有。我确实与冲动作斗争。我在音乐播放器项目上坚持了很长一段时间。然后,说实话,我刚刚经历了一段艰难的生活经历。当时是分手,就像一种应对机制,我让自己说,“嘿,我知道你一直在努力保持自律并坚持同一个项目很长一段时间,但去玩点乐吧,开始一个新项目,开始一种编程语言。对你会有好处。”然后,它永远不会切换回来。亚当:所以,你是不是好像我的整个大脑都被这次分手所占据,但我想如果我开始这个新项目,至少可以暂时把它从我的大脑中挤出来?安德鲁:嗯嗯(肯定)。我的意思是我认为只是自然的情感进步会顺其自然,但与此同时,我正在玩一个分散注意力的玩具项目。亚当:是的。我的意思是它肯定比玩马里奥赛车的效率更高,我不知道——
亚当:……一天八小时什么的。我喜欢马里奥赛车。我不知道。安德鲁:我第一次使用编程语言时,我一直想知道编写一个语言会是什么感觉?每当我听音乐时,我总是想知道尝试制作这样一首歌曲会是什么感觉?我一直很喜欢通过只是想知道过程的另一面是什么样子来消费东西。 Adam:当我在大学时,我有一堂课,我们构建了一个编译器,就像一个玩具编译器。这非常有趣。 Andrew 也有类似的经历,他继续玩弄 CoffeeScript 的叉子。我发现玩编程语言很有趣,但是 Andrew,他从中得到了一些不同的东西。安德鲁:你知道那是什么吗?实际上几年前我跑了我的第一次马拉松,但我觉得我没有。因为我走了最后四英里,狠狠地撞到了那堵墙。我想大多数人都会这样做,因为我仍然处于我这个年龄段的前 50% 之列。所以,我想大多数人都是在马拉松比赛结束时走的,但在我的脑海里,就像你没有做到一样。你走了一部分,对吧?所以,我一直对我制作的编译器有这种感觉,因为如果它像一个 CoffeeScript,你实际上只是在输出 JavaScript。然后,对于大学里的那个,教授让我们做 C 作为输出。所以,我总觉得我走了最后一部分。我一直想说,“不。我想让它真正制作机器代码并让它完成整个事情。我不想在某些层面上作弊。”我也不想像人们所做的工作那样贬值。这就是它仍然是一个编译器。如果您从一种输入语言转换为另一种输入语言,那就是编译器。这只是我个人的主观体验,我觉得我错过了一些我没有完成的有趣部分。 Adam:Andrew 甚至在开始使用 C 语言之前就明白了,这很重要。 C 是一种小语言,它无处不在。根据 Stack Overflow 调查,20% 的软件开发人员使用 C。有些条件可能适用于那里。
我不知道 Stack Overflow 调查是否具有代表性,但他们有很多开发人员在使用它,其中 20% 的人说他们正在编写 C。这是五分之一的开发人员。这比使用 Ruby、Swift 和 Rust 的人数加起来还要多。所以,无论如何,安德鲁分手了,他允许自己开始学习他的语言。他的想法不是从第一原则开始创建一种新语言,而是寻找可以解决的具体问题。安德鲁:地毯下面有污垢吗?也许我们可以用不同的方式做到这一点。许多软件都是建立在前几代人交给我们的抽象前提上的。让我们把这些剥开一点,看一眼然后说:“也许我们现在可能想要做出一些不同的决定,因为 40 年后了。”安德鲁:一个例子是静态链接。如果您尝试在 Linux 上发布应用程序,人们会遇到一个常见问题,即它只能在 Linux 的一个发行版上运行。因此,例如,有人可能会在您下载的网站上提供他们的应用程序,但只能在 Ubuntu 或与 Ubuntu 足够接近的东西上运行。亚当:我真的只是遇到了这个问题。我试图安装一个 Python 库 Matplotlib。在 Mac OS 上,这非常容易,但是要将其导入 Alpine Linux,我必须安装所有这些依赖项。 Andrew:原因是他们动态链接了他们依赖的所有库。他们只是希望您使用系统包管理器安装这些库。我选择制作 Zig 以便在 Linux 上的默认设置是,当我们为 Linux 提供预构建 Zig 的下载时,您根本不链接 libc。它适用于所有 Linux,因为二进制文件没有 libc 依赖项。它只是在汇编中使用系统调用。它唯一的依赖是文件系统和内核。它不依赖于其他任何东西。所以,这样我们就可以提供一个二进制文件,它只适用于 Linux 上的每个人的计算机,就像在 Windows 和其他系统上一样。我们通过质疑使用动态链接分发事物并说:“好吧,也许我们应该走不同的方向,从而获得了这种好处。”
安德鲁:是的。我认为它确实取决于 glibc。我知道您实际上可以将 Zig 与 Go 一起使用,Zig 将提供拥有静态 Linux 二进制文件的能力,并为您提供 Go 程序的这种好处。安德鲁:一个是有太多方法会意外引入错误,这些错误不是因为编程困难而导致的有趣错误,但它们是不必要的错误,因为 C 编程语言做出了一些错误的决定。所以,举个例子,有一个类型系统,一个类型系统的全部意义是帮助你不犯错误,但是类型系统有一些它允许没有错误和警告的东西,这些东西只是错误的 99%时间。很容易犯这个错误。像整数转换规则这样的东西就是其中之一,所以这是我会提出的一种抱怨。太容易射中自己的脚了。然后,进行不必要的复杂调试会话来解决问题。安德鲁:然后,我要提出的第二个抱怨是,虽然 C 代码通常很容易阅读,因为它只是函数和数据。这是最好的情况。它上面确实只有另一种不同的编程语言,即 C 预处理器。它不是 C,它是一种基于文本连接的不同语言,人们过度滥用该语言。然后,很难弄清楚发生了什么。你看到一个函数调用,它是一个函数调用吗?如果您对正在阅读的代码不是很熟悉,您总是想知道,“这是一个宏吗?这可能是一个宏。”对?安德鲁:全球知识是一个很好的表达方式。是的。我使用 Zig 语言所做的重要设计考虑之一是让我们减少人们在阅读代码时必须记住的数量。安德鲁:有些人对人们彼此刻薄的规范非常防御。不要误会我的意思,我是一个非常直率的人。我对冲突感到很舒服,我可以告诉别人我认为他们充满了狗屎,但是你有没有进入 C、freenode 频道并只是观察?
安德鲁:那是我去过的最毒、最敌对的聊天室之一。在 freenode 戏剧之前,freenode 上的 C 编程语言频道。你可以进去问一些简单的问题,比如“我怎么……我不知道。我如何对齐结构体或其他东西中的字段?”一些非常合理的问题,你会得到一个叫你名字的人,一个说你不能经期的人,被动攻击根本无法解释。一个人给了你错误的信息,而实际的答案是你可以做到。没关系。还有一些你可以做的技巧。这是世界上最糟糕的地方之一。我不知道那是怎么回事。所以,就像我用来形容它的一个词是迂腐,对吧?安德鲁:他们甚至有,甚至有一个标志和一个迂腐的C编译器。我总是想,“哦,这是 C 聊天室的标志。”亚当:考虑到更好的语言和更好的不那么迂腐的社区以及在 GitHub 上发布该语言的工作版本这一愿景,安德鲁开始获得一些用户。安德鲁:每周提交问题的人数随着时间的推移慢慢增加。想要提供帮助的人数,提交拉取请求,从一开始就可供抢夺。它总是在公开场合进行。它只是随着时间的推移慢慢上升。我看到有人用 Zig 做的第一个项目是 Pokemon rom randomizer 项目。因此,他们使用 Zig 并制作了一组命令行工具来获取属于 Pokemon 的 Game Boy rom,并进行了一些 rom 黑客攻击。然后,给你一个新的 rom,你可以将它弹出到模拟器中,它会在所有图形中随机播放哪些 Pokemon 之类的东西。 Adam:构建一门编程语言需要大量的工作。你必须找时间继续推动它。
安德鲁:我会把 Zig 描述为在我职业生涯的混凝土裂缝中生长的一朵花。当我开始它时,我正在从全职工作中休息一下。然后,我需要一份工作。所以,我在一家名为 Backtrace 的初创公司找到了一份工作,做了一点工作,节省了更多的钱,然后辞职,在 Zig 上全职工作了几个月。我采访了 Apple,他们只是直截了当地说,“你可能不会在业余时间这样做。”所以,我说,“那你滚蛋吧。”顺便说一下,现在从 Apple 那里获得了对 Zig 软件基金会的捐款。亚当:有过紧张吗?我想你在 OKCupid 或其他地方。我不知道,是工作在增加还是有什么事情要做?你是否一直试图向你的同事宣传你的语言有多棒,直到他们生气?发生了什么?安德鲁:哦,是的。当我加入OKCupid时,我不得不与招聘人员进行全面谈判,因为很多公司只是在合同中写下“你业余时间做的任何事情都是拥有的,IP归公司所有”。这很荒谬。所以,我只是说,“你必须从合同中删除这一点。我将拥有我在业余时间在自己的设备上所做的一切的所有 IP。”那家伙就像,“哦,没有人要这个。我们通常不会这样做。我会看看我能做什么。”我不得不对他采取真正的强硬立场,最终他屈服了。你必须保护你的孩子,否则有人会把它带走。亚当:是的。这很愚蠢,对吧?而且你知道他们击中它没有问题,只是他们不想经历类似的问题……他不想找出向谁询问这个问题。亚当:但是你的实际同事呢,他们知道你在开发 Zig 吗?你谈过吗?
安德鲁:哦,是的。我并不害羞。我尽量不惹人讨厌,但我无能为力,如果我们...以这种方式编写,这个问题将是一个编译器错误而不是一个错误。”在某些方面,我认为它帮助我设计了编译器错误,因为我只是看到了我们在实践中遇到的问题。亚当:我有点出乎意料的是它会是 C++。我只是假设所有喜欢 SaaS 的东西,我不知道,而不是 C++。安德鲁:是的。所以,有趣的故事是,我不知道这家公司是 15 年前由 Maxwell Krohn 和另一个人的名字创立的。他们的博士论文被称为 OK Web Server。它就像一些......它与约会无关。这只是在 C++ Web 服务上实现安全性的一种方式。所以,基本上他们做了研究,然后他们想,“好吧,现在怎么办?我想我们会开一家公司。”亚当:是的。所以,他们使用 C++ 就像任意的。好吧,他们选择约会实际上是任意的。亚当:是的。它总是会是 C++。他们只是不知道是什么。安德鲁:有趣的是,当你加入公司时,他们只是让你阅读论文,因为它仍然准确地说明了代码库的工作原理。
亚当:我的意思是在某些方面这很棒,因为就像大多数地方都有代码库一样,没有一个人可以解释它的全部内容,对吧?安德鲁:是的。我同意你的看法,虽然我会说只是浏览了一堆旧代码,但我可以说创始人只是玩得很开心,只是尝试了很多,只是玩玩东西。我只是想,“谁在乎?我们肯定会退出创业公司并在四年后离开。我不屑一顾。”对?你可以在他们的代码中看到它。你可以说他们只是在胡闹,他们真的不在乎……这很漂亮……我觉得我和创始人之间有一种超社会的关系。我实际上并没有与他们互动,但我与他们的代码互动。而我就像…… Adam:是的。什么我不在乎,我要像 C++ 那样退出?安德鲁:有一个文件既是 Perl 脚本又是 C++ 文件,要更新它……它是自我更新的,所以你用 Perl 运行它,它会自我编辑,但是你应该……它是用于 C++项目。那有意义吗?这是一个多语言文件。安德鲁:所以,同一个文件是一个 Perl 程序,它像一个奇怪的黑客一样编辑自己,这样它就可以被两者解析。亚当:在你成为全职之前,你有没有觉得做这个和我的工作太过分了?
安德鲁:哦,我肯定压力很大。是的。我的未婚妻可以告诉你一些时候我只是表现得非常非常有压力,就像无法成为一个好伙伴一样,但我什至从未考虑过放弃做 Zig 的事情。我唯一考虑过的就是辞职。给我带来如此大压力的事情是感觉我只是在这些废话上浪费我的生命。浪费我的生命只是为了赚钱而成为别人游戏中的棋子,而我觉得我在这个开源项目中所做的事情更有意义。我的意思是我们在生活中创造自己的意义。我不是在这里判断任何人想用他们的生活做什么,如果你想赚钱就去赚钱,但我不想成为你赚钱策略的棋子。我想要做 ......