-----------------------------------------------------------------------------
声明:这篇文章是本人一段时间思考、认识和言论的自我总结
纯属个人观点、经历的描述,紧供参考
当然也欢迎大家[对本人]和[文中的观点]提出指点:)
-----------------------------------------------------------------------------
有人认为后期的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技术书籍时,想也不想的指出,入门级<<Inside The 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++历史、
社团、资源等因素.
共勉 :
因用而择、因爱而择
学究其深
勿以善小而不为 :)