摘要:本文Dreyfus模型部分引用了人月神话blog上的部分内容,其它主要是结合Dreyfus模型说明程序员是如何从小工到专家的。

 参考资料:

  1. http://blog.sina.com.cn/s/blog_493a84550100c8vz.html
     
  2. http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition
     
  3. http://en.wikipedia.org/wiki/Tacit_knowledge
     
  4. http://en.wikipedia.org/wiki/Dunning-Kruger_effect
     
  5. http://www.infoq.com/cn/articles/systems-development-discipline
     
  6. http://www.infoq.com/cn/articles/better-best-practices
     
  7. http://blog.bruceabernethy.com/post/The-Dreyfus-Model-of-Skills-Acquisition.aspx
  8. http://www.sld.demon.co.uk/dreyfus.pdf
     

       你有没有想过,即使是一个专家也曾经是个菜鸟,但是他们是如何是成为专家的呢?我对这个过程很感兴趣,这几天找了点资料,也谈一下我自己的感想。

       上世纪70年代后期,有兄弟俩花费了一些时间来研究学习的本质。他们对刚刚出现的人工智能发生了兴趣,并希望让电脑可以学习诸如下棋这样复杂的技能。当时对于围绕着学习过程所建立起来的知识还很少,也就没有什么可以让他们用来参考去编写计算机程序了,所以他们决定自己研究学习的过程。他们的研究成果就是 Dreyfus技能获取模型(Dreyfus Model of Skills Acquisition),描述了人们如何从对某物一无所知,到无需思考即可熟练运用的过程。

      虽然现存有许多种学习和技能获取模型,但Dreyfus模型独具的特色让其脱颖而出。首先,它基于真实的证据和经验,而且被证明是可以实际运用的。(在 1980年美国公共医疗卫生服务面临护士危机时,它发挥了巨大作用——http://tinyurl.com/32afwt)其次,它不仅仅是对发展过程的消极观察,它同时描述了人们在不同阶段应该如何应对,以及因此而为他们带来的成长。

      当你开始学习新技能时,你对于上下文没有任何了解,所以需要一些特定的方向指引。也就是说,你不知道面对着什么,必须有人告诉你应该做什么。随着对上下文和背景知识的深入了解,就不再需要对方向的指引了。实际上,你应该考虑如何更进一步加深了解,以作为获取技能的基础。

Dreyfus模型将学习的过程分为五个不同的阶段或水平:

1.新手(Novice) 需要详细的指导——要手把手地教。新手不知道这些指导是否有效,或者哪些指导更加重要;因为没有上下文知识可供他们使用进行评估。因此,新手需要频繁迅速的成就感和有规律的反馈。一本好的入门指导书籍要提供有足够多的图画和充足的可靠信息。

2.高级初学者(Advanced Beginner) 对基本步骤 ——单独的任务——已经熟悉了,而且可以把它们进行有机的组合。高级初学者仍然在很大程度上是面向任务而不是面向目标的,不过他们已经开始有些概念了。这也是一个学习者最危险的阶段——他们知道自己学到的已经不少了,但是这还不足以让他们远离麻烦!刚学走路的孩子在很多方面都是高级初学者。有了足够的经验,高级初学者就能拥有足够的能力以胜任某些工作。

3.在胜任(competent) 水平上,他们就走到面向目标阶段了。他们可以组合一系列任务以达成某个目标。也许任务的组合顺序不是最佳的,但是通常都可以发挥作用。有能力的人希望给定一个目标,然后能够得到别人的信任来达成这个目标。相反,如果要是试图详细告诉他们应该怎么做,这些有能力的人就会觉得很烦躁,就像是汽车里被坐在后面座位的乘客指手画脚的司机一样。大部分人在大部分技能上很难超越“胜任(competent)”水平,即使他们在每天的日常工作中使用这些技能。这是人类的基本特性——一旦有所收获,我们就不想再投入精力了,而且对于大部分活动来说,所谓的收获只不过是把工作做完而已。

注:已经能够分解目标和组合一系列任务来完成目标,这是胜任的关键。

4.在精通(Proficient) 水平上,解决方案开始在人的心目中“慢慢浮现”——而且通常已经完全成型。他们已经具备了在直觉中形成解决方案主要部分细节的能力,之后就可以根据自己先前的经验积累来对解决方案进行映射。一个精通的人需要对其行动的上下文有更广阔的了解,并且开始享受隐喻和格言(以及相反的类似内容)带来的乐趣。他们仍然会回头根据接受的基于规则的训练,来验证自己行为的正确性;但在这个阶段他们已经学着相信自己的判断了。从“新手”发展到“胜任”阶段基本上是线性的过程,而到“精通”阶段代表了一个台阶的提升。一个人必须积极选择才能促成这个转变的开始。通过对某件事情重复足够的次数是可以达到“胜任”的,但要变想得“精通”,必须要有明确的心理诉求才行。

注:在精通阶段,从规则(Rule)到直觉(Intuition)的质的变化,已经能够将显性的知识转化为自己的宝贵经验和方法论。在这里是需要明确的心理述求和自我领悟。

5.专家(Expert) 水平:正如从“胜任”到“精通”的转变一样,转变为“专家”也是非线性的过程。要想成为某个领域的专家,可能要花费数年的努力才能达成。这些人工作时几乎完全是从直觉自发的状态,而且很少犯错误。专家生活在模糊的世界之中。她以自己的能力为傲,而且喜欢通过与其他专家交流来校正和提高自己的技能。有趣的是,处于初级阶段的人们倾向于过高估计自己的能力,而在较高阶段的人则更加谦逊。

注:完全的融会贯通,自觉自发,形成了自我的解决问题的方法论和模式,往往已经是无招胜有招。

 

 

在网上找了一个更好的基于dreyfus模型描述的技能发展过程描述。

先来看我翻译的,它主要从知识,工作标准,自治,对待复杂性以及如何对待上下文5个方面来描述,原文表格我也放在了下面,原文也比较好理解。

 

 

 

原文表格,来自Institute of Conversation(Lonton), IoC啊,貌似很熟,玩笑了。

 

 

 

下面分几方面说说我的理解:

 

1)让我们来看看一个知识工人完成一件任务,涉及到哪几方面,我觉得这是一个评价的正交分解。

 

    第一 知识。拥有了知识,才有了解决问题的前提,知识面广,解决问题的思路就更宽阔。
    第二 工具。熟练运用工具才能提高工作效率。用的好可能比用的不好工作效率高几倍以上。
    第三 技能。比如精通Spring框架,技能直接体现在工作的效率上,是一个综合的体现。
    第四 制品。这里就是指工作成果,程序员的制品就是写出高质量的代码,需求分析人员就是写出一篇完善的需求分析文档。

 

