本篇内容是根据2020年1月份Stop the presses[1]音频录制内容的整理与翻译,
时事通讯对开发人员来说发挥着独特的作用。随着 Go 社区的不断发展和成熟,这些时事通讯为社区每周发布的大量新文章、演讲和库提供了急需的过滤器。
在本期节目中,Johnny[2]、Jon[3] 和 Mat[4] 与 Golang Weekly 时事通讯的 Peter Cooper[5] 一起讨论了他作为时事通讯策展人的角色。我们探讨了一些棘手的话题,涉及策展人的道德和责任,当然还有 Peter 和他的团队对塑造 Go 社区许多人接触到的内容的影响,至少在一定程度上是这样。
过程中为符合中文惯用表达有适当删改, 版权归原作者所有.
Mat Ryer:大家好,欢迎收听 Go Time 播客!我是 Mat Ryer,今天我们将讨论发布和编程,特别邀请了 Cooper Press[6] 的 Peter Cooper,他出版了著名的 Go Weekly 通讯[7]。你好,Peter,欢迎你。
Peter Cooper:你好!太好了,我很期待这次对话。
Mat Ryer:很高兴你能加入我们。今天还有几位常驻嘉宾,就像你在当地酒馆里常见到的老朋友一样……Johnny Boursiquot 和 Jon Calhoun。你们好!
Johnny Boursiquot:你好!
Jon Calhoun:嘿,Mat。
Mat Ryer:你们最近怎么样?
Jon Calhoun:还不错,我觉得你刚才是对我说的。
Mat Ryer:不不不……我没有任何暗示的意思。Peter,非常感谢你今天能加入我们。这是我们第一次见面,但我自从 Go 通讯发布以来就一直在关注它,什么时候开始的来着?
Peter Cooper:其实不是我开始的。最早是一个叫 Matthew Cottingham[8] 的人发起的,应该是在 Go 的早期,也就是 2012 年左右的时间……他大概做了 40 期左右,我才接手。所以我直到 2015 年初才接手,时间比这稍微长一点。
(译者注: 早期gopher提cl的"遗迹":https://codereview.appspot.com/19560046 https://codereview.appspot.com/16650043 )
Mat Ryer:对,但这已经成为 Go 社区的一个重要资源了,不是吗?我知道这是我了解社区动态的一个重要渠道之一。你认为它是如何成为如此重要的资源的?
Peter Cooper:其实我是在 Matthew 已经做了很多基础工作的情况下接手的。他一开始做了很多艰苦的工作。我自己也有做其他主题通讯的经验,尤其是 Ruby Weekly,我最初就是来自 Ruby 社区的。我现在仍然是一个 Ruby 开发者,虽然我也玩过很多其他编程语言……但我熟悉这个流程,而且认识社区中的人,所以能把事情推进下去,他在 Go 社区中也处在一个类似的位置。
所以我和他达成了一个协议;他不想继续做了,因为每周发布一份通讯是一个很大的承诺。而我因为已经熟悉了这个流程,就联系了他。我说:“我注意到你最近有几期没发。”他说:“对,我需要专注于生活中的其他事情……”于是我接手了,我们达成了一个协议。
事情就是从这里开始的。我在他最初积累的基础上继续发展。我记不清当时有多少订阅者了,但我想大概是四位数,可能是 4 千到 5 千左右。虽然不算特别多,但已经有了一定的基础。
Johnny Boursiquot:我很好奇,是什么让你注意到这个通讯呢?是因为你一直都对通讯这么感兴趣,还是因为 Go 本身吸引了你?
Peter Cooper:两者都有。我一直在关注市面上有哪些通讯,不过现在我已经有点跟不上了,因为几乎每个人都有自己的博客通讯……但那时候这种情况还不多见。你可以数得出当时大概有 100 个编程相关的通讯,那几乎就是所有定期发布的通讯了,而现在已经有成千上万了。
而且我对 Go 本身也很感兴趣,因为我一直对编程领域出现的新东西很有兴趣。就像我 2004 年最初接触 Ruby 时一样,我在 Slashdot[9] 上看到关于 Ruby on Rails 的文章,开始时有点不屑一顾,但最终还是深入了解了。这种情况在我接触到的几乎所有新技术中都存在。
当 Go 刚出来的时候,我看到 Go 团队发布的一些帖子时,确实引起了我的注意……你要知道,在更早之前,我其实是一个 C 程序员。我在 90 年代青少年时期学会了 C,花了很多时间用 C 和 Pascal 编写代码,还做了一些 x86 编程和演示编程之类的东西。而 Go 吸引我的地方在于,它结合了类似 Python 的实用性和 C 的低级特性,而且非常易读。
我知道可读性是 Go 语言的目标之一,但它真的打动了我,所以我想:“我对这个感兴趣,我想以某种方式参与进来。”所以我开始把 Go 的内容加入到我当时做的其他通讯中,告诉大家:“嘿,这个 Go 不错,虽然我做的是 Ruby 通讯,但这也是个很酷的东西。”
当然,很多人,比如 Mark Bates[10],他也来自 Ruby 社区,最终转向了 Go,现在他在负责 Buffalo 项目[11]……
Mat Ryer:对,而且据我所知,Ruby 社区已经不再欢迎他了。[笑声]
Peter Cooper:嗯,我不知道是不是这样……
Mat Ryer:我只是开玩笑的。
Peter Cooper:[笑] 是的,我非常喜欢 Mark。但确实有不少 Ruby 社区的人转向了 Go……也许没有其他语言那么多,但有些 Python 开发者也转向了 Go,尤其是 Python 社区。而我虽然对 Go 感兴趣,但并没有投入到全职的 Go 开发中去。
一开始就有出版社找上门来,因为他们知道我写过 Ruby 相关的书籍,他们希望我写一本 Go 初学者的书。我记得可能是 Manning 出版社,或者 Addison-Wesley……但我最终没有答应,因为我不想深入到完全学习一门新语言的地步。我当时对 Ruby 已经很满足了。不过这件事确实让我更关注 Go。
我学了足够的 Go,知道它的运行机制和理念,虽然我不是 Go 专家,但我能客观地看待这门语言,理解它的运作方式。
Mat Ryer:很有意思,我以前也做过很多 Ruby 开发,我那时候就知道 Mark,他当时也写过几本书,发表了一些文章……不过有趣的是,很多对 Ruby 感兴趣的人也对 Go 感兴趣,但如果你仔细想想,这两种语言非常不同,几乎是完全的对立面……
Peter Cooper:在某些方面是的……我觉得这是因为像 Ruby 这种语言吸引的是那些---
我们暂且不讨论那些把 Ruby 当作第一门语言的初学者。Ruby 吸引的是那些想要寻找不同编程体验的人。
这在 2004 年时非常明显,当时 David Heinemeier Hansson[12] 开始使用 Ruby 来开发 Rails,或者说最早的 Basecamp,然后从中提取出了 Rails。他几乎像是一个进步的开发者。我不知道这个词是否合适,但我觉得像 DHH 这样的人,包括我们中的一些人,都是相对进步的。
这种进步的开发者会对新语言或新技术持开放态度,会根据它们的实际情况来评估它们的优劣。对于我来说,Go 就是这样。如果我需要低级并发访问,但不需要像 C 那样的低级别操作,我就会选择 Go。如果我想要一些保护机制,我会选 Go 而不是 Rust,因为我和 Rust 合不来。我试过 Rust,但觉得它太复杂了。Go 对我来说更像 C,但去掉了 C 的糟糕部分。
我觉得有很多进步的开发者能够根据每种语言的特性来选择使用它。所以即便 Go 和 Ruby 不一样,这没关系。如果我想开发一个像 Rails 的应用,我可以回到 Rails,而不是非得用 Buffalo 框架。有些人会这样,比如 Mark,但我很乐意在不同语言之间切换。也许这是我工作的一个特点……但我能根据每种语言的优点来选择使用它。
Mat Ryer:我觉得这是一个健康的心态。很容易陷入自己的小圈子和回音室,然后开始看到技术之争……但有时候选择不同的技术是有好处的。
Peter Cooper:我来自一个很常使用内嵌代码的世界。这在 Perl 世界中比较常见,这是我在 Ruby 之前专注的语言。我当时非常投入 Perl 编程。而且很常见的做法是内嵌其他语言的代码,因为这在某些情况下很容易做到……更早之前,当我在 90 年代做 Pascal 开发时,我做了一些演示编程,那个领域很常见的做法是使用内嵌 x86 汇编来操作图形模式,优化性能。
所以也许这和老一代开发者的做法有关;我不知道这样说是否公平……但在我看来,看到新语言、在不同语言之间切换、并吸收它们的某些特性对我来说是非常自然的事情。
Jon Calhoun:你在不同语言之间切换,尤其是在做通讯时,我觉得挑选文章可能会是一个挑战。因为每种语言对于什么是正确的、什么是惯用的做法都有不同的看法。在 Rails 或 Ruby 中,很多魔法操作是可以接受的,但在 Go 中完全相反。如果你发布了一篇关于“看我做了多么神奇的事情”的文章,Go 社区的反应可能会有点不同。这是否让你在挑选文章时更加困难?
Peter Cooper:你这样解释后,我明白了……[笑声] 但是我觉得这其实是一个我经常遇到的问题。人们在会议上跟我说:“你是怎么做到的?我想象不出每周做一个通讯是什么样子,更别说 10 个或 11 个。”而我通常会说:“这很简单,这就是我做的事。”
我意识到这可能是我通过实践和坚持练出来的一种天赋,就像你看到那些很擅长玩魔方的人。他们可以看一眼魔方,然后手指快速转动,咔咔几下就把它解开了。而我看着魔方,连从哪里开始都不知道。
也许在做通讯的时候,我就像是在解魔方一样。我可以看很多东西,但能在脑海中保持这些不同的叙述线,然后快速地完成它。虽然我并不完美,但随着时间的推移,我在不断改进。我觉得这可能是一种天赋,虽然这种回答并不太有吸引力,但确实如此。
Johnny Boursiquot:如果我告诉你,作为一个有大量读者和订阅者的出版人,你实际上掌握着传播社区中思想的力量,你是否会意识到这一点?
Peter Cooper:我知道你的意思,但可能没有完全意识到。因为我和不同社区的互动通常是比较疏离的。我只参加少数的活动,因为我不太适应旅行……所以我很少与读者面对面接触。我甚至很少像这样进行电话会议,因为我觉得这对我来说是一件比较困难的事情……所以我是以一种很疏离的方式来运作的。
但我看到一些行业分析师做着类似的事情,这也是一个有趣的话题。如果你有时间,可以看看那些行业分析师的工作,比如 Gartner 这样的公司。他们会写整篇报告,分析公司如何使用 JavaScript 或者开发人员在现实世界中使用了哪些 Web 框架,然后他们以高昂的价格出售这些报告。
我之所以愿意做这些工作,是因为我自己还在写代码,还和客户合作,构建项目,发布软件。我觉得我有足够的实践经验,虽然我不再是一个日常的开发人员,但我仍然了解这些力量对新开发者的影响。
Mat Ryer:很有趣你提到你和社区有些疏离感,但从你的通讯来看,你并没有给人这种感觉。质量一直很高,虽然偶尔我的文章也会溜进去……[笑声] 但总体来说,你是如何保持这种质量的?
Peter Cooper:一部分原因是,如果质量下降,我通常会有人告诉我。我确实有几次出过错,但通常会有人提醒我,比如我曾经提前一周说 Go Modules 提案被接受了,实际上它还没有正式通过。有时我会链接到一些不太好的文章,但总有人会给我反馈,我会从中学习。
但我觉得保持质量可能和天赋有关。就像问一个足球运动员:“你是怎么进球的?” 他们很难解释清楚。我确实花时间思考过这些,但我意识到当我试图让其他人帮忙编辑时,很难把整个流程交给他们。这可能也是为什么我是少数几个每周都能持续做这些事情的人之一。
Mat Ryer:你几乎就像是一个高度优化的搜索引擎……[笑声]
Jon Calhoun: 当你在处理各种事务时---
你同时处理多个新闻通讯,也在探索不同的问题解决方案,正如你所说的,你会深入研究这些东西---
你有没有遇到过这样的情况,你在一种编程语言中看到问题时,想“这些人真是蠢……这些问题在其他语言中早就解决了,为什么他们不照着做,或者从其他语言中借鉴?”我能想象,当你研究不同语言时,看到某种语言在处理一个问题时挣扎,而其他两种语言已经解决这个问题,这会让人感到沮丧。
Peter Cooper: 其实,我在编程语言的社交方面更常看到这种情况。虽然在技术方面也有类似的情况,但正如我之前所说,我尊重不同语言有各自的特点、责任和与世界交互的方式,我对此完全没有意见。我并不期待一种过程式语言(procedural language)会引入大量的函数式特性(functional qualities),因为我很开心可以使用一种单独的语言---
比如 F#,我可以在其中编写代码,而不需要想着把 F# 的所有东西都移植到另一种语言中。
我知道 JavaScript 世界非常热衷于“把一切都吸收过来”,但我并不这样认为。至于社交方面,我确实看到很多相同的错误一遍又一遍地发生,尤其是在人与人之间的互动上。
如果你在 6-7 年前的 Ruby 社区,你会看到很多戏剧性场面。我甚至不打算复述那些事情,因为我都记不清了,但当时社区里有很多戏剧性事件,Ruby 获得了一个名声---
“在 Ruby 社区里总有戏剧发生”。总是有些事情会在会议上发生,或者某人在 GitHub 上吵架。JavaScript 开发者,或更准确地说,Node 开发者,当时在 Hacker News 上嘲笑说,“我们这边都是酷人,我们没有这些争吵。”我当时说,“你们也会有的,这迟早会发生。”
在所有的编程语言世界里,这种情况总是会发生。只要有了互联网交流,大家能快速发表意见,总是会有戏剧性的事情发生,总是会有问题。所以,当然,这种情况也来到了 Node 世界,甚至可能比 Ruby 世界还要爆炸性。现在我们甚至看到 Rust 的社区中也出现了类似的低级别戏剧性事件。Rust 社区的领导者在处理社会问题上非常有经验,所以这些问题被处理得比较好。但问题仍然存在。我今天还看到有人说他们打算离开文档编写的工作。这些事情就这么发生了。这是人性使然,我会在不同的社区之间看到类似的情况。
但是我认为,随着我们使用更多不同的编程语言,问题会有所改善。当我们在不同的开发者社区之间来回切换时,能带来一些积极的影响。比如,你在做 Go 开发,但也会写一些 C 或 Ruby 代码,因为你同时参与了这些不同的社区,你可以带来一些不同的价值观,并保持社区的发展。真正的目标是让新成员融入进来,并确保他们遵守社区规范。
我认为我们现在看到的很多代码行为准则,也是这种现象的延续。人们不得不开始认真思考这个问题,不能再是“老男孩俱乐部”那样的模式了。实际上,不同社区中最有价值的贡献往往来自多元化的人群。作为一个年长的人,我花了很长时间才意识到这种多元化的运作方式,但现在我真的很开心这种工作还在继续。
Mat Ryer: 听你这么说,Ruby 社区的戏剧性事件让我觉得我想在 Netflix 上看到这些。
Peter Cooper: [笑] 是啊。
Mat Ryer: 《Ruby 日记》。
Peter Cooper: 是啊,当时还没有 Netflix,但那会儿真该有。
Mat Ryer: 是啊,那听起来很棒。也许这种事情还会发生,咱们拭目以待吧……这真的很有趣。所以给人们的建议是走出去,加入其他社区,去和不同的人交流,因为你会接触到不同的想法,而这些都是好事。
Peter Cooper: 但要开心地接受自己是个新手。这是我的一个重要理念,我很开心自己常常是房间里最笨的人。即便我能很快上手某些东西,这可能是我的一个优点---
实际上这让我更开心,更有自信去做房间里最笨的人,因为我知道我可以向周围的聪明人学习。我可以从他们身上学到这个,学到那个。我认为每个人都能做到这一点,不管你是否是一个快速学习者。你只需要乐意走进那些空间,加入那些新的社区,乐意打开一本《如何学习 Rust》的书的第一页。
我不会把 Rust 当作全职开发工作来做,但我花时间学习它,并且很享受其中。它确实教会了我一些东西。所以,是的,多做这样的事情吧。
Mat Ryer: 是啊,我觉得这个建议很好。我也同意你关于享受作为新手的说法。这其中有一种怀旧感,不是吗?因为当我们第一次接触计算机时,那是很难的,我们不知道自己在干什么。所以当我遇到新的语言或不熟悉的新概念时,我会感到一种怀旧感。因为我又回到了那个无知的状态,必须去弄明白这些东西……而这个过程是非常有趣的。
Peter Cooper: 你只需要小心不要被压垮。这是如今最大的挑战。因为在 80 年代或 90 年代,如果我学一门新语言,我会有一本书,就只有一本书。我不会认识任何懂这门语言的人,书就是我的一切,我会把它当作圣经一样对待,我相信它说的每一句话。但现在不一样了。
如果你学习 JavaScript,会有人告诉你“哦,你应该用 Webpack”,然后另一个人会说“不,你应该用 Parcel 来打包代码”。再有一个人会说“不,你应该用 Snowpack,或者其他新出来的工具……”如果你无法应对这些,你就会有问题。我不知道该如何解决这个问题,因为我直到刚刚才开始思考这个问题。但当你进入新领域时,确实会感到一种信息过载。而我做新闻通讯的过程中,学会了如何穿透这些噪音。
如果有很多人说“你必须用某个工具”,或者“你必须在所有地方使用 goroutines”,我会透过这些噪音,看到“我知道历史上,大家在某个时间段建议的东西,五年后就不会再流行了。”所以也许我可以提前一步,不去跟随它。
Mat Ryer: [笑]
Peter Cooper: 我有些夸张,但我们确实看到了这种现象,比如关于 REST 的讨论。我记得大家都在讲“REST,REST,REST”,一切都要用 REST。而现在人们说 “GraphQL,不要用 REST,REST 糟透了。用 GraphQL 来做这个做那个。”十年后 GraphQL 也会变得不那么酷了。到那时可能会有其他东西,或许是 REST 2.0,或者 REST+,谁知道呢…… [笑]
我猜,随着年龄的增长,你会看到这些循环不断发生……或许随着年龄的增长,成为新手反而变得更容易。我不知道,只是随便说说。
Johnny Boursiquot: 有几点……内容的数量实在太多了。对我来说,新闻通讯的价值就在于它们为我提供了一个筛选器。与其每周关注 300 个内容,我可以等到新闻通讯出来,不管是你的,还是像《The Changelog》这样的内容,然后坐下来浏览一下这周发生了什么。然后我再进一步做个选择,看看哪些是我认为重要的,哪些是 Peter 或 Changelog 团队认为重要的,然后我再去深入研究。
内容太多了。并不是说所有东西的质量不好,而是作为一个人类,我的时间有限---
每天只有 24 小时,而且大部分时间已经被占用了……我只能消化这么多的信息。
所以,关于“你必须使用这个工具”或“如果你不使用这个工具,你就是错的”……对我来说,这些都是噪音。我觉得随着时间的推移---
可能这是那些做了很久的人才有的感受吧……随着时间的推移,我越来越希望减少要掌握的东西的数量---
不管是编程语言、技术,还是某种特定的做事方法。我越来越想缩小我的关注点……也许对某些人来说,这听起来像是职业自杀,但我只是想减少我需要关注的事物,因为外面的世界实在太多了……而我认为,新闻通讯在这方面起到了很大的作用。对我来说,这就是这些内容过滤器的价值。
Peter Cooper: 是的,我看待这些事情的一个方式是,我希望在我能接触到的所有事情上都达到80%的水平。我不需要成为最好的,但希望在所有事情上都能达到熟练的水平。我想理解大局,并能够把很多点连接起来……而我认为你和那些我认为是资深开发者或职业开发者的人,实际上希望在少数几件事情上达到95%甚至更高的水平,尤其是随着时间的推移。如果你进入了Postgres咨询领域,例如,你希望在Postgres的使用上达到前5%的水平。否则,谁会雇佣你作为一个专门针对Postgres的顾问呢?
我认为很多开发者会走上这条路,他们在少数几件事情上变得非常专业。这意味着,如果我们假设---
我现在在空中挥舞着我的手臂,向听播客的人描述这个场景……如果你假设我在所有事情上达到80%的水平,而其他开发者在他们擅长的事情上比我更好……
总体上,我的读者群体在所有事情上都比我更出色,因为在每一个领域中总有专家存在。但对于每个人来说……如果他们在某些特定领域里有这些高峰,那么在他们的专长之外,我的水平刚好足够让他们觉得“他对这些东西有足够的认识,我可以信任他所说的内容,然后在这些基础上进一步学习。我可以站在他的肩膀上,进一步了解其他领域。”
所以,在 Go 语言领域,你可能在某些事情上达到了95%或更高的水平。我不会在这些事情上成为专家,但我会对整个社区有足够的了解,所以我知道人们在不同领域使用哪些工具。我知道人们如何与 Kafka、Postgres 交互,或者与 MongoDB 交互的库是什么(虽然现在这个数量很少了)……我会对所有这些东西有一个大致的了解。所以当你阅读新闻通讯时,你可以说,“好吧,我在这个领域是专家,我可以跳过那些我不需要读的文章,但在其他领域我可以信任 Peter,他在这些事情上足够优秀……”
我认为这就是你们这些人和新闻通讯之间的关系。你们或许没有用语言表达出来,但这就是它的感觉。我不需要在所有事情上成为专家,我只需要在某些事情上比你们稍微强一点。
Mat Ryer: 这真的很有趣。我想知道你是否可以谈谈做这些事情的技术挑战。你是否自己构建了一些技术,或者使用了一些工具来实现这些东西……它在技术上是如何运作的?
Peter Cooper: 事情发展得很复杂,我想,作为一名开发者,这对我来说是一件好事---
我可以根据需要构建这些工具。我绝对是那种花两个小时写脚本来节省十分钟时间的开发者,因为我知道随着时间的推移,这样做是值得的。
如果你有一个需要重复做的任务,通常你会做至少一百次,所以构建工具是有意义的。因此,我为我们的赞助商预订系统构建了工具。我还构建了我们的计费系统,因为在我构建它的时候,市场上没有任何系统可以处理我们在英国作为企业需要处理的各种增值税(VAT)组合。现在这些系统已经存在了,我可以转而使用它们,但当时并没有。
我还构建了用于跟踪项目、管理不同网站、追踪 RSS 源的系统---
所有这些都是我为公司构建的小工具。实际上,现在我甚至不太使用其中很多工具了。预订和计费系统等工具主要由公司里负责这方面的员工使用。除此之外,我的编辑团队大量依赖我开发的一些发现工具,这些工具会抓取不同网站,查看不同项目等信息。
其中一个我最近构建的工具是使用 GitHub 的 GraphQL API 的... 大概是一个 50 行的 GraphQL 查询。我学了很多荒谬的东西才让它运行起来。但它的功能是根据我提供的搜索查询查找匹配的项目。我可以输入 "我想要所有与 Go 相关的项目" 或 "我想要所有与 MongoDB 相关的项目"。然后它会查找过去几天内有发布或打标签的项目,并提取有关星标数量、谁在关注它、它使用的语言或次要语言等信息,还会计算版本号等内容。
现在我可以在几秒钟内找到过去两周内 GitHub 上发布的所有最大的 Ruby 库。然后我需要花一些时间去筛选,比如“这只是一个无关紧要的小更新”或者“这是一个大事件”,但至少它给了我指引。因此,我有很多类似的工具。
另一个系统是发送电子邮件的系统,这也是一项重大工程。这个系统运行所有不同的网站,所有的新闻通讯实际上是一个应用。当你访问 GolangWeekly.com 或 JavaScriptWeekly.com 时,它实际上是访问同一个应用。因此,管理所有这些内容,以及所有的安全证书等等,又是一项工作。
我们用于编辑期刊的编辑器,现在公司里有三个人在使用它。它基本上是一个实时文本编辑器,如果我们愿意,我们可以同时一起工作。所以我们可以实时编辑一个期刊。我们使用一种有点奇怪的 XML 格式来对齐所有的新闻通讯,左边是内容,右边是实时预览,我们可以调整预览大小以查看其在移动设备上的显示效果... 但一切都是实时的。当我打字时,它会立即更新视觉效果。这也是为什么我们能在新闻通讯中做一些有趣的视觉调整,比如可以包含分割框等内容,而我看到很多其他人的新闻通讯每一周的格式都一模一样,但我们可以随时更改布局。虽然由于时间限制我们通常不会这样做,但这确实是可能的。
所以,是的,我基本上为这个系统构建了所有的工具,并维护它们。这就是我仍然有 50% 的时间在开发领域工作的原因---
就是在这些工具上摸索... 但确实有很多部分。
Johnny Boursiquot: 那么这些工具中有多少是用 Go 写的?
Peter Cooper: 很少。有一些爬虫任务是用 Go 写的,因为 Go 很适合这种任务,比如跟踪 RSS 源等。但主要还是用 Ruby 写的,因为正如我之前说的,我首先是一名 Ruby 开发者。当然,也有一些 JavaScript,但主要是 Ruby。Ruby 很适合这种系统,因为这些系统不是为数百人使用设计的,所以不需要扩展。因此,当你不需要扩展时,Ruby 是一个很棒的语言。它对开发者来说非常友好。所以,是的,现在我要开始宣传 Ruby 语言了... 回到 2004 年吧,它是一门很棒的语言。(笑声)
Mat Ryer: 说实话,确实如此。我一直觉得它很好。我其实也鼓励人们去学习其他语言。我在 Ruby 中最喜欢的一点是 method_missing
,它是一个捕获所有未找到方法的机制。如果你调用的某个方法不存在,method_missing
就会被调用,然后你可以解析方法名字符串并做一些有用的事情... 这与 Go 的思维方式完全不同,现在看起来有点疯狂,但其实非常棒。
Peter Cooper: 是的。我认为 Go 就像是 C 和 Python 的结合,拥有不错的并发处理。我脑海中的 Go 就是这样。如果我要写一个端口扫描器,或者大规模枚举子域名的工具,我会用 Go。它在这方面非常合适。但如果是构建我经常构建的那些不需要扩展的系统,比如简单地处理文本之类的任务,那么 Ruby 或者 Perl 这样更适合。
Mat Ryer: 那生成的内容是动态生成的吗?比如在网站上的新闻通讯... 还是它们是静态文件?
Peter Cooper: 如果你访问 GolangWeekly.com/issues/209 之类的页面,实际上是由一个 Sinatra 应用[13]动态生成的。Sinatra 是一个 Ruby 框架,激发了很多其他语言的框架,比如 Express.js。但我想实际的期刊内容是被缓存的。所以并不是说每个新闻通讯的项目都存储在一个数据库表里,每次都重新拉取。
当我们生成新闻通讯时,它会生成文本和 HTML 格式的文件,这些文件会永久保存下来... 然后存入网站中。
Mat Ryer: 我明白了。那么它生成的其实是静态文件,然后这些文件被分发出去,是吗?
Peter Cooper: 是的。这是我很早就做出的决定,因为我意识到按公式化方式生成内容会导致非常公式化的结果... 比如我就无法轻松地加入采访内容,或者随便插入一幅漫画。比如我们有一个新闻通讯叫 Front-end Focus[14],前几天突然插入了一幅漫画。按照公式化的方式生成是很难做到这种随机性的。
所以当时我更像是以出版商的思维在考虑问题,而不是开发者。我希望像在报纸上排版一样自由,可以随意放置内容。因此,我选择了这种方式。而我知道有一些人开发的新闻通讯工具是更结构化和自动化的,它们可以自动排版,但你无法随意插入不同类型的内容,或者使用多列布局。而我可以做到这一点... 所以我希望拥有这种自由。
Mat Ryer: 你有这种即时反馈系统,可以实时看到预览,这就是关键,对吧?
Peter Cooper: 是的。
Mat Ryer: 我也遇到过这种情况,我认为这是每个人都应该学习的一个重要经验。当你为用户提供即时反馈时,他们就可以更自由地发挥创造力,因为他们可以随意尝试并立即看到结果。如果你必须提交更改并等待它渲染出来,你可能不会做太多尝试... 所以紧密的反馈循环非常重要。我认为这是每个人在家里或工作中进行开发时都应该学习的一课。
Peter Cooper: 是的,我认为这实际上可能是 Go 语言的一个小缺点---
回到 Go 话题上来说---
它是一种难以快速获得反馈的语言。虽然你可能会不同意,因为它的编译和运行速度非常快... 与 C 或 C++ 相比,确实非常快。但它不像 JavaScript 沙盒那样,你可以直接修改一个数字并立即看到不同的结果。它确实有一个额外的步骤。当然,它是一种系统编程语言,不是为了 REPL 这种用法设计的。我知道有一些 REPL 的尝试,但它并不适合这种用法。
Johnny Boursiquot: 很简单---
不要犯错就好了。(笑声)
Peter Cooper: 没错。
Jon Calhoun: 这当然是一种选择... 但我确实认为 Go Playground 是一个不错的工具,它显示出 Go 设计者们确实考虑到了反馈循环。如果你必须先安装 Go,才能看到第一个程序中的错误,反馈循环会非常慢。但如果你可以直接访问一个网站,输入代码并运行,这确实增加了很多价值。虽然它不如 REPL[15] 那么灵活,也不像一个 Rails 应用或 JavaScript 那样可以实时看到变化,但相比许多其他编译型语言,它在这方面做得已经很好。
(译者注: REPL即 Read–eval–print loop)
Peter Cooper: 是的。对于一门系统编程语言来说,它已经做得很出色了。
Mat Ryer: 是的。我通常会用单元测试来获得反馈。对于 TDD 适合的场景,比如我要写一个小的包来解析字符串,知道输入和预期的输出,那么我可以很容易地用 TDD 来完成。这就是我的反馈循环。当你这样做时,反馈速度确实很快。
但对于视觉方面的东西---
我们不怎么处理视觉内容... 但我看到一些人在做图形开发,他们确实需要那种反馈循环。我们注意到对他们来说这种即时反馈非常重要,因为在那个领域,它确实有意义。
Peter Cooper: 是的。
Mat Ryer: 所以这是一个有趣的观察。
Jon Calhoun: 我认为这也是为什么像 PHP 这样的语言能够吸引到很多新开发者的原因。对于初学者来说,使用 TDD 来获得即时反馈确实要求很高,但 PHP 让你可以直接进入服务器,实时编辑文件,并在网站上看到结果。
Johnny Boursiquot: 哦,天哪...
Jon Calhoun: 这当然不适合生产环境---
我说“也许”... 其实绝对不适合。(笑声)
Mat Ryer: 你在犹豫...
Jon Calhoun: 但对于学习来说,这是一个很棒的方式,可以让你快速进入并立即看到反馈... 我认为这就是为什么某些语言对初学者如此有吸引力的原因。JavaScript 也有这种魅力,你可以打开任何网站的控制台并开始修改内容;这非常吸引人。我认为有时候你会发现 Go 可能不像 JavaScript 或其他一些语言那样吸引新程序员。
Peter Cooper: 是的。我认为修改现有代码其实是一种非常被低估的学习方式。我自己学习得很快的方法之一是找到一个运行良好的程序。当我试图学习现代 C 时---
正如我之前提到的,我在 90 年代编写了很多 C 代码,但之后很长一段时间没有碰它... 然后当我重新接触时,我发现我能理解发生了什么,但人们现在的代码结构已经发生了变化。
我查看了 Redis 这样的代码库,它是一个数据结构的数据库,写得非常优雅。我可以进去并弄清楚如何添加一个命令。我甚至还做了一个 YouTube 视频,展示了如何添加命令以及整个过程。这种修改已经运行良好的程序的方式对我来说是非常有帮助的。
这是一种通过例子学习的方法,而不是从头开始编写代码,比如 #include stdio.h printf("blablabla")
这种方式,因为有时候你可能缺乏想象力,无法想到“我可以用打印输出构建什么?” 我想要的是一个已经运行良好的程序,然后通过修改它来学习。
Jon Calhoun: Peter,你刚才提到使用一本书作为学习语言的“圣经”让我想起了我的学习经历。我记得当时我总是会想“我真的理解了吗?”那本书中的工作程序是唯一可以参考的资源。所以很多时候我会尝试修改一些内容。如果我想要实现某个功能,是否修改这一行是正确的?通过这种方式验证我的理解。对很多人来说,这就是他们的学习方式。你先编写代码,然后阅读并尝试理解它的意思,但为了验证你是否理解,你需要修改一些内容,看看它是否真的按你的预期运行。
Peter Cooper: 完全同意。我见过一些人以这种方式教学。书籍不太常用这种方式,因为书本中无法放入大段程序并说“拿去玩吧”。这种学习方式更适合现代网络环境,下载一个 GitHub 项目,然后开始学习。
我记得 Zed Shaw[16] 也做过类似的事情... 他在 Python 和 Ruby 领域很有名,著有《Learn Python the Hard Way》(中文译作 “笨办法”学Python[17])和《Learn Ruby the Hard Way》。他非常推崇通过例子学习。他会说,“先把这些代码敲进去。你不需要完全理解它们的意思,但通过动手操作,你会逐渐理解它们的含义... 因为就是这样学习的。这和学习外语一样,人们不会逐字逐句地教你每个词的意思,而是通过句子来学习,然后你会推导出它们的含义。” 我认为这是一种非常好的学习方式。
Mat Ryer: 是的,而且大多数人加入团队时就是这么做的,对吧?
Peter Cooper: 没错。
Mat Ryer: 他们完全从零开始,这确实有意义。我以前从《Amiga Format》杂志上抄代码,制作一些小游戏之类的东西... 然后我们改了那个代码,比如我们曾经制作过一个台球游戏,我们把撞球台的边线改了,把袋口弄得特别大,这样游戏就变得很简单了… 能够进入代码并弄清楚这些袋口是如何在这个奇怪的数组中定义的,正是在那个时候,我爱上了编程... 我意识到我们可以创造东西,使用这些看似奇怪的“魔法咒语”让事情发生。
Peter Cooper: 是的。看别人做事实际上是一种很好的学习方式... 我猜这基本上就是我的工作。我几乎花全部时间在观察别人做了什么、发布了什么,然后将这些转化为我个人的经验和智慧,希望这些能为我选择放进新闻通讯的内容带来启发。
Mat Ryer: 是的,这很棒。现在你们的新闻通讯大概有多少订阅者?
Peter Cooper: 我们现在总共有大约48万订阅者。
Mat Ryer: 哇。
Peter Cooper: 当然,其中有些人订阅了多个期刊... 比如,有很多 JavaScript 开发者同时订阅了前端新闻通讯和 Node.js 新闻通讯。我并没有追踪独立订阅者的数量,因为这对我来说不重要。我更倾向于从出版商的角度来看待问题;你知道,“10个人买了这本杂志,10个人买了那本杂志。” 我不在乎他们是不是同一个人,我卖出了20本杂志。这是我的看法。
Mat Ryer: 但如果是一个人买了所有10本杂志呢?你会想知道的吧?
Peter Cooper: 嗯,我不知道... 我可能会觉得没什么问题。(笑声)这是我作为出版商的思维。关键是卖出杂志。所以我不确切知道,但我知道比如 Go 的订阅者有29,000。我们实际上曾经短暂地超过30,000,但最近我们在清理那些长时间没有互动的用户,所以又回到了29,000。
Mat Ryer: 好吧,这也不赖啊。我还以为你是发了什么让人不喜欢的内容,人们因此取消订阅了呢。(笑声)
Peter Cooper: 其实,这确实是需要注意的---
如果有人将来做新闻通讯,千万不要去关注取消订阅的人数,除非你一夜之间损失了一半的订阅者。我发现这实际上是新手容易感到沮丧的原因之一。他们会说:“哦,我刚发了新闻通讯,结果10个人取消订阅了。” 但我会说:“你有10,000个订阅者啊。” 这只是个统计学上的异常。
Johnny Boursiquot: 视角问题...
Peter Cooper: 没错,不用担心这些。
Mat Ryer: 可能是同一个人取消了10次订阅呢。
Peter Cooper: 没错,正是如此。
Jon Calhoun: 你也得从个人的角度来看待问题。你可能对某个新闻通讯感兴趣,但几周后,或者一年后,你可能会发现“我的工作角色变了”或者“我不再做这些事情了”,这并不是因为你不喜欢这个新闻通讯,而是它在当前对你来说不再合适。
就像你说的,人们会因为这些事情感到烦恼,但实际上,取消订阅是人们在告诉你:“你现在没有为我提供价值,这没关系。” 这意味着你不应该浪费资源去给他们发送邮件,浪费你和他们的时间。所以这比你手动去清理那些几个月没有互动的人要好得多。这需要更多的精力,而取消订阅是他们自己帮你做的,告诉你他们不再感兴趣了。
Peter Cooper: 是的。有时候并不只是因为他们不感兴趣;也许他们只是单纯不喜欢你呈现内容的方式。他们不喜欢你的新闻通讯的排版,或者他们对你个人有不好的感觉,觉得“哦,我不喜欢这个人,我要取消订阅。” 但你得接受这一点。如果你发了一些推文,提到政治,有人取消关注并说“你应该只发开发相关的推文”,其实这并没有错,但他们离开也没有错,而你觉得“我不在乎”也没有错。
我觉得我们应该更宽容一些,理解我们无法让所有人满意。这对我们来说绝对是事实。我在笔记里记下的一个点就是:你永远无法完全覆盖一个受众。我永远也无法触达100%的 Go 开发者,这是不可能的。
我遇到过一些人---
比如在 JavaScript 世界,我们有17万订阅者,但我在会议上遇到一些人,他们会说:“我从没听过 JavaScript Weekly。” 我不会觉得“这有点奇怪... 现在肯定所有人都知道我们了吧”,因为有数百万的 JavaScript 开发者。不同的开发者活跃在各自的圈子里。JavaScript 开发者之间甚至都不知道彼此的存在,更不用说了解社区中的所有资源了。
所以,肯定有一些 Go 开发者从未听说过这个播客,这从未出现在他们的视线中... 我有时会想,我们是否真的需要改进这一点?扩大影响力当然是好的,但这是否值得担心?我不认为是这样。
因此,我也认为拥有多种相同类型的资源是可以的。你们有 Go Time,但当然---
我不会点名,但还有其他 Go 播客;不要去听那些播客了,大家...(笑声)
Johnny Boursiquot: 没错,没错。
Peter Cooper: 对,完全正确。其实有很多 Go 播客---
我说“很多”... 其实也只有几个。但有些听其他播客的听众可能从未听说过 Go Time,而一些 Go Time 的听众也可能从未听说过其他播客... 人们以不同的方式与不同的事物产生共鸣,这没问题。所以如果有人来做另一个 Go 新闻通讯,或者类似的东西,我完全不介意,因为我知道他们会有自己的受众。他们的存在不会影响我在做的事情。
唯一的问题是,有些人还没有意识到这一点,他们可能会觉得“哦,他已经有3万订阅者了,我做这个还有什么意义呢...” 以及“他做得很差劲”之类的。我曾经在 Reddit 上遇到过一个人,他也做 Go 的新闻通讯,他有点对我发起攻击,说“别订阅他的,订阅我的,我的更好。” 我当时心想:“你没必要这样。每个人都有自己的空间。”
如果你的朋友说“我要写一本关于政治丑闻的小说”,你不会说:“哦,我有个朋友也在写一本关于同样主题的小说,你一定要去联系他。”
Johnny Boursiquot: “别写了!”
Peter Cooper: 对。“一起写同一本小说吧。你们不能竞争。” 事实并不是这样。所以我想说的是,如果有人想做和我类似的事情,尽管去做... 只要你不使用我的名字,或者完全复制我做的每一件事,那就没问题。受众足够多,值得去做。
Mat Ryer: 嗯。
Johnny Boursiquot: 你现在有非英语的新闻通讯吗?或者你有计划做这样的事情吗?
Peter Cooper: 没有。我连英语都够呛,更别提其他语言了。我必须承认,我只能说一种语言。我只懂一点点法语,这就是我所有的语言能力了。我知道在中国有一个庞大的 Go 社区。我经常会接触到他们的一些输出内容,比如他们有 GitHub 仓库,里面列出了他们在社区里找到的各种链接... 当然,我一个字也看不懂,但我知道他们有自己的发展。
我们也有过一些人来找我们,说“我很想把你的新闻通讯翻译成某种语言”,但这些年来这样的请求也就只有几次... 所以如果有人来找我说“我们想复制你的内容并翻译成俄语...”,这可能是个不错的例子,因为那是一个与我们的文化有些不同的文化,他们可能不会大规模阅读我的新闻通讯。因为他们有自己的字母表,自己的文化等等。如果有人来找我说这个,我可能会说“行啊,去做吧。” 因为这不会对我造成任何影响,而且还会帮助社区,这也是这件事的一部分。虽然这是我的生意,但同时,如果我只是想赚钱,有很多事情我可以去做,但我没有做,因为那不对... 所以我非常热衷于帮助社区。
所以如果有人在听,并且你在一个不同的国家---
我不会说澳大利亚或者类似的地方,因为澳洲、美国、英国、爱尔兰的人都会订阅英文版... 但如果你在一个不同的文化圈,比如波兰、沙特阿拉伯... 或者其他我不知道的 Go 很流行的地方,比如中国... 是的,联系我吧,因为我对你们做这些事情会很感兴趣。
Mat Ryer: 很棒。首先,我不确定我们是否已经感谢过你和你的团队为新闻通讯付出的努力... 它确实是一个对大家都有价值的资源。我想我可以代表所有人说这一点。
你提到无法让所有人都满意,这也正好引出了我们新的固定环节,“不受欢迎的观点”。
音乐插曲: [56:55] 到 [57:12]
Mat Ryer: 那么,Peter,也许你可以先来,分享一个不受欢迎的观点。
Peter Cooper: 嗯,我在 Hacker News 上花了很多时间---
这可能已经是个不受欢迎的观点了...(笑声)我在 Hacker News 和 Twitter 上花了很多时间,每当谈到广告问题时,人们就会彻底失控。他们会说:“哦,我讨厌被追踪!我从来没有点击过横幅广告,我一生中从未点击过广告。在电视上看到广告时,我会闭上眼睛。”(笑声)
我认为这是一个在极客圈子里不受欢迎的观点,但其实并没有那么有争议,因为这是世界的运作方式,那就是,广告通常(或可以)是一种正面的力量。我知道这是一个稍微有点争议的观点,考虑到很多公司和媒体都滥用了广告... 但我认为如果你是一个有道德的人,并且以道德的方式处理广告,那么广告实际上比大多数替代方案更好。
举个简单的例子,有人曾经对我说:“你必须在新闻通讯中插入赞助商,这真的很糟糕。你应该让我们每月付费,这样做才更光荣。你因为有广告而是个坏人。” 但我做了研究,查阅了案例研究,也看了其他行业的做法,最好的结论是---
我也看了其他开发者新闻通讯的做法---
也许我可以转换3%、4%,最多5%的订阅者,让他们每月给我支付少量费用。
这确实会给我带来不错的收入,因为3%-5%的订阅者基数已经很大了。但问题是,我的新闻通讯只会触及现在5%的人群... 我不认为这对世界或社区有足够好的影响。相比之下,现在所有人都能免费获得我的内容---
当然,这意味着会有一些赞助商广告,但这些广告都明确标注,不会做任何苛刻的追踪或第三方操作之类的恶心事。我们也不会把订阅者名单卖给广告商。因此,我认为如果你能以道德的方式做广告,它比收费的方式更好。
Mat Ryer: 这很有趣。我也想到赞助模式,比如在会议上非常常见。人们购买门票,但如果没有赞助,票价会高得多。所以你说得很对,我觉得如果你问人们,他们通常会说“我讨厌广告”或者...
Jon Calhoun: 这确实是个棘手的问题,因为一般来说,人们希望事情像广告让它们变得那么免费,但他们又不想要广告。这就像,你不能既想拥有蛋糕,又想吃掉它。你得做出选择。我理解有些情况下公司过于激进,他们追踪你的行为,做你不希望他们做的事情,这确实令人困扰... 但也有些情况,正如你提到的,会议因为有赞助而变得便宜,新闻通讯可以免费提供... 这个播客之所以能存在,也是因为我们有广告商。否则,很多事情将很难做成。我们不会有专人来编辑节目,做各种事情。
所以我能想象,如果我们不得不向每个人收费,这个播客将会变得非常不同,并且你能触及的人群也会大大减少。你将无法帮助那些来自艰难背景、或工作收入不高的人... 我认为能够触及这些人群是值得的。在很多情况下。但我也同意你,Peter,你必须以道德的方式处理广告。你不能只是“让我追踪所有东西,随心所欲,滥用我的读者/听众”,无论他们是谁。
Mat Ryer: 你不会支持向孩子推销香烟吧?(笑声)
Peter Cooper: 是的,我是说---
其实我们确实遇到过一些有趣的事情。我能想到的唯一一个比较奇怪的经历是一家公司---
我不会说出他们的名字,因为他们的名字有点敏感……但他们基本上是一家提供在线性服务的公司,他们在我们这里发布了一个招聘广告。当时我有点犹豫:“嗯……我不会把他们的服务链接到我们的平台,因为这不合适。但既然他们在招聘一个 JavaScript 开发者,那我们就刊登吧。” 他们的措辞非常委婉……但 JavaScript 社区中有一个人彻底抓狂了,因为他说:“哦,这是在鼓励……”---
其实这是关于一个特定的癖好,简单说一下背景。他觉得:“这个癖好是绝对错误的,即使是在双方同意的情况下,这也不好。你不应该为他们刊登广告。”
Mat Ryer: 而且你应该在你的编程语言中使用强类型,类似的事情。
Peter Cooper: 正是如此。
Johnny Boursiquot: 这是“非数字”(NaN)癖好,对吧?我听说过这个。[笑声]
Peter Cooper: 所以我们现在尽量避开这类事情。我们已经学到了一些教训。即使我个人同意这些广告的内容,从外界看来可能会有些奇怪……但的确,有很多道德问题需要我们去解决。我们做的其中一件事是---
是的,我们显然遵守所有的法律,尤其是 GDPR(通用数据保护条例)出台后,尤其是在欧盟这边……哦,不好意思,我说“在欧盟这边”,但我已经不在欧盟了;我总是忘记这点…… [笑声] 请别让我开始讲这个话题。
Johnny Boursiquot: …太早了吧。[笑声]
Mat Ryer: 你可以通过街上的尖叫声感受到这一点。[笑声]
Peter Cooper: 是的。所以我们遵守这类法律……
Johnny Boursiquot: 原来是这个原因…… [笑声]
Jon Calhoun: 所以你是想告诉我,英国只是因为不想遵守 GDPR,所以决定“你知道吗?我们还是走吧。”
Mat Ryer: 是的,我们要净化一切。
Peter Cooper: 其实 GDPR 仍然是法律,但……我们遵守所有这类东西。不过我一直非常关注的一件事是,确保我们的价格不会让初创公司和小型赞助商望而却步……这对我来说非常重要。我们有一些独立的小公司,尤其是在 JavaScript 社区,他们依靠我们的受众发展起来,逐渐被大家熟知,之后不断成长,并一直成为我们的客户……
Frontend Masters 就是一个很好的例子。他们是一家提供视频教程的培训网站……还有一款叫 Wallaby.js[18] 的 JavaScript 工具,它是一个实时编码调试工具---
他们的经历也差不多。在早期我们曾有 IBM 来找我们---
他们的营销代理联系了我们,说:“我们想购买你们所有新闻通讯的广告位,但我们每个月必须至少花费 10 万美元。我们不能花更少的钱,因为那样对我们来说不值得。” 我回头看看自己所有的广告位,总价值只是其中的一小部分。我想,即使我把所有广告位的价格都翻倍,告诉他们“好吧,一个月要花 10 万美元”,我真的想让 IBM Cloud 成为我所有广告的唯一赞助商吗?对我来说,这是一个道德决定。我得考虑:“我可以通过卖广告位赚很多钱,收入可能翻倍,但让一个公司占据所有的广告位,谁会在乎 IBM Cloud 呢?” IBM Cloud 是个不错的服务,但你不会想每周都看到它。它只是众多服务中的一个,人们有很多服务可以选择。而这正是我希望新闻通讯所呈现的样子。
所以当赞助商进来时,我希望人们能看到这些赞助商并想:“实际上,我对这个挺感兴趣,想了解一下。” 因为每周都是不同的东西,我们尽量不让同一个赞助商连续出现……而且这些广告与我相关,它们教给我一些东西,或者它们是一个我可能需要的服务,比如一家托管公司---
也许我需要一个新的托管服务商,我会去看看。我希望这些赞助商是这样的。我希望他们是独立开发者,希望他们是初创公司,这是我做的一个道德决定。
除了所有的追踪技术之外,赞助商本身也必须是好的。我知道 Changelog 也有类似的做法---
你们有像 Linode[19] 这样的赞助商;他们是值得推荐的好公司,而且与我们的日常工作相关。他们并不是那种只有当你有百万美元预算时才会推荐的企业级服务。
Jon Calhoun: 当你说你尽量让小型企业,像独立开发者或初创公司也能负担得起时,你还需要做什么吗?假设你有一个 20 万人的邮件列表,你可能会为一个招聘广告设定一个固定的价格。你需要做一些特别的事情来让这些广告更易于负担吗?还是说某些类型的广告位已经足够了?
Peter Cooper: 我们还没真正走到那一步。JavaScript Weekly 是我们最大的出版物,有 17 万订阅者,所以它的价格确实有一定的溢价……但其实---
这与我之前提到的定价策略有关---
如果你把我们的小型出版物按比例放大到 JavaScript Weekly 的规模,按比例收取的费用将远高于我们现在的收费。所以我们对 JavaScript Weekly 的收费是偏低的,而我不想说我们对其他的收费偏高,但确实对较小的出版物收费更合理。
比如,我们有一个数据库相关的出版物,只有 1.5 万订阅者,但因为数据库领域资金充足,而且赞助商相对较少,因此竞争更激烈,所以我们可以收取更高的费用……而 JavaScript Weekly 的竞争相对较少。
Jon Calhoun: 我在想的一件事是,你有一个额外的好处,就是你可以为每个人单独发送邮件,并且你可以控制每个人收到的内容……而对于播客来说,广告是事先插入的,然后放到分发渠道上,你不能为每个人动态插入广告。我不是说追踪,我的意思是---
假设你有 17.5 万订阅者,你想卖广告给其中 2.5 万人,你可以把这个广告与其他五个广告商的广告一起打包出售……这有意义吗?
Peter Cooper: 我们有技术能力做到这一点。只有在某个特定情况下,一位赞助商提到过这个需求,他们说:“我们是一家以色列公司。我们只想把这个职位广告推荐给以色列人。” 但当我们查看数据时发现,我们的受众中只有 1% 是来自以色列的,可能还不到。于是我们想:“即使我收双倍的价格,我真的想为这 2% 的广告费付出所有努力,而不让它出现在主要广告位上吗?” 这似乎毫无意义。所以我们还没有达到那个规模。
Jon Calhoun: 对于这么少的受众,你几乎不得不按照正常价格收费,然后可能给他们打个五折,因为涉及的工作量和管理成本。我在想,保持广告价格可负担,让初创公司和独立开发者也能参与进来,探索这些打包销售的选项是一个独特的方式。
Peter Cooper: 是的,我们还没做到那一步。我是说,我们有技术能力做到这一点,但还没到那个阶段。如果我们有上百万订阅者,那显然我们会更迫切地去做……但那时人们可能会开始要求定向投放广告;他们会说“我们想触达某些公司。” 现在你很容易就能把电子邮件地址转换成名字、职位等信息。
比如有像 Clearbit[20] 这样的公司---
你把邮箱地址给他们,他们就能提供相关数据……我们之前也做过类似的尝试。这是在 GDPR 之前。我们曾经用这些数据来审计我们的订阅者是谁---
他们来自哪些国家,他们在哪些公司工作,等等……但后来我们放弃了这些数据,因为这不符合我对数据未来发展的道德看法。知道我们有很多微软的员工订阅我们的内容当然很好,但其实从邮箱地址我们就能看出来,我不需要做这些复杂的事情。
所以,是的,理论上可以这样分类筛选,但出于需求和道德原因,我们并没有这样做。我也不想对不同的订阅者群体展示不同的广告……因为我觉得这有点像杂志,比如《Vogue》杂志---
你翻开杂志会看到 PRADA 的大幅广告……这也是体验的一部分。他们想要在那里展示自己。所以,当你打开一份 Go 的新闻通讯,看到某个公司是主要赞助商时,我希望这本身就成为一个话题。我并不自大到认为人们会在 Twitter 上讨论“哦,你看到这周 Go 的热赞助商了吗?太棒了”,但确实有一种叙事,你可以与赞助商沟通:“看,你就是这周的赞助商。” 这对他们来说也是值得的。
Mat Ryer: 这真的很有趣,这是我从未真正考虑过的事情。Peter,我们可以聊一整晚,但遗憾的是今天的时间到了。非常感谢我们的特别嘉宾 Peter Cooper。如果你想订阅 Go Weekly 新闻通讯,可以访问 golangweekly.com。在那里你可以注册。我们下次再见。
休息时间: [01:10:30.13]
Jon Calhoun: 我感觉自己像是个技术支持人员,问:“你尝试过重启调制解调器吗?” [笑声] 然后对方说:“不,电话线被树砸断了,问题不在这儿。”
Peter Cooper: 当涉及到视频会议时,人人都是技术支持。
Mat Ryer: 是的。
Johnny Boursiquot: 和家人也是。
Peter Cooper: [笑声]
Mat Ryer: 还有其他人的淋浴系统…… [笑]
Peter Cooper: 哦,确实如此。
Mat Ryer: 我总是觉得那些淋浴系统特别复杂。
Jon Calhoun: 每年圣诞节我都会对我妹夫感到生气,因为他回家时,总是带给他妈妈一些新科技产品,然后他自己回加州了。
Johnny Boursiquot: [笑] 留下你收拾烂摊子。
Jon Calhoun: 他会把东西设置好,差不多能用,然后她就打电话给我:“我该怎么用这个?” 我会说:“我没有那个东西,我完全不知道该怎么办。” [笑声]
Mat Ryer: “我该从哪儿给我的 Switch 买游戏?”
Johnny Boursiquot: [笑声]
Stop the presses: https://changelog.com/gotime/119
[2]Johnny: https://github.com/jboursiquot
[3]Jon: https://github.com/joncalhoun
[4]Mat: https://github.com/matryer
[5]Peter Cooper: https://github.com/peterc
[6]Cooper Press: https://cooperpress.com/
[7]Go Weekly 通讯: https://golangweekly.com/
[8]Matthew Cottingham: https://www.crunchbase.com/person/matthew-cottingham
[9]Slashdot: https://slashdot.org/
[10]Mark Bates: https://github.com/markbates
[11]Buffalo 项目: https://github.com/gobuffalo/buffalo
[12]David Heinemeier Hansson: https://dhh.dk/
[13]Sinatra 应用: https://github.com/sinatra/sinatra
[14]Front-end Focus: https://frontendfoc.us/
[15]REPL: https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop
[16]Zed Shaw: https://github.com/zedshaw
[17]“笨办法”学Python: https://book.douban.com/subject/26264642/
[18]Wallaby.js: https://wallabyjs.com/
[19]Linode: https://www.linode.com/
[20]Clearbit: https://clearbit.com/