编程相关的认知科学

编程相关的认知科学

McSweetSc

Saturday, August 23, 2014

近日,在算法竞赛中的水平大幅下降,TC 已经跌到正好 1199分,回归 Div2。。。CF 也回紫。。。不过不要急功近利,这也是一个再学习的机会。近日开着几个坑,今天终于看完了一块,可以填一个了:编程相关的认知科学。另外,还在学习特殊的 C++ 技巧,敬请期待。

本文主要参考:普通心理学,BNU 出版社,摘抄了一部分对算法竞赛,工程,Machine Learning 有关的部分。比较码农向的例子是个人添加。

思维

思维是借助语言,表象,或动作实现的,对客观事物概括的和间接的认识,是认识的高级形式。

思维具有概括性,间接性。概括性:在大量感性材料的基础上,把一类事物共同的,本质的特征和规律提取出来。间接性:人们借助于一定的媒介和一定的知识经验对客观事物进行间接的认识。在进行思维时,人们需要对头脑中已有的知识经验不断进行更新和改组。

  • 直觉思维 vs 分析思维:快速跳跃/严密推导。类似的一对概念是表象和推理。表象是感性基础,促进问题解决,推理是根据一般原理推出新结论(演绎),或者由具体事物总结一般规律(归纳)的过程。譬如见到一类算法问题,第一反应想到一个大致方向,或者回忆起以往的经验,这是直觉思维。但是直觉是否正确,在时间允许的情况下,需要按部就班的分析推导和证明。
  • 辐合思维 vs 发散思维:根据已知的信息,利用熟悉的规则解决问题。发散思维是指人们沿着不同的方向思考,重新组织当前的信息和记忆中存储的信息,产生大量,独特的新思想。解算法题主要训练的是辐合思维。Hackathon 之类的工程向主要训练发散思维。
  • 常规思维 vs 创造思维:运用已知的经验解决问题/重新组织已有的知识经验,提出新的方案,创造新的思维成果。简言之,做水题之类纯体力的编码工作,只是在强化常规思维。花两三天去想一道难题,是在训练创造思维。这也就是为什么坊间大牛们强烈觉得后者训练效率更高。

问题解决

  • 算法:此算法非彼算法,简言之是枚举。人解决问题,也有采取枚举法的时候,譬如漫无目的的找东西之类。
  • 启发法:将大的问题转化成若干个步骤,逐步前进。

这里的讲解不强于搜索问题,略过。

影响问题解决的因素:

  • 知识在问题解决中的运用:专家在知识数量上,记忆存储信息量大,熟悉的模式多。并且专家与新手在知识组织方式上也存在差异。所谓模式,就是某种事物的标准形式或使人可以照着做的标准样式。譬如算法竞赛中有若干固定的套路,就是模式。工程中的设计模式也是同样。
  • 无关信息的影响:考虑哪些信息和问题相关。
  • 知识表征的方式:不同的知识表征会影响直觉。
  • 定式:重复先前的心理操作所引起的对活动的准备状态,它的影响有积极的也有消极的。积极的是可以快速解决问题,消极的是妨碍新方法或者简单方法的发现和运用。在专题训练之后,往往出现看什么题都像是那一类的感觉,这就是思维定势。
  • 功能固着:把某种功能赋予某种物体的倾向。
  • 动机、情绪、人际关系。这个算是解决比较 General 的问题时需要考虑的因素。
  • 创造性:人们用新的方式解决问题,并可以产生新的,有社会价值的产品的心理过程

能力

  • 能力:能力是一种心理特征,它是顺利实现某种活动的心理条件,能力的高低影响人所从事的活动的效率。
  • 知识:客观事物的主管表征。
  • 内隐知识:为个人主观的经验性、模拟性、具各别情境特殊性的知识,通常无法直接辨认。
  • 外显知识:为客观的理性知识、顺序性知识与数字知识,可以清楚的辨认,保存于产品、程序、手册等之具体形态中,且可以透过正式形式及系统性语言传递的知识。

从前,我有一段时间,感觉大神们之所以强,是因为有不传之秘。我花了一些时间搜集学习素材,发现网上的内容也大同小异。这些是外显知识。而大神们的思维方式是内隐知识,或由训练养成,或天赋异禀,没有也很难转化成外显知识传播出来。

  • 技能:通过练习而获得的动作方式和动作系统。
  • 能广泛应用和迁移的知识和技能,才能转化为能力
  • 能力,知识,技能互相转化,互相促进

从这个角度看,“熟练掌握某语言,某工具,某框架”,是技能。而掌握思想,譬如设计的动机,优点缺点,取舍才是能力。只见树木,却不见森林的太多了。

  • 能力的组合是才能,能力的高度发展是天才。
  • 能力的形成:遗传,环境,教育,实践活动,人的主观能动性。

从这个定义上来说,终生努力便成天才是成立的。

学习

  • 定义:个体在一定情境下,由于经验而产生的行为或行为潜能的比较持久的变化

一些解释学习现象的理论:

  • 联结理论:巴甫洛夫提出经典条件作用,学习等于训练条件反射。进一步来讲,操作性条件作用解释学习现象是,对于一个行为,给与正强化,负强化或惩罚。个体通过对行为的反馈,保留正强化的部分,而放弃错误的尝试。
  • 认知理论:学习是一种完整的过程,是通过学习者重新组织或者重新建构有关事务的形式而实现的,科勒用”顿悟式学习” 来解释。

