《程序开发心理学》几点核心理解

作者:草小诚
转载请注原文地址:https://blog.csdn.net/cxcjoker7894/article/details/85319250

前些天读完了《程序开发心理学》(杰拉尔德·温伯格),这本书确实不错,和博主一直以来的观念相契合,对博主自己程序开发方法论的系统形成有极大的帮助,另外作者在数十年前就能写下许多当今被大家所认可的方法理论,令人深感敬佩。
本文记录书中一部分核心论点,以原文为基础,进而谈谈博主自己的理解,也有一些博主认为不错的句子摘抄,主要集中在第二章团队篇和第三章个人篇,粗体为书中原文。

无私式程序开发与民主化团队

“如果注意力只是集中在他们自己程序上,那么即使是输出中再明显不过的错误,也会被程序员忽略掉,而旁观者则可以一眼看出这些错误。”

作者举了一个例子,即如果一个人买了一台大众汽车,那么在咖啡店等地方等待的时候,在一沓汽车广告宣传册中,就会倾向于只看大众品牌的宣传册。因为人们都倾向于发现自己是对的,在项目开发中,如果遇到一个无法定位又无法复现的问题,开发团队很容易倾向于忽略这一次“偶然”的错误输出,以致于埋下以后崩溃的钉子,为了避免这样的情况出现,引出了后面的无私式开发,一份代码不会只由书写者独自审阅。

“如果一个成员因为分配给他的工作而感到自卑,那么压抑这种感情会给团队凝聚了造成灾难性的影响,采用无私式程序开发的方法,可以让每个人都感觉到自己并非偏于系统的一隅,而是共享了系统的大部分,所以以上情绪可以得到缓解。”

“程序员需要知道“为什么做”,而不是“做什么”。”

作者提倡让参与项目的每个人都完全了解项目,每个人都知道项目的架构,分工,目标,受众,需求等等,每个人都有在会议上的发言权和话语权,博主非常赞同,这样做可以充分发挥每个程序员的主动性,也会极大的统一大家的努力方向,减少无用功和偏差的出现。提高大家的存在感和成就感,而且可以让优秀的有产品思维的程序员们也发挥出自己的优势。

“与那些世界级的口若悬河的推销商相比,作为一名语调温和的程序开发奇才,将可以更加轻松的对程序员们进行领导(或影响)。”

“当一名根本没有编过程序的领导被指派负责某个开发团队时,除非该领导明确或含蓄的承认自己在技术能力上的欠缺,否则注定会有麻烦发生。”

虽然博主没有过这样的体验,不过想也知道,被一个什么都不懂的人对着自己的代码指手画脚,或是被要求做出一些不切实际的需求或实现方式的时候,那体验一定是极差的。作者举了一个例子,说一个项目经理开发水平很差却很爱装13插手程序员的工作,有一次他对一个程序员描述他比较愚蠢的想法,那个程序员假意说:“嗯,我觉得非常好,可以拿到大会上讨论一下。”然后可想而知,这个经理在众人的嘲笑声中狼狈下场。所以勇于承认自己的不足,这不止局限于程序开发领域。

“(不好的管理方式)只能对相对不够成熟的程序员才可行,因为他们不了解还有其他的可能,或者对技术相对粗劣的程序员也可行,因为他们再清楚不过,其他的可能并不是为他们而存在的。”

这里说的不好的管理方式,指的是一个开发团队遇到了一个蛮横不讲道理,水平又不行的领导,既然领导层不会妥协,面对这愚蠢的领导,只能由开发团队妥协,作者称此为“强加的工作”,大部分程序员不会忍受这样的环境,但存在即合理,既然有这样的现象,一定有其原因,原因就是有些程序员因为上述两点,忍受着在这样的环境中工作。

“领导能力方面的一个悖论非常简单:只有随时准备下台的领导者,才有可能获得成功。”

这里的领导指的是项目经理,在项目经理之上还有公司领导层,在其之下则是项目的开发团队,那么如何平衡这两者之间的关系呢,即为此句,项目经理必须有原则与自信,他必须知道,自己即使因为顶撞领导而被离职,也一样能找到更好的工作,如此才能保证自己的产品质量。然而可悲的是,现在大多数的项目经理,对上一味的承诺应承,以此来获得领导的青睐获得提拔,等到真正项目完成不了的时候,他已经升职不再对此负责了。

