最近阅读了温伯格的《程序开发心理学》一书,非常有趣,作者试图用学术的方法去研究影响程序开发的因素,在这个过程中也提出了一些自己对程序开发的看法。书中对如何提高程序员团队的开发效率给出了作者自己的意见,特别强调了培训对程序开发的重要性,指出需要将选拔程序员的问题就转化成为培养程序员的问题。可能是因为英文文本中的专业表述比较多?翻译版充斥着长难句,阅读体验很差。

程序开发心理学

第一篇 作为人类行为的程序开发

第一章 阅读程序

第二章 优秀程序的要素

技术规范

日程计划

适应性

Fisher基本定理:一个系统对某一特定环境的适应性越强,它适应新环境的能力也就越弱。

往往需要在通用性和易于修改之中做取舍。

效率

“如果知道系统内存页面的大小,我们就可以对我们的程序进行适当的裁剪,使每段的大小正好与内存的一页吻合。这样,就可以避免过多的页面交换……但这也会带来类似的问题——即使计算机能够提供额外的页面空间,这样一个程序也无法加以利用;反过来,要是系统提供的页面空间更小,那么这个程序的性能将会达到最差。”

小结

好程序的必备要素:

  1. 在多大程度上满足功能要求?
  2. 能否按照计划完成?
  3. 条件改变时,是否可能修改?修改的成本?
  4. 程序效率如何?效率指的是什么?为了补偿某方面的低效率,是否会牺牲其他方面?

评注

代码质量最重要的新要素就是经济的因素。

第三章 如何研究程序设计

重要的是不要停止怀疑

自省

观察

霍桑效应:因受到他人关注而带来的提高或进步。

实验

对通过观察所得到的的庞大数据进行处理需要付出高昂的代价,为了降低处理的代价,一个办法是设计实验。

心理学测量

“To Measure is to know”——Maxwell

利用行为科学中的数据

评注

最优秀的程序员往往是那些最善于自省的。

第二篇 作为社会行为的程序开发

“建立在命令与纪律之基础上的行为,与建立在理解一致之基础上的行为是何等之不同。前者是一种酷似阅兵式的运行方式,但是对于真实的生命而言,这种方式毫无意义;只有通过后一种方式,将所有人的意愿都聚焦到一点之上,才会产生巨大的能量,并实现最终的目标。“

程序员集体三种类型:程序员组、团队以及工程项目。

第四章 程序开发组

正式与非正式组织机构

非正规的机制到处存在

自然环境与社会结构

工作场地会对程序员的社会交流产生影响

错误与惟我独尊

认知失调,采取措施保护自我意识

无私式程序开发

成员之间互相帮助寻找代码当中可能存在的问题。

建立与维护程序开发的环境

在建立这种环境的过程中,程序开发组现有的原则和观念需要转变,往往伴随着社会结构中诸如“锁定”或者”凝固“等现象的斗争。(技术惯性)

第五章 程序开发团队

团队的组建

一支程序开发团队之所以成立,是为了承担并完成某项由任何人都无法独自完成的任务。

目标的设定与认同

只要有一名成员与集体的目标不一致,那么该集体的整体水平就将会受到影响。

团队的领导者及其领导方法

程序员们惯有的缺点反而导致了整个领域中的一种有趣的现象

工作满意的关键:

  • 物质的奖励与机会
  • 工作本身所具有的挑战性及其趣味性
  • 其所隶属的更大团队的总体条件,比如雇员的福利、工作条件以及该团队在同类团队中的相对地位
  • 主管与领导者的能力

团队中可能出现的危机

往往会有任务权威协调工作的权威 两个角色。

第六章 程序开发项目

调整过程的稳定性

任何个人偶尔的离去,都不应该使正在进行中的工作因此搁浅。团队的这种能力来自于其成员之间的交流。

如果某个程序员不可或缺,那么还是越快请他走人越好

绩效评价

不应该过分地强调对进展的报告,而不是对进展的测评

“管理信息系统”:只要输入的是垃圾,输出的也一定是垃圾。

”魔鬼异议者“:一旦出现众人意见”一致“的局面,就由此人来负责提出各种可能的负面的观点。如果有人对公共的意见持有异议,但是却因为不愿意触犯众人而默不作声,那么魔鬼异议者就可以为他提供一个思考的基准点。

