由于飞书底层是用Rust开发的,所以最近一段时刻都在写Rust的代码,我对写Rust也越来越顺手,速度甚至现已比我用了许多年的c++要更快了,虽然首要原因是Rust有许多语法糖,可以加快写代码的速度。作为了一个之前彻底没触摸过Rust的新手,也就花了几天时刻,便能娴熟的进行Rust项意图实战开发了。

我想到我曾经还是一位菜鸟程序员得时分,学习而且把握一门言语要花很长的时刻,而且还会到处向朋友夸耀,自己会多少种编程言语,到现在,现已彻底不重视自己会多少种编程言语了(由于写过的言语太多,最少也十几种),学习一门新的编程言语所需的成本也现已很低了,一般也几天时刻,就能把握这门言语,我的重视点也从我会多少种言语,转移到这门言语在解决问题和提高功率上的实用性上。

所以我写这篇文章不是为了介绍Rust怎样学,首要是想讲讲作为一个经验丰富的程序员,怎样能做到前面说到的两点:

  1. 怎样用很短的时刻把握一门新的编程言语
  2. 怎样根据实用性动身挑选适宜的编程言语

怎样短时刻内把握一门新的编程言语

编程言语千千万,可是根本都要解决相同的问题,我这儿列出了一些最首要的问题:

  1. 怎样进行使命调度
  2. 怎样处理数据
  3. 怎样处理反常
  4. 怎样办理内存

不论咱们学习哪种编程言语,都要带着这些共通的问题去进行学习。针对这几个问题,下面我逐个进行讲解。

怎样进行使命调度

在使命调用上,无非便是两种方式:线程和协程。线程和协程的原理我不深化介绍,就简单讲一下,线程便是一个运用线程对应了一个体系的进程,是1对1的联系,而协程是多个协程对应了一个体系进程,是多对一联系。在运用场景,线程合适高CPU消耗使命,而协程合适高频的IO使命。当咱们深化把握了线程和协程的原理,线程安全的原理,线程协作的原理等根底常识点,那么面临任何咱们没触摸过的新言语时,咱们只需求知道该编程言语支撑哪种调度方式,比方Java支撑线程,Kotlin支撑协程(假协程),Rust支撑线程和协程,然后再了解这门言语进行使命调度,加锁,等候,休眠等特性的代码要怎样写,咱们便把握了这门言语至少20%的常识点了。

怎样处理数据

数据处理上,所有的编程言语都需求提供根本的数据结构,如数组,队列,Map等等。咱们需求把握的是数据结构的原理,面临不同的数据类型特性,怎样挑选更适宜的数据结构,而当咱们学习一门新的言语时,只需求了解这些根本的数据结构对应的是哪些类即可,比方Rust中的Vec,Java中的ArrayList,其实都是动态数组这一根本的数据结构,所以在Rust学习时,我很快就能娴熟的运用Vec等这门言语提供的调集容器。到这儿,咱们现已把握了这门新言语40%的常识点了。

怎样处理反常

反常处理是编程言语中很重要的一块常识,可是新人却很简单疏忽。咱们都不希望程序动不动就crash了,越是优秀的言语,对反常的处理越是完善,写出的代码crash也越少,比方用Kotlin写的程序,空指针导致的crash比java要少许多。其间Rust是我遇到的在反常处理上最为苛刻的,需求手动处理每一个反常。当咱们了解这门言语该怎样处理反常时,到这儿便现已把握了这门新言语60%的常识点了。

怎样办理内存

习惯了运用解释性言语的开发者或许不太重视内存的办理,当咱们运用Java时,Kotlin时,并不需求咱们主动去开释内存,由于虚拟机会帮咱们做。可是关于其他编译型言语来说,内存的收回和开释,都只能咱们自己做了,最常见的便是c++言语,内存的申请和开释都是让咱们写起来觉得很费事的地方。当咱们学一门新言语的时分,一定要了解这门言语是怎样办理内存,即使是Java这种不需求咱们手动办理内存的言语,咱们需求了解它的虚拟机是怎样进行内存办理的。当我在学习Rust时,我首先重视的便是Rust需求怎样办理内存,由于他是一门编译型言语,功能上不会差劲c++,我以为它依然需求自己手动申请和开释内存,成果发现Rust经过所有权的机制,使得咱们不需求自己手动的申请和开释内存,这种机制立刻就让我眼前一亮,由于这是我之前从没触摸过的一种新的思维。到这儿,当咱们把握了这门言语是怎样进行内存办理的,咱们便把握了这门言语80%的常识点了。

其他

剩下20%的常识点,包含这门言语根本类型的声明,提供的API,独有的一些特性,语法糖等等,在运用过程中,就能慢慢孰能熟能生巧了。

根据实用性动身挑选适宜的编程言语

咱们学习或者在项目中挑选一门新的言语,不能谁便拍脑袋,而是要根据实用性的考虑。我常常考虑的首要有下面这些点:

  1. 功能
  2. 简单易用
  3. 安全
  4. 跨渠道
  5. 足够多的社区支撑

编译型的言语在功能上是要好于解释性言语的,所以咱们在客户端开发时,许多对功能要求高的逻辑都是用c++来写,而不是用Java来写。我在前面说到过飞书的底层是用Rust写的,这儿的底层首要是数据层,包含db,网络请求等和数据相关的逻辑,都是用Rust完成,其间一个首要的原因便是由于Rust支撑携程,在IO场景上功能会更好的,在加上其他的一些考虑,比方简单易用,跨渠道等特性,Rust自然便承当了这一重担。

其他的点我就不逐个打开说了。咱们在挑选言语的时分,都会有原因,新人或许在意简单易用;创业团队或许在意跨渠道;对我来说,我对功能的要求是比较高的,由于我本身便是做功能优化这一范畴的。只需咱们有自己的原因和意图,而不是盲意图去挑选和学习即可。

如何快速的掌握一门编程语言

我听不少开发都说过,互联网行业技能更新迭代快,学的常识很简单就过期,然后就需求重新学习。我实际是不认可这些说法的,底层的常识更新迭代很慢的,比方计算机的原理,Linux体系的原理等等,只需咱们深化把握了,其实是可以运用很长时刻的,是投入产出比很高的事情,咱们认为迭代快的东西,往往都是上层的技能,比方一个框架,一个门编程言语等等。但只需把握那些迭代慢的底层技能原理,不论上层的技能迭代多块,咱们都是能很快速的进行响应和跟进的。