2. 编程模块
本期改版做了什么
过去的 wiki 采用的方式是,将我们认为适合大家的内容直接明了的翻译或者改编,并且针对大伙的情况从国外的优质课程中挑选了一部分,其优势在于全,但劣势在于我们无法轻易的找到适合自己的项目,并且整体结构非常纷乱繁杂。
在全新的改版内容中,我们的 wiki 会以项目为核心导向,以 C 和 python 两个在高校中发挥作用最大的两种语言作为核心内容,讲诸多仍然有效的的内容放在杂谈之中。
如何入门
先 “run” 起来
这是我的第一个也是最重要的建议。
无论是学一门语言,还是学一个工具:尽可能地先用最短的时间搞懂这个东西是做什么的,然后以最快的方式把它 “run” 起来。
当你已经能跑起一个语言、一个工具的最简单的示例的时候,再去花时间慢慢了解背后的复杂的内容,再去拓展即可。先用起来,跑起来,带着问题去翻资料。
- 比如学写 C 语言,我建议大家直接打开在看的教程的第一章,把代码复制到这个在线编译的网站里,点一下 "Run it" 看效果。为什么要去详细了解编译器、编辑器、IDE、gcc、g++、make 这种东西?能最快地上手,最快地运行看到效果,对于初学者来说是最好的。等你把环境装好了,人家已经学完三章了。当你已经会了简单的循环、判断、函数,已经建立了信心,就可以慢慢地去看那些让人头疼的东西了。
- 比如学 Linux,如果你电脑操作系统是 MacOS,直接打开 “终端”,可以勉强当 Linux 使;如果你是 Windows,直接跟着微软的 WSL 安装教程,一步步无脑地用鼠标点击然后装起来。这时候你就拥有一个 Linux 了,再对着教程去敲。等闲下来了就可以了解了解内核是什么,发行版是什么,去了解云服务器,去了解不同的装 Linux 的方式。
为什么要这样?
- 第一,计算机是很重实操的东西,不要光看所谓的理论不动手。动手是王道。
- 第二,要尽可能多地、尽可能快地给自己找一些正反馈,学编程不是当苦行僧
- 第三,很多东西没必要学,学了也忘。用到了再去学,是最省事最容易记住最高效的。
- 第四,程序员这一辈子会接触无数的新的东西,如何快速上手一个东西,是非常重要的能力。
任务 / 项目驱动
任务 / 项目驱动的意思承接上文,意思就是不要瞎看文章,不要让阅读教程和学习课本成为你的驱动力,等你看完一本 C 语言的书,一行代码就没敲,你就 g 了。
那么该怎么学呢?
先简单地会一样东西的最核心的部分,再去找一个实际的编程场景、编程任务、项目。你会在完成这个项目中遇到各种各样的问题,无论是遗漏了知识点还是压根没思路,这时候不断地用搜索引擎来学习。
举个例子:你想做一个小程序,来检测某电影院的电影预售。程序大概要做到不断刷新网页,一检测到这个电影预售了,就马上发短信给自己手机(或者直接帮你抢)
- 你通过搜索引擎或者从不知道哪个学长 / 学姐那里得知,这玩意叫爬虫(简单来说就是用程序抓取网页上的内容)。我们又通过搜索引擎得知,python 写爬虫最舒服。
- 我们又通过例如菜鸟教程这种最简单的极速入门教程,在 3 个小时内掌握了 python 的核心语法。
- 这时候我们开始写代码了,但是我该怎么获取到网页啊?这时候,你在浏览器里分别搜索了以下几个内容:“程序如何获取网页内容”。
- 你会学习到 http 相关的知识,大概知道了我们平时打开网页可以简单理解为一次 http GET。
- 可是,还是好抽象啊,python 又怎么才能获取到网页的内容啊?这时候,你在浏览器里精确了一下搜索内容,“python 如何获取网页内容”。
- 搜索引擎会告诉你,可以用诸如
requests
一类的库来请求网页。但问题又来了,这个库一下子会返回整个网页内容,我怎么才能筛选出我要的电影有没有放出来? - 这时候你又去搜索,学会了怎么解析网页。比如用
xpath
,bs4
, 甚至直接用正则。 - 我们现在能不断地刷新网页,并且筛选出所有的电影的信息,然后分析出自己想看的那个电影有没有放出来了。但是问题又来了,怎么让程序给自己发信息啊?
- 这时候又打开了浏览器,我们可以知道诸如阿里云、腾讯云这样的云服务商提供了发短信的服务,并且会教你怎么写代码,主要注册、申请一下,就能发短信了。
- 但是你又会发现这个申请流程真 tm 麻烦,我还是发邮箱吧!这时候又开始搜,如何用 python 发邮件。
- 然后你会了解到 python 用于发邮件的一些库,以及简单的邮件协议的知识,如
POP3
- 程序真的能如期运行了,能不断刷新、获取网页内容、解析内容以判断电影是否上映,上映了还会发邮件给你。
- 又又又出问题了!!!你发现程序出错了,因为你请求频率过高,电影院的网站发现你是爬虫了,把你给 ban 了!这时候你知道了 “反爬” 这个概念,就是反爬虫,类似于外挂和反外挂。你开始学习反爬的知识。
- 你了解到可以给程序挂个 “代理”,相当于每次请求网页的时候,都伪装成了世界上上某个角落的另外一台电脑的请求。
- 能走到这里太艰辛了,但你很快又发现了问题!现在程序是跑在自己的电脑上的,我们不知道电影院啥时候放票,所以程序得一直跑着,但是电脑会关机啊,关机了还怎么抢???
- 这时候你了解到了服务器的概念。服务器可以简单地了解为一台远程的几乎从不关机的电脑,一般用的是 Linux 操作系统。
- 这时候你又开始去学 Linux,当然不是非常系统地学,而是像我之前说的,以最快的方式知道它是做什么的,然后运行起来。比如可以直接在阿里云、腾讯云、AWS 等云服务器商那里购买。甚至也可以用自己的旧手机装个 Linux 等等,这些都是后话了。
- 服务器是远程的,我们怎么连上去操纵它呢?我怎么把我的 python 代码传上去呢?这时候你又去求助万能的搜索引擎,或者神秘的学长学姐。你知道了世界上有
ssh
、ftp
、sftp
这些东西。
以上的 “简单” 的例子,就是所谓的任务驱动。带着目的去学,带着任务去学,带着问题去学,快速搞定。在上面的例子中,如果能成功走完,你会学到编程语言本身、学到网络知识、学到 Linux 服务器及其相关操作、学到云服务器和各种云服务(例如短信服务)。更重要的是,每一次从问题到答案的搜索与解决过程,你的编程内功就增强了一波。以后上手一个新东西,或者遇到问题再去解决它的速度,只会越来越快。
刚开始你可能什么都不会,什么地方都被阻塞,但当你把坑踩遍了。就发现,哎嘿,不好意思,这玩意我怎么又会!
所以让我们基于这个 “任务驱动”,再看看本章的内容。这些内容大多看了就忘,因为细节非常多,而且并不一定能解决你手头上的问题。但这些文档,带你领进了新的领域的大门,让你的工具箱里多了一个可以解决问题的工具,以后用到了可以想起他们。并且,这些文章多是通俗的,且作者多是讲述了 ta 所认为的该语言 / 工具的最核心、最精华的部分,或者说第一次入门最需要学习的部分。