学习编程语言,类似于训练条件反射。编程是有一定条件反射成分的,有经验的程序员想要写一些语句,往往脑子都没有动,只是手在动。在学习编程语言的初期,我感觉就算看书或者有人讲,也是听不懂。如果从实践出发,正确的编译,正确的结果是正强化,反之为负强化,效果要好。而学算法,看论文等,过程一般都是从简单的预备知识开始,到预备的定理,依此顿悟其中的各个部分内容的过程。

练习曲线:不同项目不一样,但是存在共同点

  1. 练习成绩随着练习的进程而逐步提高
  2. 练习存在高原现象,热情下降,身体过分疲劳,旧的技能结构限制
  3. 练习曲线不均匀
  4. 个体差异

这就教育了我们

  1. 练就比不练好
  2. 保持动力很重要
  3. 要适度训练,避免过分疲劳
  4. 练习进展会时快时慢
  5. 如果进境很慢,需要审视一下技能结构
  6. 个体差异是存在的

通读完全书,感觉想明白了许多事情,观过了世界,可以有点世界观了。

时间: 2024-11-03 20:54:17

编程相关的认知科学的相关文章

linux mint系统下编程相关环境配置

学习web开发,用到linux系统,在师兄的帮助下还算不是很费劲的把一些环境配置好了. 清单: skype ibus Google Chrome open-jdk-7.0 android-sdk ant github node.js rvm rvm.ruby rvm.rails yeoman RubyMine IntelliJ IDEA 注意:以下的命令行都是一行一行的在终端中执行 1. skype 和Chrome 在软件管理器中搜索skype,第一个,skype,点击安装. chrome 到h

分享一些编程相关的学习资料

之前写过一篇文章:https://www.cnblogs.com/HarrisonHao/p/10926435.html,后来又有人问说哪些资料适合新手入门?有没有什么书籍推荐?成为一个高级程序猿需要掌握哪些知识?对于这些问题,相信大家通过百度.Google 也都能得到答案. 不过我自己之前也收集整理了一些编程相关的电子书,无聊的时候也看过一些网络上的视频课程,这里分享给大家,希望能够对你有所帮助.我自己是做 Java 出身的,里面涉及到的大多是 Java 技术栈相关的东西,内容大概是这样的:

嵌入式编程相关专业英语积累

ARM芯片手册相关英语 overview         概述 DAT                 data(数据) CON                control(控制) parity                奇偶校验 odd parity        奇校验 even parity        偶校验 trigger               触发 infrared             红外线 poll                   查询 generated 

sockets: sockets网络编程相关的知识

########################################################### unix域(本地IPC): ########################################################### 在单个主机上执行客户服务器程序,可视为IPC方法之一. unix域(本地IPC)地址结构: struct sockaddr_un { sa_family_t sun_family;  //AF_LOCAL instead of AF

前端笔记十五 DOM编程相关

20160221 DOM编程详解 从document对象到每个常用的html元素,DOM都提供了对应的类 HTMLDocument:代表HTML文档本身 HTMLBodyElement:代表<body />控件 HTMLDivElement:代表<div />控件 HTMLFormElement:代表表单控件 HTMLSelectElement:代表列表框,下拉菜单控件 HTMLOptionElement:代表列表框,下拉菜单选项控件 HTMLFrame:代表<iframe

rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)

转自:http://blog.163.com/[email protected]/blog/static/1834638201392335213119/ 相关资料在线版(不定时更新,其实也不会很多,也许一两个月也不会改) http://www.zhujiatc.esy.es/crtmpserver/index.htm 去年在这进行rtmp相关整理,其实内容早有了,只是整理一下看着方便 时隔一年,也该维护修改一下 修改说明(当然还有很多未完成): 统一使用C语言标准(原有的是C++的一些特性) 代

编程相关镜像列表与设置方法

由于被墙的原因,很多编程用到的工具常常出现较大的网络延迟,这里总结一些国内镜像的设置方法. [PHP]Packagist / Composer  https://pkg.phpcomposer.com/ 打开命令行窗口(windows用户)或控制台(Linux.Mac 用户)执行如下命令即可: composer config -g repo.packagist composer https://packagist.phpcomposer.com

并发编程相关知识

1.并发编程领域的关键问题 线程之间的通信 线程间的同步 1.1 线程之间的通信 线程之间的通信机制有两种,共享内存和消息传递. 在共享内存的并发模型里,线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信. 在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信,在java中典型的消息传递方式就是wait()和notify() 1.2 线程间的同步 同步是指程序用于控制不同线程之间操作发生相对顺序的机制 2.计算机

网络编程相关知识点

一.网络基础 用途:未来的web框架的学习 未来的工作场景做铺垫 两个运行中的程序如何传递信息? 通过文件 两台机器上的两个运行中的程序如何通信? 通过网络 网络应用开发架构 C/S client 客户端 server 服务端 例如:迅雷 qq 浏览器 飞秋 输入法 百度云 pycharm git VNC 红蜘蛛 各种游戏 B/S browser 浏览器 server 服务端 例如:淘宝 邮箱 各种游戏 百度 博客园 知乎 豆瓣 抽屉 统一程序的入口 B/S和C/S架构的关系:B/S是特殊的C/