2)来看看具体的例子,比如一个java程序员。


a.新手阶段

     他可能只是在课堂上学习过或者只是自己看过书,没写过几行代码。这个阶段,如果完成一件任务,是需要详细的指导的。但是,即使指导,也要有个前提,就是你自己自学了Java的理论,比如基本语法,面向对象基本知识。否则,指导也没有多大价值。为什么的,这就是后来说的上下文(模型中的第五点),他根本就没有概念。相当于没吃过猪肉,也没见过猪跑的阶段,可能连一张猪的图片也没看过。至于复杂性,更没什么招架能力了,我觉得只有取得对上下文的部分理解后,才有可能谈到复杂性。这个阶段,最重要的就是主动自学,学习理论,同时嘴巴勤快点,脸皮厚点。

     对于工具,比如Eclipse可能也没用过,没有工作产出。

     从思考方面来说,还在模仿阶段,缺乏独立思考能力。


b.初学者阶段

     这个阶段可能已经看了基本的java语法,了解了面向对象的基础,对java语言有了一些概念。也自己动手编写了几行代码,跑了HelloWord。已经熟悉了部分常用的JDK API,能够使用常用的类库。如果有一个人把任务分解的细一点,详细指导,能够完成任务 。对于任务,能够识别复杂性,并有了一点解决方案。对于上下文,处在12345就会做的状态,12435,14235就不会做了。

      已经能够初步使用eclipse的常用功能,能够写出点产品代码。

      模仿阶段,缺乏独立思考能力。


c.胜任阶段

     这个阶段也还需要指导,但仅需要大的方面指导就行了。你告诉他,我要达到什么目标,他能够利用自己的能力来独立完成这个目标。比如实现一个文件上传组件,可以自己去google找代码了。综合来说,就是能够顺利完成任务,但可能不是采用最合适的方法。能够通过细致分析和计划来处理复杂性。至于上下文,他明显感觉到技术的广博,有些迷茫,认识到自己学到的只是其中的一部分。

     基本拥有了足够的领域只是,能够熟练使用工具,能够依据标准,写出规范的代码。

     开始有了初步的独立思考意识,对问题刚刚开始有了自己的见解。


