爱立信提出,要紧的并非经验本身,而是努力的学习,也就是要不断地挑战自己能力以外的东西。一些狂热的喜好者花费了很多的时间去下棋、打高尔夫球或者玩乐器,但他们可能一直停留在业余水平上,而一个练习有素的学生却可以在相对较短的时间里超越他们,缘由就在这里。值得注意的是,在提升水平方面,花费在下棋上的很多时间(即便参加各种比赛)好像还是比不过专门的练习来得更为有效。练习的主要价值在于发现弱点,并有针对性地进行提升。
努力的学习意味着,要常常去处置那些刚好在你能力极限上的问题,也就是那些对你来讲有非常大可能失败的事情。假如不历程一些失败的话,你可能就不会成长。你需要不断地挑战自我,超越我们的极限。
那样的挑战有时会在工作中碰到,但也未必。将训练从职业工作中离别出来,这在编程范围常让人称为编码套路(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开出的这个清单,是由于它看起来非常全方位。有的技术员一想到训练,一直认为就是一些编码上的难点。但在我看来,编程更在于人,而不是代码。因此,通过解决世上所有些、并且晦涩的编程面考试试题目,在提升你的个人能力方面,这种办法是有局限的。
关于努力的学习,我也非常喜欢PeterNorvig在Teach Yourself Programming in TenYears(花10年时间自学编程)一文中提出的很多建议:
1.与别的技术员交流。读其他人的代码。这比任何书本或培训课程都更要紧。
2.动手写程序!最高效学习办法就是边做边学。
3.在本科或研究生的课程中学习编程课程。
4.找一些项目来做,并且需要与其他技术员形成团队来合作。在项目的进行过程中,掌握分辨最出色的技术员与最糟糕的技术员。
5.在项目中跟随别的技术员一块工作,知道怎么样维护那些不是你写的代码,并且学习怎么样写出利于别人维护的代码。
6.学习多种不一样的编程语言,尤其是那些与你目前所熟知的语言有着不一样的世界观和编程模型的。
7.知道硬件对软件的影响。了解你的电脑实行一条指令需要多少时间,从内存中取出一个字(在有缓存或没缓存的状况下)需要多少时间,在以太网(或者因特网)上传输数据需要多少时间,从磁盘中读取连续的数据或者在磁盘上跳转到另一个地方需要多少时间,等等。
你还可以从Dave Thomas的21种好用的编码套路中获得想法(CodeKata.com),或者你更想加入一个你家当地的编程武馆(CodingDojo.org)。
对于努力的学习,我没办法像Steve,Peter或者Dave那样提供一个长长的建议列表。我远不如他们有耐心。事实上,在我看来,编程套路仅需两个招式:
1.写博客。我在2004年初创办了CodingHorror.com博客,作为我一个人好好学习的一种形式。它在刚开始非常不起眼,到后来成为我职业生涯中做过的非常重要的一件事。所以,你也应该写博客。最后闻达于天下的人,总是就是那些可以有效书写和交流的人。他们的声音最响亮,是他们在拟定游戏规则,并且引领世界的时尚。
2.积极参与著名的开源项目。所有些高谈阔论听起来都非常不错,但,你是一个大话王还是一名实干家呢?别光说不练,这个尤为重要,由于大家会用你的行动来衡量你,而不是你的言论。努力在公众面前留下些实实在在有用的东西吧,到时候你就能说,我在那个项目中出过力。
当你能撰写精彩的代码、并且可以用精彩的言辞向世人讲解那些代码时,到那时候,我会感觉你已经学会了最牛的编码套路!