关闭

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

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

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

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

  所以说:

  事实3:C++的整个生态圈这么些年来在学习C++的哲学上,实在没有多少改善。

  为什么?是因为Bjarne介绍的学习方法在技术上没有说到点子上?是AndrewKoenig的书写得不够好?说了谁也不会相信。因为实际上,这里的原因根本不是技术上的,而是非技术的。

  众所周知的一个事实是,从最表层讲,C++的最严重问题是在语言学习阶段占用了学习者的太多时间。翻一翻你的C++书架或者电子书目录,绝大多数的C++“经典”都是在讲语言。在我们通常的意义上,要“入门”C++,在语言上需要耗的时间一般要两三年。而要“精通”C++,则搞不好需要耗上十年八年的。(这跟PeterNorvig说的“十年学习编程”其实不是一回事,人家那是说一般意义上的编程技能,不是叫你当语言律师。)

  那为什么我说“C++的复杂性是根本原因”是个有漏洞的推理呢?因为,要让人们在使用一门语言去做事情之前耗上大量时间去学习语言中各种复杂性,除了语言本身的复杂性的事实之外,还有一个重要的事实,那就是学习者的态度和(更重要的)方法。而目前大多数C++学习者的态度和方法是什么呢?——在真正用C++之前看上一摞语言书(日常编程八辈子都未必用得到)。而为什么会存在这样的学习态度呢?这就是真正需要解释的问题。实际上,有两方面的原因:

  事实4:市面上的绝大多数C++书籍(包括很多被人们广泛称为“必读经典”的)实际上都是反面教材。

  也就是说,随便你拿起哪本C++书籍(包括很多被人们广泛称为“必读经典”的),那么有很大的可能这本书中的内容不是你应该学的,而是你不应该学的。我之所以这么说有两个原因,因为一,我曾经是受害者。二,也是更实质性的原因,这些所谓的必读经典,充斥的是介绍C++中的陷阱和对于C++的缺陷的各种workarounds(好听一点叫Idioms(惯用法)或techniques(技术));又因为C++中的这类陷阱和缺陷实在数不胜数,所以就拉出了一个“长尾”;这类书籍在所有语言中都存在(“C缺陷和陷阱”、“EffectiveJava”、“EffectiveC#”等等),然而在C++里面这个尾巴特别长,导致这类书数不胜数。三,这些书中列出来的缺陷和陷阱根本不区分常见程度,对于一个用本程序员来说,应该希望看到“从最常见的问题到最不常见的问题”这样的顺序来罗列内容,然而这些书里面要么全部混在一起,要么按照“资源管理、类设计、泛型”这样的技术分类来介绍内容,这根本毫无帮助(如果我看到一个章节的内容,我当然知道它讲的是类设计还是资源管理,还用废话么?),使得一个学习者无法辨别并将最重要的时间花在最常见的问题之上。

  最最关键的是:这些书当中介绍的内容与成为一个好程序员根本毫无关系,它们顶多只能告诉你——嗨,小心跌入这个陷阱。或者告诉你——嗨,你知道当你(八辈子都不一定遇到)遇到这个需求的时候,可以通过这个技巧来得以解决吗?结果读了一本又一本之后,你脑袋里除了塞满了“禁止”、“警戒”、“灯泡”符号之外,真正的编程素质却是一无长进。又或者有这样一类书,热衷于解释语言实现背后的机制,然而语言特性本质上是干嘛用的?是用来在实际编码中进行抽象的(说得好听一点就是“设计”),不是用来告诉你这个特性是怎么支持的。比如我就见过以下的情景:面试官问:“你知道虚函数吗?”得到的回答是一堆关于虚函数表机制的解释。面试官又问:“那虚函数的好处是什么呢?”到底为什么要虚函数呢?得到的回答是:“恩…啊…就是…多态吧”(这时已经觉得回答不够深刻了)。再问:“那多态是干嘛的呢?”哑口无言。

  事实5:就算记住一门语言的所有细节也不能让你成为一个合格的程序员。

  事实6:了解语言实现固然有其实践意义(在极端场合的hack手法,以及出现底层bug的时候迅速定位问题),然而如果为了了解语言机制而去了解语言机制便脱离了学习语言的本意了。

  在C++里面这样的情况很多见:知道了语言实现的底层机制,却不知道语言特性本身的意义在什么地方。本末倒置。为什么?书害的。二,这类书当中介绍的所有情景加起来其实只属于那20%(二八法则),甚至20%都不到的场景(究竟是哪些书,后面会介绍,我不便直接列出书名,打击面太大,但我会把我认为essential的书列出来)。这就是为什么我说“八辈子都用不着”的原因。

  事实7:80%的C++书籍(包括一些“经典”)只涉及到20%(或者更少)的场景。

  你可能会说,那难道这些书就根本不值得看了吗?

  我的回答是,对。根本不值得看。——但是值得放在旁边作为必要的时候的参考(记住从索引或目录翻起,只看严格必要的部分),如果你是个严肃的程序员的话。因为不管承认与否,墨菲法则的强大力量是不可忽视的——如果有一个可能遇到的陷阱,那么总会遇到的。而同样,C++的那些奇技淫巧也并非空穴来风,总有时候会需要用到的。但是你不需要预先把C++的所有细节和技巧存在脑子里才能够去编程,即:

  建议1:有辨别力地阅读(包括那些被广泛称为“经典”的)C++书籍。

  如果书中介绍的某块内容你认为在日常编程中基本不会用到(属于20%场景),那么也许最好的做法是非常大概的浏览一下,留个印象,而不是顺着这条线深究下去。关于在初学的时候应该读哪些书,后面还会提到。

  实际上,除了语言无关的编程修养之外(需要阅读什么书后面会提到),对于C++这门特定的语言,要开始用它来编程,你只需知道一些基础但重要的语言知识(需要阅读哪些书后面会提到)以及“C++里面有许多缺陷和陷阱”的事实,并且——

53/5<12345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号