一篇关于程序员性格的文章第2/3页

 更新时间:2008年04月19日 20:17:29   作者:  
软件开发中人们很少注意个人性格问题。自从 1965年Edsger Dijkstra的有里程碑意义的文章“程序开发是一种人类活动”发表以来,程序员性格被认为是合理的和有成效的研究领域,虽然有些题目如“大桥建筑者的心理”和“对律师行为的研究实验”看起来可能是荒唐的,而在计算机领域,“计算机编程中的心理”和“对程序员行为的研究实验”等题目则是常见的。

    前二个方面——承认你不知道一些事情或承认你犯了一个错误是你谦虚的反映。如果你不懂装懂你又怎么能指望学到新东西呢?你最好是假装自己知之甚少,听别人的解释,向他们学习新的东西,并评估他们是否真正了解其正在谈论的东西。 

    你应对自己的能力作某种程度的估计,如果你对自己的评价很完美,这可是一个不妙的信号。 

拒绝承认错误是一个令人讨厌的习惯,如果Sally拒绝承认错误,她看起来相信自己没有错,可能会使其它人相信她确实是无辜的,但是事实证明Sally出错误了,这样,每个人都知道她犯了错误。错误正如潮流一样是一种复杂的活动,如果她在过去没有发生过错误,谁也不

会将错误归咎于她。 

    如果她拒绝承认错误,到头来她只能自食其果。其他人都知道他们在同一个不诚实的人工作。这比仅犯一个错误更令人反感。如果你犯了一个错误,你应迅速主动地承认错误。 

    对编译器错误信息不懂装懂是另外一个常见错误。如果你不理解某一编译警告信息或你认为时间太紧迫来不及检查,你想想这是不是真正浪费时间?编译器将问题明白无误地向你展示出来,而你却不试图解决问题,我碰到过不少人在调试过程中请求帮助的事,我问他们是否有一个完好的编译器,他们回答是。于是开始解释问题的症状,我说:“这看起来像是未对指针进行初始比。但是编译器应对此给出了警告信息。”他们就说:“哦,编译器确实给出了警告信息,我们以为它是指其它事情。”你自己所出的错误难以蒙蔽别人,也更难以愚弄计算机,所以你用不着浪费时间这样做。 

    另外一种疏忽是当你并不完全了解程序时,你“编译它看是否能运行”。在这种条件下,其实并不意味着程序能运行,因为连你自己都不清楚程序的有关情况。请记住,测试仅能发现错误的存在,而不能保证一定不存在某种错误。如果你不理解程序,你就不能进行深入的测试,你如果觉得应编译一下程序以便了解程序的运算情况的话,这可是一个不妙的信号,这可能意味着你不清楚在干些什么。在将你的程序编译之前你应对其有一个深刻的理解。 

    状态报告也同样是一个令人反感的领域。如果程序员在最后50%的项目时说,程序中  90%是完整可靠的,他们将声名狼藉。问题在于你对自己的进度缺乏了解,你应对你的工作加强了解。但是,你为了迎奉上司而不愿说出真实情况的话,可就不同了。一般来说上司都愿意听到对项目状态的真实报告,即使不是他们所希望听到的,如果你的观察和见解是中肯的,你应客观地将其说出来,上司需要有准确的信息以便协调各种开发活动,而充分的合作是必需的。 

    和不准确的状态报告有关的一个问题是不正确的估计。典型的情况是这样:上司问Bert要花多少时间才能开发出一个新的数据库产品。Bert和一些程序员交谈了一下,讨论了一些问题,最后认为需8个程序员和6个月的时间,但是他的上司说:“这并不是我们所需要的,你能不能使用较少的程序员在短时间内完成工作?”Bert考虑了一段时间,并认为可以通过削减培训时间和假期以及让每个人的工作时间稍微延长一点来达到上司的要求。他于是作出了需6个程序员和4个月时间的估计,他的上司说:“这就行了。这是一个相对较为低优先级的项目。你应及时完成它,因为预算不允许你超时。”Bert所犯错误在于,他没有认识到评估是不可商量的,他可以将估计作得更为准确,但是他和老板的商量结果并不能改变开发一个项目所需的时间。 IBM公司的 Bill Weimer说;“我们发现技术人员一般都能准确地估计项目。问题在于他们能否坚持自己的决定;他们需要学会坚持自己的意见。”Bert许诺在4个月里交付产品而实际上6个月才交付产品,肯定会使他的老板不高兴的。时间一长,他可能会因妥协而失去信任的。否则,他会因坚持自己的估计而得到尊敬的。 

    如果上司施加压力要改变你的估计,你应认识到决定要怎样作是上司职权范围内的事。你可以说:“看,这是项目的开销,我无法说此开支对本公司是否值得——这是你的工作。我不能和你‘商量”项目所花的时间,这正如我们不能协商确定一里究竟有多少英尺一样——这是不可变更的。你不能商定自然界的规律,我们只能商定本项目中影响进度的各方面,然后重新评估。我们能减少一些特征,降低性能,分阶段开发项目。或者是使用更少的人但时间延长一点,或者是使用稍多的人,而相应地减少一些时间。”

    我曾在一次软件开发管理讨论会上听到一个奇怪的说法。主讲者是一本销售很好的软件工程管理书籍的作者。一个听众问:“你的上司让你评估某一项目,你知道当你得出准确的评估时你的上司可能认为代价太高而放弃项目开发。这时你认为应怎么办?”主讲者回答说,当你说服你的上司做出开发项目的决定时,他们就对整个情况了如指掌了。 

    这是一个错误的回答。你的上司是负责整个公司的运转的。如果开发某一软件需10O000美元而你的估计是200000美元,你的公司就不会开发软件。这是要由上司做出决定的。上面这位主讲者对项目的开支说假话,告诉上司将比实际的要少,他这是在损害上司的权威,如果你认为项目是有前途的,它能为公司带来新的重大突破,或能提供有价值的培训,你应将其说出来。你的上司也会考虑这些因素的。你哄骗上司做出错误的决定将会使公司蒙受损失。如果你失去了你的工作,你将会明白你最终得到了什么。 

