在GDNet论坛里,其中一类比较常见到的是像这样的一些主题:“你好,我刚 [ 买了台电脑 | 写了一个简单的游戏 | 开发了一个游戏引擎 ] ,我想知道从这起步的话,可以走到哪?如果说我想要最终能实现某个特定目标的话,我需要学习什么东西呢?”
首先,你必须明白,Peter Norvig 很久以前就已经非常清楚的知道: 成为一名程序员要花费10年时间。现在市面上充斥大量的"短时间内学会X" 类型的书; 还有一大堆博客教你 "如何通过一些简单的方法提高编程水平"; 总的来说,很多人总是在寻找一些能够让他们通过最少的努力来成为专家的方法。
我在这里想把标准调高一点。与其告诉你5种容易的方法来在21天内写出令人惊艳的代码, 我将要告诉你的是事实是怎么样的。请看如何通过艰难的六步让你成长为一名出色的程序员。
第一步:坚持。沉下心,深吸一口气。
当然, 你可以反复折腾,写一些小巧的Shell脚本或者几个小游戏。到这里,如果你已经满足于你已经拥有的技能,那么只管通过最快和最容易的方法去解决你遇到的问题就可以了。 我不想忽视这个选择的合理性,有些人没有时间(或者甚至没有意愿)成为一个编程高手。如果你并不为你将训练你的手艺上十年直至你精通它为止的想法而津津乐道的话,那就别那么干。但是不要被迷惑了,你将一直只能被局限在你以前能做什么和能把什么做好。如果你几经权衡,认为那已经足够。好,那么你就没有必要继续阅读下去了。
对于继续阅读下来的我们,其实还是有这么一些东西吸引我们,让我们真真正正精通编程技巧。我们想成为专家,忍者,领袖级人物 - 任何超高级的冲击你幻想的名词。对于我们来说,10年看上去是合理的投资。可能看上去有那么点沉重,但如果这本身就是值得你去做的事情,就值得你做对,不是吗?
所以,要想成为出色的程序员的第一步,就是吞下苦水。接受现实,这不是十年的过程,而是一辈子的过程。 像Norvig说的那样,这样做只是因为你想去做。如果不是自己愿意去做的话,没有人会在那方面变得异常出色。世界纪录保持者不会因为那天他恰巧吃下最多的热狗被纪录下来,而一定是因为那天他也确实是感到饿的。
第二步:不断写代码
并不是说一定说写出来的,都要是很优秀的代码。而且,在很长的一段时间里,它也不会是很优秀的代码。只管写,能实现功能就好了。任何情况下,如果发觉你每天用电脑都会遇到同一个烦人的问题,想想你是不是可以写个程序来处理它。任何时候,如果你发现什么有趣的东西你想尝试一下,那么你就去做。尽可能多得去体验新的概念,工具和语言。
学习的过程永远也不会停止,所以,如果在一段时间里,你秉持通过不断的解决问题的同时来学习和进步的态度来前进的话,你将可以走的很远。要认识到,如果在一天、一星期、一个月内如果没有学到有趣的东西,其实是一种失败。每天,其实都有足够多的事情让你能从中学习到一点有益的东西。当然这从15年左右作为一个标记来看的话会很难,但也是完全可能的。没有一个凡人可以完全吸收这世界上关于编程的所有知识,所以,如果你感觉到你没什么东西要学习了,开始一个新的项目,写更多的代码。
当你这样做的时候,请留心。寻找一些模式 - 一些你经常做的,可能可以变成自动处理的东西,或者说一些你经常写的,可以被分出来放在共享包里的代码。寻找那些非常容易处理特定任务的语言,同时也找出那些处理同样任务,却不太容易的语言,并想想为什么他们有什么不同。
但最重要的是:不断写代码。每天,即使那只是一个简单的正则表达式来搜查你的邮件历史或别的什么。尽可能经常的用编程的手法来处理事情。记住,如果什么时候你觉得你做的事情不再显得有趣,那么,去做别的事。做一些你本身并不享受的事情没有一点意义。
第三步: 读更多的代码
一旦你已经积累下一点项目代码后,你可以尝试去阅读别人的代码。一开始,可能有点困难。因为他们并不是你看过,或者熟悉的风格,或者用你学习过的语言去做一些事情。如果你认为那很有趣,尝试阅读完它全部的代码。别因为要深入分析任何项目而恐惧,至少别在一开始的时候。其实它可以像你做全职工作,去理解那些庞大的项目的代码库一样。选择一两件你认为你可以学会怎么去做的事,并掌握它们是如何实现的。
阅读新的代码为你展示出新的思维方式,并帮助你延展思维极限。延展对保持进步异常重要,而且也确保你能不断发现新的事物来学习。
一定要和别的程序员交流。问他们为什么和怎么做到某些事。问他们如果可以重新来过的话,是否会用不同的方式来做。问他们对你的代码有没有任何建议。(请要有礼貌。很多出色的程序员都极度繁忙,并不都有这样的时间和意愿来免费为别人的工作疏通整理和提出意见。 尊敬可以把你引领得更远。这个世界很小,声望很重要。)
第四步: 学多门语言,掌握几门.
你不会有足够多的时间同时掌握多门语言,除非你非常幸运。因此,浅度学习尽量多的语言 - 了解怎么让它们运行起来,为什么它们擅长于特定某些工作,它们的缺点是什么。延展在这里很重要。不要死守于命令式语言,像C,或面向对象语言,像Java,或别的。同时也要扩展到函数式语言,或声明式语言。
学习一种Lisp方言。原因在这 它不会对你的日常编程有什么直接影响,因为你不需要使用它。但是它会让你拥有更好的思维方式,并让你深入了解简单的递归系统的优美之处。坚持到你发出“啊哈”那一瞬间。因为在那以前,它看起来都会是古怪的语法和风格搅和在一起了。但一旦你看破以后,它将一直保留在你的职业生涯内其中之一由种人类设计出来的最重要的优美的理念。
然后学习一种纯函数式语言。我推荐Haskell, 因为它强迫你去纯粹使用函数到别的函数式语言都无法相比的程度 (包括大部分Lisp方言) 。你必须要把你的思维扭曲到一定程度,但是一但又到了那个“啊哈”的瞬间(从我的经验来看,大概在了解到使用monads的原因所在的时候),你会再一次把你的思维和设计出优美的系统的能力再推进一步。
最后,学习一种声明式语言。SQL也算,虽然单单学习SQL好像弱了点。Prolog是多数人会推荐的语言,但不是太可能会接触到。实践领域上看,XAML, XSLT和XQuery是好的学习工具, 并且它会让你了解到声明式语言背后的概念。(简单来说, 你告诉电脑你想做什么,然后它自己想办法做出来。这完全是和命令式编程反过来的,因为命令式编程是你告诉电脑怎么做然后希望它做到你想要的做的事情。而函数式语言是你要去描述数据和类型的转换。)
况且,在你学习Lisp方言后去学习XML工具会让你非常明显得感觉到为什么XML想重新发明s-expressions是多么的难,并且它现在是做得那么的差劲。
第五步: 创造一门语言.
它不需要有多复杂,或包含多丰富的特性,或多抽象,或甚至有多优雅。它甚至不需要是原创的。我经常建议写一个Lisp解释器(为一种Lisp方言来做这件事是值得奖励的)来作为一种好的学习语言基础的方式。重要的是,这样你可以得到计算机语言设计的基本感觉:词法,解析,编译,解释,虚拟机,和无数的语言设计基本理念,以至于它是如何影响到它在处理不同任务时是否更有效率。
这样做会让你有以下三种收获:
你会更深入的理解到你的工具是如何工作的,那么你在使用它们的时候会更有效率。
你会慢慢看到那些吸引你的或让你觉得很不舒服的主流语言和工具的设计理念。这样,你在今后开始新项目的时候,就能更有效的选择你的工具。
你将可以留意到那些可供开发的新语言和工具的处女地,为你打开前所未有的视野去学习和尝试新的东西。
第六步: 学习一些没有别的人学习过的东西
这是最难也是最后一步。到目前为止,你已经习得那些已知的东西,那些能从别的人代码,或书,或学术文章获得的东西。那些东西值得学习,但并不是标新立异的东西。
现在是时候打破僵界,真正上升到大师级别的时候的。现在是时候在没有别的人冒险进入过的领域开创一条血路的时候了。
别误会。这并不会是你真正拥有10年经验前你会尝试去做的事情。因为只有你真的走到那里,你才有可能创造出新的东西,而不是在重新发明轮子。但是,一但你精通了某一领域,其实并不是那么难去发掘出计算机的未知领域。
这很有可能还要再花你另外10年时间,如果不是永远的话。别放弃。记住,这应该对你来说还是非常有趣的事情。如果在任何时候,你发现你已经不在热爱你手上做的事情,去做别的事。生命太短暂了,你不应该浪费任何时间去做任何你不再想做的事情。
并不是所有的人都能成功走完这一步,但任何曾经尝试过的人都会受益非浅。不要让任何事情击败你。即便你没能获得图灵奖,你也应当在你的程序员生涯不断前行,向着你的终极领域进发。而这一切,都需要靠着你不断挑战难题,延展你的大脑。
恭喜! 你已经成为一名出色的程序员了!
等等... 事实上,你可能已经因为年纪太大而离去了。对不起,下辈子再来一遍吧,可能会好运点!
哈哈,玩笑话。话说回来,别认为会有结束的那天。在你在成长旅途中一但开始停滞不前,你实际已经开始死亡,而变得无关了。我在编程世界里见过的最让人觉得悲伤的失败是那些选择在这领域开始并前行一段后,决定放弃,不再学习了。作为一个人,他们现在肯定完全已经对软件世界来说是毫无相干的了,也几乎可以说他们再也走不出他们目前的处境,除非,他们再继续学习前进。
现在就开始前进吧,写代码! 可能某一天你就会成为一名出色的程序员,然后告诉我你是怎么做的。
我非常热爱学习。