《白话C++》上册 前言

以下为上册前言试读内容,图片为试读内容编辑时新增。

(一)

我在2000年开始写《白话C++》。那时候流行个人主页,就在搜狐网站上申请了一个,域名"mywlbcyl",取“没有弯路,编程摇篮”的拼音首字母,主要发表自己写的C++入门课程。

然后,就走了15年的弯路。当年要有摇篮里的宝宝跟我学C++,现在都该在读大学了。现实比这更残酷,跟着我的课程学习的人,当年多数是风华正茂的小鲜肉,现在都成大叔了。就说和我签订出书合同的胡编辑,转眼成了两个娃的爹。

可我的书还一直在“摇篮”里。

所以我肯定是一个“拖延症”加“完美臆想症”的严重综合患者,但我还是想找客观原因:C++的教程真的好难写,特别是结合我的想法和目标时。

(二)

十几年写一本书,要说是好事也可以。比如说,这十几年来无论是C++还是我,都成熟了好多。

先说C++。

新标准的制定与出台,各家编译器的进化,越来越多的开源C++工具项目进化、基于C++新标准的优秀书籍的出现,都是C++长足发展的标志。还有一点,那就是人,当然我想特指中国人。前面提到的标准、编译器的实现、开源项目,都有越来越多的优秀的中国C++程序员参与其中。从“人”因素出发很容易又能发现:C++编程的氛围也在变好。想当年有一个奇怪的氛围:说到C++就是VC,说到VC就是MFC。2000年前后我曾在某论坛上发表了有关MFC设计不足之处的一些浅见,立刻淹没在一大波网友唾弃的口水中。现在,尽管C++早已不是编程语言上“一哥”,但受益于多本C++经典书籍的流行,以及发达的网络传播和时间的沉淀,甚至也受益于更多其它编程语言的流行,使用者对这门语言的认识越趋成熟(相信对其他语言也是)。

再说说我的成长。

从二十多到四十多岁;从写几万行C++代码到几十万行代码;从只玩C/C++到在工作中用PHP、Java、C#、Delphi、Python,还学习了D语言、Go语言和JavaScript(Node)等;从嵌入式工控程序和Office桌面软件;到C/S结构到B/S结构,甚至偶尔充当“全栈工程师”。大约就是,周一写JavaScript + HTML + CSS,周二写后台分布式服务,周三改数据库结构,周四换上一套相对整洁的衣服去拜访客户,讲PPT,周五人事和我说:“帮忙面试个人吧?”。周末?就像今天一样,白天补觉,晚上改《白话C++》书稿。

东忙西忙的日子里,我偶尔回想起大学毕业刚走上社会那几年,觉得自己懂人生、懂社会、也懂编程,现在才发现这三样我哪样没能参透。所以我觉得自己应该是成熟一些了,并且觉得幸亏因为懒惰,没有在10年或更早前写完本书。《白话C++》的目的是帮助他人学习C++,而那时我对目标中的“帮助”“他人”“学习”和“C++”的了解都流于浅显粗鄙,这样子写出来的书对读者真有帮助吗?

(三)

十数年过去了,中间有近一年的时间,我安排自己到培训机构兼职教C++编程,非常辛苦也没什么钱可赚。学习上,我自己买的以C++为主的编程书籍近百本,阅读网络上几十个开源C/C++项目的源代码;实践上,我在许多软件项目中掉进去、爬出来的坑,大大小小感觉像是青春期永不消停的满脸的痘,有一天突然全被填平了。不管怎样,根据一项技能你学习5000(或者更多点,8000)小时就能成为业界专家的“定律”,我觉得自己对程序员、对编程技术以及程序员怎么学习和应用编程技术的认识,都上了新的台阶。我慢慢地将这些认识写进这本书,一稿、二稿、三稿不断地兴奋地写下,又不断沮丧地推翻;大家百度“白话C++”,应该可以找到数个版本。

在反复改写的过程中,最重要的一个认识是:学习C++应该既练功又练武。没错,我把学习C++语言分成“练功”和“练武”两件事。

