编程部落(2017)

2020-12-29 03:18:52

有一句老话说计算机科学是谎言,因为它与计算机无关,也不是科学。 好笑的笑话。 每个人都笑了,然后有人说"是的,但这有点像是关于计算机的,不是吗?"。 脚笨拙地洗牌。 有人清了清嗓子,在不知不觉中您正在谈论类别理论,并在研究单词算法的历史。 我想我同意,并且期待听到Joe对此的看法#deconstructconf pic.twitter.com/j7H2QWG0Tr —安迪·林德曼(@alindeman)2017年4月21日 我会很乐意放弃"程序员" 赞成"应用数学家" 或其他避免C的方法https://t.co/DsIEo5x4uI -克里斯·马丁·🐘🎺🍍(@chris__martin)2017年4月21日 发言者指出,我们计算机(内核,操作系统,浏览器,VM)中的整个现代堆栈都是用C + ASM编写的。 因此,您应该了解C和ASM。

那真的很重要吗?严重的问题,程序是最重要的指令列表还是逻辑思想的表达?

也许两者都不是,程序只是我们为其他人制作的东西。如果没有听众阅读,一条消息从根本上是毫无意义的。如果不参考程序所交互的外部世界,程序是否毫无意义?

一位朋友向我吹嘘说,他如何证明使用Ada可以正确执行大多数程序,并且完全没有错误。我问他是否可以证明此功能正确:

他说"当然,那很容易。因此,我问他的证明者将如何发现该函数的名称错误,他感到非常高兴。

程序显然拥有所有这些属性。但是我认为,从根本上说,有3个程序员原型,除以我们最崇高的理想:

我们根据这些理想自我选择进入我们的同行社区。我们使用编码语言向同行表达这些理想。

我认为每个小组都有自己的会议和自己的小组讨论。它自己的编程语言,英雄和自己的恶棍。

最初的营地观点编程从根本上是思想的表达-一种我们可以赋予生命的数学诗歌。我们在von Neumann机器上执行它们的事实是一个实现细节。

源代码:源代码应该像诗歌一样阅读-密集,只需很少的代码行即可表达一个想法。一旦理解,简洁的程序就好像是您的程序的美丽而明显的描述。源代码简单而不是执行简单或快速更为重要。高级语言优于低级语言,因为它们使您可以更清楚地表达自己的意图。

执行:计算机如何执行程序是编译器的实现细节。与执行速度相比,代码简单更重要。

正确性:如果程序严格执行规范,则它是正确的。最好的程序使用Ada之类的工具来正式证明其正确性。

UI:代码与人的交互方式与实现是一个单独的考虑因素。漂亮的代码比漂亮的UI更重要。

这些程序员可能是最不常见的,尽管那可能是因为很难像这样工作。在堆栈溢出方面,Haskell在所有语言中的周末使用率最高。

编程语言中的大多数(可以说全部)现代进步都来自这个阵营中的人们。如果您已经使用React制作了一个网站,那么您应该知道不变性模型和将您的观点表达为从数据到DOM的纯函数是来自函数编程。实际上,大多数现代语言功能都是由将编程视为思想的人发明的。数年(或数十年)后,这些功能被复制到更流行的语言中,并被视为新想法。

我有一个朋友,他花了几个月的时间热爱J。他最终用J编写了一个小游戏。他将自己的代码描述为这种完美,美丽的水晶。后来他想让它成为多人游戏-但是要做到这一点,他就不得不处理滞后问题。这将需要撕碎一些漂亮的内部流程。他忍不住了,所以他完全放弃了这个项目。

这个故事很有趣,但是我有点嫉妒我的朋友。我敢打赌,他学到了很多东西,玩得很开心。这样的经验使我们成为更好的程序员。

去年下半年,我参加了Haskell短期课程,并挑战了主要讲师。我告诉他"一切都很好,但是我敢打赌,我仍然可以使用实用语言来制作有用的软件,而且速度比您要快。他说没有办法-使用Haskell,他坚信他可以用更少的代码更快,更好,更好地实现我可以实现的任何功能。我们没有测试该要求-但我仍然想知道-他是对的吗?

第二阵营认为编程从根本上与计算机的机器联系在一起。没有计算机就不会运行任何程序,因此要有效地进行编程,我们必须时刻牢记计算机-硬件和软件。

优雅和美丽不仅来自简单的代码库,而且源于该代码库以优雅高效的方式使用硬件。

