解决方法
在一个可以很轻松犯错误的环境中,花点时间不受干扰地实践你的技艺。
在理想的世界中,我们可以采用K.Anders Ericsson的研究中所描述的“刻意实践”(deliberate practice)技术,指导者基于对你能力和弱点的了解,给你布置一个练习。等这个练习结束,指导者基于一种目标标准和你一起评价你的成绩,然后和你一起设计下一个练习。指导者会基于她指导其他学生的经验来设计新的更具挑战性的练习,这些练习将促使你反思自己的技能,找到更有效的工作习惯,并开发出基于更加抽象的知识“块”来“看”问题的能力。久而久之,这一连串的练习会磨炼你的力量,纠正你的弱点。悲惨的是:我们并不生活在一个理想的世界中,学徒们必须借助自己的资源来达到同样的效果。
在软件开发中,我们是在工作中实践,这也是我们会在工作中犯错误的原因。我们需要找到把实践与职业分离开来的方法。我们需要实践期。
——Dave Thomas[1]
“注重实效”的Dave Thomas借用了武术中的概念,提出了编码路数。“路数”(Kata)是师傅为了让徒弟对武术基础心领神会而专门设计的一系列动作。“路数”是在没有对手的情况下练习的,强调的是流畅性、力量、速度和控制力。Dave Thomas在他的博客中发布了一些“路数”,鼓励技师们通过“路数”来实践。
Laurent Bossavit和一组巴黎的软件开发者将武术的比喻进一步发扬,他们建立了编码人员的“武馆”(dojo),一个人们可以定期聚会并公开练习编码“路数”的地方。受巴黎编码“武馆”的启示,Bob Martin“大叔”也在自己的博客中发表了一些“路数”,来宣扬工艺实践的好处。
初学者学习靠的是动手,而不是说教。他们实践,实践,不断地实践……通过不断反复这些同样的练习,我们增强了自己的技能,训练自己按照TDD和简单设计的原则对问题做出反应。我们一遍又一遍地重新排布自己的神经细胞,使其按正确的方式做出反应。
——Robert Martin[2]
显然,编码“路数”只是“不断实践”的方式之一(“质脆玩具”是另一种)。这一模式的关键是划出一些时间,在一种没有压力、又充满乐趣的环境中开发软件:没有发布日期、没有产品问题、没有外界打断。Dave Thomas如此评说实践:“它必须让人感到轻松,因为如果你不能放松,你就不会从实践中学到东西。”
实践过程需要结合较短的反馈回路。虽然理论上实践是有益的,可如果你得不到周期性的反馈,你很可能养成坏习惯。这正是编码“武馆”最有意义的地方:在紧密联系的技师社区中公开练习。作为一名技师,随着你的不断成长,这种对于持续反馈的需要会慢慢降低,并逐渐被高级学徒所应承担的责任所替代:与经验更少的开发者一起实践,并在此过程中培养好的习惯。
George Leonard所描述的那些师傅们之所以喜爱实践,原因之一是每次实践的时候,他们都做一点不同的事情。问题的关键并不是刷新记忆,而是在哪怕最简单的技能活动之间找出细微差别。也许你的祖母曾跟你说:“实践产生完美。”她说得不对。实际上,实践产生永恒。因此,要悉心关注你所实践的事情,经常评估一下,确保自己实践的东西没有过时。每天选择正确的事情来实践是一种技能,这几乎跟反复实践这一行为本身同样重要。在实践期间,确保自己拥有趣味练习的方法是涉猎一些老书,如《Programming Pearls》(编程珠玑)、《More Programming Pearls》(续编程珠玑),还有《Etudes for Programmers》(程序员练习曲)。它们都是很久之前写就的,足以确保它们别无选择,只能关注于计算机科学的基础,而不是最新的时髦框架。这些书的作者们都知道,深入领会算法复杂度和数据结构基础没有坏处,而且时时有用。这些主题也提供了一个几乎用之不竭的趣味小问题源泉,使你的实践期保持有趣、新鲜,并充满教育意义。
[1]Dave Thomas谈编码路数:http://codekata.pragprog.com/2007/01/code_kata_backg.html。
[2]Robert Martin谈编程“武馆”:http://butunclebob.com/ArticleS.UncleBob.TheProgrammingDojo。