2019年5月20日

学了编程,你就脱离了麻瓜的行列

学了编程,你就脱离了麻瓜的行列

“在任何一项足够先进的技术和魔法之间,我们无法作出区分。”这是著名科幻作家亚瑟·克拉克在1973年做出的论断。

文/欧剃 编辑/肉圆


现代社会的我们,已经在研发并驾驭各种“魔法”:手机的普及,让我们对着那个方块做做手势,就能和千里之外的人面对面说话;无人车的兴起,让一辆冰凉冷酷的车能学会人类语言,自动解锁并打开车门;Amazon Alexa、Google Home等下一代智能家庭AI的出现,使得人们将能够拥有一名永不疲倦的魔法管家,为你处理各种个人事务。

可以说,我们所有人现在都活在一个迥异于过去的魔法时代里,使用着高技术大神们制造的魔法物品,见证着一个又一个的奇迹。那么,你有没有想过,如果你也能学会这样的“魔法”呢?你是否也能利用手边的电子设备,施展自己创造的“独门法术”呢?

答案是肯定的。

撇去高深的自然科学理论不谈——那些往往需要奋斗终身的钻研——普通人最容易入门,也最容易在日常生活中施展的“魔法”,就是计算机程序,也就是俗称的“编程”。

所以,编程到底是干啥的?

提到编程,很多没玩过的同学,大概会觉得这就是那种修电脑的技术宅们才会干的事,要成天面对着那种天书一样的一行行密密麻麻蝌蚪文实在是太恐怖了,谁想学啊!

其实,编程不是太高深莫测的玩意,起码作出一个能用的东西一点也不难。它本质上和你在手机上设了个闹钟差不多——都是给计算机下达了一个带有数据的命令,以便让它帮你完成某个特定的任务。只不过在手机上你数通过按钮或是图形的界面指定个时间,而编写程序的时候你是通过一个编辑器给电脑下达你要它做什么事的具体命令。

和几十年前的编程语言不同,现代的程序员们,已经把现代的编程语言弄成很类似自然语言的语法了,只要你会认一些基本的英文单词——好消息,这门”语言“不需要你天天背单词——再加上一点点逻辑组织能力,你就能用这种语言和计算机交流,让它替你干活。

听起来是不是很厉害?

也许有的同学会觉得,啊,这难道又是要学一门外语,太可怕了,又没什么用,我不玩…

其实不是这样的。

学习一门外语,是跟某个类群的人沟通,通过这门语言,了解他们的文化、艺术、思想;而学习一种编程语言,不但能和所有支持这种编程语言的计算机沟通,给它们下命令,还能和世界上各个不同地方的人通过代码进行交流,了解别人是怎么处理解决他们遇到的问题的——所以代码托管网站 GitHub 被戏称为”全球最大的同性交友平台“…

哪些事情适合交给程序来做?

就像不同的工具适合做不同的事情一样,编程这件事,也有它擅长(容易实现)和不擅长的方面。

虽然程序员的智慧是无穷无尽的,程序能够完成的事情也是没有边界的,但从初学者来说,有这么几种事情,你可以很轻松地用编程这个工具完成:

  1. 大量、重复的事情:
    1. 小红去云南旅游,拍了八千多张照片,想要按拍摄日期和时间把这么一大堆文件分到不同的文件夹里方便整理,小明帮她写了几行代码,双击运行,就搞定了!
    2. 小王要从历年的几百份各部门的Excel表格里,汇总出所有以往的业绩数据,一个一个 Excel 复制黏贴查询,又慢又容易错,写个程序来计算吧,一下子汇总表就出来了!
    3. 老师说不会背的课文抄20遍,交给程序吧,下节课就被老师罚站了……
  2. 自动化的事情:
    1. 在电脑上运行一个程序,每天自动用微信发天气预报信息给你的男神/女神
    2. 每天下班后自动备份工作文件夹到移动硬盘
    3. 自动上网抓猫图,保存下来做壁纸!
  3. 数学计算:这不用说了吧,让电脑帮你算数学题是不是比自己笔算快速清楚的多呢?
  4. 搭建简单的网络服务器。

当然,Python能做的远不止这些,它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)和其他与系统有关的操作——但现在你不需要了解那么多,放手去玩!

说到底,编程这种东西也不过就是一种工具,和日常接触到的各类工具并没有本质的区别,它创造出来就是为了满足人类的需求。经过一小段时间的学习,通过自己写出的一点东西,能够把自己想要的事情完成,这就是编程的目的所在,也是它能给你带来乐趣和成就感的地方。这种利用“魔法”驾驭一切的感觉,不试一试怎么知道喜不喜欢呢?  

我想试一试,但我要怎么开始才好?

从一门简单易学的编程语言开始

在这里,我郑重跟各位推荐 Python,大家别被这个名字吓到,这门语言的创造者Guido van Rossum是根据英国广播公司的搞笑节目“蟒蛇飞行马戏”(Monty Python’s Flying Cirecus)来命名这个语言的——并非他本人特别喜欢蛇缠起它们的长身躯碾死动物觅食。(笑)

img

