CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  模式及实现

怎样才算一个成熟的程序员?

楼主skyMountain(天山)2006-09-29 11:31:40 在 C/C++ / 模式及实现 提问

世界非常复杂善变。程序员必须要应对这复杂善变的世界。如何应对?用抽象的方法。人类最重要的思维能力就是抽象的能力,计算机程序无论多智能,到目前为止,还是没有任何抽象能力。  
  设计系统、编写代码、代码演化的过程,必须是一个抽象的过程。  
  不能理解这一句话的程序员,不能称为一个优秀的程序员。  
  解释一下,何为程序员的抽象。程序员的抽象方法,一般指的就是封装。封装什么?封装变化,封装复杂性。能以不变应万变,是抽象的最高境界。  
   
  怎么,你还不明白?那我举个例子。  
  你需要编写一个计算三角形面积的代码。  
  过了几天,你又需要编写一个计算五边形面积的代码。  
  这时,如果你还不意识到,你需要将两部分的代码合并起来,封装成一个计算n边形面积的宏、或函数、或对象、或对象群、或模块、或应用程序,那么你就不是一个成熟的程序员。  
   
  因为,如果你不这样做,随着时间推移,将会发生如下问题:  
  一):将来,你,或者你的同事,还需要辛辛苦苦编写计算四边形面积、七边形面积的代码;  
  二):然后,系统中到处都是这几份代码的拷贝,代码体积膨胀;  
  三):你发现你用的公式有点问题,你想修改这个公式时,却发现不得不在系统内到处搜索,找到每一处使用这个代码的地方,并且一一阅读、修改、调试那些代码。这份工作不仅单调、令人厌烦,而且非常冒险,因为你不能确保你修改了那些代码后,那些文件是否能像你预期那样运行,也不知道你是否找到了系统中所有使用这些代码的地方。  
  四):最后,你发现这个系统已经不可维护:类似的代码到处都是,而且往往都有一些或大或小的差异。你祈祷你所写的这份代码是绝对正确、没有问题的,因为一旦出了问题,系统是不能修改的了。可惜得失,上帝也写不出这样的代码。  
   
  回头看看。如果你时一个成熟的程序员,在遇到变化的时候,就用函数,或者对象,将你这些代码封装起来了。那么上面所说的恶梦就不会出现,项目也不至于在最后变得无法收拾。  
   
  呃,我有抽象的思想,但我不知道n边形的面积计算公式,不知道怎么写这个函数,怎么办?  
  别担心,程序员有自己的武器库。设计模式说到底,就是为了解决这种问题而存在的。  
  你写不出来的话,就留给以后需要的时候再写,或者留给你的同事以后写。重要的是,你要封装有这样的接口。而且要有让别人不必修改你的代码,就能往你接口里增加内容的能力。  
  不修改代码,就能往你接口里增添内容?如果你不熟悉设计模式,你可能觉得玄乎。请去重读几篇关于设计模式方面的文章吧。几乎所有设计模式,都是为了让代码有这样一种能力:增加功能时,只需增加模块,而不必修改原来的模块。  
   
  扯远了,我们回头看n边形的计算公式怎么封装好吧。老实说,我也不知道这个公式该怎么写。我数学很糟糕,我只记得三角形、四边形的面积公式。但是不知道公式该怎么写,就更加要封装,不然将来会死的更惨。  
   
  我们有如下选择:  
   
  一)封装一个计算n边形面积的函数,但如果用户输入的不是三角形或者四边形,那么抛出一个异常,告诉使用者在这里添加一份他所需要的代码。  
  怎么,你觉的这样非常不友好?呃,我也同意,可是这是最自然的思路了。初级程序员写出这样的代码是可以奖赏的,说明他有些抽象的思想了,虽然还没有掌握抽象的方法。  
   
  二)封装一个计算面积的对象,该对象目前只提供计算三角形或四边形面积的成员函数。如果使用者发现这个对象没有他所需要的方法,请他修改这个对象,为它增加这个函数。  
  这种封装方法也不错,可惜没达到上面的目标。因为使用者为了给你增加方法,必须修改你的代码。  
   
  三)使用简单工厂模式。每一种多边形的计算方法,都封装成一个对象。使用者要计算面积时,首先根据该多边形的边数,调用工厂方法,得到对应的多边形计算对象,然后再进行计算。  
  这种方法的好处是:使用者发现增加一种多边形计算方法时,只要编写这样一个对象,然后修改工厂方法,把这个对象返回就行了。  
  这种封装不够彻底,因为还是要修改原来的代码。但是,已经足够有效了。因为工厂方法内,只是一组简单的case语句,修改它是不会出什么问的。  
   
  四)使用动态工厂模式。前面不是说不够彻底,工厂类还是要修改么?那么我将工厂类也封装一下。工厂类里,维护一组计算面积的对象列表。原来的工厂方法中的   case语句,改为查询列表,返回相应的对象。对外提供一个register方法,让别人可以往这个工厂里增加新的计算面积的对象。  
  这是的代码就比较完美了。要增加新的计算面积的方法,完全不需要修改原来的代码,只要创建一个这样的对象,并把对象注册到工厂类里就行了。  
  比较不好的是,这时的代码并不是很适合于阅读。因为光看工厂类的代码,你不能知道这个工厂类究竟能提供哪些对象——事实上,这个工厂类变成了一个运行框架,没有任何具体的内容——它的能力和行为,是在运行的时候才能确定的。  
  按这种考虑,还是前面用简单工厂的模式比较好一些。  
   
  五)使用策略模式的方法。  
  嗯,不行。还有非常多的模式可以应对这种情况,我不能一一列举。我只是想举个例子,说明如何用设计模式来应对你所不了解的变化。  
   
  实际上,上面这个计算多边形面积这个例子,可以套用到很多地方上。  
  比方说一个网络服务器,它要处理很多种类型的数据包。随着项目的发展,它所要处理的数据包的类型也会越来越多。你不可能知道下一个需要你处理的数据包类型是什么。此时,你可以套用前面的解决思路,或者,使用其它可以使用的设计模式  
  重要的是封装的思想,然后,要学会一些常用的封装方法。有了这两个能力,程序员才算成熟。  
   
   
   
  Trackback:   http://tb.blog.csdn.net/TrackBack.aspx?PostId=1305769 问题点数:0、回复次数:19Top

