1 别抱怨了.准备好漫长的征程,或者晾在一边赏鸟去吧
对于真正希望成为一名优秀的程序员的人,希望成为专家,成为究极人物的人,如果真的值得去做,那么投入十年进去,并不算什么,对吗?
第一步就是吞下这颗子弹。接受这个过程将不止花去十年,而是一生的追求。只因为你想去做它,才去做它。如果一个人不情愿做某事,他是不会成为它的专家的。
2 写很多很多的代码
同时写许多许多的代码。不一定是好的代码。很长时间内,你写的代码都不是好的代码。好的代码,好的taste,是需要大量的实践培养的。对什么新的工具、新的算法、新的问题感兴趣,或者遇到了什么问题,就去尽可能地写代码实践,尝试使用它。
学习的过程永不停止。如果你怀着在每一天中尽自己最大的可能去学习,取得你所能得的最大的"里程数"的态度去学习,你将会走很远。进入这样一种状态:任何的一天/一周/一月中没有学到有趣的东西的话就是失败。每天都有足够多的酷的、有趣的东西等待你去学习。即使你已经学习了15年,虽然找到它们更困难了,但仍然可能找到。没有一个人能够掌握编程世界中所有的知识,所以如果你觉得没有东西可学了,就去找到一个新的项目,写更多的代码。
在你做这些东西的时候,注意了,你要寻找中间的模式,如那些可以自动化执行有用的东西,或者你写了许多的代码可以分离出来作为共享的库的东西,或者其他集中的位置。去寻找对于特定任务简单的编程语言。找出来那些对于同样的任务不擅长的编程语言,并思考为什么一些语言对于这些任务相比其他的更加具有生产力。
但最重要的,就是写许多许多代码。但记住了,如果做的事情不再有趣,就没必要做下去了,如果你不能在此期间享受过程。
3 读更多的代码
当你积累了一些项目的时候,开始读其他人的代码。刚开始的时候,这样做很困难。他们做了许多你从没有做过的事,或者使用了你不习惯的风格,甚至使用了你没有学习过的编程语言。如果你觉得它有趣的话,尽可能地去读这些代码。不要担心深入地分析任何给定的项目的代码,至少刚开始时不要担心。
读一些新的代码可以展示给你新的思维方式,这有利于扩展你的思维。扩展思维对于保持进步是很重要的事。它帮助你确保当你前进时能够持续发现新的东西去学。
一定要与其他的程序员交流。问他们如何和为什么做那些特定的事,是否采取了不同的角度做事情,问他们对自己的代码是否有建议。一定要礼貌,因为高级的程序员非常地忙。尊重会带你走很远,这是个紧密联系的行业,名声很重要。
4 学习许多编程语言。在一些中成为专家
你实际上不会有很多盈余的时间,至少不足够同时学习许多的语言,除非你异常地幸运。所以可以在一个较浅的层面上学习许多的编程语言,足够了解什么使他们流行,什么使它们擅长于它常用的领域,它们的缺陷是什么。扩展很重要。不要局限于一种类型的语言,如命令式的语言,或者OO语言,扩展学习一些函数式语言或者声明式语言。
学习Lisp的一种方言。对于你日常的编码来说,你不会去使用它。但学习、实践它会令你成为一名更好的思考着,你会对简单的递归的系统的魅力有更深刻的理解。坚持学习它、实践它直到令你情不自禁地叫出"啊哈"的那一刻到来。那一刻之前,你都会觉得那是一坨奇怪的语法和蹩脚的用法。在你剩余的职业生涯中,它便会成为人类设计的最令人瞠目结舌的优雅的概念。
之后,学习一门纯粹的函数式语言。我推荐Haskell。它通过其它函数式语言包括Lisp的方言都不用的方式强迫你纯粹地使用函数思想。当你理解了设计monads的目的后,或者其它"啊哈"时刻,你将会进入到思索的能力和设计优雅系统的能力的更高的层次上。
最后,学一门声明式语言。SQL也算,虽然比较弱。Prolog常常被推荐。还有XAML,XSLT和XQuery。声明式语言是你告诉计算机你希望它做什么,计算机来琢磨如何做它;而命令式语言则相反,你告诉计算机如何去完成一件事并希望它正确地做了你想做的事;而在函数式语言中,你描述了数据域类型如何转换。
5 自创编程语言
它不需要很复杂,或者高级,甚至不需要特别优雅。甚至不需要是原生的想法。我常常推荐写一个Lisp解释器(如果使用Lisp的方言写更好)。这是你学习基础知识的一个很好的方式。实际上,你可以对计算机编程设计的基础有很好的感觉:词法分析,语法分析,编译,解释,虚拟机,还有基本的设计抉择对一门语言在各个领域的实用程度如何影响。
你将会在此过程中得到以下3样东西:
1)你将会对你选择的工具如何工作有更加深刻的认识,这样你就可以写出更加高效的代码。
2)你将会开始意识到主流语言和工具背后的设计抉择的原因。这将会使你更有效地选择你要用的工具。
3)你将瞥见一些仍然存在于工具和语言中的未发现的可能性,这样使你开阔了眼界,可以发现新的可以学习和实验的有趣的酷的东西。
6 学习其他人从没有学习过的东西
这是最困难的也是最后的步骤。又是另一个十年。保持兴趣和做有趣的事情,离开那些不让你享受的事情。