如何学习一门新的编程语言

在 Github 上修改

21天精通C++

前言

入坑计算机快 3 年了,因为工(sheng)作(huo)需(suo)要(po),陆陆续续学习和使用了几种不同的计算机编程语言。

编程语言很多,而且也一直在发展,也不断有新的优秀的语言诞生。如何快速、正确、高效地学习一门编程语言是很多程序员都会遇到的一个问题。

我也一直在思考,也走了相当多的弯路,慢慢地总结了一套自己的学习方法。

作为一个开发工程师(而非专业的语言开发人员),分享一些我的看法。

PS:下文所说的“语言”都指“计算机编程语言”。

常见问题

选择不同的语言很重要吗?

语言一定是重要的,它是程序员和计算机之间的交流工具。 不过要谈重要程度,不同的阶段应该有不同的答案。

  1. 在刚毕业找工作的时候,我会回答“特别重要”。因为这在很大程度上会决定我能否通过校招面试、能否找到感兴趣的工作。还记得在面试腾讯的时候,也是人生第一次面试,毫无经验,当时我说了我擅长 Java,但面试官问了我一堆 C/C++ 语言上的问题,回答得很差,意料之中挂了。
  2. 在工作了快 3 年的现在,我会回答“重要,但不是特别重要了”。在学习了几种不同的语言后,如果要开发一个功能,我会综合考虑选择一个我认为合适的语言去实现。

学会一门语言需要多长时间?

在知乎上,时不时就会看到一些人说从一门语言转到另一门语言只需要两三天、一天就够了,甚至半天就够了。

说实话,我非常不同意这种观点。即使你足够聪明,学习能力也很强,我想在一天时间大概也是“学不会”的,不接受反驳。

要回答学会一门语言需要多长时间?首先得定义什么是“学会”。

一种学会是指“真正学会”,我觉得它应该约等于“精通”,精通语言的各种细节和底层实现,掌握语言周边常见的库、框架,能够写出优雅、正确且高效的代码,以及能够站在一个较高的高度评价这门语言的优缺点。

“真正学会”诚然是非常难的,并非一朝一夕之功。那么把难度降低一些,先考虑“简单学会”,“简单学会”一门语言是指能够在生产环境下进行一些简单功能的开发。

更详细地,怎么看是否已经“简单学会”一门语言?在我看来,评判标准应该是“能够较流畅地进行一些简单功能的开发,代码易读,大体上符合对应语言的编程风格,且不存在严重的 BUG 和性能问题”。

下面简单分析一下:

  1. 较流畅地进行一些简单功能的开发:半天看完语言语法,能够输出 Hello World,能够完成 1 到 100 的求和,这就能称自己学会了一门语言了吗?显然不是,比如实现一个几十行代码的 LRU Cache,每写几行代码就需要搜索一下 Map / List 的 API 用法。也就是说写代码“很卡”,如果有人说这样的编程状态也算学会了一门语言,那他自己开心就好。
  2. 代码易读,大体上符合对应语言的编程风格:不同的语言推荐的编程风格可能是不一样的,写出的代码需要易读,符合常见的风格。比如不能把 Java 的一些风格带到 Golang 上,使用特别长的变量、方法名,通过 getter/setter 访问 struct 成员变量,使用 self/this 作为 method receiver 等等,这会显得写代码的人特别不专业,还没有融入到这门语言中。
  3. 不存在严重的 BUG 和性能问题:这一点很好理解,要达到这个要求,我想至少得了解一些常见的原理性的知识吧,并不只是会用语法就行了。

所以,即使是“简单学会”一门语言,大部分人可能两三天也不行吧。

如何学习

好了,回到正题,如何“系统地”学习一门新的编程语言?

注意:这里说的是系统学习,如果只需要简单学学,写几行一次性的代码,完全不需要这么麻烦,直接 google 搜一搜例子,然后魔改几下就行了。

我学习的时候会首先在代码库中创建一个目录,专门用于存放学习这门语言的一些测试代码。为什么要这么做?好记性不如烂笔头,参考:我的学习工具#个人代码库)

下面把学习过程分为 3 个层次,分别是 基础深入实践,另外由于不同的语言差异较大。

基础

HelloWorld

先搭建环境,语言环境 + IDE。

这里非常不推荐使用 vim,有些人喜欢用 vim,再安装一堆插件(还各种 BUG),不是很懂这和 IDE 有什么区别。

再看几个简单的例子,了解下变量、函数是怎么定义的,注释风格等等。

类型系统

在编程语言中,类型系统是相当重要的,值得花一些时间仔细学习。

流程控制

包管理

并发/反射

常用标准库

常用第三方库

深入

实践