习武之人说的“武功”,“功”通常是身体素质、内气外力;而“武”是“招式”(可以外延到“十八般武艺”)。关于这二者,有句老话叫“练武不练功,到老一场空”,意思是光练把式,不练气力,就容易止于花拳绣腿,一生难成高手。但在另外一个方向上,我记得霍元甲在创建迷踪拳时曾经说(电视里的): “练功不练武,都是白辛苦”。说的是另一个极端:你苦练内功,马步一扎特别稳实,却什么拳法招式都不练,什么兵器也不学,就会变成空有一身力气使不出来,白辛苦。转个笑话加深大家理对这种尴尬局面的理解,说是一个练“铁布衫”的和一个练“金钟罩”的比武,两人都一动不动呈现“入定”状态,裁判在边上哭着说,“你俩扛得住,我却扛不住啊!”

那么编程行业中,什么是“功”呢?广义上讲,计算机原理、网络协议、算法、语言语法、编译原理、设计模式都可以归为“功”。而类似“如何创建一个窗口”“如何提交一个网页的表单”“网页局部刷新的AJAX技术怎么用”“某某语言解析XML用哪个类”“怎么实现JSON和对象的互换”“如何访问MySQL数据库”“如何在数据链路上加入缓存”“哪家的短信服务器好用又便宜”“安卓系统如何实现消息推送”以及“Linux下的进程挂掉时怎么快速重启”等这些问题的答案,统统是“武”。

再进一步限定范围到“编程新人如何学习C++”,我将“功”限定在以C++语言语法和编程范式(面向过程、基于对象、面向对象、泛型编程)等基础知识上,但凡对C++有一定了解的人,都清楚这已经可以写成厚厚的一本书了。以语言为主要教学内容的《C++ Primer》或《C++程序设计语言》的厚度便是佐证。“武”的方面则挑选来自标准库STL及“准标准库”boost中的常用工具,桌面GUI编程、并发编程、数据库(MySQL)访问、缓存(Redis)访问、网络编程以及仅限于自娱自乐的简单多媒体游戏编程等。

“武”强“功”弱的C++工程师,通常解决实际问题的能力还不弱。项目要用到网络,就找个网络框架照着搭起来;项目要用到视频处理就找些视频代码改改用。C++语言的特点是一方面很复杂很庞大,一方面是只需学习一小部分(比如“带类的C语言”)就可以写程序,甚至可以“一招鲜、走遍天”。这就造成部分人在学习阶段就急于动手出成绩甚至上岗赚钱。如此情况下,当他们面对复杂问题时,往往采用堆砌代码的方式完成,一个人做到底看似很快,想要在团队分工中让别人看懂他的代码就很困难了。并且所写代码往往缺少好的设计,往往需求变化几次之后,整个代码就膨胀得像生气的河豚。

再说说那些“练功不练武,都是白辛苦”的同学。C++语言还有个特点,就是它的标准库仅为有高度共性、高度抽象的逻辑提供功能,许多实际项目经常用到的业务功能统统没有。想象丁小明(本书中的重要人物)捧了一本厚厚的C++书籍辛苦学了一年,上班时才发现老板是这么要求的:“听说QQ是C++写的,你来写个类似的窗口。”“听说C++写的程序性能好,你写个网络服务端,要求不高,1秒钟撑1万次访问就好。”“听说游戏引擎基本是C++写的哦,你开发个万人在线游戏吧。”“听说PhotoShop也是C++写的,你写个程序来批量美化下公司年会上的照片吧。”难吗?不好说,只是丁小明清楚地记得学习所用的那本C++书籍快1000页,但从头到尾没出现过网络、窗口创建、游戏和图片处理等。丁小明很郁闷。

本书是《白话C++》上册,重点负责“功”的部分。讲C++基本语法也讲二进制,讲编程环境如何搭建也讲“面向过程”“基于过程”和“面向对象”等编程范式,等等。下册负责“武”,提供如何用C++写窗口图形界面程序,写多线程并发程序,写网络通信程序、数据库程序和小游戏程序等具体技能。

(四)

