`
妖妖然
  • 浏览: 47924 次
  • 性别: Icon_minigender_2
  • 来自: 大连
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

【代码猴子-培养正确的编程态度和方法】--《编程匠艺》

阅读更多
作者在开始讲正文之前先对读者做了一个小测验:换一个灯泡需要多少个程序员?(貌似换灯泡跟程序员关系不大:-)),可能有三种答案:

     1.根本不需要,因为灯泡根本没坏。

     2.仅仅需要一名,但是需要耗费一整夜的时间和大量的咖啡和匹萨。

     3.需要20名,1名解决最初的问题,然后由后面19名解决第1名所带来的一系列糟糕的问题。

     不禁感叹作者专业功底之深厚,用生活中一个简单的问题来说明了软件开发中的一个很深刻的问题:

      软件开发的态度和方法对代码质量有着深刻的影响。

      态度决定一切!!更决定了我们所编写代码的质量,有时有了正确的态度还不够,为了达到编写优秀的代码这个目标,还需要正确的编程方法,二者缺一不可。

接着看软件工厂中各种各样的代码猴子(按照技术,态度,性格等分类):

     1.卖力工作的程序员:

      手脚勤快,一边编码一边思考,一开始有想法就马上开始编写代码,从来不知道先退一步思考思考。常常赶时髦去尝试新的功能或语言习惯,意味着可能在不适当的情况下应用技术。

     优点:
      高产,对编程抱有热情。

     缺点:
      卖力工作的程序员虽然比较有效率,但是应该大部分都是性子比较急的,由于在编写代码之前没有深思熟虑,所以编写的代码缺陷比较多,往往会在调试上花费很大的精力和很多的时间。事情进展的顺利的时候,能够做出合理的情况估计,但是从来不按照计划进行,所用的时间总是比计划时间长。

如果你是其中一员你该怎么办?
不要丢掉自己的热情-这是程序员最好的特点之一,因为自己的乐趣在于:看到程序正常运行,站在一旁欣赏代码的美,所以应该好好想想一些实用的办法来做到这一点,总结为:“停下来,想一想”,不要着急!



      2.代码猴子:

      如果需要无数的代码猴子,那么这些家伙将会成为首选。代码猴子编写的代码很可靠,但是没有创意。他们很乐意接受了一项任务并完成后,静静地等待下一个任务,性格恬静,害怕工作压力,所有只能做些低风险的工作,比如:代码维护员,如果给予一定的时间和精力,初级代码猴子会有一定的提高,但是老的代码猴子就无可救药了。

      优点:
      按时完成工作,而且很不错,与卖力的程序员不同的是,他们的代码质量会比较可靠,能很好的估计时间。

      缺点:
      虽然条理,但是思维局限性强,代码猴子会无条件的遵守项目中的代码设计约定,而不会出任何可能存在的问题,由于他们不对设计负责,所以对一些出现的问题负责,他们不会主动调查和修正这些问题,教他们学习新的东西将会是一件很痛苦的事情。

     如果你是其中一员怎么办?
     是否想探索新的领域,是否想拓宽自己的职责范围?如果是那就通过个人项目的锻炼来强化自己的技巧吧!找些书来,从中学习一些新的技术,用于承担更多的责任,并积极参加到设计工作中去,在当前的工作中采取主动地态度,尽可能早地确定可能失败的地方,并找出避免此类问题的方案,尽管做到这个有时并不那么容易。

   3. 权威:

      程序界的圣贤,通常安静和谦虚,有时比较怪,编写的代码出色,但是却无法与“凡人”沟通。权威会做比较底层的工作,写框架,体系结构和内核。

    优点:
     经验丰富,代码优秀,优秀的权威会是出色的导师,别人会从他那里学到很多的东西。

   缺点:
     能够良好地沟通的权威为数不多,并不总是一言不发,他们的思路跳跃太快,超出了正常人的水平,所以跟上他们的思路会很困难,以至于跟权威对话,会让一般人感觉到沮丧和困惑,感觉自己很愚蠢。

   如果你是其中一员该怎么办?
     走出理想世界,并生活在现实世界中,不要希望所有的人都跟你的思路那样快,为了把简单的问题说清楚,往往要在这方面下些功夫。



   4.半权威:

     自认为是一个天才,其实不是,他们的话听起来像是很有道理的样子,其实是一堆堆垃圾。通常比真正的权威要傲慢,委任自己为权威人士。

    优点:
     自信。

    缺点:
     最大的缺点也是自信,由于自己太过自信,高估自己的能力,会给项目带来意想不到的问题甚至是灾难性的。

   如果你是其中一员怎么办?
     对自己的技术水平给一个中肯的评价,客观地对待自己能做的事情和不能做的事情,多关注自己的代码的质量,而不是放在显示自己有多聪明上。给自己的角色定好位。

   5.傲慢的天才:

     各种权威中数量很少但很重要的一个分支。杀手级程序员,速度快,效率高,他太清楚自己的技术能力了,会有些骄傲,显示出很强的优越感,经常以自己的正确的观点压倒别人的错误意见。如果跟别人发生了技术上的争执,大部分情况下他都是正确的,跟他说话,总会到对他有利为止。

    优点:
     技术领导力强,如果得到团队成员的认可,将对整个团队是一个有利的催化剂。

   缺点:
     天才不喜欢被证明犯了错误,认为自己永远都是对的,不会说:我不知道。不愿意受冷落。

   如果你是其中一员怎么办?
     不要奢望别人像敬奉神一样敬奉你,要做到谦虚地待人处世,尊重别人的意见。

  6.牛仔:

     牛仔会一头扎进代码堆里,以最少的代码解决问题,并不关心是不是一个最好的解决方案,以及是否会损害你的代码结构或是能否满足将来的要求。

    优点:
    他们写的代码可以运行,但不是很优雅,喜欢学习新东西,但很少深入进去。

    缺点:
      你会费很大精力清理牛仔留下的代码,牛仔的代码总是需要在以后进行修复,调整或重新编写,牛仔只会运用有限的技术,往往不具备真正的工程技能。

    如果你是其中一员该怎么办?
    学会正确的快速编写代码,为自己的工作感到骄傲,在上面多花些时间,承认自己的缺点,并试着去改变它。





    7.规划者:

      规划者往往会对自己做的事情想的太多,以至于开始动手写任何代码之前,项目已经过期了。他其实是把设计和编码的界限极端化了,传统瀑布开发过程已经在他的脑子里根根深蒂固了,他会在完成设计前把自己密闭在一个茧子里,于此同时外面的环境在不停地变化着。

   优点:
     会设计,会思考,不会写出没经过深思熟虑的代码。

   缺点:
     很多时候会过度设计,很容易规划处过于复杂的系统。他们的开发精力更多地集中在了方法和建模,而不是基于原型设计和解决方法的创建。他们把大把的时间花在了思考上,而没有放在实践上,他懂得很多,但是没有把这些知识升华为实践。

如果你是其中一员怎么办?
设计很重要,实践也很重要,考虑使用原型开发方法和渐进的开发方法,让你的设想尽早的得到验证。很多问题只要你在诉诸实践的过程中才能深刻认识到。

    8.老前辈:

      老前辈要么对自己从事的职业非常热爱,要么因为错误无数次的升职机会而感到无比懊恼,不再想学习新的技术,他们觉得没有什么有必要再学的了。不愿意学习新的语言,他会说:我不需要C++,C#,只需要汇编就够了。

优点:
     经验丰富,知道如何写出优秀的代码,并知道哪些因素会导致糟糕代码的产生,并知道如何避免。

缺点:
     不愿学习新技术,反感华而不实的时髦的技术,对新事物反应慢,而且有抵触的情绪。没什么耐心,对那些最后期限和不切实际的管理者厌烦透顶。

如果你是其中一员怎么办?
     不要对更年轻的,更富有激情的年轻的程序员要求太过苛刻,你的代码曾经不是那么完美,不是吗?



    9.狂热者:

      狂热者一般都有自己的偶像,充满激情,把自己当做义务的技术传道者。他们崇拜大公司的产品,并试图在分配给自己的任务中使用这些产品。狂热者追随大公司的产品,并且排斥其他的产品,而且不知道其他更好的产品。

优点:
     他对大公司的产品很熟悉,并且使用这些产品做出很高效的设计,也许这不是他最高效率的设计--他不知道的方法或许效率更高一些。

缺点:
     不客观,不实际,他可能会错过其他拥有更好设计的小公司的产品,糟糕的是,他还在一直鼓吹大公司产品的好。

如果你是其中一员怎么办?
要知道,没有人期望你厌恶你所钟爱的大公司的产品,了解他的技术,并了解如何部署,是很有价值的。但不要做技术的盲从者,要接纳不同的方法和新的思维方式,不要用高人一等的眼光来看待他们,也不要有偏见。



    10.单线条程序员:

     很典型的家伙,以技术为生,呼吸的全是技术,技术是他的生命的全部。有着很明显的单线条思维,如果让他把工作带回家,回来的时候,就会设计并编写好整个系统,修正所有的主要bug,并对如何实现项目的其他部分指定了计划,在你吃早饭的时候,他已经完成了所有的工作。

优点:
     专心致志,非常坚定,他将确保整个项目能够正常的运行,否则他将拼命地做出努力;愿意做很多额外的工作,特别是在项目截止日期临近时。

缺点:
     他期望别人也能像他一样一心一意,专心致志,对那些不这样做的人感到反感。最大的问题是他会忽略其他的一些事情,因为他离问题太近了。

如果你是其中一员怎么办?
     开始集邮或者做做其他一些泥喜欢的事情,以帮助你换换脑子,文武之道,一张一弛,但是也许你对别的事情都不感兴趣。



    11.拖沓者

     拖沓者是不愿工作的懒散的人,这种人很难发现,他们已经学会了如何让自己看起来一直是忙碌的;他的“设计”是在电脑上玩游戏,他的“研究”是在网络上看NBA直播,而他的“实现”则是干私活。拖沓者会主动避免分配任何工作任务,因为他太”忙”了。虽然是他看起来一直很忙碌,但分配给他的任务从来不会完成,至少是不会按时完成。

优点:
      至少他不像单线条程序员那样不会找乐子。

缺点:
      拖沓者显然是个负担,但又很难发现他在偷懒--一些困难的问题确实要花费一些时间去解决。但是要警告这些人的是,如果继续这样做下去,无疑是职业自杀,等不了多久你会发现这个城市里已经没有了你的位置(或许有,恐怕到时他们会怨天尤人,后悔莫及)。

如果你是其中一员怎么办?
     要有职业精神,在工作中投入更多的精力吧,要不就学着忍受犯罪感吧。



     12.勉强的团队领导:

     这是一种组织上的典型:一位开发人员被提拔为团队领导,原因只是对他而言在技术上已经没有再升职的余地。但是他在这个职位上很不自在,却在竭力维持,他是一位程序员,更喜欢编程。他天生不是团队的组织者和领导者,而且沟通能力很差,大多数程序员沟通弄能力很差,真正接触的软件团队领导没有几个,这需要一套技巧,不仅是技术上的,而且在组织方面。勉强的团队领导很温和,而且优柔寡断--又怎么说服别人怎么样做事情呢?

优点:
     对程序员有着真切的同情--他也曾经有过这样的经历,他往往过于承担起软件交付延迟的责任,同他不太擅长分配工作一样,也不太擅长分配责任。

缺点:
     如果团队领导试图编写代码,那么事情会变的很糟糕,他永远不会有充足的时间来足够认真的编写,设计和测试代码。他很天真的想既做好管理,又做好编码,结果,哪一件也做不好,他不能很好的组织,不能向管理层说明情况,也不能恰当的管理好团队成员。

如果你是其中一员该怎么办?
     接受培训,要快!!

     如果在这个职位上做的很不开心,那就试着调动一下吧,在自己不擅长的职位上工作等于是在浪费自己的生命,换到你真正适合的岗位上去。如果你喜欢挑战艰苦的任务,那么就试着在你的公司里解决升职的途径吧,让公司意识到管理职位不应该是高级研发人员的下一个晋升位置。

    13.你:

     看到这里是不是在每种代码猴子的特征上都多多少少的看到了自己的影子,是不是看到每种类型的代码猴子时都觉得是在说自己??不要害怕,如果你觉得是在说你,那就是在说,试着正视他们,并慢慢改变吧。

    理想的程序员:

    政治家:(Politician):

     老练,能够从容对付小的代码猴子的过时,能够从容应对软件工厂里的其他角色人员--管理人员,测试人员,支持人员,客户,用户等等。

    亲切(Relational):

     可以与其他人愉快地合作,并为自己的代码划定范围,为了大家的共同利益,不惜干那些脏活累活,拥有很好的沟通技巧,既善于演讲,又善于聆听。

    艺术家(Artistic):

    可以写出优雅的解决方案,并能欣赏高质量代码的美感。

    技术天才(Technical Genius):

    编写的代码可靠耐用,拥有广泛的技术能力,并且明白如何已经何时应用它们。

    我们应该怎样做??

    团队精神(Team Player):

     现在软件开发很少是靠单兵的暴力开发来进行的,多数都是团队成员间互相合作而完成,我们必须具有团队合作的精神。了解团队成员的特点,友好高效地与他们合作。

    谦虚诚实(Honest and humble):

    客观的评价自己的能力,了解自己的优缺点,正视缺点,发挥优点。

    不断进步(Improving Constantly):

    无论经验有多少,代码有多出色,都不要忘了学习,承认自己不是完美的,一名优秀的程序员应该出在一直不断学习的状态中。

    体贴(Considerate):

    在你写每行代码之前都要知道自己要写什么,写完之后,还要看看自己究竟下下了什么,即使是一个小小的修改。

    热情(Keen):

    保持学习的热情,不断学习,不断实践。如果在工作的间隙休息一下更有效率,那就停下来休息一会,如果自己喜欢接受挑战,那就把自己放在那个刺激的位置上。

    注意:如果你变得保守和厌烦,你的态度就会恶化,代码的质量就会遭殃!!!

      以上内容大部分出自《编程匠艺》一书,绝无说教之意!很不幸,作者在书中描述的很多错误的编程态度和方法都能在自己的身上找到影子,为了提醒自己应该向着优秀程序员的方向努力,特作此记录,与同样需要的人共勉之。

日子就是问题叠着问题,要挺胸抬头去面对!
2
1
分享到:
评论
1 楼 ckwn 2010-09-06  

相关推荐

Global site tag (gtag.js) - Google Analytics