在心理学家的眼中,人们在完成特定任务时的工作绩效,是由任务本身及其承担者对任务理解的深度共同决定的。心理学家同样认为,工作绩效同时也受到任务承担者个体在诸如性格和智力等方面差异的影响。尽管性格是可以改变的,而且智力也可以有所提高,但是工作绩效的实质提高还要依赖于培训和实践经验。
不过心理学本身并非一门严密的科学,而且也从来没有严密过。无论心理学家如何对任务及其承担者的理解深度进行考察,无论他们如何对任务承担者个体之间所有差异进行衡量,无论他们如何考虑到培训与实践经验,工作绩效总还是有很多方面无从解释。在所有因素都被考虑到之后,剩下那些无从解释的部分就称为“积极性”。经常出现的情况是:如果某个人的积极性没被激发出来,就不可能很容易地使他投入到学习之中;反之,如果他动力很足,就没有任何办法可以阻止他学习。
=====================
积极性
人,并不只是被动地受制于环境的玩偶。相反地,人们更愿意相信:人类可以自行确定应该对环境中的哪种刺激做出反应,哪些是应该忽略的,哪些信息是值得学习的,哪些信息又是可以置若罔闻的。这些观察的结论,构成一种理论的基础,这个理论可以用来解释人们的某种内在的“导向驱动力”或者“内在的弹力”。这种内在的导向力,正是我们大多数人所指的“积极性”。
主管们所犯的一个错误就是,他们总是假设:工作绩效差的原因是由于缺乏积极性。于是他们企图借助一点“外部驱动力”的不足。而在这种时间,其实程序员所承担的外部压力往往已经够大了,而并非不够。关于积极性,最广为人接受的一项研究成果是:如果适当增加“驱动力”,那么在开始阶段确实可以提高工作绩效;但是,一旦超过一定的极限之后,继续增加这种“驱动力”只会很快地令工作绩效降为0。给程序员施加高压以期他们能够很快地排除某个程序错误,这种做法已经被证明是最差的策略,尽管截至目前,这仍是最常被采用的策略。
与工作中的程序员有所接触的任何人都会懂得:只要允许程序员按照自己所偏好的方式进行工作,那么程序开发这项工作本身就是对他们最大的激励。
=====================
培训、课程学习与教育
成员们都在一个令人敬畏的领导手下,为一个实际的项目共同工作过数年。然而,这数年的时间意味着培训与经验的积累。
大致上讲,我们所说的“教育”,指的是掌握一般性的原理与技巧的过程;而我们所说的“培训”,不过是学会某种特定技能的过程。
=====================
学习的阻力
令人吃惊的是,只有当存在阻碍学习的负面作用力时,学习才会失败。在教学的过程中,人们过分强调了,如何通过各种精巧的措施或窍门去激发学员的学习积极性。但是,只要观察一下儿童的学习过程,我们就会发现,只要任由儿童自己来决定学习的方向,他们总是可以学到大量的东西,虽然这些东西不见得一定是我们所期望的,但是不管怎样,他们将会学到很多。
然而对于成年人来说,阻碍学习的障碍通常来自我们自己的内心,而一旦可以任由自己做主,通常成年人都不再能学到什么新的东西。首先(而且也是最重要)一的点是:在开始学习之前,我们需要承认有一些东西值得去弄清楚,而自己还不懂。在专业程序员的观念中,承认自己某个方面知识的缺乏,就意味着地位的降低,除非他能够认识到:作为一位名副其实的专业人员,作为一个真正有实力的人,承认自己的不足,不会有任何损失。
有些人总是心甘情愿地承认自己的不足,而不去尝试学习任何新东西。其原因在于,他们总是想当然地认为,自己不可能取得成功。这种对失败的畏惧心理,有的是由于缺乏自信心造成的,也有的是源自先前此类努力过程中的失败经历。但是更普遍的以情形是,这类恐惧主要并不在于失败本身,而在于失败可能被周围人看到。
如果身处某个集体之中,人们更愿意应用自己已经掌握的知识,这样会妨碍接受新的知识。如果要进行学习,我们首先必须做法犯错误的思想准备,但是如果我们周围有别人在场,那么克服自己的畏惧心理将会显得更加困难。事实确实如此,如果使用的知识是众所周知的,那么也许正是由于有周围人在场,我们会努力去避免犯错误。如果把这种结论推广到学习程序开发技术中,我们就可以自然而然地猜测:在首次学习某种新程序语言时,如果是在一个只有终端相伴、与世隔绝的环境中,那么学习的效果将会最好,因为这时任何错误都不至于为人知晓。
在这里至关重要的一个概念,就是所谓“技术的可扩展性”,也就是说,在初次学会某项技术之后,还能否在其他环境条件下再次应用。每当我们掌握了一种通用的技术之后,我们的能力并不是简单增加,而是成倍增加。还有一种技术,与通用的、可扩展的技术恰恰相反,我们称之为“穷途末路的”(Dead-end)技术。
在程序开发方面,我们时常碰到某个程序员,他在解决规模不超过某个特定范围的问题时干得不错,但是他却无法逾越这个规模的界限。实际上,有时我们也会遇到截然相反的情况,有些程序员平时默默无闻,直到需要解决更大规模的问题时,他们才有英雄用武之地。在前一种情况中,在小规模问题上大显身手的技术,将无法在大型问题中得到有效的应用;而在后一种情况中,用功能强大而且通用的技术来解决非常简单的问题,只能造成巨大的额外开销。
作为一个例子,让我们来对比二分搜索和顺序搜索之间的差别。当编写的程序需要在一个只包含10页记录的列表中进行搜索时,如果采用二分搜索,则可能反而程序的开发进度,甚至会降低程序的运行速度。而在解决这一特定问题的时候,那些也许根本不懂得二分搜索的程序员,可能反而令这种“高级”技术的程序员黯然失色,因为后者虽然掌握了这种高级技术,但是却没有进一步意识到这种技术的应用范围。无论如何,问题的解决规模翻倍之后,二分搜索的速度约不至于降低50%。然而,顺序搜索则不然,问题的规模稍微扩大(比如在1000个记录中进行搜索),其速度的下降就远远不止这种程度。
无论是在正式的课堂环境,还是工作环境中,对新事物的畏惧、对失败的担忧以及不情愿承认自己的弱点,都会成为学习的直接障碍。其他问题则是间接出现的,大部分这类问题的原因,都在于对要学习什么、如何去学习等问题缺乏足够的认识。
如果遇到的问题来自于自己不熟悉的某个背景,那么通常我们可能会犯两种错误,或者把问题的难度估计过头,或者把问题想象得过于容易。
=====================
如何学习程序开发
掌握学习之道的第一步,就是要了解自己拥有什么,缺乏什么,也就是要有“自知之明”。
[下面这个例子,让自己有所启发]
在一次测验中,有两名学生正在做一道算术题:25-16。如果其中一名学生给出的答案是19,而另一位学生给出的是41,那么通常他们都将被贴上“不懂得减法的学生”的标签。但是,只要其中任何一名学生运气好,能够遇到一位好老师的话,这位老师就可能从他们的错误答案中挖掘出更深层次的信息,并充分加以利用。
作为程序员,只要希望学习,那么你就必须一边顶住来自管理层的压力,一边花时间对自己成功进行总结。而对于管理人员来说,一个好的做法就是:每当程序员宣称自己的项目已经“大功告成”时,给他一天的时间放松一下,这并不是一种奖励,而是为了让程序员更加深对该项目的理解。
为了提高程序员的工作效率,我们可以从两个主要方面着手:培养他们对工作的渴望,并使他们掌握为完成工作而必须具备的知识。前一方面称作“积极性”,而后一方面称作“培训”(或者,如果其内容具有足够的一般性,也可以称之为“教育”)。