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

一种通过学习语法、生态系统从而达到精通程度所需要的更有条理的方法

原作者:Martin Kock

Photo by [Tim Mossholder]

想要学习一门新的编程语言?太棒了!我个人认为,编程语言的前景从来没有像现在这么样令人激动。有大量的编程语言可供学习,并且一个真正的专业人士需要通晓多种语言的polyglot(来自维基百科 Wikipedia: Polyglotism or polyglottism 是指掌握多种语言的理解、说、读或者写)

我不会帮助你从一大堆语言中挑选一个--那要根据你的语言水平,语言技巧,志向以及你想要从事的职业方向。但是我会帮你推进你所选的语言的学习过程。

不确定如何推进这么一个大的任务?你可能不是唯一一个这样做的人,所以让我们花点时间找出一个有条理的方法,它不仅适用于你的下一次学习,也适用于以后所有的学习。 请记住,这只是我自己学习一门新语言的方法,我将以一种易于理解的方法来呈现。

学习一门新的编程语言是一个很难的事情,但是感谢我们生活在一个所有--即便不是所有--资源都可以在线获得的时代。大多数也是免费的。你所需要的只是动机,你所喜欢的搜索引擎,以及本教程--可能还需要一点点额外的,但是让我们随后再担心它们吧。

无论你采用何种方法来学习你的新语言,都有一些非常具体的科目是你应该学习的,以获得对这门语言的全面理解和知识。闲话少说,让我们看看它们是什么:

基础

  1. 语法

  2. 类型系统

  3. 错误处理和恢复

  4. 调试

The ecosystem 生态系统

  1. 标准库

  2. 包管理

  3. 社区

  4. 框架和类库

  5. 工具

背景知识

  1. 书籍

  2. 语言公告

达到精通

  1. 设计模式

  2. 习惯用法

  3. 练习

  4. 项目

接下来的每个主题都会有更多细节。我决定将每个主题拆分成主题和“目的、步骤、原因”这样的结构,以便于你能更容易的知道每个案例的概览。

基础

目的

在一开始,你想要熟悉这门语言的语法。焦距在发现与你已知的语言相比,有哪些不同点。

步骤

去亚马逊(Amazon.com),为你所学的语言订购一本介绍性书籍。它要么是最近(大约是去年)出版的,要么是类似于“xx圣经”之类的书籍。我想你应该了解:他们试图覆盖从A到Z的整个语言,并且经常会再版,以跟得上语言的发展以及最佳实践。

找一些受欢迎的书,并且使用亚马逊的查看内部功能(Amazon’s Look Inside feature)来学习:1) 如果这本书的沟通水平是愉快的和易于理解的,2) 如果它涵盖了你可能会觉得很困难的话题。如果你喜欢电子书,那么使用刚才的方法挑选同样质量的一本书。

许多现代编程语言都会有自己的官网,上面有如何开始的教程和指南。使用它们!它们往往包含大量的实例和生动的代码,你可以直接在playground上运行它们。将会有“改变x的值,然后看看发生了什么”之类的练习。

为你的语言寻找一个可以做实时编码的在线环境(playground),或者在你的电脑中开启一个学习项目。关于类型系统,你需要知道哪些类型可用,如何在它们之间转换,以及在转换期间注意些什么。

例如,像PHP这种动态语言,对数字进行字符串操作时,将会把数字转换成字符串类型,所以要问你自己:这是可预测的吗?它在浮点数上保持精度吗,或者我需要调用一个标准函数库来实现它吗?当我把它转换回浮点类型的数字时发生了什么?在JavaScript中,你可以比较任何两个值,但是在什么情况下它们被认为是相等的?如何测试空值和未初始化变量?

同样的问题应用在如C++和Java等静态类型的语言上,但是没有自动类型转换,在练习中你将需要花一些时间学习如何类型转换的工作:需要用标准库中的哪一个函数和需要展示哪些约束条件。你是否也熟悉了转换和错误消息。

原因

教程和练习对于获得一些实践经验和学习有关性能和可伸缩性,边缘情况和语言中的意想不到的行为非常重要。当你开始做第一个真实项目时,这些练习将会使你提高效率。

应用系统

目的

一旦开始用你新喜欢的语言开始做实际项目,你将会需要寻找检查 、引入和集成别人的代码,无论是官方类库或者是开源项目。

步骤

熟悉语言包管理:比如PHP的Composer,Python的pip,Node.js的NPM,Ruby的gems等等。有时,它们将会被替代。学习跟他们有关的:为什么它们存在,它们值得学习吗?你需要知道是否有一个公开的包存储仓库,例如为Node.js (npmjs.org)和Perl(cpan.org)存在的仓库,或者可能是它们文档的中心位置,如Golang (go.dev)。

搜索一些你可能想要的示例包,然后阅读它们的文档,然后尝试去安装和运行一小部分包以熟悉包管理。阅读包管理的文档。它们描述了如何升级/降级一个包了吗?如何安装它们?这些包被安装在哪里了?如何管理它们的依赖关系?熟悉围绕包管理系统的生态系统 ,以及围绕它的社区。现在你可能并不需要知道如何发布你自己的包,但是你将会需要知道如何恰当的模块化和可复用。否则,你将不会超越哪些小的实用风格的应用。

