德雷福斯模型(Dreyfus model of skill acquisition)

这篇文章是另外一篇文章的背景材料。在这里:如何识别人的技术能力和水平?

德雷福斯模型是伯克利科学家在1980提出的关于如何评价技能水平和如何提升技能层次的模型。
该模型是如何超越新手层次,如何不断精通技术的有效指导方法
该模型概括了从新手到专家必须经历的 5 个阶段。

 

德雷福斯五阶段模型

 

第一阶段:新手(novice)

小白、学徒工,跟着打酱油
想要一本手册,想别人告诉他一步一步怎么做
没有或者只有很少的经验
因为没有判断能力,他们需要及时的行为反馈
不知道如何应付错误,出错会让他们慌乱
按照明确规则可以看起来做点事情
他们难以利用网络的知识片段
只会单纯的抄录代码,并不清楚它们应用的情景
最佳进阶手段 教练明确的指令训练,这个阶段不需要太多理解性的东西

 

第二阶段:高级新手(advanced beginner)

小工、能够跟着做点事情
有一定经验,有一些模块库。
对规则有所理解,会尝试性的应用规则对付任务;
想要快速的获取解决问题的信息,对知识体系不感兴趣
知道哪些信息有用,依赖信息;
他们是“基于搜索引擎的编程”的忠实实践者;
能拼接代码完成目标功能;
超过50%的人群会整个生涯都处于这个阶段
最佳进阶手段 观察和模仿环境中高水平的人来提升。

 

第三阶段:胜任者(competent)

师傅。能够独立负责做事情。
拥有比较多的技巧;
拥有相当多的经验;
能听懂专家的抽象观点;
能做为一个团队的核心了;
最重要能力是评估问题解决的可能性。
熟练他所使用的开发语言的各种语法细节
最佳进阶手段 持续苛刻挑战性的任务

 

第四阶段:精通者(proficient)

经验已经足以提炼一般性的指导方法
对于所处的技术领域具有全局思维
能够整体系统的解决问题。
围绕自己的技术领域,不断积极寻求更大的概念框架。
不断审视自己解决问题的手段
恰到好处的使用各种《设计模式》
大约有10%人处于这个阶段
最佳进阶手段 尚不清楚

 

第五阶段:专家(expert)

创造解决问题的方法手段。
追求最佳实践,创造更好的工具和方法。面对问题时候能自然的产生直觉的解决办法。
专家通常很难把他们的行为恰如其分地解释清楚,他们的很多行为是如此地熟练以至于已经变成无意识。
新手靠规则,专家靠直觉;
他们著书、写文章、做巡回演讲。
不到5%的人在这一个阶段(在体育运动中 前0.2%才是明星)
专家需要保持实践来维持他的水平,专家离开实践后,就成为胡说八道的“理论大师”。专家并不意味着是好的教练。但是,一旦你成了某个领域的专家,在别的领域成为专家就会变得更容易(所谓成功是一种习惯)。

 

一般进阶手段

在环境(社群)中不断模仿、重整(内化)、发展自己的模式。也就是多样性积累实践经验、理解情境和发展直觉。

 

有效的实践

没有实践就没有技能,但是只有时间的实践并不能保证效果。有效的实践目标是把经验结构化

有效实践的基本条件

  • 明确定义的任务
  • 任务有挑战、但可行,即不在舒适区不在困难区在挑战区不断练习
  • 任务环境可以提供大量反馈
  • 提供重复犯错和纠正错误的机会。要迭代,要在可以失败的环境中去提升。不要用时间压力法(典型的考试模式学习知识);
 

高效的实践

高效的实践的核心是控制注意力,提升转化速度和效率。

相关工具

  • 时间控制:番茄时间管理法
  • 自由知识工作者的时间安排法:早起、工作到中午、下午处理杂事、学习、早睡
  • 心流状态
 

参考资料

[1] https://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition
[2]http://www.wayland-informatics.com/The%20Seven%20Stages%20of%20Expertise%20in%20Software.htm
[3]程序员的思维修炼

优秀的开发者为什么要学习研究新的编程语言?

新的语言,代表着对事物更新的理解和更好的阐述方式。

enter image description here

跟我交流较多的朋友们会知道,我是很早就坚持研发人员要多学会几套编程语言的人,特别是新的开发语言。有段时间,我甚至都在准备尝试自己设计一个有应用场景的编程语言。计算机语言是人设计的,了解了核心的原理,真的没那么困难。当然,要做的出色,有很多用户,那就是另外一回事了。