项目结构

在工作与评估之间实行某种隔离来客服信息流通质量的退化。

大型项目中共同的社会性问题

以”缺乏能力“或者其他的此类接口,免去任何人的职位,都会有损于项目的整体绩效。而且,一旦某类人开始意识到上级对自己的评判与其他人的标准不同,他们的表现也就会不同。

第三篇 作为个人行为的程序开发

第七章 程序开发任务的差异

专业的与业余的程序开发

业余程序员学习的是待解决的问题,专业程序员学习的是程序开发。

程序员想要做什么

对程序进行设计是,其中的任何部分既不能设计过分,也不能设计不足。

每个程序都有其特定的细致和复杂级别,这种级别取决于它的具体用途。如果付出的努力超出这种级别,要比低于这种级别更为不专业。

程序开发工作的不同阶段

任何一名程序员都不必具备完成整个程序的所有能力。

一个程序员水平低的标志是一旦因为计算机故障而无法运行程序时,他只会呆坐在自己的座位上,无所事事

我们总是希望能够从事自己最拿手的工作,反过来,为了使程序员通过项目收获最大,我们可以把他们指定到其不是最拿手的岗位,通过这种办法,我们可以确保在遇到障碍时,他们会欣然接受转向其他任务的机会。

小结

程序开发并不是一个一成不变、不可分割的过程。

与业余程序员相比,专业的程序员术业有专攻,其需要的工具也因人而异。

”优秀程序员的标准是什么“的问题,实质上是人与人之间互相承认与鼓励的问题。

第八章 人格因素

一个人的人格就是其有别于他人的特点。

疯狂的轰炸机

两个引入BUG的角色

  • 没有受过正规训练,耻于向他人求教
  • 有丰富的程序开发经验,不听取他人的建议

人格的改变

人格是一个人所有特征的集合。

人格变化的原因很多,比如牙齿感染,需要关注程序员的人格变化。

如果没有首先挖掘出问题的根源,那么针对人格问题进行校正或调整的有效方案根本无从谈起。

人格中经久不变的部分

一个人的人格并非只是简单的一层,而是包含了丰富的层次。即使是相同的层面,其中隐藏的内容也可能很不一样,甚至截然相反。

关键的人格特征

在程序开发过程中,与人的智力因素相比,其人格因素才是更重要的。

负面特征

  • 缺乏在高压力环境中坚持一个多星期的能力
  • 不适应快速的变化

正面特征

  • 整洁,把手头资料整理好的习惯
  • 谦逊/自负而果断
  • 幽默感

人格测试

  • 罗尔沙赫氏墨迹测验
  • 主题统觉测验
  • 明尼苏达多重人格测试表

程序员一定会在性格测试中作弊

程序员的人格测验

第九章 智力水平以及问题求解能力

心理集合

心理集合会导致错误

某些类型的代码,没有注释的情况下,程序功能反而更容易被理解。

问题求解的一些维度

高明的人并非有什么万能的解题模式,而是有一些列的“解题模式”,而他们对其中的任何一个模式都没有偏爱。

程序开发的智力因素

聪明的人往往会在寻找解决问题的方法时,充分运用他最擅长的方面,同时尽力去回避自己的弱点。

智力测试

程序开发是一项极具多样性的行为。

程序员的智力测试

人们总是可以一次又一次地从测试中学到一些东西。

程序员的工作绩效不可能被归结为单独的一个数字。

评注

……较之智力因素,人格因素、工作习惯以及培训等方面的因素要与此更为相关。这些因素与智力因素不同,他们都可以通过后天经验发生改变。因此,选拔程序员的问题就转化成为培养程序员的问题。

……最大的挑战不是在于创造性思维本身,而是创造性的交流,用可以为其他人接受的方式重新表述我们自己的思想。

第十章 积极性、培训以及经验

工作绩效的实质提高还要依赖于培训和实践经验。

所有的因素都被考虑到了之后,剩下来哪些无从解释的部分就称为“积极性”。

常见情况:如果某个人的积极性没有激发出来,就不可能很容易地使他投入到学习之中;反之,如果他动力很足,就没有任何办法可以阻止他学习。

积极性

研究成果:如果适当地增加驱动力,那么在开始阶段确实可以提高工作效率;但是一旦超过一定的极限之后,继续增加这种“驱动力”只会很快地令工作绩效降为零。

给程序员施加高压,以期他们能够很快地排除某个程序错误,这种做法已经被证明是最差的策略。

只有首先改变所处的外部环境,才能有可能去改变自己一些内在的东西。

培训、课程学习与教育

教育:一般性的原理与技巧

培训:学会某种特定技能

学习的阻力

只有当存在阻碍学习的负面作用力时,学习才会失败。

如何学习程序开发

如果想不断提高,就不能仅仅依赖于正式的培训。

了解自己拥有什么、缺乏什么(自知之明)。

在程序的输出中会隐藏大量的信息。

解决学习与工作矛盾的方法:经过适当次数的尝试之后,要是你还搞不清楚新技术失败的原因,而且没有任何的进展,那么你就应该及时回头;如果你有某种“弥补的”方案,那么这时就应该采用。与此同时,你还应该构造一个测试用来,通过它来找出原来所采用的方法失败的原因。

小结

可以从两方面提高工作绩效

  1. 培养对工作的渴望
  2. 使他们掌握为完成工作而必须具备的知识

能够将我们从计算技能培训的苦海之中解救出来的,正是计算机本身。只要程序员具有学习的能力,计算机也可以永远地成为他们的老师。

第四篇 程序开发工具

第十一章 程序语言

程序语言与自然语言

程序语言设计

一般而言,在学习了一门新语言之后,我们才发现以前使用的语言是多么土。

第十二章 程序语言设计的一些原则

一致性

语法上的不一致性会打击程序员进行语义探索的积极性。

简洁性

局部性与线性

局部性的概念对应于联觉记忆,而线性概念对应于顺序记忆。

传统与革新

新的语言内容上与此前已经掌握的知识类似,可能会对后来的学习过程产生影响,就是所谓前摄的一致作用。

专用的、多用的以及玩具式语言

专用语言对使用者思想的束缚会更大。

第十三章 其他的程序开发工具

程序测试工具

测试系统首先应该实时记录下代码中的哪些部分被执行过了,哪些还没有被执行,并且动态地显示出来。

局部性或简洁性不佳的程序,会更难进行测试。

如果无法找到错误,往往是由于查找的位置有误,从原来的思维惯性中解脱出来。

操作系统

无论是系统的何种特性,只要它对程序员的成功或者失败举足轻重,他们就会去适应。

分时与批处理

Man-Computer Problem Solving: Experimental Evaluation of Time-Sharing and Batch Processing

文档管理

在程序开发的问题上,要想让人们相信文档管理工作与民间医药一样,没有任何价值,不是一件易事。

代码覆盖分析器,静态和动态结构分析器,测试数据库,规范说明语言,测试装具模块以及驱动程序

第五篇 结语

可能捧着这本书的,正是某人甘愿为人利用的双手,而他们之所以阅读本书的目的,正是为了其雇主的利益。

