声明:这篇文章是本人一段时间思考、认识和言论的自我总结。纯属个人观点、经历的描述,紧供参考。 当然也欢迎大家[对本人]和[文中的观点]提出指点。
有人认为后期的C++趋向学院派风格,走进了一味追求技术和难度的误区,逐渐脱离主流的Programmers。
有人认为C++由于复杂度导致在现代软件工程中的地盘不断缩水。
也有人认为,C++无任对特定领域应用还是研究来说,都足够的优秀。
一、面对Object-Pascal、Java、C#等语言,还需要C++?
首先,就方法学来说,不可否认,OO方法学本身具有构造的系统,随着工程的进行复杂度膨胀速度惊人.而且,对于上点规模的工程,为了构建OO系统,在OOA、OOD阶段,设计者需要极高的水准.而以OOP为一典范亦作为OOP代表的C++,在语法语义的设计上,明显采用为了功能而不惜增加设计复杂度的策略.然而这一切的复杂,自然带来了好处,包括系统的可扩展性、可重用性等.这里好象存在一层很微妙的关系,上规模的系统为了可扩展性、可重用性等优点选择OO方法学,然而在OOA、OOD阶段就需要极大的投入(也许在00方法学中,A和D在软件工程中的地位体现的更明显吧
这个世界关于语言之间的讨论可能时刻进行着,个人一直认为:
1.首先每种语言有自己的适用领域,就应用而言,没有必要将语言勉强的拿到一起比较.
构建企业信息系统,自然会选择Java、dotNET或其它的方案(事实上,这种系统一般应该多种语言协同开发,以获得部件性能最佳).可能多种语言同适合某个项目,那么具体就自己裁决了.譬如做一个信息管理系统,选择C++环境的绝对很少,PB或Delphi、VB都是不错的选择.在初学习阶段"因爱而选(更多的具有偶然性或者与身处环境有关)"、对于开发者基本是"因用而选".在成熟后,"因用而学"我感觉是根本也是最实际的指导原则.
2.关于语言复杂度的问题:语言是工具,是不需要也不能太复杂的.我一直支持语言应该朝专业化(这里指针对义务和特定应用场合)和简单化方向发展.这才是语言的本质之所在.业务是软件实施的根本.对于软件开发着来说很多情况下,业务是最难搞定的,或者说,用软件来真实细致安全的模拟业务是很困难的.前几天,学籍管理科的老师还跟我说,他们的一个学籍管理软件让两个研究生不断的完善,三年才算[完全符合他的业务要求].如果你只是耳闻某某语言何等的复杂、难学而学之,那么可能你错了~就个人而言,为了技术而技术是不可取的。
3.然而这个世界是现实的,不如你想象的那样.并不是所有领域都有简单、强大、贴近业务 的语言.在这个层次上说,对于献身企业级信息应用系统开发者,Java、C#、Object-Pascal等的确是福音~~然而在系统软件和其它对性能、控制程度要求较高的如工控系统、高性能计算,实时系统,军用软件等领域可就缺不了C++(C)(不过这些领域
明显的专业知识占绝对部分的重量).可见,紧从语言上说,C++(C)依然占据着一片天地. 严格来讲,C是作为C++的一竞争对手出现的(不管这些了).
二、C++是否真的走进了追求技术的误区
自从,GP思想在C++上的第一个作品STL正式纳入标准库,关于C++走进技术误区的流言便没有停止过,Boost、作为GP领军人物之一的Andrei
Alexandrescu提倡并实践着(Loki)的编译时编程、将设计模式思想引入库设计,使得流言快被提上日程讨论了。
然而,GP真的只是技术吗?我一直认为,就OO来说,本人曾经作过这样的思考:
真正的对象应该至少能够具有:自主的适应环境(维护足够的"意识")。
1.自发行为的意识更强
2.反应能力更强
3.对外有足够的独立性
现在的OO,更像是建立在PO上的,不过是对象代替了函数。
但事实上,无论对象能力多高,过程表现绝对少不了。
Agent :我想是表达和反应能力最强的。
COM : 比Object-Based手法构造出的对象表达、反应、适应能力高很多.
不过There is no magic.还不过是一般的技巧构造出来的,看透了什么都没有了:)
GP :不能将它看作无谓的技术追求,[从我们谈论的这个节点看来,它的实质我认为至少是]:提高了构造的对象的适应能力(不是自发行为能力)的一种手段。
Andrei Alexandrescu的《Generic Programming :类型的else-if-then机制》
这篇文章可作为一精彩的证明。
三、C++怎么学?
首先声明:本人对之也只能说略之一二(C++太博大了)
孟岩先生曾经提过"C++需要自由的心",我要说"C++需要自由的心和手",我敢肯定我想的自由和孟岩先生的自由是不同的.
因为我的自由就个人诠释是 :"用自己的思路来自由的写验证性的usecase"
就个人的学习心得而言 :
1.在你学习C++的过程中,你首先需要扎实的实践一本C++基础教程,这个教程不在深而在全.使你能够全览之.最好结合基本数据结构来练习.不要整天Hello
World~~Hello MM的.
2.再下来你需要《(More)Effective C++》,它使你可以对C++也多了份思考,也了解到一些技巧和误区,不过,你需要同步实践,不然可能一时你并不能真正掌握这些技巧、避开误区.
3.提高,你需要:(下面的书可能已经讲烂了)
《Design Pattern》 :个人感觉,设计模式虽说是一种思维方式,具体实现上,只是 对OOP语言的发掘和巧妙组合而已.而且这里组合是主要的,特性是有限的,这本书中有几个模式没用虚特性的?
C++ Standard Document: 在你用它来做专项研究的时候,就会体会到什么才叫真正的全而深 (自然指在语法和语义的阐述上).
《STL源码剖析》 :没有深厚的功底,想来个闭门造车独挑STL源码是不可能的.不过,这本说也重在关键技术的讲解和引导罢了~~这里关于GP和STL的名著不少,本人没看过。不做品评。
《Inside The C++ Object Model》:最具价值的一本书,没了它,C++永远是个迷,哪怕你浸淫之N载~~
《Moden In C++ Design》:这里的很多思路是你自己的思维很难接触到的,我不得不佩服Andrei Alexandrescu.
市面上其它的C++书籍可牛车载,我感觉除了《The Design And Evolution Of C++》是异品,值得一读.其它的不建议花太多的时间,哪怕是Bjarne
Stroustrup、Stanley B.Lippman等的作品.自然,你有时间读更好,反正我现在有点后悔,当初只顾多,不顾深读,反复读.经典的书不在本数多,在于每本读的遍数多.一经验之谈,BBS上经常有人,在介绍COM技术书籍时,想也不想的指出,入门级<>.是这样的吗?我想,正如Dale
Rogerson所说,将这本书完全看懂,你就是COM专家了~~书中,作者很多话可能你没有注意到,因为你还不懂之,对之没感觉,一遍翻下来,感觉
哦~~简单~全看了 :) 这些书,跟国内的很多书籍最大的不同就是国内书籍的作者写的出,可能自己还不懂:)Copy什么资料上的:)??
4.浸淫一门语言本身的语法语义再久,你不一定能够深入它的精妙之处.
你需要学习应用这门语言的实作品(技术),你可以研究一些FrameWork或是一些具体的技术 如CORBA、COM等.就个人而已,有心接触C++十个月左右,对于Virtual的认识有过几次较大的的改变.在《
Inside The C++ Object Model》中算第一次,在《COM本质论》中关于COM对二进制兼容布局需求而用虚机制来解决是第二次,到目前为止,使我对virtual流下最深刻印象的是在Automation技术中组件由于环境是否有能力分析virtual结构而导致是否需要分发接口的问题.如果,整天抱着《C++语法语义深入》这样的书,我不知你何时才能真正了解C++很多的特性.
即使你可以对别人说上一大套,这行啊~那不行啊~~云云~~:)
在这整个的过程中,我喜欢这样对学弟说,你需要经常将C++的各种特性在脑中反复混合酝踉,这也是我强调学基础时,要求教材知识点全的原因.经常的,为了研究某些特性而自由的写、修改、增加UseCase,是我自认为很好的一个习惯.整天记他人的经验之言,不知几个月后还记得几层:)?
也许上面的叙述是概括了些:)?
总之,我认为学习C++,需要多思考(譬如你想想为什么模板类继承不支持virtual、模板类继承,基类实例和继承类实例产生的关系是什么样的)、多写usecase、多将一堆特性混合酝晾(譬如模板类成员签名、多种嵌套模板类成员签名、嵌套类与包裹类生命期控制等等)。
要尽早选择应用方向(这点很重要,附加个人观点:大多数人认为理论很难,可是我要说:应用一样是有难度的:)).
将00工程学中的理论适时的来对照自己的行为.
后话:
上面提到,就应用而已,比较语言的是没有什么意义的.然而我想说的是,不敢想象没有经过C++锤炼的人,可以深入的研究C#(事实上,我一直也不人为C#比C++好学,只是他们的深入点是不同的,冒昧说一句,C++中很多难度是人为制造出来的),就目前的情况来说,还有就是由于C++历史、社团、资源等因素.
共勉:
因用而择、因爱而择
学究其深
勿以善小而不为 (Csdn)