为什么推荐Python呢,据 《A Byte of Python》 概括,这主要有以下几大理由:

  • 简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。
  • 易学:就如同你即将看到的一样,Python极其容易上手。前面已经提到了,Python有极其简单的语法。
  • 免费、开源:Python是FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。这是为什么Python如此优秀的原因之一:它是由一群希望看到一个更加优秀的Python的人创造并经常改进着的。
  • 高级语言:当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
  • 可移植性:由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有 Python 程序无需修改就可以在一大堆各种任何平台上面运行。

有人说,Python 是一种非常适合初学者驾驶的好车。你可以不要驾驶证就开它上路。一般来说你不需要其它车,除非你想要开得飞快或者经过非常危险的地带。

Q:Python有两个不同的版本,我该选择2还是3?

A:Python2.x是已经进入稳定状态的Python版本,Python3.x是开发更加活跃的面向未来的版本。它们在语言的特性上有略微的不同,但还不至于相差太大。

至于选择哪个版本,要根据你未来的使用方式而定。一般来说,大部分的Linux和MacOS设备都默认预装了Python2,而且旧版本支持的第三方库也更多;但Python 3 更新,提供了更舒服的字符编码处理机制。

所以,如果你需要处理中文文本,或者你并不需要用到某些只有在Python 2上才能运行的库,那你或许应该从 Python 3 开始你的学习之旅。

磨刀不误砍柴工,选择趁手的工具

为了编写存储程序代码的文本文件(所谓源代码、源文件),我们需要一个趁手的编辑器。 《A Byte of Python》的作者,Swaroop, C. H. 对初学者的建议是:

“挑选一个编辑器确实是极其重要的。你挑选一个编辑器就如同你挑选一辆你将购买的轿车一样。一个好的编辑器会帮助你方便地编写Python程序,使你地编程旅程更加舒适,帮助你更加快捷安全地到达目的地(实现目标)。”

对于编辑器的基本要求之一是语法加亮功能,利用这一功能,你的Python程序的不同部分被标以不同的颜色,这样你可以更好看清楚你的程序,使它的运行显得形象化。

如果你使用Windows,那么我建议你使用IDLE。IDLE具备语法加亮功能,还有许多其他的功能,比如允许你在IDLE中运行你的程序。特别值得注意的是:不要使用 Notepad——它是一个糟糕的选择,因为它没有语法加亮功能,而且更加重要的是,它不支持文本缩进。而我们将会看到文本缩进对于我们来说极其重要。一个好的编辑器,比如IDLE(还有VIM)将会自动帮助你做这些事情。

如果你使用 Linux/FreeBSD,那么你有很多种选择。如果你是一个初学编程的人,那么你可以使用 GEdit/Kate。倘若你是一位有经验的程序员,你一定已经在使用 VIM 或者 Emacs 了。勿庸置疑,它们是两个功能最强大的编辑器。使用它们编写你的 Python 程序,你将从中受益。我个人使用VIM编写我的大多数程序。只要你愿意花时间学习使用 VIM 或 Emacs,那么我强烈建议你一定要学习两者之一,因为从长远看来它们对你是极其有帮助的。

选择适合你学习方式的教程

目前初学者比较容易接触到的Python教材大致有以下两类(文末有具体推荐):

一类是文字材料,例如实体书、电子书、网络教程和程序文档等。文字教程的好处在于信息密度大,学习中遇到不懂的内容可以随时翻出来查阅,书中的文字材料/代码段可以直接复制出来运行,方便看到运行结果。

另一类是多媒体教材,例如MOOC课程、视频课程、自学APP等。多媒体资料的好处在于直观、互动性强,能清楚明了的通过动画、视频的演示了解教学内容的关系,一些课程在视频的中间还夹有小问题等元素,方便立刻复习刚讲授的内容。

不管选哪个,结合教材中的实例代码,反复修改、运行把玩,通过不同的修改和输出来了解代码的执行原理,都是非常重要的环节。多动手吧!

那么,入门的时候要怎么做?

懂得查

啊,我明明按照教程做的,怎么跳出这么多红字?

Python程序在运行时遇到的错误,通常都会显示详细的行号和错误信息,方便用户查找修正。遇到自己不认识的错误信息时,别慌,先仔细看看错误信息的描述,再打开你的文件,找到出错的行号。

如果靠自己弄不明白出错在哪,首先建议对照Python入门指南或Python官方文档(见文末),查找错误信息的意思(善用 Ctrl+F 页面内搜索),对照修改自己的代码。

如果问题过于诡异,就要好好利用 Google 或者必应的搜索引擎,搜索你遇到的具体问题和错误信息,通常情况下,基础性的语法和逻辑问题还是比较容易解决的。

懂得想

假如经过上面的步骤,依然没有解决我的问题,该怎么办呢?

耐心一点,不要指望Google搜索几秒钟就能解决一个复杂的问题。如果你第一次搜索没有结果(或者结果太多),也不要抛出一堆问题,回答者对有针对性的问题更容易给出切实可行的答案。在真正开始提问之前,先稍微放松一下,再深入地思考一下问题。

