论程序员的修养

来源:互联网 发布:ubuntu 桌面图标大小 编辑:程序博客网 时间:2024/05/08 19:11

论程序员的修养
 
   

    通常来说,不管是程序员,还是从事其他任何有职业的劳动者,对个人素质的要求可以分为两个方面:业务能力和品德修养。传统的说法叫德艺双馨,八十年代之前叫又红又专。 较近流行的说法是”德才兼备”或“业务过硬,作风优良。”下面结合一点我个人以往的经验,谈一下程序员在这两个方面的修养问题。 

一、修德。


    何为德?《正韵》曰:“凡言德者,善美、正大、光明、纯懿之称也。”儒家言君子五德,仁、义、礼、智、信。《周易》坤卦《象》曰:“地势坤,君子以厚德载物。”,说明了德在人生和事业中的基础地位。用现代语言来说就是:“立业先立身,做事先做人。” 现在有种倾向就是重才不重德,认为只要有能力,人品如何并不重要。实在是令人不敢苟同。
    一个“德”字,其内涵和外延都十分宽泛,对于一个职业人来说主要是一个职业意识的问题。
    何谓职业意识,我认为包括职业道德和敬业精神。

    职业道德应该比较容易理解,说实话,我所认识的大多数程序员都是单纯好学,勤勤恳恳,乃至任劳任怨的,但是我也见过一些不好的现象和行为,有些甚至突破了道德和法律的底线。涉及到人性和道德的问题,实在是非常复杂,是社会的问题还是基因的问题也搞不清楚,我自忖没有舌灿莲花,令顽石点头的能力,也没打算进行道德说教。我想职业道德就是职业人的一个底线:不能损公肥私,不能损人利己。超越了这个底线就有违职业道德。

    提到敬业精神,给人的感觉就是工作狂,废寝忘食,没命地加班。其实敬业精神就是一种负责任的态度,我把它分为三个层次:
    首先,最基本的要求就是要把自己的工作和任务认真地完成;对于程序员来说就是按照设计要求,遵循规范和标准,按期交付合格的程序。
    其次,更进一步的话,要追求工作质量,力求完美;对于程序员来说就是要不断改善设计,提高性能,优化代码,做到清晰、简洁而优雅。
    最后,要有全局意识,强调整体利益。对于程序员来说,有余力的话应该帮助有需要的同事,须知现在已经不是程序员的个人英雄主义时代,只有团队的成功才能有个人的成功。另外,有好的经验和想法,也不必藏私,可以提出来讨论和推广,以帮助企业改进工作,提高效率。

 

    根据我的观察,现在有些程序员在工作态度上主要有两种毛病:


    一曰急功近利,心浮气躁。
    其实这也不能怪程序员,应该说这是时代之病和社会之病在个体身上的折射,这是个变革和发展的时代,那个传统、厚重、稳定的社会已逐渐消失,理想和激情燃烧的岁月更早已远去,大潮涌动时沉渣泛起,鱼龙混杂中泥沙俱下,作为一个年轻的程序员在这样的社会氛围之中想不焦躁那是需要有“相当”的定力和修为,“一个月工资就这么点儿,房价那么高,啥时候才能买个房,成 个家啊!” “搞技术没有前途,程序员就是吃青春饭,到了三十岁就该考虑出路了。” “李一男二十七岁就当上了华为副总裁,丁磊三十二岁就成了中国首富,我什么时候才能熬出头啊。” 看着浮躁的社会和焦躁的人们,让我想起了前几天在报纸上看到白岩松所引用的一句话:“我知道这是个伟大的时代,但它能不能快点过去。”
    汲汲于利,就不可能沉下心来踏踏实实地工作,只会敷衍塞责,推诿应付。如是,何来实践经验的深切积累。
    虚浮骄躁,就不可能凝下神来深入钻研和学习,只会浅尝辄止,滥竽充数。如是,何来技术能力的扎实提高。
    没有经验和能力的厚积薄发,所期望和追求的一切将永远是镜中花,水中月。


    二曰不思进取,不求甚解。
    一种原因可能是天生懒散;另外一种可能是当前的工作不是自己兴趣之所在;也有可能是客观环境造成的,生活和工作中种种挫折和不得意使人产生虚无感和厌倦感。《周易》乾卦《象》曰:“天行健,君子以自强不息。” 人确实是要有一点自强不息、百折不挠的精神的,特别是在一个竞争激烈的现代社会里,更特别是在一个技术瞬息万变的IT行业尤其是软件行业。人不管从事什么工作,除了挣口饭吃之外,还应该有一种发挥自己才干证明自己能力的欲望,否则不如出家当和尚(或尼姑)算了。借一句周星驰的台词:“人要是没了理想,跟咸鱼有什么分别?”

    不论做什么,心态很重要;做人做事如果能够持一种平和的心态,则对生活大有裨益。平和不意味着不进取,凡事尽力而为,但应该知道人的能力是有局限的,当结果达不到预期时也应该平静接受,这样心智才不易崩溃,行为也不至出现偏差。这也是一种自我保护,是一种可持续发展的策略。

    不健康的心态也可以慢慢纠正,浮躁者需要的是沉静,消沉者需要的是激情;现代之病,可以从传统文化中找到良药,对于前者,我推荐读一读陶渊明、王维、孟浩然的田园诗,以陶冶性情;后者可以读读高适、岑参的边塞诗,岳飞的《满江红》更是常备的提神之作。当然这只是我个人的爱好和建议,仅供参考。

    有句话非常想跟大家分享:“格局决定结局,态度决定高度”
    李敖说陈水扁这个人格局太小,怎么理解?作为一个所谓的总统,家里请的帮佣,工钱也由政府开支;拿假发票、假收据报帐贪污公款;收受贿赂,贪赃枉法;从高捷案、台开案、SOGO礼券案直到国务机要费案,可谓弊案缠身。这就是格局小,也可以理解为人格的猥琐与目光的局促。陈水扁属于有手段而无格局的一类人,这样的人,爬的越高,跌的越重。扯的远了一点,到政治上去了,不过这个案例比较典型。

   “正道直行,胸怀坦荡”,与所有程序员和软件人共勉。

 

