内容


从舒适地带中走出来

Comments

illustration我们都听说过“舒适地带”这种说法。我们每个人都拥有自己的“舒适地带”。在那里我们的生活是可预言的、常规的和没有压力的。当我们处于自己的舒适地带的时候,我们感觉到安全。我们将那些引起压力、使我们焦虑的事情拒之门外。大多数自助书籍、生活指导、业务促进因素等的作用就是帮助我们“达到我们的潜能”,它们鼓吹我们需要走出我们的舒适地带,从而发展我们的思考方法和技能等。

我一直以来都是走出舒适地带的坚定拥护者。我理解那种由于离开舒适的和可预言的安乐窝,被迫张开我们的双翼独自飞翔所带来的焦虑感。然而我总是在想,一旦您迈出这一步,就会非常容易的接纳更新的事物,并且不断向前进。接纳新习惯的一部分,就是需要我们把自己从旧的习惯中解放出来。这需要付出努力,但是一旦枷锁被打破,就不再需要我们付出很大的努力来防止重新回归到旧的行为了。

然而,我现在对此并不是那么肯定了。这几年的学术生涯,我教授面向对象分析和设计(OOAD)的课程。今年,我尝试了一点不同的方法,结果收到了惊喜。这促使我重新评估舒适地带的概念,以及纪律的需要程度(即使是在最简单的事情里)。

背景资料

在 Worcester Polytechnic Institute (WPI),我们有两门本科生课程关注软件工程实践:代码为 CS3733 的软件工程和代码为 CS4233 的面向对象分析和设计。我以前在这一专栏中对这两门课程都做了介绍。1 OOAD 课程通常在软件工程课程之后进行,但也有一些学生由于时间安排的限制颠倒了这一顺序。

我假设选修 OOAD 课程的学生都已经完成了软件工程课程的学习。这就是说他们已经经历过十个人或者更多人作为一个团队来完成一个项目。他们懂得基本的软件开发惯例,例如迭代开发、计划他们的工作、需求管理、测试,等等。

在 WPI 我们有四个为期七个星期的学期。这同大多数学校区别很大。标准上,一个学生在每个学期选修三门课程。上面提到的这两门课程,学生们一共有28课时。在软件工程课程中,为了驱动迭代开发,每一支团队必须在每一个周五演示运转的软件,而不仅仅是出席讲座。在课程结束时,他们看起来真正“获得”了迭代、增量开发的好处。许多学生反映说:这一点是他们从这门选修课上所学到的最有用的东西。

OOAD 课程关注于开发面向对象系统的技术细节。在这门课程中,有一个重大的项目需要被开发,但是团队却很小——通常一支团队只有三至五个学生。项目也是不同的,因为各支团队必须开发一个架构,而不是完成一个应用程序。目标是生产出可执行的体系结构,例如在一个遵循 IBM® Rational Unified Process® (RUP®) 的项目的精化阶段被生产出来。我在前两年里所做的工作就是,将这一可执行的体系结构作为软件工程课程的出发代码。这为我节省了大量的时间,因为每一年我只需要为软件工程的相关课程定义一个简单的项目。2

以前 OOAD 所提供的知识同软件工程课程相类似。每个星期五,团队展示前一个星期的迭代工作。今年,我废止了该门课程的每周迭代展示。我这样做是出于以下几个原因。首先,较之以往我们有了更多的团队,不可能有足够的时间让每一支团队都进行展示。其次,我希望在课堂上介绍更多的知识,额外的讲座更加受欢迎。我想看一看没有每周展示要求的团队将会工作的如何。他们会不会自觉的进行每周迭代呢?他们会不会有效的管理需求呢?

OOAD 2007

这一年,OOAD 团队在提交他们的最终项目陈述前有两个检查点。他们必须描述他们的设计、解释他们的体系结构,等等。我们使用修改的 RUP Software Architecture Document 作为团队交付的大纲。他们还必须提交他们的代码。然而,除了最终提交之外,并没有要求在指定的时间点必须完成一定数量的代码。如果他们一直在实行迭代开发,那么代码将是一个很自然的成果。

2007年的项目较之我以前所使用的大多数项目来说有一些抽象。我希望学生们实现一个表现软件开发过程的架构。我的想法是让软件工程课程以多人游戏的形式执行一个可实行的过程。3 由于我们讨论软件工程课程中的软件过程,所以我觉得学生们表较熟悉问题的范围。但事实证明情况并非如此。他们理解如何决定使用哪种实践以及何时使用,但是一般而言,他们并不具备足够的经验舒适的处理一个更加正式的过程模型。