1 楼dullblue(dullblue)回复于 2006-09-30 17:29:02 得分 0

程序员成熟了(思考方式的成熟)就意味着不再是程序员了Top

2 楼september_29(RSGIS)回复于 2006-10-10 14:14:24 得分 0

不要相信楼上的楼上的.扯谈..  
  当你长胡须,汗毛多而密,腋毛和pubes都比较丰富,具备产生精子和进行性行为的能力,出现遗精、梦遗等不应该出现的现象,而且对爱的要求强烈而主动,喜欢与美丽、聪明、活泼的女子交朋友同时具备会写"hello   world"程序的时候,那么你就算是个"成熟的程序员"  
   
  我的意思是一个"成熟的程序员"不是要激激歪歪的说那么多废话,让人不知道手脚放到什么地方合适.  
  而是在应该吃饭的时候就大大方方的吃饭而不吃shit,睡觉的时候就睡觉而不想着YY的事,然后在需要编程的时候编程,编完了就安心休息,不说激激歪歪的废话,不要说我是"成熟的程序员".不把复杂的事情搞简单,不把复杂的事情就搞简单,道法自然,认为编程和买白菜都没有什么大不了的,都是"混碗饭"吃的人就是"成熟的程序员".Top

3 楼september_29(RSGIS)回复于 2006-10-10 14:17:23 得分 0

---  
  不要相信楼上的楼上的.扯谈..  
  当你长胡须,汗毛多而密,腋毛和pubes都比较丰富,具备产生精子和进行性行为的能力,出现遗精、梦遗等不应该出现的现象,而且对爱的要求强烈而主动,喜欢与美丽、聪明、活泼的女子交朋友同时具备会写"hello   world"程序的时候,那么你就算是个"成熟的程序员"  
   
  我的意思是一个"成熟的程序员"不是要激激歪歪的说那么多废话,让人不知道手脚放到什么地方合适.  
  而是在应该吃饭的时候就大大方方的吃饭而不吃shit,睡觉的时候就睡觉而不想着YY的事,然后在需要编程的时候编程,编完了就安心休息,不说激激歪歪的废话,不要说我是"成熟的程序员".不把复杂的事情搞简单,不把简单的事情就想复杂,道法自然,认为编程和卖白菜都没有什么大不了的,都是"混碗饭"吃的人就是"成熟的程序员".  
  Top

4 楼rickerliang(专回0分贴(来交流不是为分))回复于 2006-10-10 18:29:30 得分 0

成熟了的程序员能吃么,不知道是啥问道的呢  
  hoho~~~~~~~~~~~~~Top

5 楼september_29(RSGIS)回复于 2006-10-10 18:53:13 得分 0

