注:本文原载于http://www.juvenxu.com/2013/03/28/programming-talent-is-overrated/

《哪来的天才?》是一本值得一读的书,书的核心观点大致为“卓越的能力并非天生,而是后天长时间的刻意练习而得的”,这观点适用于所有领域,包括体育、音乐、医学、商业等等,当然,放到编程领域来说也适用。书中有大量的案例来佐证作者的这一观点,包括家喻户晓的莫扎特和老虎伍兹,这里我不再赘述。基本上,我是认同作者的观点的,那么接下来的问题是,何为‘刻意练习’?如何去做?

enter image description here

作者说刻意练习:

  1. 它是为了提高绩效而被设计出来的。
  2. 它可以反复很多次。
  3. 对结果的反馈是可以持续得到的。
  4. 这是非常费神的。
  5. 这并没有多少乐趣。

在某些领域,这很好理解,比如我曾经练过一段时间的吉他,基于老师指导的练习基本就符合这五条,还有运动员的练习,也完全符合。回过头来看看编程领域,存在这样的练习吗?

Robert C. Martin在《程序员的职业素养》中有两章与这一话题相关,其中第6章‘练习’介绍了Coding Dojo和Coding Kata等方法,这些方法的确有效,也基本满足上述五条,但大部分的Dojo或Kata基本都基于小型问题的练习,而软件开发涉及的领域太广太复杂了,往下到操作系统内存调度,往上到大规模互联网企业的架构,业界基本无法提供针对这类技术的练习,大家只能在实际工作中积累。该书中的第14章“辅导,学徒期与技艺”强调教导的重要性,这非常暗合上述的第1和第3条,导师能帮你设计适当的练习(这也可能是实际工作),同时给你反馈。但不幸的是,正如作者所说,我们的行业严重缺乏这样的导师机制。

enter image description here

除此之外,我认为结对编程也是一种行之有效的刻意练习,这种编程方式非常费神自然不必说,实践过的人都能体会,这里的关键是,通过结对编程这种工作方式,你能持续地得到反馈,这对于提升技艺来说无比重要的。

同时我也发现一个不幸的事实,那就是大量简单的阅读对提升技艺其实并没有很大的帮助。阅读如果缺乏明确的目标(读完一本书不算个明确的目标),如果不去反复咀嚼,那效果就甚微了,更何况大部分时间我们都是独自在阅读,根本得不到任何反馈。有些教材类的书会有习题和答案,那是一种很好的练习及获取反馈的方式,但工作以后,行业中这类书几乎没有。有一种充分发挥阅读功效的方式是小组阅读,一组人读同一本书,定期分享心得体会,如此,反馈就比较充分了。

Robert C. Martin并不是唯一一个认识到刻意练习价值的编程大师,Andy Hunt在他的著作《程序员的思维修炼》中也花了大量的篇幅讲主动学习,介绍了很多具体的方法和工具,例如SMART目标(Specific, Measurable, Achievable, Relavent),SQ3R阅读,思维导图等等,这些内容都非常的有价值。Andy还提到说教学是学习的一种很好的方式,这一点我深有体会,我写《Maven实战》的过程就是一个不断学习的过程。

enter image description here

我们中的大多数人不大可能成为世界级的程序员,其中之一的原因是,我们之间的学习练习积累已经远远比不上那些从小学时就编程的人,另外一个原因则是,我们也不会年复一年的去坚持大量的学习和练习,这有性格的因素,也有现实的因素。但是,这也不代表我愿意随波逐流,一事无成的过一辈子,我总希望自己有所成就,即使不大,但至少会让生活充实点,让家人生活更好点。因此我们不必非要从成功学的角度来读这本《哪来的天才?》,但我也很讨厌某些人动不动就来“一万个小时”,奶奶的,老子只是个凡人。