Rust 近乎宗教般信仰的案例

Rust 近乎宗教般信仰的案例 亚历山大·西多罗夫

众所周知,Rust 社区对 Rust 非常热情,有些人甚至责怪我们偶尔表现得像一个邪教。

恐怕我不会打消这个印象。因为在这篇文章将证明 Rust 使您成为一个更好的工程师、更好的管理者和更好的人。

作者背景

我的背景是十多年的 C# 开发。从表面上看,在 Rust 之前,我有一个远大的职业生涯:

我一直在领导团队完成成功的项目,并在 .NET 的最前沿构建软件。

但在内心深处,我从未满足于我一直在做的事情。我一直认为这是冒名顶替者综合症,但不知何故,这种感觉在我切换到 Rust 后消失了。

感觉像魔术一样,对编码冷淡的状态消失了,我重新发现了我对软件开发的热爱。

经过长时间的自我反省,我发现了情绪变化背后的三个关键原因。

Rust之美

关于 Rust 与其他语言相比的技术方面的文章已经绰绰有余了,我不想重复相同的论点。

但是,所有这些绝妙的想法巧妙地组合在一起,恰到好处地让我再次对软件开发感到兴奋。

考虑到 Rust 从工程师那里得到的爱,我绝对不是唯一一个。

开源社区

与其他不太集中的生态系统相比,.NET 中的开源社区一直感觉非常不活跃。

公平地说,自从Microsoft开始在.NET Core上工作并变得更加开源友好以来,在过去的5 +年中有很多改进,但是浪费了很多时间。

相比之下,Rust 中的开源社区是如此健康和充满活力,你自然希望成为其中的一员。

我们正在开发开源交易基础设施,并计划尽可能多地开源我们的工作。

项目类型

随着 Rust 越来越主流,这个论点可能会被淡化,但现在 Rust 中的项目质量非常出色:许多雄心勃勃的想法正在专门在 Rust 中实现。

迁移

我当时经营着一家金融科技公司。事情进展顺利,但我们正在寻找进一步发展的方法。

考虑到我们正在开发高负载、延迟敏感的软件,在 Rust 中做一些严肃的事情的想法有明显的长期好处。

此外,这会让开发人员感到高兴,因为我们有越来越多的对 Rust 充满好奇的工程师。

大约两年前,一旦async/await 支持稳定下来,我们就开始构建第一个 Rust 团队。

最初我们没有计划将其作为从 C# 到 Rust 的完整迁移,但是,一旦我们开始朝着这个方向前进,就没有办法阻止它。

越来越多的开发人员开始要求加入 Rust 团队。告诉他们“不”,从而使他们失去动力绝对不是最好的选择。因此,我们承诺逐步将绝大多数软件迁移到 Rust。

现在可能很难意识到这一点,因为 Rust 似乎越来越主流,但两年前,从经营公司的角度来看,这是一个非常可怕的决定。

从一个你一直在工作的成熟生态系统的舒适区,转移到一个你经验很少的年轻生态系统,是很艰难的。

但悲惨的失败不是一种选择,所以我们继续前进。在最初的几个月里,我们看到了各种区块的惊人快速改进:我们对 Rust 的理解一天比一天好,Rust 生态系统正在迅速成熟。

我们迁移到 Rust 的激进程度肯定有赌博的成分。但是,幸运的是,大约半年后,就在我们开始适应新的生态系统时,Rust 起飞了。

从那时起,我们遇到的唯一问题是人才奇缺!

但即使是这个问题最终对我们来说也是一件好事。当我们用主流语言招聘时,我们一直希望得到一位经验丰富的工程师,他此时此地都非常适合。

回想起来,我们的招聘过程自私和近乎傲慢。由于我们刚开始的时候基本上没有经验丰富的 Rust 开发人员,这促使我们更加开放,投资于人,

提供机会并自己培养人才

不仅能改善我们的团队文化,使我们的团队更加平衡。即使现在不再严重缺乏 Rust 开发人员,我们也遵循这种方法。