当然,课程的目的是让学生们学习设计和分析,而不是建造那些我能够在其他课程上使用的软件。学生们明确的知道这一核心概念,并且能够应用它们。但是,我必须承认,我的学生们在七个星期过后,使这个项目成为多年以来第一个没有被成功展开的项目。一直以来,我总是感觉这将有可能变成事实,结果我最终找到了他们的界限。

学习并不等于通晓

OOAD 课程中的每一支团队必须在课程结束时用30分钟描述他们的工作。他们必须谈到技术细节、体系结构、所使用的模式,等等。他们还必须讲到他们的过程、所使用的工具,并且给出在项目中什么有效、什么无效的一个描述。对于那些不是最佳的事物,他们需要讨论在下一个项目中需要做出什么改变。每一名成员还必须对项目做一个回顾。这为每个人提供了一次机会,使得他们能够讲出自己对于团队的贡献,以及那些没有同整个团队分享的个人看法。

想象一下,当超过半数的团队承认他们遵循一个相当简单的瀑布过程时我的惊讶之情!实际上,为什么这么多项目没有足够的架构被执行。各支团队只是说他们遵循了一个瀑布过程。他们说:“我们应当从较为简单的代码开始”或者“我们花费了太长的时间以至于我们的设计没有准备好”。使用这些陈述作为我们谈话的开始,我更加深刻的明白了在项目中发生了什么。通常来说,结果并不是那么令人吃惊,但是它向我指出:我放松了警惕并且假设学生们不仅学习了软件工程的课程,而且他们消化了并且能够适当的应用这些知识。无论我们是否认识到这一点,学生们非常容易退回到他们的舒适地带,关于这一点,我找到了一些普遍因素。

习惯需要时间

如果您想要养成某种习惯,就必须花费一定的时间,这一点是人所共知的。到底需要多长时间,取决于您所要养成的习惯以及您本身。今天的人们,特别是那些希望在某些事情上做得更好的人们,似乎不断的通过养成新习惯来改变他们自身。如果您超重,您就会努力吃得更好。如果您想要拥有更健美的身姿,那么你就必须走进体育馆练习,或者走出户外跑步。

习惯,就是那些我们不需要思索就做出的事情。当我们面对问题时,如果我们有若干条行动路线可供选择的话,那么我们希望采取那条适当的路线,因为这是我们的习惯。在我们的头脑中有一组好习惯的集合,我们知道正是它们使得我们的日常生活过的美好。

如果您已经对每件事养成的习惯,那么您就会本能的作出反应。这同学会一个新习惯迥然不同。当它成为习惯的时候,您已经将这种行为内在化了。显然,以我的学生们为例,他们已经学习了如何迭代工作,但是他们并没有将它作为一种习惯。所以,这让我思考伟大的软件开发人员习惯性的技巧和人们的习惯。我花了一小段时间来研究我自己的习惯和条件反射。我提出下列关于习惯的观察报告,希望它们能对您当前的或者是今后的软件开发项目有所帮助。我并不声称所有这些观察报告都是新的,但是我想如果您留意它们,那么你就可能在处理项目团队和您自己的习惯和技巧时不需要思考它们。

实践、实践、再实践

您可能学会了一种新的技巧或者习惯,但那并不意味着您能够很好的利用它们来完成任务。这需要练习。我们都清楚这一点。这就是为什么运动员每天都要花费许多时间来练习基本的技巧。我们的肌肉必须通过训练来对一定的刺激做出一定的反应。我们知道重复练习可以获得健美的肌肉。音乐家需要同样类型的练习。观看一位世界级音乐家的练习,您将发现她花费大量的练习时间来热身她的音域、和音以及不同的练习曲。艺术品鉴赏家必须首先成为一名出色的技术师,具备基本的实践习惯。他们在执行时都不需要思考。

然而,联系必须十分专注。如果一名中长跑选手每天只进行速度练习,那么他将不能提高自己的耐力。他需要的是速度和耐力练习的综合。音乐家的情况与之类似,他们必须既要将时间花到那些他们已经非常熟悉的东西上面,也要花时间来学习新的技术和音乐作品。