“在某些成员离开之后,民主式组织的开发团队显得更有能力经受住相应的影响,由于任务是由全体成员共同承担的,同时他们之间存在很多交流,所以当某个人离开之后,其他的伙伴会根据需要填补他的空缺,并且运用在他们共同工作期间掌握的知识。但是反过来事实也证明,如果有一位新来者加入到一个民主式管理的团队中,那么由于其内部结构中不会专门为他留出一个明确的位置,所以这样的团队通常很难接受新成员。”

民主化团队让新成员很难融入,而一旦融入,对新成员来说也是极为舒服的,团队整体的凝聚力高,效率和能力上限也高,也能让其中的成员能够更加全面和快速的发展。相信这是大家所期待的团队,但是也是可遇而不可求的稀少团队。

“因此我们明白了,对于程序开发团队来说,为什么民主式的——或许应该成为“崇尚技术式的”——组织形式更为自然。”

民主式团队由于交流充分,成员的地位是由其他成员所了解到的其的技术水平所决定的,所以民主式团队可以自行决定在项目开发的每一阶段,由谁去做主导,由谁去定分工,等等,这就是崇尚技术式的体现,说到这里博主其实认为,民主式团队对成员的个人能力要求是极高的,换句话说,如果要组建民主化团队,那么吸纳的每一位成员必须有一个较好的综合水平才行。

项目的管理和绩效

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

这句话题主持保留意见,每个公司都有自己的中流砥柱,一般是非常重度的参与业务,如果此人离职,想必极难找到完美替代的人。如果要做到每个人都是可以热插拔的,除非要每个人都浅层次的参与公司业务,这样感觉虽然可以做到项目抗灾能力强,但是代价太大。而且恐怕会影响员工情绪。

“魔鬼异议者”

人们都有一种从众心理,作者提到一个实验:一个明显的正确答案,如果会议内的其他成员都答错成错误选项(在实验中这些“其他成员”都是提前安排好的),那唯一的一个实验对象也会选择跟随说出错误答案,但是只要有一个人——哪怕就只有一个——说出正确的答案,实验对象就会有勇气也坚持正确的看法。所以许多管理者在管理团队时会设置一个“魔鬼异议者”角色,在会议中专门提出不同的看法,在咱们现在看来可能就是杠精了,有时会收到奇效。

“你的好朋友没有任何理由不能同时也是对你最为苛刻的批评家。”

乐交诤友,这个道理人人都懂,但是人人都很难真的做到,做别人的诤友很容易,接纳自己的诤友很难,良药苦口,与君共勉。

程序开发任务的差异

“业余程序员需要学习的,只是其待解决的问题,对于他们来说,所谓“程序开发方法的学习”,不是漂亮的幌子,就是一桩令他们苦恼的麻烦事。与此相反,专业程序员确实要学习其专业——程序开发——而通过程序开发所解决的问题,不过是他们在水平提高过程中的一次偶然事件。”

作者在书中将程序员分成了“业余程序员”和“专业程序员”两类,其本质区别为:业余程序员所书写的系统只为其自己或某几个人使用,而专业程序所写的系统是给别人使用。如此划分没有问题,然而现在,有太多的程序员做着专业程序员的工作,抱着业余程序员的心态。书中对业余程序员的描述,与他们无不贴切。所以博主认为不能如此简单的划分,而应该明确的辨认,哪些人是专业程序员,哪些人是“业余”程序员。而且,业余程序员和专业程序员之间,互相不理解。

“一名专业程序员,如果坚持把一个供个人使用的微小程序,当成需要被成千上万人使用5到10年的操作系统一样来对待,难道不是更糟糕吗?”

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

博主有时就有些偏入这个错误,一个简单的网络接口,或是一个小功能,博主总想把它们做的尽善尽美,即使可能是只给自己使用,或是是从次数极少的小脚本,也要把他们写的提示周全,细节完善,这是强迫症吧,的确非常的愚蠢,浪费自己的时间精力。

“为了使程序员通过项目获得的学习收获最大,我们可以把他们指定到其不是最拿手的岗位上。”