当我与其他公司的同事讨论我们内部的 Rust 革命时,我最常被问到的问题是 Rust 团队是否比 C# 团队慢。

这是一个非常普遍和合理的问题。因为 Rust 是一种较低级别的语言,您必须手动执行 C# 等高级语言自动为您执行的操作。

但是我们没有遇到开发人员性能的任何显着下降。考虑到现代 C# 是一种非常好的语言,这更令人惊讶。

虽然我确实对C#有疑问,但现在 C# 可以说是复杂后端软件的最佳编程语言之一:

它相当快,跨平台,并且具有清晰的语法和现代功能。

我没有看到太多的竞争:

使用 Python 在生产中会很慢并且由于类型系统不佳而难以维护;

C/C++ 会降低开发速度并经常出现内存泄漏,即使是我们中最好的人也容易出现!

Go 在其舒适区之外往往是一个糟糕的选择(微服务等)

我唯一可以证明比较更好的语言是 Kotlin,但前提是你真的喜欢 Java 生态系统。

C#肯定做对了很多事情。它提出了一个问题,为什么在转向较低级别的语言后,开发过程没有减慢。

这是需要篇幅更长才能详细解释的文章,解释了为什么会这样。补充一点,当你在开发真正复杂的软件时,工程师很容易需要长达一年的时间才能熟悉代码库。

因此,重要的是人才保留,这主要基于工程师的满意度,这是 Rust 闪耀的另一个领域。

结论

与其深入技术细节,更适合从工程师和整个公司的角度分享一些较少有争论的、不太明显的转向 Rust 的话题。

总的来说,迁移到 Rust 是一次非常积极的体验:

一切都以绝对完美的方式结合在一起。

虽然 Rust 显然不是所有这些进步背后的唯一原因,但它绝对是其中的关键因素。

希望这篇文章的内容没有冒犯任何喜欢其他语言的人。虽然我们找到了对我们有用的方法,但没有一种永远通用且正确的方法来编写软件:

魔鬼在细节中,并且有各种语言的位置。

补充:

Async-Await 范式是编程发展中向前迈出的一大步。它不仅使您的异步代码“看起来”同步,增强了可读性,而且还提高了应用程序的响应能力和性能,特别是对于 IO 绑定用例。

但是,考虑到它在不同语言和框架中的处理方式,一开始可能有点令人生畏!

在我进一步讨论之前,我假设我们对 Rust 中的 Async-Await 有基本的了解,并且对 tokio、executors、futures 和任务等运行时有所了解。

什么是async/await 异步/等待? async/await 是 Rust 编程语言中一个强大的功能,它使开发人员能够编写高效并发运行的异步代码。

它是一种允许函数以非阻塞方式执行的技术,释放执行的主线程以在等待异步函数完成时执行其他任务。

这样,程序可以在等待异步函数的结果的同时继续执行其他操作。在 Rust 中,异步函数可以与 await 关键字结合使用,以在特定点暂停和恢复函数的执行。

此功能在处理 I/O 绑定或 CPU 密集型任务时特别有用,因为它允许程序在等待异步功能完成时执行其他任务。

为什么将Tokio与Async/Await一起使用?

虽然 Rust 的特性提供了一种编写异步代码的方法,但它不提供运行这些函数的执行器。这就是Tokio的用武之地。

Tokio 是 Rust 的一个流行的异步运行时,它提供了一个执行器和其他工具来帮助编写异步代码。

Tokio 的执行器提供了一种在不阻塞主线程的情况下有效地同时运行多个任务的方法。

它使用一种称为“反应器模式”的技术来管理 I/O 事件和计划任务。这使Tokio 能够以较低的开销有效地管理数千个任务。

