> * 原文地址：[Unconventional way of learning a new programming language](https://hackernoon.com/unconventional-way-of-learning-a-new-programming-language-e4d1f600342c#.alz60t9jd)
> * 原文作者：该文章已获原作者 [Sahil Dua](https://hackernoon.com/@sahildua2305) 授权
> * 译文出自：[掘金翻译计划](https://github.com/xitu/gold-miner)
> * 译者：[ivyxuan](https://github.com/iloveivyxuan)
> * 校对者：[atuooo](https://github.com/atuooo), [gaozp](http://gaozhipeng.me)

---

# 震惊，还可以用这种姿势学习编程

现在已经有 500 多门编程语言了。所以站在今天来说，开始学习一门新的编程语言对你来说是一件很正常的事情。比如你会 C++ 和 Java，但是你的工作却需要用到 Python；或者你精通 Python 但是你工作中用到的语言却是 Java；又或者说你只是想扩展一下你的编程技能。

所以如果你想开始学习一门新的编程语言，你会选择什么方式？

- 阅读一些在线教程
- 或是看一些在线的网络课程

甚至你们其中一些人或许会说学习一门新的编程语言最好的途径应该是这样的：

- 先学习这门新的编程语言的语法
- 再用这门语言开发一些个人项目

这样说的确很有道理！因为它可以确保你将你所学的语法知识运用出来。

在我学习各种语言的过程中，我开发了 20 多个小项目。但相信我，在你写个人项目的时候，不管是利用周末做一个项目还是刷夜做一个快速开发，你写的代码都是为了完成某些事情。你只会关注 —— “我的代码能不能运行的通”，而不会去关心代码质量。

> “任何一个吃瓜群众都可以写出能让计算机理解的代码，但一个好的程序员可以写出能让人理解的代码。” —— (Martin Fowler)

---

所以，如果你想要学习一门新的编程语言，怎样才是一个好的方式？

### 向这门语言的开源项目贡献代码。

是不是震惊了？你可能会想 —— “等等，开源项目很难啊。难道不是只有当我精通这门语言的时候才能向一个开源项目贡献代码的吗？”。答案是否定的。

让我来给你们讲个故事。

去年，我收到了 Booking 全职工作的邀请，而且我知道我将要用 Perl 语言去工作（因为这个是他们后端主要应用的语言）。2016 年 6 月，我毕业之后就开始学习 Perl，这样我才能做好准备去迎接我大学毕业后的第一份工作。因为我会在 7 月的第二周入职，所以我大概有 1 个月的时间去准备。

我开始阅读 Perl 的语法规则并尝试理解这门语言常用的设计模式。那个时候，我特别想用 Perl 做些什么，那样我就可以应用我学到的知识还可以将这个语言各种各样的概念实践出来。当我还在想我能用 Perl 做些什么的时候，我在 GitHub 上看到了一个叫 DuckDuckGo 的开源项目组织。我注意到它们的一些开源项目是用 Perl 语言写的。我看了看上面的 issue，然后发现有很多 issue 都有“新手（beginner）”的标签。我马上开始着手去解决这些问题并且提交了一些 pull request。到今天为止，我已经成为了他们一些开源项目的主要的贡献者，而且还是 DuckDuckGo 这个开源项目社区中 20 个负责人之一。

> 这故事想告诉大家的就是 —— 我通过向 Perl 语言写的开源项目贡献代码学习了 Perl 语言。

### 所以为什么这个办法会有用？

当我学完了 Perl 的语法之后，我开始向开源项目贡献代码。做这件事的时候，我习惯于查看所有已有的模型，并留心 Perl 语言的设计模式。然后，我再将可取地方运用到自己的代码中，我也因此了解到了怎样才能写好 Perl 语言。

这并不是偶然，我还可以向你讲另外一个类似的故事。

最近，在我的工作中，我选择了一些任务，其中包括向 Go 语言写的系统中添加一些新的特性的任务。因此我和我的同事发生了下面的对话 ——

> **我：** **我十分喜欢这个任务，很想参与，你觉得可以吗？**

> **Him：** **嗯，这个任务的确很有意思。但是，它需要你了解 Go，你学过 Go 吗？**

> **我：** **没有耶……**

> **Him：** **那你想学 Go 吗？**

> **我：** **想！**

> **Him：** **好嘞，那就去学！**

所以啦，我要开始学习另一门语言了 —— Go！

我开始阅读 Go 的语法然后在他们的官网中找到了一个优质的针对初学者的教程。这足够我去了解这个语言所有的基本概念。

然后又一次，我开始找 Go 的开源项目，而且是那种带有“初学者（beginner）”和“简单（easy-fix）”标签的 issue。我发现了一个谷歌的项目，基本上来说是一个用 Go 语言为 GitHub 的 REST API 写的包。

**仅仅在我开始学习 Go 的 2 天之后，我就有了我的第一次提交。**

![](https://cdn-images-1.medium.com/max/800/1*TsCbnT-eiymTGR5WDQccrA.png)

---

### 开源项目能提供怎样的帮助？

你现在可能会好奇，向开源项目贡献代码到底是如何让你更好地学习使用编程语言的。有以下几个方面。

#### **代码质量**

很多好的开源项目都有一套严格的代码规范，要想你的代码能够被合并就必须要遵守这些规范。因此，即使你刚刚开始学习这门语言也可以根据这些规范写出质量很高的代码。

不仅仅如此，你还可以浏览项目其他部分的代码，然后学习怎么写出优雅的代码以及怎么去组织文档。

#### 代码校对

向开源项目贡献代码最棒的一点就是有代码校对。你提交你的代码之后，你会收到项目负责人的反馈，这提供给你一个能更好理解这门语言的机会。

这就像是获得了一个能教导你写出优秀代码的免费个人教练。

#### 得到赏识

![](https://cdn-images-1.medium.com/max/800/1*3qrExiprhpgmLRSfqzW6Yw.png)

作为软件开发人员，我们真的需要自己的工作能够得到赏识，而开源社区确保了这一点。我从来没有收到过一条侮辱或者打击人的评论，所有人都特别鼓励我而且特别友好。

![](https://cdn-images-1.medium.com/max/800/1*utyQ9CozIVz8xcIVHI6-Ew.png)

---

所以，如果下一次你要学习一门新的语言，只管去学吧！找一个开源项目贡献代码，然后在学习这门语言和它自己细微差别的路上前进吧 ;)

一定要让我知道这个不怎么寻常的方法对你有没有用。而如果你认为这个方法有用的话，请给我点个赞(❤)～

如果你有什么其他有用的方法的话也请告诉我。推特／关注我[@sahildua2305](https://twitter.com/sahildua2305)。

---

> [掘金翻译计划](https://github.com/xitu/gold-miner) 是一个翻译优质互联网技术文章的社区，文章来源为 [掘金](https://juejin.im) 上的英文分享文章。内容覆盖 [Android](https://github.com/xitu/gold-miner#android)、[iOS](https://github.com/xitu/gold-miner#ios)、[React](https://github.com/xitu/gold-miner#react)、[前端](https://github.com/xitu/gold-miner#前端)、[后端](https://github.com/xitu/gold-miner#后端)、[产品](https://github.com/xitu/gold-miner#产品)、[设计](https://github.com/xitu/gold-miner#设计) 等领域，想要查看更多优质译文请持续关注 [掘金翻译计划](https://github.com/xitu/gold-miner)。