源代码:代码应该是干净的,但是干净的代码没有干净的执行重要。低级语言通常比高级语言更好,因为您可以更清楚地了解计算机在执行代码时将执行的操作。 (因此,您有更多的优化空间)。

执行:计算机如何执行代码至关重要。不考虑执行而进行编程只是乞求性能降低。

正确性:在给定正常参数的情况下,如果程序按照您期望的方式运行,则它是正确的。执行的优雅比正确更重要。而且如果由于机器的工作原理在理论上无法发生问题,那不是真正的错误。一个程序必须足够快才能被认为是正确的。

UI:代码与人的交互方式与实现是一个单独的考虑因素。让硬件的约束引导用户体验是可以的。

这里的关键是一起考虑整个计算机和您正在运行的程序。根据这个社区的观点,编写好的软件的最好的(唯一的?)方法是从整体上考虑它的运行方式以及我们的程序如何与其余的硬件和软件交互。做到这一点可以达到机械上的同情,并且一切都像上了油的时钟一样运转。这种乐趣就像您可以听到和理解的驾驶手动车一样。

混淆计算机如何执行程序的任何事情对实施者都是危险的-因为它增加了要考虑的变量。因此,这个阵营的人们经常嘲笑垃圾收集器,或者JS性能基准测试结果的混乱改变了我们编写代码的方式。 C编译器中未定义的行为是一个持续的争论点。

在现代应用程序开发中,我们的计算机速度足够快,以至于这种思维不再非常重要。几十年前,您需要深入了解计算机如何编写软件。但是现在基本上您使用的任何语言都足够快,那么为什么还要学习C?我认识的大多数Web开发人员都不了解C,并且对学习指针或手动内存管理没有兴趣。

但是,这种工作在许多领域仍然具有巨大的价值。游戏开发社区仍然使用C ++编写大多数代码(尽管统一正在逐步改变这种情况)。安全工程师需要系统地了解漏洞。嵌入式系统工程师负担不起浪费周期和RAM,一旦后端系统变得足够大,性能就会再次变得重要。

即使它不切实际,但被迫考虑机器也会很有趣!例如,PICO-8施加了任意的' hardware'限制,迫使您在设计游戏时变得机灵。

对于这个社区,我们几乎可以超越客户的要求而提高计算机的性能。没有人比一整天都在考虑硬件的人更在乎性能。但是,如果您考虑将计算机视为一台机器,那么比无意义的工作还要造成更大的丑陋呢?

我真的很好奇Rust是否会在这个社区中脱颖而出。对于本质上关心运行时效率的人来说,Rust本质上是由以上第一阵营的语言书呆子设计的一种语言。他们会接受吗?未来的游戏引擎会被移植到锈蚀中吗?

最后一组将编程视为达到美好目的的一种手段,而不是通过其构造而变得美好的东西。这个阵营中的人们描述自己的方式从根本上讲是务实的。他们写软件是因为软件对其他人有用。

源代码:该代码应该是干净的,但这仅仅是因为更干净的代码更易于迭代。代码清洁度不如大多数其他考虑因素重要。

执行:该程序仅对用户而言足够快。如果您使它变得更快,那么您就在浪费时间来增加人们更在意的功能。

正确性:错误的危害仅与影响的程度成正比。该程序应按照用户期望的方式运行。

UI:UI比其他任何东西都重要。程序的所有其他部分仅存在于用户界面的服务中。

我认为大多数专业软件工程师都在这个部落中-这很有意义,因为这是最容易赚钱写软件的地方。

以我的经验,这个营地的人在社区生活方面更好。他们似乎对新成员更加积极和鼓舞,并愿意提供帮助。我猜是因为您可以简单地看一下自己就知道自己是否在其他两个营地中做得很好。如果您为其他人开发软件,那么满足感就来自于使周围的人快乐。

我忍不住觉得这个地方简直是死气沉沉。极端地说,这种世界观并不重视工程本身的美丽。尽管您可能会对其他群体提出相反的批评-他们不重视他们的软件如何影响世界。

我已经谈论过的这个阵营与其他两个阵营之间存在很大的紧张关系。它可能会有点卑鄙。我认识许多产品人员,他们对缺乏对传统数据结构和算法的了解感到自觉。他们觉得自己是“真实”的判断者程序员,因为他们无法实现晦涩的算法和二进制框架协议。无论如何,其他人已经实现了这个部落中人们的看法。那么谁在乎呢?

没错,但是很多问题都是由前端工程师缺乏技术技能引起的。这主要是自我校正-如果您的程序速度太慢,您会知道并可以修复它。但是安全工程是一个真正的危险。如果您不知道如何保护针对黑客编写的软件,那么它可能是不安全的。即使您被黑客入侵,也可能不知道这是一个问题。