信息论入门非常有帮助的书籍推荐如下:

  1. 《信息论、推理与学习算法》 - David J. C. MacKay 权威的信息论教材,内容全面,数学严谨,非常适合作为信息论的入门学习书籍。

  2. 《信息论基础》 - Thomas M. Cover 和 Joy A. Thomas 信息论的典范教材,内容从基础到进阶全面介绍信息论,理论推导严谨。

  3. 《信息论与可靠通信》 - Robert G. Gallager 更侧重于通信领域信息论内容,书写简洁明了,示例丰富形象生动。

  4. 《信息论与网络编码》 - Raymond W. Yeung 对各种网络编码做了详细阐述,内容新颖,对网络信息论感兴趣的人很适合。

  5. 《深入理解信息论》 - 张贤达 国人编著的信息论书籍,理论推导严谨,内容通俗易懂,对信息论入门很有帮助。

以上都是信息论领域非常经典和优质的著作,对理解和学习信息论理论非常有帮助。可以根据个人喜好和学习阶段选择合适的书籍进行学习。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java导出pdf(纯代码实现)

java导出pdf 在项目开发中,产品的需求越来越奇葩啦,开始文件下载都是下载为excel的,做着做着需求竟然变了,要求能导出pdf。导出pdf倒也不是特别大的问题关键就是麻烦。 导出pdf我知道的一共有3中方法: 方法一&#xff…

STM32定时器中断的使用示例

STM32定时器中断的使用示例 前言硬件和软件cubemx使能定时器中断中断服务函数案例输出结果 前言 上一篇博客实现了定时器输出pwm,这篇接着上次的工程,在上次的工程上做简单的配置即可 硬件和软件 硬件使用的是stm32h750vbt6;软件用到了stm…

全连接神经网络:分类与回归示例

分类 创建测试数据 import random import torch import torch.utils.datadef get_rectangle():"""随机得到矩形的宽和高,值域0-1之间的小数,判断这是否是一个"胖"的矩形:return:"""width random.random()height random.random()fa…

修改接口参数名和在Swagger中的展示名