基于C/C++语言的开发我做了10年以上。后来我逐渐的把应用需求分解到其它语言中去,PHP/Python/JavaScript(前端/Node.js),我都花了不少功夫研究。我在开发过程中能做到各种语言随时切换,得心应手,没有任何障碍。并且,仰仗着过去在C/C++时代打下的良好基础,我可以在源码级研究并理解编程语言。特别是用C写的各种脚本语言,只要觉得手册没写清楚的,我就直奔源代码看个明白。这是开源时代给多语言开发者带来的巨大优势。

最近,我在研究Go语言。其它几种感兴趣的编程语言,我也有计划钻研一下。

为什么我对新的计算机语言,这么乐此不疲?很简单,时代变革,与时俱进。参考:人要与时俱进,顺应时代潮流

对当今的IT领域来说,单一语言包打天下的时间已经一去不返。未来的趋势是,各种语言站住自己的核心应用地盘,相互借鉴、相互竞争,不断拓展、侵蚀到其它语言的应用领域,逐渐发现更好的表达模式和方法。

新的语言,代表着对事物更新的理解和更好的阐述方式。

语言是人类思维的工具。人类之间的语言,与人类对计算机讲的语言,实质都是要表达出思想。人依靠编程语言来指挥计算机运行。不同的语言,代表了对问题领域、对计算机系统不同的理解方式。

催生这些语言并促进其发展的,是背后的环境变革。更新的语言,常常是吸收了上一代语言的优点,再尝试使用新的思想模型、新的方法去解决各种已知、未知的问题。有时候使用者会发现它很有效,很方便,这个语言就容易在一个问题域站稳脚跟了。

我们的开发环境、应用环境,一直在变化。但是人类往往对缓慢的变革熟视无睹,习惯的延续原来的假设和出发点,这就给创新留下了口子,经常可以从这里获取突破性进展。

比如,单机时代,CPU性能弱,存储器速度、容量都很低。那么在这个条件下,作出的各种软件开发决策,都会带上这个默认环境的影响。以至于后面的硬件突飞猛进,原本的假设不成立了,它的影响可能还在延续。原来的计算机网络物理层面不够可靠,所以网络协议设计了很多校验机制,但是后面的光纤时代,这些校验就成了成本和负担,检验并不是越多越好。参考:重要的技术创新节点容易发生在什么地方?

从单机转向网络应用,再做移动设备开发,以及和网络的融合,以后再有各种智能硬件设备、万物互联,不同的应用发展,带来了不同的需求和环境。而原本的编程语言,设计者考虑的平衡点可能就不合适了,需要新语言替代它,进行革新。

所谓的“平衡点”是说,设计决策里面对相互冲突的特性,作出的妥协点在哪里。你是要编译式的静态语言,还是动态语言解释型的?重点是编程灵活还是运行速度?考虑多少安全问题?要不要垃圾回收?用什么机制?比如CPU从单核进化成多核,如何在语言设计上充分利用硬件的能力?

如此多的应用需求变化,对各种不同设计思想的计算机语言的产生必然是催化剂。单一语言解决所有问题域,是不可能的了。强行上马,只能让开发者痛苦,大幅降低效率和质量水准。现在还有谁用C++写Web应用?

庆幸的是,在计算机系统架构未得到根本变革之前,绝大部分编程语言都有很相近的语法结构,弄懂学会并不难。计算机算法也是共通的。但是考虑到它创建并依赖的生态环境、设计思想、开发模式和习惯用法,应用自如还是需要耗费很多精力的。

这里链接几篇关于学习能力培养、学习方法的原创文章,供大家参考:

学得快,记得牢,花的少 - 请尽快开发你的大脑

职场人的学习方法

IT人永远不老,老程序员价值何在?

IT领域,学无止境,各位继续努力吧!

