Posted on 2008-05-12 13:18
小余(Yice) 阅读(2162)
评论(31) 编辑 收藏 网摘 所属分类:
小余草论
光绪年间,四川总督良接老母到成都来安享晚年,不料老夫人一到成都就病倒了,奇怪的是,一连找了几个有名的大夫,都没把老夫人的病看好。
于是,锝良命人在城墙上贴出一纸告示求医。 到了第四天,一个挑着担走街串巷卖花生胡豆的老头从那里经过,揭下了告示。
老头一阵悬丝吊脉,眉头紧锁,锡良迫不及待地问他病情如何?老头不紧不慢地说:“老夫人的病重啊!” 一句话把锡良惊呆了。老头又说:“大人如果舍得300两银子,我就开方子。”这简直是在黑宰!但锡良还是点头答应了。只见老头龙飞凤舞,片刻开好了处方。 锡良急忙拿过一看,脸色都变了:前两位郎中开了那么贵的药都没疗效,老头只开了五样很简单的中草药,能
行吗? 不想老头的药还真神,老太太只喝了一道,病竟好了一半。锡良又赶紧把老头接回来,继续诊治。这一回,老头来了个狮子大开口,600两银子。服下这一副药, 老太太的病就全好了,锡良顿时喜出望外,打起大轿就去答谢老头。但老头背包打伞已经走了两天了。锡良命人打开房门,发现桌上放着那900两银子和一封书 信。信上写着—— 总督大人钧鉴:令堂大人原本长途跋涉,感冒风寒,南北饮食失调,发恙时滥用补药,遂使病情加重。我如不重金索取,又怕大人不信,故两次索取重金,现璧还。
因治好了老夫人病,恐招来不测,芙蓉城虽美,但已经不是我安身之所了。如累总督垂爱,这900两银子就用来修一座牌坊,就叫无名牌坊,让天下人都来做无名 人无名事。 锡良被老头的话所打动,于是就在皇城与满城之间的东城。(摘自“锡良与牌坊巷”来源)
先用一则故事压一压大伙的口水,暂且先静下心来再次论论“毒”。或许大伙都知道砒霜是剧毒中的一种,在我们所能听到的传统故事中,砒霜绝对是杀人者居家必备之良药。但有多少人知道现在的医学研究表明,少量摄入砒霜可能对人类的健康有益,而且这种剧毒物质可以用来治疗一些血液疾病。越来越多的科学家和医生开始致力于开发砒霜的良性作用。
人参大补,同样可以让人毙命,砒霜虽毒,却有益健康。问题不出在药物本身,而在于用的人和用法上头。我们争论不休的面向对象和面向过程何尝不是这个道理,他们都有其特点和优势,也有各自的不足,我们所要争的不是到底谁能比谁更胜一筹,谁能够绝对性的压倒谁。我们所要了解他们的特点和如何用好这些优势,扬长避短来解决我们实际的问题。用好这些开发的理论和技巧才是我们的关键。
我上一篇文章主要写给初学者看的,对于初学者而言,他们所能看到的可能是人参吃了绝对不会有事,砒霜肯定会让你七孔流血这种绝对性的观点。对于初学者而言缺少的就是能够客观的看待问题,分析这些问题本质的能力。现在的计算机发展的速度太快了,快得让我都觉得落伍,往往是一觉醒来便会冒出许多的概念,新名词层出不穷,这就给初学者带来了很大的影响,要学的东西太多了,哪有那么多的时间去学习那么多的知识,这样他们往往比较容易迷茫。如果让这些初学者去跟风学习新的技术,而没有扎实的基础,或许他们会越学越吃力,越学越多,因为他们没有办法看到那些新名词背后的实质。这点和我们以前天天笑话地主老财的儿子学习写字一样,学会了一二三之后就认为自己得到真谛,结果让他写万字的时候就笑话连篇。现在的初学者何尝不像地主老财的儿子。
上一篇文章中我只是针对面向对象编程来说,只是从程序开发中的实际状况来说明一些问题,作为开发人员来说不论你用那一种的思想来看待问题和分析问题,你的最终结果就是将你的思维转化为代码,对于初学者来说,跟他们讲用那种方式分析和架构有点偏离他们的实际,他们需要首先学好的是开发上的技巧,能说能做,而不是光说不做。
我个人并没有反对任何一种方法,恰恰相反,二者都有可取之处,往往是取长补短的结合使用,你可以把面向过程的语言按照面向对象的思路进行代码开发,写出来的代码中除了语言本身是面向过程之外,我想代码中的处理方式无处不散发出面向对象的味道。以前做手持设备开发,纯C的语言,我就是按照面向对象的思路进行代码封装和复用的。从个人的经验和项目中的实际结果来看,如果一个开发人员缺乏扎实的开发功力,无论哪种方法对她来说都是无用的,而训练这种功力的最好方法就是从简单基础开始学习,从面向过程和面向对象来说,我想面向过程会稍稍简单一点。好比学武要先站马步一样,枯燥而且乏味,但是如果马步都站不稳,我可以断言你成不了高手。
关于面向对象的具体比较的话,需要从开发的思想,编程处理的方法和开发语言等三个方面去做分析比较,在今天的文章中我就不再一一作比较了。等后续有时间的话,我再对三个方面做一个简单的分析。
Feedback
http://www.cnblogs.com/Emoticons/tusiji/203707340.gif" alt="" />自己先鄙一下
其实代码和问题分析就像画家的画笔和审美观一样,如果希望做画家,最少要熟练用笔,然后再谈审美观。做开发也一样,要有扎实的开发功力,在这个基础上再提升你分析和理解问题的能力。
http://www.cnblogs.com/Emoticons/baimantou/114325779.gif" alt="" />
我觉得应该具体情况具体分析.
无论是面向过程还是面向对象,都只是手段,不是目的.
而我们要做的就是为达目的不择手段.
呃... 说实话, 扎实的开发功力是容易练就的, 就像你说的, 多下功夫, 虚心学习就好了。 我指的分析事物的能力, 是与编程无关的部分; 在我看来,这部分才是经常被忽视的。
至于存在的那种满嘴架构, 写不出几个像样程序, 动不动面向对象, 类全是水蒸气式的无用做法的人, 本来就是混饭吃的和骗钱的, 是改造不了的。
我觉得你说的好多人过于强调什么面向对象, 物极必反, 这个是对的。 但是也没必要过多的强调扎马步, 正是因为后者是必要的(肯定要经历的),所以反而是自然而然的。
你随便拽两个成长背景相似,有相同工作年限, *认真*的程序员, 无论他们一开始选择的学习道路是什么, 水平能有多大差别?
相反, 真正有巨大差别的人往往来自于不同的成长环境, 在入行前就具有不同的看待问题的方式了。 但是这些东西也不是改变不了的, 关键在于思维和方法的训练了。
从兄弟的文章里学到一个道理:
找工作的时候,一定要往高里喊,本来值4000一定要喊6000,你要是喊2000他以为你只有2000的水平,既不从能力上重视你,也不给你涨工资。
http://www.cnblogs.com/Emoticons/yoyocici/223852199.gif" alt="" />
http://www.cnblogs.com/Emoticons/yoyocici/223852199.gif" alt="" />占坑
这文章和地震有嘛关系,楼上的?
博主说得非常好,好多时候我也在想,面向对象真的是软件业的救命良药?怕是害命的时候也不少
@巫云
怪不得俺一直涨不上去呢。醍醐灌顶啊。
哈哈
会思考的人改变方式.懂得改变方式的人才能体现其精髓.
楼主说的在哩,但是我还是感到迷茫的就是.语法会了.编程思想有了,我们还少什么.简单的编程+实现过程不行,那么还要什么
--引用--------------------------------------------------
@小猪凯
我觉得应该具体情况具体分析.
无论是面向过程还是面向对象,都只是手段,不是目的.
而我们要做的就是为达目的不择手段.
其实文章就是希望初学者知道这些手段,学会使用这些手段。
--------------------------------------------------------
以前做手持设备开发,纯C的语言,我就是按照面向对象的思路进行代码封装和复用的
______________
大哥,面向对象仅仅是封装复用吗?
--引用--------------------------------------------------
@怪怪
呃... 说实话, 扎实的开发功力是容易练就的, 就像你说的, 多下功夫, 虚心学习就好了。 我指的分析事物的能力, 是与编程无关的部分; 在我看来,这部分才是经常被忽视的。
确实,基础能力只要努力和刻苦就会学习的很好,关键在于现在能安心静下心却学习的人很少了。这才是我写这些文章的主要目的。
有了扎实的基础,我们才能更好的谈后续的问题,分析也是在扎实基础的前提下才可能做得很好,如果开发的基本能力都存在缺陷,你怎么让别人相信你的分析能力很好。
我觉得你说的好多人过于强调什么面向对象, 物极必反, 这个是对的。 但是也没必要过多的强调扎马步, 正是因为后者是必要的(肯定要经历的),所以反而是自然而然的。
其实这个问题对于初学者而言虽然是浅显的道理,但是让他们真正认识却并不容易。
你随便拽两个成长背景相似,有相同工作年限, *认真*的程序员, 无论他们一开始选择的学习道路是什么, 水平能有多大差别?
相反, 真正有巨大差别的人往往来自于不同的成长环境, 在入行前就具有不同的看待问题的方式了。 但是这些东西也不是改变不了的, 关键在于思维和方法的训练了。
如果学习的内容都是相同,我想差距不会太大。如果说一个没有学习面向过程,我想对于程序的理解上可能存在差距。这个也是归根到底在于人的问题。
现在很多初学者对于学习上不是什么时候学的问题,而是基本不学。浮躁的心理让他们很难在入门后再回头去学习以前的基础,所以就造成开发中虽然能工作,但是基础浮虚的现象。
--引用--------------------------------------------------
@巫云
从兄弟的文章里学到一个道理:
找工作的时候,一定要往高里喊,本来值4000一定要喊6000,你要是喊2000他以为你只有2000的水平,既不从能力上重视你,也不给你涨工资。
文章能让你明白这个道理我也很奇怪,哈哈,不过找工作谈工资本身就是一个买卖,存在有叫卖与讨价的味道,确实存在有心理上的一种战术,不过至于进入公司之后,我想更过的在于你自己怎么表现自己的能力。
--引用--------------------------------------------------
@2008年的梦想
支持,不过开头的故事讲的不怎么样。悬念不足。
哈哈,下次会改进,让文章的可读性更强一点
--引用--------------------------------------------------
@一步
楼主说的在哩,但是我还是感到迷茫的就是.语法会了.编程思想有了,我们还少什么.简单的编程+实现过程不行,那么还要什么
还要学会思考,学会交流,学会发现问题的本质来应对不断出现的新技术。
--引用--------------------------------------------------
@Allen Lee
建议你看看《Object Thinking》这本书(http://www.amazon.com/Object-Thinking-DV-Microsoft-Professional-David/dp/0735619654)。
谢谢推荐,抽空我会好好把这本书读一读。
--引用--------------------------------------------------
@炭炭
以前做手持设备开发,纯C的语言,我就是按照面向对象的思路进行代码封装和复用的
______________
大哥,面向对象仅仅是封装复用吗?
面向对象的不止于此,但是你可以在面向过程的程序开发中借用其中的思想,提高代码的质量。
我自己的感受是:
程序员的能力主要体现在思想层次、基本功主要还是开发工具的掌握。
要想提升自己,多学学数学,特别是离散!
标题有点问题,改成 请初学者不要面向对象会更好点,不过说实话,现在正规点大学会连汇编,C,数据结构,编译原理什么的都不讲就开始先讲C#吗?那种事情只有培训机构才干的出来吧,而培训机构主要的目标是培养软件蓝领........
先说LZ叙述中的几个不妥。然后对LZ的论点表示适度支持。
“从软件学的本质来说,面向对象并没有改变软件运行的本质,所改变的只是代码开发中问题处理和思维方式,所有的高级语言都是经过编译器的处理转换成后成为一条一条的指令代码。所以如果希望能够对程序有比较好的理解,就需要了解运行的实际状态。透过高度抽象的层层烟幕看清实质是做软件开发的基本功力。如果要对编程语言进行归类,最简单而有实效的划分就是汇编指令编程语言和高级编程语言,无论是C,C++,C#,Java都是一种高级编程语言。不论是哪一种高级编程语言,最终的形式都会转换成CPU运行的一条一条指令后运行,目前计算机的CPU中还无法直接运行高级编程语言的代码。”
呵呵,跑到cnblogs来查东西,偶尔看到LZ的文章,就顺藤摸瓜地跑到上一篇文章看了看。
首先,对LZ和伍迷的争论精神表示敬佩!
在看LZ的上一片文章的时候看到了这个话,这里说下自己的看法,多少感觉LZ的说法有失公允。
“从软件学的本质来说,面向对象并没有改变软件运行的本质,所改变的只是代码开发中问题处理和思维方式,所有的高级语言都是经过编译器的处理转换成后成为一条一条的指令代码。”-----天下学问很多,究竟软件学是个什么学问,还想请教楼主一下这门学问的边界怎么界定?另外,面向对象是一种考虑问题的思路,既然是思路而且是考虑问题的思路,那么考虑这个动作发出的主题就是人了。所以面向对象仅仅是因为软件危机得不到解决后演化出来的一种更符合人类自身认知世界的思考方式而已。OO和软件运行的本质是完全没有多少直接关系的。所以LZ这里硬要把两个概念牵扯到一起做联想,有失公允。
“所以如果希望能够对程序有比较好的理解,就需要了解运行的实际状态。透过高度抽象的层层烟幕看清实质是做软件开发的基本功力。”----这点偶非常地认可。但我感觉LZ莫要把对底层原理的理解和学习OO对立话,作为一个合格的程序开发人员,两个方面都需要涉猎才算是基本合格。
“如果要对编程语言进行归类,最简单而有实效的划分就是汇编指令编程语言和高级编程语言,无论是C,C++,C#,Java都是一种高级编程语言。不论是哪一种高级编程语言,最终的形式都会转换成CPU运行的一条一条指令后运行,目前计算机的CPU中还无法直接运行高级编程语言的代码”----这里的分类方法其实没有多少意义。语言的发展本身就表现出分层的特征,从01机器码到汇编指令(前期是微指令),到OP类型的语言,再到OO类型的语言和脚本类型语言,本身的发展就是一层摞一层。语言就是语言,可以从模拟人类思维方式的机制支持性上去划分,这样感觉更合理一些。
我们用VS编写代码,编写好了以后通过VS提供的语言Compiler编译,然后通过Compiler里面内嵌的linker链接(当然不一定是内嵌的)后,形成了符合Windows标准的PE文件形式,例如EXE或者DLL。并且序列持久化到了本地Disk上。当我们双击PE文件的ICON的时候,先给OS发一个消息,在Msg Sequence中排队等候处理,处理的时候OS通过Msg内部包含的位置信息来调用OS loader来讲PE文件从本地磁盘加载到内存空间中。这里的内存空间是指高端2G的user mode空间,其中包括Data Segment和Code Segment等等。OS Loader在加载过程中根据你在编辑期定义的文本的类型不同也就是根据你定义的PE文件中的反射信息(在以前的原生开发中叫RTTI)来讲PE的不同内容分别加载到Data Segment和Code Segment中。然后OS将控制权交给被加载PE并从Main入口点开始执行。启动主线程。
这个是任何一个程序启动过程中的基本流程。了解这些可以更真实地了解你写的代码到底是如何去运行的。但只了解这些还是不够的。
如果把你写的程序比喻成一条小船,你写的程序的运行环境比喻成一个湖泊。那么面向对象的思维方式就好比造船的方法,小船的不同的部分负责不同的功能,担负不同的职责。而小船漂流所在湖泊就好比是操作系统环境。一个OS中包含OO的东西也包含OP的东西。作为开发人员,不能一味地追求OO或者OP,也不能一味的抵触OO和OP,其实LZ说的已经很清楚了。这点我很赞同。学任何东西都要讲求个度。就像天下没有能解决任何疑难杂症的神奇药物一样,技术也是如此,没有哪个技术能适合于所有的开发环境和条件。
合格的开发人员应该即了解造船的合理方式也要了解造出来的船将来所航行的实际环境是什么!