楼主吧简单问题复杂化就是罪恶的根源Top

6 楼bingdian37(冰点)回复于 2006-10-13 13:46:13 得分 0

同意LZ的说法  
  我们应该提高一下自己思考问题的高度  
  虽然一开始解决问题的时候看起来比原先的方法复杂了  
   
  但是我们应该知道  
  我们这种方法是可扩展的和可变的  
  一种模式提高的整个系统实施过程乃至后续系统的开发的效率  
  而不是当前问题的编码效率  
   
  登高望远  
  能力越大责任也就越大  
   
  如果仅仅满足于当前任务的解决  
  那就没必要看这帖子了Top

7 楼Jokar(贪睡鼠)回复于 2006-10-13 13:49:47 得分 0

成熟了的程序员能吃么,不知道是啥问道的呢  
  -------------------------------------  
  多加点儿水,煮熟了就行了~Top

8 楼vdust()回复于 2006-10-18 23:42:19 得分 0

认识到,面向过程不是软件的全部,面向对象也没有什么了不起。  
  认识到,软件不过是从需求域到解域的一种手段。  
  认识到,问题就是需求与满足的一种失配。  
  认识到,软件就是问题的解决方案。  
  认识到,问题的全部不过是共同性与差异性分析。  
  认识到,了解AOL(面向应用语言)与GL(通用语言)的区别。  
  认识到,软件为什么是这样?该是怎么样?本源是什么?将走向何方?  
  认识到,所有以上都不过是认识,而非圣经。  
  认识到,如果你不了解这个世界,不了解自已,你也不会了解软件。  
   
  Top

9 楼Jokar(贪睡鼠)回复于 2006-10-19 10:26:43 得分 0

不怕出错~   多做交流~Top

10 楼RMB_9999999999999999(爱生活·爱青岛)(www.iQingdao.com)回复于 2006-10-19 15:05:52 得分 0

MARKTop

11 楼skyMountain(天山)回复于 2006-10-30 16:32:37 得分 0

程序员是有多种层次的:  
   
  开始会写“hello   world!”是第一层次;  
  开始会使用一些api,是第二层次;  
  开始明白注释的作用、明白编码规范的重要性,是第三层次;  
  开始会使用一些常用的库,如boost库等等,是第四层次;  
  开始接触设计模式,并有意识地使用设计模式,这是第五层次;  
  熟练运用设计模式,第六层次;  
  真正领会设计模式,第七层次;  
  ……  
   
  这里说的“成熟的程序员”是第七层。就我现在的看法来看,一个公司招聘C++程序员,如果他的水平达不到第六层以上,那最好就不要招了,因为他写的代码会对公司的代码库造成很多危害的。Top

12 楼nicknide(封月翔天)回复于 2006-11-18 00:54:57 得分 0

不是我说,   楼上的人不清楚中国的现状呢...  
  而且分类也毫无依据可以。  
   
  是, 我是不成熟!我丫整一处男我成熟个鸟...  
  早知道不干程序这行,   受人催,天天加班,头发成把的掉.都成这样了,都没机会认识个雌性。  
  Top

13 楼sjjf(水晶剑锋)回复于 2006-11-18 01:25:14 得分 0

楼上的,睡觉的时候吧蚊帐打开,会有雌性蚊子光顾的。Top

14 楼kimryo(God is on my side)回复于 2006-11-18 01:33:53 得分 0

用高压锅先闷一遍~Top

15 楼nicknide(封月翔天)回复于 2006-11-18 01:49:10 得分 0

楼上上的  
  打开蚊帐也没用, 现在是冬天!!  
  Top

16 楼sjjf(水晶剑锋)回复于 2006-11-18 02:00:11 得分 0

应该有蟑螂吧  
  Top

17 楼WinWing(土豆╃为爱狂奔九条街╃ What's mine is mine)回复于 2006-11-20 02:56:40 得分 0

蟑螂止夜尿,HOHOTop

18 楼gameboy007(WoHaHa-WaHaHaHaHa)回复于 2006-11-22 01:00:25 得分 0

怎样才算一个成熟的程序员?  
   
  答案简单不过,只要不问以下的问题就是了  
   
  ...   "怎样才算一个成熟的程序员?"  
   
  Top

19 楼skyMountain(天山)回复于 2006-11-25 09:28:49 得分 0

封帖。  
  CSDN上整一个大疯人院,说任何有意义的话都会被当作疯子。  
  是该离开CSDN的时候了……Top

相关问题

关键词

得分解答快速导航

  • 帖主:skyMountain

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo