我是如何学习计算机编程的(斯坦福大学)
我是如何学习计算机编程的(原文链接)
我在很小年纪的时候就开始学习编程,我学习编程的方法是创建大量的不同的网站。下面列出的是我创建的主要的网站,其中最早的一个是我11岁时开发的。我希望读者能从我这些复述中获得的信息是:如果你想学习编程,做大量的练习性的项目是非常必要的。
学习一种技术最好的方法就是练习,练习,练习。所有我知道的最优秀的程序员都深深的享受编程——编程是一件让他们干起来无由的高兴的事情。也因此他们大量的编程。经常,那是一种不健康的废寝忘食。学习如何编程——以及如何编好程——并不需要你具有超人的能力。你只需要去按照自己的意愿动手去做,做出点什么东西。
做什么东西并不重要,重要的是你找到东西动手去做。我所认识的那些优秀的程序员,他们都有各自不同的最初学习编程的动机。有些人学习编程是为了开发动画游戏。有些人是为了解决他们在使用计算机时遇到的问题,或让工作更有效率。有些人是为了开发产品来满足人们的需求。有些人(真正的程序员)学习编程只是他们为了深入了解计算机工作原理的步骤之一 ;他们希望能搞清楚这种机器。有些程序员编程只是因为他们享受解决难题的挑战。
让所有这些“优秀程序员”统一起来的唯一因素就是,他们全因为生活中的某些原因而为编程着迷,继而花大量的时间编程,做大量的,大量的用于练习的项目。
那么,我就不再罗嗦了,下面就是我如何学习编程的故事:
我的第一个网站
在我大概十一二岁的时候,我感到需要给自己做一个网站。我已经记不清为什么需要一个网站了,只记得那样就开始做了。于是我就在网上搜索关于网页、Web浏览器、HTML如何工作的信息。很多的信息我发现都已经过时了,有些明显是错误的或给了错误的向导(例如为IE浏览器和Netscape浏览器分别做网站),但过程是非常的有趣的,我学到了很多新东西。
尽管在网上搜到了很多粗制滥造的的信息,我还是想办法做了一个简单的网站,我叫它“Feross的网站”。开发它,我使用的是微软的Frontpage,那是一个非常棒的所见即所得的HTML编辑器。我使用很常见的语法,例如粗体,斜体等对网站做修改,在编辑器里即时查看这些HTML标记能达到的效果。这是很有效的学习方式。
下面是我的第一个网站的截屏。这个网站已经不存在了。
你从上面的图片上看不出来,这个网站上的每个元素都在动,闪烁的动画,还能出声。我在网站的每个页面上都放置了不同的MIDI格式的歌曲。而且都是自动播放,你没有办法让它们停下来,除非把电脑消音。哈,这就是当年流行的网站设计风格。
等再长了几年岁数后,我们重新设计这个网站,让它变的漂亮些。我使用了在网上发现的一些免费的网站模板,用微软的画图工具修改了一些图片。
经管我大量的依赖于模板,但这不失为一个学习HTML和Web浏览器的好方法。“Feross的网站”除了用来收集我小时候的一些视频外没有其它用处,所以不久后我就对它失去了兴趣。
我的第一个真正的
当我9年级(14岁)时,我和我的朋友都非常着迷与观看像Newgrounds 和eBaumsWorld这样的网站上的flash视频和动画(这是2005年之前,还没有YouTube)。我在这种网站上花了大量的时间,所以我知道所有最好的视频和游戏。我想,如果做一个网站来收集这些在网上发现的我喜欢的flash动画、视频、游戏,会是一件很酷的事情。这就是我做出FreeTheFlash网站的初衷。它是这个样子的:
我从开发“Feross的网站”的过程中学到了很多HTML知识,这次我使用了Macromedia 公司(现在的Adobe公司)的Dreamweaver编辑器,这个东西能让我在网站里重复的页面使用同一个模板。
一段时间后,我意识到,我应该让网站动起来,听说是应该使用一种叫做PHP的编程语言来做网站,而不是只使用静态的HTML。于是,我买了花了20美元从Amazon买了一本书,叫做《PHP and MySQL for Dynamic Websites》,使用PHP和MySQL对网站进行了重新设计。我还给它进行了新的美化:
在高中时期我对这个FreeTheFlash 网站的开发持续了2年。它对于我的第一次尝试做一个“真正”的网站来说是相当成功的——在2006年,它获得了60万人/次访问,页面浏览量达3百万。FreeTheFlash 让我知道了做出一个产品、让它杰出、看大量的人使用它,是一件多么自豪的事情。它让我想做出更大的网站。
我的第二个网站
在中学,我在上计算机课程时做了大量的笔记。于是,在11年级时,我觉得应该把这些笔记放到网上,让那些不喜欢看课本的学生使用。我做了一个网站,叫做StudyNotes,使用的是PHP和一个叫做Joomla的内容管理系统。我也尝试过使用Drupal,但发现它太复杂了。
同年,我为我的学校Key俱乐部分部做了一个网站,如今也不用了。
这段时间,我花了大量的时间泡在WebmasterWorld里,这是一个论坛,主要关于网站站长和SEO专家推测Google算法,讨论AdSense技巧,调试网站问题等。
大量的学习和阅读
等我进入了斯坦福大学后,我学习了大量的计算机课程,诸如CS106X 和CS107,我还超前学习了部分 CS106 课程。
所有的课余时间我几乎都在阅读关于设计、编程、浏览器和JavaScript等方面的资料。一般每天4-5个小时。
如果你要问我都读什么?乱七八糟的。但大部分都是我敬仰的设计师和程序员写的博客。你可以从这篇博客的右侧看到我列出的部分博客链接。
关键一击
之后,在2010年夏天,当我在Facebook实习时,因为跟一个朋友打赌,我开发了YouTube Instant,它是一个用来实时搜索YouTube视频的网站。这个网站在建成之后的10天里获得了1百万用户的访问量,YouTube的CEO甚至给我发消息说提供一个职位给我,你可以从这里看到这些媒体的躁动。
我知道YouTube Instant的成功归功于当前的好时机和一点幸运。我想,我们很多人不知道自己能做出什么。
继续前行
我注意到很多人使用YouTube Instant来听音乐视频,这让我想到了另外一种使用YouTube API的好方法。于是,我的朋友Jake Becker 和我在2011年的头3个月里开发了Instant.fm,它能让你轻松的向朋友分享音乐播放列表。通过这个项目我们都学到了很多新的东西。
在这个工程中我掌握的技术:
- jQuery
- CSS (和 Modernizr 以及 YepNope,用来解决跨浏览器问题的)
- Python
- Tornado (web framework/server)
- Git (版本控制) & GitHub
- Last.fm API
- YouTube API
- 团队合作
以及其它一些我们学会使用的东西:
- Nginx (web server)
- Supervisor (to daemonize Tornado)
- SQLAlchemy (ORM)
- Apache Ant (to build and deploy the site after a push)
动手去做!
我把从11岁就开始做的东西都不厌其烦的曝出来,目的就是要说,如果你想学习编程,你需要动手去做东西!现在就去。不要找任何借口。
做东西是最好的学习方法。
从头到尾读一遍编程语言书籍是一件很无聊的事,读到一半你就读不下去了。但,如果你想做一个项目,你在做的过程中会知道你该学习哪些知识,这是认识和掌握知识更有效的途径。
计算机课程
大学里的计算机课程是学习编程的另外一种十分有效的方法。大多数好的计算机课程都十分强调学习计算机科学领域里的重要概念和范式,而不是教你某个特定的语言。这能让那些从来没有接受过正规教育的人在自学时开阔眼界。
记得在斯坦福大学上第一堂计算机课程时(那是教授C++的课程),我在想“怎么可能变量前不带$符号呢?”当时我只使用过PHP!我用了好长一段时间才改掉在变量前加$符号的习惯!
在软件公司工作
另外一个提高编程水平的方法就是到软件公司实习,比如Facebook或Quora,最近的两个夏天我就是在这些公司里度过的。你会从那些优秀的人那里学会如何更好的编程,如何阅读和理解他人的代码,如何在大项目中进行团队合作。
还是那句话——比什么方法都管用——学习编程最好的方法就是做项目练习。我是不是重复这句话无数次了?
如何学会编程:
- 做练习性项目。
- 看编程书籍。
- 做项目练习。
- 上计算机课程。
- 做练习性项目。
- 读编程类博客。
- 做项目练习。
这就是我能给出的最好的建议。
祝编程愉快!
你第一要做的是开始去做
很多人都问我,“我想做web设计,如何入手?”或“我要开发web应用程序,需要学哪些技术?”,当然,推荐他们一摞书籍或十几篇关于55条超越竞争对手115%的技巧文章是最简单的,但问题的实际情况是,如果你想开始做某件事,你并不需要先去学会什么新知识。对你来说,最重要的却是立即着手去做。
行动起来,着手去做。如果你想学web设计,那就去做个网站。如果你想成为企业家、在网上买你的产品,那就去做个电子商务应用程序。也许你现在还不具备这些开发技能,但何必为这些担心?也许你根本不知道你究竟缺少哪些技能呢。
从你能做的开始做
如果你想在web上做点什么,不要担心着需要去学HTML,CSS,Ruby,PHP,SQL等知识。它们对于完成一个最终的产品是必要的,但开始时你并不需要它们。你可以在Keynote或Powerpoint里把你的想法的物理模型模拟出来。用方框把一个个表单域表示出来,标上说明,把一个个页面用线关联起来。你可以利用现有的软件知识制作出一个非常健壮的用户界面交互原型。根本没有任何计算机知识?那就用你的铅笔和纸和便利贴。画出一个个屏幕样式,把它们贴在墙上,试试各个界面的流程。
你也许甚至连需要什么技能都不知道,所以就不要忧虑这些了。从你已经知道的着手。
你可以用草图或幻灯片做很多事情。你可以看到你的想法形象化了,这样可以去评价它是否是一个真正具有价值的东西。到了这一步,你才可以进行下一步,去学习些HTML知识,把你的原型在浏览器里实现。此时,你要尽可能的发挥你所具有的知识和工具,把事情做的最好。
防止不自信
很多时候我们不能开始做事、无可作为的原因是缺少技术、资源、和工具。但这真正阻挡我们的却是自我挑剔和找借口。在Drawing on the Right Side of the Brain这本优秀的书中,作者贝蒂·爱德华讨论了为什么当还是孩子时喜欢写写画画而到了青春期大部分人都停止了开发这种能力。
“跟据很多成人的绘画技能来看,进入青春期标志着人们在艺术才能方面发展的突然中止。作为孩子,他们面临一个艺术危机,面临着他们对周围这世界日益增长的复杂的意识和自身艺术技能水平的冲突。”
孩子们的自我批判意识会逐渐增强,他们同样喜欢绘画,但当他们意识到画不好时,就完全放弃了绘画。
这种感觉会持续到成年。我们想起设计一个网站,或去开发一个应用程序时,如果我们拥有的资源和工具达不到我们预设的要求和水平,我们永远不会开始去做。即使互联网让我们看到了那些无数的伟大作品、天才个人和优秀的操作过程作为样板,也无济于事。人们很容易跟那些最好的比较起来发现自己的各种不充分和缺失,但从来没想过,任何人都不是天生都拥有这些技能的,如果他们不从开始做起,永远也走不到这一天。
去干——无须试
成功的人会找到一种方法让自己坚持做下去——尽管疑虑不满。艺术家文森特·梵高,只是在他的人生的后十年才称得上是艺术家。我们都因他的伟大艺术作品而认识他,但他并非一开始就是大师。对比一下Drawing on the Right Side of the Brain这本书里提供的两幅画,一副是其早期的作品,一副是两年后的作品:
文森特·梵高 木匠, 1880 和 Woman Mourning, 1882
他不是什么神童(27岁才开始学画),他通过艰苦努力练就了一身技艺。如果当他感觉到技术水平比不上保罗·高更时,他屈服了自己的疑虑和绝望,他很有可能就放弃了自己的前程。
所有的这些,都是想说一个道理,有很多本来该成的事情因为我们没有去做而没有成。如果是由于认为你自己不够好,不具备技能、知识、经验,而放弃追逐自己的梦想,那简直就是浪费。事实上,事情中存在问题正是一种驱动和鞭策。它会给你巨大的挑战同时巨大的回报。为什么要不厌其烦的做那些已经做过一百遍的事情呢,你已经从中学不到什么了。不要再担心为了完成一个任务你需要知道哪些东西,你已经拥有了开始去做所需要的任何东西了。
同时学习多种编程语言其实很容易
大概是两年前吧,我做了个决定,要去学习编程。我买了本PHP书,开始一边阅读一边做里面的练习题。我把主要精力都放到PHP上,不理会任何其它的语言,因为我有个习惯,一旦开始做一个事情,我们会集中所有的注意力,先把这个事情做完,然后才去做其它的事情。于是,我尝试这开发一个Web应用程序(一个绝妙的创意,一个能使我成为另外一个Facebook创始人那样的应用)。一点一点的,进度很慢,我的应用(这个即将让我成为百万富翁的应用)慢慢的成型。最终,它跑起来了。自然了,没有人来用它,做的太烂了,到处是bug。之后我又有了一个(绝妙的)创意。我想这次就不用不停的在书本里翻来翻去了,不用整夜整夜的在google上搜索拷贝代码,修改它们,让它们能在我的应用程序里运行了。我以为我坐下来就能写出我的PHP应用。但我终于明白,实际上我什么都没学会,尽管我读了很多关于PHP的资料,尽管我已经开发出了一个应用程序(很烂,但也是一个)。我认识到,整个的这段时间我所做的事只是学习了一点PHP语法,使用几段代码解决一个难题,而这些拼凑的代码最终让我的应用面目全非。
我十分的生气,停止了所有的开发。我把我的Web应用的创意完全丢到了脑后,开始四处浏览所有我觉得有趣的开发知识。我发现了Ruby On Rails,这个东西看起来很酷,但我不知道它为什么很酷,我对ruby毫不了解,但却花了不少时间学习Ruby On Rails,然后我学着开发Android应用,读跟它相关的资料,这把我引向了学习Java,但我没有停止学习Rails,我在iTunesU上报了一个Java的课程,之后在我工作的时候我又开始阅读PDF版的Python教材,因为Python里的一些东西引起了我的兴趣….(也许是它的这个名称)。噢!我还有一本C++书,我把它找了出来,在睡觉前我开始读一些C++的知识。因为我仍然不知道Ruby这种语言,所以我也开始学习Ruby。当我研究Java有些厌烦时,我还试了试Objective-C,而JavaScript看起来也不错,我也试图要掌握它。这些全是在同时进行的。
如果是之前有人问我,我肯定会说这是最糟糕的一种学习编程的方法。但事实证明,这是最有效的一种学习方法。这种学习方法的结果是,我终于不再关注PHP的语法,开始把不同语言间的相似之处关联起来。我现在是在真正的学习原理,而不是为了做什么而在google上搜索正确的语法。我开始领悟相似的东西在各种不同的语言、不同的平台上的不同之处。这些认识对我来说很重要。我的关注不再是PHP,我的关注现在是编程。
我希望这些经验对于那些跟我两年前一样处境的人有些帮助,那些跟我当年有相同想法的人应该通过不同的视角来看那些相同的东西,这样才能真正的领会它们!