编程相关的认知科学
McSweetSc
Saturday, August 23, 2014
近日,在算法竞赛中的水平大幅下降,TC 已经跌到正好 1199分,回归 Div2。。。CF 也回紫。。。不过不要急功近利,这也是一个再学习的机会。近日开着几个坑,今天终于看完了一块,可以填一个了:编程相关的认知科学。另外,还在学习特殊的 C++ 技巧,敬请期待。
本文主要参考:普通心理学,BNU 出版社,摘抄了一部分对算法竞赛,工程,Machine Learning 有关的部分。比较码农向的例子是个人添加。
思维
思维是借助语言,表象,或动作实现的,对客观事物概括的和间接的认识,是认识的高级形式。
思维具有概括性,间接性。概括性:在大量感性材料的基础上,把一类事物共同的,本质的特征和规律提取出来。间接性:人们借助于一定的媒介和一定的知识经验对客观事物进行间接的认识。在进行思维时,人们需要对头脑中已有的知识经验不断进行更新和改组。
- 直觉思维 vs 分析思维:快速跳跃/严密推导。类似的一对概念是表象和推理。表象是感性基础,促进问题解决,推理是根据一般原理推出新结论(演绎),或者由具体事物总结一般规律(归纳)的过程。譬如见到一类算法问题,第一反应想到一个大致方向,或者回忆起以往的经验,这是直觉思维。但是直觉是否正确,在时间允许的情况下,需要按部就班的分析推导和证明。
- 辐合思维 vs 发散思维:根据已知的信息,利用熟悉的规则解决问题。发散思维是指人们沿着不同的方向思考,重新组织当前的信息和记忆中存储的信息,产生大量,独特的新思想。解算法题主要训练的是辐合思维。Hackathon 之类的工程向主要训练发散思维。
- 常规思维 vs 创造思维:运用已知的经验解决问题/重新组织已有的知识经验,提出新的方案,创造新的思维成果。简言之,做水题之类纯体力的编码工作,只是在强化常规思维。花两三天去想一道难题,是在训练创造思维。这也就是为什么坊间大牛们强烈觉得后者训练效率更高。
问题解决
- 算法:此算法非彼算法,简言之是枚举。人解决问题,也有采取枚举法的时候,譬如漫无目的的找东西之类。
- 启发法:将大的问题转化成若干个步骤,逐步前进。
这里的讲解不强于搜索问题,略过。
影响问题解决的因素:
- 知识在问题解决中的运用:专家在知识数量上,记忆存储信息量大,熟悉的模式多。并且专家与新手在知识组织方式上也存在差异。所谓模式,就是某种事物的标准形式或使人可以照着做的标准样式。譬如算法竞赛中有若干固定的套路,就是模式。工程中的设计模式也是同样。
- 无关信息的影响:考虑哪些信息和问题相关。
- 知识表征的方式:不同的知识表征会影响直觉。
- 定式:重复先前的心理操作所引起的对活动的准备状态,它的影响有积极的也有消极的。积极的是可以快速解决问题,消极的是妨碍新方法或者简单方法的发现和运用。在专题训练之后,往往出现看什么题都像是那一类的感觉,这就是思维定势。
- 功能固着:把某种功能赋予某种物体的倾向。
- 动机、情绪、人际关系。这个算是解决比较 General 的问题时需要考虑的因素。
- 创造性:人们用新的方式解决问题,并可以产生新的,有社会价值的产品的心理过程
能力
- 能力:能力是一种心理特征,它是顺利实现某种活动的心理条件,能力的高低影响人所从事的活动的效率。
- 知识:客观事物的主管表征。
- 内隐知识:为个人主观的经验性、模拟性、具各别情境特殊性的知识,通常无法直接辨认。
- 外显知识:为客观的理性知识、顺序性知识与数字知识,可以清楚的辨认,保存于产品、程序、手册等之具体形态中,且可以透过正式形式及系统性语言传递的知识。
从前,我有一段时间,感觉大神们之所以强,是因为有不传之秘。我花了一些时间搜集学习素材,发现网上的内容也大同小异。这些是外显知识。而大神们的思维方式是内隐知识,或由训练养成,或天赋异禀,没有也很难转化成外显知识传播出来。
- 技能:通过练习而获得的动作方式和动作系统。
- 能广泛应用和迁移的知识和技能,才能转化为能力
- 能力,知识,技能互相转化,互相促进
从这个角度看,“熟练掌握某语言,某工具,某框架”,是技能。而掌握思想,譬如设计的动机,优点缺点,取舍才是能力。只见树木,却不见森林的太多了。
- 能力的组合是才能,能力的高度发展是天才。
- 能力的形成:遗传,环境,教育,实践活动,人的主观能动性。
从这个定义上来说,终生努力便成天才是成立的。
学习
- 定义:个体在一定情境下,由于经验而产生的行为或行为潜能的比较持久的变化
一些解释学习现象的理论:
- 联结理论:巴甫洛夫提出经典条件作用,学习等于训练条件反射。进一步来讲,操作性条件作用解释学习现象是,对于一个行为,给与正强化,负强化或惩罚。个体通过对行为的反馈,保留正强化的部分,而放弃错误的尝试。
- 认知理论:学习是一种完整的过程,是通过学习者重新组织或者重新建构有关事务的形式而实现的,科勒用”顿悟式学习” 来解释。
学习编程语言,类似于训练条件反射。编程是有一定条件反射成分的,有经验的程序员想要写一些语句,往往脑子都没有动,只是手在动。在学习编程语言的初期,我感觉就算看书或者有人讲,也是听不懂。如果从实践出发,正确的编译,正确的结果是正强化,反之为负强化,效果要好。而学算法,看论文等,过程一般都是从简单的预备知识开始,到预备的定理,依此顿悟其中的各个部分内容的过程。
练习曲线:不同项目不一样,但是存在共同点
- 练习成绩随着练习的进程而逐步提高
- 练习存在高原现象,热情下降,身体过分疲劳,旧的技能结构限制
- 练习曲线不均匀
- 个体差异
这就教育了我们
- 练就比不练好
- 保持动力很重要
- 要适度训练,避免过分疲劳
- 练习进展会时快时慢
- 如果进境很慢,需要审视一下技能结构
- 个体差异是存在的
通读完全书,感觉想明白了许多事情,观过了世界,可以有点世界观了。