至少应该阅读的九本C++著作
C++语言吸引如此之多的智力投入,以至于这个领域的优秀作品,包括重量级的软件产品、程序库以及书籍著作等,数不胜数。对于读者来说,倘若限于经济等客观因素而必须做出折衷取舍,我推荐至少阅读以下几本书:
1. The C++ Programming Language (Special 3rd Edition) by Bjarne Stroustrup
2. The Design and Evolution of C++ by Bjarne Stroustrup
如果你只打算购买一本书,那就选择1,如果还想要第二本 — 那就是这两本了。它们的作者是 C++语言的创建者。Stroustrup的文字语言丝毫不逊色于他所创建的程序语言。它们可以使你免于误入歧途。
3. Effective C++: 50 Specific Ways to Improve Your Programs and Designs by Scott Meyers
4. More Effective C++: 35 New Ways to Improve Your Programs and Designs by Scott Meyers
5. Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library by Scott Meyers
我强烈推荐Meyers这个系列。它们是菜鸟进阶必读之作。游刃有余的技术,高超的写作技巧。Meyers可能是世界上最优秀的C++技术作家。
6. The C++ Standard Library : A Tutorial and Reference by Nicolai M. Josuttis
C++标准库字典式著作。内容全面,结构清晰。
7. C++ Templates: The Complete Guide by David Vandevoorde, Nicolai M. Josuttis
Alexandrescu的Modern C++ Design阅读门槛很高,这本书可以充当你的垫脚石。单单阅读The C++ Standard Library或许并不足以使你具备定制、扩充标准库组件的能力,这本书可以助你一臂之力。对于任何希望进入模板编程领域的C++程序员来说,这是一本必读之作。
8. Modern C++ Design: Generic Programming and Design Patterns Applied by Andrei Alexandrescu
一本天才的著作!泛型模式,无限延伸你的视野,足以挑战任何一名C++程序员的思维极限。这本书几乎可以满足你对C++模板的所有幻想。
9. Design Patterns by Erich Gamma , Richard Helm, Ralph Johnson, John Vlissides
设计可复用的面向对象的软件,你需要掌握设计模式。这并不是一本专门针对C++程序员的著作,但它采用了C++(和Smalltalk)作为主要示例语言,C++程序员尤其易于从中受益。学习设计模式,这本书需要一而再、再而三的咀嚼。
这是公正客观的推荐吗?可能不是。实际上,没有任何人能够做到绝对客观 — 至少The Design and Evolution of C++是否应该进入这个推荐列表就能惹起喋喋不休的争吵。
还有许多优秀的著作值得推荐,但为了将推荐数目控制到个位数,它们没能入选。换一个人也可能会给出另外的“九本书”列表,但至少大半会和这个列表重叠。
巧合的是,这几本书均出自Addison-Wesley。它们绝大多数在市面上能找到相应的中文版,几乎每一中文版都有很好的质量。祝各位阅读快乐。
荣耀
2003年9月
南京师范大学
2006年11月2日
[收藏]C++程序设计之四书五经
C++是一门广泛用于工业软件研发的大型语言。它自身的复杂性和解决现实问题的能力,使其极具学术研究价值和工业价值。和C语言一样,C++已经在许多重要的领域大获成功。
然而,一个不可否认的现实是,在低阶程序设计领域,C++挤压着C同时也在承受着C的强烈反弹,而在高阶程序设计领域,Java和C#正在不断蚕食着C++的地盘。也许C++与C合为一体永远都是一个梦想,也许Java和C#的狂潮终将迫使C++回归本位 — 回到它有着根本性优势的开发领域:低级系统程序设计、高级大规模高性能应用设计、嵌入式程序设计以及数值科学计算等。果真如此,我认为这未尝不是一件好事。
C++吸引如此之多的智力投入,以至于这个领域的优秀作品,包括重量级的软件产品、程序库以及书籍等,数不胜数。文题“C++程序设计之四书五经”一个不太严格的含义是:C++程序设计之四书 ⅹ 五经。是的,在本文(及其下篇)中,我将分门别类推荐20多本C++好书,你可以根据自己的需要选读。
TCPL和D&E
TCPL和D&E分别是《The C++ Programming Language》和《The Design and Evolution of C++》的简称,均出自Bjarne Stroustrup之手。我将它们单列出来,首先是因为Bjarne是C++语言的创建者,然后是因为比“首先”那个原因更重要的原因:这两本书是C++领域毋庸置疑的杰作。说它们是C++语言圣经,并不为过。
Bjarne Stroustrup, The C++ Programming Language (Special 3rd Edition)
《C++程序设计语言(特别版)》,机械工业出版社
《C++程序设计语言(特别版)(英文影印版)》,高等教育出版社
迄今为止,TCPL是除了C++标准文献之外最权威的C++参考手册。和大多数人的看法不大一样,我认为Bjarne的文字语言并不逊色于他所创建的程序语言,至少我喜欢这种学院气息浓厚的作品。本书对C++语言的描述轮廓鲜明、直截了当。它从C++语言创建者的角度来观察C++,这是任何别的作者和书籍做不到的 — 没有任何人比Bjarne自己更清楚该怎么来使用C++。
这是一本严肃的著作,以中、高级C++开发人员为目标读者。如果你是一名有经验的C++程序员,需要了解更加本质的C++知识,本书正是为你而写。它不是那种让你看了会不断窃喜的小书,需要用心体会,反复咀嚼。在阅读过程中,请特别留心Bjarne先生强调了什么,又对什么一语带过。我个人比较喜欢这本书的第四部分“使用C++做设计”,这样的内容在类似的程序设计语言书籍中很难看到 — 我甚至认为Bjarne应该将这部分独立出来单独写一本书。
Bjarne Stroustrup, The Design and Evolution of C++
《C++语言的设计和演化》,机械工业出版社
《C++语言的设计和演化(英文版)》,机械工业出版社
D&E是一本关于C++语言设计原理、设计决策和设计哲学的专著。它清晰地回答了C++为什么会成为今天这个样子而没有变成另外一种语言。作为C++语言的创建者,Bjarne淋漓尽致地展示了他独到而深刻的见解。除了广受赞誉的语言特性外,Bjarne没有回避那些引起争议的甚至被拒绝的C++特性,他一一给出了逻辑严密、令人信服的解释。内容涵盖C++的史前时代、带类的C、C++的设计规则、标准化、库、内存管理、多重继承、模板等,对包括异常机制、运行时类型信息和名字空间在内的重要的新特性都分别进行了深入探讨。每一名C++程序员都应该可以从Bjarne的阐释中加深对手中这门语言的认识。
需要再次提醒的是,这两本书知识浓缩,信息量极大,请不要错过Bjarne每一句看似漫不经意的话。
入门教程
学习任何一门语言都需要一个从入门到精通、从新手到高手循序渐进的过程。不过,对于一个所谓的新手而言,究竟是一个完完全全的新手,还是一个熟悉某种别的语言的“新手”,甚至是在某种语言程序设计领域已经颇有建树的高手,很难一概而论?不同的C++新手需要不同的入门书籍。
Andrew Koenig, Barbara E. Moo, Accelerated C++: Practical Programming by Example
《Accelerated C++中文版》,中国电力出版社
和市面上大多数C++教程不同,本书不是从“C++中的C”开始讲解,而是始于地道的C++特性。从一开始就使用标准库来写程序,随着讲述的逐渐深入,又一一解释这些标准库组件所依赖的基础概念。另外,和其他C++教材不同的是,这本书以实例拉动语言和标准库的讲解,对后两者的讲解是为了给实例程序提供支持,而不是像绝大多数C++教材那样,例子只是用作演示语言特性和标准库用法的辅助工具。
作者在C++领域的编程实践、教育培训以及技术写作方面都是世界一流水准。我喜欢这种大量使用标准库和C++语言原生特性的清新的写作风格。在这本教材面前,几乎迄今为止的所有C++教材都黯然失色或显得过时。尽管这本教材也许对于国内的高校教育来说有些前卫,不过我仍然极力向我的同行们推荐。顺带一提,在Bjarne和我最近的一封通信里,他这样评价本书:对于有经验的程序员学习C++而言,这本书可能是世界上最好的一本。
Stanley B.Lippman, Josee Lajoie, C++ Primer (3rd Edition)
《C++ Primer (3RD)中文版》,中国电力出版社
这本书的名字多少有点让人误解。尽管作者声称这本书是为C++新手而写,但无论是它的厚度还是讲解的深度都暴露了似乎并非如此。也许说它是一本“从入门到精通”的C++教程会更合适一些。我个人认为它并不适合完全不懂C++的初学者 — 在阅读这本书之前,你至少应该先有那么一点C或C++的背景知识,或者至少要具有一些其他语言的编程经验。
尽管这本书省略了一些高级C++特性的讨论,但仍然可以称得上是迄今为止最全面的C++学习教程。事实上,如果一名C++初学者能够扎扎实实地读完本书并对照《C++ Primer Answer Book》完成全部习题的话,他的水平肯定可以进入职业C++程序员的行列。我个人认为,即使你已经拥有了TCPL,这本书依然有拥有的价值,因为在许多方面它比TCPL来得更详细、更易懂。
Stanley B. Lippman, Essential C++
《Essential C++中文版》,华中科技大学出版社
《Essential C++(影印版)》,中国电力出版社
可以不太严格地认为这本书是《C++ Primer》的精简版。本书一一讲述了C++中最具代表性的主题,包括过程式编程、泛型编程、基于对象编程、面向对象编程、模板编程以及异常处理等。Stanley将门槛调低到“具有其他语言程序设计经验”的C++新手所能接受的最基本的层次,使他们能够迅速开始使用C++编程而又免于阅读《C++ Primer》那样的大部头。它以实例引导学习,力图使读者在最短的时间内把握C++的精粹。
也许换一个人来概述C++编程范型(paradigm)的方方面面需要好几百页才能说清楚,但这本小书不可思议地做到了这一点。我个人非常喜欢这种满是技术、简明扼要并且“有话好好说”的书。这本书同样具有一个明显的风格:所有程序例子全部采用标准库组件,让人耳目一新。
以上三本书都不是为了完完全全的编程新手而写。完全的C++编程新手可以阅读Francis Glassborow的新书(尚未出版):《A Beginners Introduction to Computer Programming : You Can Do It!》。这也是Bjarne的推荐。Francis Glassborow是ACCU主席,多年来他对几乎每一本C++经典名著评头论足,他自己的这一本自然会引起C++社群的极大兴趣。
高效、健壮编程
两年前我在负责一个省级电力调度系统项目时编写了一个网关程序,它从SCADA系统获取电力实时信息。通讯接口采用了不常用的数据库直连方式(这个网关程序一端连接SQL Server 6.5,另一端连接Oralce 8.1.6)。由于实时测点近万,每次将全部取样更新或插入一遍显然是低效的。我在网关程序里建了一个内存库,获取到的数据首先在其中进行比较,然后决定是否更新物理数据库(同时还做了别的更复杂的事情……),从而在效率和资源占用两方面达到了预期效果。
这个程序一直运行得很好,但在离开现场之后的某一天,系统管理员打来电话,说大概因为网络故障等原因,有时这个网关程序会崩溃掉 — 它自己崩掉也就罢了,问题是它还会把Windows 2000 Advanced Server搞成“蓝屏”!坦白地说,我还从来没看过哪个非蓄意的程序有这个“能耐”。由于当时正忙于另外一个大项目,无法去现场调试,最后只有凭经验对内存库代码小心翼翼地封装以异常处理代码(同时也做了一些别的修改……)。这样,虽然没有彻底解决问题,但程序终究不再死得那么难看了。
在这儿讲这么一段花絮有什么意思呢(当初为那个可怕的bug朝思暮想时我可不认为这是一个“花絮”)?我想说的是,对于任何软件而言,离开强健,效率也就无从谈起。而对于C++程序员来说,也许编写一个高效的程序并不难,但要编写一个需要7 ⅹ 24小时持续运行的服务端软件就不是那么容易了,需要考虑许多因素,有时这些因素甚至远远超出C++语言和开发工具的本身。作为一名开发实际项目软件的程序员,并非非得自己碰钉子才能积累经验,只要我们足够虚心,别人的经验往往都是我们很好的借鉴。鉴于此,我推荐以下几本书供你选读,它们可以让你从强健和效率两方面受益(当然了,它们涵盖的内容远不限于异常处理J)。
Scott Meyers, Effective C++: 50 Specific Ways to Improve Your Programs and Design (2nd Edition)
Scott Meyers, More Effective C++: 35 New Ways to Improve Your Programs and Designs
《Effective C++中文版》,华中科技大学出版社
《More Effective C++中文版》,中国电力出版社
《Effective C++(影印版)》,中国电力出版社
如果说《Effective C++》主要讨论C++中一些相对基础的概念和技巧的话,那么《More Effective C++》则着重探讨了包括异常处理在内的一系列高级技术。与前者相比,后者具有两大主要区别:其一,它包含很多时新的标准C++的内容;第二,它讨论的主题倾向于“战略化”而非“战术化”,并且讨论得更深入、更彻底。尤其是对虚析构函数、智能指针、引用计数以及代理类(proxy classe)等技术和模式论述的深入程度,让人很难想象是出现于这样的一本小书之中。
游刃有余的技术,高超的写作技巧,Scott无疑是世界上最优秀的C++技术作家之一。在简洁、清晰、易读等方面,这两本书都卓尔不群。总之,Scott提供的这85个可以改善编程技术和设计思维的方法,都是中、高级C++程序员必备的技能。我强烈推荐这两本书(实际上还有一本,稍后就会看到)。
Herb Sutter, Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions
Herb Sutter, More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions
《Exceptional C++中文版》,中国电力出版社
《More Exceptional C++中文版》,华中科技大学出版社
你自认为是一名C++语言专家吗?读一读ISO C++标准委员会秘书长的这两本书再回答。在这两本书中,Herb采用了“问答”的方式指导你学习C++语言特性。对于每一个专题,Herb首先合理地设想出你的疑问和困惑,接着又猜测出你十有八九是错误的解答,然后给你以指点并提出最佳解决方案,最后还归纳出解决类似问题的普适性原则。
这两本书是典型的深究C++语言细节的著作,很薄,但内容密集,远远超过Scott的那两本书,读起来很费脑筋 — 我个人认为它们要比Scott的书难懂得多。若要研习这薄薄的两本书所包含的知识,至少需要花费数月的时间!(在Scott的荐序中,他坦陈不止一次陷入GotW问题的陷阱,你应该知道这意味着什么)对于语言细节的深究有什么好处呢?尽管在大多数情况下,我们不必关心C++代码幕后的动作,然而当我们不得不关心时,这两本书可以为我们提供很好的线索,因为它们揭示了C++语言中微妙而又至关重要的东西。
Stephen C. Dewhurst, C++ Gotchas: Avoiding Common Problems in Coding and Design
《C++程序设计陷阱》,中国青年出版社
Stephen的理论素养和实践经验注定这是一本值得一读的好书。Stephen曾经是贝尔实验室中第一批C++使用者。他已经使用C++成功解决了包括编译器、证券交易、电子商务以及嵌入式系统等领域中的问题。本书汇集了作者来自开发一线的99条编程真知灼见,洞悉它们,你可以避免几乎所有常见的C++设计和编程问题。
我甚至认为,对于C++编程菜鸟而言,阅读这本书会比阅读Scott和Herb的书更能轻松而立竿见影地获得更大的提高。我个人很喜欢这本书的写作风格 — Stephen的许多观点看似极端却无可辩驳。当然了,这种自信(以及冷幽默)来自于作者深厚的技术素养,而非自大的偏执。
除了上面推荐的书籍外,Dov Bulka和 David Mayhew合著的《Efficient C++: Performance Programming Techniques》(《提高C++性能的编程技术》,清华大学出版社)也值得一看。这本超薄小书聚焦于高性能C++应用程序开发。两位作者都是IBM软件专家,都工作于对性能要求极高的系统构建领域,本书是他们的经验之谈。也有人不喜欢这本书,因为它花了不少的篇幅讲述和C++无关的东西,我却恰恰因为这一点而对这本书产生好感,正是这些东西让我开阔了眼界。
模板和泛型编程
模板和基于模板的泛型编程无疑是当今发展最活跃的C++程序设计技术。模板的第一个革命性的应用是STL,它将模板技术在泛型容器和算法领域的运用展现得淋漓尽致,而Boost、Loki等现代程序库则将模板技术的潜能不断发挥到极致。在模板和泛型编程领域,我推荐以下两本重量级著作:
David Vandevoorde, Nicolai M. Josuttis, C++ Templates: The Complete Guide
《C++ Templates全览(繁体版)》,台湾碁峰资讯股份有限公司
《C++ Templates全览(简体版)》,人民邮电出版社
有一种老套的赞美一本书的手法,大致是“没有看过这本书,你就怎么怎么地”,这里面往往夸张的成分居多。不过,倘若说“没有看过《C++ Templates: The Complete Guide》,你就不可能精通C++模板编程”,那么这个论断对于世界上绝大多数C++程序员来说是成立的。
这本书填补了C++模板书籍领域由来已久的空白。此前,上有《Modern C++ Design》这样的专注于模板高级编程技术和泛型模式的著作,下有《The C++ Standard Library》这样的针对特定模板框架和组件的使用指南。然而,假如对模板机制缺乏深入的理解,你就很难“上下”自如。鉴于此,我向每一位渴望透彻理解C++模板技术的朋友推荐这本书。
这本书在内地、台湾各有一个译本,但出自不同的译者之手。当你看到这篇文章时,两个译本应该都已经上市,对于读者来说当然也就多了一种选择。侯捷先生个人网站上开放了繁体译本大部分章节,不妨先睹为快。
Andrei Alexandrescu, Modern C++ Design: Generic Programming and Design Patterns Applied
《C++设计新思维:泛型编程与设计模式之应用》,华中科技大学出版社
《C++设计新思维(影印版)》,中国电力出版社
你自认为是C++模板编程高手吗?请看过这本书再回答J 这是一本出自天才之手令人敬畏的杰作。泛型模式,无限延伸你的视野,足以挑战任何一名C++程序员的思维极限。
这本书共分为两大部分,第一部分讨论了 Loki程序库采用的基础技术以及一些高级语言特性,包括基于策略的类设计、模板局部特化、编译期断言、Typelist以及小型对象分配技术等。第二部分则着重介绍了Loki中的重要组件和泛型模式技术,包括泛化仿函数(Generalization Functor)、单件(Singleton)、智能指针、对象工厂(Object Factory)、抽象工厂(Abstract Factory)、访问者(Visitor)以及多方法(Multimethods)等。每一种技术都让人大开眼界,叹为观止。
在C++的学习方面,过犹不及往往成了不求甚解的借口。然而,面向对象并非C++的全部,模板和泛型编程亦占半壁江山。对于“严肃”的C++程序员而言,及时跟进这项早经例证的成功技术,不失为明智之举。
结语
这些著作是如此大名鼎鼎,也许根本不缺我一个推荐。然而,纵然C++程序员队伍的发展壮大速度不像其他更时髦的语言那样迅速,新人进总是多于旧人出。除了热忱地欢迎新人,我个人认为到了对C++书籍进行“盘点”的时候了,并且希望这样的“盘点”有益于感兴趣的读者。请保持耐心和宽厚。在下篇中,我将继续介绍标准库、网络编程以及其他方面的C++好书。有好书相伴,这个冬天不会冷。
荣耀
2004年1月
南京师范大学
下篇
我在上篇中“盘点”了TCPL和D&E以及入门教程、高效和健壮编程、模板和泛型编程等方面共十几本C++好书。冬去春来,让我们继续C++书籍精彩之旅J
标准库
当我还在研究院工作时,与同院另外两家研究所合作开发过一个大型水利枢纽调度集成项目。我们三家软件系统之间都要相互通信。在调试通讯模块时,细心的客户(一名好学的系统管理员)发现对于同一通信规约的解释代码,我的不超过30行,而对方的则超过了150行且很难看懂。这位系统管理员很纳闷,我说大家编程风格和习惯不一样,我使用了标准库,而他使用了传统C编程风格以及他所习惯的另外一些技术。
别误会!我绝无贬低这位合作伙伴的意思。事实上,我对那些真正有着深厚的C编程功力的程序员常常怀有钦佩之心。毕竟,C++能有今天的成功在很大程度上缘于它深深地植根于C。作为一名C++程序员,倘若不熟悉C++中的C,我往往会认为他的基本功是不扎实的,他的技术底气是不足的。
不过话又说回来,C++是一种多范型(paradigm)编程语言,具体采用哪种编程风格,专业程序员应该知道视具体情况而定。作为一名经常需要在现场做即兴开发的项目负责人,为了短平快地解决当务之急,我习惯尽量采用现有的库(和组件)。效率(以及强健性)久经验证的C++标准库已经摆在那儿了,何乐而不用呢?
Nicolai M. Josuttis, The C++ Standard Library: A Tutorial and Reference
《C++标准程序库:自修教程与参考手册》,华中科技大学出版社
这是一本百科全书式的C++标准库著作,是一本需要一再查阅的参考大全。它在完备性、细致性以及精确性方面都是无与伦比的。本书详细介绍了每一标准库组件的规格和用法,内容涵盖包括流和本地化在内的整个标准库而不仅仅是STL。正如本书副标题所示,它首先适合作为教程阅读,尔后又可用作参考手册。
浅显易懂的写作风格使得这本书非常易读。如果你希望学习标准库的用法并尽可能地发挥其潜能,那你必须拥有这本书。正如网络上所言,这本书不仅仅应该摆在你的书橱中,更应该放到你的电脑桌上。我向每一位职业C++程序员强烈推荐。
Angelika Langer, Klaus Kreft, Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference
《标准C++输入输出流与本地化》,人民邮电出版社
C++标准库由STL、流和本地化三部分构成。关于STL的书市面上已经有不少,但罕见流和本地化方面的专著。本书是这两个领域中最优秀的一本,迄今为止没有任何一本书比这一本更全面详尽地讨论了流和本地化。如果你不满足于停留在“会用”流库的层面,千万不要错过它。
2001年夏天,我草草翻阅过这本书的中文版,从内容到包装都给我留下了比较深刻的印象 — 不过负面的居多一些。2003年秋天,无意中得知某网络书店正以超低价格甩卖这本书的中译本,情不自禁,一阵唏嘘。
Scott Meyers, Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library
《Effective STL(影印版)》,中国电力出版社
读完Scott 的《Effective C++》和《More Effective C++》的中译本之后,我一直期待这本书的中文版。我从潘爱民先生的个人主页上了解到,他和他的合作伙伴似乎早已完成了这本书的翻译工作,可惜至今市面上仍不得见。幸运的是,我们可以看到它的原版。
本书是使用STL的程序员必读之作。在这本书中,Scott向我们讲述STL容器和算法的工作机制以及如何以最佳方式使用它们。和Scott的其他作品一样,这本书的写作风格清晰、精确,具有极佳的可读性。看过这本书以后,我想你也许会和我以及其他C++程序员一样产生这样的想法:Scott什么时候会写出一本“More Effective STL”?
关于STL,我还提醒你留心Matthew H. Austern的《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》(《泛型编程与STL》,中国电力出版社)。这本书散发着浓厚的学院气息。Andrew Koenig和Barbara Moo在《Accelerated C++: Practical Programming by Example》一书末尾郑重推荐另外两本进阶好书(除了他们自己的《Ruminations on C++》外),其中一本是TCPL,另外一本就是本书!
网络编程
在网络编程时代,C++应该扮演着怎样的角色,让ACE(Adaptive Communications Environment)来告诉你。
Douglas C. Schmidt, Stephen D. Huston, C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns
Douglas C. Schmidt, Stephen D. Huston, C++ Network Programming, Volume 2: Systematic Reuse with ACE and Frameworks
《C++网络编程,卷1:运用ACE和模式消除复杂性》,华中科技大学出版社
《C++网络编程,卷2:基于 ACE 和框架的系统化复用》,电子工业出版社
采用C++进行企业级网络编程,目前ACE(以及这两本书)是一个值得考虑的选择。ACE是一个面向对象、跨平台、开放源码的网络编程框架,目标在于构建高性能网络应用和中间件。Douglas是ACE的创始人,Stephen则已为ACE提供了数年的技术支持和顾问服务,两位都是ACE社群(是的,ACE的影响和实际应用的程度已经形成了一个社群)的专家。
ACE并不单单被大学和研究所追捧,它已经被成功地应用于世界上成千上万个商业应用中。在电信、宇航、医药和财经领域的网络系统中,ACE已经并继续发挥着重要的作用。如果你准备开发高性能通讯系统,你应该考虑考虑这一汇集世界顶尖专家智慧的成果。
除了使用C++面向对象设计技术和模板等高级语言特性外,ACE还运用了大量的模式。《C++网络编程》卷1和卷2并不仅仅教你关于ACE的方方面面,它还会教给你模式和通用框架设计等高级技术等。所以,作为一名中、高级C++程序员,即使你很少进行正儿八经的C++网络程序设计,阅读这两本书同样可以从中受益。
是的,并非所有网络应用都要使用Web服务器(以及其他应用服务器)和重量级组件模型,换个思路,它们或许也可以从轻量级的ACE组件中获益。
杂项
以下这几本书之所以被列入“杂项”单元,只是因为我没有考虑出更合适的归类方法,它们和上面的书籍一样,值得一读。
Bruce Eckel, Thinking in C++, Volume 1: Introduction to Standard C++ (2nd Edition)
Bruce Eckel, Thinking in C++, Volume 2: Practical Programming (Second Edition)
《C++编程思想(第2版)第1卷:标准C++导引》,机械工业出版社
《C++编程思想(英文版 第2版)》,机械工业出版社
《Thinking in C++》的第1版于1996年荣获“软件研发”杂志评选的图书震撼大奖。最新推出的第2版对内容进行了大幅改写和调整,以反映C++标准化带来的影响以及近几年面向对象领域最新研究和实践成果。“输入输入流”、“多重继承”、“异常处理”和“运行时类型识别”等高级主题连同C++标准化以后增加的一些内容则被放入第二卷中。Bruce是一名经验丰富的C++讲师和顾问,其培训和写作经验都是世界一流水准,他的作品比那些“玩票”的技术人员写的东西更能吸引读者。事实上,在同类图书中,对于大多数读者而言,这本书的可读性要超过TCPL和《C++ Primer》。顺带一提,访问作者的站点,你可以先睹第二卷的风采。
Andrew Koenig, Barbara E. Moo, Ruminations on C++: A Decade of Programming Insight and Experience
《C++沉思录》,人民邮电出版社
Andrew是世界上屈指可数的C++专家。这是一本关于C++编程思想和程序设计技术而非语言细节的著作。如果你已经具有一定的基础,这本书将教你在进行C++编程时应该怎样思考,应该如何表达解决方案。整本书技术表达透彻,文字通俗易懂。Bjarne这样评价这本书:本书遍布“C++是什么、C++能够做什么”的真知灼见。
Stanley B. Lippman, Inside The C++ Object Model
《深度探索C++对象模型》,华中科技大学出版社
《深度探索C++对象模型(影印版)》,中国电力出版社
从编译器的角度观察C++可以使你知其然并知其所以然。本书探讨了大量的C++面向对象程序设计的底层运作机制,包括构造函数、函数、临时对象、继承、虚拟、模板的实例化、异常处理、运行期类型识别等,另外还介绍了一些在实现C++对象模型过程中做出的权衡折衷。喜欢刨根问底的C++程序员不要错过这本书。
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object-Oriented software
《设计模式:可复用面向对象软件的基础》,机械工业出版社
《设计模式:可复用面向对象软件的基础(英文版)》,机械工业出版社
设计可复用的面向对象的软件,你需要掌握设计模式。本书并非专为C++程序员而写,但它采用了C++(以及Smalltalk)作为主要示例语言,C++程序员尤其易于从中受益。四位作者都是国际公认的面向对象软件领域专家,他们将面向对象软件的设计经验作为设计模式详细记录下来。这本书影响是如此深远,以至于四位作者以及本书都被昵称为GoF(Gang of Four)。本书学院气息浓厚,行文风格严谨简洁,虽然它不如某些讲解模式的书籍易读,但真正要精准地理解设计模式,本书是终极权威。学习设计模式,这本书需要一而再、再而三的咀嚼。顺带一句:请将设计模式化作开拓思维的钥匙,切莫成为封闭思维的枷锁。
还有一些C++好书值得一读,恕此处无法一一列出。例如John Lakos的著作《Large-Scale C++ Software Design》(《大规模C++程序设计》,中国电力出版社)和侯捷先生的《STL 源码剖析》(华中科技大学出版社)等。
《STL 源码剖析》是一本很有特色的书,但我认为它还可以更好。我个人期待侯捷先生自第一版发行以来经过对模板技术的沉淀和再思考之后,再写一本剖析得更深入、更透彻并且更全面的“第二版”。遗憾的是,侯捷先生在完成《C++ Templates: The Complete Guide》一书的翻译后似乎决定暂时告别模板、泛型编程和STL领域。
2004年3月31日补充:我目前最常查阅的两本参考书是《C++标准程序库》和《STL源码剖析》。当然了,这与我年内的写作计划有很大的关系。
使用C++成功开发大规模软件系统,不仅需要很好地理解大多数C++书籍中讲述的逻辑设计问题,更需要掌握《大规模C++程序设计》中讲述的物理设计技术。当然,这本书的确有点过时了,不过,如果你的精力和金钱都比较宽绰,买一本看看并无坏处。
至此,我想有必要声明一下,有一些(好)书没有得到推荐,主要原因如下:
* 以上这些书已经足够多、足够好了。
* 我不会推荐通过正常渠道很难购买到的书籍 — 不管是中文版还是英文版。
* 作(译)者名气大小不影响我的推荐。我们是在看书,不是看人。
* 我不会推荐我从来没有看过的书。我至少要看过其中的某个版本(包括电子档)。这个“看”,一般指“认真阅读”,不过有一些也只能算是“浏览”。
结语
作为一名普通技术写译者,我深知技术创作和翻译的艰辛(和快乐),并多多少少了解一些有关技术书籍创作、翻译、制作、出版以及市场推介背后的细节。今天,我不会再对一本看上去差强人意的图书信口开河。罗列同一本书的各种版本的用意只在于为你多提供一些信息,让你多一种选择。
在本文成文的后期,我给Bjarne写了一封信,请教如果他来写这篇文章会怎么写。他给了我简明扼要的建议。在肯定以上列出的绝大部分图书都是世界顶尖水平的C++著作的同时,Bjarne提醒我别忘了向专家级程序员推荐《The C++ Standard : Incorporating Technical Corrigendum No. 1》。这本书是 C++标准规范的“图书版”,Bjarne亲自为之作序。
Bjarne还友好地提醒我,在我的推荐列表中没有哪一本有助于C++程序员进行Windows编程 — 这正是我的本意。在这篇文章中,我只推荐、点评平台中立的C++著作(网络编程除外) — 和操作系统无关,和集成开发环境无关,我甚至幻想它们和编译器也无关。你可以根据业务开发需要,选读自己喜爱的领域相关的C++书籍。
说到“系统无关、平台中立”,我不由得想起了“抽象层”的概念。开发实际应用的C++程序员通常工作于特定操作系统、特定开发环境和特定业务领域之中,而对标准C++和C++标准库扎实而深刻的把握,无疑是你得以在不同的操作系统、不同的开发环境以及不同的业务领域之间纵横驰骋的“抽象”本钱。
荣耀
2004年1月
南京师范大学
然而,一个不可否认的现实是,在低阶程序设计领域,C++挤压着C同时也在承受着C的强烈反弹,而在高阶程序设计领域,Java和C#正在不断蚕食着C++的地盘。也许C++与C合为一体永远都是一个梦想,也许Java和C#的狂潮终将迫使C++回归本位 — 回到它有着根本性优势的开发领域:低级系统程序设计、高级大规模高性能应用设计、嵌入式程序设计以及数值科学计算等。果真如此,我认为这未尝不是一件好事。
C++吸引如此之多的智力投入,以至于这个领域的优秀作品,包括重量级的软件产品、程序库以及书籍等,数不胜数。文题“C++程序设计之四书五经”一个不太严格的含义是:C++程序设计之四书 ⅹ 五经。是的,在本文(及其下篇)中,我将分门别类推荐20多本C++好书,你可以根据自己的需要选读。
TCPL和D&E
TCPL和D&E分别是《The C++ Programming Language》和《The Design and Evolution of C++》的简称,均出自Bjarne Stroustrup之手。我将它们单列出来,首先是因为Bjarne是C++语言的创建者,然后是因为比“首先”那个原因更重要的原因:这两本书是C++领域毋庸置疑的杰作。说它们是C++语言圣经,并不为过。
Bjarne Stroustrup, The C++ Programming Language (Special 3rd Edition)
《C++程序设计语言(特别版)》,机械工业出版社
《C++程序设计语言(特别版)(英文影印版)》,高等教育出版社
迄今为止,TCPL是除了C++标准文献之外最权威的C++参考手册。和大多数人的看法不大一样,我认为Bjarne的文字语言并不逊色于他所创建的程序语言,至少我喜欢这种学院气息浓厚的作品。本书对C++语言的描述轮廓鲜明、直截了当。它从C++语言创建者的角度来观察C++,这是任何别的作者和书籍做不到的 — 没有任何人比Bjarne自己更清楚该怎么来使用C++。
这是一本严肃的著作,以中、高级C++开发人员为目标读者。如果你是一名有经验的C++程序员,需要了解更加本质的C++知识,本书正是为你而写。它不是那种让你看了会不断窃喜的小书,需要用心体会,反复咀嚼。在阅读过程中,请特别留心Bjarne先生强调了什么,又对什么一语带过。我个人比较喜欢这本书的第四部分“使用C++做设计”,这样的内容在类似的程序设计语言书籍中很难看到 — 我甚至认为Bjarne应该将这部分独立出来单独写一本书。
Bjarne Stroustrup, The Design and Evolution of C++
《C++语言的设计和演化》,机械工业出版社
《C++语言的设计和演化(英文版)》,机械工业出版社
D&E是一本关于C++语言设计原理、设计决策和设计哲学的专著。它清晰地回答了C++为什么会成为今天这个样子而没有变成另外一种语言。作为C++语言的创建者,Bjarne淋漓尽致地展示了他独到而深刻的见解。除了广受赞誉的语言特性外,Bjarne没有回避那些引起争议的甚至被拒绝的C++特性,他一一给出了逻辑严密、令人信服的解释。内容涵盖C++的史前时代、带类的C、C++的设计规则、标准化、库、内存管理、多重继承、模板等,对包括异常机制、运行时类型信息和名字空间在内的重要的新特性都分别进行了深入探讨。每一名C++程序员都应该可以从Bjarne的阐释中加深对手中这门语言的认识。
需要再次提醒的是,这两本书知识浓缩,信息量极大,请不要错过Bjarne每一句看似漫不经意的话。
入门教程
学习任何一门语言都需要一个从入门到精通、从新手到高手循序渐进的过程。不过,对于一个所谓的新手而言,究竟是一个完完全全的新手,还是一个熟悉某种别的语言的“新手”,甚至是在某种语言程序设计领域已经颇有建树的高手,很难一概而论?不同的C++新手需要不同的入门书籍。
Andrew Koenig, Barbara E. Moo, Accelerated C++: Practical Programming by Example
《Accelerated C++中文版》,中国电力出版社
和市面上大多数C++教程不同,本书不是从“C++中的C”开始讲解,而是始于地道的C++特性。从一开始就使用标准库来写程序,随着讲述的逐渐深入,又一一解释这些标准库组件所依赖的基础概念。另外,和其他C++教材不同的是,这本书以实例拉动语言和标准库的讲解,对后两者的讲解是为了给实例程序提供支持,而不是像绝大多数C++教材那样,例子只是用作演示语言特性和标准库用法的辅助工具。
作者在C++领域的编程实践、教育培训以及技术写作方面都是世界一流水准。我喜欢这种大量使用标准库和C++语言原生特性的清新的写作风格。在这本教材面前,几乎迄今为止的所有C++教材都黯然失色或显得过时。尽管这本教材也许对于国内的高校教育来说有些前卫,不过我仍然极力向我的同行们推荐。顺带一提,在Bjarne和我最近的一封通信里,他这样评价本书:对于有经验的程序员学习C++而言,这本书可能是世界上最好的一本。
Stanley B.Lippman, Josee Lajoie, C++ Primer (3rd Edition)
《C++ Primer (3RD)中文版》,中国电力出版社
这本书的名字多少有点让人误解。尽管作者声称这本书是为C++新手而写,但无论是它的厚度还是讲解的深度都暴露了似乎并非如此。也许说它是一本“从入门到精通”的C++教程会更合适一些。我个人认为它并不适合完全不懂C++的初学者 — 在阅读这本书之前,你至少应该先有那么一点C或C++的背景知识,或者至少要具有一些其他语言的编程经验。
尽管这本书省略了一些高级C++特性的讨论,但仍然可以称得上是迄今为止最全面的C++学习教程。事实上,如果一名C++初学者能够扎扎实实地读完本书并对照《C++ Primer Answer Book》完成全部习题的话,他的水平肯定可以进入职业C++程序员的行列。我个人认为,即使你已经拥有了TCPL,这本书依然有拥有的价值,因为在许多方面它比TCPL来得更详细、更易懂。
Stanley B. Lippman, Essential C++
《Essential C++中文版》,华中科技大学出版社
《Essential C++(影印版)》,中国电力出版社
可以不太严格地认为这本书是《C++ Primer》的精简版。本书一一讲述了C++中最具代表性的主题,包括过程式编程、泛型编程、基于对象编程、面向对象编程、模板编程以及异常处理等。Stanley将门槛调低到“具有其他语言程序设计经验”的C++新手所能接受的最基本的层次,使他们能够迅速开始使用C++编程而又免于阅读《C++ Primer》那样的大部头。它以实例引导学习,力图使读者在最短的时间内把握C++的精粹。
也许换一个人来概述C++编程范型(paradigm)的方方面面需要好几百页才能说清楚,但这本小书不可思议地做到了这一点。我个人非常喜欢这种满是技术、简明扼要并且“有话好好说”的书。这本书同样具有一个明显的风格:所有程序例子全部采用标准库组件,让人耳目一新。
以上三本书都不是为了完完全全的编程新手而写。完全的C++编程新手可以阅读Francis Glassborow的新书(尚未出版):《A Beginners Introduction to Computer Programming : You Can Do It!》。这也是Bjarne的推荐。Francis Glassborow是ACCU主席,多年来他对几乎每一本C++经典名著评头论足,他自己的这一本自然会引起C++社群的极大兴趣。
高效、健壮编程
两年前我在负责一个省级电力调度系统项目时编写了一个网关程序,它从SCADA系统获取电力实时信息。通讯接口采用了不常用的数据库直连方式(这个网关程序一端连接SQL Server 6.5,另一端连接Oralce 8.1.6)。由于实时测点近万,每次将全部取样更新或插入一遍显然是低效的。我在网关程序里建了一个内存库,获取到的数据首先在其中进行比较,然后决定是否更新物理数据库(同时还做了别的更复杂的事情……),从而在效率和资源占用两方面达到了预期效果。
这个程序一直运行得很好,但在离开现场之后的某一天,系统管理员打来电话,说大概因为网络故障等原因,有时这个网关程序会崩溃掉 — 它自己崩掉也就罢了,问题是它还会把Windows 2000 Advanced Server搞成“蓝屏”!坦白地说,我还从来没看过哪个非蓄意的程序有这个“能耐”。由于当时正忙于另外一个大项目,无法去现场调试,最后只有凭经验对内存库代码小心翼翼地封装以异常处理代码(同时也做了一些别的修改……)。这样,虽然没有彻底解决问题,但程序终究不再死得那么难看了。
在这儿讲这么一段花絮有什么意思呢(当初为那个可怕的bug朝思暮想时我可不认为这是一个“花絮”)?我想说的是,对于任何软件而言,离开强健,效率也就无从谈起。而对于C++程序员来说,也许编写一个高效的程序并不难,但要编写一个需要7 ⅹ 24小时持续运行的服务端软件就不是那么容易了,需要考虑许多因素,有时这些因素甚至远远超出C++语言和开发工具的本身。作为一名开发实际项目软件的程序员,并非非得自己碰钉子才能积累经验,只要我们足够虚心,别人的经验往往都是我们很好的借鉴。鉴于此,我推荐以下几本书供你选读,它们可以让你从强健和效率两方面受益(当然了,它们涵盖的内容远不限于异常处理J)。
Scott Meyers, Effective C++: 50 Specific Ways to Improve Your Programs and Design (2nd Edition)
Scott Meyers, More Effective C++: 35 New Ways to Improve Your Programs and Designs
《Effective C++中文版》,华中科技大学出版社
《More Effective C++中文版》,中国电力出版社
《Effective C++(影印版)》,中国电力出版社
如果说《Effective C++》主要讨论C++中一些相对基础的概念和技巧的话,那么《More Effective C++》则着重探讨了包括异常处理在内的一系列高级技术。与前者相比,后者具有两大主要区别:其一,它包含很多时新的标准C++的内容;第二,它讨论的主题倾向于“战略化”而非“战术化”,并且讨论得更深入、更彻底。尤其是对虚析构函数、智能指针、引用计数以及代理类(proxy classe)等技术和模式论述的深入程度,让人很难想象是出现于这样的一本小书之中。
游刃有余的技术,高超的写作技巧,Scott无疑是世界上最优秀的C++技术作家之一。在简洁、清晰、易读等方面,这两本书都卓尔不群。总之,Scott提供的这85个可以改善编程技术和设计思维的方法,都是中、高级C++程序员必备的技能。我强烈推荐这两本书(实际上还有一本,稍后就会看到)。
Herb Sutter, Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions
Herb Sutter, More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions
《Exceptional C++中文版》,中国电力出版社
《More Exceptional C++中文版》,华中科技大学出版社
你自认为是一名C++语言专家吗?读一读ISO C++标准委员会秘书长的这两本书再回答。在这两本书中,Herb采用了“问答”的方式指导你学习C++语言特性。对于每一个专题,Herb首先合理地设想出你的疑问和困惑,接着又猜测出你十有八九是错误的解答,然后给你以指点并提出最佳解决方案,最后还归纳出解决类似问题的普适性原则。
这两本书是典型的深究C++语言细节的著作,很薄,但内容密集,远远超过Scott的那两本书,读起来很费脑筋 — 我个人认为它们要比Scott的书难懂得多。若要研习这薄薄的两本书所包含的知识,至少需要花费数月的时间!(在Scott的荐序中,他坦陈不止一次陷入GotW问题的陷阱,你应该知道这意味着什么)对于语言细节的深究有什么好处呢?尽管在大多数情况下,我们不必关心C++代码幕后的动作,然而当我们不得不关心时,这两本书可以为我们提供很好的线索,因为它们揭示了C++语言中微妙而又至关重要的东西。
Stephen C. Dewhurst, C++ Gotchas: Avoiding Common Problems in Coding and Design
《C++程序设计陷阱》,中国青年出版社
Stephen的理论素养和实践经验注定这是一本值得一读的好书。Stephen曾经是贝尔实验室中第一批C++使用者。他已经使用C++成功解决了包括编译器、证券交易、电子商务以及嵌入式系统等领域中的问题。本书汇集了作者来自开发一线的99条编程真知灼见,洞悉它们,你可以避免几乎所有常见的C++设计和编程问题。
我甚至认为,对于C++编程菜鸟而言,阅读这本书会比阅读Scott和Herb的书更能轻松而立竿见影地获得更大的提高。我个人很喜欢这本书的写作风格 — Stephen的许多观点看似极端却无可辩驳。当然了,这种自信(以及冷幽默)来自于作者深厚的技术素养,而非自大的偏执。
除了上面推荐的书籍外,Dov Bulka和 David Mayhew合著的《Efficient C++: Performance Programming Techniques》(《提高C++性能的编程技术》,清华大学出版社)也值得一看。这本超薄小书聚焦于高性能C++应用程序开发。两位作者都是IBM软件专家,都工作于对性能要求极高的系统构建领域,本书是他们的经验之谈。也有人不喜欢这本书,因为它花了不少的篇幅讲述和C++无关的东西,我却恰恰因为这一点而对这本书产生好感,正是这些东西让我开阔了眼界。
模板和泛型编程
模板和基于模板的泛型编程无疑是当今发展最活跃的C++程序设计技术。模板的第一个革命性的应用是STL,它将模板技术在泛型容器和算法领域的运用展现得淋漓尽致,而Boost、Loki等现代程序库则将模板技术的潜能不断发挥到极致。在模板和泛型编程领域,我推荐以下两本重量级著作:
David Vandevoorde, Nicolai M. Josuttis, C++ Templates: The Complete Guide
《C++ Templates全览(繁体版)》,台湾碁峰资讯股份有限公司
《C++ Templates全览(简体版)》,人民邮电出版社
有一种老套的赞美一本书的手法,大致是“没有看过这本书,你就怎么怎么地”,这里面往往夸张的成分居多。不过,倘若说“没有看过《C++ Templates: The Complete Guide》,你就不可能精通C++模板编程”,那么这个论断对于世界上绝大多数C++程序员来说是成立的。
这本书填补了C++模板书籍领域由来已久的空白。此前,上有《Modern C++ Design》这样的专注于模板高级编程技术和泛型模式的著作,下有《The C++ Standard Library》这样的针对特定模板框架和组件的使用指南。然而,假如对模板机制缺乏深入的理解,你就很难“上下”自如。鉴于此,我向每一位渴望透彻理解C++模板技术的朋友推荐这本书。
这本书在内地、台湾各有一个译本,但出自不同的译者之手。当你看到这篇文章时,两个译本应该都已经上市,对于读者来说当然也就多了一种选择。侯捷先生个人网站上开放了繁体译本大部分章节,不妨先睹为快。
Andrei Alexandrescu, Modern C++ Design: Generic Programming and Design Patterns Applied
《C++设计新思维:泛型编程与设计模式之应用》,华中科技大学出版社
《C++设计新思维(影印版)》,中国电力出版社
你自认为是C++模板编程高手吗?请看过这本书再回答J 这是一本出自天才之手令人敬畏的杰作。泛型模式,无限延伸你的视野,足以挑战任何一名C++程序员的思维极限。
这本书共分为两大部分,第一部分讨论了 Loki程序库采用的基础技术以及一些高级语言特性,包括基于策略的类设计、模板局部特化、编译期断言、Typelist以及小型对象分配技术等。第二部分则着重介绍了Loki中的重要组件和泛型模式技术,包括泛化仿函数(Generalization Functor)、单件(Singleton)、智能指针、对象工厂(Object Factory)、抽象工厂(Abstract Factory)、访问者(Visitor)以及多方法(Multimethods)等。每一种技术都让人大开眼界,叹为观止。
在C++的学习方面,过犹不及往往成了不求甚解的借口。然而,面向对象并非C++的全部,模板和泛型编程亦占半壁江山。对于“严肃”的C++程序员而言,及时跟进这项早经例证的成功技术,不失为明智之举。
结语
这些著作是如此大名鼎鼎,也许根本不缺我一个推荐。然而,纵然C++程序员队伍的发展壮大速度不像其他更时髦的语言那样迅速,新人进总是多于旧人出。除了热忱地欢迎新人,我个人认为到了对C++书籍进行“盘点”的时候了,并且希望这样的“盘点”有益于感兴趣的读者。请保持耐心和宽厚。在下篇中,我将继续介绍标准库、网络编程以及其他方面的C++好书。有好书相伴,这个冬天不会冷。
荣耀
2004年1月
南京师范大学
下篇
我在上篇中“盘点”了TCPL和D&E以及入门教程、高效和健壮编程、模板和泛型编程等方面共十几本C++好书。冬去春来,让我们继续C++书籍精彩之旅J
标准库
当我还在研究院工作时,与同院另外两家研究所合作开发过一个大型水利枢纽调度集成项目。我们三家软件系统之间都要相互通信。在调试通讯模块时,细心的客户(一名好学的系统管理员)发现对于同一通信规约的解释代码,我的不超过30行,而对方的则超过了150行且很难看懂。这位系统管理员很纳闷,我说大家编程风格和习惯不一样,我使用了标准库,而他使用了传统C编程风格以及他所习惯的另外一些技术。
别误会!我绝无贬低这位合作伙伴的意思。事实上,我对那些真正有着深厚的C编程功力的程序员常常怀有钦佩之心。毕竟,C++能有今天的成功在很大程度上缘于它深深地植根于C。作为一名C++程序员,倘若不熟悉C++中的C,我往往会认为他的基本功是不扎实的,他的技术底气是不足的。
不过话又说回来,C++是一种多范型(paradigm)编程语言,具体采用哪种编程风格,专业程序员应该知道视具体情况而定。作为一名经常需要在现场做即兴开发的项目负责人,为了短平快地解决当务之急,我习惯尽量采用现有的库(和组件)。效率(以及强健性)久经验证的C++标准库已经摆在那儿了,何乐而不用呢?
Nicolai M. Josuttis, The C++ Standard Library: A Tutorial and Reference
《C++标准程序库:自修教程与参考手册》,华中科技大学出版社
这是一本百科全书式的C++标准库著作,是一本需要一再查阅的参考大全。它在完备性、细致性以及精确性方面都是无与伦比的。本书详细介绍了每一标准库组件的规格和用法,内容涵盖包括流和本地化在内的整个标准库而不仅仅是STL。正如本书副标题所示,它首先适合作为教程阅读,尔后又可用作参考手册。
浅显易懂的写作风格使得这本书非常易读。如果你希望学习标准库的用法并尽可能地发挥其潜能,那你必须拥有这本书。正如网络上所言,这本书不仅仅应该摆在你的书橱中,更应该放到你的电脑桌上。我向每一位职业C++程序员强烈推荐。
Angelika Langer, Klaus Kreft, Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference
《标准C++输入输出流与本地化》,人民邮电出版社
C++标准库由STL、流和本地化三部分构成。关于STL的书市面上已经有不少,但罕见流和本地化方面的专著。本书是这两个领域中最优秀的一本,迄今为止没有任何一本书比这一本更全面详尽地讨论了流和本地化。如果你不满足于停留在“会用”流库的层面,千万不要错过它。
2001年夏天,我草草翻阅过这本书的中文版,从内容到包装都给我留下了比较深刻的印象 — 不过负面的居多一些。2003年秋天,无意中得知某网络书店正以超低价格甩卖这本书的中译本,情不自禁,一阵唏嘘。
Scott Meyers, Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library
《Effective STL(影印版)》,中国电力出版社
读完Scott 的《Effective C++》和《More Effective C++》的中译本之后,我一直期待这本书的中文版。我从潘爱民先生的个人主页上了解到,他和他的合作伙伴似乎早已完成了这本书的翻译工作,可惜至今市面上仍不得见。幸运的是,我们可以看到它的原版。
本书是使用STL的程序员必读之作。在这本书中,Scott向我们讲述STL容器和算法的工作机制以及如何以最佳方式使用它们。和Scott的其他作品一样,这本书的写作风格清晰、精确,具有极佳的可读性。看过这本书以后,我想你也许会和我以及其他C++程序员一样产生这样的想法:Scott什么时候会写出一本“More Effective STL”?
关于STL,我还提醒你留心Matthew H. Austern的《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》(《泛型编程与STL》,中国电力出版社)。这本书散发着浓厚的学院气息。Andrew Koenig和Barbara Moo在《Accelerated C++: Practical Programming by Example》一书末尾郑重推荐另外两本进阶好书(除了他们自己的《Ruminations on C++》外),其中一本是TCPL,另外一本就是本书!
网络编程
在网络编程时代,C++应该扮演着怎样的角色,让ACE(Adaptive Communications Environment)来告诉你。
Douglas C. Schmidt, Stephen D. Huston, C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns
Douglas C. Schmidt, Stephen D. Huston, C++ Network Programming, Volume 2: Systematic Reuse with ACE and Frameworks
《C++网络编程,卷1:运用ACE和模式消除复杂性》,华中科技大学出版社
《C++网络编程,卷2:基于 ACE 和框架的系统化复用》,电子工业出版社
采用C++进行企业级网络编程,目前ACE(以及这两本书)是一个值得考虑的选择。ACE是一个面向对象、跨平台、开放源码的网络编程框架,目标在于构建高性能网络应用和中间件。Douglas是ACE的创始人,Stephen则已为ACE提供了数年的技术支持和顾问服务,两位都是ACE社群(是的,ACE的影响和实际应用的程度已经形成了一个社群)的专家。
ACE并不单单被大学和研究所追捧,它已经被成功地应用于世界上成千上万个商业应用中。在电信、宇航、医药和财经领域的网络系统中,ACE已经并继续发挥着重要的作用。如果你准备开发高性能通讯系统,你应该考虑考虑这一汇集世界顶尖专家智慧的成果。
除了使用C++面向对象设计技术和模板等高级语言特性外,ACE还运用了大量的模式。《C++网络编程》卷1和卷2并不仅仅教你关于ACE的方方面面,它还会教给你模式和通用框架设计等高级技术等。所以,作为一名中、高级C++程序员,即使你很少进行正儿八经的C++网络程序设计,阅读这两本书同样可以从中受益。
是的,并非所有网络应用都要使用Web服务器(以及其他应用服务器)和重量级组件模型,换个思路,它们或许也可以从轻量级的ACE组件中获益。
杂项
以下这几本书之所以被列入“杂项”单元,只是因为我没有考虑出更合适的归类方法,它们和上面的书籍一样,值得一读。
Bruce Eckel, Thinking in C++, Volume 1: Introduction to Standard C++ (2nd Edition)
Bruce Eckel, Thinking in C++, Volume 2: Practical Programming (Second Edition)
《C++编程思想(第2版)第1卷:标准C++导引》,机械工业出版社
《C++编程思想(英文版 第2版)》,机械工业出版社
《Thinking in C++》的第1版于1996年荣获“软件研发”杂志评选的图书震撼大奖。最新推出的第2版对内容进行了大幅改写和调整,以反映C++标准化带来的影响以及近几年面向对象领域最新研究和实践成果。“输入输入流”、“多重继承”、“异常处理”和“运行时类型识别”等高级主题连同C++标准化以后增加的一些内容则被放入第二卷中。Bruce是一名经验丰富的C++讲师和顾问,其培训和写作经验都是世界一流水准,他的作品比那些“玩票”的技术人员写的东西更能吸引读者。事实上,在同类图书中,对于大多数读者而言,这本书的可读性要超过TCPL和《C++ Primer》。顺带一提,访问作者的站点,你可以先睹第二卷的风采。
Andrew Koenig, Barbara E. Moo, Ruminations on C++: A Decade of Programming Insight and Experience
《C++沉思录》,人民邮电出版社
Andrew是世界上屈指可数的C++专家。这是一本关于C++编程思想和程序设计技术而非语言细节的著作。如果你已经具有一定的基础,这本书将教你在进行C++编程时应该怎样思考,应该如何表达解决方案。整本书技术表达透彻,文字通俗易懂。Bjarne这样评价这本书:本书遍布“C++是什么、C++能够做什么”的真知灼见。
Stanley B. Lippman, Inside The C++ Object Model
《深度探索C++对象模型》,华中科技大学出版社
《深度探索C++对象模型(影印版)》,中国电力出版社
从编译器的角度观察C++可以使你知其然并知其所以然。本书探讨了大量的C++面向对象程序设计的底层运作机制,包括构造函数、函数、临时对象、继承、虚拟、模板的实例化、异常处理、运行期类型识别等,另外还介绍了一些在实现C++对象模型过程中做出的权衡折衷。喜欢刨根问底的C++程序员不要错过这本书。
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object-Oriented software
《设计模式:可复用面向对象软件的基础》,机械工业出版社
《设计模式:可复用面向对象软件的基础(英文版)》,机械工业出版社
设计可复用的面向对象的软件,你需要掌握设计模式。本书并非专为C++程序员而写,但它采用了C++(以及Smalltalk)作为主要示例语言,C++程序员尤其易于从中受益。四位作者都是国际公认的面向对象软件领域专家,他们将面向对象软件的设计经验作为设计模式详细记录下来。这本书影响是如此深远,以至于四位作者以及本书都被昵称为GoF(Gang of Four)。本书学院气息浓厚,行文风格严谨简洁,虽然它不如某些讲解模式的书籍易读,但真正要精准地理解设计模式,本书是终极权威。学习设计模式,这本书需要一而再、再而三的咀嚼。顺带一句:请将设计模式化作开拓思维的钥匙,切莫成为封闭思维的枷锁。
还有一些C++好书值得一读,恕此处无法一一列出。例如John Lakos的著作《Large-Scale C++ Software Design》(《大规模C++程序设计》,中国电力出版社)和侯捷先生的《STL 源码剖析》(华中科技大学出版社)等。
《STL 源码剖析》是一本很有特色的书,但我认为它还可以更好。我个人期待侯捷先生自第一版发行以来经过对模板技术的沉淀和再思考之后,再写一本剖析得更深入、更透彻并且更全面的“第二版”。遗憾的是,侯捷先生在完成《C++ Templates: The Complete Guide》一书的翻译后似乎决定暂时告别模板、泛型编程和STL领域。
2004年3月31日补充:我目前最常查阅的两本参考书是《C++标准程序库》和《STL源码剖析》。当然了,这与我年内的写作计划有很大的关系。
使用C++成功开发大规模软件系统,不仅需要很好地理解大多数C++书籍中讲述的逻辑设计问题,更需要掌握《大规模C++程序设计》中讲述的物理设计技术。当然,这本书的确有点过时了,不过,如果你的精力和金钱都比较宽绰,买一本看看并无坏处。
至此,我想有必要声明一下,有一些(好)书没有得到推荐,主要原因如下:
* 以上这些书已经足够多、足够好了。
* 我不会推荐通过正常渠道很难购买到的书籍 — 不管是中文版还是英文版。
* 作(译)者名气大小不影响我的推荐。我们是在看书,不是看人。
* 我不会推荐我从来没有看过的书。我至少要看过其中的某个版本(包括电子档)。这个“看”,一般指“认真阅读”,不过有一些也只能算是“浏览”。
结语
作为一名普通技术写译者,我深知技术创作和翻译的艰辛(和快乐),并多多少少了解一些有关技术书籍创作、翻译、制作、出版以及市场推介背后的细节。今天,我不会再对一本看上去差强人意的图书信口开河。罗列同一本书的各种版本的用意只在于为你多提供一些信息,让你多一种选择。
在本文成文的后期,我给Bjarne写了一封信,请教如果他来写这篇文章会怎么写。他给了我简明扼要的建议。在肯定以上列出的绝大部分图书都是世界顶尖水平的C++著作的同时,Bjarne提醒我别忘了向专家级程序员推荐《The C++ Standard : Incorporating Technical Corrigendum No. 1》。这本书是 C++标准规范的“图书版”,Bjarne亲自为之作序。
Bjarne还友好地提醒我,在我的推荐列表中没有哪一本有助于C++程序员进行Windows编程 — 这正是我的本意。在这篇文章中,我只推荐、点评平台中立的C++著作(网络编程除外) — 和操作系统无关,和集成开发环境无关,我甚至幻想它们和编译器也无关。你可以根据业务开发需要,选读自己喜爱的领域相关的C++书籍。
说到“系统无关、平台中立”,我不由得想起了“抽象层”的概念。开发实际应用的C++程序员通常工作于特定操作系统、特定开发环境和特定业务领域之中,而对标准C++和C++标准库扎实而深刻的把握,无疑是你得以在不同的操作系统、不同的开发环境以及不同的业务领域之间纵横驰骋的“抽象”本钱。
荣耀
2004年1月
南京师范大学
[收藏]读博士的一点感受
from TsinghuaBBS
读博士人人都要经历一段很艰难的时候,所以国外把读博士的过程开玩笑为“Survive”。但是,我觉得这个“Survive”虽然是有很大挑战,需要镇定去承受,但是它是向上的、主动的和有希望的。
觉得在读博士期间,选择导师和增强自我学习能力很重要。
选择导师至少要看三点:(1)导师的人格。一般一个好的导师,他很谦虚、活跃、给博士生一个很宽松自由的研究氛围,并且很信任你,知道你一直在努力和刻苦工作;(2)导师研究方向、论文发表情况和项目。因为读博士很多时候会变成自我探索过程,在这个过程的初始,需要导师领进门,因此导师的研究方向中有你一个很感兴趣的题目,并且这个题目的确有很多可以做的地方,这样你才能有发挥的余地。要注意的是,很多导师的研究课题(主要指纵向课题)不可能保证给每个博士生一个,所以先进来的博士可能会起步早些。但是,我感到,其实一个纵向课题可以研究的地方很多,若干个人都可以找到可以独立研究方向,不需要讲,某个课题已经有个博士在做了,我要等个“全新”的课题。导师的论文发表情况之所以重要,是因为这表明他还是有时间在做学问。(3)导师是否有过几个很能干的学生。古人有话,“青出与蓝,而胜于蓝”。如果导师手下曾经出过几个很不错的学生,这至少给你一个信号,你也可以在将来成为很不错的学生。当然,一般而言,这些很不错的学生大多出国了。如果导师手下有在读的不错学生,至少可以有个讨论的环境。
读博士期间的自我学习能力也很重要:(1)有很多事情可以比导师发挥更大的作用。如Internet其实就是一个很好的导师。通过它,我们可以访问最好的国际会议,最好的研究所,你研究领域最好的导师以及PHD学生。如,做人工智能研究的同学,可以到MITAI站点(www.ai.mit.edu)Download一批很有价值的参考文献。跟踪国际高档次会议论文、Workshop论文很重要,它会反映你这个学科研究领域最新进展。你也可以通过www.google.com和www.researchindex.com找你需要的文献。一些大的公司,如Microsoft(www..research.microsoft.com)和IBM(www.research.microsoft.com)站点上,也会有一流研究人员研究成果的文章;(2)事在人为。自我学习能力还要求自己始终是一个主动的人。三年时间很快,自己要多花些时间,多在相关领域做些深入研究;(3)我觉得读博士是一个心情成长的过程,到最后,你的确知道where you are going和what you are doing,是一个自信心成长的过程。
要特别提醒的是,国内研究水平和国外差距很大。所以,你要始终知道,国外在你研究领域,目前主流方向是什么,最著名的会议是什么,最著名大学的研究所是什么,最著名的导师是谁,最活跃的几个博士生是谁。这样,你毕业后,就有进一步学习的动力了。
本科生直接读博士,肯定需要至少一年半时间来进行角色转换。不要着急,慢慢来就可以了。
写下上面这些感受,肯定有很多不对的地方,诚恳接受大家指正。
读博士人人都要经历一段很艰难的时候,所以国外把读博士的过程开玩笑为“Survive”。但是,我觉得这个“Survive”虽然是有很大挑战,需要镇定去承受,但是它是向上的、主动的和有希望的。
觉得在读博士期间,选择导师和增强自我学习能力很重要。
选择导师至少要看三点:(1)导师的人格。一般一个好的导师,他很谦虚、活跃、给博士生一个很宽松自由的研究氛围,并且很信任你,知道你一直在努力和刻苦工作;(2)导师研究方向、论文发表情况和项目。因为读博士很多时候会变成自我探索过程,在这个过程的初始,需要导师领进门,因此导师的研究方向中有你一个很感兴趣的题目,并且这个题目的确有很多可以做的地方,这样你才能有发挥的余地。要注意的是,很多导师的研究课题(主要指纵向课题)不可能保证给每个博士生一个,所以先进来的博士可能会起步早些。但是,我感到,其实一个纵向课题可以研究的地方很多,若干个人都可以找到可以独立研究方向,不需要讲,某个课题已经有个博士在做了,我要等个“全新”的课题。导师的论文发表情况之所以重要,是因为这表明他还是有时间在做学问。(3)导师是否有过几个很能干的学生。古人有话,“青出与蓝,而胜于蓝”。如果导师手下曾经出过几个很不错的学生,这至少给你一个信号,你也可以在将来成为很不错的学生。当然,一般而言,这些很不错的学生大多出国了。如果导师手下有在读的不错学生,至少可以有个讨论的环境。
读博士期间的自我学习能力也很重要:(1)有很多事情可以比导师发挥更大的作用。如Internet其实就是一个很好的导师。通过它,我们可以访问最好的国际会议,最好的研究所,你研究领域最好的导师以及PHD学生。如,做人工智能研究的同学,可以到MITAI站点(www.ai.mit.edu)Download一批很有价值的参考文献。跟踪国际高档次会议论文、Workshop论文很重要,它会反映你这个学科研究领域最新进展。你也可以通过www.google.com和www.researchindex.com找你需要的文献。一些大的公司,如Microsoft(www..research.microsoft.com)和IBM(www.research.microsoft.com)站点上,也会有一流研究人员研究成果的文章;(2)事在人为。自我学习能力还要求自己始终是一个主动的人。三年时间很快,自己要多花些时间,多在相关领域做些深入研究;(3)我觉得读博士是一个心情成长的过程,到最后,你的确知道where you are going和what you are doing,是一个自信心成长的过程。
要特别提醒的是,国内研究水平和国外差距很大。所以,你要始终知道,国外在你研究领域,目前主流方向是什么,最著名的会议是什么,最著名大学的研究所是什么,最著名的导师是谁,最活跃的几个博士生是谁。这样,你毕业后,就有进一步学习的动力了。
本科生直接读博士,肯定需要至少一年半时间来进行角色转换。不要着急,慢慢来就可以了。
写下上面这些感受,肯定有很多不对的地方,诚恳接受大家指正。
2006年11月1日
[收藏]女博士写实:为留校而读博
“学术和我的博士头衔无关”
“如果硕士就能留在高校当老师,我肯定不会继续读博。”当老师一直是郝严的愿望,留在高校对她来说更是一个理想。
今年刚开始念心理学博士研究生一年级的她,正一步步把这个理想变成现实。
在笔者的大量采访中,半数以上的女博士生表示,自己选择读博并没有什么宏大的理想,只是希望“能获得更高的生活质量”,同时,80%的女博士期望毕业之后能够留在高校工作。
郝严便是其中之一。虽然博士生的课业很辛苦,但她很满意自己目前的生活状态。“觉得会有一个自己喜欢的未来。三年的博士毕业之后,便能够成为高校教师,这对我来说实在是个诱惑。”
“高校教师”,对郝严和很多女博士生来说,的确是一个很好的职业选择。
在大部分女博士生眼里,“在高校”意味着一种很受女生欢迎的生活方式:更多的自由时间,更多的学习机会,良好的社会声誉,还有单纯安静的就业环境之类。对她们而言,“博士”是一个漂亮的头衔。
郝严说,“博士头衔和我要做的研究没有什么联系。学术上的追求在我看来和博士头衔无关,做研究的能力也不需要用这个头衔来证明。可现在我需要它,它能让我过上自己想要的生活。”
她补充说:“这就好比两个人相亲相爱,不用结婚也一样可以住在一起,过着亲密的生活,不需要去领一张结婚证来证明什么。但是如果想要得到法律保护和社会承认的话,结婚证是必不可少的。”
“博士头衔之于我未来的工作,就好比结婚证之于恋人间的法定关系。”她笑着说。
这个有趣的观点得到了大部分女博士的赞同。
读博的郝严有了更多的自信,她说这是一种“可进可退”的自信。“一方面能够留在高校,跟学生打交道,接触一些新鲜的课题,对心理研究肯定是有益处的。另一方面也可以出去参加一些社会公益活动,做一些课题研究,想回来的时候再回来。”
针对这一现象,北京大学中外妇女研究中心祖嘉合教授分析说:“在最近开展的一项女性角色的调查中,事业成功型、相夫教子型和两者兼顾型中,70%的女性希望自己成为第三种类型,既能在事业上获得成功,也能照顾好自己的家庭。”
祖教授分析说,“留在高校工作,在一定程度上能够使她们的这种愿望有得到实现的机会。一方面高校不用坐班,时间上有很大的自由;另一方面,也能兼顾自己的事业。事业和家庭能够很好兼顾,这就不难理解为什么很多女生为留高校而读博士了。”
两代女博士“大不同”
2004年,吴笛考上了中科院的博士生,研究生物遗传学,今年上二年级,论文、实验、工作一系列的压力已经扑面而来了。
吴笛的婆婆是上个世纪70年代的农学博士,退休之前是某农业大学的教授,是一位很有名的农学家,在杂交作物的研究上很有建树。
“走一步看一步”是吴笛经常挂在嘴边的话,她说工作和论文的压力让她渐渐对未来不抱太高的期望了。“当压力已经到了一个顶点之后,也就麻木了,再多的麻烦也觉得没有什么了。”
儿媳妇的压力让婆婆很不解,她不明白为什么现在的孩子好像读书越多反而越焦虑了。
“我们那时候怀着多大的学术热情啊,山坡上田地里的白菜萝卜,就像是自己的孩子一样”,婆婆说,“当时哪里想过那么多啊,什么工作啊待遇啊,国家会给安排的,完全不用为学术以外的东西费心。我们博士毕业的时候,简直就是指点江山,意气风发啊!现在的博士还真是不一样了。”
“越是不好的专业,博士越多。”吴笛这样埋怨。空闲的时候,吴笛会跟其他女博士生一起谈论一下未来的打算,在生物科技如日中天的时候,她们却觉得自己学的是“很不好”的专业。“平时不觉得,一到找工作的时候就显出来了。越不好找工作就越想往上读,博士越来越多也就不奇怪了。”
婆婆今年已经快70岁了,但是还经常受邀参加国内外的一些研讨会,日子过得满当当的。每当吴笛因为工作和试验压力不住地叹气时,丈夫就会打趣:“真纳闷,生活在同一个屋檐下的婆媳俩,都是博士,差别咋就那么大哩?”
吴笛说:“我也热爱自己的研究,否则不会想去大型的实验室锻炼自己,读博期间也学到了很多,但是压力却一直都在,而且从来没有觉得自己是精英。”
硕士研究生毕业后,吴笛曾试着在一家研究所工作过一段时间。试验室的那份工作惟一吸引吴笛的就是没有固定的作息时间,但是整天和瓶瓶罐罐打交道,一天也看不到几个人的工作让她觉得枯燥极了。
她很羡慕婆婆那种纯粹的状态,“我们俩一起在书房看书时,一个是呼啦啦地翻,一个是一行行地用手指着看。”
“她们那一代人有着很强的社会使命感,她的那种感觉让每一个人都觉得她很重要,仿佛没有她们,油菜花就开不好。和她比起来,我这个博士念得糊里糊涂。”
“我们现在需要考虑更多其他的问题,比如收入、生存,在这个都市中想过什么样的生活等等,所以只要学术上能跟得上别人,自己能过上喜欢的生活就好了。”
北大中外妇女研究中心的祖嘉合教授说:“上世纪六七十年代的人有着更浓厚的理想色彩。这是和社会整体环境分不开的,当时提倡‘男女都一样’的口号,虽然一定程度上抹杀了男女之间的性别差异,但是总体看来,那是一个充满激情的年代。而现在的市场经济,需要人们更多的考虑理想和现实的结合。”
在和国外一些研究机构的交流中,祖教授发现,中国以外的其他国家,女博士们也同样面临各种各样的压力。
“结了婚,经济上的压力小了,接着读博能多一个选择的机会。”去高校也是吴笛的期望,“一方面专业不会丢,还有更多跟学生接触的机会,我是个喜欢热闹的人。”
“女性似乎还是更适合感性一点的工作,我们的学科越到后来,需要的逻辑能力越强,优秀的女性研究者也有,但是相比男性而言,还是要少很多。”吴笛这样给自己下台阶。
“读博面前男女平等”
李晓蓬就要结束在北京语言大学的博士生生活了。语言信息处理的专业需要大量的数学知识和较好的编程能力,这让一直念文科的李晓蓬应付起来有些难度。
李晓蓬把自己的博士生女同学分为三种人,一种是已经有了很好的工作,一边读博一边工作,读博完全是为了再充电,在既有的岗位上得到更好的发展;一类是工作不如意,很多自己想要的东西没有,或者压力很大,读了博士能找到更好的工作,提高自己的生活质量;还有一种就是她这样的,“不知不觉地一直读了上来”。
李晓蓬读博前,并没有什么清晰的人生目标,既然一直在学校念书,就不妨按部就班念下去。这种生活,简单纯粹。谈到自己以后的打算,她说自己没有很大的为科学献身的精神。“可能我是一个比较务实的人。没有什么目标,但每一步都会走好,不管这一步有多小。”
她很喜欢韩剧《浪漫满屋》里面宋慧乔扮演的智恩。智恩虽然刚一开始生活就遇到坎坷,但她能够走好每一步,认真解决遇到的每一个困难。“她稀里糊涂挺可爱的,没有什么大的志向,但也还算是踏实,最后也很幸福,我挺喜欢她的。”
和李晓蓬比起来,同样来自农村的吴巧平,今年成为北京化工大学的博士生,她的读博目的就要明确很多:“在职场,女性的待遇显然不如男性,就业压力要大得多,而起码在读博面前人人平等。”
吴巧平的家乡是西部一个国家级贫困县。身为小学教师的父母一边种地一边教书才把她和妹妹供了出来。她们的妈妈说:“在中国,不管什么时候,多念点书都没有错。”
读博前,吴巧平曾在一家国有企业工作过,这是一段不愉快的工作经历。她说,虽然女性同样认真,但是社会上普遍还是把更多机会无条件地给了男性竞争者。她举例说:“我曾多次表示自己可以出差,但是公司从来没有给过我机会,而男同事在这方面显然占有更多的优势。公司里组织考察学习,向来都是派我的男同事去,我没有参加过自己感兴趣的研讨会,也没有机会直接接触新鲜技术。”
吴巧平亲身体会到,在职场上女性似乎天然处于劣势,从求职到发展机遇到继续深造,竞争激烈的职场总是青睐男性。
厦门大学人口研究所副所长叶文振说,大部分用人单位认为女性因生理特点会增加劳动成本,这无疑使得在同等条件下男性会有更多的发展机会。也就导致女性常常想要在其他方面提高自己,从而获得更多可以和男性竞争的优势。
巧平的妹妹吴巧燕今年要从美国的俄克拉何马大学博士毕业了,学的是机械自动化。“总想要不断提高自己,这一点我们姐妹俩很像。”
“本科毕业时,相同条件下不如其他男生,但是读了研就不一样了,博士毕业之后,应该更好一些。”
“由于社会上根深蒂固的男强女弱的观念,很多女性不得不降低自己的标准,女博士和男硕士竞争,女硕士和男本科竞争的现象不可能瞬间消除。在实际工作中,社会对男女的标准是一样的,女性需要不断地提高自己,这是一种对社会激烈竞争的应对,也可以理解为一种妥协。”祖嘉合教授这样说。
越洋电话里,除了互相叮嘱要经常锻炼保重身体之类,姐妹俩说的最多的就是未来。“我们总是想着毕业之后找份好工作,过更好的生活。我们互相鼓劲,肯定会有一个很好的未来的。”
“如果毕业之后能去高校当老师当然很好了,不丢专业,生活质量也更好。但是不去高校也行,找一份可以解决户口的工作,多挣点钱,早点把爸妈接到北京来。”
巧平坚信姐妹俩能够实现这样的愿望。“已经有学校开始想要巧燕来工作了。”
2006年10月31日
[收藏]读博士的一些技巧
[收藏]读博士的一些技巧
作者: zhangwei_cug 发布日期: 2006-9-14 查看数: 34 出自: http://emuch.net
大家好,突然想写些东西给准备读博士的朋友们看看!
现在硕士多了,很多人想读博士了,但很多人可能根本就不知道博士是怎么一回事就盲目随从。我觉得首先你得知道以下得几点你再考虑读不读博士。
1 认识自己。这个好像很可笑,但是很多人就是迷迷糊糊,根本就不能很好地定位自己。曾经一个朋友对我这样说,“我在一个地方连续待上2个小时就受不了了,想外出活动活动。我从南京坐车到上海,到后再坐车到北京,办完事后立即坐车回南京继续上班”。听了我深有感慨,我是不可能像他那样的。我能做着看书一个上午,做几个小时的车后就不舒服想睡觉休息。我想说的就是这个世界有365行,行行都需要人,但不是行行都需要博士的。但每个人都能生活得很好,行行都出状元。我那朋友可以说由于销售做得好不比一般得博士生活差,事实上薪水还要高。最重要得就是你首先得了解自己,自己擅长什么,缺点是什么,适合做什么样的工作。你既然已经是硕士了,也就是说做了科研了,你还热爱科研吗?你适合做这些工作吗?这些问题在读博士前你得想明白。
2 了解博士。这个其实也很重要,我觉得大多博士阶段出问题得人就是首先没有认识到这一点就盲目随从,反正硕士都读了,博士就接着上吧,殊不知慢慢地走进了自己制造的深渊。博士和硕士是不一样。硕士大多做横向课题,难度和要求一般都比较低,硕士的培养目标是能在厂家独立工作的科研人员。博士的培养目标是毕业后在自己所从事的领域有独到的见解和发现。一个硕士读100篇外文文献就够了,精读15篇左右。而一个博士至少需要读1000篇的外文文章,精读至少100篇。而且现在国内的大学都是这样的毕业博士需要SCI的文章一篇或几篇,硕士是不需要SCI的。我说明这些的原因就是说硕士博士要求不一样,对人的能力,意志,品质等综合素质的要求差别还是很大的。尤其做为博士你得静得下心来,你需要忍受更大的压力,需要耐得住寂寞。硕士课题可能查查CNKI就可以得到思路参考参考师兄师姐的就可以做出来了,但是博士课题你从CNKI上是查不出来的,你必须会查外文文献并从中得到启发,必须学会创新,而且必须有闪光点。所以你必须了解这些再做决定我适不适合读博士,我有这个潜力吗,我能不能忍受这一切。不然你可能慢慢走进自己制造的深渊,所以现实生活中有一部分博士上了后悔恨不断,最后以命相许的。这些案例能说明什么呢?你自己没有认识以上这些问题!
3 女生读博士。 这也是个热点问题。前不久称女博士是“灭绝师太”,这话可能过分,但是还是很形象的。至少我见过的几个女博士有一半的就是这样的,由于实验压力大,成天一个苦瓜脸。长期这样性格就古怪,找对象就有问题了。所以没有男朋友的女硕士是更不应该读博士的。(当然我这说的都是那些对自己严格要求的而不是来混文凭的)可能由于女士擅长形象思维而博士要求更高的逻辑思维,但男士一般都擅长逻辑思维而不擅长形象思维。这是大脑的差异造成的。所以我个人的意见是女士读硕士就可以了,不要再受罪读博士了。事实上我要求我朋友就是这样的,当时她读硕士的时候我看就把她折腾得够呛了,所以我不愿意她读博士,但她也从来不提想读博士。现在一个月3-4千我还是很满意的。上班后回家就休息看电视比我的日子舒服多了,不过我乐意看她这样。当然女强人还是有的,那就另当别论了。
4 博士工作。 博士毕业后的工作问题事实上也是个头疼的问题,不要认为你的就业面就一定好。我校的硕士,本科的就业好于博士。博士一般是到高校,研究所和大型科研单位,这样来看事实上就业面反而比硕士,本科窄。还有在市场经济的今天,单位前几年招聘博士当招牌的时代已经过去了,现在的老板很实在的,就看你能否给他带来效益。由于博士做的课题大多是基础型课题与实际应用差别还有较长的距离,你说老板是愿意招一个博士养着还是愿意招一个有工作经验的硕士或其它啊?答案是显而易见的。(当然博士做基础研究型课题这个问题还是很有意义的,不然我们中国就没有人真正搞基础研发了,但是博士的应用能力就不一定比有工作经验的硕士强) 还有高校的就业现在也不是很好,本科大扩招的年代已经过了,所以现在老师的需求可能相对比前几年少。还有高校的待遇确实不高,这个网上已经很多讨论了。仅仅因为以后收入高的想法读博士的人就要好好考虑考虑了,你还不如硕士毕业后马上工作积累实践经验,等你踏踏实实做几年后你的薪水绝对不少于博士了。
5 博士的好处。 上面说了很多好像叫大家不要读博士,事实上不是这个意思,只是想把大家比较模糊的有些问题辨正的看罢了。我们国家基础型理论研究与发达国家的差距应该是10-20年,没有理论的基础是不可能有原创型的发现的。所以在这个急需创新的年代还是很需要博士搞研究的,因为中国可以说80%以上的基础型研究都是博士在做。这是读博士的价值,可以说是社会价值吧。还有读了博士后你的起点确实是不一样,看问题办事情的思路也可能不一样,你的社会名誉也会不一样,毕竟是博士吗!这些都意味着你有更多的机会,更高的起点。
6 关于硕博连读 这个问题说实在话我个人是极力反对的。但是有些人以为捡到便宜,硕博连读多好啊,节省一年时间早工作多挣钱。殊不知科学的道路从来是没有捷径的,只有老老实实做科研才能终成大器。这也正式一般博后肯定不招自己的博士的原因所在。在同一个实验室,跟同一个老板,接触同一类的人,你认为真的对你的思维有很大的帮助吗?每一个人,包括你的导师都有自己的局限性。试想一下,你硕士博士在不同的老板手下读你的收获是不是应该更大呢?因为你接触到了不同的课题,不同的导师,不同的实验条件,不同人群的思维方式,那你的思维方式,解决问题的能力以及创新性等综合素质能比硕博连读的差吗?答案是明显的。真正想做学问的人就是应该踏踏实实地做,没有捷径,你必须学百家之长,你才能成为大家。科学灵感的火花从来都是不同思维的碰撞的结果,真正想做学问的你,想以后有所做为的你还会选择硕博连读吗?
7 博士的待遇 读博士的待遇现在是个热门的话题,我个人认为中国的在读博士大多数待遇太低了,很多不能维持基本的生活费。这种现实实在让人无法忍受。真正在中国做科研的人--博士的月收入比农民工还少,我现在的补贴(国家+老板的)不到350元,你说这博士怎么搞科研?中国科研水平差的部分原因你看出来了吧?中国的科研就是由这么一部分连基本生活费用都难以得到保障的人做出来的,这就是一部分博士生的现状,事实上这绝对是个得不偿失的待遇。所以现在有些博士生不能静下心来做研究,还做私活,有的甚至于做家教类的兼职工作,这都是生活所逼啊,我可以理解,毕竟大家“奔三”这个年龄不能支援父母还伸手要钱实在心里难受啊。这怨恨谁呢?但是这样明显会分散博士生的研究,这个问题是个很值得人深思的问题。当然我不否认中科院的博士生待遇一般会好一些!但下面的高校呢?这个问题也希望大家在读博前了解了解,毕竟是个很现实的问题!
以上说的都是本人有感身边的博士而写的,确实现在有些人对博士的认知存在问题。以上观点也仅为个人观点,仅供参考!
这是每一个面临读博的学生甚至开始读博的学生的困惑。
1.基本概念
博士:在美国叫A Doctor of Philosophy degree, 简称Ph.D.,是最高学位。
读一个博士需要做两件事:一是完全掌握一个科研领域,二是在这个领域开创新理论。
掌握一个科研领域
要通读所有这个领域的文献。一般开始时是看书,然后要找学术期刊杂志,会议论文和研究报告。
一般在读博之前,学校会有一些方法来考核你对某一个领域地掌握情况。比如要有相关专业本科或者硕士学位。然后,为了证明对本专业的了解,你需要修研究生专业课程,通过考试并确获得较高的平均分。最后还要通过一个评委会的考核(博士中期考核),评委都是博士。
开创新理论
博士和其它学位的本质区别就是一个字:科研(Research)。要开创一个理论,学生必须探索,调查,思考,总结。学术界用“科研”来表示这种行为。
“科研”经常暗示着要“实验”。但是科研绝不仅仅实验,还要解释和深层理解。
以计算机科学专业为例,科研意味着要探索并发现数字计算和通信领域的新法则。必须要发现帮助建立和使用计算机制的新技术。要寻找新抽象、新算法、新规则、新机制。
要获得博士学位,必须要写博士论文,并且通过博士论文口头答辩。
成果的关系
科研的成果可能可以开发新产品或者改善现有的。但是,博士论文的价值不是用商业效益来评价的。必须要引导将来的研究和知识体系。博士成果的效益常常不会在短期创造,而是在长期才慢慢体现。
2。问自己几个问题
决定是否要读博士之前,先问自己几个问题:
你想做科研工作吗?
你要考虑你的长期目标。因为PhD是训练你的科研能力。如果将来不做科研,博士不适合你。
你想进高校工作吗?
博士是进入高校任教的必要条件。
你有足够的能力吗?
评价一下自己是否有下述能力。
智力:显然
时间:往往比你想想的要长,你能承受吗?
创造力:读博需要你用新的思路看待问题。问问自己喜欢“脑筋急转弯”吗?你学高数时感到有意思吗?
好奇心:你是不是强烈的想知道周围事物背后的规律?
适应能力:读博常会出乎意料的困难。你可能会到一个没有人知道答案的领域。你能忍受郁闷吗?能忍受住找没人知道的答案时的枯燥吗?
自我驱动:教授不会告诉你怎么做。你能自己给自己长期科研的动力吗?
竞争能力:你将与最聪明的人共事,别人会将你与这些人比较。你扛得住吗?
成熟:读博时间大部分由你自己支配。你要自己安排自己的日程。
3。警告(博士不是。。)
让自己有声望:你毕业后,你周围每个同事都是博士。
保障自己观点正确:博士只在一个领域有权威。这并不代表所有领域的权威。
自己的目标:如果你只想要各文凭,很多方法都比这容易。
工作的保障:很多公司不要博士。即使要了,当公司不景气时先把科研部门砍掉。
让自己和家人更有面子:你妈可以很骄傲的说自己孩子是个博士。但这不是你读博的理由证明自己的聪明:你要长期从事枯燥的工作,多次面对失败,折磨你的意志。
将来就研究一个领域:一辈子只吃一碗饭?你将来要不停地科研,学习新方法、新理论
找工作更容易:搞笑!
比其它选择好:每个人都要决定自己究竟要什么,什么最能激励自己。
赚钱更多:至少5年之内你的收入是负的。除非你爱科研,否则这不是最好的赚钱方法。
4。还有几个好消息
如果你有能力和兴趣,搞科研将获得与所有其它工作不同的奖励。你能遇到这个星球上最聪明的人,甚至与他共事。你将不停的超越自己。你将解决以前从没有人解决的问题。你将改变人们的生活方式。
从上博士到现在工作已很多年了,帮老板国际国内也审了不少稿,先说国内的吧,我发现其实各地区的科研实力差距还是比较大的,从写的论文中就可以明显感觉出来。但是我认为这一点是我们无法避免的,因为这是老板决定的。但是有些稿件,我认为作者写作的态度有时会决定这篇文章的最终命运。因为一些稿件,很明显作者没有经过认真修改,文章中错别字时有出现格式错误频频,这样的稿件,审稿人一看心里就会有抵触作用,再加上本身内容又在可收可不收的范围,最终的命运大家可想而知,所以千万不要忽视这些细节问题,有时它往往能决定一篇文章的命运。我曾遇到过两三篇这样的文章,其中一篇我认为内容还行,但写了很多修改意见,老板看了后,说“这样的文章还能让它过?”所以给枪毙了。
再讲国际的,其实国际论文最重要的还是成果的新颖性,如果成果能让审稿人眼前一亮的话,那文章被接受的可能性很大。所以写作时,应该注意尽可能得把文章写得引人入胜些,当然最重要的还是成果。
就写这些吧,希望能对大家有所帮助。呵呵。
兵贵神速,先进的学术期刊除了学术水平的要求外,越来越注重发表的速度。这其实是符合投稿者的心愿的。但是如果方式不恰当,搞不好会弄个欲速则不达的结局。本人结合个人的发文经验,发表一点见解。本人两次投稿到JACS(IF>6.5) 均被拒,然后马上投稿到org.lett (IF>4) 都顺利接受发表,第二篇org.lett更是不到15天即被接受。能够顺利在较高档次期刊发文,主要得益于JACS审稿人的有益意见。从评审的意见来看,JACS的审稿人学术水平明显的高于org.lett的审稿人,因此经过JACS这样高水平期刊审稿人的点播,修改后改投低一点的期刊,成功率会大增。因此投文前要客观估计本论文的学术水平,然后投到高一两个档次的期刊上去,目的是要牛人的点播。毕竟得到高人指点的机会是不多的,而且发文不是目的,提高科研水平才是最终目标。经过这样一个和牛人的学术交流,个人的水平也会有长足的进步的。
1. 先看综述,后看论著
看综述搞清概念,看论著掌握方法
2. 早动手
在师兄师姐离开之前学会关键技术
3. 多数文章看摘要,少数文章看全文
掌握了一点查全文的技巧,往往会以搞到全文为乐,以至于没有时间看文章的内容,更不屑于看摘要。真正有用的全文并不多,过分追求全文是浪费,不可走极端。当然只看摘要也是不对的。
4. 集中时间看文献
看过总会遗忘。看文献的时间越分散,浪费时间越多。集中时间看更容易联系起来,形成整体印象。
5. 做好记录和标记
复印或打印的文献,直接用笔标记或批注。pdf 或html 格式的文献,可以用编辑器标亮或改变文字颜色。这是避免时间浪费的又一重要手段。否则等于没看。
6. 准备引用的文章要亲自看过。
转引造成的以讹传讹不胜枚举。
7. 注意文章的参考价值。
刊物的影响因子、文章的被引次数能反映文章的参考价值。但要注意引用这篇文章的其它文章是如何评价这篇文章的:支持还是反对,补充还是纠错。
8. 交流是最好的老师
做实验遇到困难是家常便饭。你的第一反应是什么?反复尝试?放弃?看书?这些做法都有道理,但首先应该想到的是交流。对有身份的人,私下的请教体现你对他的尊重;对同年资的人,公开的讨论可以使大家畅所欲言,而且出言谨慎。千万不能闭门造车。一个实验折腾半年,后来别人告诉你那是死路,岂不冤大头?
9. 最高层次的能力是表达能力
再好的工作最终都要靠别人认可。表达能力,体现为写和说的能力,是需要长期培养的素质。比如发现一个罕见病例,写好了发一篇论著;写不好只能发一个病例报道。比如做一个课题,写好了发一篇或数篇论著;写不好只能发一个论著摘要或被枪毙。一张图,一张表,无不是表达能力的体现。寥寥几百上千字的标书,可以赢得大笔基金;虽然关系很重要,但写得太差也不行。有人说,我不学PCR,不学spss,只要学会ppt(powerpoint)就可以了。此话有一点道理,实验室的boss 们表面上就是靠一串串ppt 行走江湖的。经常有研究生因思维敏捷条例清楚而令人肃然起敬。也经常有研究生不理解“为什么我做了大部分工作而老板却让另一个没怎么干活的人写了文章?让他去大会发言?”你没有看到人家有张口就来的本事吗?
10. 学好英语,不学二外。
如今不论去日本还是欧洲,学术交流早已是英语的天下。你不必为看不懂一篇法语的文章而遗憾,写那篇文章的人正在为没学好英语而犯愁。如果英文尚未精通,暂且不要去学二外。
英文文章写作
1. 阅读10 篇文献,总结100 个常用句型和常用短语。经常复习。注意,文献作者必须是以英文为母语者,文献内容要与你的专业有关。这属于平时看文献的副产品。
2. 找3-5 篇技术路线和统计方法与你的课题接近的文章,精读。
写出论文的草稿。要按照标题、作者、摘要、背景、目的、材料、方法、结果、讨论、致谢、参考文献、图例、图、表、照片和说明的统一格式来写。这样做的好处是从它可以方便地改成任何杂志的格式。
3. 针对论文的每一部分,尤其是某种具体方法、要讨论的某一具体方面,各找5-8 篇文献阅读,充实完善。 这里讨论的只涉及英文表达,也只推荐给缺乏英文写作经验的人。
4. 找到你想投的杂志的稿约,再找2-3 篇该杂志的article,按它的格式改写。注意,每次改写都要先另存为不同的文件名,以免出了问题不能恢复。
5. 找英文高手改。找不到合适的人,就去找提供英语论文编辑服务(English correction and improvement,not translation)的公司,在此向有钱没时间的人强烈推荐。
文献管理
1. 下载电子版文献时(caj,pdf,html),把文章题目粘贴为文件名。
注意,文件名不能有特殊符号,要把 \ / : * ? < > | 以及 换行符 删掉。 每次按照同样的习惯设置文件名,可以防止重复下载。
2. 不同主题存入不同文件夹。文件夹的题目要简短,如:PD,LTP,PKC,NO。
3. 看过的文献归入子文件夹,最起码要把有用的和没用的分开。
4. 重要文献根据重要程度在文件名前加001,002,003 编号,然后按名称排列图标,最重要的文献就排在最前了。
5. 复印或打印的文献,用打孔器(¥10-15)打孔,装入硬质文件夹(¥10-20/个)。
我们经常会在参考文献的引用上耍一些小聪明,殊不知这些都会降低论文质量。
1. 知而不引
明明借鉴了同行的类似工作,却故意不引用同行的类似工作,使自己工作看上去"新颖""领先"。实际上审稿的可能就是同行。
2. 断章取义
故意截取作者试图否定的部分来烘托自己的观点。
3. 引而不确
没有认真看原文,引文错漏。
4. 来源不实
某些字句来源不可靠(比如非正式的或非学术的出版物),且不注明来源。常见于一些统计数字。
5. 盲目自引
不是为了说明自己的工作与前期工作之间的关系,而是单纯为提高自己文章被引用次数而自引。
国内文章水平不高的几个原因:
1. 审稿人知识陈旧
年纪大的审稿人查文献和和上网的能力相当有限,无法核实该研究是否有意义,创新点在那里,方法是否可靠,结果是否可信。但匪夷所思的是他们经常提的审稿意见是"参考文献不够新"。
2. 选错审稿人
虽然一般指定两名审稿人,但编辑部经常让不懂分子生物学的人审分子生物学的文章,让不懂统计的人审统计处理比较复杂的文章。出于爱面子,很少有人提出"我不适合审这篇文章"。
3. 关系文章
有了关系,什么都简单了。
4. 不承认阴性结果
诚实的阴性结果被认为无意义。怪不得有人大声疾呼"我要办一本阴性杂志"。
5. 造假
任何人都不愿意成为制度的牺牲品。出不来预期结果就没法交差。为生存计,为按期毕业计,造吧。
动态的科研
1. 科研靠积累。
象伦琴发现X 射线那样凭借一次简单观察就得诺贝尔奖的机会越来越少。更多的科研成果来自于实验室长期积累。最终实至名归。做科研不要指望一步登天。设计课题不要好高骛远。基金评审也是这样。没有前期积累,获得资助的可能性小。选导师要想好:你是要白手起家,还是要为人作嫁?
2. 文献要追踪。
开题时通过查文献了解的情况,到结题的时候可能有很大不同。实验过程中要注意追踪。运气好,你可以得到更多的线索;运气不好,发现别人抢先了。据此修正你的实验。写论文之前一定要重新查一遍文献。
3. 记录要复习。
前面的实验记录要经常复习。随着经验的增加和认识的提高,你会发现最初的判断未必正确。
我曾经向一些比我有经验的人请教"什么是科研",他们没有正面回答我,只是给我打了五个比方。
1. 科研是流行歌曲
什么流行用什么,什么流行做什么。张口生物芯片,闭口纳米技术。老板是追星一族,流行的就是最好的。
2. 科研是移花接木
设计课题?课题怎么是设计出来的呢?是拼出来的。A 的材料,B 的方法,C 的指标,D 的意义。
3. 科研是傻瓜相机
原理搞不懂?恕我老朽,没时间看原理了。我能折腾,多折腾几次就出来了。为什么要做这一步?老板心里明白就行了!他每周安排的活儿我还干不完呢。
4. 科研是照葫芦画瓢
综述不会写?抄啊。论文不会写?套啊。反正不会有人追究。无知者无畏!
5. 科研是垃圾
实验完成了,论文发表了,答辩通过了。老板语重心长地说:"你们走后,这些都是垃圾"。
晕!倒!挣扎!再倒!
他们没有骗我,实用主义自有它的道理。但我从此不再随便批判国内的科研水平了,因为在某些时候我也重复着同样的故事。
写毕业论文
1. 先列提纲
不列提纲,上来就写,是坏习惯。几百字没问题,几千字勉强,几万字就难了。必须列出写作提纲,再充实完善,以保证思路的连贯和字数的均衡。
2. 平时多写
及时总结阶段性的工作,多写文章多投稿。到最后阶段,把这些文字有机地组合起来,就是一篇很好的毕业论文。
3. 不要罗列所有数据
为了保证毕业论文的分量,研究生往往会观测较多的指标。但毕业论文并非数据越多越好。一定要舍弃那些与主旨关系不大的数据。否则,要么显得累赘松散,要么成为破绽。
4. 打印修改
在电脑上直接修改,会遗漏很多错误。要尽可能地减少任何错误,一定要打印出来修改。
5. 让别人指出错误
自己修改,仍然受个人习惯的局限。错误摆在那里,却熟视无睹。让别人给你指出错误吧,不管他与你是不是同一专业。
怎样读文献
1. 目标:
漫无目的则毫无效率,抓不住重点才效率低下。选题之前可能会有一段时间处于迷茫状态,不知从哪入手。胡乱看了大量文献,却不知所以然。在导师的指导下,在同行的启发下,有些人可以迅速明确目标,有的放矢,入门就从这里开始。即使导师不导,没有定题,自己也要先设定一个具体的问题看文献。不管你将来做不做这些东西,总比没有目标好得多,保证有收获。科研的一般法则是共通的。
2. 层次:
对于一个具体的课题来说,相关文献分属于三个层次:研究方向、研究领域、研究课题。例如有人研究干细胞定向分化治疗帕金森病,对他来说,研究方向就是帕金森病,研究领域是帕金森病的干细胞治疗,研究课题是某种物质诱导干细胞定向分化为分泌多巴胺的神经细胞。看文献时要分清手上的文献是属于那个层次,这决定你对它要掌握到什么程度。
研究方向层次的文献:一般涉及,基础知识,学科水准,了解当前重大进展与趋势,达到专业人员水平;
研究领域层次的文献:了解焦点与热点,已/正/将进行的课题,达到专家水平;
研究课题层次的文献:要全面,了解历史、现状、展望、主要方法、手段,达到No1专家水平。
正确分辨文章的层次,才能把精力用到点子上。
3. 形式:
广义的文献包括可以阅读的所有出版形式。教科书、专著、会议摘要汇编、期刊、网页、甚至ppt文件。比如要了解免疫应答的基本形式,最好是看教科书;要参考大鼠脑立体定位图谱,最好是看专著;要知道最新进展,最好是查阅期刊;要了解别人的研究动向,最好是参会或看会议论文汇编。不要找错信息源。
4. 程度:
对文献的熟悉程度不同,阅读文献的方式大不相同。新手学习式阅读,逐字逐句,搞清细节,掌握最基本的知识点。最初的十几、几十篇要精读,精华的几篇甚至要背诵。老手搜索式阅读,已熟悉各种研究的常见模式和一般套路,能够迅速提取关键信息,把握思路,经常不按常规顺序阅读。有人看图说话,有人辨数识字。高手批判式阅读,一针见血,直指问题所在。实际上没有一篇论文是无懈可击的。新手要稳,老手要准,高手要狠。新手、老手、高手的代表人物分别是研究生、导师和审稿人,但认真钻研的研究生完全可以在3年中实现从新手到高手的嬗变。对自己有清醒的定位,才能选择正确的阅读方式。
5. 矛盾:
文献读的多了,脑子里塞满了信息。公说公有理,婆说婆有理,反而无所适从?为了解决这个问题,循证医学划分临床试验证据的等级;同理,我们看文献也要重视实验证据的强度。发现矛盾,是第一步;找出异同,是第二步;思考解决,是第三步。从相互矛盾的结论推导中发现矛盾的根源,此时如能跳出圈外,不走思维定势,从原始的科学问题出发,"无招胜有招",真正是到达另外一种境界了。何必翻译外国人的综述谎称自己的综述?何必重复别人做过的实验谎称自己的思路?
作者: zhangwei_cug 发布日期: 2006-9-14 查看数: 34 出自: http://emuch.net
大家好,突然想写些东西给准备读博士的朋友们看看!
现在硕士多了,很多人想读博士了,但很多人可能根本就不知道博士是怎么一回事就盲目随从。我觉得首先你得知道以下得几点你再考虑读不读博士。
1 认识自己。这个好像很可笑,但是很多人就是迷迷糊糊,根本就不能很好地定位自己。曾经一个朋友对我这样说,“我在一个地方连续待上2个小时就受不了了,想外出活动活动。我从南京坐车到上海,到后再坐车到北京,办完事后立即坐车回南京继续上班”。听了我深有感慨,我是不可能像他那样的。我能做着看书一个上午,做几个小时的车后就不舒服想睡觉休息。我想说的就是这个世界有365行,行行都需要人,但不是行行都需要博士的。但每个人都能生活得很好,行行都出状元。我那朋友可以说由于销售做得好不比一般得博士生活差,事实上薪水还要高。最重要得就是你首先得了解自己,自己擅长什么,缺点是什么,适合做什么样的工作。你既然已经是硕士了,也就是说做了科研了,你还热爱科研吗?你适合做这些工作吗?这些问题在读博士前你得想明白。
2 了解博士。这个其实也很重要,我觉得大多博士阶段出问题得人就是首先没有认识到这一点就盲目随从,反正硕士都读了,博士就接着上吧,殊不知慢慢地走进了自己制造的深渊。博士和硕士是不一样。硕士大多做横向课题,难度和要求一般都比较低,硕士的培养目标是能在厂家独立工作的科研人员。博士的培养目标是毕业后在自己所从事的领域有独到的见解和发现。一个硕士读100篇外文文献就够了,精读15篇左右。而一个博士至少需要读1000篇的外文文章,精读至少100篇。而且现在国内的大学都是这样的毕业博士需要SCI的文章一篇或几篇,硕士是不需要SCI的。我说明这些的原因就是说硕士博士要求不一样,对人的能力,意志,品质等综合素质的要求差别还是很大的。尤其做为博士你得静得下心来,你需要忍受更大的压力,需要耐得住寂寞。硕士课题可能查查CNKI就可以得到思路参考参考师兄师姐的就可以做出来了,但是博士课题你从CNKI上是查不出来的,你必须会查外文文献并从中得到启发,必须学会创新,而且必须有闪光点。所以你必须了解这些再做决定我适不适合读博士,我有这个潜力吗,我能不能忍受这一切。不然你可能慢慢走进自己制造的深渊,所以现实生活中有一部分博士上了后悔恨不断,最后以命相许的。这些案例能说明什么呢?你自己没有认识以上这些问题!
3 女生读博士。 这也是个热点问题。前不久称女博士是“灭绝师太”,这话可能过分,但是还是很形象的。至少我见过的几个女博士有一半的就是这样的,由于实验压力大,成天一个苦瓜脸。长期这样性格就古怪,找对象就有问题了。所以没有男朋友的女硕士是更不应该读博士的。(当然我这说的都是那些对自己严格要求的而不是来混文凭的)可能由于女士擅长形象思维而博士要求更高的逻辑思维,但男士一般都擅长逻辑思维而不擅长形象思维。这是大脑的差异造成的。所以我个人的意见是女士读硕士就可以了,不要再受罪读博士了。事实上我要求我朋友就是这样的,当时她读硕士的时候我看就把她折腾得够呛了,所以我不愿意她读博士,但她也从来不提想读博士。现在一个月3-4千我还是很满意的。上班后回家就休息看电视比我的日子舒服多了,不过我乐意看她这样。当然女强人还是有的,那就另当别论了。
4 博士工作。 博士毕业后的工作问题事实上也是个头疼的问题,不要认为你的就业面就一定好。我校的硕士,本科的就业好于博士。博士一般是到高校,研究所和大型科研单位,这样来看事实上就业面反而比硕士,本科窄。还有在市场经济的今天,单位前几年招聘博士当招牌的时代已经过去了,现在的老板很实在的,就看你能否给他带来效益。由于博士做的课题大多是基础型课题与实际应用差别还有较长的距离,你说老板是愿意招一个博士养着还是愿意招一个有工作经验的硕士或其它啊?答案是显而易见的。(当然博士做基础研究型课题这个问题还是很有意义的,不然我们中国就没有人真正搞基础研发了,但是博士的应用能力就不一定比有工作经验的硕士强) 还有高校的就业现在也不是很好,本科大扩招的年代已经过了,所以现在老师的需求可能相对比前几年少。还有高校的待遇确实不高,这个网上已经很多讨论了。仅仅因为以后收入高的想法读博士的人就要好好考虑考虑了,你还不如硕士毕业后马上工作积累实践经验,等你踏踏实实做几年后你的薪水绝对不少于博士了。
5 博士的好处。 上面说了很多好像叫大家不要读博士,事实上不是这个意思,只是想把大家比较模糊的有些问题辨正的看罢了。我们国家基础型理论研究与发达国家的差距应该是10-20年,没有理论的基础是不可能有原创型的发现的。所以在这个急需创新的年代还是很需要博士搞研究的,因为中国可以说80%以上的基础型研究都是博士在做。这是读博士的价值,可以说是社会价值吧。还有读了博士后你的起点确实是不一样,看问题办事情的思路也可能不一样,你的社会名誉也会不一样,毕竟是博士吗!这些都意味着你有更多的机会,更高的起点。
6 关于硕博连读 这个问题说实在话我个人是极力反对的。但是有些人以为捡到便宜,硕博连读多好啊,节省一年时间早工作多挣钱。殊不知科学的道路从来是没有捷径的,只有老老实实做科研才能终成大器。这也正式一般博后肯定不招自己的博士的原因所在。在同一个实验室,跟同一个老板,接触同一类的人,你认为真的对你的思维有很大的帮助吗?每一个人,包括你的导师都有自己的局限性。试想一下,你硕士博士在不同的老板手下读你的收获是不是应该更大呢?因为你接触到了不同的课题,不同的导师,不同的实验条件,不同人群的思维方式,那你的思维方式,解决问题的能力以及创新性等综合素质能比硕博连读的差吗?答案是明显的。真正想做学问的人就是应该踏踏实实地做,没有捷径,你必须学百家之长,你才能成为大家。科学灵感的火花从来都是不同思维的碰撞的结果,真正想做学问的你,想以后有所做为的你还会选择硕博连读吗?
7 博士的待遇 读博士的待遇现在是个热门的话题,我个人认为中国的在读博士大多数待遇太低了,很多不能维持基本的生活费。这种现实实在让人无法忍受。真正在中国做科研的人--博士的月收入比农民工还少,我现在的补贴(国家+老板的)不到350元,你说这博士怎么搞科研?中国科研水平差的部分原因你看出来了吧?中国的科研就是由这么一部分连基本生活费用都难以得到保障的人做出来的,这就是一部分博士生的现状,事实上这绝对是个得不偿失的待遇。所以现在有些博士生不能静下心来做研究,还做私活,有的甚至于做家教类的兼职工作,这都是生活所逼啊,我可以理解,毕竟大家“奔三”这个年龄不能支援父母还伸手要钱实在心里难受啊。这怨恨谁呢?但是这样明显会分散博士生的研究,这个问题是个很值得人深思的问题。当然我不否认中科院的博士生待遇一般会好一些!但下面的高校呢?这个问题也希望大家在读博前了解了解,毕竟是个很现实的问题!
以上说的都是本人有感身边的博士而写的,确实现在有些人对博士的认知存在问题。以上观点也仅为个人观点,仅供参考!
这是每一个面临读博的学生甚至开始读博的学生的困惑。
1.基本概念
博士:在美国叫A Doctor of Philosophy degree, 简称Ph.D.,是最高学位。
读一个博士需要做两件事:一是完全掌握一个科研领域,二是在这个领域开创新理论。
掌握一个科研领域
要通读所有这个领域的文献。一般开始时是看书,然后要找学术期刊杂志,会议论文和研究报告。
一般在读博之前,学校会有一些方法来考核你对某一个领域地掌握情况。比如要有相关专业本科或者硕士学位。然后,为了证明对本专业的了解,你需要修研究生专业课程,通过考试并确获得较高的平均分。最后还要通过一个评委会的考核(博士中期考核),评委都是博士。
开创新理论
博士和其它学位的本质区别就是一个字:科研(Research)。要开创一个理论,学生必须探索,调查,思考,总结。学术界用“科研”来表示这种行为。
“科研”经常暗示着要“实验”。但是科研绝不仅仅实验,还要解释和深层理解。
以计算机科学专业为例,科研意味着要探索并发现数字计算和通信领域的新法则。必须要发现帮助建立和使用计算机制的新技术。要寻找新抽象、新算法、新规则、新机制。
要获得博士学位,必须要写博士论文,并且通过博士论文口头答辩。
成果的关系
科研的成果可能可以开发新产品或者改善现有的。但是,博士论文的价值不是用商业效益来评价的。必须要引导将来的研究和知识体系。博士成果的效益常常不会在短期创造,而是在长期才慢慢体现。
2。问自己几个问题
决定是否要读博士之前,先问自己几个问题:
你想做科研工作吗?
你要考虑你的长期目标。因为PhD是训练你的科研能力。如果将来不做科研,博士不适合你。
你想进高校工作吗?
博士是进入高校任教的必要条件。
你有足够的能力吗?
评价一下自己是否有下述能力。
智力:显然
时间:往往比你想想的要长,你能承受吗?
创造力:读博需要你用新的思路看待问题。问问自己喜欢“脑筋急转弯”吗?你学高数时感到有意思吗?
好奇心:你是不是强烈的想知道周围事物背后的规律?
适应能力:读博常会出乎意料的困难。你可能会到一个没有人知道答案的领域。你能忍受郁闷吗?能忍受住找没人知道的答案时的枯燥吗?
自我驱动:教授不会告诉你怎么做。你能自己给自己长期科研的动力吗?
竞争能力:你将与最聪明的人共事,别人会将你与这些人比较。你扛得住吗?
成熟:读博时间大部分由你自己支配。你要自己安排自己的日程。
3。警告(博士不是。。)
让自己有声望:你毕业后,你周围每个同事都是博士。
保障自己观点正确:博士只在一个领域有权威。这并不代表所有领域的权威。
自己的目标:如果你只想要各文凭,很多方法都比这容易。
工作的保障:很多公司不要博士。即使要了,当公司不景气时先把科研部门砍掉。
让自己和家人更有面子:你妈可以很骄傲的说自己孩子是个博士。但这不是你读博的理由证明自己的聪明:你要长期从事枯燥的工作,多次面对失败,折磨你的意志。
将来就研究一个领域:一辈子只吃一碗饭?你将来要不停地科研,学习新方法、新理论
找工作更容易:搞笑!
比其它选择好:每个人都要决定自己究竟要什么,什么最能激励自己。
赚钱更多:至少5年之内你的收入是负的。除非你爱科研,否则这不是最好的赚钱方法。
4。还有几个好消息
如果你有能力和兴趣,搞科研将获得与所有其它工作不同的奖励。你能遇到这个星球上最聪明的人,甚至与他共事。你将不停的超越自己。你将解决以前从没有人解决的问题。你将改变人们的生活方式。
从上博士到现在工作已很多年了,帮老板国际国内也审了不少稿,先说国内的吧,我发现其实各地区的科研实力差距还是比较大的,从写的论文中就可以明显感觉出来。但是我认为这一点是我们无法避免的,因为这是老板决定的。但是有些稿件,我认为作者写作的态度有时会决定这篇文章的最终命运。因为一些稿件,很明显作者没有经过认真修改,文章中错别字时有出现格式错误频频,这样的稿件,审稿人一看心里就会有抵触作用,再加上本身内容又在可收可不收的范围,最终的命运大家可想而知,所以千万不要忽视这些细节问题,有时它往往能决定一篇文章的命运。我曾遇到过两三篇这样的文章,其中一篇我认为内容还行,但写了很多修改意见,老板看了后,说“这样的文章还能让它过?”所以给枪毙了。
再讲国际的,其实国际论文最重要的还是成果的新颖性,如果成果能让审稿人眼前一亮的话,那文章被接受的可能性很大。所以写作时,应该注意尽可能得把文章写得引人入胜些,当然最重要的还是成果。
就写这些吧,希望能对大家有所帮助。呵呵。
兵贵神速,先进的学术期刊除了学术水平的要求外,越来越注重发表的速度。这其实是符合投稿者的心愿的。但是如果方式不恰当,搞不好会弄个欲速则不达的结局。本人结合个人的发文经验,发表一点见解。本人两次投稿到JACS(IF>6.5) 均被拒,然后马上投稿到org.lett (IF>4) 都顺利接受发表,第二篇org.lett更是不到15天即被接受。能够顺利在较高档次期刊发文,主要得益于JACS审稿人的有益意见。从评审的意见来看,JACS的审稿人学术水平明显的高于org.lett的审稿人,因此经过JACS这样高水平期刊审稿人的点播,修改后改投低一点的期刊,成功率会大增。因此投文前要客观估计本论文的学术水平,然后投到高一两个档次的期刊上去,目的是要牛人的点播。毕竟得到高人指点的机会是不多的,而且发文不是目的,提高科研水平才是最终目标。经过这样一个和牛人的学术交流,个人的水平也会有长足的进步的。
1. 先看综述,后看论著
看综述搞清概念,看论著掌握方法
2. 早动手
在师兄师姐离开之前学会关键技术
3. 多数文章看摘要,少数文章看全文
掌握了一点查全文的技巧,往往会以搞到全文为乐,以至于没有时间看文章的内容,更不屑于看摘要。真正有用的全文并不多,过分追求全文是浪费,不可走极端。当然只看摘要也是不对的。
4. 集中时间看文献
看过总会遗忘。看文献的时间越分散,浪费时间越多。集中时间看更容易联系起来,形成整体印象。
5. 做好记录和标记
复印或打印的文献,直接用笔标记或批注。pdf 或html 格式的文献,可以用编辑器标亮或改变文字颜色。这是避免时间浪费的又一重要手段。否则等于没看。
6. 准备引用的文章要亲自看过。
转引造成的以讹传讹不胜枚举。
7. 注意文章的参考价值。
刊物的影响因子、文章的被引次数能反映文章的参考价值。但要注意引用这篇文章的其它文章是如何评价这篇文章的:支持还是反对,补充还是纠错。
8. 交流是最好的老师
做实验遇到困难是家常便饭。你的第一反应是什么?反复尝试?放弃?看书?这些做法都有道理,但首先应该想到的是交流。对有身份的人,私下的请教体现你对他的尊重;对同年资的人,公开的讨论可以使大家畅所欲言,而且出言谨慎。千万不能闭门造车。一个实验折腾半年,后来别人告诉你那是死路,岂不冤大头?
9. 最高层次的能力是表达能力
再好的工作最终都要靠别人认可。表达能力,体现为写和说的能力,是需要长期培养的素质。比如发现一个罕见病例,写好了发一篇论著;写不好只能发一个病例报道。比如做一个课题,写好了发一篇或数篇论著;写不好只能发一个论著摘要或被枪毙。一张图,一张表,无不是表达能力的体现。寥寥几百上千字的标书,可以赢得大笔基金;虽然关系很重要,但写得太差也不行。有人说,我不学PCR,不学spss,只要学会ppt(powerpoint)就可以了。此话有一点道理,实验室的boss 们表面上就是靠一串串ppt 行走江湖的。经常有研究生因思维敏捷条例清楚而令人肃然起敬。也经常有研究生不理解“为什么我做了大部分工作而老板却让另一个没怎么干活的人写了文章?让他去大会发言?”你没有看到人家有张口就来的本事吗?
10. 学好英语,不学二外。
如今不论去日本还是欧洲,学术交流早已是英语的天下。你不必为看不懂一篇法语的文章而遗憾,写那篇文章的人正在为没学好英语而犯愁。如果英文尚未精通,暂且不要去学二外。
英文文章写作
1. 阅读10 篇文献,总结100 个常用句型和常用短语。经常复习。注意,文献作者必须是以英文为母语者,文献内容要与你的专业有关。这属于平时看文献的副产品。
2. 找3-5 篇技术路线和统计方法与你的课题接近的文章,精读。
写出论文的草稿。要按照标题、作者、摘要、背景、目的、材料、方法、结果、讨论、致谢、参考文献、图例、图、表、照片和说明的统一格式来写。这样做的好处是从它可以方便地改成任何杂志的格式。
3. 针对论文的每一部分,尤其是某种具体方法、要讨论的某一具体方面,各找5-8 篇文献阅读,充实完善。 这里讨论的只涉及英文表达,也只推荐给缺乏英文写作经验的人。
4. 找到你想投的杂志的稿约,再找2-3 篇该杂志的article,按它的格式改写。注意,每次改写都要先另存为不同的文件名,以免出了问题不能恢复。
5. 找英文高手改。找不到合适的人,就去找提供英语论文编辑服务(English correction and improvement,not translation)的公司,在此向有钱没时间的人强烈推荐。
文献管理
1. 下载电子版文献时(caj,pdf,html),把文章题目粘贴为文件名。
注意,文件名不能有特殊符号,要把 \ / : * ? < > | 以及 换行符 删掉。 每次按照同样的习惯设置文件名,可以防止重复下载。
2. 不同主题存入不同文件夹。文件夹的题目要简短,如:PD,LTP,PKC,NO。
3. 看过的文献归入子文件夹,最起码要把有用的和没用的分开。
4. 重要文献根据重要程度在文件名前加001,002,003 编号,然后按名称排列图标,最重要的文献就排在最前了。
5. 复印或打印的文献,用打孔器(¥10-15)打孔,装入硬质文件夹(¥10-20/个)。
我们经常会在参考文献的引用上耍一些小聪明,殊不知这些都会降低论文质量。
1. 知而不引
明明借鉴了同行的类似工作,却故意不引用同行的类似工作,使自己工作看上去"新颖""领先"。实际上审稿的可能就是同行。
2. 断章取义
故意截取作者试图否定的部分来烘托自己的观点。
3. 引而不确
没有认真看原文,引文错漏。
4. 来源不实
某些字句来源不可靠(比如非正式的或非学术的出版物),且不注明来源。常见于一些统计数字。
5. 盲目自引
不是为了说明自己的工作与前期工作之间的关系,而是单纯为提高自己文章被引用次数而自引。
国内文章水平不高的几个原因:
1. 审稿人知识陈旧
年纪大的审稿人查文献和和上网的能力相当有限,无法核实该研究是否有意义,创新点在那里,方法是否可靠,结果是否可信。但匪夷所思的是他们经常提的审稿意见是"参考文献不够新"。
2. 选错审稿人
虽然一般指定两名审稿人,但编辑部经常让不懂分子生物学的人审分子生物学的文章,让不懂统计的人审统计处理比较复杂的文章。出于爱面子,很少有人提出"我不适合审这篇文章"。
3. 关系文章
有了关系,什么都简单了。
4. 不承认阴性结果
诚实的阴性结果被认为无意义。怪不得有人大声疾呼"我要办一本阴性杂志"。
5. 造假
任何人都不愿意成为制度的牺牲品。出不来预期结果就没法交差。为生存计,为按期毕业计,造吧。
动态的科研
1. 科研靠积累。
象伦琴发现X 射线那样凭借一次简单观察就得诺贝尔奖的机会越来越少。更多的科研成果来自于实验室长期积累。最终实至名归。做科研不要指望一步登天。设计课题不要好高骛远。基金评审也是这样。没有前期积累,获得资助的可能性小。选导师要想好:你是要白手起家,还是要为人作嫁?
2. 文献要追踪。
开题时通过查文献了解的情况,到结题的时候可能有很大不同。实验过程中要注意追踪。运气好,你可以得到更多的线索;运气不好,发现别人抢先了。据此修正你的实验。写论文之前一定要重新查一遍文献。
3. 记录要复习。
前面的实验记录要经常复习。随着经验的增加和认识的提高,你会发现最初的判断未必正确。
我曾经向一些比我有经验的人请教"什么是科研",他们没有正面回答我,只是给我打了五个比方。
1. 科研是流行歌曲
什么流行用什么,什么流行做什么。张口生物芯片,闭口纳米技术。老板是追星一族,流行的就是最好的。
2. 科研是移花接木
设计课题?课题怎么是设计出来的呢?是拼出来的。A 的材料,B 的方法,C 的指标,D 的意义。
3. 科研是傻瓜相机
原理搞不懂?恕我老朽,没时间看原理了。我能折腾,多折腾几次就出来了。为什么要做这一步?老板心里明白就行了!他每周安排的活儿我还干不完呢。
4. 科研是照葫芦画瓢
综述不会写?抄啊。论文不会写?套啊。反正不会有人追究。无知者无畏!
5. 科研是垃圾
实验完成了,论文发表了,答辩通过了。老板语重心长地说:"你们走后,这些都是垃圾"。
晕!倒!挣扎!再倒!
他们没有骗我,实用主义自有它的道理。但我从此不再随便批判国内的科研水平了,因为在某些时候我也重复着同样的故事。
写毕业论文
1. 先列提纲
不列提纲,上来就写,是坏习惯。几百字没问题,几千字勉强,几万字就难了。必须列出写作提纲,再充实完善,以保证思路的连贯和字数的均衡。
2. 平时多写
及时总结阶段性的工作,多写文章多投稿。到最后阶段,把这些文字有机地组合起来,就是一篇很好的毕业论文。
3. 不要罗列所有数据
为了保证毕业论文的分量,研究生往往会观测较多的指标。但毕业论文并非数据越多越好。一定要舍弃那些与主旨关系不大的数据。否则,要么显得累赘松散,要么成为破绽。
4. 打印修改
在电脑上直接修改,会遗漏很多错误。要尽可能地减少任何错误,一定要打印出来修改。
5. 让别人指出错误
自己修改,仍然受个人习惯的局限。错误摆在那里,却熟视无睹。让别人给你指出错误吧,不管他与你是不是同一专业。
怎样读文献
1. 目标:
漫无目的则毫无效率,抓不住重点才效率低下。选题之前可能会有一段时间处于迷茫状态,不知从哪入手。胡乱看了大量文献,却不知所以然。在导师的指导下,在同行的启发下,有些人可以迅速明确目标,有的放矢,入门就从这里开始。即使导师不导,没有定题,自己也要先设定一个具体的问题看文献。不管你将来做不做这些东西,总比没有目标好得多,保证有收获。科研的一般法则是共通的。
2. 层次:
对于一个具体的课题来说,相关文献分属于三个层次:研究方向、研究领域、研究课题。例如有人研究干细胞定向分化治疗帕金森病,对他来说,研究方向就是帕金森病,研究领域是帕金森病的干细胞治疗,研究课题是某种物质诱导干细胞定向分化为分泌多巴胺的神经细胞。看文献时要分清手上的文献是属于那个层次,这决定你对它要掌握到什么程度。
研究方向层次的文献:一般涉及,基础知识,学科水准,了解当前重大进展与趋势,达到专业人员水平;
研究领域层次的文献:了解焦点与热点,已/正/将进行的课题,达到专家水平;
研究课题层次的文献:要全面,了解历史、现状、展望、主要方法、手段,达到No1专家水平。
正确分辨文章的层次,才能把精力用到点子上。
3. 形式:
广义的文献包括可以阅读的所有出版形式。教科书、专著、会议摘要汇编、期刊、网页、甚至ppt文件。比如要了解免疫应答的基本形式,最好是看教科书;要参考大鼠脑立体定位图谱,最好是看专著;要知道最新进展,最好是查阅期刊;要了解别人的研究动向,最好是参会或看会议论文汇编。不要找错信息源。
4. 程度:
对文献的熟悉程度不同,阅读文献的方式大不相同。新手学习式阅读,逐字逐句,搞清细节,掌握最基本的知识点。最初的十几、几十篇要精读,精华的几篇甚至要背诵。老手搜索式阅读,已熟悉各种研究的常见模式和一般套路,能够迅速提取关键信息,把握思路,经常不按常规顺序阅读。有人看图说话,有人辨数识字。高手批判式阅读,一针见血,直指问题所在。实际上没有一篇论文是无懈可击的。新手要稳,老手要准,高手要狠。新手、老手、高手的代表人物分别是研究生、导师和审稿人,但认真钻研的研究生完全可以在3年中实现从新手到高手的嬗变。对自己有清醒的定位,才能选择正确的阅读方式。
5. 矛盾:
文献读的多了,脑子里塞满了信息。公说公有理,婆说婆有理,反而无所适从?为了解决这个问题,循证医学划分临床试验证据的等级;同理,我们看文献也要重视实验证据的强度。发现矛盾,是第一步;找出异同,是第二步;思考解决,是第三步。从相互矛盾的结论推导中发现矛盾的根源,此时如能跳出圈外,不走思维定势,从原始的科学问题出发,"无招胜有招",真正是到达另外一种境界了。何必翻译外国人的综述谎称自己的综述?何必重复别人做过的实验谎称自己的思路?
2006年10月30日
[收藏]读博士的一些想法和做法
发信人: wennydfb (moroseprince)
标 题: 读博士的一些想法和做法
发信站: 水木社区 (Sat Oct 14 23:35:11 2006), 站内
序:写过一个心路总结,里面大都是生活为多,感慨丰富,这里写篇长文来探讨博士生生涯的学术研究以及从博士到博士后的转化过程中的注意问题,声明:本文纯属个人感受,不妥之处可商榷。自己就在国外呆过一年多,是个假海归,比起国内外那些真本事的,甚至比有些在读博士生都不如,纯属班门弄斧,牛人大可无事之。
也许有时候博版不希望水太大,有希望商讨的博士可以站内写信给我,我是有信必覆。
---------------------
谈读博的文章很多很多,各大学bbs,研学论文,天涯,紫霞,丁香园,看看了感慨很多,希望能写下自己一些读博感受,能够给正在读博或即将读博的师弟师妹一些参考,有所裨益那很欣慰了。根据我的理解,工科与文学、理学读博还是有很大差别的。我是真实反应自己的读博方式,许多观点可能跟其他人不同,因为也不具备普遍意义,可能其他人看来还不可取,我想做的是给人家一个参考,取舍由师弟师妹们自己决定。简而言之,本文特别适合对于一个愿意投身学术的人来说,此乃我以为做博士的意义,学术绝非几年之功,而是一生之事。
正像我在回忆三年博士生涯中额外收入可以看到,我没有任何社会上经历,就是每天泡教研室的类型。大学想来最可爱,开始抽烟喝酒谈恋爱,还好学习也不赖,硕士想来很无奈,做做试验发片文章,体验体验搞科研的过程,没有怎么深入,博士么真累,咖啡喝了无数瓶,为了中午不睡看文献,电脑旁写申请写论文,时间太长导致眼疾,为了一个公式推导可以不吃饭,头发掉了很多,体重达到110斤,现在160。现在回忆起来最先进入脑海的就是我的转椅,电脑桌一边电脑一边是书桌,所以我就吱吱呀呀地每天每时地转来转去,我师弟开始快被我折磨死了,修理换椅子都不行,后来习惯了,自己就开始吱吱呀呀地折磨下一届师弟啦。在此,也谨以此文献给那些被我折磨的师弟师妹们。
----------------------
第一:为什么读博
每次这个问题都会引起大水,什么观点都有。我也不讲了,每个人都有自己的理由。我是一直希望上学上到头的那种,所以我一直准备考博士,没有想校园外如何生活过。因此,我对于硕士老板和博士老板指的研究方向都没有抵触,跟什么老板搞什么课题,我的跨度还是满大的,不过最后还是以信息处理为职业了。因此,我读博理由就是我一直想读,感觉感觉博士是怎么回事,家庭情况可以,时不时接济自己一下,自己也花不多,吃饭卖书,卖书找老板报销,谈女友没有怎么花钱,大都是女友出资。北京三年没有去过长城,故宫,基本就是每天赖在实验室和宿舍,书店的那种,有时非常喜欢10.1放大假的感觉,空荡荡的自己听音乐,看书,打游戏,看小说电影,就是不喜欢出去玩。读博一是家里没有负担,否则父母真是够辛苦的,二是喜欢,三是享受这个过程。
---------------------------
第二:怎么考博
由于本人愚笨,英语不好,出国前期花费问题,所以不出国读。当初想去中科院某学所,可惜一个老院士打击我,说你们学校呢,基础不好,来我啊这里很累,我也不想从头浪费时间教你,你还是考虑其他的吧。考北大,北大的英语真难,考50几分也考不到,没戏。记得有个同学考人大英语也很bt,考一天,听说读写都考。清华的英语倒是
规范,可惜那个我喜欢的老板调吉林去了。只有再找,本校老板倒是欢迎,可我总喜欢换换学校,这样也弥补我不爱出校门的缺点。所以就跑南方浙大去了,当时过六级免试听力,我就钻空去了。要报的老板写信(不是email)交谈还不错,还亲自邮寄来专业科的书,真让我感动。因此,考博就亲自跑跑或问问,能遇到好导师真是好,
--------
第三:博士生一年级
真是不幸运,浙大这个老板又去美国了,我被调到另外一个老师那里,入学就叫我过去了,说作信息处理阋郧拔锢淼模赡艿貌购芏嗫危褂蟹⒈鞸CI论文才能毕业,当时我就蒙了,拿着老板的书不知怎么离开的。非常好的是我同宿舍的一个是信电系老博士,从他那里把信号系统,数字信号等一堆书借来,不懂就问他,选的一些他们系的科就找他通融通融,勉强都混过去了,感到隔行如隔山,这个山不知怎么越过去,学了半年只了解大概。最先过的关口是研究方向的了解,老板从Rev. Mod. Phys.上找了一篇综述,真是好,80多页,几乎99年以前这个方向的文章都在它的参考文献里,所以我就上过课后就蹲在西文过刊室里,那是网上还没有买APS以及AIP的数据库,那里面很多文章,IEEE的文章不多,所以我都是自己掏钱复印,大约几百元吧来复印文章,为了复印你得练就各种本领,比如和馆员混熟,那么中午就可以带个包子和瓶水呆在书库里,一个人翻很清净,和复印员熟了就可以自己复印交给她钱好了。文献好多来不及看,就要记文章名字和作者名字,以及年代,这样一年一年的来找,晚上抽时间把所查的文献输入一个文档里,可以用查找来看是否重复,一年一年的分开页数自己整理好,由于这个方向很新,88年开始吧,我当时的原则就是把88年-99年馆里所有能查的都复印来,有次我发现一期杂志都是,害得我终于破产了,还好当时老板看到我复印那么多,而且对于我们实验室都有好处,每年每年我整理放在那里大家查,所以就给我开始报销了,那之前大约300元都是自己掏的,浙大是实行馆复印卷,上面印的钱数,有时同屋的老博士用不了就接济我,有一天终于基本复印齐了,这个过程大约有接近3个月的时间,放齐了排起来有一个显示器那么高,大约是469篇,有多页也有一页的不等。杭州是个没有暖气的城市,冬天大约0度左右,拿杯热茶,披上黄棉大衣,开始了阅读的征途。说实话,看着看着就困了,没有头绪,都讲的很好,都不会,甚至单词都查不到,大约一周只是熟悉了一些专业词汇。我后来改变策略为:找科普类的看,比如Nature和Phys Today,这两个杂志真正做到了返璞归真,大智若愚,不要以为上面多深奥,其实有些介绍,评论很有趣,比起那些八股文似的论文好懂多了,看看题目你就能体会到,Nature许多题目是?号,这让我感到了希望,其实就是自己烦了,随手抽来一篇看来就看进去了,可见也不是偶然,不是说熟读唐诗三百首,不会做来也会诌,这个浸染是有道理的,搞理论的确实有这个时间可以这样做。总有人想从中文看,好理解么,由于我的方向中文还真不多,也就没有注意,反过来在查中文期刊论文,发觉差别确实存在,干脆就不看了,不是什么歧视或者崇洋,中文的水平大家都知道,好的有不少,大都不怎么好。整个上半学期就是看文献和上课,当许多同学还在犹豫选老板那个方向的时候,我没得选,就这样过来了。其实没有选择反而更能集中精力,曾遇到不少同学选了这个,又觉得那个好,换来换去,不知浪费多少时间。
下半学期,老板想了新方法,我用Mathematicas算,可能我随便选的参数正好在那个区域,所以就我和一个师弟算出一个好的结果,这样就让我写这篇论文,等到暑假的时候我就投出去一篇,这时宿舍里弟兄们还有的讨论到底选什么课题,想来真是幸运,当然写的过程也是很痛苦,老板给的压力和凶脸不是很好看啊。反过来看第一篇外文,看来很幼稚和笨拙,我的方法是这样的,在所有要引用的文献之外,找一个方向差很远的文章,我把它的结构都抄过来,比如,什么什么,但是,怎么怎么,然而,所以,因此,文章第一部分如何,最后,我们得出怎么怎么,整个的这种虚词部分大都相同,即使套不进去,就找第二篇,这样套,当然里面数据和专业词汇都是要自己的,反正这样抄袭不会落到同行手里,我称为智慧的抄袭,无奈之举,反正要写好,还是自己要多练,甚至背别人的好句子,第一篇就这样模仿出来的,再老板修改,反复打磨,看起来也是那么回事,反正结果是很好的,评审的也没有太刁难我的英文,就这样第一篇SCI收录的论文就出来了。刚学写作都是抄袭么,我虽然老是给师弟说天下文章一大抄,看你会抄不会抄,我还是非常仔细地检查不犯严重错误,至少数据了,图形了,骨头(idea)和肉(数据和图)是自己的,接些别人的衣裳穿,我大言不惭地就这么混下来了。
-------
第四:博士二年级
记得写过:
博学志士,博现在都不很好,学科分类很多,能贯通多门学科的是天才,现在大都专学一个方向毕业。
然博士基本素质修养,我提这几个方面探讨:
一曰:修性,许多博士性格都挺怪异,性情的修养大都忘记,做博士首先达到一个较高性格水平,心胸开阔,能真心承认别人成就,不嫉妒,不自卑,平和前进,不断超越以前的自己,不断反省自己,能改正自己的一些毛病。
一曰:修身,坚持锻炼,能胜任长期伏案苦思和试验的劳作即可,不可以锻炼为目的。
一曰:修业,自己专业自己就下苦工吧,还要
a:计算机基本技能,wword, tex会一个,最好都会;语言会一种达到编程的目的,c,FT, Matlab等挑个吧,网络知识,硬件基本知识,能修理电脑小毛病,FTP,bbs,java,病毒防治,email收发转,等等
b:一门外语听说读写精通,一门了解;
c: 对于研究保持热恋感觉,天天思之念之,真心喜欢,能不断追踪新的方向,比如看arXiv.
d: 国学,诗词,历史,基本国家知识,爱国爱家,勤恳老成。
好,这些你都学到,你就毕业了,来我这里领证吧。
这些我是我二年纪的感触,到这个阶段,课没有了,老板管你呢很好,不管你呢,你就练练这些吧,否则写毕业论文时都可能遇到。
第五 博士三年级
对于普博,三年级不该再为选题烦恼了,应该是干活很热火的一年。对于写文章我和在bbs上写小说一样,有写作的冲动,这个冲动是很特别的东西,有些老师和同学很有想法,就是说我懒,懒得写,我还有其他重要的事情去做,我怎么不明白还有其他比发表一篇印有自己名字的论文还有吸引力的东西。可能只有爱情那个费神费财的事情了,我也不是鼓励大家早结婚。总是琢磨古人云:成家立业。为什么成家在前立业在后呢?古代人结婚早,16,17就结婚,然后苦读考秀才?读博士时发觉早结婚有好处:不为这个谈恋爱犯愁了!有个同学一年级作的很好,谈上一个其他学校的小姑娘,真是费功夫,今个喝咖啡,明个买衣裳,下午爬个山,晚上草丛中缠绵,夜里临别我在屋里都听见吻的叭叭响,小姑娘一说话声音好嗲,我同学整个沉迷其中,生日开个party,什么半年一年相识纪念,整个服他俩了。他真个费了一年追求,真是难为了。你成家了,好了,什么花啊,蝶的,与你没有关系,你退出竞争行列了,你就整天别想了,最多煲电话,什么生日,打个电话就行了,老夫老妻么!对于这个让人神魂颠倒的爱情不必费那么多时间对于紧张的三年生活不无好处。个人感觉,不是鼓励大家都结婚再来读,老板们不都气死。对于那些还在博士期间寻觅得同学们,我也不知该说什么,有时想一切都是命,半点不由人,老爸整天嘟哝的还是有道理,缘分来了就看他顺眼,没有来满路满校园都卿卿我我,就觉得自己没有人疼,可怜,对着花啊草啊感叹流泪。没有办法,人终究需要关怀,都要嫁人都要娶妻(个别有独身主义的)。历史上不少同行夫妇,真是好羡慕,我最希望那样的,如童第周、叶毓芬——中国生物界的“居里夫妇”,钱三强取得了法国国家博士学位,又继续跟随第二代居里夫妇当助手。1946年,他与同一学科的才女何泽慧结婚。唉,羡慕啊。
写毕业论文不是很难的事情,前提自己确实做了工作了,搞工程的不懂,搞理论的还是很好写,第一章把方向的来龙去脉,各大流派,什么最新,什么争议,你要做什么,有何意义,分为几章,每章大约有何,好了,第一章就好了,能把这个脉络说清楚,你没有看文献肯定不会知道那么清楚,你引书,引来引去,其实不如自己找到原始文献来引,你会发觉许多都是歪曲原文含义,因此坚持找到原始的文献来把要引的看明白。虎头么,开篇给人恢宏大气的,气势磅礴的开始,呵呵,就是蛇尾也是让评稿的博导们不得不佩服你的综合能力。后面更是串糖串似的,自己最先的文章,发现有个问题,第二章第二篇文章,诸如下去,最后一章是自己想法,没有发的,大体写思路,以后什么地方会做有意义,其实毕业也不一定作。附录,致谢,发表论文清单,参考文献,来回对参考文献和文章中引用是否正确,如果多了,这是水磨功夫。不知大家怎么写的,我的就这么写下来,老板也没有改太多,就是第一章把自己专业套套,显得确实是这个专业的学生,第二稿就找评审的了,反正我是每家去送,自己先垫上评审费,然后打电话约定答辩时间,自己去骑车取评审意见,比现在盲审好多了,都买老板面子,就这么混到答辩那天了。大约是4月底,5.1前。答辩很丢人,说话结巴,有时脑袋一片空白,汗珠子乱掉,几次撑不下来了,最大的缺点就是没有预先排练一次,自己口才不行,应急能力太差,应该排练几次。就这样回答问题,晚上吃饭的时候几个老教授说,你看你紧张的,其实论文写的很好,你出去可得练练,别丢人。也来不及细想了,答辩后老板就去研究生院开了英文证明,说答辩很好,根据答辩和学校规定能够8月拿到学位证书,连同PD申请表,以及文章和文章收录证明用Fedex寄走了,这之后发觉自己不在状态了,老板几个点子都没有成功,自己也没有兴趣做,还去南京大学应聘职位没有成功,直到
知道法国消息后,自己才兴奋起来,但是许多事情要做,办护照,跑学校的章子还是很费时间的,直到护照办到,真是感叹,这个是磨练人的活,不比写文章容易,几乎每天都跑,公证,签证,买些出去的东西,大约从6月忙到9月底。等签证出来,买好机票的那个时候,这是感叹,自己整个散架似的,不知大家这个过程何等感觉,我的感觉不想再来一次了。几乎三年级下半年没有干什么,就这样毕业了。
第六:怎么做博后
法国博后管理不是很严格,没有给我什么具体指标,说中间考核也没有考核,就是写写一半了,干些什么了。大体就是对老板负责就可以了。第一次的感触是老板认真,这是老外搞科研的共性?不知道是否是对。我记得让我写都是发了什么文章,我只写了页码的开始页,没有写结束页,老板第二天就找我来,你浪费我时间,你做事不严肃,说我真是不好意思,咋偷懒不写全呢,还有个要求很怪,引用那个论文,必须讨论稿里写明,文献哪页哪行,正式投稿再删掉,可能是憋你是否真看到这个文献了,不是自己瞎引的。另外一个特点是,我和一个洋师弟同时作一个东西,只有结果都相近,或相同,才能过,然后下一个,这样慢,但保证没有模拟错误。每天固定时间见面或者email讨论,无论你做还是没有作什么。讨论说英语,即使憋得通红,还是要说,如果他们说法语,先给我打招呼,我们不谈学术,说法语了,不要介意。老板快50了,刚上教授,我在的时候刚培养第三个博士生,每个毕业大约7年,从硕士开始算,他们硕士一年转博士生,看师弟的文章,嘿嘿,一般学校副教授没有问题,大约快10篇很好的论文了(IF大于2)。想想国内一个导师带那么多,真是不可想象。大跃进的真不可取,不知现在国家怎么想的。社会需求日渐高涨,博士越来越多,好坏以后自有定论。
不仅学习老板知识,就是那个坚持劲头,就让我佩服,上完课就在那里呆着,中午咖啡和苹果,实验室有厨房,热些什么吃吃,晚上有时email显示工作到12点多,好在法国假期多,不知他度假不度,不论什么时候给他写email,他肯定先回信收到,尽快给你答复。其次他数学好,我解不下去的,他能找到解决的方式,迄今为止我还没有难到他,我碰到的他都能blabla,真不知他数学学了多少。他最常问我的也是你写的有何意义,没有意义的,回答不出来的,你别写。一年多很快就过去了,没有像国内老板那么熟悉,没有很深厚的友谊似的,但是他一直鼓励和认真回答我每个问题和自己消息。最后他开始文章不做通讯作者了,理由是你应该独立了,以后我们是同事,不是boss了,你自己对于自己文章该负权责。这个是他最后的教诲。我是否有些崇洋了,确实很佩服这个法国老板,88年来坚持做到现在,新的想法似乎还没有停止。总体感觉在那里做的轻松,发的文章多少不影响工资,哈哈。整个过程很快过去了,感受实话说就是跟老板比差距很大很大,回国一定多修习一些,其实回来还是没有好好做。从博士到博后转变我觉得就是怎么成为一个独立的负责任的学者。称自己为学者不好意思。出去一下,很有裨益。
第七 over
--结束:文章千古事,得失在人心。说得虽然狂傲,可是真的是这个道理,乱写就会被人发现,被人耻笑,不成名则已,成了会成笑柄的。大家好好注意吧。
关于是一个人做研究呢,还是一个团体,这个还是分学科吧,数学了等理论的可以单独做下去,或者几个松散的联系交流,也可以作出好的结果,有些生物,航天,等大科学项目还是团体重要。
乱写很多,希望大家都有想法写出来共赏析,共同提高,不断进步,想做的最好每个人,每个团体吧都有很长的路要走。我们做的就是一直坚持地走下去,实现自己的设定或者梦想,无论艰难还是困苦,无论嘲笑还是鲜花,坚持体现在每个细节,试验的刷洗,公式的符号.....
标 题: 读博士的一些想法和做法
发信站: 水木社区 (Sat Oct 14 23:35:11 2006), 站内
序:写过一个心路总结,里面大都是生活为多,感慨丰富,这里写篇长文来探讨博士生生涯的学术研究以及从博士到博士后的转化过程中的注意问题,声明:本文纯属个人感受,不妥之处可商榷。自己就在国外呆过一年多,是个假海归,比起国内外那些真本事的,甚至比有些在读博士生都不如,纯属班门弄斧,牛人大可无事之。
也许有时候博版不希望水太大,有希望商讨的博士可以站内写信给我,我是有信必覆。
---------------------
谈读博的文章很多很多,各大学bbs,研学论文,天涯,紫霞,丁香园,看看了感慨很多,希望能写下自己一些读博感受,能够给正在读博或即将读博的师弟师妹一些参考,有所裨益那很欣慰了。根据我的理解,工科与文学、理学读博还是有很大差别的。我是真实反应自己的读博方式,许多观点可能跟其他人不同,因为也不具备普遍意义,可能其他人看来还不可取,我想做的是给人家一个参考,取舍由师弟师妹们自己决定。简而言之,本文特别适合对于一个愿意投身学术的人来说,此乃我以为做博士的意义,学术绝非几年之功,而是一生之事。
正像我在回忆三年博士生涯中额外收入可以看到,我没有任何社会上经历,就是每天泡教研室的类型。大学想来最可爱,开始抽烟喝酒谈恋爱,还好学习也不赖,硕士想来很无奈,做做试验发片文章,体验体验搞科研的过程,没有怎么深入,博士么真累,咖啡喝了无数瓶,为了中午不睡看文献,电脑旁写申请写论文,时间太长导致眼疾,为了一个公式推导可以不吃饭,头发掉了很多,体重达到110斤,现在160。现在回忆起来最先进入脑海的就是我的转椅,电脑桌一边电脑一边是书桌,所以我就吱吱呀呀地每天每时地转来转去,我师弟开始快被我折磨死了,修理换椅子都不行,后来习惯了,自己就开始吱吱呀呀地折磨下一届师弟啦。在此,也谨以此文献给那些被我折磨的师弟师妹们。
----------------------
第一:为什么读博
每次这个问题都会引起大水,什么观点都有。我也不讲了,每个人都有自己的理由。我是一直希望上学上到头的那种,所以我一直准备考博士,没有想校园外如何生活过。因此,我对于硕士老板和博士老板指的研究方向都没有抵触,跟什么老板搞什么课题,我的跨度还是满大的,不过最后还是以信息处理为职业了。因此,我读博理由就是我一直想读,感觉感觉博士是怎么回事,家庭情况可以,时不时接济自己一下,自己也花不多,吃饭卖书,卖书找老板报销,谈女友没有怎么花钱,大都是女友出资。北京三年没有去过长城,故宫,基本就是每天赖在实验室和宿舍,书店的那种,有时非常喜欢10.1放大假的感觉,空荡荡的自己听音乐,看书,打游戏,看小说电影,就是不喜欢出去玩。读博一是家里没有负担,否则父母真是够辛苦的,二是喜欢,三是享受这个过程。
---------------------------
第二:怎么考博
由于本人愚笨,英语不好,出国前期花费问题,所以不出国读。当初想去中科院某学所,可惜一个老院士打击我,说你们学校呢,基础不好,来我啊这里很累,我也不想从头浪费时间教你,你还是考虑其他的吧。考北大,北大的英语真难,考50几分也考不到,没戏。记得有个同学考人大英语也很bt,考一天,听说读写都考。清华的英语倒是
规范,可惜那个我喜欢的老板调吉林去了。只有再找,本校老板倒是欢迎,可我总喜欢换换学校,这样也弥补我不爱出校门的缺点。所以就跑南方浙大去了,当时过六级免试听力,我就钻空去了。要报的老板写信(不是email)交谈还不错,还亲自邮寄来专业科的书,真让我感动。因此,考博就亲自跑跑或问问,能遇到好导师真是好,
--------
第三:博士生一年级
真是不幸运,浙大这个老板又去美国了,我被调到另外一个老师那里,入学就叫我过去了,说作信息处理阋郧拔锢淼模赡艿貌购芏嗫危褂蟹⒈鞸CI论文才能毕业,当时我就蒙了,拿着老板的书不知怎么离开的。非常好的是我同宿舍的一个是信电系老博士,从他那里把信号系统,数字信号等一堆书借来,不懂就问他,选的一些他们系的科就找他通融通融,勉强都混过去了,感到隔行如隔山,这个山不知怎么越过去,学了半年只了解大概。最先过的关口是研究方向的了解,老板从Rev. Mod. Phys.上找了一篇综述,真是好,80多页,几乎99年以前这个方向的文章都在它的参考文献里,所以我就上过课后就蹲在西文过刊室里,那是网上还没有买APS以及AIP的数据库,那里面很多文章,IEEE的文章不多,所以我都是自己掏钱复印,大约几百元吧来复印文章,为了复印你得练就各种本领,比如和馆员混熟,那么中午就可以带个包子和瓶水呆在书库里,一个人翻很清净,和复印员熟了就可以自己复印交给她钱好了。文献好多来不及看,就要记文章名字和作者名字,以及年代,这样一年一年的来找,晚上抽时间把所查的文献输入一个文档里,可以用查找来看是否重复,一年一年的分开页数自己整理好,由于这个方向很新,88年开始吧,我当时的原则就是把88年-99年馆里所有能查的都复印来,有次我发现一期杂志都是,害得我终于破产了,还好当时老板看到我复印那么多,而且对于我们实验室都有好处,每年每年我整理放在那里大家查,所以就给我开始报销了,那之前大约300元都是自己掏的,浙大是实行馆复印卷,上面印的钱数,有时同屋的老博士用不了就接济我,有一天终于基本复印齐了,这个过程大约有接近3个月的时间,放齐了排起来有一个显示器那么高,大约是469篇,有多页也有一页的不等。杭州是个没有暖气的城市,冬天大约0度左右,拿杯热茶,披上黄棉大衣,开始了阅读的征途。说实话,看着看着就困了,没有头绪,都讲的很好,都不会,甚至单词都查不到,大约一周只是熟悉了一些专业词汇。我后来改变策略为:找科普类的看,比如Nature和Phys Today,这两个杂志真正做到了返璞归真,大智若愚,不要以为上面多深奥,其实有些介绍,评论很有趣,比起那些八股文似的论文好懂多了,看看题目你就能体会到,Nature许多题目是?号,这让我感到了希望,其实就是自己烦了,随手抽来一篇看来就看进去了,可见也不是偶然,不是说熟读唐诗三百首,不会做来也会诌,这个浸染是有道理的,搞理论的确实有这个时间可以这样做。总有人想从中文看,好理解么,由于我的方向中文还真不多,也就没有注意,反过来在查中文期刊论文,发觉差别确实存在,干脆就不看了,不是什么歧视或者崇洋,中文的水平大家都知道,好的有不少,大都不怎么好。整个上半学期就是看文献和上课,当许多同学还在犹豫选老板那个方向的时候,我没得选,就这样过来了。其实没有选择反而更能集中精力,曾遇到不少同学选了这个,又觉得那个好,换来换去,不知浪费多少时间。
下半学期,老板想了新方法,我用Mathematicas算,可能我随便选的参数正好在那个区域,所以就我和一个师弟算出一个好的结果,这样就让我写这篇论文,等到暑假的时候我就投出去一篇,这时宿舍里弟兄们还有的讨论到底选什么课题,想来真是幸运,当然写的过程也是很痛苦,老板给的压力和凶脸不是很好看啊。反过来看第一篇外文,看来很幼稚和笨拙,我的方法是这样的,在所有要引用的文献之外,找一个方向差很远的文章,我把它的结构都抄过来,比如,什么什么,但是,怎么怎么,然而,所以,因此,文章第一部分如何,最后,我们得出怎么怎么,整个的这种虚词部分大都相同,即使套不进去,就找第二篇,这样套,当然里面数据和专业词汇都是要自己的,反正这样抄袭不会落到同行手里,我称为智慧的抄袭,无奈之举,反正要写好,还是自己要多练,甚至背别人的好句子,第一篇就这样模仿出来的,再老板修改,反复打磨,看起来也是那么回事,反正结果是很好的,评审的也没有太刁难我的英文,就这样第一篇SCI收录的论文就出来了。刚学写作都是抄袭么,我虽然老是给师弟说天下文章一大抄,看你会抄不会抄,我还是非常仔细地检查不犯严重错误,至少数据了,图形了,骨头(idea)和肉(数据和图)是自己的,接些别人的衣裳穿,我大言不惭地就这么混下来了。
-------
第四:博士二年级
记得写过:
博学志士,博现在都不很好,学科分类很多,能贯通多门学科的是天才,现在大都专学一个方向毕业。
然博士基本素质修养,我提这几个方面探讨:
一曰:修性,许多博士性格都挺怪异,性情的修养大都忘记,做博士首先达到一个较高性格水平,心胸开阔,能真心承认别人成就,不嫉妒,不自卑,平和前进,不断超越以前的自己,不断反省自己,能改正自己的一些毛病。
一曰:修身,坚持锻炼,能胜任长期伏案苦思和试验的劳作即可,不可以锻炼为目的。
一曰:修业,自己专业自己就下苦工吧,还要
a:计算机基本技能,wword, tex会一个,最好都会;语言会一种达到编程的目的,c,FT, Matlab等挑个吧,网络知识,硬件基本知识,能修理电脑小毛病,FTP,bbs,java,病毒防治,email收发转,等等
b:一门外语听说读写精通,一门了解;
c: 对于研究保持热恋感觉,天天思之念之,真心喜欢,能不断追踪新的方向,比如看arXiv.
d: 国学,诗词,历史,基本国家知识,爱国爱家,勤恳老成。
好,这些你都学到,你就毕业了,来我这里领证吧。
这些我是我二年纪的感触,到这个阶段,课没有了,老板管你呢很好,不管你呢,你就练练这些吧,否则写毕业论文时都可能遇到。
第五 博士三年级
对于普博,三年级不该再为选题烦恼了,应该是干活很热火的一年。对于写文章我和在bbs上写小说一样,有写作的冲动,这个冲动是很特别的东西,有些老师和同学很有想法,就是说我懒,懒得写,我还有其他重要的事情去做,我怎么不明白还有其他比发表一篇印有自己名字的论文还有吸引力的东西。可能只有爱情那个费神费财的事情了,我也不是鼓励大家早结婚。总是琢磨古人云:成家立业。为什么成家在前立业在后呢?古代人结婚早,16,17就结婚,然后苦读考秀才?读博士时发觉早结婚有好处:不为这个谈恋爱犯愁了!有个同学一年级作的很好,谈上一个其他学校的小姑娘,真是费功夫,今个喝咖啡,明个买衣裳,下午爬个山,晚上草丛中缠绵,夜里临别我在屋里都听见吻的叭叭响,小姑娘一说话声音好嗲,我同学整个沉迷其中,生日开个party,什么半年一年相识纪念,整个服他俩了。他真个费了一年追求,真是难为了。你成家了,好了,什么花啊,蝶的,与你没有关系,你退出竞争行列了,你就整天别想了,最多煲电话,什么生日,打个电话就行了,老夫老妻么!对于这个让人神魂颠倒的爱情不必费那么多时间对于紧张的三年生活不无好处。个人感觉,不是鼓励大家都结婚再来读,老板们不都气死。对于那些还在博士期间寻觅得同学们,我也不知该说什么,有时想一切都是命,半点不由人,老爸整天嘟哝的还是有道理,缘分来了就看他顺眼,没有来满路满校园都卿卿我我,就觉得自己没有人疼,可怜,对着花啊草啊感叹流泪。没有办法,人终究需要关怀,都要嫁人都要娶妻(个别有独身主义的)。历史上不少同行夫妇,真是好羡慕,我最希望那样的,如童第周、叶毓芬——中国生物界的“居里夫妇”,钱三强取得了法国国家博士学位,又继续跟随第二代居里夫妇当助手。1946年,他与同一学科的才女何泽慧结婚。唉,羡慕啊。
写毕业论文不是很难的事情,前提自己确实做了工作了,搞工程的不懂,搞理论的还是很好写,第一章把方向的来龙去脉,各大流派,什么最新,什么争议,你要做什么,有何意义,分为几章,每章大约有何,好了,第一章就好了,能把这个脉络说清楚,你没有看文献肯定不会知道那么清楚,你引书,引来引去,其实不如自己找到原始文献来引,你会发觉许多都是歪曲原文含义,因此坚持找到原始的文献来把要引的看明白。虎头么,开篇给人恢宏大气的,气势磅礴的开始,呵呵,就是蛇尾也是让评稿的博导们不得不佩服你的综合能力。后面更是串糖串似的,自己最先的文章,发现有个问题,第二章第二篇文章,诸如下去,最后一章是自己想法,没有发的,大体写思路,以后什么地方会做有意义,其实毕业也不一定作。附录,致谢,发表论文清单,参考文献,来回对参考文献和文章中引用是否正确,如果多了,这是水磨功夫。不知大家怎么写的,我的就这么写下来,老板也没有改太多,就是第一章把自己专业套套,显得确实是这个专业的学生,第二稿就找评审的了,反正我是每家去送,自己先垫上评审费,然后打电话约定答辩时间,自己去骑车取评审意见,比现在盲审好多了,都买老板面子,就这么混到答辩那天了。大约是4月底,5.1前。答辩很丢人,说话结巴,有时脑袋一片空白,汗珠子乱掉,几次撑不下来了,最大的缺点就是没有预先排练一次,自己口才不行,应急能力太差,应该排练几次。就这样回答问题,晚上吃饭的时候几个老教授说,你看你紧张的,其实论文写的很好,你出去可得练练,别丢人。也来不及细想了,答辩后老板就去研究生院开了英文证明,说答辩很好,根据答辩和学校规定能够8月拿到学位证书,连同PD申请表,以及文章和文章收录证明用Fedex寄走了,这之后发觉自己不在状态了,老板几个点子都没有成功,自己也没有兴趣做,还去南京大学应聘职位没有成功,直到
知道法国消息后,自己才兴奋起来,但是许多事情要做,办护照,跑学校的章子还是很费时间的,直到护照办到,真是感叹,这个是磨练人的活,不比写文章容易,几乎每天都跑,公证,签证,买些出去的东西,大约从6月忙到9月底。等签证出来,买好机票的那个时候,这是感叹,自己整个散架似的,不知大家这个过程何等感觉,我的感觉不想再来一次了。几乎三年级下半年没有干什么,就这样毕业了。
第六:怎么做博后
法国博后管理不是很严格,没有给我什么具体指标,说中间考核也没有考核,就是写写一半了,干些什么了。大体就是对老板负责就可以了。第一次的感触是老板认真,这是老外搞科研的共性?不知道是否是对。我记得让我写都是发了什么文章,我只写了页码的开始页,没有写结束页,老板第二天就找我来,你浪费我时间,你做事不严肃,说我真是不好意思,咋偷懒不写全呢,还有个要求很怪,引用那个论文,必须讨论稿里写明,文献哪页哪行,正式投稿再删掉,可能是憋你是否真看到这个文献了,不是自己瞎引的。另外一个特点是,我和一个洋师弟同时作一个东西,只有结果都相近,或相同,才能过,然后下一个,这样慢,但保证没有模拟错误。每天固定时间见面或者email讨论,无论你做还是没有作什么。讨论说英语,即使憋得通红,还是要说,如果他们说法语,先给我打招呼,我们不谈学术,说法语了,不要介意。老板快50了,刚上教授,我在的时候刚培养第三个博士生,每个毕业大约7年,从硕士开始算,他们硕士一年转博士生,看师弟的文章,嘿嘿,一般学校副教授没有问题,大约快10篇很好的论文了(IF大于2)。想想国内一个导师带那么多,真是不可想象。大跃进的真不可取,不知现在国家怎么想的。社会需求日渐高涨,博士越来越多,好坏以后自有定论。
不仅学习老板知识,就是那个坚持劲头,就让我佩服,上完课就在那里呆着,中午咖啡和苹果,实验室有厨房,热些什么吃吃,晚上有时email显示工作到12点多,好在法国假期多,不知他度假不度,不论什么时候给他写email,他肯定先回信收到,尽快给你答复。其次他数学好,我解不下去的,他能找到解决的方式,迄今为止我还没有难到他,我碰到的他都能blabla,真不知他数学学了多少。他最常问我的也是你写的有何意义,没有意义的,回答不出来的,你别写。一年多很快就过去了,没有像国内老板那么熟悉,没有很深厚的友谊似的,但是他一直鼓励和认真回答我每个问题和自己消息。最后他开始文章不做通讯作者了,理由是你应该独立了,以后我们是同事,不是boss了,你自己对于自己文章该负权责。这个是他最后的教诲。我是否有些崇洋了,确实很佩服这个法国老板,88年来坚持做到现在,新的想法似乎还没有停止。总体感觉在那里做的轻松,发的文章多少不影响工资,哈哈。整个过程很快过去了,感受实话说就是跟老板比差距很大很大,回国一定多修习一些,其实回来还是没有好好做。从博士到博后转变我觉得就是怎么成为一个独立的负责任的学者。称自己为学者不好意思。出去一下,很有裨益。
第七 over
--结束:文章千古事,得失在人心。说得虽然狂傲,可是真的是这个道理,乱写就会被人发现,被人耻笑,不成名则已,成了会成笑柄的。大家好好注意吧。
关于是一个人做研究呢,还是一个团体,这个还是分学科吧,数学了等理论的可以单独做下去,或者几个松散的联系交流,也可以作出好的结果,有些生物,航天,等大科学项目还是团体重要。
乱写很多,希望大家都有想法写出来共赏析,共同提高,不断进步,想做的最好每个人,每个团体吧都有很长的路要走。我们做的就是一直坚持地走下去,实现自己的设定或者梦想,无论艰难还是困苦,无论嘲笑还是鲜花,坚持体现在每个细节,试验的刷洗,公式的符号.....
2006年10月29日
[收藏]C++资源之不完全导引(完整版)
C++资源之不完全导引(完整版)
作者: dohf 发表日期: 2006-04-10 22:50 文章属性: 转载 复制链接
撰文/曾毅陶文
最后更新:2004年6月11日
声明:
.本文2004年5月首发于《CSDN开发高手》,版权归该杂志与《程序员》杂志社所有。杂志限于篇幅部分内容有所删节,此处版本为相对完整版本。
.本文为介绍性文章,会随笔者学习C++语言不断更新。
1,前言
无数次听到“我要开始学习C++!”的呐喊,无数次听到“C++太复杂了,我真的学不会”的无奈。Stan Lippman先生曾在《C++ Primer》一书中指出“C++是最为难学的高级程序设计语言之一”,人们常将“之一”去掉以表达自己对C++的敬畏。诚然,C++程序设计语言对于学习者的确有很多难以逾越的鸿沟,体系结构的庞大,应接不暇并不断扩充的特性……除此之外,参考资料之多与冗杂使它的学习者望而却步,欲求深入者苦不堪言。希望这一份不完全导引能够成为您C++学习之路上的引路灯。
撰写本文的初衷并不打算带领大家体验古老的C++历史,如果你想了解C++的历史与其前期发展中诸多技术的演变,你应当去参考Bjarne的《The Design and Evolution of C++》。当然也不打算给大家一个无所不包的宝典(并非不想:其一是因水平有限,其二无奈C++之博大精深),所给出的仅仅是一些我们认为对于想学习C++的广大读者来说最重要并且触手可及的开发与学习资源。
本文介绍并分析了一些编译器,开发环境,库,少量的书籍以及参考网站,并且尽可能尝试着给出一个利用这些资源的导引,望对如同我们一样的初学者能够有所裨益。
------------------------------------------------------------------------
2,编译器
在C++之外的任何语言中,编译器都从来没有受到过如此之重视。因为C++是一门相当复杂的语言,所以编译器也难于构建。直到最近我们才开始能够使用上完全符合C++标准的编译器(哦,你可能会责怪那些编译器厂商不能尽早的提供符合标准的编译器,这只能怪他们各自维系着自身的一套别人不愿接受的标准)。什么?你说这无关紧要?哦,不,你所需要的是和标准化C++高度兼容的编译环境。长远来看,只有这样的编译器对C++开发人员来说才是最有意义的工具,尤其是对于程序设计语言的学习者。一至性让代码具备可移植性,并让一门语言及其库的应用更为广泛。嗯,是的,我们这里只打算介绍一些公认的优秀编译器。
2.1 Borland C++
这个是Borland C++ Builder和Borland C++ Builder X这两种开发环境的后台编译器。(哦,我之所以将之分为两种开发环境你应当能明白为什么,正如Delphi7到Delphi8的转变,是革命性的两代。)Borland C++由老牌开发工具厂商Borland倾力打造。该公司的编译器素以速度快,空间效率高著称,Borland C++ 系列编译器秉承了这个传统,属于非常优质的编译器。标准化方面早在5.5版本的编译器中对标准化C++的兼容就达到了92.73%。目前最新版本是Borland C++ Builder X中的6.0版本,官方称100%符合ANSI/ISO的C++标准以及C99标准。嗯…这正是我前面所指的“完全符合C++标准的编译器”。
2.2 Visual C++
这个正是我们熟知的Visual Studio 和 Visual Studio.net 2002, 2003以及2005 Whidbey中带的C++编译器。由Microsoft公司研制。在Visual Studio 6.0中,因为编译器有太多地方不能与后来出现的C++标准相吻合而饱受批评(想想你在使用STL的时候编译时报出的那些令人厌恶的error和warning吧)。VC++6.0对标准化C++的兼容只有83.43%。但是随着C++编译器设计大师Stanley Lippman以及诸多C++社群达人的加盟,在Visual Studio.NET 2003中,Visual C++编译器已经成为一个非常成熟可靠的C++编译器了。Dr.Dobb's Journal的评测显示Visual C++7.1对标准C++的兼容性高达98.22%,一度成为CBX之前兼容性最好的编译器。结合强大的Visual Studio.NET开发环境,是一个非常不错的选择。至于Whidbey时代的Visual C++,似乎微软所最关注的是C++/CLI……我们不想评论微软下一代的C++编译器对标准化兼容如何,但他确实越来越适合.NET (其实你和我的感觉可能是一样的,微软不应当把标准C++这块肥肉丢给Borland,然而微软可能并不这样认为)。
2.3 GNU C++
著名的开源C++编译器。是类Unix操作系统下编写C++程序的首选。特点是有非常好的移植性,你可以在非常广泛的平台上使用它,同时也是编写跨平台,嵌入式程序很好的选择。另外在符合标准这个方面一直都非常好,GCC3.3大概能够达到96.15%。但是由于其跨平台的特性,在代码尺寸速度等优化上略微差一点。
基于GNU C++的编译器有很多,比如:
(1) Mingw
http://www.mingw.org/
GCC的一个Windows的移植版本(Dev-C++的后台)
(2) Cygwin
http://sources.redhat.com/cygwin/
GCC的另外一个Windows移植版本是Cygwin的一部分,Cygwin是Windows下的一个Unix仿真环境。严格的说是模拟GNU的环境,这也就是"Gnu's Not Unix"要表达的意思,噢,扯远了,这并不是我们在这里关心的实质内容。
(3) Djgpp
http://www.delorie.com/djgpp/
这是GCC的DOS移植版本。
(4) RSXNT
http://www.mathematik.uni-bielefeld.de/~rainer/
这是GCC的DOS和Windows移植版本。
(5) Intel C++
著名CPU制造厂商Intel出品的编译器,Special Design for Intel x86!对于Intel x86结构的CPU经过特别的优化。在有些应用情况下,特别是数值计算等高性能应用,仅仅采用Intel的编译器编译就能大幅度的提高性能。
(6) Digital Mars C++
网络上提供免费下载,Zortech/Symantec C++的继承者,其前身在当年惨烈的C++四国战中也是主角之一。
------------------------------------------------------------------------
3,开发环境
开发环境对于程序员的作用不言而喻。选择自己朝夕相处的环境也不是容易的事情,特别是在IDE如此丰富的情况下。下面就是我们推荐的一些常见的C++开发环境,并没有包括一些小型的,罕见的IDE。其中任何一款都是功能丰富,可以用作日常开发使用的。对于不同层面的开发者,请参见内文关于适用对象的描述。
3.1 Visual Studio 6.0
这个虽然是Microsoft公司的老版本的开发环境,但是鉴于其后继版本VisualStudio.NET的庞大身躯,以及初学者并不那么高的功能要求,所以推荐这个开发环境给C++的初学者,供其学习C++的最基本的部分,比如C的那部分子集,当然你别指望他能够支持最新的C99标准。在日常的开发中,仍然有很多公司使用这个经典稳定的环境,比如笔者就看曾亲见有些公司将其编译器替换为GCC做手机开发之用。
3.2 Visual Studio.NET 2003
作为Microsoft公司官方正式发布的最新版本开发环境,其中有太多激动人心的功能。结合其最新的C++编译器。对于机器配置比较好的开发人员来说,使用这个开发环境将能满足其大部分的要求。这里不打算单独说Visual Studio Whidbey,虽然Visual Studio .NET 2005 - Whidbey社区预览版已经推出,但暂不是很稳定,读者可以亲身去体验。
3.3 Borland C++ Builder 6
这个并不是Borland的C++开发环境的最新版本。选择它的原因是它不是用Java写的IDE,速度比较快。它有一个很完善的GUI窗体设计器,和Delphi共用一个VCL。由于这些特点,比较适合初学者上手。但是由于其GUI的中心位置,可能不利于对于C++语言的学习。而且其为了支持VCL这个Object Pascal写的库也对C++进行了一些私有的扩充。使得人们有一个不得不接受的事实:“Borland C++ Builder 6的高手几乎都是Delphi高手”。
3.4 Borland C++ Builder X
正如前文所述,虽然版本号上和前面那个IDE非常相象,但是其实它们是完全不同的两个集成开发环境。C++Builder更多的是一个和Delphi同步的C++版本的开发环境,C++BuilderX则是完全从C++的角度思考得出的一个功能丰富的IDE。其最大的特点是跨平台,跨编译器,多种Framework的集成,并且有一个WxWindows为基础的GUI设计器。尤其是采用了纯C++来重写了整个Framework,摒弃了以前令人无奈的版本。对于C++的开发来说,从编译器,到库,到功能集成都是非常理想的。可以预见,Borland C++ Builder X 2.0很值得C++爱好者期待。唯一令人难堪之处是作为一个C++的开发工具,其IDE是用Java写的,在配置不够理想的机器上请慎重考虑再安装。
3.5 Emacs + GCC
前面讲的大部分是Windows环境下的集成开发环境。Linux上的开发者更倾向于使用Emacs来编辑C++的文件,用Makefile来命令GCC做编译。虽然看上去比较松散,但是这些东西综合起来还是一个开0发环境。如果你能够娴熟的使用这样的环境写程序,你的水平应该足够指导我们来写这篇陋文了。
3.6 Dev C++
GCC是一个很好的编译器。在Windows上的C++编译器一直和标准有着一段距离的时候,GCC就是一个让Windows下开发者流口水的编译器。Dev-C++就是能够让GCC跑在Windows下的工具,作为集成开发环境,还提供了同专业IDE相媲美的语法高亮,代码提示,调试等功能。由于使用Delphi开发,占用内存少,速度很快,比较适合轻量级的学习和使用。
3.7 Eclipse + CDT
Eclipse可是近来大名鼎鼎的开发工具。最新一期的Jolt大奖就颁给了这个杰出的神物。说其神奇是因为,它本身是用Java写的,但是拥有比一般Java写的程序快得多的速度。而且因为其基于插件组装一切的原则,使得能够有CDT这样的插件把Eclipse变成一个C/C++的开发环境。如果你一直用Eclipse写Java的程序,不妨用它体验一下C++开发的乐趣。
------------------------------------------------------------------------
4,工具
C++的辅助工具繁多,我们分门别类的为大家作介绍:
4.1 文档类
(1) Doxygen
参考站点:http://www.doxygen.org
Doxygen是一种适合C风格语言(如C++、C、IDL、Java甚至包括C#和PHP)的、开放源码的、基于命令行的文档产生器。
(2) C++2HTML
参考站点:http://www.bedaux.net/cpp2html/
把C++代码变成语法高亮的HTML
(3) CodeColorizer
参考站点:http://www.chami.com/colorizer/
它能把好几种语言的源代码着色为HTML
(4) Doc-O-Matic
参考站点:http://www.doc-o-matic.com/
Doc-O_Matic为你的C/C++,C++.net,Delphi/Pascal, VB.NET,C#和Java程序或者组件产生准确的文档。Doc-O-Matic使用源代码中的符号和注释以及外部的文档文件创建与流行的文档样式一致的文档。
(5) DocVizor
参考站点:http://www.ucancode.net/Products/DocBuilder/Features.htm
DocVizor满足了面向对象软件开发者的基本要求——它让我们能够看到C++工程中的类层次结构。DocVizor快速地产生完整可供打印的类层次结构图,包括从第三方库中来的那些类,除此之外DocVizor还能从类信息中产生HTML文件。
(6) SourcePublisher C++
参考站点:http://www.scitools.com/sourcepublisher_c.html
给源代码产生提供快速直观的HTML报表,包括代码,类层次结构,调用和被调用树,包含和被包含树。支持多种操作系统。
(7) Understand
参考站点:http://www.scitools.com/ucpp.html
分析任何规模的C或者C++工程,帮助我们更好的理解以及编写文档。
4.2 代码类
(1) CC-Rider
参考站点:http://www.cc-rider.com
CC-Rider是用于C/C++程序强大的代码可视化工具,通过交互式浏览、编辑及自动文件来促进程序的维持和发展。
(2) CodeInspect
参考站点:http://www.yokasoft.com/
一种新的C/C++代码分析工具。它检查我们的源代码找出非标准的,可能的,以及普通的错误代码。
(3) CodeWizard
参考站点:http://www.parasoft.com
先进的C/C++源代码分析工具,使用超过500个编码规范自动化地标明危险的,但是编译器不能检查到的代码结构。
(4) C++ Validation Test Suites
参考站点:http://www.plumhall.com/suites.html
一组用于测试编译器和库对于标准吻合程度的代码库。
(5) CppRefactory
参考站点:http://cpptool.sourceforge.net/
CPPRefactory是一个使得开发者能够重构他们的C++代码的程序。目的是使得C++代码的重构能够尽可能的有效率和简单。
(6) Lzz
参考站点:http://www.lazycplusplus.com/
Lzz是一个自动化许多C++编程中的体力活的工具。它能够节省我们许多事件并且使得编码更加有乐趣。给出一系列的声明,Lzz会给我们创建头文件和源文件。
(7) QA C++ Generation 2000
参考站点:http://www.programmingresearch.com/solutions/qacpp.htm
它关注面向对象的C++源代码,对有关于设计,效率,可靠性,可维护性的部分提出警告信息。
( s-mail project - Java to C++DOL
参考站点:http://sadlocha.strefa.pl/s-mail/ja2dol.html
把Java源代码翻译为相应的C++源代码的命令行工具。
(9) SNIP from Cleanscape Software International
参考站点:http://www.cleanscape.net/stdprod/snip/index.html
一个填平编码和设计之间沟壑的易于使用的C++开发工具,节省大量编辑和调试的事件,它还使得开发者能够指定设计模式作为对象模型,自动从对象模型中产生C++的类。
(10) SourceStyler C++
参考站点:http://www.ochresoftware.com/
对C/C++源代码提供完整的格式化和排版控制的工具。提供多于75个的格式化选项以及完全支持ANSI C++。
4.3 编译类
(1) Compilercache
参考站点:http://www.erikyyy.de/compilercache/
Compilercache是一个对你的C和C++编译器的封装脚本。每次我们进行编译,封装脚本,把编译的结果放入缓存,一旦编译相同的东西,结果将从缓存中取出而不是再次编译。
(2) Ccache
参考站点:http://ccache.samba.org/
Ccache是一个编译器缓存。它使用起来就像C/C++编译器的缓存预处理器,编译速度通常能提高普通编译过程的5~10倍。
(3) Cmm (C++ with MultiMethods)
参考站点:http://www.op59.net/cmm/cmm-0.28/users.html
这是一种C++语言的扩展。读入Cmm源代码输出C++的源代码,功能是对C++语言添加了对multimethod的支持。
(4) The Frost Project
参考站点:http://frost.flewid.de/
Forst使得你能够在C++程序中像原生的C++特性一样使用multimethod以及虚函数参数。它是一个编译器的外壳。
4.4 测试和调试类
(1) CPPUnit
CppUnit 是个基于 LGPL 的开源项目,最初版本移植自 JUnit,是一个非常优秀的开源测试框架。CppUnit 和 JUnit 一样主要思想来源于极限编程。主要功能就是对单元测试进行管理,并可进行自动化测试。
(2) C++Test
参考站点:http://www.parasoft.com/
C++ Test是一个单元测试工具,它自动化了C和C++类,函数或者组件的测试。
(3) Cantata++
参考站点:http://www.iplbath.com/products/tools/pt400.shtml
设计的目的是为了满足在合理的经济开销下使用这个工具可以让开发工程师开展单元测试和集成测试的需求.
(4) Purify
参考站点:http://www-900.ibm.com/cn/software/rational/products/purif
yplus/index.shtml
IBM Rational PurifyPlus是一套完整的运行时分析工具,旨在提高应用程序的可靠性和性能。PurifyPlus将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。
(5) BoundsChecker
BoundsChecker是一个C++运行时错误检测和调试工具。它通过在Visual Studio内自动化调试过程加速开发并且缩短上市的周期。BoundsChecker提供清楚,详细的程序错误分析,许多是对C++独有的并且在static,stack和heap内存中检测和诊断错误,以及发现内存和资源的泄漏。
(6) Insure++
参考站点:http://www.parasoft.com/
一个自动化的运行时程序测试工具,检查难以察觉的错误,如内存覆盖,内存泄漏,内存分配错误,变量初始化错误,变量定义冲突,指针错误,库错误,逻辑错误和算法错误等。
(7) GlowCode
参考站点:http://www.glowcode.com/
GlowCode包括内存泄漏检查,code profiler,函数调用跟踪等功能。给C++开发者提供完整的错误诊断,和运行时性能分析工具包。
( Stack Spy
参考站点:http://www.imperioustech.com/
它能捕捉stack corruption, stack over run, stack overflow等有关栈的错误。
------------------------------------------------------------------------
5,库
在C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解。所以文中所提的一些库都是比较著名的大型库。
5.1 标准库
标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正式定型,但是在标准库的实现上却很令人欣慰得看到多种实现,并且已被实践证明为有工业级别强度的佳作。
(1) Dinkumware C++ Library
参考站点:http://www.dinkumware.com/
P.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobb's程序设计杰出奖的获得者。其编写的库长期被Microsoft采用,并且最近Borland也取得了其OEM的license,在其C/C++的产品中采用Dinkumware的库。
(2) RogueWave Standard C++ Library
参考站点:http://www.roguewave.com/
这个库在Borland C++ Builder的早期版本中曾经被采用,后来被其他的库给替换了。笔者不推荐使用。
(3) SGI STL
参考站点:http://www.roguewave.com/
SGI公司的C++标准模版库。
(4) STLport
参考站点:http://www.stlport.org/
SGI STL库的跨平台可移植版本。
5.2 “准”标准库 - Boost
参考站点:http://www.boost.org
国内镜像:http://www.c-view.org/tech/lib/boost/index.htm
Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。
Boost中比较有名气的有这么几个库:
Regex
正则表达式库
Spirit
LL parser framework,用C++代码直接表达EBNF
Graph
图组件和算法
Lambda
在调用的地方定义短小匿名的函数对象,很实用的functional功能
concept check
检查泛型编程中的concept
Mpl
用模板实现的元编程框架
Thread
可移植的C++多线程库
Python
把C++类和函数映射到Python之中
Pool
内存池管理
smart_ptr
5个智能指针,学习智能指针必读,一份不错的参考是来自CUJ的文章:
Smart Pointers in Boost,哦,这篇文章可以查到,CUJ是提供在线浏览的。中文版见笔者在《Dr. Dobb's Journal软件研发杂志》第7辑上的译文。
Boost总体来说是实用价值很高,质量很高的库。并且由于其对跨平台的强调,对标准C++的强调,是编写平台无关,现代C++的开发者必备的工具。但是Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。并且很多Boost中的库功能堪称对语言功能的扩展,其构造用尽精巧的手法,不要贸然的花费时间研读。Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,非常值得研读的精品代码,并且也可以放心的在产品代码中多多利用。
5.3 GUI
在众多C++的库中,GUI部分的库算是比较繁荣,也比较引人注目的。在实际开发中,GUI库的选择也是非常重要的一件事情,下面我们综述一下可选择的GUI库,各自的特点以及相关工具的支持。
(1) MFC
大名鼎鼎的微软基础类库(Microsoft Foundation Class)。大凡学过VC++的人都应该知道这个库。虽然从技术角度讲,MFC是不大漂亮的,但是它构建于Windows API 之上,能够使程序员的工作更容易,编程效率高,减少了大量在建立 Windows 程序时必须编写的代码,同时它还提供了所有一般 C++ 编程的优点,例如继承和封装。MFC 编写的程序在各个版本的Windows操作系统上是可移植的,例如,在Windows 3.1下编写的代码可以很容易地移植到 Windows NT 或 Windows 95 上。但是在最近发展以及官方支持上日渐势微。
(2) QT
参考网站:http://www.trolltech.com/
Qt是Trolltech公司的一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础,同时它还支持Windows、Macintosh、Unix/X11等多种平台。
(3) WxWindows
参考网站:http://www.wxwindows.org/
跨平台的GUI库。因为其类层次极像MFC,所以有文章介绍从MFC到WxWindows的代码移植以实现跨平台的功能。通过多年的开发也是一个日趋完善的GUI库,支持同样不弱于前面两个库。并且是完全开放源代码的。新近的C++ Builder X的GUI设计器就是基于这个库的。
(4) Fox
参考网站:http://www.fox-toolkit.org/
开放源代码的GUI库。作者从自己亲身的开发经验中得出了一个理想的GUI库应该是什么样子的感受出发,从而开始了对这个库的开发。有兴趣的可以尝试一下。
(5) WTL
基于ATL的一个库。因为使用了大量ATL的轻量级手法,模板等技术,在代码尺寸,以及速度优化方面做得非常到位。主要面向的使用群体是开发COM轻量级供网络下载的可视化控件的开发者。
(6) GTK
参考网站:http://gtkmm.sourceforge.net/
GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnome这样的杀手应用。而GTK就是这个库的C++封装版本。
5.4 网络通信
(1) ACE
参考网站:http://www.cs.wustl.edu/~schmidt/ACE.html
C++库的代表,超重量级的网络通信开发框架。ACE自适配通信环境(Adaptive Communication Environment)是可以自由使用、开放源代码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++包装外观(Wrapper Facade)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。
(2) StreamModule
参考网站:http://www.omnifarious.org/StrMod/
设计用于简化编写分布式程序的库。尝试着使得编写处理异步行为的程序更容易,而不是用同步的外壳包起异步的本质。
(3) SimpleSocket
参考网站:http://home.hetnet.nl/~lcbokkers/simsock.htm
这个类库让编写基于socket的客户/服务器程序更加容易。
(4) A Stream Socket API for C++
参考网站:http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.h
tml
又一个对Socket的封装库。
5.5 XML
(1) Xerces
参考网站:http://xml.apache.org/xerces-c/
Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证,以及SAX和DOM API。XML验证在文档类型定义(Document Type Definition,DTD)方面有很好的支持,并且在2001年12月增加了支持W3C XML Schema 的基本完整的开放标准。
(2) XMLBooster
参考网站:http://www.xmlbooster.com/
这个库通过产生特制的parser的办法极大的提高了XML解析的速度,并且能够产生相应的GUI程序来修改这个parser。在DOM和SAX两大主流XML解析办法之外提供了另外一个可行的解决方案。
(3) Pull Parser
参考网站:http://www.extreme.indiana.edu/xgws/xsoap/xpp/
这个库采用pull方法的parser。在每个SAX的parser底层都有一个pull的parser,这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得尝试。
(4) Xalan
参考网站:http://xml.apache.org/xalan-c/
Xalan是一个用于把XML文档转换为HTML,纯文本或者其他XML类型文档的XSLT处理器。
(5) CMarkup
参考网站:http://www.firstobject.com/xml.htm
这是一种使用EDOM的XML解析器。在很多思路上面非常灵活实用。值得大家在DOM和SAX之外寻求一点灵感。
(6) libxml++
http://libxmlplusplus.sourceforge.net/
libxml++是对著名的libxml XML解析器的C++封装版本
5.6 科学计算
(1) Blitz++
参考网站:http://www.oonumerics.org/blitz/
Blitz++ 是一个高效率的数值计算函数库,它的设计目的是希望建立一套既具像C++ 一样方便,同时又比Fortran速度更快的数值计算环境。通常,用C++所写出的数值程序,比 Fortran慢20%左右,因此Blitz++正是要改掉这个缺点。方法是利用C++的template技术,程序执行甚至可以比Fortran更快。Blitz++目前仍在发展中,对于常见的SVD,FFTs,QMRES等常见的线性代数方法并不提供,不过使用者可以很容易地利用Blitz++所提供的函数来构建。
(2) POOMA
参考网站:http://www.codesourcery.com/pooma/pooma
POOMA是一个免费的高性能的C++库,用于处理并行式科学计算。POOMA的面向对象设计方便了快速的程序开发,对并行机器进行了优化以达到最高的效率,方便在工业和研究环境中使用。
(3) MTL
参考网站:http://www.osl.iu.edu/research/mtl/
Matrix Template Library(MTL)是一个高性能的泛型组件库,提供了各种格式矩阵的大量线性代数方面的功能。在某些应用使用高性能编译器的情况下,比如Intel的编译器,从产生的汇编代码可以看出其与手写几乎没有两样的效能。
(4) CGAL
参考网站:www.cgal.org
Computational Geometry Algorithms Library的目的是把在计算几何方面的大部分重要的解决方案和方法以C++库的形式提供给工业和学术界的用户。
5.7 游戏开发
(1) Audio/Video 3D C++ Programming Library
参考网站:http://www.galacticasoftware.com/products/av/
***3D是一个跨平台,高性能的C++库。主要的特性是提供3D图形,声效支持(SB,以及S3M),控制接口(键盘,鼠标和遥感),XMS。
(2) KlayGE
参考网站:http://home.g365.net/enginedev/
国内游戏开发高手自己用C++开发的游戏引擎。KlayGE是一个开放源代码、跨平台的游戏引擎,并使用Python作脚本语言。KlayGE在LGPL协议下发行。感谢龚敏敏先生为中国游戏开发事业所做出的贡献。
(3) OGRE
参考网站:http://www.ogre3d.org
OGRE(面向对象的图形渲染引擎)是用C++开发的,使用灵活的面向对象3D引擎。它的目的是让开发者能更方便和直接地开发基于3D硬件设备的应用程序或游戏。引擎中的类库对更底层的系统库(如:Direct3D和OpenGL)的全部使用细节进行了抽象,并提供了基于现实世界对象的接口和其它类。
5.8 线程
(1) C++ Threads
参考网站:http://threads.sourceforge.net/
这个库的目标是给程序员提供易于使用的类,这些类被继承以提供在Linux环境中很难看到的大量的线程方面的功能。
(2) ZThreads
参考网站:http://zthread.sourceforge.net/
一个先进的面向对象,跨平台的C++线程和同步库。
5.9 序列化
(1) s11n
参考网站:http://s11n.net/
一个基于STL的C++库,用于序列化POD,STL容器以及用户定义的类型。
(2) Simple XML Persistence Library
参考网站:http://sxp.sourceforge.net/
这是一个把对象序列化为XML的轻量级的C++库。
5.10 字符串
(1) C++ Str Library
参考网站:http://www.utilitycode.com/str/
操作字符串和字符的库,支持Windows和支持gcc的多种平台。提供高度优化的代码,并且支持多线程环境和Unicode,同时还有正则表达式的支持。
(2) Common Text Transformation Library
参考网站:http://cttl.sourceforge.net/
这是一个解析和修改STL字符串的库。CTTL substring类可以用来比较,插入,替换以及用EBNF的语法进行解析。
(3) GRETA
参考网站:http://research.microsoft.com/projects/greta/
这是由微软研究院的研究人员开发的处理正则表达式的库。在小型匹配的情况下有非常优秀的表现。
5.11 综合
(1) P::Classes
参考网站:http://pclasses.com/
一个高度可移植的C++应用程序框架。当前关注类型和线程安全的signal/slot机制,i/o系统包括基于插件的网络协议透明的i/o架构,基于插件的应用程序消息日志框架,访问sql数据库的类等等。
(2) ACDK - Artefaktur Component Development Kit
参考网站:http://acdk.sourceforge.net/
这是一个平台无关的C++组件框架,类似于Java或者.NET中的框架(反射机制,线程,Unicode,废料收集,I/O,网络,实用工具,XML,等等),以及对Java, Perl, Python, TCL, Lisp, COM 和 CORBA的集成。
(3) dlib C++ library
参考网站:http://www.cis.ohio-state.edu/~kingd/dlib/
各种各样的类的一个综合。大整数,Socket,线程,GUI,容器类,以及浏览目录的API等等。
(4) Chilkat C++ Libraries
参考网站:http://www.chilkatsoft.com/cpp_libraries.asp
这是提供zip,e-mail,编码,S/MIME,XML等方面的库。
(5) C++ Portable Types Library (PTypes)
参考网站:http://www.melikyan.com/ptypes/
这是STL的比较简单的替代品,以及可移植的多线程和网络库。
(6) LFC
参考网站:http://lfc.sourceforge.net/
哦,这又是一个尝试提供一切的C++库
5.12 其他库
(1) Loki
参考网站:http://www.moderncppdesign.com/
哦,你可能抱怨我早该和Boost一起介绍它,一个实验性质的库。作者在loki中把C++模板的功能发挥到了极致。并且尝试把类似设计模式这样思想层面的东西通过库来提供。同时还提供了智能指针这样比较实用的功能。
(2) ATL
ATL(Active Template Library)
是一组小巧、高效、灵活的类,这些类为创建可互操作的COM组件提供了基本的设施。
(3) FC++: The Functional C++ Library
这个库提供了一些函数式语言中才有的要素。属于用库来扩充语言的一个代表作。如果想要在OOP之外寻找另一分的乐趣,可以去看看函数式程序设计的世界。大师Peter Norvig在 “Teach Yourself Programming in Ten Years”一文中就将函数式语言列为至少应当学习的6类编程语言之一。
(4) FACT!
参考网站:http://www.kfa-juelich.de/zam/FACT/start/index.html
另外一个实现函数式语言特性的库
(5) Crypto++
提供处理密码,消息验证,单向hash,公匙加密系统等功能的免费库。
还有很多非常激动人心或者是极其实用的C++库,限于我们的水平以及文章的篇幅不能包括进来。在对于这些已经包含近来的库的介绍中,由于并不是每一个我们都使用过,所以难免有偏颇之处,请读者见谅。
------------------------------------------------------------------------
6,书籍
以前熊节先生曾撰文评论相对于Java程序设计语言,C++的好书多如牛毛。荣耀先生在《程序员》杂志上撰文《C++程序设计之四书五经》也将本领域内几乎所有的经典书籍作了全面的介绍,任何关于书的评论此时看来便是很多余的了。个人浅见,除非你打算以C++作为唯一兴趣或者生存之本,一般读者确实没有足够的时间和必要将20余本书籍全部阅读。更有参考价值的是荣耀先生的另一篇文章:《至少应该阅读的九本C++著作》,可以从下面的地址浏览到此文:
http://www.royaloo.com/articles/articles_2003/9CppBooks.htm
下面几本书对于走在C++初学之路上的读者是我们最愿意推荐给大家的:
(1) 《C++ Primer》
哦,也许你会抱怨我们为什么不先介绍TCPL,但对于走在学习之路上的入门者,本书内容更为全面,更为详细易懂,我们称它为“C++的超级宝典”并不过分。配有一本不错的习题解答《C++ Primer Answer Book》可以辅助你的学习之路。
(2) 《Essential C++》
如果说《C++ Primer》是C++领域的超级宝典,那么此书作为掌握C++的大局观当之无愧。正如《.NET大局观》一书能够让读者全揽.NET,本书讲述了C++中最核心的全部主题。书虽不厚,内容精炼,不失为《C++ Primer》读者茶余饭后的主题回顾之作。
(3) 《The C++ Programming Language》
Bjarne为你带来的C++教程,真正能够告诉你怎么用才叫真正的C++的唯一一本书。虽然如同“某某程序设计语言”这样的书籍会给大家一个内容全揽,入门到精通的感觉,但本书确实不太适合初学者阅读。如果你自认为是一名很有经验的C++程序员,那至少也要反复咀嚼Bjarne先生所强调的若干内容。
(4) 《Effective C++》,《More Effective C++》
是的,正如一些C++爱好者经常以读过与没有读过上述两本作品来区分你是否是C++高手。我们也极力推崇这两本著作。在各种介绍C++专家经验的书籍里面,这两本是最贴近语言本质,看后最能够有脱胎换骨感觉的书,读此书你需每日三省汝身。
技术书籍仁者见仁,过多的评论反无太多意义,由读者喜好选择最适合自己的书方为上策。
------------------------------------------------------------------------
7,资源网站
正如我们可以通过计算机历史上的重要人物了解计算机史的发展,C++相关人物的网站也可以使我们得到最有价值的参考与借鉴,下面的人物我们认为没有介绍的必要,只因下面的人物在C++领域的地位众所周知,我们只将相关的资源进行罗列以供读者学习,他们有的工作于贝尔实验室,有的工作于知名编译器厂商,有的在不断推进语言的标准化,有的为读者撰写了多部千古奇作……
(1) Bjarne Stroustrup
http://www.research.att.com/~bs/
(2) Stanley B. Lippman
http://blogs.msdn.com/slippman/
中文版 http://www.zengyihome.net/slippman/index.htm
(3) Scott Meyers
http://www.aristeia.com/
(4) David Musser
http://www.cs.rpi.edu/~musser/
(5) Bruce Eckel
http://www.bruceeckel.com
(6) Nicolai M. Josuttis
http://www.josuttis.com/
(7) Herb Sutter
http://www.gotw.ca/
( Andrei Alexandrescu
http://www.coderncppdesign.com/
(9) 侯捷先生
http://www.jjhou.com
(10) 孟岩先生
先生繁忙于工作,痴迷于技术,暂无个人主页,关于先生的作品可以通过CSDN的专栏和侯先生的主页访问到。
(11) 荣耀先生
http://www.royaloo.com/
(12) 潘爱民先生
http://www.icst.pku.edu.cn/panaimin/pam_homepage.htm
除了上述大师的主页外,以下的综合类C++学习参考站点是我们非常愿意向大家推荐的:
(1) CodeProject
http://www.codeproject.com
(2) CodeGuru
http://www.codeguru.com
(3) Dr. Dobb's Journal
http://www.ddj.com
(4) C/C++ Users Journal
http://www.cuj.com
(5) C维视点
http://www.c-view.org
(6) allaboutprogram
http://www.allaboutprogram.com
其他资料
(1) ISO IEC JTC1/SC22/WG21 - C++:标准C++的权威参考
http://anubis.dkuug.dk/jtc1/sc22/wg21/
(2) C++ FAQ LITE — Frequently Asked Questions: 最为全面的C++FAQ
http://www.sunistudio.com/cppfaq/index.html
C/C++ 新闻组:
你不妨尝试从这里提问和回答问题,很多不错的Q&A资源......
(1) .alt.comp.lang.learn.c-c++
这个简单些,如果你和我一样是个菜鸟
(2) .comp.lang.c++.moderated
嗯,这个显然水平高一些
(3) .comp.std.c++
如果你需要讨论标准C++相关话题的话
------------------------------------------------------------------------
8,不得不写的结束语
结束的时候也是总结现状,展望未来的时候。虽然C++从脱胎于C开始,一路艰难坎坷的走过来,但是无论如何C++已经取得了工业基础的地位。文章列举的大量相关资源就是最好的证明,而业界的大量用C++写成的产品代码以及大量的C++职业工程师则是最直接的证明。同时,我们可以看到各个高校的计算机专业都开设有C++这门课程,网络上对于C++的学习讨论也从来都没有停过。但是,在Java和.NET两大企业开发平台的围攻下,给人的感觉是C++越来越“不行”了。
C++在面向企业的软件开发中,在开发便捷性等方面的确要比Java和C#差很多,其中一个问题是C++语言本身比较复杂,学习曲线比较陡峭,另外一个问题是C++标准化的时间太长,丧失了很多的壮大机会,耗费了很多精力在厂商的之间的斗争上,而C++的标准库离一个完善的程序开发框架还缺少太多太多的内容,各个第三方的类库和框架又在一致性和完整性上没法和随平台提供的框架相提并论。难道C++真的要退出历史舞台了?
从C++目前的活跃程度,以及应用现状来说是完全能够肯定C++仍然是软件工业的基础,也不会退出历史舞台的。另外从Boost,Loki这些库中我们也能够看到C++的发展非常活跃,对于新技术新思维非常激进,C++仍然广泛受到关注。从ACE在高性能通信领域的应用,以及MTL这样的库在数值计算领域的出色表现,我们可以看到C++在高性能应用场合下的不可替代的作用,而嵌入式系统这样的内存受限开发平台,比如Symbian OS上,C++已经发挥着并且将发挥更大的作用。可以预见的是以后的软件无论上层的应用怎么变,它的底层核心都会是由C/C++这样的系统级软件编写的,比如Java虚拟机,.NET Framwork。因为只有这样的系统级软件才能完全彻底的发挥机器的功能。
需要看到的是两个趋势,一个趋势是C++变得更加复杂,更加学院派,通过模板等有潜力的语法因素构造越来越精巧的库成为了现代C++的热点,虽然在利用库实现新的编程范式,乃至设计模式等方面很有开创意义,也确实产生了一些能够便捷开发的工具,但是更多的是把C++变得更加强大,更加复杂,也更加难懂,似乎也更加学院派,不得不说它正在向边缘化道路发展。另一个趋势是C++在主流的企业应用开发中已经逐渐退出了,ERP这样的企业软件开发中基本上不会考虑C++,除非需要考虑性能或者和遗留代码的集成这些因素。C++退守到系统级别语言,成为软件工业的基础是大势所趋。然而反思一下,真的是退守么?自从STL出现,无数的人风起云涌的开始支持C++,他们狂呼“我看到深夜消失了,目标软件工程的出现。我看到了可维护的代码。”是的,STL在可维护性下做得如此出色。但是又怎样呢?STL为C++铺平了现代软件工程的道路,而在上层应用程序软件开发领域这块场地早不单独属于C++,很多程序设计语言都做得很出色,疯狂的支持者会毫不犹豫地说我们应当支持C++,因为它是世界上最棒的语言。而坦率地说,你的腰杆真的那么硬么?也许只是在逃避一些事实。C++是优秀的,这不可否认,STL的出现让C++一度走上了最辉煌的时刻,然而现在看来……我的一位恩师曾言:真正能够将STL应用得淋漓尽致的人很保守地说国内也不超过200人,或许不加入STL能够使C++向着它应当发展的方向发展的更好,而现在看来,C++也应当回首到真正属于他的那一片圣地上……
作者: dohf 发表日期: 2006-04-10 22:50 文章属性: 转载 复制链接
撰文/曾毅陶文
最后更新:2004年6月11日
声明:
.本文2004年5月首发于《CSDN开发高手》,版权归该杂志与《程序员》杂志社所有。杂志限于篇幅部分内容有所删节,此处版本为相对完整版本。
.本文为介绍性文章,会随笔者学习C++语言不断更新。
1,前言
无数次听到“我要开始学习C++!”的呐喊,无数次听到“C++太复杂了,我真的学不会”的无奈。Stan Lippman先生曾在《C++ Primer》一书中指出“C++是最为难学的高级程序设计语言之一”,人们常将“之一”去掉以表达自己对C++的敬畏。诚然,C++程序设计语言对于学习者的确有很多难以逾越的鸿沟,体系结构的庞大,应接不暇并不断扩充的特性……除此之外,参考资料之多与冗杂使它的学习者望而却步,欲求深入者苦不堪言。希望这一份不完全导引能够成为您C++学习之路上的引路灯。
撰写本文的初衷并不打算带领大家体验古老的C++历史,如果你想了解C++的历史与其前期发展中诸多技术的演变,你应当去参考Bjarne的《The Design and Evolution of C++》。当然也不打算给大家一个无所不包的宝典(并非不想:其一是因水平有限,其二无奈C++之博大精深),所给出的仅仅是一些我们认为对于想学习C++的广大读者来说最重要并且触手可及的开发与学习资源。
本文介绍并分析了一些编译器,开发环境,库,少量的书籍以及参考网站,并且尽可能尝试着给出一个利用这些资源的导引,望对如同我们一样的初学者能够有所裨益。
------------------------------------------------------------------------
2,编译器
在C++之外的任何语言中,编译器都从来没有受到过如此之重视。因为C++是一门相当复杂的语言,所以编译器也难于构建。直到最近我们才开始能够使用上完全符合C++标准的编译器(哦,你可能会责怪那些编译器厂商不能尽早的提供符合标准的编译器,这只能怪他们各自维系着自身的一套别人不愿接受的标准)。什么?你说这无关紧要?哦,不,你所需要的是和标准化C++高度兼容的编译环境。长远来看,只有这样的编译器对C++开发人员来说才是最有意义的工具,尤其是对于程序设计语言的学习者。一至性让代码具备可移植性,并让一门语言及其库的应用更为广泛。嗯,是的,我们这里只打算介绍一些公认的优秀编译器。
2.1 Borland C++
这个是Borland C++ Builder和Borland C++ Builder X这两种开发环境的后台编译器。(哦,我之所以将之分为两种开发环境你应当能明白为什么,正如Delphi7到Delphi8的转变,是革命性的两代。)Borland C++由老牌开发工具厂商Borland倾力打造。该公司的编译器素以速度快,空间效率高著称,Borland C++ 系列编译器秉承了这个传统,属于非常优质的编译器。标准化方面早在5.5版本的编译器中对标准化C++的兼容就达到了92.73%。目前最新版本是Borland C++ Builder X中的6.0版本,官方称100%符合ANSI/ISO的C++标准以及C99标准。嗯…这正是我前面所指的“完全符合C++标准的编译器”。
2.2 Visual C++
这个正是我们熟知的Visual Studio 和 Visual Studio.net 2002, 2003以及2005 Whidbey中带的C++编译器。由Microsoft公司研制。在Visual Studio 6.0中,因为编译器有太多地方不能与后来出现的C++标准相吻合而饱受批评(想想你在使用STL的时候编译时报出的那些令人厌恶的error和warning吧)。VC++6.0对标准化C++的兼容只有83.43%。但是随着C++编译器设计大师Stanley Lippman以及诸多C++社群达人的加盟,在Visual Studio.NET 2003中,Visual C++编译器已经成为一个非常成熟可靠的C++编译器了。Dr.Dobb's Journal的评测显示Visual C++7.1对标准C++的兼容性高达98.22%,一度成为CBX之前兼容性最好的编译器。结合强大的Visual Studio.NET开发环境,是一个非常不错的选择。至于Whidbey时代的Visual C++,似乎微软所最关注的是C++/CLI……我们不想评论微软下一代的C++编译器对标准化兼容如何,但他确实越来越适合.NET (其实你和我的感觉可能是一样的,微软不应当把标准C++这块肥肉丢给Borland,然而微软可能并不这样认为)。
2.3 GNU C++
著名的开源C++编译器。是类Unix操作系统下编写C++程序的首选。特点是有非常好的移植性,你可以在非常广泛的平台上使用它,同时也是编写跨平台,嵌入式程序很好的选择。另外在符合标准这个方面一直都非常好,GCC3.3大概能够达到96.15%。但是由于其跨平台的特性,在代码尺寸速度等优化上略微差一点。
基于GNU C++的编译器有很多,比如:
(1) Mingw
http://www.mingw.org/
GCC的一个Windows的移植版本(Dev-C++的后台)
(2) Cygwin
http://sources.redhat.com/cygwin/
GCC的另外一个Windows移植版本是Cygwin的一部分,Cygwin是Windows下的一个Unix仿真环境。严格的说是模拟GNU的环境,这也就是"Gnu's Not Unix"要表达的意思,噢,扯远了,这并不是我们在这里关心的实质内容。
(3) Djgpp
http://www.delorie.com/djgpp/
这是GCC的DOS移植版本。
(4) RSXNT
http://www.mathematik.uni-bielefeld.de/~rainer/
这是GCC的DOS和Windows移植版本。
(5) Intel C++
著名CPU制造厂商Intel出品的编译器,Special Design for Intel x86!对于Intel x86结构的CPU经过特别的优化。在有些应用情况下,特别是数值计算等高性能应用,仅仅采用Intel的编译器编译就能大幅度的提高性能。
(6) Digital Mars C++
网络上提供免费下载,Zortech/Symantec C++的继承者,其前身在当年惨烈的C++四国战中也是主角之一。
------------------------------------------------------------------------
3,开发环境
开发环境对于程序员的作用不言而喻。选择自己朝夕相处的环境也不是容易的事情,特别是在IDE如此丰富的情况下。下面就是我们推荐的一些常见的C++开发环境,并没有包括一些小型的,罕见的IDE。其中任何一款都是功能丰富,可以用作日常开发使用的。对于不同层面的开发者,请参见内文关于适用对象的描述。
3.1 Visual Studio 6.0
这个虽然是Microsoft公司的老版本的开发环境,但是鉴于其后继版本VisualStudio.NET的庞大身躯,以及初学者并不那么高的功能要求,所以推荐这个开发环境给C++的初学者,供其学习C++的最基本的部分,比如C的那部分子集,当然你别指望他能够支持最新的C99标准。在日常的开发中,仍然有很多公司使用这个经典稳定的环境,比如笔者就看曾亲见有些公司将其编译器替换为GCC做手机开发之用。
3.2 Visual Studio.NET 2003
作为Microsoft公司官方正式发布的最新版本开发环境,其中有太多激动人心的功能。结合其最新的C++编译器。对于机器配置比较好的开发人员来说,使用这个开发环境将能满足其大部分的要求。这里不打算单独说Visual Studio Whidbey,虽然Visual Studio .NET 2005 - Whidbey社区预览版已经推出,但暂不是很稳定,读者可以亲身去体验。
3.3 Borland C++ Builder 6
这个并不是Borland的C++开发环境的最新版本。选择它的原因是它不是用Java写的IDE,速度比较快。它有一个很完善的GUI窗体设计器,和Delphi共用一个VCL。由于这些特点,比较适合初学者上手。但是由于其GUI的中心位置,可能不利于对于C++语言的学习。而且其为了支持VCL这个Object Pascal写的库也对C++进行了一些私有的扩充。使得人们有一个不得不接受的事实:“Borland C++ Builder 6的高手几乎都是Delphi高手”。
3.4 Borland C++ Builder X
正如前文所述,虽然版本号上和前面那个IDE非常相象,但是其实它们是完全不同的两个集成开发环境。C++Builder更多的是一个和Delphi同步的C++版本的开发环境,C++BuilderX则是完全从C++的角度思考得出的一个功能丰富的IDE。其最大的特点是跨平台,跨编译器,多种Framework的集成,并且有一个WxWindows为基础的GUI设计器。尤其是采用了纯C++来重写了整个Framework,摒弃了以前令人无奈的版本。对于C++的开发来说,从编译器,到库,到功能集成都是非常理想的。可以预见,Borland C++ Builder X 2.0很值得C++爱好者期待。唯一令人难堪之处是作为一个C++的开发工具,其IDE是用Java写的,在配置不够理想的机器上请慎重考虑再安装。
3.5 Emacs + GCC
前面讲的大部分是Windows环境下的集成开发环境。Linux上的开发者更倾向于使用Emacs来编辑C++的文件,用Makefile来命令GCC做编译。虽然看上去比较松散,但是这些东西综合起来还是一个开0发环境。如果你能够娴熟的使用这样的环境写程序,你的水平应该足够指导我们来写这篇陋文了。
3.6 Dev C++
GCC是一个很好的编译器。在Windows上的C++编译器一直和标准有着一段距离的时候,GCC就是一个让Windows下开发者流口水的编译器。Dev-C++就是能够让GCC跑在Windows下的工具,作为集成开发环境,还提供了同专业IDE相媲美的语法高亮,代码提示,调试等功能。由于使用Delphi开发,占用内存少,速度很快,比较适合轻量级的学习和使用。
3.7 Eclipse + CDT
Eclipse可是近来大名鼎鼎的开发工具。最新一期的Jolt大奖就颁给了这个杰出的神物。说其神奇是因为,它本身是用Java写的,但是拥有比一般Java写的程序快得多的速度。而且因为其基于插件组装一切的原则,使得能够有CDT这样的插件把Eclipse变成一个C/C++的开发环境。如果你一直用Eclipse写Java的程序,不妨用它体验一下C++开发的乐趣。
------------------------------------------------------------------------
4,工具
C++的辅助工具繁多,我们分门别类的为大家作介绍:
4.1 文档类
(1) Doxygen
参考站点:http://www.doxygen.org
Doxygen是一种适合C风格语言(如C++、C、IDL、Java甚至包括C#和PHP)的、开放源码的、基于命令行的文档产生器。
(2) C++2HTML
参考站点:http://www.bedaux.net/cpp2html/
把C++代码变成语法高亮的HTML
(3) CodeColorizer
参考站点:http://www.chami.com/colorizer/
它能把好几种语言的源代码着色为HTML
(4) Doc-O-Matic
参考站点:http://www.doc-o-matic.com/
Doc-O_Matic为你的C/C++,C++.net,Delphi/Pascal, VB.NET,C#和Java程序或者组件产生准确的文档。Doc-O-Matic使用源代码中的符号和注释以及外部的文档文件创建与流行的文档样式一致的文档。
(5) DocVizor
参考站点:http://www.ucancode.net/Products/DocBuilder/Features.htm
DocVizor满足了面向对象软件开发者的基本要求——它让我们能够看到C++工程中的类层次结构。DocVizor快速地产生完整可供打印的类层次结构图,包括从第三方库中来的那些类,除此之外DocVizor还能从类信息中产生HTML文件。
(6) SourcePublisher C++
参考站点:http://www.scitools.com/sourcepublisher_c.html
给源代码产生提供快速直观的HTML报表,包括代码,类层次结构,调用和被调用树,包含和被包含树。支持多种操作系统。
(7) Understand
参考站点:http://www.scitools.com/ucpp.html
分析任何规模的C或者C++工程,帮助我们更好的理解以及编写文档。
4.2 代码类
(1) CC-Rider
参考站点:http://www.cc-rider.com
CC-Rider是用于C/C++程序强大的代码可视化工具,通过交互式浏览、编辑及自动文件来促进程序的维持和发展。
(2) CodeInspect
参考站点:http://www.yokasoft.com/
一种新的C/C++代码分析工具。它检查我们的源代码找出非标准的,可能的,以及普通的错误代码。
(3) CodeWizard
参考站点:http://www.parasoft.com
先进的C/C++源代码分析工具,使用超过500个编码规范自动化地标明危险的,但是编译器不能检查到的代码结构。
(4) C++ Validation Test Suites
参考站点:http://www.plumhall.com/suites.html
一组用于测试编译器和库对于标准吻合程度的代码库。
(5) CppRefactory
参考站点:http://cpptool.sourceforge.net/
CPPRefactory是一个使得开发者能够重构他们的C++代码的程序。目的是使得C++代码的重构能够尽可能的有效率和简单。
(6) Lzz
参考站点:http://www.lazycplusplus.com/
Lzz是一个自动化许多C++编程中的体力活的工具。它能够节省我们许多事件并且使得编码更加有乐趣。给出一系列的声明,Lzz会给我们创建头文件和源文件。
(7) QA C++ Generation 2000
参考站点:http://www.programmingresearch.com/solutions/qacpp.htm
它关注面向对象的C++源代码,对有关于设计,效率,可靠性,可维护性的部分提出警告信息。
( s-mail project - Java to C++DOL
参考站点:http://sadlocha.strefa.pl/s-mail/ja2dol.html
把Java源代码翻译为相应的C++源代码的命令行工具。
(9) SNIP from Cleanscape Software International
参考站点:http://www.cleanscape.net/stdprod/snip/index.html
一个填平编码和设计之间沟壑的易于使用的C++开发工具,节省大量编辑和调试的事件,它还使得开发者能够指定设计模式作为对象模型,自动从对象模型中产生C++的类。
(10) SourceStyler C++
参考站点:http://www.ochresoftware.com/
对C/C++源代码提供完整的格式化和排版控制的工具。提供多于75个的格式化选项以及完全支持ANSI C++。
4.3 编译类
(1) Compilercache
参考站点:http://www.erikyyy.de/compilercache/
Compilercache是一个对你的C和C++编译器的封装脚本。每次我们进行编译,封装脚本,把编译的结果放入缓存,一旦编译相同的东西,结果将从缓存中取出而不是再次编译。
(2) Ccache
参考站点:http://ccache.samba.org/
Ccache是一个编译器缓存。它使用起来就像C/C++编译器的缓存预处理器,编译速度通常能提高普通编译过程的5~10倍。
(3) Cmm (C++ with MultiMethods)
参考站点:http://www.op59.net/cmm/cmm-0.28/users.html
这是一种C++语言的扩展。读入Cmm源代码输出C++的源代码,功能是对C++语言添加了对multimethod的支持。
(4) The Frost Project
参考站点:http://frost.flewid.de/
Forst使得你能够在C++程序中像原生的C++特性一样使用multimethod以及虚函数参数。它是一个编译器的外壳。
4.4 测试和调试类
(1) CPPUnit
CppUnit 是个基于 LGPL 的开源项目,最初版本移植自 JUnit,是一个非常优秀的开源测试框架。CppUnit 和 JUnit 一样主要思想来源于极限编程。主要功能就是对单元测试进行管理,并可进行自动化测试。
(2) C++Test
参考站点:http://www.parasoft.com/
C++ Test是一个单元测试工具,它自动化了C和C++类,函数或者组件的测试。
(3) Cantata++
参考站点:http://www.iplbath.com/products/tools/pt400.shtml
设计的目的是为了满足在合理的经济开销下使用这个工具可以让开发工程师开展单元测试和集成测试的需求.
(4) Purify
参考站点:http://www-900.ibm.com/cn/software/rational/products/purif
yplus/index.shtml
IBM Rational PurifyPlus是一套完整的运行时分析工具,旨在提高应用程序的可靠性和性能。PurifyPlus将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。
(5) BoundsChecker
BoundsChecker是一个C++运行时错误检测和调试工具。它通过在Visual Studio内自动化调试过程加速开发并且缩短上市的周期。BoundsChecker提供清楚,详细的程序错误分析,许多是对C++独有的并且在static,stack和heap内存中检测和诊断错误,以及发现内存和资源的泄漏。
(6) Insure++
参考站点:http://www.parasoft.com/
一个自动化的运行时程序测试工具,检查难以察觉的错误,如内存覆盖,内存泄漏,内存分配错误,变量初始化错误,变量定义冲突,指针错误,库错误,逻辑错误和算法错误等。
(7) GlowCode
参考站点:http://www.glowcode.com/
GlowCode包括内存泄漏检查,code profiler,函数调用跟踪等功能。给C++开发者提供完整的错误诊断,和运行时性能分析工具包。
( Stack Spy
参考站点:http://www.imperioustech.com/
它能捕捉stack corruption, stack over run, stack overflow等有关栈的错误。
------------------------------------------------------------------------
5,库
在C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解。所以文中所提的一些库都是比较著名的大型库。
5.1 标准库
标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正式定型,但是在标准库的实现上却很令人欣慰得看到多种实现,并且已被实践证明为有工业级别强度的佳作。
(1) Dinkumware C++ Library
参考站点:http://www.dinkumware.com/
P.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobb's程序设计杰出奖的获得者。其编写的库长期被Microsoft采用,并且最近Borland也取得了其OEM的license,在其C/C++的产品中采用Dinkumware的库。
(2) RogueWave Standard C++ Library
参考站点:http://www.roguewave.com/
这个库在Borland C++ Builder的早期版本中曾经被采用,后来被其他的库给替换了。笔者不推荐使用。
(3) SGI STL
参考站点:http://www.roguewave.com/
SGI公司的C++标准模版库。
(4) STLport
参考站点:http://www.stlport.org/
SGI STL库的跨平台可移植版本。
5.2 “准”标准库 - Boost
参考站点:http://www.boost.org
国内镜像:http://www.c-view.org/tech/lib/boost/index.htm
Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。
Boost中比较有名气的有这么几个库:
Regex
正则表达式库
Spirit
LL parser framework,用C++代码直接表达EBNF
Graph
图组件和算法
Lambda
在调用的地方定义短小匿名的函数对象,很实用的functional功能
concept check
检查泛型编程中的concept
Mpl
用模板实现的元编程框架
Thread
可移植的C++多线程库
Python
把C++类和函数映射到Python之中
Pool
内存池管理
smart_ptr
5个智能指针,学习智能指针必读,一份不错的参考是来自CUJ的文章:
Smart Pointers in Boost,哦,这篇文章可以查到,CUJ是提供在线浏览的。中文版见笔者在《Dr. Dobb's Journal软件研发杂志》第7辑上的译文。
Boost总体来说是实用价值很高,质量很高的库。并且由于其对跨平台的强调,对标准C++的强调,是编写平台无关,现代C++的开发者必备的工具。但是Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。并且很多Boost中的库功能堪称对语言功能的扩展,其构造用尽精巧的手法,不要贸然的花费时间研读。Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,非常值得研读的精品代码,并且也可以放心的在产品代码中多多利用。
5.3 GUI
在众多C++的库中,GUI部分的库算是比较繁荣,也比较引人注目的。在实际开发中,GUI库的选择也是非常重要的一件事情,下面我们综述一下可选择的GUI库,各自的特点以及相关工具的支持。
(1) MFC
大名鼎鼎的微软基础类库(Microsoft Foundation Class)。大凡学过VC++的人都应该知道这个库。虽然从技术角度讲,MFC是不大漂亮的,但是它构建于Windows API 之上,能够使程序员的工作更容易,编程效率高,减少了大量在建立 Windows 程序时必须编写的代码,同时它还提供了所有一般 C++ 编程的优点,例如继承和封装。MFC 编写的程序在各个版本的Windows操作系统上是可移植的,例如,在Windows 3.1下编写的代码可以很容易地移植到 Windows NT 或 Windows 95 上。但是在最近发展以及官方支持上日渐势微。
(2) QT
参考网站:http://www.trolltech.com/
Qt是Trolltech公司的一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础,同时它还支持Windows、Macintosh、Unix/X11等多种平台。
(3) WxWindows
参考网站:http://www.wxwindows.org/
跨平台的GUI库。因为其类层次极像MFC,所以有文章介绍从MFC到WxWindows的代码移植以实现跨平台的功能。通过多年的开发也是一个日趋完善的GUI库,支持同样不弱于前面两个库。并且是完全开放源代码的。新近的C++ Builder X的GUI设计器就是基于这个库的。
(4) Fox
参考网站:http://www.fox-toolkit.org/
开放源代码的GUI库。作者从自己亲身的开发经验中得出了一个理想的GUI库应该是什么样子的感受出发,从而开始了对这个库的开发。有兴趣的可以尝试一下。
(5) WTL
基于ATL的一个库。因为使用了大量ATL的轻量级手法,模板等技术,在代码尺寸,以及速度优化方面做得非常到位。主要面向的使用群体是开发COM轻量级供网络下载的可视化控件的开发者。
(6) GTK
参考网站:http://gtkmm.sourceforge.net/
GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnome这样的杀手应用。而GTK就是这个库的C++封装版本。
5.4 网络通信
(1) ACE
参考网站:http://www.cs.wustl.edu/~schmidt/ACE.html
C++库的代表,超重量级的网络通信开发框架。ACE自适配通信环境(Adaptive Communication Environment)是可以自由使用、开放源代码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++包装外观(Wrapper Facade)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。
(2) StreamModule
参考网站:http://www.omnifarious.org/StrMod/
设计用于简化编写分布式程序的库。尝试着使得编写处理异步行为的程序更容易,而不是用同步的外壳包起异步的本质。
(3) SimpleSocket
参考网站:http://home.hetnet.nl/~lcbokkers/simsock.htm
这个类库让编写基于socket的客户/服务器程序更加容易。
(4) A Stream Socket API for C++
参考网站:http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.h
tml
又一个对Socket的封装库。
5.5 XML
(1) Xerces
参考网站:http://xml.apache.org/xerces-c/
Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证,以及SAX和DOM API。XML验证在文档类型定义(Document Type Definition,DTD)方面有很好的支持,并且在2001年12月增加了支持W3C XML Schema 的基本完整的开放标准。
(2) XMLBooster
参考网站:http://www.xmlbooster.com/
这个库通过产生特制的parser的办法极大的提高了XML解析的速度,并且能够产生相应的GUI程序来修改这个parser。在DOM和SAX两大主流XML解析办法之外提供了另外一个可行的解决方案。
(3) Pull Parser
参考网站:http://www.extreme.indiana.edu/xgws/xsoap/xpp/
这个库采用pull方法的parser。在每个SAX的parser底层都有一个pull的parser,这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得尝试。
(4) Xalan
参考网站:http://xml.apache.org/xalan-c/
Xalan是一个用于把XML文档转换为HTML,纯文本或者其他XML类型文档的XSLT处理器。
(5) CMarkup
参考网站:http://www.firstobject.com/xml.htm
这是一种使用EDOM的XML解析器。在很多思路上面非常灵活实用。值得大家在DOM和SAX之外寻求一点灵感。
(6) libxml++
http://libxmlplusplus.sourceforge.net/
libxml++是对著名的libxml XML解析器的C++封装版本
5.6 科学计算
(1) Blitz++
参考网站:http://www.oonumerics.org/blitz/
Blitz++ 是一个高效率的数值计算函数库,它的设计目的是希望建立一套既具像C++ 一样方便,同时又比Fortran速度更快的数值计算环境。通常,用C++所写出的数值程序,比 Fortran慢20%左右,因此Blitz++正是要改掉这个缺点。方法是利用C++的template技术,程序执行甚至可以比Fortran更快。Blitz++目前仍在发展中,对于常见的SVD,FFTs,QMRES等常见的线性代数方法并不提供,不过使用者可以很容易地利用Blitz++所提供的函数来构建。
(2) POOMA
参考网站:http://www.codesourcery.com/pooma/pooma
POOMA是一个免费的高性能的C++库,用于处理并行式科学计算。POOMA的面向对象设计方便了快速的程序开发,对并行机器进行了优化以达到最高的效率,方便在工业和研究环境中使用。
(3) MTL
参考网站:http://www.osl.iu.edu/research/mtl/
Matrix Template Library(MTL)是一个高性能的泛型组件库,提供了各种格式矩阵的大量线性代数方面的功能。在某些应用使用高性能编译器的情况下,比如Intel的编译器,从产生的汇编代码可以看出其与手写几乎没有两样的效能。
(4) CGAL
参考网站:www.cgal.org
Computational Geometry Algorithms Library的目的是把在计算几何方面的大部分重要的解决方案和方法以C++库的形式提供给工业和学术界的用户。
5.7 游戏开发
(1) Audio/Video 3D C++ Programming Library
参考网站:http://www.galacticasoftware.com/products/av/
***3D是一个跨平台,高性能的C++库。主要的特性是提供3D图形,声效支持(SB,以及S3M),控制接口(键盘,鼠标和遥感),XMS。
(2) KlayGE
参考网站:http://home.g365.net/enginedev/
国内游戏开发高手自己用C++开发的游戏引擎。KlayGE是一个开放源代码、跨平台的游戏引擎,并使用Python作脚本语言。KlayGE在LGPL协议下发行。感谢龚敏敏先生为中国游戏开发事业所做出的贡献。
(3) OGRE
参考网站:http://www.ogre3d.org
OGRE(面向对象的图形渲染引擎)是用C++开发的,使用灵活的面向对象3D引擎。它的目的是让开发者能更方便和直接地开发基于3D硬件设备的应用程序或游戏。引擎中的类库对更底层的系统库(如:Direct3D和OpenGL)的全部使用细节进行了抽象,并提供了基于现实世界对象的接口和其它类。
5.8 线程
(1) C++ Threads
参考网站:http://threads.sourceforge.net/
这个库的目标是给程序员提供易于使用的类,这些类被继承以提供在Linux环境中很难看到的大量的线程方面的功能。
(2) ZThreads
参考网站:http://zthread.sourceforge.net/
一个先进的面向对象,跨平台的C++线程和同步库。
5.9 序列化
(1) s11n
参考网站:http://s11n.net/
一个基于STL的C++库,用于序列化POD,STL容器以及用户定义的类型。
(2) Simple XML Persistence Library
参考网站:http://sxp.sourceforge.net/
这是一个把对象序列化为XML的轻量级的C++库。
5.10 字符串
(1) C++ Str Library
参考网站:http://www.utilitycode.com/str/
操作字符串和字符的库,支持Windows和支持gcc的多种平台。提供高度优化的代码,并且支持多线程环境和Unicode,同时还有正则表达式的支持。
(2) Common Text Transformation Library
参考网站:http://cttl.sourceforge.net/
这是一个解析和修改STL字符串的库。CTTL substring类可以用来比较,插入,替换以及用EBNF的语法进行解析。
(3) GRETA
参考网站:http://research.microsoft.com/projects/greta/
这是由微软研究院的研究人员开发的处理正则表达式的库。在小型匹配的情况下有非常优秀的表现。
5.11 综合
(1) P::Classes
参考网站:http://pclasses.com/
一个高度可移植的C++应用程序框架。当前关注类型和线程安全的signal/slot机制,i/o系统包括基于插件的网络协议透明的i/o架构,基于插件的应用程序消息日志框架,访问sql数据库的类等等。
(2) ACDK - Artefaktur Component Development Kit
参考网站:http://acdk.sourceforge.net/
这是一个平台无关的C++组件框架,类似于Java或者.NET中的框架(反射机制,线程,Unicode,废料收集,I/O,网络,实用工具,XML,等等),以及对Java, Perl, Python, TCL, Lisp, COM 和 CORBA的集成。
(3) dlib C++ library
参考网站:http://www.cis.ohio-state.edu/~kingd/dlib/
各种各样的类的一个综合。大整数,Socket,线程,GUI,容器类,以及浏览目录的API等等。
(4) Chilkat C++ Libraries
参考网站:http://www.chilkatsoft.com/cpp_libraries.asp
这是提供zip,e-mail,编码,S/MIME,XML等方面的库。
(5) C++ Portable Types Library (PTypes)
参考网站:http://www.melikyan.com/ptypes/
这是STL的比较简单的替代品,以及可移植的多线程和网络库。
(6) LFC
参考网站:http://lfc.sourceforge.net/
哦,这又是一个尝试提供一切的C++库
5.12 其他库
(1) Loki
参考网站:http://www.moderncppdesign.com/
哦,你可能抱怨我早该和Boost一起介绍它,一个实验性质的库。作者在loki中把C++模板的功能发挥到了极致。并且尝试把类似设计模式这样思想层面的东西通过库来提供。同时还提供了智能指针这样比较实用的功能。
(2) ATL
ATL(Active Template Library)
是一组小巧、高效、灵活的类,这些类为创建可互操作的COM组件提供了基本的设施。
(3) FC++: The Functional C++ Library
这个库提供了一些函数式语言中才有的要素。属于用库来扩充语言的一个代表作。如果想要在OOP之外寻找另一分的乐趣,可以去看看函数式程序设计的世界。大师Peter Norvig在 “Teach Yourself Programming in Ten Years”一文中就将函数式语言列为至少应当学习的6类编程语言之一。
(4) FACT!
参考网站:http://www.kfa-juelich.de/zam/FACT/start/index.html
另外一个实现函数式语言特性的库
(5) Crypto++
提供处理密码,消息验证,单向hash,公匙加密系统等功能的免费库。
还有很多非常激动人心或者是极其实用的C++库,限于我们的水平以及文章的篇幅不能包括进来。在对于这些已经包含近来的库的介绍中,由于并不是每一个我们都使用过,所以难免有偏颇之处,请读者见谅。
------------------------------------------------------------------------
6,书籍
以前熊节先生曾撰文评论相对于Java程序设计语言,C++的好书多如牛毛。荣耀先生在《程序员》杂志上撰文《C++程序设计之四书五经》也将本领域内几乎所有的经典书籍作了全面的介绍,任何关于书的评论此时看来便是很多余的了。个人浅见,除非你打算以C++作为唯一兴趣或者生存之本,一般读者确实没有足够的时间和必要将20余本书籍全部阅读。更有参考价值的是荣耀先生的另一篇文章:《至少应该阅读的九本C++著作》,可以从下面的地址浏览到此文:
http://www.royaloo.com/articles/articles_2003/9CppBooks.htm
下面几本书对于走在C++初学之路上的读者是我们最愿意推荐给大家的:
(1) 《C++ Primer》
哦,也许你会抱怨我们为什么不先介绍TCPL,但对于走在学习之路上的入门者,本书内容更为全面,更为详细易懂,我们称它为“C++的超级宝典”并不过分。配有一本不错的习题解答《C++ Primer Answer Book》可以辅助你的学习之路。
(2) 《Essential C++》
如果说《C++ Primer》是C++领域的超级宝典,那么此书作为掌握C++的大局观当之无愧。正如《.NET大局观》一书能够让读者全揽.NET,本书讲述了C++中最核心的全部主题。书虽不厚,内容精炼,不失为《C++ Primer》读者茶余饭后的主题回顾之作。
(3) 《The C++ Programming Language》
Bjarne为你带来的C++教程,真正能够告诉你怎么用才叫真正的C++的唯一一本书。虽然如同“某某程序设计语言”这样的书籍会给大家一个内容全揽,入门到精通的感觉,但本书确实不太适合初学者阅读。如果你自认为是一名很有经验的C++程序员,那至少也要反复咀嚼Bjarne先生所强调的若干内容。
(4) 《Effective C++》,《More Effective C++》
是的,正如一些C++爱好者经常以读过与没有读过上述两本作品来区分你是否是C++高手。我们也极力推崇这两本著作。在各种介绍C++专家经验的书籍里面,这两本是最贴近语言本质,看后最能够有脱胎换骨感觉的书,读此书你需每日三省汝身。
技术书籍仁者见仁,过多的评论反无太多意义,由读者喜好选择最适合自己的书方为上策。
------------------------------------------------------------------------
7,资源网站
正如我们可以通过计算机历史上的重要人物了解计算机史的发展,C++相关人物的网站也可以使我们得到最有价值的参考与借鉴,下面的人物我们认为没有介绍的必要,只因下面的人物在C++领域的地位众所周知,我们只将相关的资源进行罗列以供读者学习,他们有的工作于贝尔实验室,有的工作于知名编译器厂商,有的在不断推进语言的标准化,有的为读者撰写了多部千古奇作……
(1) Bjarne Stroustrup
http://www.research.att.com/~bs/
(2) Stanley B. Lippman
http://blogs.msdn.com/slippman/
中文版 http://www.zengyihome.net/slippman/index.htm
(3) Scott Meyers
http://www.aristeia.com/
(4) David Musser
http://www.cs.rpi.edu/~musser/
(5) Bruce Eckel
http://www.bruceeckel.com
(6) Nicolai M. Josuttis
http://www.josuttis.com/
(7) Herb Sutter
http://www.gotw.ca/
( Andrei Alexandrescu
http://www.coderncppdesign.com/
(9) 侯捷先生
http://www.jjhou.com
(10) 孟岩先生
先生繁忙于工作,痴迷于技术,暂无个人主页,关于先生的作品可以通过CSDN的专栏和侯先生的主页访问到。
(11) 荣耀先生
http://www.royaloo.com/
(12) 潘爱民先生
http://www.icst.pku.edu.cn/panaimin/pam_homepage.htm
除了上述大师的主页外,以下的综合类C++学习参考站点是我们非常愿意向大家推荐的:
(1) CodeProject
http://www.codeproject.com
(2) CodeGuru
http://www.codeguru.com
(3) Dr. Dobb's Journal
http://www.ddj.com
(4) C/C++ Users Journal
http://www.cuj.com
(5) C维视点
http://www.c-view.org
(6) allaboutprogram
http://www.allaboutprogram.com
其他资料
(1) ISO IEC JTC1/SC22/WG21 - C++:标准C++的权威参考
http://anubis.dkuug.dk/jtc1/sc22/wg21/
(2) C++ FAQ LITE — Frequently Asked Questions: 最为全面的C++FAQ
http://www.sunistudio.com/cppfaq/index.html
C/C++ 新闻组:
你不妨尝试从这里提问和回答问题,很多不错的Q&A资源......
(1) .alt.comp.lang.learn.c-c++
这个简单些,如果你和我一样是个菜鸟
(2) .comp.lang.c++.moderated
嗯,这个显然水平高一些
(3) .comp.std.c++
如果你需要讨论标准C++相关话题的话
------------------------------------------------------------------------
8,不得不写的结束语
结束的时候也是总结现状,展望未来的时候。虽然C++从脱胎于C开始,一路艰难坎坷的走过来,但是无论如何C++已经取得了工业基础的地位。文章列举的大量相关资源就是最好的证明,而业界的大量用C++写成的产品代码以及大量的C++职业工程师则是最直接的证明。同时,我们可以看到各个高校的计算机专业都开设有C++这门课程,网络上对于C++的学习讨论也从来都没有停过。但是,在Java和.NET两大企业开发平台的围攻下,给人的感觉是C++越来越“不行”了。
C++在面向企业的软件开发中,在开发便捷性等方面的确要比Java和C#差很多,其中一个问题是C++语言本身比较复杂,学习曲线比较陡峭,另外一个问题是C++标准化的时间太长,丧失了很多的壮大机会,耗费了很多精力在厂商的之间的斗争上,而C++的标准库离一个完善的程序开发框架还缺少太多太多的内容,各个第三方的类库和框架又在一致性和完整性上没法和随平台提供的框架相提并论。难道C++真的要退出历史舞台了?
从C++目前的活跃程度,以及应用现状来说是完全能够肯定C++仍然是软件工业的基础,也不会退出历史舞台的。另外从Boost,Loki这些库中我们也能够看到C++的发展非常活跃,对于新技术新思维非常激进,C++仍然广泛受到关注。从ACE在高性能通信领域的应用,以及MTL这样的库在数值计算领域的出色表现,我们可以看到C++在高性能应用场合下的不可替代的作用,而嵌入式系统这样的内存受限开发平台,比如Symbian OS上,C++已经发挥着并且将发挥更大的作用。可以预见的是以后的软件无论上层的应用怎么变,它的底层核心都会是由C/C++这样的系统级软件编写的,比如Java虚拟机,.NET Framwork。因为只有这样的系统级软件才能完全彻底的发挥机器的功能。
需要看到的是两个趋势,一个趋势是C++变得更加复杂,更加学院派,通过模板等有潜力的语法因素构造越来越精巧的库成为了现代C++的热点,虽然在利用库实现新的编程范式,乃至设计模式等方面很有开创意义,也确实产生了一些能够便捷开发的工具,但是更多的是把C++变得更加强大,更加复杂,也更加难懂,似乎也更加学院派,不得不说它正在向边缘化道路发展。另一个趋势是C++在主流的企业应用开发中已经逐渐退出了,ERP这样的企业软件开发中基本上不会考虑C++,除非需要考虑性能或者和遗留代码的集成这些因素。C++退守到系统级别语言,成为软件工业的基础是大势所趋。然而反思一下,真的是退守么?自从STL出现,无数的人风起云涌的开始支持C++,他们狂呼“我看到深夜消失了,目标软件工程的出现。我看到了可维护的代码。”是的,STL在可维护性下做得如此出色。但是又怎样呢?STL为C++铺平了现代软件工程的道路,而在上层应用程序软件开发领域这块场地早不单独属于C++,很多程序设计语言都做得很出色,疯狂的支持者会毫不犹豫地说我们应当支持C++,因为它是世界上最棒的语言。而坦率地说,你的腰杆真的那么硬么?也许只是在逃避一些事实。C++是优秀的,这不可否认,STL的出现让C++一度走上了最辉煌的时刻,然而现在看来……我的一位恩师曾言:真正能够将STL应用得淋漓尽致的人很保守地说国内也不超过200人,或许不加入STL能够使C++向着它应当发展的方向发展的更好,而现在看来,C++也应当回首到真正属于他的那一片圣地上……
订阅:
博文 (Atom)