解决方法

在对自己已有的技能保持自信的前提下,当接触到新情况时,你应该先放下已有的知识。正如Yoda在电影《The Empire Strikes Back》(星球大战2:帝国反击战)中所说的:“你必须忘记已经学到的东西。”(You must unlearn what you have learned)

系上白色腰带,是基于这样一种认识:系黑色腰带的选手知道该怎么做,而系白腰带的练习者别无选择只能去学习怎么做。

作为一名家庭问题顾问,Dave采用的方法之一就是保持一种不知道的姿态。遭遇困境的家庭都是在经历一种特殊的情况,尽管接受过相关训练,但Dave知道自己不可能完全理解那种情况。虽然,在如何促进建设性的提问和交谈方面,他对自己的技能颇感自信,但他也曾学到:在那些家庭所经历的现实问题上,不要相信自己有任何专家知识。这听起来违反直觉,实际上却是在培养一种尊重和好奇的态度,这种态度能揭开意料之外的可能性和解决方案。Dave不会把解决方案给这个家庭,相反,他的不知道的姿态使他能跟这个家庭形成一个团队,大家一起合作找出解决办法。

采用这种方法来学习新技术会大大加速你的学习过程。训练自己暂停已经习惯的编程机制,这会使你发现新的可能性。然而,作为一名终将因自己获得高水平技能而感到自豪的程序员来说,向无知退一步并让自己看起来很傻会很痛苦。不过,你不妨考虑下George Leonard在《Mastery》(精通)的最后几页上说的话:

有多少次你担心被人觉得愚蠢而没有尝试新东西?有多少回你担心被人认为幼稚而压抑了主动性?……心理学家Abraham Maslow发现,那些能把潜力发挥到显著水平的人身上都有一种孩童般的品质。Ashleigh Montagu使用术语“婴儿化”(neotany)(来自词语"neonate",新生儿的意思)来描述像莫扎特和爱因斯坦那样的天才。发生在朋友或自己身上的一些事,我们认为愚蠢,紧锁双眉;但同样的事如果发生在世界著名的天才身上,我们只会觉得古怪,一笑置之;永远不要忘记:可以随便犯蠢的自由很可能是打开天才成功之门的钥匙。

或者看看下面的例子,一位有10年行业经验的老手一直保持虚心并不断学习新东西:

我已经很专业很成功地编写软件长达十年之久,实践TDD也有好多年,直到有一天,我偶然翻到那本Michael Feathers编著、Prentice Hall出版、不幸被命名为《Working Effectively with Legacy Code》(修改代码的艺术)的书。这本书对我如何编写代码产生了直接而又深远的影响,我给我那个小公司的开发者每人买了一本,并要求他们阅读。从那之后,我的代码库被逐渐改良成一个测试更良好、耦合更松散、适应性更好的系统,对它的开发和维护也带来了更多的乐趣。

——Steve Smith,电子邮件

正如Steve所学到的,我们必须能够放下过去的经验和先入为主,这样才能把新的知识放进来。在你尝试学习第二门编程语言时这尤其困难,因为它可能是你第一次为提高技能水平而牺牲生产率。先前你已经以“空杯心态”解决过一些问题,那时对于解决问题的“正确方法”你几乎没有任何先入之见。现在,在新知识有机会渗入到大脑之前,你必须设法避免将新旧知识混合在一起,并以初学者的心态着手解决新问题。这可能意味着短期内生产率会降低一些,以期在掌握新方法之后能获得技能水平的飞跃。

为了攀登高峰,你必须离开原来那个稳当的落脚处,放下已经取得的成果,甚至可能需要下滑到一个峡谷中。如果你永远不肯放下已经取得的成果,你仍可能不断取得平稳的进步,却永远不能抵达高峰。

——Jerry Weinberg,《Becoming a Technical Leader》(技术领导之路:全面解决问题的途径),第42页

在学习新的语言、工具或业务领域时,培养起这种心态有一种好处:你可以开放地学习如何用合乎惯例的方式表达自己,从而使自己和已有社区的沟通更加流畅。避免了“用各种语言写Fortran程序”的老问题,对新知识就会有更深刻的理解。这样,最终新旧知识融会贯通之时,你已经处在了更好的位置上,可同时从两个领域获得富有成效的见解。

以下面的Java代码为例。这段代码为英国的国家彩票产生随机投注数,方式是打印六个1~49之间的不同数字。

解决方法 - 图1

解决方法 - 图2

如果别人要求你用一种稍微不同的语言,比如Io(这种语言被设计成拥有尽量少的语法元素,同时又能被主流程序员接受)来重新实现这一功能,你可能复用很多Java知识并写下这样的代码:

解决方法 - 图3

但如果你被要求用一种完全不同的语言,比如J来重新实现它,你会发现这种方法不灵了。只有“系上白色腰带”,接受“在一种没有循环的语言中,肯定会有迥然不同但依然有效的方法来解决问题”这一事实,你才能取得进步。因此,按照J语言中的惯用法,答案是:

解决方法 - 图4

后面我们将给出一些模式,来帮你练习,帮你设计玩具程序,并让你有意识地反思手头的工作。对于你的知识来,这些模式能使你更深入地理解不同部分之间的共性,并构造一些情景,让你能研磨自己的技能,而不必承受维持正常生产率水平的压力。