学习C++:实践者的方法

前言

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

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

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

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

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

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

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

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

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

前言2

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

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

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

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

时间: 2024-08-31 20:05:29

学习C++:实践者的方法的相关文章

wxWidgets初学者导引(4)——wxWidgets学习资料及利用方法指导

wxWidgets初学者导引全目录   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith进行可视化设计附:学习材料清单 4 wxWidgets学习资料及利用方法指导 初学者常苦于找不到参考资料.实际上,是找不到,不是没有.真正有用的资料,常常也就在手边,只是不知道.有能力熟练地使用一切能用得着的资料,这是水平提高的指标之一.这种能力,同样,也是在实践中获得,而不是有谁为你讲一堂课就能得

学习JavaScript的最佳方法

学习JavaScript的最佳方法        学习新的东西是件可怕的事.对我来说,掌握一项新技能最大的问题是,我不知道自己懂什么.鉴于此,定个计划,学习你感兴趣的东西应该会有用.这篇文章的主旨就是:你为学习JavaScript 制定的蓝图.路线.行动计划!你不必担心找不到最好的资源,先整理些不好的资源,再确定下一步该学什么.遵循它,一步一步来. 任务0:了解什么是JavaScript       在你真正开始学习JavaScript 之前,花一分钟了解一下什么是JavaScript,它有哪些

Android游戏开发学习①弹跳小球实现方法_Android

本文实例讲述了Android游戏开发学习①弹跳小球实现方法.分享给大家供大家参考.具体如下: 在学习了一点点Android之后,觉得有必要记录下来,于是就开了这个新坑,慢慢来填吧. 1.运动体Movable类 本例主要模拟了一组大小不一的球以一定的水平初速度从高处落下的运动轨迹.其中的小球为一个可移动物体Movable对象,该类中除了包含小球图片对象之外,还包括了如位置坐标.水平速度.垂直速度等一系列用于模拟小球运动的成员变量和一些方法. Movable类: package com.ball;

Android游戏开发学习①弹跳小球实现方法

本文实例讲述了Android游戏开发学习①弹跳小球实现方法.分享给大家供大家参考.具体如下: 在学习了一点点Android之后,觉得有必要记录下来,于是就开了这个新坑,慢慢来填吧. 1.运动体Movable类 本例主要模拟了一组大小不一的球以一定的水平初速度从高处落下的运动轨迹.其中的小球为一个可移动物体Movable对象,该类中除了包含小球图片对象之外,还包括了如位置坐标.水平速度.垂直速度等一系列用于模拟小球运动的成员变量和一些方法. Movable类: package com.ball;

实践出真知:学习SEO最好的方法是脚踏实地

现在网上可以看到很多关于SEO的文章,也有很多站长开博客分享自己的SEO经验,对于新手站长来说,有很多机会可以学习到想要的东西,但今天我和大家分享自己的几点看法,可能是自己走过来才会发现吧,我一直认为,只有实践才能出真知,因为每个人的网站不同,行业不同,手中的资源不同,方法也不同,所以采用同样的手法,结果有时候是不同的.只有自己亲自操作,并根据自己的网站进行调整,最后学到的东西才是干货. SEO基础 第一个阶段肯定是不熟悉SEO的阶段,这个时候我们不知道很多相关术语,也不懂很多空间域名或者解析的

由su和su -的区别谈学习linux运维方法

老男孩Linux培训新班刚开始,老男孩发现群里就在讨论这个su和su -的区别,有的同学们说,直接su就可以,有的说必须要su -.有的同学直接发问,到底su和su -有什么区别? 1授之以"鱼"的答案 6.6.1.3 su命令实例 当不加任何参数执行su命令时,表示要切换到root用户,但这样执行,会遇到一些问题.因为虽然是切换到root用户了,但并没有改变为root用户登录环境,用户默认的登录环境,可以在/etc/passwd 中查得到,包括家目录,shell类型等.比较规范的操作

利用金山打字通正确学习击键的方法

  金山打字通是一款由金山软件官方发布的打字练习软件,该软件也是较为老牌的文字输入练习软件,对于一开始学习电脑的用户来说,首先需要养成正确的输入习惯,才能更便捷快速的提升打字的速度;在金山打字通软件中,包含有正确的击键方法,并通过游戏.打字测试联系来让用户更快的熟悉键盘中的每个按键位置,那么如何通过金山打字通学习正确击键练习呢?下面随小编一起了解下吧!     正确的击键方法 技巧提示 击键时要注意以下几点: 上述内容介绍中,小编为大家提供了正确的击键方法与技巧提醒,这样在最开始就正确使用文字输

学习JavaScript的最佳方法分享_基础知识

学习新的东西是件可怕的事.对我来说,掌握一项新技能最大的问题是,我不知道自己懂什么.鉴于此,定个计划,学习你感兴趣的东西应该会有用.这篇文章的主旨就是:你为学习JavaScript 制定的蓝图.路线.行动计划!你不必担心找不到最好的资源,先整理些不好的资源,再确定下一步该学什么.遵循它,一步一步来. 任务0:了解什么是JavaScript 在你真正开始学习JavaScript 之前,花一分钟了解一下什么是JavaScript,它有哪些功能. JavaScript不是jQuery.Flash或Ja

[转载]学习时注意思考方法——只献给初学者

不管是在现实中还是网上,总遇到一些人再问一些奇怪的问题.很多问题让大牛们哭笑不得,总是推荐这些人看一些经典的书籍.结果过了一段时间,其他人的知识已经沧海桑田,不少人成了大牛,大牛们已经成了大大牛.这些人还在重复着类似的问题.本人不是大牛,但是觉得大牛们在技术上帮助别人的同时还应该更多的传播思维方法.如果大牛们没有时间,那么小弟只好抛砖引玉,谈一些不成熟的见解,同时希望大牛们多提意见,我再把你们的经验总结起来一齐奉献给大家. 1)分层思考在我的同学中有一个人算是经典案例,他学习起来很用功,但似乎不