二、养才。

    说完了“德”的问题,再来说说“才”的问题,在软件行业,当然是指掌握软件技术的能力。谁的技术能力都不是天生的,而是后天培养的。那么如何提高这个能力呢?

 

2.1 提高技术能力的基本原则和途径:“学习,思考,实践。”
 
    南宋朱熹《论语集注》载曰:“子曰:‘学而不思则罔,思而不学则殆。’不求诸心,故昏而无得。不习其事,故危而不安。程子曰:‘博学、审问、慎思、明辨、笃行五者,废其一,非学也 。’” 这里给我们指出了大概的原则,我把它总结的简练一点,就是:“学习,思考,实践。”

 

2.2 学习的方法:“多看,多读,多讨论,少问。”

    原则当然是重要的,但如果只是给出原则而没有方法指导,就没有可操作性,等于什么也没说。所以我也总结了一点学习的方法。就是:“多看,多读,多讨论,少问。”

 

2.2.1 多看。
    不是多看美眉图片,而是要多看代码。也许也可以叫做“读”代码,但是我认为这一点十分重要,所以起了个名目单独列出来。多看代码对程序员的意义怎么强调都不过分,这是技术和知识积累的主要途径。
    对于所有刚开始学习软件开发的人来说,我的建议都是,从代码开始,最好是不太复杂的示例代码,当然也不能象Hello World!那么简单。你所使用的开发平台提供Demos和Samples是首先必须要看的,比如 Duwamish,PetShop,PetStore等。如果看不懂,恭喜你,赶快翻一下语言参考或帮助文档,你已经上路了。你可以把这看做是技术学习的 XP方法,即一开始就从实践入手,避免啃参考书时被一堆语法概念、定义、规则搞的不辨东西南北。此乃学习掌握软件开发技术的快捷之路。其实这也没什么特别,想想我们上学时是怎么学习语文和英语的,先读课文,碰到生字再查生词表或者词典,没听说过要先把词典都背会了才能去读文章的。
    对于一个高级程序员来说,研究一下优秀的框架和类库的源码(当然是指开源的)应该是一项不可避免的工作。读一堆软件架构、模式、设计之类的书,都不如认真地研究一套源码来得实在。当然我不是说看书不重要,而是说书本上的理论要跟实践结合起来才有意义。研究好的源码,于细节处可以学习其技术手段,于整体上可以思考其设计思想,这个在讨论要善于思考的问题时再展开。最后引用Linus的名言:“Show me the code。”

 

2.2.2 多读。
    多读书。很多程序员宁愿花大量的时间玩游戏,上网聊天看娱乐社会新闻,看体育八卦报纸,也不愿花一点时间来读书,实在是很让人遗憾。软件行业技术发展日新月异,从业人员如逆水行舟,不进则退。作为一个有进取心的程序员,岂能不读书?想读书的话,首先会遇到读什么书的问题,在这里,我可以很肯定的说,有几本书是必读的:《离散数学》、《数据结构与算法》、《操作系统》。科班出身的当然都读过,没读过的你迟早会发现必须去读一下。此外,但凡感兴趣,想学习的软件技术,都可以买书来看,有条件的话最好是请有经验的前辈高人开个书单,一般教授带研究生就是采用这种形式。另外多留意杂志上书评或好书推荐之类的。也可以在网上了解相关书籍信息。之所以说这些,意思是虽然鼓励多读书,但还是有个选择与鉴别的问题,作为程序员有两类书是要回避的:一种是学究面孔型,特点是数学公式比文字还多,文字也不易明白,让人误以为错拿了一本高等数学;另一种滥竽充数型,特点是屏幕截图比文字还多,文字也都是废话,让人误以为错拿了一本少儿版看图识字。根据目前的现状,国产作者也有好书,但不多,恐怕还应以引进版的书为主。(想看的书能找到最好,如果找不到的话,在这里私下友情提示一下,有种叫电骡的东东可以下载到很多电子书 ,特别是外文原版的。可能有人要说我不尊重版权了,就不狡辩了,红一下脸,就此打住。)书可以精读也可以泛读,与当前工作和项目紧密相关的书要精读,能够做些读书心得笔记之类就更好了,其它的书可以泛泛而读。除了技术类书籍外,人文类的书也要读一点。读书不要怕贪多嚼不烂,看不懂也不要紧,先哲陶渊明有言:“好读书,不求甚解。” 此其宜也。反正人的脑容量之巨大,就算多塞些书进去,也占不了其万一。书读的多了,忽然有一天融会贯通,豁然开朗,穷宇宙之奥义,明人生之真谛,达到天人合一之境地,固然是非常的可喜,不过如果只是在日常工作实践中,偶尔发现情形竞与书上所言非常契合,再翻开书本回顾一下,又明白了一些道理,再动脑思考一下,知其所以然,欣欣然若有所得,也足以慰怀了。

 

2.2.3 多讨论。
    孔子曰:“三人行,必有我师”。(语出《论语·述而》)讨论是交流思想,切磋技艺,互相学习,共同进步的不二法门;是脑电波碰撞,激荡出灵感火花的科学试验平台;是改进和完善软件设计的重要途径;更是凝聚团队的主要手段。讨论大致有两种形式,一种是与同事工作上的讨论,内容一般与工作和项目密切相关,形式地点都可以不拘,人数以一个开发组内为再,太多了也没有效率和意义,讨论时言辞激烈,情绪激动也不要紧,但是一定注意认真听取和理解别人的观点和意见,且不可油盐不进,固步自封,死钻牛角尖。另一种是网上的讨论,形式可能有社区论坛、新闻组、博客等,网上的讨论就比较五花八门,无奇不有了,自己感兴趣的问题尽可以跟踪和参与,毕竟也是一条学习的途径,但是要有鉴别能力,能够在沙砾之中拣到珍珠。

 

2.2.4 少问。
    这一条主要是对新手说的,上三条相必都令人颔首称是,不过这一条可能很多人不以为然,孔子不是也曾经曰过:”敏而好学,不耻下问”。(语出《论语.公冶长》) 怎么不让人问呢?不是不让问,而是要问的精,问在点子上,就算你能不耻下问,不停地用一些低级白痴问题去烦老鸟,可老鸟是否有足够的耐心和涵养来诲人不倦呢?这一点我是有切身体会的,因为被一些新手问了太多的基本语法问题,有时候真是感觉欲哭无泪。其实这些问题只要自己看一下帮助文档就了然了,可偏偏很多人就是宁愿展现自己的不耻下问精神,也不愿意动一下脑和手。作为一个程序员来说,最基本的能力要求就是要有独立工作和自主学习的能力,别人可以也应该给你提供适当的帮助,但是主要还是要靠你的的自力更生能力。我的经验是,不管老鸟菜鸟,Google或百度一下,问题绝大部分都能够解决;说到这里忽然担心很多程序员做为技术型人才,本来性格就比较内向,不善交流,我这么一说只怕更加重了心理负担,只会闷头捣鼓程序了,其实能够虚心求教是一项优良品质,讨论和交流也是一项基本的能力要求,问题在一个“度”上,所谓过犹不及;所以我建议新手在问问题之前应该先问自己两个问题:一、这真的是一个问题吗?(废话,不过这的确是一个问题) 二、我Google过了吗 ?

 

