> For the complete documentation index, see [llms.txt](https://suski.gitbook.io/digitalnomad/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://suski.gitbook.io/digitalnomad/xue-xi-dai-ma-yuan-lai-ru-ci-jian-dan/di-er-zhang-zen-me-yang-xue-xi-bian-cheng.md).

# 第二章：怎么样学习编程！

### 通过互联网学习编程

找到学习编程的资料并不困难，你可以尝试在Google中搜索「怎么样学编程」，你可以发现很多网站和博客文章。例如以下这些免费的学习资源：

* Code Academy - ​<http://codeacademy.com>
* Free Code Camp - ​<https://www.freecodecamp.com/>
* Envato Tuts - ​<https://code.tutsplus.com/>

如果你愿意支付一些小额的学费，你可以尝试一下这些付费学习网站，每个月的学费十分实惠：

* Code School ( 29$/月 ) - ​<http://www.codeschool.com/>
* Team Treehouse ( $25/月 ) - ​<https://teamtreehouse.com/>
* Lynda ( $35/月 ) - ​<http://lynda.com​>
* Code Avengers ( $29/月 ) - ​<https://www.codeavengers.com/>

最后，如果你愿意花大价钱去学习编程，同时希望有最好的学习体验，你可以尝试导师指导的编程项目，例如：Thinkful（​<https://www.thinkful.com/​>）。

如果你想买一些独立的课程，你可以在尝试一下Udemy（<http://udemy.com>），可以在上面找到很多课程，价格约在 20$ \~ 200$ 一门课。（译者注：课程在Udemy经常打折，约 $9.9 一门课。）

其他的一些教育网站，也包含一些编程的课程，例如：

* Khan Academy - ​<https://www.khanacademy.org/>
* Coursera - ​<https://www.coursera.org>
* edX - ​<https://www.edx.org/>
* Skillshare - ​<https://skillshare.com>

除了我提到的这些，在 YouTube 上也有一些很好的学习资源，并且都是免费的。

### 其他学习方式

在我将「How I Learned to Code」这个视频放在 YouTube 上之后，我收到了一系列关于编程的问题。在这个章节中，我将回答一些常见的问题。

#### 通过书本学习怎么样？

书本是一个很好的学习编程的资源，但是这取决与你的学习习惯。对我个人而言，我更喜欢在电脑上进行学习，通过视频或者应用促进我学习。从我的角度来看，纸上得来终觉浅，绝知此事要躬行。不过我的朋友 Dylan，他就是通过书本和导师指导的方式完成了编程学习。其实任何一种方式都可以，找到适合自己的就好。

#### 读一个大学学位怎么样？

如果你关注我有一段时间了，那么你应该知道，我并不推荐你去大学学习，除非你的目标是去大公司工作，例如：IBM 或 Google，也许这就是你想要的，这很酷！但是对于我们这些想尽快开始职业生涯的人来说，读大学太耗费时间和金钱了。（译者注：国内外还是有所区别，如果大学没毕业，或者还没上大学，建议还是要有个大学学位^\_^）

大学是很理论化的，并且学习过程是固定的，并不能因人而异。如果你想成为一名真正的程序员，你需要的是实践训练，需要的是实用的技能。而不是泛泛的了解一下计算机科学基础（当然，这也有一定的用处）。

人们总会问我：我学习多长时间编程，就能找到一份工作呢？答案其实很简单，在你真正学会的时候！这个时间肯定是因人而异的。大学有一套固定的学习模式，三年获得学位，然后再用一年获得文凭。但是如果你通过书本或网络自学，学习的速度将取决于你自己，不会有任何限制。

#### 我该学习什么样的语言/框架？

这又是一个常见的问题，这个问题没有一个标准答案。每一个人都有自己的选择，最重要的是你可以问问自己，你想做一个什么样的软件？是想做一个游戏？还是一个网站？或者是一个类似Snapchat的App？

当我们的故事进入到这个章节时，我希望告诉你我是怎么样去选择，我该学什么东西的。你不用和我做一样的选择，你可以参考我的思考方式。至于具体学什么，这完全取决于你自己的兴趣。

在我的视频「How to Become a Developer and Go Remote」中，我推荐我的观众们去找到自己的目标，从而帮助自己做出决定。如果你的目标是找到一份工作，你应该去学习现在市场上最火的语言或框架。

> 我会在下一个部分解释各个语言和框架的差异性。

如今科技行业发展的十分迅速，在我写这本书时，下面这些语言和框架对于Web工程师来说是最火的：

| ***语言***                          | ***框架***                                                                |
| --------------------------------- | ----------------------------------------------------------------------- |
| JavaScript（前端开发必备语言，也有往后端开发发展的趋势） | AngularJS, ReactJS, Ember JS, Backbone, Node.js, Meteor.js (这个列表在持续增长中) |
| Python                            | Django                                                                  |
| PHP                               | Codeigniter, Symfony, Laravel, Yii 2, CakePHP                           |
| Ruby                              | Ruby on Rails, Sinatra                                                  |

这些都是我基于一个Web开发工程师的经验，我的知识和专业能力并没有扩展到桌面程序开发或者移动端App开发，如果你对这些感兴趣，你可以尝试研究下：

* Swift - iOS开发
* Java - Android开发（译者注：现在还有Kotlin）
* Swift 或 Objective-C - Mac桌面程序开发
* C# - Windows开发

#### 后端 VS 前端

后端和前端这是在Web开发中的一个重要概念，理解这个有一点技术门槛。

前端（也可以理解为客户端）就是你在网页浏览器看到的任何东西。前端的代码是完全公开的，你可以尝试在网页中点击右键选择「查看网页源代码」，你可以看到一堆HTML、CSS 和 JavaScript 代码（也会包含一些其他设置），这些代码都是通过后端发送给浏览器的。

后端（也可以理解为服务端）是对外不可见的，它决定你在前端能看到什么内容。后端与数据库进行交互，例如你登录一个网站，后端将会通过你输入的信息去数据库中匹配你的信息，然后给你返回一个和你账号相关的页面。在后端，你可以使用任何你喜欢的语言进行编程，不受浏览器的限制。

随着Web开发的发展，我们现在可以看到前端和后端之间的区别已经越来越模糊了。你可能记得，在5-10年前，当你点击一个链接时，需要加载一个新的页面进行处理。现在，网页端已经变得和客户端一样了，前后端无时无刻不在进行着处理。

JavaScript 就是一个很好的例子，在之前只是一个前端语言，但是现在后端开发也在慢慢使用，进一步的模糊了前后端开发的区别。

就像我说的，这些东西有一定的技术门槛，当你开始学习成为一名Web开发者时，你将能明白它们之间的区别。

想更详细的了解前后端的区别，你可以去看看我的技术分享课，[理解Web开发](https://www.skillshare.com/site/join?teacherRef=3311891\&via=teacher-referral\&utm_campaign=teacher-referral\&utm_source=ShortUrl\&utm_medium=teacher-referral\&t=Understanding-Web-Development-A-Beginners-Guide-to-the-Web\&sku=1755504373)。

正如你将会在后面的章节了解到，我在第一份工作中，很快发现我更喜欢前端开发的工作，我更喜欢我的工作能在浏览器中及时展现。你可能会和我不一样，我的建议是，如果你不确定你更喜欢那种，你可以都去试试。

#### 语言，框架和库之间的区别

另一个比较重要的概念是，理解 语言，框架和库 之间的区别。

这是一个在 StackOverflow 上面的回答，我认为总结得很好。

![](https://1167499014-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LHTOivujRVHJygxG0vA%2F-LHd0UfRk8fhsohASaIf%2F-LHdAF0adl3ndz9T9c1h%2Fimage.png?alt=media\&token=fa1687bb-096e-4f74-be68-91f645563e33)

> 翻译图片的话：
>
> 语言是需要语义、语法的支持，才能构成的。框架是一些库的集合，能够帮你的编程变得更加简便。

翻译图片的话：

他们的差异性可能很难解释清楚，但是我能告诉你的是，可以先从语言开始。

如果你想从事后端开发，那么你选择PHP则是一个不错的选择。你可以在不使用框架的情况下，纯用PHP编写程序，不过你通常不会这样做。因为你在开发过程中，会发现很多东西都是通用的（例如认证和授权）。这时可以引入一些框架，在框架上实现代码，这可以帮助你节省不少时间，基本上每个程序都是这样搭建的。

库是一种模块化的代码，能够让你想实现一个功能时不需要自己花时间去编写，直接引用就好，能简化你写代码的过程。下面是一个引用jQuery（很火的JavaScript库）的例子：

```javascript
//找到文章所有段落中ID字段为 first 的摘要
//使用正常的 JS
var n = document.querySelectorAll("articl#first p.summary");
//使用 jQuery
var n = $("articl#first p.summary");

//很明显，使用框架的代码可以简洁不少。
```

如果你决定学习怎样用JS写前端代码，你需要很快的熟悉一下jQuery。

当你开始学习，获得相关经验时，你将会更好的理解这些核心概念之间的区别。所以不用担心，这些东西你都会慢慢了解到的。

就像我在前言里说的一样，这不是一本教你怎样去写代码的书，我希望带你快速了解一下开发者相关的一些概念。即使这些会有一些技术门槛，别担心，我们又要回到故事中了。

### 我是怎么学习编程的

我在前面列出来的那些学习网站，我基本都有尝试过。这里面有一个网站是我学得最多的，我学习的每一个语言或框架，都在这个网站上学习。这个网站就是 Lynda.com——一个课程总价超过十亿美元的网站，课程不仅仅是编程，还包含了设计和经商等你能想到的一切。

我发现 Lynda 提供了一个很好的基础教育，这里的导师不仅仅告诉你怎么去做，同时也告诉你为什么这样。就像编码这种比较偏实现的课程，你仍然需要知道你为什么要这样做。你应该像这样学习，去思考事物的本质，而不是表面上一步一步的实现。

在完成一些基本的前端课程后，我开始了第一个完整的课程——PHP与MySQL的基础训练，你可以在这里找到（​<http://bit.ly/2bkZTyP​>）。在完成这个课程后，我就能实现我在第一章提到的那个落地页项目。

不幸的是，这个我创建的网站已经不在线上了，这个网站可以说是十分基础的。它仅仅包含了3个页面：

* 第一个页面：一个落地页，执行一些点击和输入操作后，会有一些卖点和礼包发送至你的邮箱
* 第二个页面：感谢你填写了邮箱，同时希望你邀请你的好友也来这填写邮箱。
* 第三个页面：感谢页

我编写这个页面完全是从头开始的，我从这个项目中学到的知识就是：完全没有必要这样做\~

下面让我来解释一下为什么。

### 编程是模块化的

首先需要理解一个重要的事情，我们开发任何一个软件或者网站时，编程都是模块化进行的。编程语言十分实用，它让我们编码能更加简单，但是运行到计算机中，其本质都是一些0和1的组合。作为开发人员，你创造的每一个东西都是在基础框架之上开发的。

*Chris，你为什么要和我说这些？*

我告诉你编程都是模块化的，目的是我希望你能够知道，你在开发软件时，不应该所有的都从头开始编写。

当我在开发第一个项目时，我使用了PHP的库去：收集访问者的邮箱，将邮箱存入数据库，并且给他们发一个邮件。这是一个十分好的学习经验，但是我完全没有必要这样做，其实我可以使用很多已经开发好的自动化邮箱服务去做这件事情，这些服务也是免费的。（例如：[Mailchimp](http://mailchimp.com​)）

这就是为什么我们需要运用框架。就像搭建一个有授权&认证的登录系统，数据库的连接和页面布局十分常见，但是如果你不用框架，自己去实现，还是挺费劲的。

嗯，就这样，回到故事中吧\~

### 选择学什么内容

时间回到2014年，当我在编写那个收集邮箱的项目时，我仅仅会使用PHP，因为我最熟悉它。现在很多人会告诉你PHP已经过时了，我不能肯定或否定这种说法。

在2015年时，我决定将Web开发作为职业时，我就想着一个事情，找到一份工作。我当时翻来覆去的想，学习什么框架和语言才是最好的？在我几乎要选定JavaScript和Node.js的时候，我在当地共享办公空间，发现了一个活动，名字叫做：​Ruby on Rails: Installfest。

这个活动个很简单，就是安排一群 Ruby on Rails 的专家与新手见面，并告诉他们如何设置运行环境，并带他们一起开始第一个应用开发。我就是在我的家乡Brisbane发现RoR社区的，我去问了一些问题，并最终决定将RoR作为我的主要语言和框架。

### 开发者社区的力量

如果你想获得工作，你应该突破自己，尽可能多的学习到一些代码知识后，努力去联系一些开发者社区。

就我的经验而言，开发者之间的文化是，大家十分愿意互帮互助。通过线下聚会或线上聊天，我遇到的一些陌生人都十分愿意花费他们自己的时间来帮我解答任何编程上的难题，有时候会给到我一些机会，有时候仅仅是聊聊最新的语言或技术。你仅仅看一下现在免费软件的数量（绝大部分开源），就能知道开发者社区的氛围。

进入开发者社区能获取到很多好处，同时也比较容易做到。仅仅是搜索一下在你当地，有没有一些不同语言的开发者聚会就行，可以使用Meetup.com，或者是加入一些开发者论坛或群组，例如：Slack的开发者群组。

通过RoR installfest事件后，我在我的家乡发现了一个强大的Ruby语言社区。每个月，RoR开发者们都会在一个郊区图书馆中，听相关嘉宾发言，然后在晚餐后，通过网络交流。我就是在这里找到我的第一份工作的。
