近期,我大量阅读了Steve Yegge的文章。当中有一篇叫“Practicing Programming”(练习编程),写成于2005年,读后令我吃惊不已:

与你所相信的恰恰相反,单纯地每天埋头于工作并不能算是真正意义上的锻炼——參加会议并不能锻炼你的人际交往能力;回复邮件并不能提高你的打字水平。你必须定期留出时间,集中锻炼。这样才干把事情做得更好。

我认识非常多杰出的程序猿——这是在亚马逊工作最好的额外“福利”之中的一个。假设细致观察他们,你会发现他们时时都在锻炼。

他们已经非常优秀了,但他们仍然不忘锻炼。他们锻炼的方法林林总总,而我在这篇文章中仅仅会介绍当中的几种。

据我了解,这些杰出程序猿之所以如此成功,就是由于他们一直在锻炼。

完美的身材要靠定期的锻炼才干获得。并且必须坚持锻炼才干保持,否则身材就会走形。对于编程和软件project来说。道理是一样的。

这是一个重要的差别——我每天都开车去上班,但我的驾驶水平远远不如专业车手;类似的情况,天天编程可能并不足以使你成为一名专业的程序猿。那么,什么才干把一个普通人变成一名专业车手或者专业程序猿呢?你须要锻炼什么呢?

答案就在《科学美国人》的一篇名为“The Expert Mind”(专家思维)的文章里:

爱立信提出,重要的并非经验本身。而是“努力的学习”,也就是要不断地挑战自身能力之外的东西。一些狂热的爱好者花费了大量的时间去下棋、打高尔夫球或者玩乐器。但他们可能始终停留在业余水平上,而一个训练有素的学生却能够在相对较短的时间里超越他们。原因就在这里。值得注意的是,在提高水平方面,花费在下棋上的大量时间(即使參加各种比赛)似乎还是比只是专门的训练来得更为有效。

训练的主要价值在于发现弱点,并有针对性地进行提高。

“努力的学习”意味着,要经常去处理那些刚好在你能力极限上的问题,也就是那些对你来说有非常大可能失败的事情。

假设不经历一些失败的话,你可能就不会成长。你必须不断地挑战自我。超越自己的极限。

那样的挑战有时会在工作中碰到,但也未必。

将锻炼从职业工作中分离出来,这在编程领域常被人称为“编码套路”(Code Kata)。

Code Kata的概念是由David Thomas提出的,他是《程序猿修炼之道:从小工到专家》的作者之中的一个。这个概念主要指的是。针对某一种特定技术或技能进行反复性的练习,从而将其熟练掌握。

所谓套路。就是一系列的招式。这个概念借鉴于武术。

假设你想要看一些编码套路的样例(也就是努力学习和磨练编程技能的方法),SteveYegge的文章里倒是提出了一些不错的建议。他把它们称作为“实践演练”:

1. 写一份自己的简历。

把自己全部的相关技能都罗列出来,然后把那些在100年后还用得到的标出来。给每一个技能打分。满分为10分。

2. 罗列出你所景仰的程序猿。尽量包含那些与你一起工作的人。由于你会在工作中从他们身上获取一些技能。记录下他们身上的1 ~ 2个闪光点,也就是你希望自己有所提高的方面。

3. 查看维基百科上的“计算机科学”栏目。找到“计算机领域先驱者”这个分类,从这个列表中挑选一个人,阅读他的事迹,而且在阅读时打开不论什么你感兴趣的链接。

4. 花20分钟通读别人的代码。读出色的代码和读糟糕的代码都是故意的,两者都要读,轮流切换。假设你无法感觉出它们之间的差别,能够求助于一位你尊敬的程序猿。让他给你展示一下什么是出色的代码、什么是糟糕的代码。把你读过的代码给别人也看看,问问他们的看法。

5. 罗列出你最喜欢的10个编程工具——那些你认为你用得最多、非有不行的工具。随机挑选当中的一个工具,花一个小时去阅读它的文档。在这一个小时里。努力去学习这个工具的某个你不曾意识到的新功能,或者发现某种新的用法。

