• 第33章个人性格(代码大全5)


    第33章 Personal Character 个人性格
    33.1 Isn't Personal Character Off The Topic  个人性格是否和本书话题无关

      编程过程非常耗用脑力,这种特性使得个人性格显得很重要。编程工作本质上是项无法监督的工作,因为没人真正清楚你正在做什么。我们都经常有这样的经历——耗用80%的时间着力于项目的个别地方,而花费20%的时间来完成其余80%的工作
      老板无法强迫你成为好的程序员,很多时候他甚至无法判断是否合格。如果你想有所成就,只能全凭自己,这涉及到你的个人性格。
      一旦决心成为出色的程序员,你的发展潜力是很大的。各种研究发现,不同程序员创建某个程序所需的时间差可达10:1,同时还发现不同程序员调试程序所需的时间、程序实现规模、速度、错误率和检查出的错误数目也能达到10:1。
      你无法提升自己的聪明程度,但性格在一定程度上能够改进。事实证明个人性格对于造就出程序员高手更具有决定性意义

    33.2 Intelligence and Humility 聪明和谦虚

      聪明不像是个人性格的一个 方面,也确实不是。碰巧的是,高智商与优秀程序员之间并无太紧密的联系。
      什么?难道不需要智商很高吗?
      对,是不需要。没人能同计算机那样迅速敏捷。要充分理解一个普通的程序,你得有很强的吸取细节的能力并同时消化它们。如何专注你的聪明才智,比你有多聪明更重要。
      正如第5章“软件构建中的设计”所提到的,Edger Dijkstra在1972年的图灵奖演讲会上宣读了一篇名为《The Humble Programmer》(《谦卑的程序员》)的文章。他认为大部分编程工作都旨在弥补我们有限的智力。精通编程的人是那些了解自己头脑有多大局限性的人,都很谦虚。而那些编程糟糕的人,总是拒绝接受自己脑瓜不能胜任工作的事实,自负使得他们无法成为优秀的程序员。承认自己智力有限并通过学习来弥补,你会成为更好的程序员。你越是谦卑,进步就越快。
    很多好的编程做法都能减轻你的大脑灰质细胞(指脑力)的负担。

      将系统“分解”,是为了使之易于理解。
      进行审查、评审和测试正是 为了减少人为失误。
      将子程序编写得短小,以减轻大脑负荷。
      基于问题而不是底层实现细节来编程,从而减少工作量。
      通过各种各样的规范,将思路从相对繁琐的编程事物中解放出来。
      你也许会觉得开发更高的智力方是正途,所以无需这些编程拐棍;你也可能对利用这些智力拐棍的程序员不屑一顾。然而实际上,研究表名谦虚的程序员善于弥补其不足之处,所编写的代码让自己和其他人都易看懂,其中的错误也较少。满是错误和延误的开发过程才是邪门歪道。

    33.3 Curiosity 求知欲

      在开发工程中建立自我意识 你越了解软件开发过程,无论通过阅读还是通过自己对软件开发的观察,你就越能理解变化,使团队朝着正确的方向发展。

      试验 对编程和开发环境做试验,是学习编程的有效途径之一。

      阅读解决问题的有关方法。解决问题是软件创作过程中的核心行为

      在行动之前做好分析和计划

      学习成功项目的开发经验 学习编程的一个特别好的途径就是研究高手的程序。
      阅读文档
      阅读其他书本期刊如果每两个月能看一本计算机好书,大约每周35页,过不了多久,你就能把握本行业的脉搏,并脱颖而出。

      同专业人士交往
      和希望提高其软件开发技能的人为伍。参加某个交流会,加入某个用户群,或者参与网上讨论。
      向专业开发看齐 好的程序员总是不断寻找机会来提高自己。

      下面是我公司等多家企业采用的专业开发阶梯。

      第一级:入门级 入门者会利用某语言的基本功能,能够给编写类、子程序、循环和条件语句,会使用语言的许多特性。

      第二级:中级 中级程序员已经度过入门期,能够利用多种语言的基本功能,并会得心应手地使用至少一种语言。

      第三级:熟练级 熟练级的程序员对语言或环境(或两者兼具)有着专业技能。这一级的程序员也许精通J2EE的盘根错节,或者对《Annotated C++ Reference Manual》如数家珍。这些程序员都是所在公司的活宝,很多程序员再也不能超越该层次。

      第四级:技术带头人 技术带头人具有第三季的专业才学,并明白汇编工作中只有15%用来和计算机交互,其余都是与人打交道的。程序员一般只花30%的时间单独工作,与计算机交互的时间则更少。技术带头人会为人写代码,而非机器。真正高手所写的代码,像水晶一样晶莹剔透,还配有文档。他们可不会浪费其宝贵的脑力,去重新组织去重新组织一句注释就能说清楚的某块代码逻辑。

    33.4 Intelectual Honesty 诚实

      编程生涯成熟的部分标志就是发展处一种不屈不挠的诚实感。通常表现为一下几个方面不是高手时不假装是高手
      乐于承认错误
      力图理解编译器的警告,而非弃之不理。
      透彻理解自己的程序,而不要只是编译看看能否运行。
      提供实际的状况报告。
      提供现实的进度方案,在上司面前坚持自己的意见。

      状态报告也是个令人反感的领域。如果程序员声称项目“已经完成了90%”,而实际进度还有50%,那么他们就会声名狼藉。如果问题在于你对自己的进度缺乏感觉,那么可以通过加强对工作的了解来解决。但如果是为了取悦上司而不说出想说的话,性质就完全不同了。上司通常愿意得到对项目状态的真实汇报,即使那可能并非他们想听到的内容。入股欧尼的汇报经过深思熟虑,应尽量冷静地在私下说出来。管理这需要准确的信息,以便协助调开发活动,充分地配合是必要的。

      与不准确的状态报告相关的问题是不准确的估计。典型情况是这样:经理要Bert算算开发某个新的数据库产品需要投入多少人力。Bert和几个程序员碰一下,算了几个数,认为需要8个程序员花6个月时间。经理说:“这可不行,能否少用几个程序员花更短时间搞定?”Bert想了想,决定取消培训时间和假期,再让大家稍微加点班来实现这个目标。于是他估计需要6个程序员,4个月的时间。经理说:“很好,这是个优先级较低的项目,所以尽量准时完成,不要拖延,因为预算不允许。”

      Bert错在他未意识到评估是无法协商的。他可以让估计更准确,但和上司商量并不会改变开发软件项目所需要的时间。IBM公司的Bill Weimer说:“我们发现,技术人员大都能很好地估计项目需求和进度。但问题是他们不会坚持自己的决定,需要学习如何坚守其立场。”Bert许诺在4个月完成项目却花了6个月,肯定不会让上司高兴。拖鞋让他失去信用,而坚持自己的估计会赢得尊敬。

      如果上司施压让你改变估计,你应明白是他最终决定要不要做这个项目,你可以说:“瞧, 该项目的费用就这么多。我不能说这对公司是否值得,因为是你说了算。但我可以告诉你开发软件需要的时间,这是我份内的事。我无法跟你‘商量’该项目该花多少时间,就跟不能商量确定一英里有几码一样,自然规律是不能商量的。不过,我们可以协商影响项目进度的其他方面,重新评估进度。我们可以少一些特性,降低性能,分阶段开发项目,少些人担任但时间延长一些,或者多些人手时间短些。”

    33.5 Communication and Cooperation 交流与合作

      真正优秀的程序员知道怎样同别人融洽地工作和娱乐。代码便于看懂是对团队成员的要求之一。计算机可能和别人一样频繁地读你的代码,但是它读质量差的程序可比人强多了。作为一项可读性原则,应该把修改你代码的人记在心上。编程首先是与人交流,其次才是与计算机交流

    33.6 Creativity and Discipline 创造力和纪律

      精致的程序作品也要求许多约束。如果编程之前不分析需求也不设计,编写代码的过程中你会发现要了解许多东西。你的工作成果与其说是艺术品,不如说是幼儿画。

    33.7 Laziness 懒惰

      偷懒表现在一下方面

      拖延不喜欢的任务。(“实在懒”)
      迅速做完不喜欢的任务,以摆脱之。(“开明懒”)
      编写某个工具来完成不喜欢的任务,以便再也不用作这样的事情了。(“一劳永逸”)
      在你不通过有色玻璃看问题时,你就看到了懒惰的另一面。“硬干”或者“苦干”并没有带着光环。“硬干”是中徒劳的,大可不必的努力,只会说明你急切但并不是在完成工作。人们容易混淆行动与进展,混淆忙碌与多产。有效编程中最重要的工作是思考,而人思考时通常不会看上去很忙。如果和我共事的程序员总是忙个不停,我会认为他并非优秀的程序员,因为他没用最有价值的工具——自己的脑袋

    33.8 Characteristics That Don't Matter As Much As You Might Think 不如你想象中那样起作用的性格因素

      “硬干”并不是在生活的其他方面备受推崇,而在软件开发中失灵的唯一性格因素

    Persistence 坚持
      根据环境的不同,坚持可能是财富,也可以是负担。多数时候软件开发中的坚持其实就是没有好处的“固执”。当在某段新代码上卡壳时,坚持很难让人称道。不妨另辟蹊径,尝试重新设计类,或者绕过去,以后回头再试。当一种办法行不通时,正好可以换个办法试试。

      知道何时放弃很难,但这是必须面对的问题。当你遭受挫折时,提出此问题正式时候。提出并不是说这时就放弃,而是该为目前的行为设置底牌了:“要是这种方法三十分钟之内还不解决问题,我就会花十分钟想其他办法,再用一个钟头尝试最可行的办法。
    Experience 经验
      与其他行业相比,软件行业的经验比书本知识价值要小,这有几个原因:在其他许多行业里,基础知识变化得很慢。即使晚你10年毕业的人,他所学的基础知识还和你那时学的一模一样;而软件开发,即使基础知识也变化很快,晚于你10年毕业的人所学的有效编程技术,其数量可能是你的两倍。一些老的程序员往往被看做另类,不仅因为从未接触某些专项技术,还因为他们没有用过从学校毕业后出名的编程概念。

      在其他行业中,今天工作中的收获很可能有助于明天的工作;在软件行业中,如果不改掉使用先前编程语言时的思维模式,或者不放弃在旧机器上能用的代码性能优化技术,你的经验将不如没有好很多软件开发者花时间去准备应付上一次战争,却不花时间去准备下一次战争。如果你不能与时俱进,经验不但不会有所帮助,反而是个累赘

      抛开软件开发中的迅速变化不谈,人们还常常依据经验得出错误结论。要客观评价自己的人生很难。忽略经验中的一些关键因素与否,你可能会得出迥然不同的结论。读读其他程序员的研究材料是有好处的,因为这些材料展示了其他人的经验——它们都是经过充分的提炼,可供你客观地检验。

      人们还荒唐地强调程序员有多少经验。“我们需要有五年以上C语言编程经验的程序员”就是愚蠢的说法。如果程序员过了前一两年还没有学好C语言,那么再加三年也没有意义。这种“经验”和工作效能关系不大。

    Gonzo Programming 编程狂人
      彻夜编程让你感觉像是世界上最好的程序员,却要花几个星期去纠正你在短暂辉煌时埋下的错误。可以热爱编程,但热情不能代替熟练的能力,请想明白什么更重要

      程序开发中的信息快速更新,导致“经验”也跟着高速变化。在很多行业中,有成就的专业人士可以度假、休息、尽享成功带来的荣誉;而在软件开发行业,任何人放松下来就很快跟不上形势。为了让自己仍然有用,你必须紧跟潮流。对于求知欲强的年轻程序员来说,这会是他们的优势;而老程序员常常自认为有资历,讨厌年复一年地证明自己的能力。

      最后一个问题是:如果你工作10年,你会得到10年经验还是1年经验的10次重复?必须检讨自己的行为,才能获得真正的经验。只有坚持不懈地学习,才能获取经验;如果不这样做,就无法得到经验,无论你工作多少年。

    33.9 Habits 习惯

      比尔.盖茨说,任何日后出色的程序员前几年就做得很好,从那以后,程序员好坏就定型了。在搞编程颇有些年头后,很难会突然说“怎样才能使这个循环再快些?”或者“如何让这段代码更好看懂呢?”优秀的程序员早就养成了这些习惯。

      初涉某事时,就应端正态度来学。开始做事情时,你还会积极思考,轻松决定做得好坏。干了一段时间后,就会习以为常,“习惯的力量”开始起作用。请确保这些习惯是你所希望的东西。

      如果没有养成最有效的习惯,该怎么办呢?如何改掉坏习惯?如果有明确的答案,我就能在夜晚的电视节目上兜售自助录影带了。不过我有少许答案——不能用“没有习惯”来代替“坏习惯”——这就是人们骤然停止抽烟、停止咒骂或者停止多食时会很难受的原因,除非有了替代方法,如嚼口香糖。以新习惯来代替老习惯,要比干脆戒除老习惯容易。对于编码,要试着养成有用的新习惯。举个例子,要培养先以伪代码编写类再改用实际代码,以及编译前认证检查代码的习惯。不必为失去坏习惯而多虑,有了新习惯,坏习惯自然就会消失。

    Key Points 要点

      人的个性对其编程能力有直接影响。

      最有关系的性格为:谦虚、求知欲、诚实、创造性和纪律,以及高明的偷懒。

      程序员高手的性格与天分无关,而任何事都与个人发展相关。

      出乎意料的是,小聪明、经验、坚持和疯狂既有助也有害。

      很多程序员不愿主动吸收新知识和技术,只依靠工作时偶尔接触新的信息。如果你能抽出少量时间阅读和学习编程知识,要不了多久就能鹤立鸡群。

      好性格与培养正确的习惯关系甚大。要成为杰出的程序员,先要养成良好习惯,其他自然水到渠成。

    作者:BestNow
    出处:http://www.cnblogs.com/BestNow/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)
    Cogs 376. [IOI2002]任务安排(后效性DP)
    Bzoj 1911: [Apio2010]特别行动队(斜率优化)
    Poj 2018 Best Cow Fences(分数规划+DP&&斜率优化)
    Bzoj 1212: [HNOI2004]L语言(AC自动机+DP)
    ZOJ 3228 Searching the String(AC自动机)
    Bzoj 3172: [Tjoi2013]单词(fail树)
    Hdu 3065 病毒侵袭持续中(AC自动机)
    Hdu 2896 病毒侵袭(AC自动机)
    Bzoj 2599: [IOI2011]Race(点分治)
  • 原文地址:https://www.cnblogs.com/tianxue/p/3937170.html
Copyright © 2020-2023  润新知