背景 我们有一个接口要支持后端排序,所以需要在请求对象里面增加两个参数:排序字段名、排序方式(asc、desc)。 正好基础jar包中有一个类可以直接拿来用。 Data public class OrderByItem {private String column;private Strin…

创建型设计模式-1.单例设计模式

创建型设计模式-1.单例设计模式 创建型设计模式:核心目的就是给我们提供了一系列全新的创建对象的方式方法 一、简介 1.简述 单例设计模式(Singleton Design Pattern),一个类只允许创建一个对象(或实例&#xff09…

nginx+lua+redis环境搭建(文末赋上脚本)

目录 需求背景 环境搭建后nginx和redis版本 系统环境 搭建步骤 配置服务器DNS 安装ntpdate同步一下系统时间 安装网络工具、编译工具及依赖库 创建软件包下载目录、nginx和redis安装目录 下载配置安装lua解释器LuaJIT 下载nginx NDK(ngx_devel_kit&#xff09…

ceph安装部署

Ceph 简介 存储基础 单机存储设备 单机存储的问题 分布式存储的类型 分布式存储(软件定义的存储 SDS) Ceph 架构 Ceph 核心组件 ​编辑 Pool中数据保存方式支持两种类型 OSD 存储后端 Ceph 数据的存储过程 Ceph 集群部署 基于 ceph-deploy …

网络运维能转型到系统运维吗?

很多网工处于刚起步的初级阶段,各大公司有此专职,但重视或重要程度不高,可替代性强;小公司更多是由其它岗位来兼顾做这一块工作,没有专职,也不可能做得深入。 现在开始学习入门会有一些困难,不…

Hyperledger Fabric测试网络运行官方Java链码[简约版]

文章目录 启动测试网络使用peer CLI测试链码调用链码 启动测试网络 cd fabric-samples/test-networknetwork.sh的脚本语法是&#xff1a;network.sh <mode> [flag] ./network.sh up./network.sh createChannel在java源码路径下 chmod 744 gradlew vim gradlew :set ffu…

[SSM]GoF之工厂模式

目录 六、GoF之工厂模式 6.1工厂模式的三种形态 6.2简单工厂模式 6.3工厂方法模式 6.4抽象工厂模式&#xff08;了解&#xff09; 六、GoF之工厂模式 设计模式&#xff1a;一种可以被重复利用的解决方案 GoF&#xff08;Gang of Four)&#xff0c;中文名——四人组。 该书…

阿里云服务器 用docker部署mysql

阿里云服务器上使用Docker部署MySQL 当您在阿里云服务器上使用Docker部署MySQL时&#xff0c;步骤如下&#xff1a; 登录到阿里云服务器&#xff1a;使用SSH工具登录到您的阿里云服务器。您可以使用命令行工具&#xff08;如OpenSSH&#xff09;或可视化工具&#xff08;如PuT…

银河麒麟高级服务器操作系统V10安装mysql数据库

一、安装前 1.检查是否已经安装mysql rpm -qa | grep mysql2.将查询出的包卸载掉 rpm -e --nodeps 文件名3.将/usr/lib64/libLLVM-7.so删除 rm -rf /usr/lib64/libLLVM-7.so4.检查删除结果 rpm -qa | grep mysql5.搜索残余文件 whereis mysql6.删除残余文件 rm -rf /usr/b…

利用JavaScript判断页面宽度的响应式布局方法

首先前端中&#xff0c;样式尺寸单位全部用rem&#xff0c;比如&#xff1a; .content{ width: 8rem; border-radius: 0.15rem; font-size: 0.95rem; letter-spacing: 0.15rem; &#xff5d; 接着页面中的html给个默认的font-size样式&#xff0c;比如&#xff1a; <html …

MYSQL表操作(DML,DDL)

建表并插入数据&#xff1a; mysql> create table worker(-> dept_id int(11) not null,-> emp_id int (11) not null,-> work_time date not null,-> salary float(8,2) not null,-> poli_face varchar(10) not null default 群众,-> name varchar(20) …

一种对不同类型齐格勒-尼科尔斯 P-I-D 控制器调谐算法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MySQL数据库 【增删改查】

目录 一、新增 指定列插入 一次插入多个数据 二、查询 1、全列查询 2、指定列查询 3、查询字段为表达式 4、查询的时候给列名/表达式 指定别名 5、查询时去重 6、排序查询 7、条件查询 8、模糊查询 9、空值查询 10、分页查询 三、修改 四、删除 SQL 最核心…

11、JSON.parse 数据不完整

一、问题描述 使用 JSON.parse 反序列化&#xff0c;出现数据丢失现象。 字符串json数据&#xff1a; {"varImageList": [{"variationValue": "Black ","imageList": [{"variationValue": "Black ","imag…

JS-26 认识防抖和节流函数;自定义防抖、节流函数;自定义深拷贝、事件总线函数

目录 1_防抖和节流1.1_认识防抖和节流函数1.2_认识防抖debounce函数1.3_防抖函数的案例1.4_认识节流throttle函数 2_Underscore实现防抖和节流2.1_Underscore实现防抖和节流2.2_自定义防抖函数2.3_自定义节流函数 3_自定义深拷贝函数4_自定义事件总线 1_防抖和节流 1.1_认识防…

你是不是一个好的测试工程师?

如何评价一个程序员是否优秀一直是一个很有争议的话题。 先说一个真实事件&#xff0c;国际化项目&#xff0c;最开始都是由产品经理在excel中管理翻译&#xff0c;迭代过程中如有增删改&#xff0c;就把增删改的部分标记出来&#xff0c;提供给开发&#xff0c;开发再对应更新…

关于gateway中lb失效

在通过gateway将请求发送到对应的服务模块时&#xff0c;出现了503的报错&#xff0c;也就是gateway时可以正常启动&#xff0c;但是页面上在发送请求获取数据的时候&#xff0c;却不是相应的请求地址。 解决方法&#xff1a; 1.首先你得保证前端项目里面访问网关地址都是正确…