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

程序员难免要学习一些新的编程语言,可能是因为好奇心,也可能是工作需要。今天谈谈怎么样学习一门新的编程语言。我们假设本文的读者是个正经的程序员,至少熟练掌握了一种编程语言。

(一)语法

语法其实是最不重要的一部分,但往往又是第一个需要解决的问题。对有经验的程序员,抱着一本厚厚的编程语言书来学,可能是非常枯燥,甚至浪费时间。一个简单的方法是,花半小时搭建好编程环境,然后花两小时快速体验一下这门新编程语言的常用语法。

怎么做呢?打开 https://learnxinyminutes.com ,上面有几乎市面上所有编程语言的快速语法入门。先从头到尾快速浏览一遍,然后在你搭建好的编程环境里直接上手写代码,尽量不要复制粘贴,而是输入你感兴趣的代码片段,然后执行。这样的肌肉记忆可以帮助你快速掌握一门编程语言的常用语法。

如果你有喜欢的编程器,比如 vim ,当然可以直接使用。如果你不确定你常用的编辑器是否合适,推荐使用 vscode ,你不得不感叹,微软做开发者工具还是很有一手的。自从 vscode 诞生,我就很少在 sublime, atom 之类的编程器之间反复比较了。

这一步骤,应该尽量控制在四个小时以内。

(二)标准库

C 语言的标准库是经常被人诟病的地方,我们暂且不聊。对一些现代的高级语言,几乎都提供标准库。这些标准库都是语言发明者精心设计的,熟悉这些标准库的用法,是提高开发效率的必经之路。

由于你已经有编程经验,你心中已经有编程过程中需要解决的通用问题。带着这些经验,快速浏览一遍这个编程语言的标准库,看看标准库提供了哪些内容功能,如此就足够了。以后用到时,凭记忆快速查找即可。

一个典型的标准库,一般包含内置函数,数据结构,字符串处理,文件处理,操作系统服务,并发,网络编程,网络协议封装,单元测试,调试和性能分析,正则表达式等等。

这一步骤,你可以借助 https://exercism.org 网站,一种语言有几十道编程题,用刷题的方式,来巩固常用语法和标准库的用法。这一步骤,预计需要一个星期的时间。

(三)语言的特性

你需要了解这个语言有哪些你陌生的特性,这些是你需要重点学习的地方。特性因人而异。比如,你只会 C 语言,学习 Python 时,大概率会遇到好多新的语言特性,比如 lambda 表达式,列表表达式,修饰器,类,mixin,魔法方法。如果你依然用 C 语言的循环方式来编写 Python 的循环,可以运行得起来,但专业人员一看,会说你写的 Python 代码不够 pythonic ,不够地道。

但如果你原来就很熟悉 JavaScript,学习 Python 时,新的语言特性就会少很多。至少类,闭包之类的,是相通的,只是语法不大一样而已。

对你而言,新的语言特性,是需要花大量时间重点学习的知识点。你可以学到这个语言的精髓,然后和你原来熟悉的编程语言横向比较,看看解决同一个问题,是不是更优雅,或者更丑陋。

语言的特性,一般在编程语言的官方主页是有相应的文档,一般以 Language Reference 的文档体现。

如果你学习 Go 语言,则 Effective Go 大概是你发现语言特性的好地方。

如果你学习 Rust,大概 The Rust Programming Language 是不可或缺的权威资料。

如果你学习 Python,The Python Language Reference 应该是个好的文档。

因为你已经有了编程语言的基础,并且你通过前面几个步骤的学习,已经掌握了很多常用的内容。这些文档,应该要跳着看,重点找到那些对你来讲,是“新”特性的章节来阅读。强烈建议直接看英文原文,一是可以顺便学习英语,二是,你一旦习惯了英文,原文往往会比翻译的更容易理解。

另外一个发现语言特性的地方,是直接阅读这个编程语言的标准库的代码。比如 Go 语言,其标准库的代码质量很高,是可以学习和模仿的对象。

这一步骤的时间因人而异。有些人,可能会很快,因为一个新语言可能几乎没有什么新的特性。有些人,可能会很慢,特别是跨度比较大的语言。比如你原来只会 C 语言,学习 Python 时,会发现一堆新的特性需要学习。

这一步骤,是学习一个编程语言最痛苦的地方,也是最有价值的地方。痛苦是因为你会发现,好多东西都很陌生。价值在于,你一旦掌握了,你的解决问题的工具箱就会变得更丰富。比如,学习 Go 语言,如果你不理解下面这句话,就基本上没有掌握 Go 的精髓。

Do not communicate by sharing; instead, share by communicating.

(四)框架和组件

如果从学习语言本身来讲,框架和组件并不重要,甚至你可以故意重新造个轮子,写个组件。但如果从编程效率来讲,熟悉一个编程语言的应用框架和组件,是非常有必要的。

学 Python 的人,可能需要学习 Django,用它来开发服务器程序。学习 Ruby 的人,基本上绕不开 Ruby on Rails。学习 JavaScript 的人,可以用 React/Vue 来开发前端程序,或用 Node.js 来开发后端程序。

掌握一个和你的工作或兴趣相契合的框架,是让这个编程语言发挥作用不可缺少的步骤。

另外一个话题是组件。现代编程语言,都有很多开发者贡献的组件。这些组件,可以解决大部分通用问题,大幅提高解决问题的效率。通过学习优秀组件的接口设计和实现,是学习这门语言非常重要的参考资料。

(五)高级特性

很多高级语言都具备元编程能力。元编程能力是一个编程语言的高级特性,可以追溯到 Lisp 的宏。一本比较经典的元编程书籍是《Ruby 元编程》。

语言互调用能力,也是一个语言的高级特性。比如 Python 语言可以调用 C 语言编写的代码。

实际上,你并不需要完全掌握上面提到的所有内容,再开始编程。只要掌握文章开头的两个步骤,就可以开始大量编程,甚至可以开始写产品的代码了。在使用过程中学习,可以让学习不那么枯燥,也可以让学习反馈变得更短。

(完)


Post by Joey Huang under daily on 2022-03-25(Friday) 23:44. Tags: 每日随笔,


Powered by Pelican and Zurb Foundation. Theme by Kenton Hamaluik.