讲动人的故事,写懂人的代码
- 故事梗概:
- 在她所维护的老旧Java系统即将被淘汰的危机边缘,这位在编程中总想快速完事的女程序员,希望能转岗到公司内部使用Rust语言的新项目组,因此开始自学Rust;
- 然而,在掌握了Rust编程知识之后,为了通过Rust项目组的技术面试,使得转岗成功而不至被裁员,她必须领会编程如何"快速"才能有真正的意义。
女程序员赵可菲加班到深夜,正在修复老旧Java系统的nul pointer exception缺陷。
等到家后,老公、保姆和不满一岁的宝贝儿子都已经睡了。
她只能轻轻亲了下宝宝肉嘟嘟的小脸蛋儿。
赵可菲在父母的严格教育下成长,因此总是缺乏自信。
她从小就被父母催促着抓紧时间做作业,理由是“后面还有很多事情要做”。
所以,作为程序员,她养成了迅速完成任务的习惯,无论是在编写代码还是在生活和娱乐中。
她现在在公司负责一个有十多年历史的老旧Java系统。这个系统即将被淘汰,代码质量也很差。
每次上线都会出现很多bug,她不得不加班修复。
她的唯一愿望就是尽快解决这些问题,好回家陪伴她的宝宝。
有一次,赵可菲修的bug没过测试,测试人员就让她再修一下。
赵可菲看了半天,发现自己漏掉了一个异常的处理。
她说:“这个很快就能搞定。”
测试人员就问她:“赵可菲,你每次都能修得都挺快,但怎样才能一次就修好,别老返工呢?”
赵可菲轻描淡写地回答说:“那样就慢了。后面还有好多事等着我呢。”
赵可菲维护的那个Java老旧系统快要淘汰了。
她的老板给她扔了个三个月的内部转岗的“救生圈”,说是如果转不出去,那就只能被裁了。
赵可菲陷入了焦虑和不安。
她喜欢当前的公司文化和同事,希望能留下来继续做程序员。
但她的Java编程技能已经陈旧,内部转岗程序员不再占优势。
她得知公司可能会用Rust重写很多系统。另外,公司也提供Rust培训。
然而,她听说这门近两年大火的编程语言,入门难度有点大。
她已经离30岁没差几年了,对自己能否再学习新的编程语言有点疑虑。
她对未来感到迷茫,不知道下一步该如何选择。
赵可菲听到了一个小道消息,她之前维护的那个Java老旧系统,可能会考虑用rust重写。
既然公司正在给大家上Rust培训,她想了想,编程其实还挺好玩的,于是就毫不犹豫地报名参加了培训。
在公司内部的Rust培训课上,赵可菲碰到了讲师贾克强。他是来自高性能网络服务项目组的Rust程序员。
她还碰到了她在课堂上结对编程的搭档席双嘉。他是一位C 程序员。
她还用上了AI编程助手艾极思(AiGeeCee)。这是公司最近在内部部署的大模型。程序员在编程时,可以与艾极思聊天,获得帮助。
赵可菲和席双嘉两个在学Rust的过程中,有啥不懂的就找贾克强帮忙解答,还会经常向艾极思提问。
贾克强和艾极思都是随叫随到,无微不至的帮助他们。
1.1 学习Rust的方法
贾克强提了个建议,对于那些在课堂上一起编程的伙伴们,回家后也可以一起看看Rust官网推荐的那本书:《The Rust Programming Language》。
这本书是Steve Klabnik和Carol Nichols一起写的。官网上有2023年中文版的第二版,还可以免费下载pdf版哦。
赵可菲和席双嘉已经开始看这本书了。
贾克强还说:“学Rust的最有效的办法只有三步。“
”第一步,看Rust的书。“
“第二步,把书上的例子改改,然后自己写一遍代码试试看。“
”第三步,把Rust的语言特点和你擅长的编程语言做个比较,帮助记忆。“
”如果遇到问题,先问问艾极思,如果还是不明白,我们再一起在课堂上讨论。”
1.2 如何安装最新版Rust
在课堂上,赵可菲和席双嘉俩人都在自己的电脑上访问了Rust语言的官网安装页面,按照上面的提示,他们用rustup
顺利地安装了Rust。
贾克强来了一句:“rustup
这个命令行工具是用来管理Rust版本和相关工具的,可以帮你在电脑上安装多个版本的Rust,切换起来也很方便。”
赵可菲接着说:“这跟Java世界的SDKMAN!好像啊。”
席双嘉叹了口气:“可惜C 世界就没有这样的工具。”
1.2.1 如何验证安装是否成功
安装妥妥的后,他俩就跑了显示rustc
编译器版本的命令,来看看安装是不是成功了。
(小贴士:这个系列编程故事,所有命令都在macOS、Windows11、WSL2、Ubuntu这4个操作系统上试过,没问题的。如果同一命令在不同操作系统中有点儿不一样,我们会特别说明的哦。)
代码语言:javascript复制rustc --version
屏幕上跳出来rustc 1.77.2 (25ef9e3d8 2024-04-09)
。
他们两个又一次运行那个用来查看rustup
工具版本的命令。
rustup -V
屏幕上弹出了rustup 1.27.0 (bbb9276d2 2024-03-08)
。
下面还多了两行字,贴心地提醒他们,这个命令其实并不是用来查看rustc
编译器版本的哦。
1.3 超好用的Rust工具链
贾克强:“所谓的‘工具链’,就是我们Rust的一套安装和版本管理工具,也就是rustup
。“
“这些工具就是我们编写Rust程序的好帮手。工具链里面包括了各种各样的组件,比如Rust编译器(rustc
),包管理器(cargo
),还有标准库,还有其他你可能需要的编译和管理Rust代码的工具和实用程序。”
“每个工具链通常都和特定的发布渠道和目标平台有关。我们Rust有三个主要的发布渠道。“
“第一个发布渠道,就是我们的Stable(稳定版)。这是我们最重要的发布渠道,每6周就会更新一次。带来的是在Nightly和Beta版中测试过的新功能和改进,给你最稳定和完善的体验。”
“第二个发布渠道,就是Beta版。这个渠道的更新是为了下一个Stable版服务的。在新特性稳定化之前,这里就是最后的测试场所。”
“第三个发布渠道,就是Nightly(每日构建版)。这个渠道里面包含了对Rust语言和工具的最新更改。新功能一般都会先在这里出现,但是可能在未来的版本中有所改变或者不稳定。”
“你的电脑可以同时安装多个版本的Rust工具链。你可以用rustup
轻松地在这些版本之间切换。”
“这种灵活性让我们的开发者可以不需要更改整个开发设置,就能针对不同的Rust版本或者不同的平台(比如x86_64,ARM等)测试他们的代码。”
“每个工具链都可以根据你的需要添加额外的组件,比如交叉编译目标,Rust本身的源代码,还有其他各种实用的工具。”
1.3.1 Java工具链
赵可菲:“Java也有类似于工具链的东西。”
“比如Java开发工具包 (JDK),这就是Java程序员的主要工具,和Rust的工具链差不多。“
”它包括Java运行环境(JRE),一个编译器(javac),还有其他Java开发需要的各种工具和库。”
“还有像Apache Maven,Gradle和Ant这样的构建工具,这些和Rust的Cargo差不多。它们管理项目的依赖,自动化构建过程,还可以处理部署。”
“像SDKMAN!这样的版本管理工具也很有用,可以帮我们管理多个版本的JDK和其他与JVM相关的开发工具,让我们可以随时在不同版本之间切换。”
1.3.2 C 工具链
席双嘉:“对于编译器,C 就没有像Java或Rust那样的官方工具包,不过没关系。”
“它利用了像GCC(GNU编译器集合),Clang和MSVC(Microsoft Visual C )这样的编译器,这些编译器包括标准库,有时候还会带点额外的工具。”
“在构建工具方面,像CMake,Make和Ninja这样的工具,它们就在这里帮你管理C 项目中的构建过程。这些工具可以处理那些构建配置复杂的大项目,还可以和各种编译器搭配使用。”
“说到包管理器,C 就没有像Rust的Cargo那样统一的包管理器。但也没关系,像Conan,vcpkg和Bazel这样的新工具,它们正在依赖关系管理和构建自动化这些领域慢慢变得流行起来。”
1.3.3 如何同时安装多个版本的Rust工具链
赵可菲:“多个版本的Rust工具链能一起装吗?那本Rust书上可没这个。我知道在Java世界里,SDKMAN!能做这个。”
贾克强:“想要装多个版本的Rust工具链,只要5步就行。”
1.3.3.1 如何列出已安装的工具链
贾克强:“第1步,我们得看看已经安装了哪些工具链。”
“如果你想一眼就看出已安装的 Rust 工具链有哪些版本,直接运行rustup toolchain list
就行了。”
“然后你的屏幕上就会显示这些东西(以macOS为例):”
代码语言:javascript复制 jkq@mbp ~ rustup toolchain list
stable-aarch64-apple-darwin (default)
“这就表示,我电脑里就只装了稳定版的工具链哦。”
“如果你想了解更多关于你的Rust开发环境的小秘密,像Rust工具链的版本列表,rustup的home目录在哪,或者rustc的版本号,只需运行一个简单的命令rustup show
。”
“屏幕上会显示出更详尽的信息(以macOS为例):”
代码语言:javascript复制 jkq@mbp ~ rustup show
Default host: aarch64-apple-darwin
rustup home: /Users/jkq/.rustup
stable-aarch64-apple-darwin (default)
rustc 1.77.2 (25ef9e3d8 2024-04-09)
1.3.3.2 如何列出所有可供安装的Rust版本
贾克强:“第2步,我们来看看有哪些Rust版本可以安装。”
“唉,有点小遗憾,rustup工具并没有提供这个功能。不过别担心,上网搜一下‘rust versions’就能找到答案(参考图1.1)。”
赵可菲:“哈哈,Java工具链终于在某方面超越Rust工具链了。在Java的世界,我们只须用SDKMAN!运行一下sdk list java
,就能列出所有能装的JDK版本,而且还会标出哪些是已经安装的版本哦。”
贾克强向赵可菲竖起了大拇指,表示赞同。
1.3.3.3 如何安装特定版本的Rust
贾克强:“那么,第3步,我们就来安装一下Rust的特定版本。”
“举个例子,如果我们想要安装Rust版本列表里的1.66.0这个版本,那就直接运行命令rustup toolchain install 1.66.0
就行了。”
“装完以后,可以用rustup toolchain list
这个命令来检查一下是否安装好了。”
“屏幕上现在显示的是1.66.0这个版本哦。”
代码语言:javascript复制 jkq@mbp ~ rustup toolchain list
stable-aarch64-apple-darwin (default)
1.66.0-aarch64-apple-darwin
1.3.3.4 如何切换不同版本的Rust
赵可菲:“那个stable
后面跟的(default)
是啥意思呢?”
贾克强:“我来解释一下。在第4步,我们要切换rust的不同版本。“
"跟在某个Rust版本后面的‘default’的意思就是,我们现在正在用的,就是这个版本哦。”
“想换到1.66.0这个版本,运行命令rustup default 1.66.0
就可以啦。”
“看,屏幕上显示default版本已经是1.66.0啦。”
代码语言:javascript复制 jkq@mbp ~ rustup default 1.66.0
info: using existing install for '1.66.0-aarch64-apple-darwin'
info: default toolchain set to '1.66.0-aarch64-apple-darwin'
1.66.0-aarch64-apple-darwin unchanged - rustc 1.66.0 (69f9c33d7 2022-12-12)
"再给rustup toolchain list
跑一下,你就能看到default跑到1.66.0后面去了。"
jkq@mbp ~ rustup toolchain list
stable-aarch64-apple-darwin
1.66.0-aarch64-apple-darwin (default)
1.3.3.5 如何删除不需要的Rust版本
席双嘉:“如果我不想要1.66.0这个版本,怎么删掉它呢?”
贾克强:“哈哈!这就是我们的第5步,把不需要的Rust版本删掉。”
“你想删1.66.0版对吧。删之前,先看看1.66.0版是不是你现在在用的版本。”
“现在确实是。所以我们得先把Rust的当前版本切换到stable版本,再删1.66.0版。”
“否则,你要是不切换,直接把1.66.0版删了,rustup还是会记得你现在的版本是1.66.0。所以你再用Rust的时候,它还会从网上下载1.66.0版呢。”
“我现在就把当前版本切换到stable版。”
代码语言:javascript复制 jkq@mbp ~ rustup default stable
info: using existing install for 'stable-aarch64-apple-darwin'
info: default toolchain set to 'stable-aarch64-apple-darwin'
stable-aarch64-apple-darwin unchanged - rustc 1.77.2 (25ef9e3d8 2024-04-09)
"再看一下,切换成功了没?"
代码语言:javascript复制 jkq@mbp ~ rustup toolchain list
stable-aarch64-apple-darwin (default)
1.66.0-aarch64-apple-darwin
“最后咱们再把1.66.0删了吧。”
代码语言:javascript复制 jkq@mbp ~ rustup uninstall 1.66.0
info: uninstalling toolchain '1.66.0-aarch64-apple-darwin'
info: toolchain '1.66.0-aarch64-apple-darwin' uninstalled
“检查一下,删得怎么样了?”
代码语言:javascript复制 jkq@mbp ~ rustup toolchain list
stable-aarch64-apple-darwin (default)
赵可菲:“嘿,删除成功了哦。1.66.0不见了。”
1.3.4 如何升级Rust工具链和rustup
贾克强:“Rust的版本更新嘛,简直就像快餐店的新菜一样,哗啦哗啦的。“
"Stable版本,就是大家都在用的那个,像咱们公司食堂菜谱一样,每6周就有新的一次。“
"所以啊,你要是想跟上Rust的步伐,那就得经常更新你的Rust工具链和rustup程序本身啦。"
"想要做到这一点,你得经常运行rustup update
这个命令哦。“
jkq@mbp ~ rustup update
info: syncing channel updates for 'stable-aarch64-apple-darwin'
info: checking for self-update
stable-aarch64-apple-darwin unchanged - rustc 1.77.2 (25ef9e3d8 2024-04-09)
info: cleaning up downloads & tmp directories
“这个命令嘛,先把所有已经安装的Rust版本给更新了,然后最后才轮到rustup工具本身更新。”
1.4 小结
- 女程序员赵可菲负责维护一个老旧的Java系统,工作压力大,家庭生活也很忙,真是有点手忙脚乱呀。
- Java系统老掉牙了,快要被淘汰,赵可菲现在面临着要不要转行的问题。
- Rust编程语言可能是赵可菲的新选择,公司还提供了Rust的培训,但是Rust的入门难度有点大。
- Rust培训课上,赵可菲遇到了讲师贾克强和搭档C 程序员席双嘉,还有个AI编程助手艾极思,真是人才济济啊。
- 他们一起学习Rust,看看Rust的书,改改书上的例子,再比较一下其他编程语言,帮他们学习Rust。
- Rust有一整套的工具链,包括rustup工具,这玩意儿可以帮助程序员管理Rust的版本和相关工具,真是太方便了。
- 他们可以用rustup安装和管理多个版本的Rust工具链,想用哪个版本就用哪个,切换起来就跟玩儿一样。
- Java和C 也有类似的工具链,不过在某些方面,比如发布渠道,Rust的工具链更胜一筹。
- Rust、Java和C 在工具链方面的异同,这个问题值得我们深思呀。
工具链特性 | Rust | Java | C |
---|---|---|---|
编译器 | Rust编译器(rustc) | Java开发工具包(JDK)包括Java运行环境(JRE)和编译器(javac) | 无官方工具包,使用GCC(GNU编译器集合),Clang,MSVC(Microsoft Visual C )等编译器 |
包管理器 | 包管理器(cargo) | 无统一的原生包管理器,使用Apache Maven,Gradle,Ant等第三方构建工具 | 无统一的原生包管理器,使用Conan,vcpkg,Bazel等新第三方工具 |
版本管理工具 | rustup,可以安装和切换多个版本的Rust | SDKMAN!,可以管理多个版本的JDK和其他与JVM相关的开发工具 | 无类似工具 |
发布渠道 | 有三个主要的发布渠道:Stable(稳定版),Beta版,Nightly(每日构建版) | 无明确的发布渠道信息 | 无明确的发布渠道信息 |
其他 | 可以添加额外的组件,比如交叉编译目标,Rust本身的源代码,还有其他实用的工具 | JDK包含其他Java开发需要的各种工具和库 | 编译器有时会带一些额外的工具 |
如果你想要了解Rust是如何通过超越传统赋值语句的binding,实现不变性、模式匹配和所有权设计理念的,那就关注我,继续看下去吧!
【未完待续】
如果喜欢我的文章,期待你的点赞、在看和转发。
如果不喜欢,在评论区留个言告诉我哪里不喜欢呗~