d.精通阶段

     这个阶段对实践所需的领域知识已经有了深入了解。你知道告诉他目标,他就能够帮助你实现。做出来的东西质量很高,完全放心。至于对复杂性的看法,已经完全能够从全局上来看待和处理。有了独立的思考和见解,能够非常自信的给出解决方案。到了这个阶段,基本上领域内的问题都能解决了。

     熟练使用工具,出色完成任务。

     不但自己会做,也能够给别人解释,如何完成工作。


e.专家阶段

    这个阶段不好描述,从知识来讲,不但拥有本领域的知识,而且也能够了解相关领域的知识,知识面更广了。而且能够发现别的领域和本领域的概念同构映射,能够利用隐形知识去解决问题。在领域内,能够超越标准,给出自己的解释,引导领域的发展,代表领域最高水平。

    工具已经不是问题,能够解决前面四种人解决不了的难题,你无法模拟他的问题解决过程,区别与前四种,专家使用直觉思维。而且可以在直觉思维和理性思维中轻松切换。

    对于上下文,领域内已经有了丰富的感知,存在大量的概念之间的联系。


3)Big Picture

    理解一个领域,我认为最重要的是big picure,有了它,你就能建立一个比较完整,没有遗漏的上下文,你知道向何处去,你知道元素之间的联系,下面是Java技术领域的Big Picture,Sun公司提供的。这里下载 下图的PDF文件。

 

  

4)来看看软件外包中的程序员

     如果在外包公司编码,我建议不要一直干,基本上初学者就可以满足他们要求了。而且工作中也得不到锻炼,无法向上发展。对职业生涯发展非常不利。


5)动机、学习能力、思考能力。

    你是否有强烈的自我实现意识,督促自己不断学习。因为知识是每一个等级的基础,这些是可以到自发,自我训练来获得的。你的学习能力决定你成长的速度。另外一个最重要的就是思考能力,可以看的出来,从初学者没有独立思考能力,到专家有了独树一帜的独立思考能力。思考能力是要不断的锻炼的,锻炼过程就是不断思考,具体方法可以看我以后的论述。


6)元学习能力

     简单的说,就是指学习如何学习的能力。这个能力很重要,否则只能只知其一,不知其二。特别是有了google和baidu以后,这种能力作用更大。这个时代,我们所需要获得信息的熵大大降低,因为你不需要记住所有的事情,记住一个关键字就行了。拥有这种能力,你就能快速获取知识。当你不知道如何解决问题时,你应该知道:

  • Know who  can do,知道谁可以做的到
  • know how to learn how to,知道如何学习如何去做。

7)那么如何来进行学习最有效呢?

     答案就是不断学习,不断实践,不断思考,如果你觉的这句话很空,那我可以说的更明白一点。

     那就是结果导向的学习方法, 不要盲目的学习,要有目的性,要结果导向,比如我现在要学习某一样东西,是带有很强的目的性的。学习的一个完整的过程包括四点,叫做ITAR ,第一个就是Information 获取信息,然后是Transform,就是对获取到的信息有了一个自己的理解,然后是Action,利用学到的东西去行动,然后是Result,获取结果反馈。

     1)如果是知识性的内容,至少要写一个总结,这使你至少不是左耳朵进,右耳朵出,已经到了Transform阶段。

     2)要写点程序,比如你在学习Java语言,你就应该利用java做点小程序和小软件出来。来完成整个学习过程。

     3)还有一个比较好的学习方式,就是把学到的内容解释给别人听,这是学习的最高境界了,即使取得了Result,你明白了如何做,但也不一定能给别人解释清楚。Presentation能力,越往上发展,这种能力越重要。

     千万不要漫无目的的学习,白白浪费时间,如果达不到Transform阶段,就白白学习了。

     这是一种拉式的学习模式,区别于学生时代的推式学习模式。


8)上下文的重要性

    在学习时,我现在非常重视上下文。我在接触一个新领域时,每次总是先经过大量的阅读,建立一个广阔的上下文,然后再去实践。也有另外一种做法,比如学习一个框架,我是先看文档,看源代码,只是看。不是直接run demo,rush进去。对此,每个人都有自己的方法,我的不具备代表性。先看文档,源码,在脑子里构建出一个context,能使你在run demo的时候获得更多的联系。

 

从小工到专家,一般至少需要10年,而且专家的领域是很狭窄的,一个人不可能成为所有领域的专家。选好了方向,就努力学习和实践吧。成为专家,需要坚持,汗水和付出。