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分钟时间内解决问题,我将用几分钟时间考虑不同的方法,并在下一小时内尝试不同的方法。
经验
和书本知识比起来,软件开发中经验的价值要比其它领域小,这有几种原因。在许多其它领域中,基本知识变化缓慢,以致于10年前毕业的某人所学到的知识在现在仍没有什么变化。而在软件开发中,即使基本的知识也发展迅速,在你以后10年毕业的某个人可能学到了二倍
于你的有效编程方法,一些老的程序员往往被另眼相看,不是由于他们对某些特定方法缺乏接触,而由于他们在走出校门后对一些闻名的基本编程概念缺乏了解。
在其它领域中,你今天在工作中学到的东西可能对你明天的工作有所帮助,在软件开发中,如果你不改变你在使用从前的编程语言中的思维方式,或你在你的旧机器上得出的代码调试方式的习惯,你的经验将不值一文。许多进行软件开发的人往往花费时间准备上一次的战斗而不是下一次,如果你不因时间而做出应变,你的经验与其说是帮助倒不如说是一个阻碍。
除了软件开发中的迅速变化外,人们常从其经验中得出错误的结论,客观地对自己进行检查是困难的,你也可能忽视经验中使你能得出不同结论的重要之处,阅读其它程序员的研究材料是有益的,因为研究材料揭示了其它人的经验——它们都经过充分的精炼,你可客观地对其进行检查。
人们也往往荒唐地强调程序员的经验。“我们需要有五年以上C语言编程经验的程序员”就是其中一例,如果一程序员在头一、二年没有学C语言,第三年学也不会产生很大区别。这种类型的经验和其工作能力没有多大区别。
在程序开发中,知识更新迅速使此领域中“经验”处在一种奇怪的地位上,在其它许多领域,过去有着成功历史的专业人员,往往令人放心,并且因其一串成功的事情而得到尊敬。退步很快的人将很快和潮流格格不入。为了使自己有所价值,你必须紧跟潮流。对年青的、求知欲旺盛的程序员,他们往往在这点上有优势,而有些老的程序员认为自己有所资格了而讨厌一年接一年都要证实自己的能力。
最后一个问题是:如果你已工作了10年,你得到了10年的经验应当是真正的经验,你如能坚持不断地学习,你就能得到经验,如果你并不想学到什么,不管多少年你也学不到什么。
计算机迷
如果你还没有至少在一个相同的项目上花费一个月的时间——一天工作 16个小时;为了发现你的程序中最后一个错误睡眠中你也念念不忘它,你接连几天没日没夜地工作——即使你所编的程序并不复杂,那么你可能不会意识到编程中有某种令人兴奋的东西。
Edward Yourdon
这种对编程的痴迷纯粹是胡闹,并且几乎注定要失败。但是那些通宵程序员使你觉得他们是世界上最好的程序员,但是随后你不得不花费几周的时间来修正你在这短时间的辉煌中所带来的错误,你可能对编程非常热爱,但是你应能冷静地处理这个问题。
9 习 惯
好的习惯起作用是由于你为一个程序员所作的大部分事情是你在无意识中所完成的,例如,有时你可能会感到以前爱采用缩进循环,但是现在每当你编写一个新的循环时你不会这样想了。这种情况确实在建立程序格式时存在。你最后一次向自己提出这个问题是在什么时候?如果你已经有五年实际编程经验,你就存在较多的机会,如果你最后一次向自己提出疑问的时间在4年半之前,剩下的便是受习惯的支配时间了。
你在许多地方都存在习惯。例如,程序员往往爱仔细地检查循环变量而少检查赋值语句,这就使得发现赋值语句中的错误要比发现循环变量的错误困难一些。你能对别人的批评作出
友好或不友好的反应。你一直在寻找使代码可读或编码速度更快的方法,也可能你无意寻找它们,如果你不得不在可读性和编码速度方面作出选择,你每次都会作出相同的选择,当然,你并不是在真正选择;你是在习惯性地作出反应。
成为某方面好的或差的程序员,主要是靠你自己的所作所为,建筑师要通过建筑而程序员要通过编程。你所作成为习惯,决定了你的编程品行,最终,你的习惯好坏决定了你是否能成为一位好的程序员。
微软公司的 Bill Gates——董事会主席兼 CEO——曾说过,任何好程序员在开始的几年都做得很好。从那以后,程序员的好坏便基本定型了。在你进行编程很长一段时间后,很难见到你突然说“我怎样才能依循环进行得更快呢? " 或“我怎样才能使代码更可读呢?”这些都是好的程序员一开始便养成的习惯。
当你开始学习某一件事时,你应按正确的方式学好它,当你开始学时,你已对其进行了思考,并且你可在正确或错误的途径间作出轻易的选择,在你作过一段时间后,你对你所作的不太注意,此时“习惯的力量”会开始起作用。确保起作用的习惯是你所希望的。
如果你没有养成最有效的习惯你应怎么办?对这些问题没有一个明确的答案,以下是对此问题的部分回答,你无法用没有习惯取代坏的习惯,这就是为什么突然停止抽烟或节食的人如果不用一些别的什么替代的话会存在很大困难的原因。用一种新习惯代替旧习惯比完全戒除旧习惯要容易一些,在编程中,应尽力养成良好的习惯。你应养成在编写代码之前编写PDL(流程图)和在编译之前阅读代码的习惯,你不必为失去坏习惯而多虑。在用新习惯取代后坏习惯会自然而然消失的。
10 小 结
Ÿ 你的个人性格直接影响你编写计算机程序的能力。
Ÿ 最有明显作用的性格为:谦虚、好奇心、诚实、创造性和纪律,还有文明的“懒惰”。
Ÿ 高级程序员的发展和生成与天才并无多大联系,任何事情都和个人的发展有关。
Ÿ 令人吃惊的是,小聪明、经验、坚持和欲望既可帮助你也能妨碍你。
Ÿ 许多程序员不主动去吸收新信息和新技术,而是靠偶然地上获得一些新信息,如果你抽出少量时间学习别人的编程经验,过一段时间后,你将在你的同行中脱颖而出。
Ÿ 好的性格对养成良好习惯有很大影响,为了成为一位高水平的程序员,你应养成良好的习惯,其余的就会随之而来