5  交流和合作

    真正优秀的程序员应学会怎样和别人工作和娱乐,编写可读代码是对程序员作为组中一员的要求之一。 

    计算机也就同其它人一样能读懂你的代码,但是它要比其它人更能阅读质量差的代码。作为可读性原则,你应将修改你的代码的人时刻记在心上。开发程序首先应同程序员交流,其次则是和计算机交流。 

    绝大多数高水平程序员喜欢使自己程序的可读性强,并抽出充足的时间这样作。虽然只有一些人能坚持到底,而且其中一些人还是高水平的代码编写者,对开发中程序员级别的了解,有助于解释什么地方适合于此原则: 

    级别1:初学者 

    初学者是能使用一种语言基本能力的程序员,这样的人能够使用子程序、循环、条件语句和其它许多语言特征。 

    级别2:中间者 

    中间级程序员有使用多种语言的能力,并且至少非常熟悉某一种语言。 

    级别3:专家 

    编程专家对其语言或环境或对这二者有着很深的造诣,这种级别的程序员对公司有价值的,而且有些程序员往往就停留在这个水平上。 

    级别4:大师 

    大师有着专家那样的专业知识,并能意识到编程只是15%和计算机交流,其余85%是和人打交道。一般程序员只有30%的时间甚至更少。大师所编写的代码与其说是给计算机看倒不如说是给人看的。真正的大师级程序员所编写的代码是十分清晰易懂的,而且他们注意建立有关文档。他们也不想浪费其精力去重建本来用一句注释就能说清楚的代码段的逻辑结构。 

    一位不强调可读性的高水平代码者可能停留在级别3的水平上,但是问题还不止如此。依作者本人的经验,人们编写不可读代码的主要原因在于他们所编代码质量较差。他们并不是自言自语地说:“我所编代码不好,所以我要使其难以读懂”,而是他们并不能完整地理解自己的代码以致于不能使其是可读的,这就使他们只能停留在1或2级的水平上。我所见的最差的代码是由一个任何人看了她的程序后都会望而生畏的人所编写的。最终,她的上司威胁说如她再

不改正就要解雇她。她的代码是不作注释的,并且其程序中充满了如x,xx,xxx,xx1和xx2这样的全局变量。她的代码给了她大量的机会显示她的改错能力。 

你不必为自己是初学者或中间者而内疚,你同样不必为自己是专家而不是大师自愧,在你知道怎样提高自己的水平后,你倒是应为自己停留在初学者或专家的水平上有多长时间而内疚。 

