nettman 发表于 2023-4-19 03:47:42

Go 如何修复编程中的所有错误



你为什么写软件?我编写软件来构建解决现实世界问题的计算机程序。解决非常具体的问题的软件,例如寻找假期、寻找我想吃的东西、写工作申请、巧妙地投资、支付商品、测量我在家里的能源消耗或只是用音乐来娱乐我。是的,我也编写软件来简单地学习和提高我的技能,但除了我之外,其他任何人都不会使用它。


Go 是傻瓜的完美语言吗?
当我想编写软件时,我会决定什么最适合我的目标。我决定我是要成为 Web 服务器、在盒子上运行的守护程序、在云中运行的 API 或无服务器功能,还是嵌入在芯片 (SoC) 上的软件。我在确定要使用的语言和工具链之前定义输出。当我定义了输出后,我创建了一个组件、工具和语言的候选列表,我可以用它来实现这个结果。

如果我的结果应该是单芯片上的嵌入式应用程序,那么我对工具链和语言的选择就非常有限。如果我的结果应该是一个 Restful API,那么我的选择几乎是无穷无尽的。这意味着我需要能够使用各种组件、工具链和语言编写优秀的软件,以便能够获得最佳结果来解决我的现实世界问题。

我的个人喜好无关紧要
我个人偏爱 C 语言,因为我可以用它编写的程序范围很广,而且我更喜欢编译的机器代码而不是解释器或 VM。使用 C,我可以编写从嵌入式设备到桌面应用程序、Web 应用程序和 GPU 加速 CUDA 应用程序的应用程序。然而,在几乎所有情况下,用 C 语言编写 Web 应用程序都是最不经济的方法。与使用 JavaScript 或 TypeScript 等语言相比,即使是经验丰富的软件工程师,用 C 编写 Web 应用程序所花费的时间也要长得多。

我需要一直做出妥协:为了获得预期的结果、工具链和编程语言。我总是用性能换取上市时间,反之亦然。软件工程是成本、时间和性能之间的永久折衷。

Go 是完美的折衷方案
就上市时间而言,使用 JavaScript 编写 Web 应用程序或无服务器应用程序确实非常快。我可以在几分钟内用 JavaScript 编写一个简单的应用程序,并立即将其无服务器部署到 AWS 上。然而,快速上市是以解释语言需要携带其运行时(节点)为代价的,因此与 C 中的实现相比,导致更高的运营成本和更低的性能。C 中的实现需要更长的时间和需要更彻底的测试。此外,它还需要进行一些调整才能在盒子或无服务器环境中安全地运行它。

Java 和 C# 提供了比 JavaScript 稍好的性能,同时还提供了非常好的开发人员人体工程学。然而,这两种语言仍然需要带来它们的,有时是重量级的运行时环境。

有一个德语术语表示完美的妥协:“ Goldene Mitte ”。它翻译成“黄金中心”,指的是“正中靶心”。我个人认为,在当下,围棋绝对是那个“金中心”,“靶心”。Go 带来了编译语言的优势以及 JavaScript 或 Python 等简单语言的人体工程学。然而,这些优点的结果是 Go 经常被批评的缺点。

垃圾收集,但编译!
当进行性能基准测试时,Go 应用程序通常落后于 C,因为垃圾收集过程正在侵蚀运行时性能。尽管如此,Go在与开发人员的人体工程学相提并论的同时,在上市时间方面仍然远远超过任何解释型(JS、Python)或中间语言(MSIL 中的 C#,字节码中的 Java) 。它几乎完美地达到了 C#、Java、JavaScript、Python 和 C 或 Rust 之间的性能中心。请记住,C 中的内存管理和调试是一项挑战,它占用了用 C 编写应用程序所需的大部分时间。

什么是对象?结构错误。
Go 缺少几乎所有其他语言都有的东西:面向对象和继承。C#、Java、JavaScript、TypeScript 和 Python 都有。有些做得很好(C#、Java),有些做得很笨拙(JavaScript)。然而,缺少的面向对象从未阻止任何人使用 C 语言来支持像 C++ 这样的语言(有时被认为是一种怪物)。面向对象是一个很棒的概念,但通常可能不是编写软件的最经济的方法。
/* 这是目前为止,真的 */
type Location struct {
Latitude      float64`json:"latitude"`
Longitude   float64`json:"longitude"`
Name          string   `json:"name"`
}

将 OOP 剥离到最基本的必需品:一个结构或带有允许您使用组合而不是继承的函数的接口。因此,它通过设计强制简化。C 语言和 Java 或 C# 之间的完美折衷。

类型安全比类型抱歉更好
Go 并不总是与开发人员的人体工程学有关。静态类型提高了性能、可读性和可维护性。然而,它需要更多的工作,因此可能会降低开发人员的人体工程学。它可以防止你变得“类型抱歉”:后悔没有在你的代码中使用静态类型。发明 TypeScript 以及开发人员从 JavaScript 转向 TypeScript 是有原因的。围棋的发明者似乎预见到了这些事件。Go 妥协开发人员的人体工程学以获得更好的可维护性,并防止您成为“ type-sorry ”,这是另一个聪明的妥协。

例外,你说?错误不是零!
Go 的口头禅是“你不能只是在这里呕吐”和“解决你的问题”是闻所未闻的。然而,后者或多或少是严格的,因为您可以忽略错误返回值。

/* Go-style #1: 处理,但本质上忽略 */
doc, err := xmlquery.Parse(strings.NewReader(xmlString))
if err != nil {
fmt.Println( "那不是很好的 XML: " , err)
}

/* Go-style #2: 烧掉整个地方 */
doc, err := xmlquery.Parse(strings.NewReader(xmlString))
if err != nil {
panic ( "Just explode" )
}

/ * Go 风格 #3:错误?一直想知道 _ 是什么 */
doc, _ := xmlquery.Parse(strings.NewReader(xmlString))


异常处理和在调用堆栈中抛出异常(“抛出”)本身就值得一本书。这是一件复杂的事情,实际上经常会导致应用程序到处乱扔。不是一个非常愉快的经历。Go 会强制您处理错误并在需要时将它们传递给调用堆栈。它再次在开发人员工效学(“随地吐痰”)和可维护性之间做出妥协——诚然,这是一种笨拙但可爱的方式。

什么软件不能用 Go 写?
这取决于 Go 编译器,您可以将代码编译成什么。越来越多的目标平台得到支持或正在开发中(尤其是嵌入式平台)。目前有很多你不会用 Go 编写的东西:移动应用程序(React Native 目前几乎是 TypeScript 的领域),嵌入式软件或 GPU 加速应用程序(C 仍然是两者的王者)。除此之外,一切皆有可能。特别是对于服务器软件,Go 是目前完美的折衷方案。在这种情况下,您真的总是需要 Go 没有的所有功能吗?

Go 的发明者多次公开承认:他们为年轻的工程师设计语言,主要是那些刚加入谷歌的人。他们想阻止他们一遍又一遍地犯同样的错误,同时仍然保持生产力。他们基本上是为傻瓜建造的。

我喜欢当假人!
“ For Dummies ”系列丛书是著名的教育书籍合集,旨在提供有关各种主题的介绍性或基本信息。“傻瓜书”这个名字并没有侮辱人的意思,而是一种轻松幽默的说法,即这些书是为那些对这个主题不熟悉并且可能没有任何先验知识或经验的人而写的。 . 该系列的目标是通过将复杂的主题分解为更简单、更易于理解的概念,使更广泛的受众更容易理解它们。虽然单独使用“ dummy ”一词可能是一种侮辱,但在该丛书的上下文中,它并没有贬义或冒犯的意思。

对我来说,Go 感觉就像是一种编程语言,其设计与一本“傻瓜书”一模一样。它对你如何做事有很大的限制,同时仍然让你自己决定你想用它做什么。与书本一样,您可以从 Go 中得到的结果是惊人的。“ For Dummies ”书籍非常受欢迎。它的出版商威利是一家非常有名的出版商。这些书远非仅供娱乐之用,还提供了极其宝贵的教育价值。他们以非常优化的方式为您提供所需的东西,为此他们做出了妥协。近乎完美的妥协。Go 作为一种编程语言也是如此。

去固定编程很好
我在 25 多年前,即 90 年代后期开始编程和构建软件。在我的旅程中,我构建了大量的网络应用程序、服务器软件、桌面应用程序、机器人中的嵌入式应用程序、支付处理应用程序、视频流应用程序以及大量其他我有时引以为豪有时却不引以为豪的东西。

在过去的 25 年里,我看到过性能糟糕的代码给运行它的人造成了闻所未闻的经济损失。我还看到过如此美妙的代码,以至于没有人知道如何维护它,也没有人想接触它。我见过代码到处抛出异常,代码根本不处理错误,只要有可能就会导致段错误。我见过损坏硬件的代码,会引起火灾并吓坏任何试图触摸它的人。

代码用于在一段时间内解决问题,直到问题发生变化并且有人(通常是其他人)需要调整代码。代码是由许多人在很长一段时间内编写和更新的,有时是 COBOL 的长期。Go 并没有提高编写计算机代码的科学,它没有像我们过去所理解的那样提供计算机科学的重大进步。Go 所做的是在最美丽的解释中成为一种虚拟语言,从而解决与编写软件相关的社会和人类问题。

Go 解决了过去 20 多年出现的计算机编程中的实际问题。它首先解决的不是由技术引起的问题,而是由人类及其社会行为引起的问题。它通过说:“嘿傻瓜,这已经很接近了,好吗?”来阻止你和我想得太多和做得太过分。

尝试更像 Go。
Go,作为一种语言,是对它所做和提供的一切的妥协。但是,这也是你我之间的妥协。在喜欢将算法优化到纯粹完美的人、从不处理异常的人、根本不关心格式的人、喜欢探索最笨拙的语言特性并将它们投入生产的人之间,擅长算法但无法管理网络连接的人和只想解决问题的人。

在哲学层面上,我可以争辩说 Go 不仅仅是一种编程语言,而且 Go 更多是关于我们如何编写代码,尤其是我们如何一起编写代码。几乎就像围棋的发明者找到了当今计算机软件中万恶之源并加以修复。

我个人要感谢 Ken Thompson、Robert Griesemer、Rob Pike 和所有其他参与 Go 的人,感谢他们为程序员取得的惊人成就。


每天进步一点点
https://www.aboutyun.com/template/zhanzhuai_jianshu/zhanzhuaicn_img/weixin.png




页: [1]
查看完整版本: Go 如何修复编程中的所有错误