注意这里说的是“不是最拿手”,而不是“最不拿手”,博主认为,工作所用到的知识,个人已经掌握60%-70%的话,是最快最容易能够获得学习收获的,既不至于掌握的太少而造成工作难以继续,又不至于全部掌握而没有获得新知。

个人的性格因素和智力

“如果一个程序员缺乏在高压力的环境中坚持一个多星期的能力,也许我们就可以肯定地说,他不是一块程序员的材料。”
“由于程序开发的多样性,所以一个人只要稍微有点不适应快速的变化,他就不能胜任专业程序员的工作。”
“在程序开发中需要一个最容易确定的性格特点,就是稍微讲究一点整洁。”
“对于从事程序开发工作的人来说,应该多少具备一点的另一个重要性格特征就是谦逊。”
“在对程序开发至关重要的各种性格因素中,最后一个应该是幽默感。”

以上是作者罗列出的对程序开发具有重要意义的性格特征,书中明显的分了等级,抗高压和快速变化是不可或缺的,等级最高,而整洁只需要“稍微讲究一点”,而谦逊在书中被辩证的看待,因为在某些情况下,“自负而武断”比谦逊更能发挥作用,这取决于个体能力的高低。最后作者把幽默感,作为“至关重要的性格因素”放在了末尾,哈哈,的确,一个幽默的人可能不是一个好的程序员,但是一个好的程序员一定是个幽默的人~

“即使是对人类行为最不经意的观察者,也可以明显地看出,人的智力及其所受到的教育会影响到人的性格。”

“我们还是可以不过分的估计:程序员的平均智商甚至要超过大学研究生。大体上讲,一个程序员群体越是成功,其平均智商就越高。”

“毫无疑问,对于一名程序员来说,记忆力是其智力中最重要的方面之一。”

虽然可能带有一定的褒贬色彩,但是博主在最近一年也已经意识到,智力,的确是影响程序员职业生涯的一个重要因素。其实说是智力,可能更多的是逻辑思维能力,人都有一种推己及人的思想,即自己是什么样,就会认为大部分人都是什么样,所以博主在这一年中最初产生过许多的困惑,因为有很多很基础,并没有什么难度的任务,在一些人看来和做来是如此的困难,以致于博主所设计的接口一度被很多人认为是难以使用的,后来博主渐渐的明白了每个人的智力因素不同,就像KISS原则和用户认知成本一样(可能以后会专门开博文来写对产品的理解),程序员所写的代码,应该充分考虑后续使用者的难易程度。

“在缺乏客观测量标准的前提下,我们常常会通过程序员在一个程序上的出力程度,来判断程序的难易程度。一旦采用了这种测量方法,我们就很容易陷入这样一个悖论:最差劲的程序员往往是最优秀的——因为他们工作得最卖力。”

这真是一个可悲的事实,博主身边就有许多例子,有些程序员,由于水平较低,往往会抱怨自己负责的工作太多和太难,耗时也会比专业程序员长很多,但是在领导眼中(即使是技术向的领导也是如此)他们反而是最棒的,每天做着“难”而“繁多”的工作,以至于一直都非常的忙碌和崩溃。再加上现在有许多公司都不是技术人做领导,有些朋友说自己的公司就是以“加班长短”来作为考核标准,所以领导要求他们“即使没事做也晚点走”,殊为可悲。

“然而这并不是说,简单的执行一组固定的规则,不是智力行为的一个重要的部分。恰恰相反,如果一位程序员即使是完成把两个数相加这样简单的计算,都要费九牛二虎之力,那么在设计最佳问题求解方案的角逐中,他肯定会掣肘于其差劲的算术能力。”

博主身边有听过这样一些言论:“我学这些公司又用不上,有什么意义啊”,“我们做的这个破系统就这么点功能,还能怎么发挥啊”,“做来做去就这点东西,都一样啊”,说出这样言论的童鞋,请你们看看书中这句话,请问,你们做的系统非常简单,逻辑非常少,那么你把它们做到尽善尽美了吗,用户体验做到优秀了吗,负载和性能做到最优了吗。恕我直言,说出上述言论的人,大多都是系统做的半吊子,不勤于学习,以上述言论为借口的人,说是工作太差无处发挥,其实根本就没有发挥的能力。一个简单的系统都做不好,谈何进阶呢。

积极性与学习

