C++中级程序员该往何处去

有个同样是做一线开发工作的朋友评论一篇博文,表达了自己的忧虑和遇到的一些问题,其核心就是尽管做过几年的C++开发,市面上常见的书也基本涉略,但是却感觉很难跟上新思想,学到新知识。坦白地说,我也常常遇到过这样的问题。就C++的使用而言,我感觉算是入了门,但是走了很多的弯路。我可以简单共享一下我的经验教训,如果这可能对任何使用C++作为主要开发语言的人有用的话。但是我不希望谁不加思索就试图原样复制,因为毫无疑问每个人的个人喜欢,学习习惯,知识背景等都极不相同。这样说,就算是对本文可能造成的任何不好后果做一个免责声明吧。

 

之所以敢于说C++入门了,是因为最近重新把Scott的EC++拿出来翻了翻,发现其中绝大部分的条目已经是烂熟于行的常识,其背后的道理也基本知晓。专门论述C++语言的书籍几乎是所有语言当作最多的,五花八门,但是我感觉没有一本是从真正解决问题常见的具体问题入手的,或者,没有一本是把(我认为的)最重要的使得C++更具生产力的特性集中讲述的。

 

关于C++的评判不绝于耳,但是真正有份量的不多。孟岩先生是国内C++社区最早的几个推动者之一,最近实用主义观点渐弄,对C++提出一些严肃的批评。作为回应,我分别写了这篇这篇 来讨论。其中,基本可以看出我对C++的认识。我认为C++的重点在于其:

  • 更强的表达能力(以更简单的语言构造,语句等来表示显现需要复杂构造才能表达的东西;更好地表达程序员的设计意图等)
  • 更强的类型检查能力(C++是静态类型语言,为执行效率记,几乎所有的类型信息在运行时都被抛弃,所以C++通过强类型来帮助程序员检查错误)
  • 更强的库(从C++98的标准库到TR1,再到最新的C++0x,可以看到库的不断进步,这使得程序员可以更方便地以可移植的方式写C++代码)
  • 更容易使用(复杂性的来源非常广泛,其中一个就是C++自身引入的使用上复杂性。通过简化C++的使用,使得其更容易使用,更容易接近)

 

所以我认为C++学习的重点是如下几个方面。

 

资源管理是一切正式程序的基础。C/C++曾经因为内存管理的困难而臭名昭著,不过这已经是历史了,至少对于C++是如此。当C++社区真正认识到简单的RAII再加上基于作用域的对象生命期控制规则相结合的巨大成效时,再也没有人羡慕所谓的垃圾收集技术了。垃圾收集技术不能处理除了内存之外其他的资源问题;不确定的回收算法也不适用于很多的情况;于异常处理机制的勉强结合还导致了难看的final构造。所有这些问题在现在的C++中都不存在,那就是使用tr1::shared_ptr以及关联的其他技术。仅仅知道如何使用这不是重点,而是要明白它是怎么一劳永逸地解决这些问题的,如对象数组的构造。参考博文 阅读更多关于资源管理的信息。

 

错误处理也是很大的一块。这里要着重说的是异常。C中实现异常的办法是全局跳转,如setjump/longjump组合,C++使用了类似的机制但是更加结构化以及类型安全。C语言接口和实现一书中有详细的描述,可以参考。但是C++社区尚无如何使用异常的一致的最佳实践,需要我们进一步摸索。

 

OO是构建大型系统的基础。为什么这样说,因为我们的理解能力非常有限,无论多么大的系统,只有把它一步一步抽象到几个,不超过十几个具体的模块才能完全理解。也就是说,系统越大,我们想要了解它需要的粒度也就越大。把一个系统划分成几个大粒度的实体的过程就是OOD的过程。我在前面的博客中反复强调过,OO的基本特征是使用类来表达概念以及通过消息来连接对象。这样的话,OO的系统就到处都是了,绝大多数使用C,甚至汇编的规模稍大的系统都有OO思想的影子。明白这这一步,就不会被具体语言,如C++,实现OO的方式以及其实现中固有的缺点所限制了。作为一个佐证吧,这里 有一个简要的介绍在C++中如何实现动态类型系统。

 

OO的高阶用法就是对惯用的OO构造使用特定名字描述的模式了。在真正理解设计模式之前,尽管把GoF 的书读过几遍,读过Design Patterns Explained以及Head First的模式书,尽管同样认同这些都是不错的东西,但是从来不能把它们系统地联系起来,比如当初遇到的一个问题就是,为什么在诸如工厂方法这样简单的模式中,也要使用继承?现在才明白,设计模式的基础是OO设计基本原理;使用继承,是针对接口编程,而不是实现编程的基本要求;而继承本身,则是大多数OO语言表达借口实现的方法!理解到这里,好多相关的问题就迎刃而解,也可以从容把大多数的GoF经典模式从实际的情况出发,以重构代码为手段一步一步得到了。参考这里这里 以及这里 (其中visitor最有说明价值,讨论了如何对消息发送者重载,也讨论了C++的OO机制的限制)。GoF经典书的第一章几乎字字珠玑,值得仔细阅读。

 

再有一个就是基本的模板技术。这个不是很熟悉,特别是所谓的模板元编程的方法。个人认为,作为C++应用者,而非库作者,没有必要学习复杂的模板编程技术,但是要学会使用模板来简化日常的编程工作。

 

在此之外,就不是C++的世界了。因为个人的喜好,我喜欢了解最基本的东西,所以我阅读从数字电路,计算机设计,到算术逻辑运算,指令集系统,汇编,虚拟内存管理,存储栈,程序的编译,连接,加载运行知道推出的每一个环节的概要。我的目标不是成为专家,只是希望我能理解我的程序是如何运行的就足够了。

 

拉拉杂杂,与其说是给别人参考,更不如说是自己的一点记录。读过的书不少,但是精度的还不够。如果用一句话概括我的感受,那就是坚持阅读,坚持融会贯通。开始可能要浪费不少时间,但是最后就知道应该怎么走了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值