6  创造力和纪律

    当我走出校门时,我自认为是世界上最好的程序员。我会编辑令人容忍的井字游戏程序,也能用 5种不同的计算机语言编写一个 1000行的WORKED程序。然后我进了 Real World 公司。我在 Real World 公司的第一个任务是阅读和理解一个 200000行的 Fortran程序,然后我使其运行速度提高了2倍。任何真正的程序员将会告诉你所有结构化编码将无助于你解决问题。 

                                         “Real Programmers Don't write Pascal” 

    向一位刚走出校门的计算机科学毕业生解释为何需要约定和工程纪律是困难的。当我还是一个大学生的时候,我所编写的最大的代码是5O0行的可执行代码,作为一个专业程序员,我也已编写了许多小于500行的实用工具,但是一般项目的长度为5000到25000行,并且我参加过超过50万行的项目的开发工作,这种类型的工作不是需要较高的技巧,也不需要使用新的技巧。虽然一些有创造性的程序员将各种标准和约定视为对其创造力的阻碍,但是,对大项目来说,如果没有标准和约定,项目的实现是不可能的,而此时要发挥创造性也是不可能的。不要在一些无关紧要的领域建立约定,这样你就可在你认为值得的地方集中发挥你的创造力。 

    McGarry和 Pajerski在对美国宇航局的软件工程实验室过去15年的工作回顾中说,强调纪律的方法和工具是非常有效的。许多有很高创造力的人都能很好地遵守纪律,高水平的建筑师在材料的物理性能、时间和代价的限定范围内进行工作。艺术家同样如此,许多看过Lenoard的设计的人,都为他在细节上对约定的遵守产生由衷的敬重。当米开朗琪罗设计天花板时,使用了各种均衡的几何形式如三角形、圆周和正方形,他按一定层次将以上三种图形安排在三个区域,如果没有自我约束和结构,这300个人物的排列将是混乱的而不是有机地结合在一起的艺术杰作。 

一个杰出的程序员需要遵守许多规则。如果你在开始编码之前不分析需求就进行设计,你将在编码过程中学不到关于项目的许多东西,你工作的结果看起来更像一个三岁小孩的手指画,而不是一件艺术作品。 

7  懒 惰

懒惰表面形式有以下几种: 

Ÿ  拖延自己讨厌的工作 

Ÿ  迅速地将自己讨厌的任务做完以摆脱任务 

Ÿ   编写一个工具来完成自己讨厌的工作以解脱自己 

 

    当然,有一些懒惰形式要比其它方式好一些。第一种方式是没有任何益处的。你可能有这样的体会:你常常花费几小时来做一些没必要作的工作,而不愿面对自己所无法避免的次要的

工作,我讨厌数据输入,但是许多程序需要少量的数据输入。别人都知道我已拖延了数天的工作仅因为为了拖延无法摆脱的用手工输入几个数据的任务,这种习惯是“真正的懒惰”,你编译某一子程序以检查有关情况,这样你可以避免人工检查程序同样也是一种懒惰行为。 

    这些小任务并不像看起来那样令人反感,如果你养成马上完成这些任务的习惯你就能克服拖延这种懒惰。这种习惯叫“明懒惰”——懒惰的第二种方式,你仍然是懒惰,但是你是通过在自己所讨厌问题上花费尽量少的时间来避开问题的。 

    第三种选择是编写工具来做这令人讨厌的工作。这是“长期懒惰”。它无疑是懒惰中最有积极性的一种形式,只要你通过编写工具最终节省了时间,通过讨论可知,一定程度的懒惰是有益的。 

当你不是透过玻璃看问题的时候,你就看到了懒惰的另一方面。“赶着做”或“努力”并不能发出炫目的光芒。赶着做是一种多余和没有必要的努力。它只是说明你的焦急而不是你进行工作的努力程度。在有效编程中最为重要的现象是人们在思考中往往显得并不忙。如果我和一位看起来一直很忙的程序员一起工作,我将认为他并不是一位好的程序员,因为他并不是在使用对他来说是最有价值的工具和自己的头脑。 

8  不是你想象中那样起作用的性格

“赶着做”并不是唯一的一种看起来可能受敬重而实际上并不起多大作用的性格。 

坚持 

    依赖于环境,“坚持”可能是一笔财富也可能是一种不利条件,和其它许多多义概念一样,对它有不同的解释,这取决于你认为它是一种好的特性或坏的。如果你想将坚持定义为坏的性质,你可能说它是“顽固”,如果你认为是一种好的品格,你可称其为“坚强”或“坚持”。 

    在大多数情况下,软件开发中的坚持是顽固的意思,在你碰到某段新代码时,你再固执己见并不是什么好事。你应试着用另一个子程序,用另一种编码方法,或返回原来的地方,当某种方法并不起作用时,你应换用另一种方法。 

    在调试中,当你终于发现一个烦扰你达4小时之久的错误时,你一定感到非常满意。但是如果你在一段时间——通常为15分钟没有取得任何进展时,你应放弃找错。用你的潜意识去思考问题,尝试用别的方法解决问题,重写全部令人厌烦的代码段。当你的精神有所恢复时重新回到原来的问题上。和计算机错误作斗争是不明智的,你应尽量避免它们。 

    知道在什么时候放弃是困难的,但是这是你必须面对的一个问题。当你觉得自己受挫折时,你可向自己提出这个问题,你问问自己并不意味着放弃,但可能意味着是对自己的行动设置规范的时候了:“如果我不能用这种方法在30分钟时间内解决问题,我将用几分钟时间考虑不同的方法,并在下一小时内尝试不同的方法。 

经验 

相关文章

最新评论