“只要允许程序员按照自己所偏好的方式进行工作,那么程序开发这项工作本身就是对他们最大的激励。”

如果说有什么能和 高昂的工资,广阔的平台,具有同样的吸引力的话,那一定是团队的技术栈,氛围,福利,和工作环境了,如果管理者具有远见卓识,为开发团队提供宽松和自主的工作环境,那么他一定能得到专业程序员的青睐,如果再加上定期团建,健身房或者按摩椅,那他公司的竞争力怕是要直线飙升了。但是这些统统有一个前提,那就是:必须面对的是专业程序员。如此才能欣欣向荣的发展,如果是低要求的公司,招纳前面提到的“业余”程序员的话,这样恐怕就不合适了。

“如果一名程序员想要不断提高,他就不能仅仅依赖于正式的培训,也不能指望主管某天大发慈悲,根据需要把他送去进修。同样,他也不能依靠纯粹的所谓“经验”,因为经验不见得一定会交给他所有东西。如果程序员需要发挥其经验的作用,他首先就需要学会如何去学习。”

“有些人总是心甘情愿的承认自己的不足,而不去尝试学习任何新东西,其原因在于,他们总是想当然的认为,自己不可能取得成功。这种对失败的畏惧心理,有的是缺乏自信心造成的,也有的是源自于先前此类努力过程中的失败经历。但更普遍的情形是,这类恐惧主要并不在于失败本身,而在于失败可能被周围人看到。”

博主一直以来都不懂为什么有人“心甘情愿的承认自己的不足,而不去尝试学习任何新东西”,阅读这本书读到这句话,有一种豁然开朗的感觉,原来如此啊,想想确实很对,于是找一个比较有内涵也懂一点心理学的朋友去印证,他也比较赞成,的确,有很多人甘于平凡,只想浑噩度日,对他们来说,学习新知是辛苦的,而承认不足对他们的生活并没有什么影响,博主倒是觉得这里没有褒贬,每个人有每个人的人生观,接受平凡可能才是伟大。

总结

上面只是摘抄了一部分博主认为比较精彩的原文,具体本书的全貌还待读者自己阅读,书中绝大多数理论和博主以前的观念想法相契合,仿佛说出了博主潜意识中的观点,对从无法总结的离散观点到形成系统的方法论,有重大的帮助。

本书也是博主看的第一本讨论程序开发的环境和个体方向的书籍,觉得很是受用,另外书中最后一章还有软件开发的工具和原则等等,由于博主在大学软件工程专业中已然学过,看到觉得无感,故本文并未收录其中语句,但对没有了解过的人想必也是很有帮助的。

那么读完此书之后有什么实际性的指导意义呢,博主认为是这样的:

  • 作为程序员,应该力求加入采用无私式开发的民主化团队。这就要求作为程序员,需要个人综合素养过关,技术实力过硬(毕竟民主式也可以称作是崇尚技术式),懂的分辨团队氛围。作为管理者,应该力求将团队文化构建成无私民主式的氛围。这就要求管理者与时俱进,充分学习现代化的管理理念,坦诚,并且有以自己高超水平为基础的强大自信。
  • 在程序开发和项目管理中,充分的考虑到团体与个人的心理因素,如认知失调,忽略bug的倾向,魔鬼异议者的存在意义等,程序开发是以人为主体的,不能仅仅把它当做一项机器工作来看待。
  • 懂的如何去做一个专业程序员,了解专业程序员的特征和诉求,了解一个专业程序员需要具备哪些性格特征和素养,补足自己。同时也要善于总结归类,分辨哪些人是业余程序员,哪些人是专业程序员,以此因材施教因地制宜,采取不同的策略。作为开发者则可以充分的理解周围的同事,用辩证的眼光看待问题。
  • 智力和记忆难以人为做出明显的改善,但如果要让博主回答“如何提高智力和记忆力?”这个问题的话,博主会说答案是“思考”,勤于思考,勇于挑战,不断学习,就是提高技术与智力的良性循环,其实博主说的轻巧,自己也经常很难克制自己的享乐心理,但只要尽力去做便好,路远,行则将至。

好了,文毕,推荐《程序开发心理学》(杰拉尔德·温伯格),值得一读。

猜你喜欢

转载自blog.csdn.net/cxcjoker7894/article/details/85319250