学习C++:实践者的方法(上)

发表于:2012-1-05 09:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  前言

  我的blog以前很长一段时间关注的都是C++中的技术&细节,乃至于读者和应者都寥寥。然而5月份的时候写的一篇“你应当如何学习C++”,阅读量却达到了3万多,在blog上所有文章中却是最高的(且远远超过了第二位);评论数目也有一百多。为什么独独这篇能够激起这么多的回应,想必是国内的C++社群被C++压抑太久,或者,严格来说,是被C++的教育方式压抑太久。实际上,不管是在各大国内论坛上,还是在comp.lang.c++.moderated这样的国际C++论坛上,乃至于在douban上的小组内,有心者都会发现,对C++语言的细节的关注一直都没有停止过,同样,对C++语言的细节的抱怨也从来都没有停止过。一个例子就是comp.lang.c++.moderated上的一个技术牛人JamesKanze说的,他说接触C++十年了,到现在还需要不时去翻C++标准。这就难怪Eric Raymond老大在《The Art of UnixProgramming》中说“C++是反紧凑”的了。C++中的细节太多,就算都看过了,也不可能都记住。更关键的是,就算都记住了,也不能让你成为一个真正的好程序员。

  绝大多数人都把细节太多(或者用贬义词来说就是“阴暗角落太多”)归结为C++的本质问题,认为一切邪恶由此而生。也正因此,大约9月份的时候,Linus在邮件列表上说“C++是一门有思想包袱的语言;仅仅是为了让程序员远离C++,我也要用C”。这句短短的话在国内引起了很大的反应,最初是刘江转了Linus的话,然后云风和孟岩都发表了自己的看法;我也写了一篇“WhyC++”(后来发给Bjarne,Bjarne对这篇文章做了一个友情评注)。

  然而,这一通浑水搅过之后,我相信引起的变化未必很大。大多数原先的反对者能从中找出反对的理由,于是更加反对;大多数原先的赞同者也能从中找到赞同的理由,于是更加赞同;而剩下来的原先没有明确意见的,看双方各有各的道理,可能还是没有头绪。

  摆脱自我服务偏见——理性思考的前提

  《决策与判断》上提到过一个有趣的真实故事:1980年的某一天,美国空战司令部的计算机突然发出警报——苏联的一枚核弹正在向美国本土飞来。司令部立即调兵遣将,迅速为一场核战做好了准备,然而3分钟之后,工程人员发现是计算机的一个小零部件故障造成的。然而,这场虚惊之后,大众的反应才是真正有意思的:原先支持核武装的,认为现在感觉更加安全了(因为“事实证明这类的故障是完全可克服的”);而原先反对核武装的则认为更不安全了(因为“这类错误信号可能导致苏联过度反应,引发真正的核战”)。类似的情况也发生在三里岛核泄露事件之后,同样的,反对者认为(“这表明管理部门没有办法安全管理核能”),支持者认为(“这正表明这样的危险没有想像得那么严重,是可克服的”)。社会心理学把诸如此类的现象总结为“自我服务偏见”。不幸的是,“真理越辩越明”其实只适用于理性思考者。

  为什么啰嗦这么一大通呢?就是因为,一直以来泛滥于程序员社群的“语言之争”,背后真正的原因其实并不在于语言实质上的优劣,而在于观察者的眼睛。在观察者的眼睛里面,语言并非一门工具,而是自己花了N多时间(其中尤数C++为最)来“修炼”的技能,对于这样的技能,被否定无疑等同于自己被否定。所以,从心理学上讲,语言并不是工具(尽管一直有这么一种呼吁),而是信仰。这样的信仰在越是花得时间久的语言上越是激烈。有趣的是,几乎所有的“热闹”的社群都有这样的现象,Java、Python、Ruby…莫不如是;因为就算语言本身不复杂,程序员仍然还是要投入大量的精力去学习各种各样的框架类库(想想Java的那些框架?)。因此这些语言社区的信仰未必不比C++社群的强烈。

  然而,一旦弄清我们为什么会把语言当成信仰,就非常有助于摆脱在看待语言时的“自我服务偏见”,从客观的角度去看待问题。——“当你看到的是支持某个意见的证据时,试着去想一想有哪些证据是不支持它的”。

  那么为什么要摆脱自我服务偏见?说小了,是为了成为一个更优秀的程序员(谁也不希望因为偏见而去使用一门低效的语言乃至不妥当的语言)。说大了是节省生命(因为偏见可能导致越陷越深,浪费时间)。

  所以,如果你能够理性的思考我们将要讨论的问题,避免自我服务偏见(就当你从来没有花时间在C++上一样)。那么我们便可以开始讨论真正的问题了。

  前言2

  现在,几乎每个学习C++的都知道C++的核心问题是其复杂性;甚至本身不在C++社群的,也知道这是事实。群众的眼睛是雪亮的,何况这还是个太显而易见的事实。

  但看了无数篇阐述C++复杂性的文章,和争论C++复杂性的吐沫星子(包括我前段时间写的两篇关于C++的总结)。我始终都有一个感觉——没分析透,就跟盲人摸象一样。正如“WhyC++”的一位读者批评的,我在文章里面没有写明到底哪些是C++的“非本质复杂性”。当然,我自己凭感觉就能知道,而接触C++一段时间的人大致也能知道,但新手乃至非新手则对我所谓的“非本质复杂性”根本没有一个具体的认识,这就使得那篇“WhyC++”脱离了原本的意图——面向所有C++使用者和学习者。

  同样的原因,在写了“你应当如何学习C++”一文之后,当孟岩先生邀请我给《程序员》写一个系列的文章,介绍一下我在接触C++的过程中的态度和认识转变时,我虽然非常高兴的答应了,但直到现在3个月过去了还是颗粒无收。为什么?因为我觉得真正本质的问题没有被清晰的触摸到;所以直到现在我都没有动笔,免得废话说了一大堆,除了能被当成小说读读之外,对真正考虑是否要学习乃至使用C++的人未必有什么实际用处。

  然而,这么个念头一直都放在潜意识里面。前一阵子和Bjarne通信,谈到了关于C++复杂性的一些想法,在邮件里面总结了一下C++的复杂性来源,感觉思路清晰了许多。而这篇文章要达到的目的,正是传达对C++的复杂性的一个具体而明确的认识,有了这个认识作为支持,我们便可以推导出学习C++的最佳(实践者)的方法。

51/512345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号