值得注意的是,思考并不是盯着屏幕上的代码发呆,你要动起手来,通过搜索得到的信息,尝试修改你的代码中“可能有问题”的部分,并观察它的输出结果,逐步定位问题产生的原因;或是通过修改从网山搜到的别人代码,研究它的运行情况,来了解别人是如何解决特定问题的——思考的方向往往会成为解决问题的关键。

通过思考,尝试描述自己遇到的问题的具体细节,往往也是解决问题的关键。

懂得问

可我想破了脑袋还是搞不明白,救救我啊!

这点我放到最后来说,因为如何提出一个好问题,往往是解决问题的一半。

当然,对初学者来说,大家会比较宽容,不用担心你提的问题太简单或“太傻”,但务必表示出你的认真和用心,不要做伸手党。

除了学习QQ群和一些在线课程的讨论区之外,有几个主要的问答网站:

在真正在这些网站上问问题前,请最后再在这两个网站上搜索一遍你要问的问题的关键字——毕竟很多新手容易遇到的问题,在这些网站上可能早就已经有人回答过了。

那么,当你排除了以上的一切,要准备开始询问时,应该怎么组织自己的问题呢?这里有几点建议:

1. 话不在多而在精

你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中。第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加; 第二,简化问题使你更有可能得到有用的答案; 第三,在你精炼自己问题的过程中,你很可能就自己找到了解决方法。

2. 描述错误信息,不做猜测

向别人陈述你的猜测是没有用的(如果你的诊断理论真的那么有用,你还会向别人求助吗?)。所以,你只需要告诉他们问题的原始状态,而不是你的解释和理论,让他们来解释和诊断。

3. 描述目标而不是过程

如果你想知道如何做某事,但按照你的理解去实现的过程中卡住了,你需要在开头就表明你的目标,然后再陈述你遇到问题。

(以上三点建议来自 Eric S. Raymond 的《How To Ask Questions The Smart Way》,译者:Ryan Wu,建议初学者抽空阅读中文版全文,必有收获)

学习中会遇到的困难

当你选择了学习编程,在之后很长一段时期内,你的业余时间都会被它所占据,而且在头几天过后,学习曲线会逐渐变陡,你将感受到枯燥、迷茫、自卑以及脑汁耗竭的痛苦。

这是非常正常的情况。许多人(包括我自己)在学习一门新技术的时候都会遇到类似的问题。对此,我个人的解决办法有:

1、找点乐子。

当你看完了基础的语法,对继续往下挖掘感到枯燥时,不要勉强自己,翻一翻书本,找一些有趣的练习题(例如这本书中每个章节背后都有一些实例和习题)练练手,或者编写、修改一些简单而有趣的小项目,甚至尝试跟你的朋友讲述你学到的新内容,给自己找点成就感。

2、专注在当前的学习目标上。

没有技术背景的人学习编程很容易被错综复杂的技术体系吓到,网上的教程中也经常会出现“一定要读这本书,非常经典”、“最好先有 XX 基础再看这篇教程”之类的所谓警告,结果有时候会出现这样的情况:本来你只打算学习编写网页 ,结果几天后莫名其妙地开始苦读《精通正则表达式》。

别担心,你不需要掌握所有这些分支才能继续往下走,很多时候你只要知道在需要某个知识点的时候,能从这类复杂的教程中找到对应的用法即可。

3、习惯无知。

无论学习什么东西,往往越深入就越觉得自己无知。这样的无知本身并不是坏事,它可以让你保持谦虚,但千万不要被它吓得不敢继续前进。

觉得自己做的不好?觉得写出来的代码就像一坨屎?很正常,这是因为你看过的例子和学到的知识增进了你的眼界,但编程技能和编程思想需要在练习中成长,所以暂时跟不上你的眼界。千万不要因此而自卑,继续尝试,相信自己的能力。

4、注意休息。

人的认知能力是会随着时间流逝而耗竭的,别逞能,站起来走动走动,呼吸一下新鲜空气吧!

分享一些学习资源

文字教材

适合自学者阅读参考,也适合在学习视频教程的过程中翻看查阅。

  1. 简明python教程,如果你对电脑知识的了解仅限于如何保存文本文件的话,那这本书就是为你准备的。
  2. 《Think Python》,确实非常浅显易懂,把很多概念用非常朴实的话进行了解释,同时,这本书还引导你慢慢习惯从程序员的角度去思考并解决编程中遇到的问题。
  3. Python 官方入门指南中文版:
  4. Python 官方文档(英文,方便速查)

视频课程

适合互动教学和系统性地学习。这里分享几个我本人学过,而且觉得不错的课程吧!

自学App

Sololearn - Python3 https://www.sololearn.com/Course/Python/

通过简洁的语言介绍Python3的基础语法,每一小段都自带Quiz,适合出门在外用来复习语法基础。

编程一小时 - 在线小游戏,边玩边学 https://hourofpython.trinket.io/ke3-shi4-hua4-python-jian3-jie4

网页版Python命令行,不需要真正安装软件,就可以在这里尝试运行许多命令:

在线Python游乐场,你可以将代码粘帖在这里,直观地看到运行情况:

最后,祝各位新晋魔法师学习顺利,给这个世界创造出更多美好和便捷!