6. 想一想。除了编程之外你最擅长什么事情?再想一想,你是通过如何的锻炼才变得如此熟练和专业的?这对于你的编程工作又有什么启示呢?(怎么把这些经验应用到编程方面?)

7. 拿出一叠简历,并和一组面试官在同一个房间里待上一个小时。确保每份简历都至少被3个面试官看过,而且要给出1 ~ 3分的评分。针对那些不同面试官评判大相径庭的简历展开讨论。

8. 參与一个电话面试。事后写下你的反馈,抛出你的观点,然后与主持电话面试的人聊一聊,看看你们是否达成了一致的结论。

9. 进行一次技术面试,而且被面试的人应该是某个你不太了解的领域里的专家。

让他假定听众在该领域里一无所知,因此请他从最基础的讲起。努力去理解他所说的,必要时问一些问题。

10. 有机会參与别人的技术面试。期间。你仅仅是认真地听、认真地学。在应聘者努力解决技术问题的同一时候,你也要在自己脑子里尝试解决这些问题。

11. 找到一个能和你交换实际问题的人。每隔一周,相互交流编程问题。花10 ~ 15分钟来尝试解决这些问题,再用10 ~ 15分钟进行讨论(不管是否能解决)。

12. 当你听到不论什么你一时之间也无法解决的面试问题时。赶紧回到你的座位上,把这个问题用电子邮件发给自己。以留作日后的提醒。在那一周里找出点时间,用自己最喜欢的编程语言来解决它。

我之所以喜欢Steve开出的这个清单。是由于它看上去非常全面。有些程序猿一想到“锻炼”,总觉得就是一些编码上的难题。但在我看来,编程更在于人,而不是代码

因此。通过解决世上全部的、而且晦涩的编程面试题目,在提高你的个人能力方面,这样的方法是有局限的。

关于“努力的学习”的诸多建议:

1. 与别的程序猿交流。

读别人的代码。

这比不论什么书籍或培训课程都更重要。

2. 动手敲代码!最好的学习方法就是边做边学。

3. 在本科或研究生的课程中学习编程课程。

4. 找一些项目来做。而且须要与其它程序猿形成团队来合作。

在项目的进行过程中。学会辨别最出色的程序猿以及最糟糕的程序猿。

5. 在项目中尾随别的程序猿一起工作。了解怎样维护那些不是你写的代码,而且学习怎样写出利于他人维护的代码。

6. 学习多种不同的编程语言,特别是那些与你如今所熟悉的语言有着不同的世界观和编程模型的。

7. 了解硬件对软件的影响。

知道你的电脑运行一条指令须要多少时间,从内存中取出一个字(在有缓存或没缓存的情况下)须要多少时间,在以太网(或者因特网)上数据传输须要多少时间,从磁盘中读取连续的数据或者在磁盘上跳转到还有一个位置须要多少时间,等等。

你还能够从Dave Thomas的21种有用的编码套路中获取灵感(CodeKata.com),或者你更愿意增加一个你家当地的“编程武馆”(CodingDojo.org)。

对于“努力的学习”,我无法像Steve。Peter或者Dave那样提供一个长长的建议列表。我远不如他们有耐心。实际上。在我看来,“编程套路”仅仅需两个招式:

1. 写博客。

我在2004年初创办了CodingHorror.com博客,作为我自己努力学习的一种形式。它在一開始非常不起眼,到后来成为我职业生涯中做过的最重要的一件事。所以。你也应该写博客。

最后“闻达于天下”的人,往往就是那些可以有效书写和沟通的人。他们的声音最响亮,是他们在制定游戏规则,而且引领世界的潮流。

2. 积极參与著名的开源项目。全部的高谈阔论听起来都非常好。可是。你是一个大话王还是一名实干家呢?别光说不练。这个非常重要。由于人们会用你的行动来衡量你,而不是你的言论。努力在公众面前留下些实实在在实用的东西吧,到时候你就能够说。“我在那个项目中出过力。”

当你能编写精彩的代码、而且能用精彩的言辞向世人解释那些代码时。到那时候。我会认为你已经掌握了最牛的编码套路!