@jdan好吧,那您不是一个很好的程序员。抱歉,就是这样。

— Jonathan Blow(@Jonathan_Blow)2015年6月12日

就上下文而言,著名的独立游戏开发人员乔纳森·布洛(Jonathan Blow)表示,即使您每天都编写有用的软件,如果您无法反转二叉树,您也不是一个好的开发人员。

是吗好吧,这取决于什么是“好的开发者”。手段,这取决于您关心的部落。我认为Blow在2号营地,因此您会根据自己的了解程度来判断。 @jdan在3号营地里,所以他是根据自己的所作所为来判断的。乔纳森·布洛(Jonathan Blow)当然写了有用的软件,但是他上一部游戏(《见证人》(The Witness))花了这么长时间写的原因之一是,他写了自己的引擎,而不是使用现成的东西。当被问到(强调我的):

我对Unity不太了解。但是,很明显,如果不重写很多Unity(或添加很多不存在的东西并拒绝使用Unity提供的大部分功能),就无法在Unity中构建“见证”。而且我们已经有了一个简单的图形引擎。因此,在构建自己的系统时,我们可以确保它们确实是游戏最好的东西。

我怀疑他在第一部分上错了。但是我本人主要在2号营地,所以我明白无论如何要编写自己的引擎。我可能会做同样的事情。

我认为我们社区中的许多冲突和分歧可以用这些术语来表达。以及程序员之间的许多误解。

例如,当整数溢出时,您的编程语言应该怎么做?如果您认为编程就像数学诗歌一样,那么最重要的是它应该给您数学上正确的结果。

而且,如果您只想运送产品,则无需在意。在javascript(第三阵营)中,根本没有整数类型。 JS只是将浮点数用于所有内容。如果它们溢出,那么运气就不好了。

Rust试图在前两个阵营中各占一席之地-这是一种由编程语言书呆子开发的语言,但是可以编译为高效的代码。毫不奇怪,这个问题在锈菌界引起了长期争论。最终的解决方案是这样,默认情况下,溢出会在调试模式下引发紧急情况,而在生产模式下则默默工作。

Rob Pike(Go的作者)对他的语言试图吸引哪个部落感到困惑。他在Go发布后的几年里写了这封信:

几周前有人问我,"推出Go时遇到的最大惊喜是什么?我立即知道了答案:尽管我们期望C ++程序员将Go视为替代方案,但大多数Go程序员都来自Python和Ruby之类的语言。很少来自C ++。

为什么?不错的C ++程序员主要在以上的第二营中。他们想知道他们的代码将如何运行。但是Go有一个垃圾收集器和一个快速的编译器。确实,Go会在意自己的出路,这样您就可以制作东西。它是最后一个想要创建产品的人们的语言。目前,关心该语言的人使用什么语言? Python,Ruby和Javascript。因此,他们当然是Go正在转换的人。

下次当您看到关于Javascript是癌症还是对我们行业的福音时,或者您看到像我这样的人对现代应用程序的废话感到愤怒时,请问问自己是哪个阵营。他们拥护美丽的代码吗?性能和深刻理解?还是他们只是想完成工作并运送产品?

最终,代码就是代码。即使我们有不同的编写软件的理由,但我们编写的内容(通常)是兼容的。即使它不是(看着您,Haskell),也总是有很多想法可供我们学习和借鉴。

毕竟,我们都欠彼此很多。没有语言习惯,我们仍然会编写汇编。没有系统程序员,我们就不会拥有操作系统,而haskell和javascript会变得非常缓慢。没有产品工程师,其他所有人将不得不编写CSS。相信我,没人愿意。

后海军上将格蕾丝·霍珀(Grace Hopper)设法将机器的理解与产品思想联系起来,并由此发明了一种与机器无关的计算机语言。 无法同时考虑计算机的功能和我们希望计算机的功能,这是不可能的。 但是我个人认为我们应该立志像艾伦·凯一样做到这三个方面。 他和他的团队经常跨越多个部落线。 例如,他通过观察儿童学习Squeak和Logo发明了面向对象的程序设计。 他认为我们还有办法吃蛋糕和吃蛋糕-使用现代技术设计出更简单,更快捷,更优雅,对人类更有用的系统。 如果您还没有做到这一点,则应该观看他所进行的每一次演讲。 慢慢做。 那当然就是我的目标。 希望我仍然能打动70岁以上的人们。