关于如何学习C++,我的第二个认识是:你没办法学完一遍就能精通C++。事实上学习再多遍恐怕也精通不了,但请相信:刚开始学习时,通读一遍,练习一遍,再回头重新学习一遍,会比一节节死抠过去,结果一年时间未能读完一册的效果要好。C++中有许多知识点是交叉的,比如“指针”和“数组”,指针可以指向数组,数组的元素可以是指针,数组作为函数入参时会退化成指针……因此二者谁放前谁放后都有合理之处,学习完前面的有利于学习后面的,但学习了后面的同样有利于进一步理解前面的。拉长镜头看《白话C++》,许多篇章之间,甚至跨越上下册之间,都存在后面内容对前面内容进行验证或补充的安排。另一方面,许多复杂的知识,在靠前的章节就简略提及,这是刻意地对知识点做交叉学习的安排。最典型的如下册中的许多内容,在上册一开始就会有“不求甚解”地快速涉猎,让学习者感受C++的“能量”,避免一直埋头在黑乎乎的控制台窗口,误以为自己只能用C++写一些“玩具”代码。

以30天背30个英语单词为例,一天就背30个,连续背30天;效果通常要比第一天背第1个,第二天背第2个一直背到第30个要好。机械记忆尚且如此,何况本来就充满有机关联的编程语言呢?

作为一个极端的反例,学习编程语言一定不要过早追求100%的精确。更不要沉迷于当“语言律师”。网上流传一个小视频,说是一位幼儿园老师想教会小朋友关于“小鸟听到枪声会受惊吓飞”的知识,于是设计了一个问题:“树上停着七只鸟,猎人打了一枪后,树上剩下几只鸟?”没想到所有小朋友都很冷静,第一个问:“有没有耳聋的鸟?”第二个问:“有没有胆子大、神经大条的鸟?”第三个问:“有没有哪只鸟和死去的那只鸟的感情深厚,坚决要留下殉情的?”好嘛,为了回答老师那个看似简单的问题,这一下涉及到生理、心理和鸟类感情等方方面面的知识,这样的教学还如何进行呢?

《白话C++》第一章为读者圈出学习的最低起点,书的课程以该起点逐步推演。因此,许多知识点会反复出现,而且在不同的出现阶段会有不同的解释。靠后的解释相对全面、规范、简洁、深刻;靠前的解释就难免片面、粗浅、啰嗦甚或牵强——很可能低于您已有的水平,此时请各位一笑而过。

当然,以上有关“不求甚解”的说法,并非鼓励大家蜻蜓点水、囫囵吞枣般地学习。正确的方法应当是:遇上问题,加以思考;一时思考不出答案,应善于上网搜索;勤于编写程序测试或验证结果以及与人交流请教;如果还是不能解疑,也没必要卡在原地,而是可以做上标记,继续往下学习。

(五)

书中除了普通正文之外,还设置了“课堂作业”“小提示”“重要”“危险”“轻松一刻”等小段落。各自作用和学习要点如下:

“课堂作业”:一定要“现场”做,所谓“现场”就是不往后看新内容,立马做。出于排版需求,有一些作业并未单独成段,而是直接写在普通段落中。另外,更为重要的是,只要课程中出现示例代码的,基本上要求读者亲自动手写程序并编译、测试通过。

“小提示”:和当前课程内容有一定相关性,用于辅助解释当前课程的部分内容。碰上时能看懂最好,但如果个别无法理解也不用放在心上,因为通常并不影响继续阅读后文。

“重要”:长远看都是重要的知识点,虽然现在一时读不懂不会影响继续学习,但长远看会影响关键知识的运用。因此应努力阅读,如果不懂应做标记,以期下一次阅读能理解、掌握。

“危险”:如果现在搞不懂,很可能往下学习(特别是需要写代码时)没多长时间就要出问题的知识点。

“轻松一刻”:主要用于调节学习氛围,让大家偶尔放松,但也存在部分内容同时发挥“小提示”的作用,可当成相对有趣的“小提示”来看。当然出于行文的需要,也有大量轻松一刻的内容会以更加一本正经的方式躲在正文中。

(六)

希望《白话C++》能帮助到正在或正要学习C++的广大读者。感谢购买本书。限于个人能力,加上篇幅大,前后反复修改大,问题在所难免,请读者多提宝贵意见,以期持续改进。

感谢一直信任我,也一直在为本书努力的编辑。

感谢我的父母。未能在我的父亲离世之前完稿,是我今生至憾。感谢我的妻女,是你们一直在鞭策和鼓励我。我一直以为《白话C++》会是我的二女儿,可是书还没面市,家里二宝出生了(可见我还是开小差了),都上幼儿园了,这书要屈居老三。

帮助我完成本书的还有我的不少同事、朋友、同行、老师、学生,一并感谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南郁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值