软件工程的同学们也必须不断练习他们所学的知识。无论练习使用何种编程语言,都将提高他们的编程风格,并且使他们积累更多的解决问题的技巧。练习使用一种特定的语言来变成,能够提高他们对这门语言的功能的理解能力,以及如何将想法用代码最好的表达出来。学生们还必须联系其他所学的技巧;他们的生活必须看起来就是在不断的练习。他们的问题之一就是时间管理。当你需要练习多种技巧的时候,生活就变得异常复杂了。试图同时养成多种习惯的时候更加困难。

职业人员也需要时间来进行练习。您雇佣一些人完成某项工作。如果您遇到一个需要特殊技巧的特定问题,就需要雇佣一位具备那种技巧的专家。但是当那个问题得以解决后并且没有其他的问题需要那种技巧的时候会发生什么呢——您那是会怎么做?如果您是一位聪明的管理者,您就会给那位雇员一些学习和练习新技能的时间。

今天,许多(也许是大多数)公司都为他们的雇员制定了学习目标。每一位雇员都同意管理者所制定的目标,并且他们一起为如何实现这个目标制订计划。这个计划通常包括雇员参加课程所需要的时间和资源。这些课程可能是内部培训课程或者是外部课程或者是会议。但是在参加完培训之后,会发生什么呢?往往是雇员没有时间来练习技能,从而迅速的丧失了该技能。当这些雇员需要在将来的项目中使用那些技能的时候,他们还必须重新学习,几乎是从头再来。

这是一个简单的测试,用来证明我的观点。许多读者都在大学期间接收过微积分课程的训练。我确信你们仍然记得一些简单的规则,并且能够迅速地告诉我 x2 的导数是 2x。那么,您是否能够告诉我下面这个问题的答案呢?

在我毕业后工作在计算机科学领域中之前,我的专业就是数学。但是在这段时间里,我更多使用的是离散数学而不是微积分,所以我需要复习才能够找出答案。4 我们不再讨论微分方程式。我所要说明的是,如果我不进行练习,那么我就会丧失学生时代所掌握的技巧。

如果我们不进行练习,我们就会丧失技能,既包括身体上的也包括精神上的。当我们学习一项新的技能时,我们必须不断的加以练习才能够保持它。当我们将这些技能消化之后,也许我们不再需要那么多时间来练习它们,但是我们还是必须进行适当的练习,否则就会萎缩。

指导

我在前面提到过,练习需要有的放矢。这就是教练、顾问或者老师所扮演的角色。他们懂得将技能变成习惯的过程。我开始认识到这项工作是多么的重要,我思考我的 OOAD 课程反射出一些我从事商业公司所积累的经验。

我已经多次被邀请帮助一支项目团队提高他们的性能。通常,当我见到那只团队的时候,我发现我所要传授的技能,那些项目成员都具备。团队往往试图在一些领域中提高自己,例如精通迭代开发和时序安排他们的工作。去年夏天我所接触到的一支团队正是具有这些需要。

我并不想让任何练习变得平凡,但是学习如何在迭代中使用类似 XP Planning Game5 的方法并不困难。关键是团队需要对其加以练习,邀请一些专家来评价他们的性能并且帮助他们做得更好。这就是教练所能够起到的最大作用。教练帮助团队成员从他们各自的舒适地带中走出来。是的,教练应当具备过人的技术能力,但是团队成员的技术通常也很强。教练只需要知道何时推动或者刺激一下团队成员,使得他们依靠自己的能力获得提升。

作为一名教师,我需要同样的技巧。我不会只给学生那些容易的问题。但是,如果我给他们的都是非常难的问题,那么他们就没有机会来养成良好的解决问题的习惯。关键是如何平衡两者之间的关系,使得学生们获得信心,并且更容易在下次摆脱他们的舒适地带。

动力

一直以来我就知道,如果您想要学习新的技能并且掌握新的习惯,就必须改变自己做事的方式。我将其称之为动力。但是,想要并不意味着付诸行动。动力是指我们有动力去做某件事——我们有一个动力。字典里对动力的解释是导致一个人采取行动的某件事(比如一种需要或者愿望)6

在想和做之间,存在着根本的不同。关键是动力。今年发生在我的 OOAD 课程的学生们身上的事情就是一个很好的例子。他们知道迭代开发远比使用瀑布过程要好。他们知道越早编码越好。然而,我们有给他们走出舒适地带并且依照他们所知道的来行动的动力。和软件工程课程不同,他们没有被推动每周都完成一部分软件工作。我并不认为问题是退回到旧的习惯中。是由于他们没有真正消化迭代开发,所以他们才更愿意停留在自己的舒适地带中。如果我要求他们每周都完成一部分软件工作,那么他们就会从自己的舒适地带中向前迈进一步。