2.3 思考的方法:分析,归纳。
    程序员要有学习和模仿的能力,但是更要有独立思考的能力,没有独立思考能力的程序员不应该叫程序员,而应该叫Coder(可以译为“代码工人”),有独立思考能力的程序员才叫 Programmer。
    根据我的经验,思考方式大概可以分为两种,一曰分析,二曰归纳,
    分析,就是要多问自己几个Why(为什么)和How(怎么做的),这在阅读和分析源代码的时候特别有用,深入分析和了解别人的源代码是怎么设计和构建的,把握其体系脉络,玩味其技术细节,想一下别人为什么要这么做,是怎么做到的,这样做有什么优点,有没有什么缺点,这样的分析研究虽然有可能导致大脑缺氧,但对自身技术水平的提高是很有帮助的。
    归纳,就是要总结出普遍规律,掌握通用性的解决方案。比如GoF的《设计模式》,就是对一些面向对象设计(OOD)中针对某类特定问题的常用设计的分类归纳和总结。有位前辈将其比喻为围棋中的定式还是比较贴切的,也就是说在特定情况下的最佳解决方案(一定要注意“特定情况” 这四个字)。别人归纳总结好的采取拿来主义就可以了,而自己也要擅长进行总结和归纳,毕竟软件行业有许多不同的领域,关注的问题不尽相同,如果自己从事的领域不是很Popular,就只有靠自己的思考和归纳才能形成本领域特有问题的解决模式和框架。
    思考的分析和归纳法,两者是对立而统一的,一个是研究微观问题,一个研究宏观问题,我们学习和思考时一是要能入乎其中(深入分析);也要能出乎其外(归纳总结),既不能只见树木不见森林,也不能买椟还珠囫囵吞枣。


    分析和归纳的结果,是要建立自己的知识架构。
    何谓知识架构。你可以把知识架构看做是一本书的目录,你不必把整本书看完,只要浏览一下目录就可以大致了解书的内容纲要;你也可以把知识架构看做是图书馆或书店的分类系统,你走进一个图书馆或书店,书籍都是分门别类井然有序地放在书架上,你可以很快地找到你感兴趣的书,如果所有的书都不分青红皂白地堆成一大堆,不难想像,你想找到自己要看的书是多么困难。我们学习和掌握软件知识也是一样,当今时代,是软件知识爆炸的时代,各种技术名词变魔术般不断涌出, OOP,AOP,MDA,MDD,OCP,SRP,DIP,IoC,DBC,ASD,TDD,RUP,PSP,TSP,CMM。 。。这是一个三字经泛滥的时代,可能你闭着眼睛随便在键盘上敲三个字母都碰巧是一个技术名词,如果有人愿意编一本《英文软件技术名词缩略语三字经》的话,想必是洋洋洒洒,蔚为可观。作为一个软件行业从业人员,如果脑袋里有一个知识架构,就象有了分类排好的书架,不管什么三字经蹦出来,拿过来一看,了解了内容,贴上分类标签,往它该呆的书架上一塞,OK,诸神归位,整个世界都清静了。大家应该感到幸运的是,这样的知识架构有现成的,有兴趣的可以参考一下 SWEBOK,当然以SWEBOK上面那棵软件知识架构树的庞大,作为一个正常人来说是不太可能全部都了解和掌握的,一般来说根据自己的情况剪裁个一枝两枝的就差不多了。另外要注意的是这个是普遍意义上的,个人应该根据自己的专业进一步深化细化甚至扩展。 

   

2.4 实践。
    软件科学是一门应用科学,软件行业是最讲究实践的。对于程序员来说这个实践就是写程序,这个就不必多说了,这是程序员吃饭的营生,程序员不写程序,那还是程序员吗?上面的学习和思考,最终都是要落实于实践,即提高写程序的能力,写出质量更高的程序。
    程序实践有两种,一种是自己学习研究用的,属于练笔性质。另一种是真实的软件项目。需要注意的是,自己用来学习和研究的程序,怎么写都无所谓,但是做项目就不一样,做项目时写程序不要热衷于奇技淫巧,不要沉迷于高超的算法和华丽的界面,更不要执著于纯洁的OO概念和生搬硬套设计模式,首先程序是用来运行和做事的,不是用来摆设和唬人的;其次程序代码是用来维护的,不是用来当作达芬奇密码研究的。你写的程序应该象庄稼汉一样纯朴、憨厚和健壮,而不要象城里纨绔子弟一样,油头粉面,外表光鲜而虚浮无用。

     多年来的软件工作经验,近来有些余暇,打算写出来,也算是一个回顾和总结吧。 
原创粉丝点击