第十三章 个人性格
提要:软件开发是一个“以人的智力为加工原料”的工程活动,在开发过程中会不断的对智力和性格作研究。需要注意20/80原则,并不是最勤奋的才是最优秀的。编程的工作难以检查,是否成为高手和个人性格有关。你无法改变智力,但可以改变性格。在软件开发者的成长过程中,EQ还是占主要因素。
1. 聪明和谦逊
一个人越谦虚进步越快,承认自己的无知才会去正视和弥补自己的错误。理解程序需要通常很强的对细节把握和理解能力,这对程序员的智力有很大要求,但是很好的利用聪明要比你到底有多聪明要重要的多。有个程序员需要也需要谦虚,用谦虚去促进自己的智慧,使得自己更加聪明。这是软件开发者的两个基本素质要求,它们互相依赖促进,有时候也互相排斥,把握好自己的才智和谦虚就能更大程度提高能力。
也许某些事情很麻烦和困难,我们这时就需要使用一些方法去聪明的解决它们。比如:采用良好的程序风格便于理解、采用分解的办法使复杂问题简单化、多进行评审和测试,多和别人讨论和关注软件质量问题、尽量使用高度抽象的思维使问题一般化,提高重用率减少工作量、如果问题走进一个“死胡同”不妨和杯咖啡放松情绪,或和别人交谈交流观点,这是解决钻牛角尖的好方法。
2. 好奇心
一旦你认为自己理解程序的能力是有限的,而且你意识到,进行有效编程是补偿自己能力的方法时,你就开始了你职业生涯中漫长的探索过程。对技术的好奇很重要,否则你将在知识爆炸的时代迅速落伍。别在忙碌的工作或琐事中,失去了对学术,自然和生活的好奇心和激情。我们可以在:
1 开发过程中建立自我意识。通过在开发中有意识的可以使用进行新技能的锻炼,多对开发工程进行观察,和学习其他解决方法,这样就对整个项目有很强的把握能力,甚至可以带领整个团队走向更好的方向。如果你现在做的是市场前景很好的工作,那也意味着工作中的某些技术可能会很快被淘汰,注意保持好奇心和创造力。
2 实验。了解编程的一个有效方法就是对编程和开发过程做实验。你可以编写一个程序并观察它是如何工作的,调试器里跟踪程序的执行把握它的特性。用个小程序去检验一个不太了解的概念,这对增进理解有非常大的帮助。或者用一个短程序,去试图制造一些错误,通过错误去学习。错误不是罪过,没有从错误中学到什么那才是罪过。
3 阅读解决问题的有关方法。解决问题是软件开发过程核心的活动。一个奇怪的现象:人们通常不能从自己面临的问题找出解决的方法,即使这个方法很简单。
4 行动前先做好分析和设计。尽管实践和分析设计过程有很大的矛盾,但是好的分析会避免让你过早走向一个错误的方向,好的设计可以避免混乱。
5 学习成功或失败项目的开发经验。学习编程的好方法是向一些优秀的程序员学习。应该要注重项目的战略思想,把握项目中解决关键难点的战术。任何成熟的科学,都是通过解决问题发展起来的。这些问题通常被看一些被良好解决的例子,并可为将来工作做指导。(这可能也是目前很多公司注重工作经验的原因吧?)我们应该努力对别人工作存在的问题做研究,学习别人的无论成败的解决办法都是很有意义的。多拿自己的代码和比你优秀人的代码做比较,看看你们间有什么异同?为什么会有这样的差异?谁的更好?为什么?也要多让自己的代码让别人评价,这样可以提高自己的程序质量。
6 阅读手册,书籍和期刊。手册中往往对带有些可以直接调用的子程序,这对我们研究和解决具体问题有很大帮助。书籍中往往是介绍系统理论,多阅读可以提高专业能力;期刊中常常包含着流行的技术和观点可以开阔眼界。
3. 诚实
编程生涯成熟的部分标志是坚持诚实。通常是:不假装自己是高手、乐于承认错误、尊重编译器的警告、对程序有清晰的了解,而不是编译看其是否有错、提高实际状态报告、提供实际方案评估,在上级面前坚持自己的意见。你最好假装自己知之甚少,听别人的解释,向他们学习,并且评估他们是否了解其正在讨论的东西:)
你应该对自己能力做某种程度评估,认为自己完美是一个不妙的信号。错误正如潮流一样是一个复杂的活动,如果你过去没犯过错误,那么没有人会将错误归咎于你。所以正视自己的错误。当你并不了解程序时,编译运行并不是解决问题的方法。测试是证明错误的存在,而不是保证没有错误。如果不能深入理解程序,就不能深入测试。依据事实给出准确的状态报告,不能欺骗自己和别人,这是充分合作的前提。不能因为压力而否定符合规律的做法——这个项目需要10人月,要用5人月完成除非降低性能或其他做法——准确的向上司说明情况。
4. 交流与合作
真正优秀的程序员应学会怎样和别人工作和娱乐。真正阅读你写出的程序是人,而不是给计算机——注意代码的可读性。绝多数高水平的程序员坚持自己代码的可读性,并抽出充足时间这么做。对程序员能力的界定标准:
1 初学者
是能使用一种语言基本能力的程序员,他能使用子程序、循环、条件语句或其他许多语言特征。
2 中间者
有使用许多语言的能力,并且至少非常熟悉某一种语言。
3 专家
对其语言或环境或这二者有很深的造诣。这种级别的程序员对公司是有价值的,而且有些程序员往往就停留在这个水平上。
4 大师
有着专家那样的专业知识,并且意识到编程只是15%和计算机交流,其余85%是和人打交道。一般程序员只有30%时间或更少。而且大师注重给人看的清晰易懂的代码,并注意建立有关文档。
不强调可读性的高水平代码者可能停留在级别3上面。并且根据经验,编写不可读代码的主要原因是:代码质量差或是编写者自己并不能完整地理解自己的代码。当你知道自己的水平后,不必内疚和自愧。在你知道如何提高水平后,你倒应该为自己停留在初学者或专家水平上有多长时间而内疚。
5. 创造力和纪律
虽然一些有创造力的程序员将各种标准和约定视为对其创造力的阻碍,但是没有这些约束项目实现是不可能的。不要在无关紧要的领域建立约定,应该在值得的地方发挥你的创造力。一个杰出的程序员需要遵守许多规则。如果编码之前不分析需求就设计,那么你就学不到项目的许多东西,那样工作就像小孩画画而不是艺术品。
6. 懒惰
懒惰的三种形式:1 拖延自己讨厌的工作 2 迅速解决讨厌的任务以摆脱任务 3 写一个工具来完成讨厌的工作解脱自己。当你不是透过玻璃看问题的时候,你就看到了懒惰的另一方面。“赶着做”是一种多余和没有必要的“努力”。有效的工作最重要的现象是人们在思考种往往显得冷静而不忙。一个一直很忙碌的程序员不是好程序员,因为他并不是在使用对于他来说最有价值的工具和头脑。
7. 并不是你想象中起作用的性格
坚持:这是一笔财富也是不利的条件。你可以称它为顽固或者坚强,这完全取决于应用它的场合。在多数情况下,软件开发的“坚持”就是顽固的意思!当你遇到新问题时候,你再固执己见并不是好事。你应该迅速适应它,或原方案并不起作用时,学会用另一种解决方法。调试中,当你发现一个困扰你4个小时之久的错误时,你一定感到非常满意。但是实际上,如果你在一段时间——通常为15分钟没有取得任何进展时,你应该放弃找错。用你的潜意识去思考问题,尝试用别的方法解决问题,甚至重写厌烦的代码段。和计算机错误做斗争时不明智的,你应该尽量避免它们。知道在时候需要放弃时困难的,但是必须面对一个问题:当你觉得自己受挫折时,是否考虑尝试其他不同的方法。
经验:过于依赖经验会导致知识的落伍。今天的经验必须为明天的工作服务。如果不在过去经验中去归纳总结出一些有价值的原则或规律并改变自己去适应它们,那么经验也将一文不值。如果你的经验还是停留在上一次战斗而不是下一次,也不因时间做出应变,那么经验更像是一个阻碍。此外,错误的经验往往得不到客观的评价。错误的经验可以让你得出重要的不同结论,学习其他人的错误经验是一个好方法——你更可以对它做客观的检查。其他领域有成功经验的专业人员往往使人放心,而在软件开发中,知识更新迅速使得此领域中“经验”处于一个奇怪的地位。为了使自己有所价值,你必须紧跟潮流,对于年轻求知欲旺盛的程序员在这点有优势,而有些年老的程序员认为自己有所资格而厌倦一年接一年都要证实自己的能力。如果你已工作了10年,你得到了10年的经验未必是真正的经验——你如果坚持不断地学习,你就能得到经验,但如果你并不想学到什么,不管多少年你也学不到什么。
编程狂:如果你还没有至少在一个相同的项目上花费一个月的时间——一天工作 16 个小时;为了发现你的程序中最后一个错误睡眠中你也念念不忘它,你接连几天没日没夜地工作——即使你所编的程序并不复杂,那么你可能不会意识到编程中有某种令人兴奋的东西。 Edward Yourdon
这种对编程的痴迷纯粹是胡闹,并且几乎注定要失败。但是那些通宵程序员使你觉得他们是世界上最好的程序员,但是随后你不得不花费几周的时间来修正你在这短时间的辉煌中所带来的错误,你可能对编程非常热爱,但是你应能冷静地处理这个问题。
8. 习惯
好的习惯起作用是由于你为一个程序员所作的大部分事情是你在无意识中所完成的。成为某方面好的或差的程序员,主要是靠你自己的所作所为。你所作所为习惯,决定了你的编程品行。最终,你的习惯好坏决定了你是否能成为一位好的程序员。当你开始学习某一件事时,你应按正确的方式学好它。当你开始学时,你已对其进行了思考,并且你可在正确或错误的途径间作出轻易的选择。在你作过一段时间后,你对你所作的不太注意,此时“习惯的力量”会开始起作用。确保起作用的习惯是你所希望的。
小节
?? 你的个人性格直接影响你编写计算机程序的能力。
?? 最有明显作用的性格为:谦虚、好奇心、诚实、创造性和纪律,还有文明的“懒惰”。
?? 高级程序员的发展和生成与天才并无多大联系,任何事情都和个人的发展有关。
?? 令人吃惊的是,小聪明、经验、坚持和欲望既可帮助你也能妨碍你。
?? 许多程序员不主动去吸收新信息和新技术,而是靠偶然地上获得一些新信息,如果你
抽出少量时间学习别人的编程经验,过一段时间后,你将在你的同行中脱颖而出。
?? 好的性格对养成良好习惯有很大影响。为了成为一位高水平的程序员,你应养成良好
的习惯,其余的就会随之而来。