我让我的学生们失败了。虽然已经在 WPI 工作五年了,可是我仍然在学习如何成为一名优秀的教师,仍然在提高自己的授课技能。我学习了许多关于动力的知识。我想知道有多少项目领导者和管理者认识到自己拥有多少动力的力量。动力并不是设置不切实际的目标,并且强迫人们通过严厉的规则到达那些目标。动力给人们以行动的动力,而不仅仅是想要达到目标。将目标变成人们自己心中的目标,使他们向着目标不断前进。

如果您寻找激励人们的方式,您就会发现它们无处不在。想象一下时下的一些减肥项目。一些成功的项目都是人们有规律的见面,学习如何吃得更好,并且相互鼓励。可见,最大的动力就是您能够看到自己的过程。如果您减掉了一些体重就会赢得祝贺,相反,如果没有减掉体重您也不会受到责备,但是如此反复和加强的练习将最终使您到达目标。这些项目之所以更加有效,原因就在于动力。

我喜欢骑自行车……

每当我们尝试做一件我们从来没有做过的事情的时候,一些善意的朋友就会告诉我们“这就像骑自行车一样,一旦学会了就不会忘掉。”我不愿意戳穿这种说法,但是实际上确实不是这样的。

就像我们能够养成新的习惯一样,我们也能够摆脱旧的习惯。有时这是一项非常困难的任务。有些习惯是受到烟碱或者酒精上瘾等外力的影响所养成的。从这些习惯中解脱出来往往需要采用新的习惯来替代它们。但是,也有另外一些习惯,我们可以非常容易的摆脱掉。通常是那些我们费了很大力气才养成的习惯。

想象一下,努力减掉体重并且改变饮食方式的人。他们达到目标体重并且得以保持,直到他们开始做出一些轻微的改变。也许只是饭后的一点糖果,或者一包脆饼干。不久,其他的一些小零食也将成为日常习惯,并且不断的有新的内容加入。很快,花费很大力气才减掉的体重又重新回来了,减肥者又不得不从头再来。7 丢掉一个以获得的习惯是很容易的。我们之所以会回到原来的舒适地带,是因为——它很舒适。8

当我们处于压力之下时,也很容易回归到旧的习惯上去。压力导致我们逃回到自己的舒适地带。在我的 OOAD 课堂上,许多学生正是这么做的。由于他们没有将迭代开发作为一种习惯,所以当他们面临解决一个特别抽象的和困难的问题的时候,他们就会选择自己的舒适地带。在他们的观点看来,没有什么动力去添加额外的迭代开发的工作。

总结

我知道我所讲到的对于您来说并不是什么新鲜的知识。我希望您能够花几分钟的时间仔细思考一下上面所提到的观点,并且识别出哪些地方可以被作为管理者或者团队成员的您做出改变。找到一条途径,帮助那些采纳和保持新习惯的人逐渐的走出他们的舒适地带。您们都会为自己所做的工作感到高兴。

与此同时,我将设置闹钟,以便我在这个月里每天都能够早起一个小时来练习我的写作。我希望成为一名更好的作者,也许我的沉思将为我提供动力。

注释

1 请参见 http://www.ibm.com/developerworks/rational/library/dec05/pollice/index.htmlhttp://www.ibm.com/developerworks/rational/library/2758.html

2 由于学生们最擅长的一件事情就是查找前面相似的项目,所以我不喜欢复用项目。我们希望我们的学生学会如何复用而不是重新使用,我们不希望鼓励剽窃。

3 一篇文章将这种计划类型描述为 "Software Process Modeling and Execution within Virtual Environments," Doppke 等人,发表于 ACM Transactions on Software Engineering and Methodology, January, 1998.

4 顺便说一下,答案是8/3。

5 请参见 http://wiht.link/extreme_programming

6 Merriam-Webster 在线词典: http://www.m-w.com/

7 我根据经验如是说。如果我没有严格遵守我的减肥和保持计划的话,那么我一定会重新长出好几磅肉的。

8 我的一生不止一次的提醒我说“脂肪很好吃”,这就是为什么我如此喜爱垃圾食品的原因。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=282099
ArticleTitle=从舒适地带中走出来
publish-date=01152008