<audio id="audio" title="70 | 程序员练级攻略：零基础启蒙" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/2d/8f/2d8817d9ebe4736e6200f26710fad08f.mp3"></audio>

如果你从来没有接触过程序语言，这里给你两个方面的教程，一个偏后端，一个偏前端。对从零基础开始的人来说，最重要的是能够对编程有兴趣，而要对编程有兴趣，就要有成就感。而成就感又来自于用程序打造东西，所以，我推荐下面这份不错的入门教程。

第一份入门教程，主要是让你体会到编程是什么。

- [《与孩子一起学编程》](https://book.douban.com/subject/5338024/) ，这本书以Python语言教你如何写程序，是一本老少咸宜的编程书。其中会教你编一些小游戏，还会和你讲基本的编程知识，相当不错。
- 两个在线编程入门的网站：[Codecademy: Learn Python](https://www.codecademy.com/learn) 和 [People Can Program](https://www.peoplecanprogram.com/) ，你也可以在这两个网站上学习Python，只不过是英文的。

然后，你可以到 [CodeAbbey](http://www.codeabbey.com/index/task_list) 上去做一些在线编程的小练习。

第二份入门教程，主要是让你做点实际有用的东西。嗯，做个网页吧。

- [MDN的 Web开发入门](https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web) ，MDN全称是Mozilla Developer Network，你可以认为是Web方面的官方技术网站。这个教程会带着你建立一个网站。然后，你可以把你的网页发布在GitHub上。

这两份教程都很不错，都是从零开始，带着你从环境准备开始，一点一点地从一些简单又有意思的东西入手，让你感觉一下编程世界是什么样的，相信这两个教程可以让零基础的你喜欢上编程。

# 编程入门

在这时，我们使用Python和JavaScript作为入门语言。Python就不用多说了，语法比较简单，有大量的库和语法糖，是零基础的人学习编程的不二之选。而JavaScript则是前端的语言，为了让你更有编程的成就感，所以，这也成了一门要学习的语言。（注意：对于计算机专业的学生来说，一般会使用Pascal做为入门的编程语言，但我觉得编程入门还是要以培养兴趣为主，所以，还是选一些能让人有成就感的语言会更好）。

## 入门语言Python

如果你想更为系统地学习一下Python编程，我强烈推荐你阅读下面这两本书。它们是零基础入门非常不错的图书，里面有大量的更为实用的示例和项目，可以快速给你正反馈。

- [Python编程快速上手](https://book.douban.com/subject/26836700/)
- [Python编程：从入门到实践](https://book.douban.com/subject/26829016/)

这两本书除了编程语法方面的讲述有所不同之外，其他都差不多，主要是通过书中的示例来强化你对编程的学习。第一本偏文本处理，包括处理Word、Excel和PDF，第二本中有一些Web项目和代码部署方面的内容。如果可能的话，你可以把两本书中的示例都跑一遍。如果你时间有限的话，我推荐你看第二本。

[编辑植入：极客时间上也有Python入门的视频课程。]

## 入门语言JavaScript

如果想入门学习JavaScript，我主要推荐以下在线教程。

- [MDN JavaScript教程](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript)，你可以认为这是最权威的JavaScript官方教程了，从初级到中级再到高级。
- [W3School JavaScript教程](http://www.w3school.com.cn/js/)，这个教程比较偏Web方面的编程。
- [JavaScript全栈教程（廖雪峰）](https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000)，这是廖雪峰的一个比较偏应用的教程，也是偏Web方面的编程，同时包括涉及后端的Node.js方面的教程。

## 操作系统入门Linux

学习编程你还需要会玩Linux，虽然Windows占据着更多的桌面市场，但是你还是要了解Linux。这里，你可以看一下，W3CSchool上的在线教程 [Linux教程](https://www.w3cschool.cn/linux/)。

## 编程工具Visual Studio Code

这里主要推荐时下最流行也是最好用的Visual Studio Code，这个工具潜力十足，用它开发Python、JavaScript、Java、Go、C/C++都能得心应手（[教程](https://jeasonstudio.gitbooks.io/vscode-cn-doc/content/)） 。

## Web编程入门

如果玩到这里，你觉得有趣的话，可以学习一下Web方面的入门知识。**为什么是Web而不是别的其他技术呢？因为你正身处于第三次工业革命的信息化浪潮中，在这个浪潮中，Web互联网是其中最大的发明，所以，这是任何一个程序员都不能错过的**。

关于Web编程，有下面几个方向你要学习一下。

<li>
**前端基础**。要系统地学习一下前端的知识，也就是CSS、HTML和JavaScript这三个东西。这里还是给出MDN的相关的技术文档页面 [CSS文档](https://developer.mozilla.org/zh-CN/docs/Web/CSS) 和 [HTML文档](https://developer.mozilla.org/zh-CN/docs/Web/HTML) 。**文档很大，你要学习的并不是所有的东西，而是了解CSS和HTML是怎么相互作用来展示数据的，然后，不用记忆文档中的内容，这两个文档是用来查找知识的。** 另外，你可以简单地学习使用JavaScript操纵HTML。理解DOM和动态网页（可以参看 [W3Schools的JavaScript HTML DOM的教程](https://www.w3schools.com/js/js_htmldom.asp)）。
</li>
<li>
**后端基础**。如果你想省点事，不想再学一门新的语言了，那么你可以直接用Python或者Node.js，这两个技术在前面提到的廖雪峰的那个教程里提到过。当然，如果你想试试另外一种脚本型的也是比较主流的编程语言，那么可以搞搞PHP，它也是很快就可以上手的语言。学习PHP语言，你可以先跟着 [W3School的PHP教程](http://www.w3school.com.cn/php/index.asp) 玩玩（其中有连接数据库的MySQL的教程）。然后，以 [PHP的官网文档](https://php.net/manual/zh/)  作为更全的文档来学习或查找相关的技术细节。
</li>

下面是一些学习要点：

- 学习HTML基本语法。
- 学习CSS如何选中HTML元素并应用一些基本样式。
- 学会用 Firefox + Firebug 或 Chrome 查看你觉得很炫的网页结构，并动态修改。
- 在一台Linux机器上配置LEMP - Ubuntu/Nginx/PHP/MySQL这个环境。
- 学习PHP，让后台PHP和前台HTML进行数据交互，对服务器响应浏览器请求形成初步认识，并实现一个表单提交和反显的功能。
- 把PHP连接本地或者远程数据库 MySQL（MySQL 和 SQL现学现用够了）。

这里，你可能会问我，入门时有三个后端语言，一个是Python，一个是Node.js，一个是PHP，你对这三门语言怎么看？老实说，Python我还看好一些，PHP次之，Node.js最后。原因是：

<li>
Python语言的应用面还是很广的。（当然，性能可能会有一些问题，但是用于一些性能不敏感的和运维或是一些小工具相关的，还是非常好用的。另外，Python的应用场景其实还是很多的，包括机器学习和AI也有Python的身影。用Python来做一些爬虫、简单的中间件、应用或是业务服务也是很不错的。）
</li>
<li>
PHP也是一个比较主流的简单的语言（PHP在目前来说还是一个比较主流的语言，但其发展潜力有限，虽然可以让你找得到工作，但是一般玩玩就行了）。
</li>
<li>
Node.js 号称 JavaScript 的后端版，但从目前发展来说，在后端的世界里，并不能承担大任，而且问题很多。一些前端程序员用它来做后端的粘合层，我个人觉得这样做法只是掩盖前后端配合有问题，或是接口设计思维上的懒惰，我还是希望前端程序员应该认真学习一门真正的后端语言。
</li>

当然，这里只是让你感觉一下，**Web前端编程的感觉，只是为了入门而已。所以，对于这些语言你也不用学得特别精通，感觉一下这几个不同的语言就可以了，然后知道相关的文档和知识在哪里，这样有助于你查阅相应的知识点**。

# 实践项目

无论你用Python，还是Node.js，还是PHP，我希望你能做一个非常简单的Blog系统，或是BBS系统，需要支持如下功能：

- 用户登录和注册（不需密码找回）。
- 用户发贴（不需要支持富文本，只需要支持纯文本）。
- 用户评论（不需要支持富文本，只需要支持纯文本）。

你需要从前端一直做到后端，也就是说，从HTML/CSS/JavaScript，到后面的PHP（Python/Node.js），再到数据库。这其中需要你查阅很多的知识。

这里有几个技术点你需要关注一下。

1. 用户登录时的密码不应该保存为明文，应该用MD5+Salt来保存（关于这个是什么，希望你能自行Google）。
1. 用户登录后，对于用户自己的贴子可以有“重新编辑”或 “删除”的功能，但是无权编辑或删除其它用户的贴子。
1. 数据库的设计，你需要三张表：用户表、文章表和评论表，它们之间是怎么关联的，你需要学习一下。这里有个PHP的blog教你怎么建表，你可以 [前往一读](https://code.tutsplus.com/tutorials/how-to-create-a-phpmysql-powered-forum-from-scratch--net-10188)。

如果你有兴趣，你可以顺着这个小项目，研究一下下面这几个事。

- 图片验证码。
- 上传图片。
- 阻止用户在发文章或评论时输入带HTML或JavaScript的内容。
- 防范SQL注入。参看[PHP官方文档](http://php.net/manual/zh/security.database.sql-injection.php) 或 [微软官方文档](https://technet.microsoft.com/zh-cn/library/ms161953%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396)，或者你自己Google一下。

上面这些东西，不是什么高深的东西，但是可以让你从中学到很多。相信你只需要自己Google一下就能搞定。

## 小结

接下来，我总结下今天的内容。首先，我推荐了Python和JavaScript作为入门语言，以让你尽快上手，获得成就感，从而激发你想持续学习的热情。随后介绍了Linux操作系统、Visual Studio Code编程工具、Web编程入门等方面的学习资料，并给出了学习要点。最后，我给出了一个实践项目，帮助你理解和巩固今天所学的内容。

消化好了今天的内容，就准备好精力迎接后面的挑战吧。下篇文章中，我们将正式入门学习该如何编程。

下面是《程序员练级攻略》系列文章的目录。

- [开篇词](https://time.geekbang.org/column/article/8136)
<li>入门篇
<ul>
- [零基础启蒙](https://time.geekbang.org/column/article/8216)
- [正式入门](https://time.geekbang.org/column/article/8217)

- [程序员修养](https://time.geekbang.org/column/article/8700)

- [编程语言](https://time.geekbang.org/column/article/8701)
- [理论学科](https://time.geekbang.org/column/article/8887)
- [系统知识](https://time.geekbang.org/column/article/8888)

- [软件设计](https://time.geekbang.org/column/article/9369)

- [Linux系统、内存和网络（系统底层知识）](https://time.geekbang.org/column/article/9759)
- [异步I/O模型和Lock-Free编程（系统底层知识）](https://time.geekbang.org/column/article/9851)
- [Java底层知识](https://time.geekbang.org/column/article/10216)
- [数据库](https://time.geekbang.org/column/article/10301)
- [分布式架构入门（分布式架构）](https://time.geekbang.org/column/article/10603)
- [分布式架构经典图书和论文（分布式架构）](https://time.geekbang.org/column/article/10604)
- [分布式架构工程设计(分布式架构)](https://time.geekbang.org/column/article/11232)
- [微服务](https://time.geekbang.org/column/article/11116)
- [容器化和自动化运维](https://time.geekbang.org/column/article/11665)
- [机器学习和人工智能](https://time.geekbang.org/column/article/11669)
- [前端基础和底层原理（前端方向）](https://time.geekbang.org/column/article/12271)
- [前端性能优化和框架（前端方向）](https://time.geekbang.org/column/article/12389)
- [UI/UX设计（前端方向）](https://time.geekbang.org/column/article/12486)
- [技术资源集散地](https://time.geekbang.org/column/article/12561)
