什么是程序员的优良品质
一个好的程序员,好在哪里?我觉得并不是人品问题,而是世界观的问题,拥有怎样的世界观,是有利程序开发的,这就是本文要分析的。
一、伟大的学习观:
我发现有几种学习观是没有意义的,比如努力学习,勤奋学习,因为很多人很努力,成绩却不怎么样。学习单靠努力是不行的,学习应该有方法,而方法可能有多种多样,所以很难通用。普天之下行之有效的学习观是否存在?最近,我发现了一种。这要从一个疑问句开始:为什么同样的东西,有的人学的结果是这样,另外一些人学的结果就是那样?学习这个东西,并不是简单罗列在我们面前的,要想学到东西,就要深入。同样是一本教程,有些人可以深入进去,不但学到流于表面的内容,还能发现和扩展深层的内涵。虽然我不敢说,一个学习对象是可以无穷无尽的发掘的,但是我从来没有感觉到自己曾经是能够完全的发掘到一个学习对象的所有内涵的。古人说:学海无涯,这个内涵比我们想象中的要宏大,可以说:学习是永无止尽的。学生一般很喜欢声称自己学完了,做完了,这不过是他们没有意识到学习这两个字有无穷尽的含义。
一个伟大的学习观,就是能帮助大家高效学习的,而我认为:学海无涯这个学习观就是能有效的改进各位的学习效率。知识的海洋是很广阔的,大家都喜欢在水面漂浮,这样涉猎的知识面虽然很广,但是价值很低,更有性价比的学习方式是深入。如果水面有一亿人,水下2米就只剩下1百万人。这是一点,另外一点是只有沉下水底你才能看到完整的知识体系,你才能理清脉络。世界上控件有几千万种,但是支持其运作的基本构造也只有数十条,你说是掌握所有的控件容易,还是掌握其基本结构容易?
我们处于知识爆炸的时代,你找一本算法书,它能罗列出三千中算法,你一天学一种,也要学个十年八载。而且就算你学成后,人家让你写个快速查找你也写得艰难,因为你根本没有深入的去理解其中一个算法的内涵。在这种背景下,我们更需要懂得不被罗列的知识给埋没,能够安于一室,学会品味,学会慢下来。面对23种设计模式,数十种数据结构,数百种算法,数千种类库,数万种api,你能够保持内心的平静吗?这就是我要告诫你的。
二、伟大的偏执狂:
偏执是一个贬义词,社会追求和谐,似乎什么都可以宽容,但是程序员不应该宽容。因为计算机从来不懂得宽容。错就是错,对就是对,不管你人品多高,行为多高尚,多么值得可怜同情,有一万条犯错的理由,计算机从来不给你留一丝情面。最近动车信号问题,然后地铁信号问题,这些错误会因为害死多少人就不发生么?写程序,第一要务就是消除模菱两可,消除不清不白的地方。
写程序,经常会灵光一闪就通过测试,而你不知道为什么就能运行了。这个是程序员的最大悲哀。如果你写的程序,老是要不断地调试,不断地修改,才能最终运行,你就要警告自己,是不是靠运气来编程。靠运气总是走不远的。虽然现代的高级程序员不爱这一套,但是我认为写伪代码还是很有帮助的,伪代码能够弥补各位对编程语言掌握的不足,可以有效地梳理自己的思路。因此我建议,写程序的时候,先写伪代码,用中文去写,每一个过程的大纲写清楚之后,就再细化,把一些思维的死角给找出来。有时候你觉得自己能够做,但是实际做的时候就发现有两三个技术无法实现。
在我们写代码的时候,为什么会出现写完代码,但是却没有自信它是否能够通过测试的情况呢?在于我们没有建立起一套清晰简明的逻辑推理和相关结构。最简单的逻辑推理就是基于前提得出结论的结构,这个可以帮助我们检测函数的参数等,参数范围不对,函数的结果自然不应该期望能够正确(虽然可能靠运气蒙对),而参数在我们考虑的范围内,我们自然就有自信确信函数的结果是正确的。第二个,对于循环结构,也有一套逻辑结构在里面,找出循环不变量,找出固定的东西,不要被变化所迷惑。写代码,如果能够基于逻辑的结构,自然就能得到令自己信服的答案。
编程经常需要界定的是范围,是大于还是大于等于,还是等于,还是不等于,还是小于等于,是从0开始还是从1开始,从length结束还是从length-1结束,这个时候如果没有建立清晰的认知,就往往靠运气来编程。有些人对数学比较敏感,有些就不是很敏感,这些边界就是需要花心思去掌握的。在写伪代码的时候,如果能够同时思考具体的范围,这必然会让整个思路明晰起来。
三、厚着脸皮认错
程序员经常需要请教别人,也乐意去帮助别人,交流中难免会出现这样那样的错误。能够虚心接受错误是很难,但是也是很难得的,如果能够厚着脸皮去认错,这必然会有助自己改正错误,别人也愿意帮助你。
我认识很多初学者,他们很喜欢去挑别人的刺,却总爱维护自己的错误。不认错什么都改变不了,只能让自己继续犯错而已,别人也会因此疏远你。
要认错很难,在于你需要建立一个正确的评价标准。第一标准是基于事实,事实胜于穷辩。有些时候事实看不到很清楚,这个时候就需要先梳理一下别人的观点,看看是否有逻辑错误,如果他逻辑有问题,结论自然靠不住(虽然结论可能反而是正确),如果别人逻辑很清晰很明了,这个时候就应该谨慎的去考虑接受别人的观点。
如果事情比这个还要复杂,你分不清楚谁对谁错,因为大家的逻辑似乎都靠得住,那就要分清楚,双方是站在那个立场,从哪个角度去阐述问题的。
匆匆否定对方是对自己无益的,因为这样你就不会去思考,如果你能够思考后很明确的很有逻辑的去反对对方的观点,这对你观点本身也是一种加强。
老实说,这个世界上,一个人故意去害另一个人这种事情是很罕见的,人们都是怀着好意给对方建言,只是各人的认识水平,角度有所不同。
四、重视基础
世界上最难的事情是什么?就是提高自己的智力。不管你怎么学习,智力本身都不会有大的变化,你所学的不过是知识,策略,这些让你减少思考的快捷方式。这个基本事实告诉我们什么?就是提高效率需要考虑从非智力因素找解决办法。我认为如果能重视基础,把基础打牢,熟练之后必定会有助效率的提高。不管你做什么,90%以上都是依赖最基础的内容,只有极少部分需要你真正的动脑筋,与其希望自己聪明起来,还不如想办法缩短基础操作的时间。
不可否认,考试经常都是重视智力考核,仿佛编程什么的都是精英,天才才能做的好的事情,难道智力一般的人就无法胜任编程开发了么?
这是一种智力迷信,过于盲目。如果各位能够去除这种迷信,脚踏实地的提高自己的基础能力,相信就是一个最有效的方法。
我的经验是,高手往往都是对基础很重视的,而新手往往对所谓的高级技巧很感兴趣。能够不因为基础很平凡就忽视,这是值得赞赏的。
以上并不足以说明程序员何以优秀,但是相信对各位多少也有点帮助。