如何识别人的技术能力和水平?

 这个题目是比较复杂的,它包含的东西比较多,认真讨论估计能写几万字。如果是专业研究,我看能写一本书了。这里打算根据自己的学习过程和工作经验,谈一下要点问题,均属个人看法,欢迎讨论。

  写这篇文章的初衷,跟前段时间跟朋友们聊招聘有关。因为技术招聘除了考察人的协作精神和工作态度,一大目标便是判断人的技术能力和实际水平。在这件事情上多做观察、思考是很有意义的。

  对于考察人的技术等级,学界是有认真的研究的。参见:德雷福斯模型(Dreyfus model of skill acquisition)

  德雷福斯模型把人的技能水平,分成5级:新手、高级新手、胜任者、精通者、专家。

  对不同技能等级的认定是这样的:

  • 新手:依靠指令清单,必须按部就班。就是必须给出详细而具体的操作规则,才能工作。比如你做一道从未做过的菜,需要看菜谱的说明,第一步做什么,第二步做什么等等,直到最后烹饪结束。
  • 高级新手:有限的情景洞察力,同等对待工作的各个方面。对全局性、体系性的东西没兴趣。这是小工的水平。比如他能跟着师傅干点活,打打下手。可以靠着反复检索搜索引擎、StackOverflow解决具体的小问题。
  • 胜任者:能够独立解决各种各样的领域内问题。这是一般的企业招聘,比较希望招到的等级,招进来稍作适应就能干活了,省心省力。
  • 精通者:经验丰富,可以自我纠正、自我改进。这类等级的人,思考可以指向内在,通过反省、反馈改善技能。这种在企业可以算上高手、大拿了,培养不易。
  • 专家:依靠直觉工作,不需要解释和理由。实际你让他解释,他可能也说不出个所以然,就是直觉给出答案,然后还是对的。专家人数稀少,需要很长时间训练、实践。通常的说法是10年出专家,10000小时定律。

  这个是理论上的研究,实践中比较缺乏操作性,难以迅速的判定应聘者的实际情况。不信你打开收进来的大把简历,刚毕业的学生,每个技能名词上面都是一堆堆的“精通” – 你相信么?但它可以当成一个职业技能等级判定的参照标准。

  于是乎,各家企业开启了各种“笔试”、“机试”,多轮面试,并且严格要求学历以及出身院校,试图以此过滤掉不合意的应征者,留下合格的人选。它当然是可行的,但是效果一般,而且容易出错,错失有思想有水平的人。不然也不会催生出各类“推荐式”的招聘。看重学历、学校当然也有其优点:它是快速过滤的手段,毕竟能考上好学校的人智商不会太差吧。但在大数字公司的一朋友说,公司里面还有初中毕业,一直精研安全领域的人,技术能力也是十分出色。如果严苛对待背景,这些人就会错过了。因为人的生活多种多样,有各种历史的背景因素影响经历。而部分人的经历,就是跟一些人不同的,可是不妨碍他们同样可以变得优秀。招聘,实际上是建立信任关系。如果有充足的信息证明,应聘者足够优秀,这就够了。条条框框只是辅助手段,并不是目的。