《程序开发心理学》笔记相关推荐

  1. 《信贷的逻辑与常识》笔记

    序 银行信贷风险管理的反思 现状与趋势 银行贷款的质量变化与经济周期.宏观调控政策等存在很高的相关性 现在银行不良贷款的增加主要是前几年经济快速增长时企业过度投资.银行过度放贷所带来的结果. 从历史情 ...

  2. AI公开课:19.02.27周逵(投资人)《AI时代的投资逻辑》课堂笔记以及个人感悟

    AI公开课:19.02.27周逵(投资人)<AI时代的投资逻辑>课堂笔记以及个人感悟 目录 课堂PPT图片 精彩语录 个人感悟 课堂PPT图片 精彩语录 更新中-- 文件图片已经丢失-- ...

  3. 人工智能入门算法逻辑回归学习笔记

    逻辑回归是一个非常经典的算法,其中也包含了非常多的细节,曾看到一句话:如果面试官问你熟悉哪个机器学习模型,可以说 SVM,但千万别说 LR,因为细节真的太多了. 秉持着精益求精的工匠精神不断对笔记进行 ...

  4. 【逻辑回归学习笔记】

    算法描述 1.逻辑回归要做的事就是寻找分界面实现二分类. 2.问题假设:对一堆三角形和正方形分类. 3.数据输入:已知正方形和三角形的坐标和标签. 4.算法过程: 知识储备 1.分类和回归 ①分类的目 ...

  5. 逻辑回归函数学习笔记

    继续逻辑回归学习,今日笔记记录. 1.逻辑回归和线性回归的关系:对逻辑回归的概率比取自然对数,则得到的是一个线性函数,推导过程如下. 首先,看逻辑回归的定义 其次,计算两个极端y/(1-y),其值为( ...

  6. 2.2 逻辑回归-机器学习笔记-斯坦福吴恩达教授

    逻辑回归 上一节我们知道,使用线性回归来处理 0/1 分类问题总是困难重重的,因此,人们定义了逻辑回归来完成 0/1 分类问题,逻辑一词也代表了是(1) 和 非(0). Sigmoid预测函数 在逻辑 ...

  7. LVM逻辑卷分区笔记

    磁盘的静态分区有其缺点:分区大小难评估,估计不准确,当分区空间不够用的时候,系统管理员可能需要先备份整个系统,清除磁盘空间,然后重新对磁盘进行分区,然后恢复磁盘数据到新分区,且需要停机一段时间进行恢复 ...

  8. 适合理工直男的钟平老师逻辑英语学习笔记

    一切的一切都只是套路!             --鲁迅 核心公式: En: (状语1) 主(定语1) 谓(状语2) (宾)(定语2) (状语1) Ch: (状语1) (定语1)主 (状语2)谓 (定 ...

  9. 【数字逻辑】学习笔记 第四章 Part2 常用组合逻辑电路与竞争、险象

    文章目录 一.常用组合逻辑电路 1. 译码器 (1) 二进制译码器 74LS138(3/8译码器) a. 一般符号和图形符号 b. 74LS138功能表 c. 两片 `74LS138` 构成 `4-1 ...

  10. 线性回归、逻辑回归学习笔记

    学习源代码 import numpy as np import matplotlib.pyplot as plt def true_fun(X): # 这是我们设定的真实函数,即ground trut ...

最新文章

  1. 安装Oracle10g on RedHat as 4 64bit
  2. TCP/IP详解--第十四章
  3. archlinux包管理器--pacman常用命令
  4. 华为鸿蒙系统是否上线,华为官方:鸿蒙系统2.0上线,手机能否搭载鸿蒙操作系统?...
  5. iOS开发API常用英语名词
  6. 博为峰Java技术题 ——JavaSE Java 方法Ⅰ
  7. ClassNotFoundException: javax.validation.ValidatorFactory
  8. 两分钟学会Android平台NDK编程(无须Eclipse和cygwin,可使用命令行打包多个so)
  9. 2021湖南高考成绩分段查询,2021年湖南高考成绩排名查询系统,湖南高考位次排名表...
  10. HTMLjavaSkcriptCSSjQueryajax(六)
  11. 操作系统 第二部分 进程管理(六)
  12. 控制系统分析与设计(一):控制系统分类及建模
  13. 用户画像第四章(企业级360°用户画像_标签开发_挖掘标签_ 客户价值模型-RFM)
  14. 螃蟹保存方法保存时间_活面包蟹怎么保存?面包蟹能保存多久
  15. 基于python获取雅虎金融股票数据及相关可视化操作
  16. win10切换输入法快捷键_怎么给电脑win10添加其他语言输入?例:日语,俄语
  17. 微型博客网站Twitter打假
  18. 四月英语——你是人间四月天
  19. linux define路径,linux架设BT Tracker服务器小记
  20. 上海交通大学计算机学院录取分数线,上海交通大学

热门文章

  1. Hyperchain超块链创始人史兴国:“数藏云” 助力实体数字化转型
  2. [微语21.01.02] 清醒
  3. 百科知识 tar文件如何打开
  4. 红外摄像机的原理、分类及特点
  5. 2019CSP爆炸记
  6. 罗列一下“流氓软件”的基本行为
  7. 将Egg项目部署到阿里云服务器
  8. 新手到底怎么学习Java?
  9. 浅谈IDC网管软件的特殊性
  10. Android实现简易轻量下载器:单线程任务队列