解决方法
找机会跟另外一个软件开发者坐在一起,肩并肩完成一项实际动手的任务。有些东西,只有当你跟另外一名开发者坐在一起完成共同目标的时候,你才能学会它。
这一模式可以密切联系“同道中人”。Dave就是这样的,他与Roman结伴,之后便通过午饭时间密切交往,一起学习像Ruby编程和Eclipse插件开发这样的技术。然而,即使Roman当初没有成为Dave的同道中人,但只要跟一个天才的程序员并肩工作,哪怕是做宠物项目,也同样能使Dave获益良多。总会有一些细微的技艺,只有跟一个同事近距离合作才能学到。这些技艺通常被认为太琐碎,没人会在教别人的时候提到它,但它们的影响却可以累加起来。作为一名开发者,与Roman的合作对Dave所取得的进步至关重要,因为那时在他的职业生涯中,很少能有机会跟天才的开发者一起工作。
“结对编程”这一实践就是该模式的一个例子,学徒们应该寻找机会,到一个使用这种技法的团队工作。对学习来说,结对编程是一种非常好的技艺,但它也是一种复杂的活动,而且它本身不见得总能让人觉得好。但是,如果你有效地使用它,它就会成为最强大的学习方式之一,特别在你向指导者学习的时候。可是你如何知道结对编程是否被有效使用呢?学徒们又能做些什么呢?
当你通过结对编程来实施这一模式的时候,你常会感觉自己走丢了,或者落后于同伴太多。这不代表结对编程失败了——它只能说明你需要问一些问题,让过程慢一点,或者忍受这种迷失的感觉并努力拣起那些你能理解的片段。但是,如果你连续几周一直觉得自己落后,觉得自己开始绝望了,那就是做点改变的时候了。你可能卡在一个不太好的结对搭档身上,也可能你需要给他一些建议来改善你的体验。作为学徒,你或许没有太多力量来改变自己的处境,但如果工作在一个多人的项目中,你就有机会每天或每周不断地轮换结对搭档。这种轮换能让你慢慢走出困境,重新回到进步的道路上。此外,如果你正在实践测试驱动开发,你可以建议大家使用“乒乓编程”[1],并把它作为提高自己参与度的方法。
根据Richard Sennett的《The Craftsman》(技师)一书,最理想的技师工场是这样一种地方:你在那里可以“吸收那些只可意会、不可言传的知识;靠每天的点滴进步积累成一种实践习惯。”(第77页)。由于如此理想的环境如今非常少见,我们不得不使用“密切交往”模式作为现代的替代品。这一模式的应用不只限于结对编程。我们的目标是接触到那些技能更加娴熟的人,学习他们的日常工作习惯,观察他们靠什么方法将那些习惯逐渐磨炼成高超的技能。这些习惯不只限于编码,也可以延伸到软件开发的方方面面。
例如,你可能在一篇学术论文上,一份演讲稿上或者开源项目的一次冲刺(sprint)中跟某人合作。或者,就像Ade当初那样,你主动去帮助一个人,这个人用UNIX shell脚本写了一套内容管理系统,在设计其中的依赖管理模块时希望应用图论知识。有些人想用非底层的工具去解决一个你可以用高级语言自动解决的问题(或者相反),跟他们共享一块白板,你就能迫使自己暂时按他的思路来思考,从而更有效地交流。即使你最终拒绝了他的观点,也会获得一种新的看待问题的方法。这一视角可能是未来某个问题的正确解决方案,即使眼下你觉得它很不靠谱。
不管你对密切交往的体验是正面的还是负面的,你都应该“记录所学”,以后可以回过头来想想自己的经历。有一天你很可能处在你的结对搭档当初所处的同一位置上,这时,对于坐在你旁边的新手,以前的经验会让你对他的心态有非常宝贵的感悟。
[1]Dave Hoover,"Ping-Pong Programming"(乒乓编程),参见:http://www.stickyminds.com/s.asp?F=S9101_COL_2。