任正非的洞察力一流

  推荐式的招聘实际要靠谱的多,因为人很容易了解熟悉的人的水平。这是靠推荐者的信用背书。人平时沟通时说什么话,日常看什么书,关注哪些领域,琢磨过啥问题,哪些东西很熟,这个经常聊的熟人往往都知道。可是,这类招聘局限性也很大:面窄、靠机缘。靠推荐能招几个好手啊?好手往往是各家争抢的对象,窗口期有限,基本不会缺工作的。

  说了一圈,还是要在技能水准判定上有更高效率的办法,招进合适的人来。

  回到开头的德雷福斯模型,既然人的技能是分级的,那么对待不同的职位要求,也应该侧重不同的考察角度。如果千篇一律的走招聘流程,就容易出问题了。比如你明明要找的是“精通者”,可上来就让人一堆笔试、机试,这是不合适的。对方会十分的厌烦。体现高水平技术能力的并不在默写什么“字符串算法”那里。这反倒是刚毕业的人占便宜,因为才学过不久,印象深。不信你让工作10年的人跟计算机专业应届生比比写排序算法,真未必能赢。但是这并不重要 – 你干活不看手册不查文档吗?聪明人从不死记硬背。重要的地方在于对问题域的准确、深刻的理解,对各类技术优劣点、各种条件平衡的评判和把握。

  对待初阶新人,应着重考察的是基本功是否扎实,专业成绩是否优秀。更重要的,是他对职业的热情,学习能力和研究精神。某类人要说起技术来,滔滔不绝,两眼放光,充满热情,对未知的、新生的各类概念、技术非常好奇,这种人想差都难。因为他会自我驱动,不用督促,自己就钻研前进。反之,觉得这个职业待遇高,只是想混饭吃的人,很少走得长远。这类初阶新人以毕业生、工作年限少者为多。测试考核,可以笔试查看其对基础概念的理解是否准确,知识领域的大致范围。甚至,布置一个有点挑战性的小任务,让他尝试解决,说明思路。

  考察胜任、精通者的策略不一样。笔试做题没啥用,原因前面说了。这类招聘是重头戏,企业都喜欢找这样的,能干活。所以考核评估的地方也较多。我觉得可以分成几个方面去看。意识是否先进,是否会反省思考;是否善于解决问题,富有创造性;是否有比较深的积累和广阔的知识面。

  业界的开发思想也是在不断变化,工具链一直在革新。聪明的人不用蛮力,而爱用工具提升效率,喜欢自动化操作解放人力。要查看人用什么开发工具链,用什么开发环境,解释下为什么?好的开发者会及时注意新出现的工具,挖掘它能解决什么问题,并尝试吸收,解决自己的需求。如果没有这个思想意识,工作效率就会打折扣了。因为你会落后行业发展水平。人善于自我反省,则会催动自我纠正,这正是精通者的特征。参考:优秀的开发者为什么要学习研究新的编程语言?

  解决问题的能力是重头戏,也是企业招聘人的主因。人要善于解决实际问题,而且,要学会聪明的解决问题。解决问题要看思路,看手段,看是否有创造性,这是真正考验人能力的地方。好的开发者,会考虑很多可能选项,预估各种优劣,给出一个较优的方案。 遇到难题,会用各种方法尝试。经验丰富的人,常常会使用技术的组合手段来处理难题,而不是一个语言一个工具到处用。所以,要查看下过往的项目经历遇到的问题、困难,是如何解决的,思路如何。一些公司据说不招聘不会用谷歌的工程师。谷歌打不开?嘿嘿,这就是你要克服的困难啊。这你都解决不了,还做什么研发。谷歌是人类最全、最新知识的总索引,充分利用事半功倍。

  考察知识的深度、广度,对重要领域的概念是否有深刻的理解和掌握,以及从各类工作经验中得到的认知。问问他看过什么书,研究过什么东西。说白了,知道的东西是否多。一些公司很喜欢用CheckList模式来考核,列一堆领域的知识点、概念,问人懂不懂,知道就是水平好,不懂就是水平差。实际情况并非如此。人的工作过程是独立的,一些事情如果没有工作机会去接触并解决,那么一些冷僻的问题就永远都碰不上。当然也就不知道。但你能说没做过就一定做不好么?

  另外,人的技能树,其实也是“犬牙交错、参差不齐”的。什么意思?技术领域非常的广阔,你真的没办法每个领域都很精通,实际上是这个做的多,懂的多,那个用的少,知道的少。这个时候,应看具体知识领域,是哪一类。它是否需要复杂的、难度较高的背景。门槛高的技术,需要的配套技能多得多,比如AI、机器学习。而一般产品应用领域则不然,了解核心概念、设计意图,看着手册、最佳实践,也就能上手了。这个暂时不会,实际无关紧要的,工作一段学的认真点就会了。但是门槛高的领域,就需要很长时间的学习了。这是本质的差别。

  我曾看见某公司放出的职员技能树,包罗万象,几乎一切IT领域的知识技能都在里面了,还声称要求“全部精通”。我不知道它如何定义的“精通”,如果按德雷福斯模型的定义,能做到的那是神,不是人类。这个纯属吹牛皮,我压根就不信。如果真有这样的人,出来让我膜拜下。因为每个稍大点的领域,都足够让你钻研一辈子,因为它们也在迅速发展呀。业内流传“全栈工程师”的说法,鼓吹自己是全栈的人经常是前端工程师。而研究后端工作领域的技术高手经常鄙视这类人:真以为会点Node.js就能解决一堆后端的事务了么?我也懂一些前端,也能号称“全栈”,但在不同领域的专业性是什么水准,自己明白的很。前端要解决的事情也有很多复杂性。全栈实际是反专业化的,是人力资源稀缺时候的低成本选择。

  更高一层,则是考察人本身了。人的视野够广阔么?其它领域的知识有了解吗?一些问题的解答并不在问题域本身,而是在外面的领域。所谓“功夫在诗外”。公司讲求团队协作,总要面临不同的分工合作问题。比如产品、运营的人提需求,可以换位思考吗?合作意识强么?谁也不想招个刺头进来吧?把团队的气氛和人际关系搞的一团糟,大家做事都不痛快、不顺心,又如何安心做好工作?最终只能让团队工作效率下降,甚至瓦解。

  要说专家,实际上有研究者认为是需要刻意练习+充分实践才能功成。并不是每个人经过足够的工作年限,都自动成为专家。有的人工作10年,可能后面9年都在重复第一年的工作任务,毫无改进。而职业上的训练机会,又跟大环境乃至运气息息相关,并不是每个人都有机缘的。但是把个人的职业技能做到胜任乃至精通,则是完全可行的,这只需要认真和勤奋,工作态度问题。

Top