- 33.1 个人性格是否和本书话题无关
- 33.2 聪明和谦虚
- 33.3 求知欲
- 33.4 诚实
- 33.5 交流与合作
- 33.6 创造力和纪律
- 33.7 懒惰
- 33.8 不如你想象中那样其作用的性格因素
- 33.9 习惯
- Key Points
编程过程非常耗用脑力,这种特性使得个人性格显得很重要。编程工作本质上是项无法监督的工作,因为没人真正清楚你正在做什么。我们都经常有这样的经历——耗用80%的时间着力于项目的个别地方,而花费20%的时间来完成其余80%的工作。
老板无法强迫你成为好的程序员,很多时候他甚至无法判断是否合格。如果你想有所成就,只能全凭自己,这涉及到你的个人性格。
一旦决心成为出色的程序员,你的发展潜力是很大的。各种研究发现,不同程序员创建某个程序所需的时间差可达10:1,同时还发现不同程序员调试程序所需的时间、程序实现规模、速度、错误率和检查出的错误数目也能达到10:1。
你无法提升自己的聪明程度,但性格在一定程度上能够改进。事实证明个人性格对于造就出程序员高手更具有决定性意义。
聪明不像是个人性格的一个 方面,也确实不是。碰巧的是,高智商与优秀程序员之间并无太紧密的联系。
什么?难道不需要智商很高吗?
对,是不需要。没人能同计算机那样迅速敏捷。要充分理解一个普通的程序,你得有很强的吸取细节的能力并同时消化它们。如何专注你的聪明才智,比你有多聪明更重要。
正如第5章“软件构建中的设计”所提到的,Edger Dijkstra在1972年的图灵奖演讲会上宣读了一篇名为《The Humble Programmer》(《谦卑的程序员》)的文章。他认为大部分编程工作都旨在弥补我们有限的智力。精通编程的人是那些了解自己头脑有多大局限性的人,都很谦虚。而那些编程糟糕的人,总是拒绝接受自己脑瓜不能胜任工作的事实,自负使得他们无法成为优秀的程序员。承认自己智力有限并通过学习来弥补,你会成为更好的程序员。你越是谦卑,进步就越快。
很多好的编程做法都能减轻你的大脑灰质细胞(指脑力)的负担。
将系统“分解”,是为了使之易于理解。
进行审查、评审和测试正是 为了减少人为失误。
将子程序编写得短小,以减轻大脑负荷。
基于问题而不是底层实现细节来编程,从而减少工作量。
通过各种各样的规范,将思路从相对繁琐的编程事物中解放出来。
你也许会觉得开发更高的智力方是正途,所以无需这些编程拐棍;你也可能对利用这些智力拐棍的程序员不屑一顾。然而实际上,研究表名谦虚的程序员善于弥补其不足之处,所编写的代码让自己和其他人都易看懂,其中的错误也较少。满是错误和延误的开发过程才是邪门歪道。
在开发工程中建立自我意识 你越了解软件开发过程,无论通过阅读还是通过自己对软件开发的观察,你就越能理解变化,使团队朝着正确的方向发展。
试验 对编程和开发环境做试验,是学习编程的有效途径之一。
阅读解决问题的有关方法。解决问题是软件创作过程中的核心行为
在行动之前做好分析和计划
学习成功项目的开发经验 学习编程的一个特别好的途径就是研究高手的程序。
阅读文档
阅读其他书本期刊如果每两个月能看一本计算机好书,大约每周35页,过不了多久,你就能把握本行业的脉搏,并脱颖而出。
同专业人士交往
和希望提高其软件开发技能的人为伍。参加某个交流会,加入某个用户群,或者参与网上讨论。
向专业开发看齐 好的程序员总是不断寻找机会来提高自己。
下面是我公司等多家企业采用的专业开发阶梯。
第一级:入门级 入门者会利用某语言的基本功能,能够给编写类、子程序、循环和条件语句,会使用语言的许多特性。
第二级:中级 中级程序员已经度过入门期,能够利用多种语言的基本功能,并会得心应手地使用至少一种语言。
第三级:熟练级 熟练级的程序员对语言或环境(或两者兼具)有着专业技能。这一级的程序员也许精通J2EE的盘根错节,或者对《Annotated C++ Reference Manual》如数家珍。这些程序员都是所在公司的活宝,很多程序员再也不能超越该层次。
第四级:技术带头人 技术带头人具有第三季的专业才学,并明白汇编工作中只有15%用来和计算机交互,其余都是与人打交道的。程序员一般只花30%的时间单独工作,与计算机交互的时间则更少。技术带头人会为人写代码,而非机器。真正高手所写的代码,像水晶一样晶莹剔透,还配有文档。他们可不会浪费其宝贵的脑力,去重新组织去重新组织一句注释就能说清楚的某块代码逻辑。
编程生涯成熟的部分标志就是发展处一种不屈不挠的诚实感。通常表现为一下几个方面不是高手时不假装是高手
乐于承认错误
力图理解编译器的警告,而非弃之不理。
透彻理解自己的程序,而不要只是编译看看能否运行。
提供实际的状况报告。
提供现实的进度方案,在上司面前坚持自己的意见。
状态报告也是个令人反感的领域。如果程序员声称项目“已经完成了90%”,而实际进度还有50%,那么他们就会声名狼藉。如果问题在于你对自己的进度缺乏感觉,那么可以通过加强对工作的了解来解决。但如果是为了取悦上司而不说出想说的话,性质就完全不同了。上司通常愿意得到对项目状态的真实汇报,即使那可能并非他们想听到的内容。入股欧尼的汇报经过深思熟虑,应尽量冷静地在私下说出来。管理这需要准确的信息,以便协助调开发活动,充分地配合是必要的。
与不准确的状态报告相关的问题是不准确的估计。典型情况是这样:经理要Bert算算开发某个新的数据库产品需要投入多少人力。Bert和几个程序员碰一下,算了几个数,认为需要8个程序员花6个月时间。经理说:“这可不行,能否少用几个程序员花更短时间搞定?”Bert想了想,决定取消培训时间和假期,再让大家稍微加点班来实现这个目标。于是他估计需要6个程序员,4个月的时间。经理说:“很好,这是个优先级较低的项目,所以尽量准时完成,不要拖延,因为预算不允许。”
Bert错在他未意识到评估是无法协商的。他可以让估计更准确,但和上司商量并不会改变开发软件项目所需要的时间。IBM公司的Bill Weimer说:“我们发现,技术人员大都能很好地估计项目需求和进度。但问题是他们不会坚持自己的决定,需要学习如何坚守其立场。”Bert许诺在4个月完成项目却花了6个月,肯定不会让上司高兴。拖鞋让他失去信用,而坚持自己的估计会赢得尊敬。
如果上司施压让你改变估计,你应明白是他最终决定要不要做这个项目,你可以说:“瞧, 该项目的费用就这么多。我不能说这对公司是否值得,因为是你说了算。但我可以告诉你开发软件需要的时间,这是我份内的事。我无法跟你‘商量’该项目该花多少时间,就跟不能商量确定一英里有几码一样,自然规律是不能商量的。不过,我们可以协商影响项目进度的其他方面,重新评估进度。我们可以少一些特性,降低性能,分阶段开发项目,少些人担任但时间延长一些,或者多些人手时间短些。”
真正优秀的程序员知道怎样同别人融洽地工作和娱乐。代码便于看懂是对团队成员的要求之一。计算机可能和别人一样频繁地读你的代码,但是它读质量差的程序可比人强多了。作为一项可读性原则,应该把修改你代码的人记在心上。编程首先是与人交流,其次才是与计算机交流。
精致的程序作品也要求许多约束。如果编程之前不分析需求也不设计,编写代码的过程中你会发现要了解许多东西。你的工作成果与其说是艺术品,不如说是幼儿画。
偷懒表现在一下方面
拖延不喜欢的任务。(“实在懒”)
迅速做完不喜欢的任务,以摆脱之。(“开明懒”)
编写某个工具来完成不喜欢的任务,以便再也不用作这样的事情了。(“一劳永逸”)
在你不通过有色玻璃看问题时,你就看到了懒惰的另一面。“硬干”或者“苦干”并没有带着光环。“硬干”是中徒劳的,大可不必的努力,只会说明你急切但并不是在完成工作。人们容易混淆行动与进展,混淆忙碌与多产。有效编程中最重要的工作是思考,而人思考时通常不会看上去很忙。如果和我共事的程序员总是忙个不停,我会认为他并非优秀的程序员,因为他没用最有价值的工具——自己的脑袋。
“硬干”并不是在生活的其他方面备受推崇,而在软件开发中失灵的唯一性格因素
Persistence 坚持
根据环境的不同,坚持可能是财富,也可以是负担。多数时候软件开发中的坚持其实就是没有好处的“固执”。当在某段新代码上卡壳时,坚持很难让人称道。不妨另辟蹊径,尝试重新设计类,或者绕过去,以后回头再试。当一种办法行不通时,正好可以换个办法试试。
知道何时放弃很难,但这是必须面对的问题。当你遭受挫折时,提出此问题正式时候。提出并不是说这时就放弃,而是该为目前的行为设置底牌了:“要是这种方法三十分钟之内还不解决问题,我就会花十分钟想其他办法,再用一个钟头尝试最可行的办法。”
Experience 经验
与其他行业相比,软件行业的经验比书本知识价值要小,这有几个原因:在其他许多行业里,基础知识变化得很慢。即使晚你10年毕业的人,他所学的基础知识还和你那时学的一模一样;而软件开发,即使基础知识也变化很快,晚于你10年毕业的人所学的有效编程技术,其数量可能是你的两倍。一些老的程序员往往被看做另类,不仅因为从未接触某些专项技术,还因为他们没有用过从学校毕业后出名的编程概念。
在其他行业中,今天工作中的收获很可能有助于明天的工作;在软件行业中,如果不改掉使用先前编程语言时的思维模式,或者不放弃在旧机器上能用的代码性能优化技术,你的经验将不如没有好。很多软件开发者花时间去准备应付上一次战争,却不花时间去准备下一次战争。如果你不能与时俱进,经验不但不会有所帮助,反而是个累赘。
抛开软件开发中的迅速变化不谈,人们还常常依据经验得出错误结论。要客观评价自己的人生很难。忽略经验中的一些关键因素与否,你可能会得出迥然不同的结论。读读其他程序员的研究材料是有好处的,因为这些材料展示了其他人的经验——它们都是经过充分的提炼,可供你客观地检验。
人们还荒唐地强调程序员有多少经验。“我们需要有五年以上C语言编程经验的程序员”就是愚蠢的说法。如果程序员过了前一两年还没有学好C语言,那么再加三年也没有意义。这种“经验”和工作效能关系不大。
Gonzo Programming 编程狂人
彻夜编程让你感觉像是世界上最好的程序员,却要花几个星期去纠正你在短暂辉煌时埋下的错误。可以热爱编程,但热情不能代替熟练的能力,请想明白什么更重要。
程序开发中的信息快速更新,导致“经验”也跟着高速变化。在很多行业中,有成就的专业人士可以度假、休息、尽享成功带来的荣誉;而在软件开发行业,任何人放松下来就很快跟不上形势。为了让自己仍然有用,你必须紧跟潮流。对于求知欲强的年轻程序员来说,这会是他们的优势;而老程序员常常自认为有资历,讨厌年复一年地证明自己的能力。
最后一个问题是:如果你工作10年,你会得到10年经验还是1年经验的10次重复?必须检讨自己的行为,才能获得真正的经验。只有坚持不懈地学习,才能获取经验;如果不这样做,就无法得到经验,无论你工作多少年。
比尔.盖茨说,任何日后出色的程序员前几年就做得很好,从那以后,程序员好坏就定型了。在搞编程颇有些年头后,很难会突然说“怎样才能使这个循环再快些?”或者“如何让这段代码更好看懂呢?”优秀的程序员早就养成了这些习惯。
初涉某事时,就应端正态度来学。开始做事情时,你还会积极思考,轻松决定做得好坏。干了一段时间后,就会习以为常,“习惯的力量”开始起作用。请确保这些习惯是你所希望的东西。
如果没有养成最有效的习惯,该怎么办呢?如何改掉坏习惯?如果有明确的答案,我就能在夜晚的电视节目上兜售自助录影带了。不过我有少许答案——不能用“没有习惯”来代替“坏习惯”——这就是人们骤然停止抽烟、停止咒骂或者停止多食时会很难受的原因,除非有了替代方法,如嚼口香糖。以新习惯来代替老习惯,要比干脆戒除老习惯容易。对于编码,要试着养成有用的新习惯。举个例子,要培养先以伪代码编写类再改用实际代码,以及编译前认证检查代码的习惯。不必为失去坏习惯而多虑,有了新习惯,坏习惯自然就会消失。
人的个性对其编程能力有直接影响。
最有关系的性格为:谦虚、求知欲、诚实、创造性和纪律,以及高明的偷懒。
程序员高手的性格与天分无关,而任何事都与个人发展相关。
出乎意料的是,小聪明、经验、坚持和疯狂既有助也有害。
很多程序员不愿主动吸收新知识和技术,只依靠工作时偶尔接触新的信息。如果你能抽出少量时间阅读和学习编程知识,要不了多久就能鹤立鸡群。
好性格与培养正确的习惯关系甚大。要成为杰出的程序员,先要养成良好习惯,其他自然水到渠成。