业余爱好者如何学习编程
因为 Aaron Swartz 的自杀,这两天看了不少关于他的报道以及他自己的博客,对我触动最大的是尽管他一直在做技术相关的事情,但眼光和理想却远远超越了技术。他把技术当作推动自由和社会变革的工具,所以 Twitter 签名也是 "Applied sociologist", 而不是经常可以在程序员那里看到的 "Geek" 和 "Hacker" 等。我非常钦佩他的社会理想和为之做出的努力,然后开始思考自己可以做些什么,于是就有了这篇文章。
现在有关编程的书籍非常多,网上也有很多教程,但大多都是针对职业程序员或者计算机专业的学生,对那些只想实现一些自己想要的东西的业余爱好者帮助不大。业余爱好者并不想以编程为职业,也不想花太多时间去学习基础,他们只是想尽快做出自己想要的东西。这样的东西在专业程序员看来可能很烂,但我觉得非常有意义。会编程的人越多,信息流动的渠道就越多,做出好玩的东西的机率也越大。
我的技术水平一直不怎么样,而且越来越业余,不过正因为如此,我非常能体会初学者的痛苦,或许写这样的东西正合适。本文的目的是帮助业余爱好者扫清一些思想上的障碍,分享一些我的经验,并不会涉及太多技术细节,毕竟每个人想做的东西和想学的编程语言都不同,不过后面会给出一些学习资料。
重要声明:本文只针对那些不想以编程为职业,只想学习编程以便自己做东西的业余爱好者。想要成为一个优秀程序员的同学请看这篇经典的《十年学会程序设计》。
思想准备:
1. 编程不难,至少做出一个能用的东西不难。别把它当回事儿。很多人之所以觉得编程很难是被专业术语和趾高气扬的程序员吓到了。别担心,业余爱好者不需要对自己要求那么高。
2. 编程不需要数学基础。没错,就算你数学很烂也能做出东西。大部分算法都已经有成熟的解决方案,可以直接拿来用,完全不用担心。我们的目的是做东西,不是研究算法和数学。
3. 编程不会改变你的生活方式。你完全可以学习编程而不接受和它有关的文化。不一定要崇拜某位大神、阅读技术新闻或者参与社区,也不一定要不修边幅、熬夜工作。如果愿意的话,精装打扮穿上最漂亮的衣服去编程也可以。反正不想成为职业程序员,不用担心因为「不像程序员」而被鄙视。
4. 有很多友善的程序员。程序员给很多人的印象要么是邋遢、木讷、害羞的书呆子,要么是性格怪异、智商极高的大神,其实大部分程序员并不是那样,只不过媒体和大众更偏爱怪异的东西。以 Linus 为例,在他的自传 《Just for Fun》 中提到:
「Linux 不是靠牺牲宝贵的睡眠时间换来的。事实上,如果你想听真话,那我就要说,我更喜欢睡觉。」
「在那个时候,只要一想到姑娘,Linux 系统就变得不再重要了。在某种程度上,今天也还是这样。」
瞧,这位大神其实大部分时间和普通男性差不多,更喜欢「睡觉」和「姑娘」。所以,如果真的遇到了无法解决的问题,完全可以大胆地去请教专业程序员们,一般都可以得到答复。
5. 习惯无知。无论学习什么东西,往往越深入就越觉得自己无知。这样的无知本身并不是坏事,它可以让你保持谦虚,但千万不要被它吓得不敢继续前进。及早适应无知的感觉,你并不需要全知全能才能做出东西,如果觉得困难,可以试着假装自己擅长编程 。
如何开始:
首先,完整阅读这篇文章:《你第一要做的是开始去做》(这篇文中翻译自 The first step is to start )。
如文中说的那样,不要以「基础不够」、「知识不全」等借口停下来,一开始甚至可以先在纸上勾勒出想要的东西。当然,完全不懂编程肯定无法开始真正的创造,但学习的时候不要抱着「先专心学习,学好本领再回来做」的念头。正确的做法是:只学那些最基础的东西,然后立刻着手去做,遇到不会的地方再去学。
没有技术背景的人学习编程很容易被错综复杂的技术体系吓到,网上的教程中也经常会出现「一定要读这本书,非常经典」、「最好先有 XX 基础再看这篇教程」之类的警告,结果有时候会出现这样的情况:本来你只打算学习编写网页 ,结果几天后莫名其妙地开始苦读《精通正则表达式》。为了能够专注于自己想做的东西,要十分警惕「学习」这件事情。尽量学习最少的东西,然后把时间都花在创造上。当想要学习的时候,慎重考虑它是否会让你偏离目标,或者绕太远的路。这样做肯定会导致基础不够好,但我们是业余爱好者嘛,能尽快做出东西就行了。如果你真的非常在意基础,说明你可能更想成为职业程序员,请返回参考前面的重要声明。
没有人天生就会编程,在做东西的过程中会不断学到新的知识,然后就会发现自己之前的代码很愚蠢。这个时候你可能会很想推倒重来,或者从头改进之前的代码。要抑制住这种冲动,不然就会掉入代码优化的无底洞。事实上,几乎所有的专业程序员都会对半年前自己的代码感到不满,而且一开始代码质量不好完全没有问题。举个例子,假如要在网页上显示 10 次 "I love you.",你并不知道如何使用循环,于是就复制粘贴了 10 次 "I love you"。这样的做法或许很笨,但是你做出了想要的效果,对于业余爱好者来说,完成一个东西要比代码质量重要得多,不要为了这种笨方法而感到羞愧。
如何解决问题:
在创造的过程中肯定会遇到很多问题,对于初学者来说,大部分的问题都是语法或者拼写问题,只要仔细检查代码就可以解决,少数摸不着头脑的问题也可以用 Google 找到答案。很多非 IT 行业的人平时都只是搜索中文,可能并不觉得 Google 比百度要好,但当你开始学习编程,就会立刻发现 Google 比百度好用得多,一般都可以在搜索结果第一页找到想要的东西。使用 Google 搜索的时候,请尝试用英文描述问题,或者直接把出错信息直接粘贴到搜索框。
如果实在搜索不到解决办法(这种情况对业余爱好者来说极为少见,请善用 Google),可以去 Stack Overflow 提问。提问的时候请注意描述好自己的问题,把错误信息以及相关的代码都写进去。 Stack Overflow 的氛围相当好,应该很快就会有人回答你的问题。比较不方便的地方是你必须使用英文提问,没办法,因为类似的中文社区并不存在。如果执意要去中文社区提问,那么我真诚地建议你使用女生头像和昵称,可以有效提高回复率,呵呵。
有关编程的一个恼人的地方是,就算看书之后觉得自己掌握了,真正写的时候还是经常会出错。它只能通过实践来掌握,所以需要很多耐心。当你被折磨得想要放弃的时候,或许可以换一种角度,以此为契机挣脱过去那么多年的学院派教育。想一想吧,我们在学校里待了那么长时间,几乎所有的学习路径都是「先阅读,再应用」或者「只阅读,不应用」,是时候体验一下如何在应用中学习了。
面对批评:
有些人做出想要的东西之后就已经很满足,但有些人可能会想要展示一下自己的作品并获取一些意见。因为业余,所以当专业程序员看到这样的作品之后可能会非常不屑,甚至大肆批评。这个时候不要自卑或害怕,因为他们对作品的了解都是片面的。他们只是一味拿专业的技术标准来衡量,不清楚你只是想做出一个东西,不清楚你只是业余时间在做,不清楚你在整体上的考量和妥协。作为这个作品的创造者,你才是专家,如果按照他们的要求,你可能永远都做不完。
之所以提到这一点,是觉得业余爱好者大都是自己一个人慢慢自学,被打击一下说不定就完全放弃了,那样实在可惜。对于专业程序员的批评,如果有用就记下来,下次不要再犯就好,没有必要气馁或者把之前的东西重写一遍。从无到有实现了自己的创意已经很了不起,不需要对专业程序员有什么交代。
注意事项:
1. 不要过度关注编程语言的优劣。很多编程语言都可以达到相同的目的,选中一个之后把它用好就是了。和别人争辩哪个编程语言更好是很多职业程序员的一大爱好,是他们生活的一部分。我们是业余爱好者,只要求工具够用,不需要像他们那样一定要用「最好的」语言。
2. 用不着关注国内的 IT 红人和八卦。对学习编程和做东西没有任何益处。(补充:这条可能带了个人情绪,请自行判断,但我关注了那么久觉得确实没有任何益处。。。 >_<)
3. 不要自称 "Geek","Hacker" 或其它什么东西。当开始给自己贴标签的时候,就会试图表现得像那类人,束缚自己的同时还会做出许多愚蠢的事情。我们要做的事情很简单,就是掌握技术并做出能用的东西,没有必要给自己贴任何标签。事实上,能做出东西的人比自称 "Geek" 或 "Hacker" 的人稀有得多。
4. 利用开源代码。感谢开源事业的蓬勃发展和无数程序员的无私奉献,使我们可以学习和使用别人的代码。当需要一些功能时,可以先去找一下是否已经有开源的实现,没有必要自己从头写。
5. 先找到自己想做的东西。不要为了学习编程而学习,那样就算记住了很快也会忘掉。如果实在找不到什么想做的,可以考虑给一些公益组织义务做一个网站,锻炼技能的同时还可以关心一下社会。
6. 保持初心。业余爱好者拥有的最宝贵的财富就是初学者的心,也正是因为这份初心,才让代码质量问题变得并不那么重要。可惜的是,随着技术越来越熟练,初心会渐渐消失,做东西的时候首先考虑的不是结果而是实现方式,当初那个满脑子想法苦于不能用技术实现的人不见了,取而代之的是一个精通技术却乏味的人。所以,作为业余爱好者,应该把「完成作品」和「保持业余」作为首要目标,如果精通技术的代价是失去初心,那就不要精通好了,反正并不想以此为生。
学习资料:
由于我的工作大部分是 web develop, 所以这里给出一些不错的相关资料。如果你想要做一个简单的网站或者 app, 那么这些知识够用了。也欢迎补充好的入门资料,我会不断更新。(之所以没有推荐其它方面的资料,是因为我并没有相关的经验,不知道其中优劣。编程可做的东西非常多,比如 Arduino 硬件编程,有兴趣的可以去找一下资料,也欢迎补充。)
1. Head First HTML 与 CSS、XHTML 。在大学图书馆偶尔看到过这本书的英文版,很喜欢。本书非常适合初学者,里面很多插图,写得也很有趣。
2. A Beginner’s Guide to HTML & CSS 一个很好的在线学习 HTML & CSS 基础的网站。
3. An Advanced Guide to HTML & CSS HTML & CSS 进阶,里面还包含了 jQuery 的学习。
4. 笨方法学 Ruby. 这本在线电子书是 Learn Ruby The Hard Way 的繁体中文翻译,也是 Zed Shaw 写的 Learn XXX The Hard Way 系列中的一本,之所以推荐 Ruby 是因为我很喜欢这门语言。本书非常注重实践,全书由 52 个习题构成,当你完成这些习题的时候就已经写了很多代码了。我觉得书中后面的一些习题(比如读写文件)可以先跳过,用到的时候再去学习。
5. Codecademy 备受推崇的在线学习编程网站,而且有中文界面,非常推荐。
6. Code School 和 Codecademy 类似的在线学习网站,评价不错。
最后再次提醒一下,如果你选择了学习编程,以后很长一段时期内业余时间都会被占据,而且期间会体会到很多痛苦。但是当完成第一个作品的时候,你就会发现之前的痛苦都是值得的,它们是创造不可或缺的一部分。
后记:想要写这篇文章的时候激情满满,觉得自己在做好事,但写的过程中一直诚惶诚恐,非常担心文中业余爱好者可能面临的问题都是自己臆想出来的。毕竟在这个行业待的时间不算短,早就变成了一个乏味的职业人士。如果你是一个想学习编程的业余爱好者,欢迎留言告诉我哪些担心是不必要的,以及漏掉了哪些东西,我会及时修正或补充。