查阅一些最流行的包或者用你新学的语言写的开源项目。学习他们的代码结构、命名标准,错误处理,以及其他可以学的。同时也要观察他们的包依赖。做笔记!一些东西会马上走向你:可能是几个开源项目同时用到的包,OAuth,日期操作,PDF生成,日志等等。把这些包放在书签里。看看他们是否对你有用。

如果你加入了一个Slack频道或者论坛,你可以向关注的开发者讨论,问他们有关这些包的问题。或许你一直在关注老的项目,而现在每个人都在使用更流行的替代者来替代你项目中的主要依赖项。

原因

当学习一个新的语言时,我个人喜欢去查找使用该语言的一些最流行的包或者开源项目。你可以从中学到很多,因为它们是被一些比你自己更有经验的人写的。

知识就在那里,你只需要伸手去够它们。

背景

目的

了解一个语言的历史是学习一个新语言的重要部分,所以,仔细研究一下,试着形成一个观点。通过了解一个语言的历史,你可以知道它被设计为解决哪一类问题,并且作者带给我们的方法。你还将会了解到你所学的新语言不适合解决哪类问题。

步骤

查看该语言的维基百科 Wikipedia page。谁在什么时候创建了它?当时发生了什么?

寻找语言作者所提供的工具的替代品。我不是说你应该使用它们,但是你需要知道它们。比如:Node.js的NPM有一个替代品叫做yarn.问一下自己,为什么yarn的作者发现一个替代的需求?它们是想解决什么问题,你认为它们成功了吗?

语言本身也是如此。PHP有一个分支叫做Hack,被Facebook开发出来用于解决它们在使用PHP时遇到的一些问题。Hack在今天还值得使用吗?这只是要意识到,当一个同事说:“我讨厌X,为什么没有人做一个Y来替代它?”。你不仅仅能回答这一类问题,而且你还会非常有信心的知道你所选择的语言、类库、支持工具组合和技术不是偶然发生的。

为你的新语言找到一个新闻网站,然后观察社区正在发生什么。这个语言和工具进入了一个新的方向吗?人们是否在为一个特性而烦恼?如果你知道一个备受期待的特性即将发布,你将会为你的新项目做些准备,并且你将处在这个语言的最前沿。Twitter 和 Reddit是一个很好的信息来源,不过它们还有需要其他的。

查找 Medium,但不要只相信每个人所说的话(包括我)。忽略掉那些讨厌者,去发现那些展示真知灼见和复杂观点的文章。那些成功的故事也值得读一读,它们可以帮助你确定这个语言擅长什么。

原因

做一个你自己的观点,但是不要固守它们去反对所有的旧观点。如果有人有一个好的观点或者更有说服力的证据来反驳你松散的论点,不要害怕改变它。这也是学习的一部分。

当Python的“仁慈的独裁者”Guido Van Rossum因为社区问题决定辞职时( Guido Van Rossum, decided to quit )或Oracle收购Sun Microsystems并接管Java( Oracle bought Sun Microsystems )时,人们会关注 。这些事件有时是背景噪音,但不是永远。有时,它们会对社区产生深远的影响,授权模型,人们对语言的感知等等。

Achieving Proficiency 达到熟练程度

Purpose 目的

Every single language was designed to be used in a specific way or in a range of ways. It’s an approach to software development known as idiomatic code. Some language authors talk more about this than others, but it’s always there, and it’s always worth learning. Otherwise, you’ll end up fighting against the language itself, and you’ll start blaming it for what appears to be its shortcomings.

Remember this: If your new and shiny language simply had all the same features that you have grown to love from your previous language, then there’s no reason for its existence in the first place. Languages exist because they have different strengths and weaknesses in relation to different types of tasks, and these differences are expressed via the language itself, its syntax and choice of features. And equally important is which features the authors have decided to omit.

Steps

If you haven’t read it yet, then get a copy of “The Pragmatic Programmer.” This book should be on every developer’s bookshelf. It’s excellent for learning the best practices from your peers.

If you haven’t heard about Uncle Bob’s “Clean Architecture,” now is the time to get familiar with it. Find some online resources or buy his book — I highly recommend it. Then think about how to apply it to a project using your new language. Think about how to achieve decoupling and inversion of control via dependency injection.

Look up the design patterns from The Gang of Four, and figure out how to apply them in your language. Also, realize that these patterns are not useful for every single language out there; there are exceptions.

For any language in general, look up SOLID, the software design principles for making software more understandable, flexible, and maintainable. These are useful principles to know even when they’re not directly applicable to the language you’re currently learning.

Start a hobby project of your own. You’ll quickly forget what you’ve learned unless you put it to use. Take your favorite PHP library and convert it to Python, automate something at your work, or go make contributions to an open-source project. You’ll soon realize if there is something in the initial learning phase that you missed, for example, how to stream bytes from a reader to a writer, how to ask for input from the console, or whatever it might be.

Visit a challenge-based learning site such as codewars.com, where you can solve challenges in your new language and see what others have done to solve the same problems. It can be quite addictive!

Don’t hesitate to use Stack Overflow when you feel stuck!

Reasoning

Learning the strengths and weaknesses of a language is a very important skill to have as a developer. Thinking that your new language of choice is the answer to all the world’s problems is a rather narrow-minded mindset to have. Sometimes a project is simply easier to solve in a different language than your current favorite choice. Knowing when to switch to another language is an important skill to have.

Oh, and don’t forget to have some fun along the way. Good luck!

你可能感兴趣的:(如何学习一门新的编程语言)