一篇关于程序员性格的文章(…

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

    每个领域的工程人员都知道工具和他们所用材料的局限性。如果你是一位电机工程师,你就应明白各种材料的导电性和使用电压表的各种方法。如果你是一位建筑师,你就应明白木材、混凝土、钢材的性能。而如果你是一位软件工程师,你的基本建筑材料是人的聪明才智,并且你的主要工具是你自己。建筑师是将建筑物结构进行详细的设计,然后将设计蓝图交给其它人去建造,而你则是一旦当你从细节上对软件作出设计后,软件生成过程也就结束了。

编程的整个工作就如建造空中楼阁一样——它并不是纯粹的人工活动。于是,当软件工程师研究工具和材料的必需性时,他们发现自己正在研究人的智力、性格,不像木材、混凝土和钢材等可见的东西。

个人性格是否和本书的主题无关

编程工作极强的内部特点使得个人特点异常重要,你想想一天全神贯注地工作八小时有多么困难,你可能有过由于精力过分集中而今天无精打采的体验。或由于上个月过分投入而本月没有一点精神,你也可能在某一天从上午8点工作到下午2点,以致于精神快要坍塌了。有时你从下午2点拼命于到5点,然后花费一周的时间修改你在其间所写的东西。
    人们难以对编程工作进行检查,因为没有人知道你真正干些什么,我们经常有过这样的体验,我们花费8O%的时间进行我们所感兴趣的20%的工作,同时花费2O%的时间生成其余80%的程序。

    你的老板并不能强迫你成为一个好的程序员,甚至过了很长一段时间你的老板也无法判断你是否是一个称职的程序员,如果你想成为一个高手,你得全靠你自己下功夫。它和你个人性格有关。

    一旦你自己决定成为一个高级程序员,你发展的潜力是很大的,各种研究发现,创建一个程序所需的时间比可达到10:1,同时也发现调试一个程序的时间,程序实现长度、速度、错误率和所发现错误数对不同的程序员其差别可达10:1。

你无法改变自己的聪明程度,但是你可在一定程度上改变自己的性格,已发现在程序员成为高级程序员的过程,性格是更有决定意义的因素。

聪明和谦虚

    聪明看起来似乎不是个人性格的一个贡献。它也的确不是。恰巧的是,好的智力是和成为一个好的程序员有着并不严密关系的因素。

    为什么?难道这并不要求你有一个好的智力吗?

    不,你不需这样,没有人真正同计算机一样迅速敏捷。完全理解一个一般的程序需要你有吸收细节的很强的能力,并能同时理解所有细节,你很好地利用你的聪明要比你有多聪明更为重要。

    在 1972年,Edsger Dijkstra发表一篇论文,名字叫作“谦虚的程序员”。他在此文中主张所有的程序员都应尽力弥补他们很有限制的智力。那些最精通编程序的人往往是那些认为自己的头脑是多么有限的人,他们是谦虚的。而那些最为糟糕的程序员往往是那些拒绝承认自己的能力不适应工作任务的程序员。他们的自我妨碍自己成为优秀程序员,你学到越多的东西来弥补你的大脑,你就越能成为一个好的程序员,你越谦虚,你取得的进步也就越快。

    许多良好的编程风格的目的是减少你大脑的负担,以下是一些例子:

Ÿ                          “分解”一个系统的目的是为了使其更为简单易懂。人们往往易于理解几条简单的信息而不是一条复杂的信息。所有软件设计方法的目的是将复杂的问题分解为简单的几部分,不论你是否使用结构化、自顶向下或是面向对象的设计,以上目标都相同。

Ÿ                          进行评审、检查和测试是弥补人的错误的一种方法,评审方法部份源于“无错编程”,如果你没有任何错误,你就用不看评审你的软件,但是当你知道自己的能力是有限时,你就应和别人讨论以提高你的软件质量。

Ÿ                          将子程序编短一些有助于减少你的工作量。你根据问题而不是计算机科学术语编写程序并使用尽可能高级的抽象思维,有助于减少你的工作量。

Ÿ                          使用各种交谈方式可将你从编程的死胡同中解放出来。

你也许认为靠聪明能更好地开发人的智力活动,所以你无需这些帮助。你也可能认为使用智力帮助的程序员是走弯路。实际上,研究表明,那些使用各种方式弥补其错误的谦虚的程序员们所编写的程序,既易为自己也易为别人所理解,并且其程序中所含错误也少。实际的弯路是出现错误和影响进度的路。

好奇心

一旦你认为自己理解程序的能力是有限的,而且你意识到,进行有效的编程是补偿自己能力的方法时,你就开始了你生涯中漫长的探索过程。

在变成高级程序员的过程中,对技术的好奇心是很重要的。有关的技术信息变化迅速。许多PC程序员没有在什么机器上编过程,而许多程序员还没有用过电脑的穿孔卡片。技术环境的特定特征每隔5到10年就发生变化。如果你跟不上这种变化,你将面临落伍的威胁。

    程序员往往很忙碌,以致于他们没有时间对更好地工作或对工作发生兴趣。如果你真是这样,你也不必在意大多,因为许多人都同你一样,以下是一些培养你的好奇心的方法,你真应该好好学一学它。

    在开发过程中建立自我意识。你对开发过程越了解,不管你是通过对开发过程的阅读或自己的观察得来的,你就越能了解各种修改,并使你所在开发组向一个更好的方向前进。如果分配你的工作任务很少而不能提高你的技能,你也应对此满足。如果正在开发有良好市场前景的软件,你所学的一半知识将会在今后三年内过时,如果你不再学习新知识,你将会落伍。

在1988到200O年中,美国平均工作人数可增加11%到 19%,计算机系统分析员可增长53%。程序员可增长48%,计算机操作员可增长29%——在现有的1,237,000份工作的基础上再增加 556,000份新工作。如果你在工作中学不到什么,你可试着找一份新工作。

    实验。了解编程的一个有效途径是对编程和开发过程进行实验,如果你对所用语言的工作过程不甚了解,你可编写一个短程序以检查此特征并看其是如何工作的,你可在调试器中观看程序的执行。用一个短程序而不是一个不甚了解的大程序来测试一个概念是很好的。

    如果短程序的运算表明程序运行结果并不是你所期望的,这时你应怎么办?这正是你所需要的,最好用一个短程序在有效编程的一个关键方法上迅速制造错误,每次你可从中有所收益,制造错误并不是罪过,没有从中学到什么才是罪过。

    阅读解决问题的有关方法。解决问题是软件开发中的一个重要活动,Herbert Simon曾报道过人工解决问题的一系列例子。他们发现人们自己通常不能发现解决问题的方法,即使这种方法很容易学到。这意味着即使你想自己创造车轮,你也不能指望成功,你可能设计出方车轮。

    在你行动之前进行分析和计划。你将会发现在分析和行动之前存在着矛盾,有时你不得不放弃的数据和行动,对大多数程序员来说,问题并不在于过分分析和过分使用。

    学习成功项目的开发经验。学习编程的一种非常好的方法是向一些优秀程序员学习。Jon Bentley认为你应静心坐下来,准备一杯白兰地,一枝好雪茄烟,然后如同读小说一样阅读程序。实际上可能并不是这样,许多人往往不愿牺牲其休息时间来阅读——500页的源程序,但是许多人往往乐意研究一个高级程序的设计,并有选择地研究一些具体细节。

    软件工程领域很少利用过去成功或失败的例子。如果你对建筑学有所兴趣,你可能会研究Louis Sullivan,Frank Lloyd Wright和 I.M.Pei的设计图,你也可能会参观他们的建筑物,如果你对结构工程有兴趣,你可以研究 Broolyn大桥,Tacoma Narrows大桥以及其它混凝土、钢铁和木材建筑,你应研究你所在领域中成功或失败的例子。

    Thomas Kuhn指出,任何成熟的科学,实际上是通过解决问题而发展起来的,而这些问题通常被看作本领域良好工作的例子,并且可用作将来进行工作的例子。软件工程是刚入成熟阶

段的一门科学,在1990年,计算机科学和技术委员会曾指出,在软件工程领域很少有对成功和失败的例子进行研究的文件,在1992年3月的“ACM通信”中有一篇文章主张对别人编程中出现的问题进行研究,总之,学习别人的编程是有重要意义的。

    其中一个最受欢迎的栏目是“编程拾萃”,它专门研究编程过程中出现的问题,这对于我们是有启发的。

    你可能有或没有一本研究编程的书,但是你可阅读高级程序员所编写的代码,阅读你所尊敬的程序员的代码,或阅读你并不喜欢的程序员的代码,再将他们的代码和你自己的代码比较。它们之间有何异同?为什么会有差异?哪一个更好?为什么?

    除了阅读他人的代码之外,你也应让其它高水平程序员评价你的代码质量,找一些较高水平的程序员评论你的代码,从他们评论中,你可剔除那些带个人色彩的东西而着重于那些重要的东西。这样可提高你的编程质量。

    阅读手册。手册恐惧症在程序员中很流行。一般来说,手册的编写和组织都不好,但是程序员对手册的恐惧也和他们对书本的过分恐惧有很大关系。手册含有一些重要的东西。所以花费时间阅读手册是值得的,忽视手册中的信息正如忽视一些常见的首字母简略词。

    现代语言产品一般都带有大量程序库,这时,你花费时间查阅参考手册是值得的,通常提供语言产品的公司,已经编写了许多你可以调用的子程序。如果是这样,你应弄懂有关手册,每隔一段时间阅读一下手册。

    阅读有关书籍和期刊。你应为自己阅读本书感到幸运。你已经学到了软件工程的许多知识,因为一本书每年都要被许多程序员所阅读,读一些东西可能使你的专业知识向前迈进一步,如果你每二个月阅读一本好的计算机书籍,你的知识将会大大提高并能在同行中脱颖而出。

诚 

    编程生涯成熟的部分标志是不折不挠地坚持诚实,诚实通常表现在以下几个方面:

Ÿ                          不假装你是一个编程能手

Ÿ                          乐于承认自己的错误

Ÿ                          力图理解编译器警告信息而不是对其置之不理

Ÿ                          对你的程序有一个清晰的了解,而不是进行编译看其是否有错

Ÿ                          提供实际状态报告

Ÿ                          提供实际方案评估,在你的上司面前坚持自己的意见

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

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

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

会将错误归咎于她。

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

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

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

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

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

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

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

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值