首页 > C/C++语言, 编程语言, 轶事趣闻 > “21天教你学会C++”

“21天教你学会C++”

2010年3月30日 发表评论 阅读评论 41,571 人阅读    

下面是一个《Teach Yourself  C++ in 21 Days》的流程图,请各位程序员同仁认真领会。如果有必要,你可以查看这个图书以作参照:http://www.china-pub.com/27043

看完上面这个图片,我在想,我学习C++有12年了,好像C++也没有学得特别懂,看到STL和泛型,还是很头大。不过,我应该去考虑研究量子物理和生物化学,这样,我才能重返98年杀掉还在大学的我,然后达到21天搞定C++的目标。另外,得要特别提醒刚刚开始学习C++的朋友,第21天的时候,小心被人杀害。呵呵。

当然,上面只是一个恶搞此类图片,学习一门技术,需要你很长的时间,正如图片中的第三图和第四图所示,你需要用十年的时间去不断在尝试,并在错误中总结经验教训,以及在项目开发中通过与别人相互沟通互相学习来历练自己。你才能算得上是真正学会。

这里有篇文章叫《Teach Yourself Programming in Ten Years》,网上有人翻译了一下,不过原文已被更新了,我把网上的译文转载并更新如下:

用十年来学编程
Peter Norvig

为什么每个人都急不可耐?

走进任何一家书店,你会看见《Teach Yourself Java in 7 Days》(7天Java无师自通)的旁边是一长排看不到尽头的类似书籍,它们要教会你Visual Basic、Windows、Internet等等,而只需要几天甚至几小时。我在Amazon.com上进行了如下搜索
pubdate: after 1992 and title: days and (title: learn or title: teach yourself)
(出版日期:1992年后 and 书名:天 and (书名:学会 or 书名:无师自通))
我一共得到了248个搜索结果。前面的78个是计算机书籍(第79个是《Learn Bengali in 30 days》,30天学会孟加拉语)。我把关键词“days”换成“hours”,得到了非常相似的结果:这次有253本书,头77本是计算机书籍,第78本是《Teach Yourself Grammar and Style in 24 Hours》(24小时学会文法和文体)。头200本书中,有96%是计算机书籍。
结论是,要么是人们非常急于学会计算机,要么就是不知道为什么计算机惊人地简单,比任何东西都容易学会。没有一本书是要在几天里教会人们欣赏贝多芬或者量子物理学,甚至怎样给狗打扮。在《How to Design Programs》这本书里说“Bad programming is easy. Idiots can learn it in 21 days, even if they are dummies.” (坏的程序是很容易的,就算他们是笨蛋白痴都可以在21天内学会。)
让我们来分析一下像《Learn C++ in Three Days》(3天学会C++)这样的题目到底是什么意思:
  • 学会:在3天时间里,你不够时间写一些有意义的程序,并从它们的失败与成功中学习。你不够时间跟一些有经验的程序员一起工作,你不会知道在C++那样的环境中是什么滋味。简而言之,没有足够的时间让你学到很多东西。所以这些书谈论的只是表面上的精通,而非深入的理解。如Alexander Pope(英国诗人、作家,1688-1744)所言,一知半解是危险的(a little learning is a dangerous thing)
  • C++:在3天时间里你可以学会C++的语法(如果你已经会一门类似的语言),但你无法学到多少如何运用这些语法。简而言之,如果你是,比如说一个Basic程序员,你可以学会用C++语法写出Basic风格的程序,但你学不到C++真正的优点(和缺点)。那关键在哪里?Alan Perlis(ACM第一任主席,图灵奖得主,1922-1990)曾经说过:“如果一门语言不能影响你对编程的想法,那它就不值得去学”。另一种观点是,有时候你不得不学一点C++(更可能是javascript和Flash Flex之类)的皮毛,因为你需要接触现有的工具,用来完成特定的任务。但此时你不是在学习如何编程,你是在学习如何完成任务。
  • 3天:不幸的是,这是不够的,正如下一节所言。

10年学编程

一些研究者(Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973))的研究表明,在许多领域,都需要大约10 年时间才能培养出专业技能,包括国际象棋、作曲、绘画、钢琴、游泳、网球,以及神经心理学和拓扑学的研究。似乎并不存在真正的捷径:即使是莫扎特,他4 岁就显露出音乐天才,在他写出世界级的音乐之前仍然用了超过13年时间。再看另一种音乐类型的披头士,他们似乎是在1964年的Ed Sullivan节目中突然冒头的。但其实他们从1957年就开始表演了,即使他们很早就显示出了巨大的吸引力,他们第一次真正的成功——Sgt. Peppers——也要到1967年才发行。Malcolm Gladwell 研究报告称,把在伯林音乐学院学生一个班的学生按水平分成高中低,然后问他们对音乐练习花了多少工夫:

在这三个小组中的每一个人基本上都是从相同的时间开始练习的(在五岁的时候)。在开始的几年里,每个人都是每周练习2-3个小时。但是在八岁的时候,练习的强度开始显现差异。在这个班中水平最牛的人开始比别人练习得更多——在九岁的时候每周练习6个小时,十二岁的时候,每周8个小时,十四岁的时候每周16个小时,并在成长过程中练习得越来越多,到20岁的时候,其每周练习可超过30个小时。到了20岁,这些优秀者在其生命中练习音乐总共超过 10,000 小时。与之对比,其它人只平均有8,000小时,而未来只能留校当老师的人仅仅是4,000 小时。

所以,这也许需要10,000 小时,并不是十年,但这是一个magic number。Samuel Johnson(英国诗人)认为10 年还是不够的:“任何领域的卓越成就都只能通过一生的努力来获得;稍低一点的代价也换不来。”(Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.) 乔叟(Chaucer,英国诗人,1340-1400)也抱怨说:“生命如此短暂,掌握技艺却要如此长久。”(the lyf so short, the craft so long to lerne.)
下面是我在编程这个行当里获得成功的处方:
  • 对编程感兴趣,因为乐趣而去编程。确定始终都能保持足够的乐趣,以致你能够将10年时间投入其中。
  • 跟其他程序员交谈;阅读其他程序。这比任何书籍或训练课程都更重要。
  • 编程。最好的学习是从实践中学习。用更加技术性的语言来讲,“个体在特定领域最高水平的表现不是作为长期的经验的结果而自动获得的,但即使是非常富有经验的个体也可以通过刻意的努力而提高其表现水平。”(p. 366),而且“最有效的学习要求为特定个体制定适当难度的任务,有意义的反馈,以及重复及改正错误的机会。”(p. 20-21)《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》(在实践中认知:心智、数学和日常生活的文化)是关于这个观点的一本有趣的参考书。
  • 如果你愿意,在大学里花上4年时间(或者再花几年读研究生)。这能让你获得一些工作的入门资格,还能让你对此领域有更深入的理解,但如果你不喜欢进学校,(作出一点牺牲)你在工作中也同样能获得类似的经验。在任何情况下,单从书本上学习都是不够的。“计算机科学的教育不会让任何人成为内行的程序员,正如研究画笔和颜料不会让任何人成为内行的画家”, Eric Raymond,《The New Hacker’s Dictionary》(新黑客字典)的作者如是说。我曾经雇用过的最优秀的程序员之一仅有高中学历;但他创造出了许多伟大的软件(XEmacs, Mozilla),甚至有讨论他本人的新闻组,而且股票期权让他达到我无法企及的富有程度(译注:指Jamie Zawinski,Xemacs和Netscape的作者)。
  • 跟别的程序员一起完成项目。在一些项目中成为最好的程序员;在其他一些项目中当最差的一个。当你是最好的程序员时,你要测试自己领导项目的能力,并通过你的洞见鼓舞其他人。当你是最差的时候,你学习高手们在做些什么,以及他们不喜欢做什么(因为他们让你帮他们做那些事)。
  • 接手别的程序员完成项目。用心理解别人编写的程序。看看在没有最初的程序员在场的时候理解和修改程序需要些什么。想一想怎样设计你的程序才能让别人接手维护你的程序时更容易一些。
  • 学会至少半打编程语言。包括一门支持类抽象(class abstraction)的语言(如Java或C++),一门支持函数抽象(functional abstraction)的语言(如Lisp或ML),一门支持句法抽象(syntactic abstraction)的语言(如Lisp),一门支持说明性规约(declarative specification)的语言(如Prolog或C++模版),一门支持协程(coroutine)的语言(如Icon或Scheme),以及一门支持并行处理(parallelism)的语言(如Sisal)。
  • 记住在“计算机科学”这个词组里包含“计算机”这个词。了解你的计算机执行一条指令要多长时间,从内存中取一个word要多长时间(包括缓存命中和未命中的情况),从磁盘上读取连续的数据要多长时间,定位到磁盘上的新位置又要多长时间。(答案在这里
  • 尝试参与到一项语言标准化工作中。可以是ANSI C++委员会,也可以是决定自己团队的编码风格到底采用2个空格的缩进还是4个。不论是哪一种,你都可以学到在这门语言中到底人们喜欢些什么,他们有多喜欢,甚至有可能稍微了解为什么他们会有这样的感觉。
  • 拥有尽快从语言标准化工作中抽身的良好判断力。

抱着这些想法,我很怀疑从书上到底能学到多少东西。在我第一个孩子出生前,我读完了所有“怎样……”的书,却仍然感到自己是个茫无头绪的新手。30个月后,我第二个孩子出生的时候,我重新拿起那些书来复习了吗?不。相反,我依靠我自己的经验,结果比专家写的几千页东西更有用更靠得住。

Fred Brooks在他的短文《No Silver Bullets》(没有银弹)中确立了如何发现杰出的软件设计者的三步规划:

  • 尽早系统地识别出最好的设计者群体。
  • 指派一个事业上的导师负责有潜质的对象的发展,小心地帮他保持职业生涯的履历。
  • 让成长中的设计师们有机会互相影响,互相激励。

这实际上是假定了有些人本身就具有成为杰出设计师的必要潜质;要做的只是引导他们前进。Alan Perlis说得更简洁:“每个人都可以被教授如何雕塑;而对米开朗基罗来说,能教给他的倒是怎样能够不去雕塑。杰出的程序员也一样”。

所以尽管去买那些Java书;你很可能会从中找到些用处。但你的生活,或者你作为程序员的真正的专业技术,并不会因此在24小时、24天甚至24个月内发生真正的变化。

(全文完)





好烂啊有点差凑合看看还不错很精彩 (67 人打了分,平均分: 4.84 )
Loading ... Loading ...
  1. 2010年3月30日09:46 | #1

    说的很好。

    很多让都明白这个道理“罗马不是一天建成的”,但是往往大家又想去找一些所谓的捷径。

  2. 2010年3月30日10:30 | #2

    Teach Yourself to Learn for a Lifetime.

  3. 2010年3月31日01:56 | #3

    看这代码就头痛

  4. 2010年3月31日14:20 | #4

    这漫画有些意思,编程的东西都不是速成的,经验是最重要的

  5. 2010年4月1日15:58 | #5

    好的程序员确实应该努力

  6. 2010年4月4日18:11 | #6

    兄弟,加个链接吧,http://www.iwobz.com

  7. 2010年4月9日17:25 | #7

    出现这种情况,我觉得与计算机发展的速度也有关系。没几天就推出一项新的技术。让人应接不暇。

  8. 2010年4月18日12:12 | #8

    汝果欲学诗,功夫在诗外

  9. 2010年5月12日19:43 | #9

    每次我也很纳闷,当然是羡慕嫉妒恨
    这么多年了,我都不敢说 会或懂 C and C++

    为什么有很多书21天,3天,30天就能学会?

  10. Rocky
    2010年5月18日00:03 | #10

    哇!我很喜欢你的网站!

    “坏的程序是很容易的,就算他们是哑巴,白痴都可以在21天内学会。”

    dummy不应该翻译成哑巴,我看不出“哑巴”和学不会编程有什么关系。这里dummy表示的意思是“笨蛋”,要保持原文的递进意思,我觉得可以这样翻译:

    “写出坏的程序是很容易的,笨蛋都可以在21天内学会,即使他们真的愚蠢透顶。”

    “而对米开朗基罗来说,能教给他的倒是怎样能够不去雕塑”

    “Michelangelo would have had to be taught how not to.”

    这里原文说的how not to表示的是“给他指出哪些方法是错误的”,而不是“如果才能够抑制自己去雕塑的冲动”。一个相关的例子是“国际象棋高手”与“一般人”的差距是高手知道哪些走法是错误的。

    原文的意思是像米开朗琪罗这样秉赋极好的人来说,让他自己探索出雕塑的方法并不难(而一般人可能需要手把手地教他),更重要的在于帮助他避免一些错误的雕塑方法(这些来自于前人长时间积累的经验)。

    我想到的一个翻译是:
    而对米开朗基罗来说,更重要的是避免他养成坏习惯。

  11. 2010年5月18日01:40 | #11

    @Rocky
    所言即是,那是我更新了一个原有的翻译。

  12. 董波
    2010年5月22日10:36 | #12

    呵呵,英雄所见略同。感谢楼主的帖子,非常有意思。所以转了。

  13. q
    2010年7月29日10:54 | #13

    要是在9年前看到这篇文章该多好啊,或许我现在已经成了一个程序员

  14. DMSZ
    2010年9月27日10:00 | #14

    杀掉吧。。。

  15. HyperCube
    2010年9月29日00:32 | #15

    这篇贴子我用了好几年才看懂

  16. topin27
    2010年10月27日17:22 | #16

    从来不看什么《xx天学会xx》的小菜飘过~

  17. gp
    2010年12月20日12:50 | #17

    很有道理,很有哲理

  18. 2011年3月1日10:33 | #18

    大哥,你学C++有12年了?

  19. 曹昊
    2011年3月22日02:00 | #19

    21天***,***从入门到精通,后来想想可笑之极/*敢不敢用”21天***从小白到大师”*/

  20. 浮槎
    2011年5月6日10:50 | #20

    看到用十年的时间学习编程,我还可以接受;
    要是有谁用10年时间学习C++,只能说这个人,废了;
    你居然用10年时间只是为了学习一门本来就不那么美好的语言,
    而不是自己“写一门”语言,目标定得太低,成就不会太远。

    C++已经走入歧途了,而且方式和80年代C专家编程的预言一样,无数根本不需要的功能和繁杂的设定已经集中化的思维已经把C++变成一门臃肿丑陋的语言。

    C++primer无数次反复说明,不能延续C的思路,不能用C++的语法风格写C程序。结果呢?连C++之父都承认发展到今天的C++丑陋不堪,效率低下,问题多多。结果呢?面向对象的C发展速度远远超过了C++。

    如果你计划十年时间,想的不是去学习一门生命周期还未必有十年的语言,当时开发他都没用这么长时间,这其实和用10年时间学习word一样可笑。

    这么长的时间,是用来创造的,而且毕竟,语言永远是计算机艺术里不那么重要的部分。

    这种学习XX要付出艰辛的努力和数万小时的论点让人作呕,因为只有原理级别或者创造的价值才值得你付出这么大的努力。
    linux设计linux的时候几岁?
    牛顿发现万有引力的时候几岁?
    python的作者几岁发明的python?
    ruby呢?
    如果linux先花10年时间学习C?(个人偏见,C++根本不值得学习,虽然我被逼在使用,更多情况下我宁可自己重写需要使用的数据结构也拒绝stl,它引入的麻烦比带来的好处多得多)
    如果?

    这就是填鸭式教育给我们最好的礼物,如果你的论点来自于《异类》的话,你会注意到,《异类》中充满了对东亚的教育的赞美,《异类》中不止一次提到他对日本,中国教育体制的崇拜。

    国外的程序员很多在10-14岁做出了伟大的作品,然后走向学术的高度。

    我们却在教导用十年时间做一个码农。

    完毕。

  21. 十三
    2011年5月9日11:09 | #21

    感觉很有道理啊@浮槎

  22. 那个昵称好像不太好听
    2011年6月14日01:09 | #22

    @浮槎

    抱歉,同学(若是你愿意被我这样叫的话)你的那个单词好像拼错了。

    似乎是linus才是所谓的Linux之父吧。而且我看那个开源的电影(或者说他的一段回忆篇)里面说他是在大学里面对他老师的那个东西不认同才”Just for fun“写出了Linux的。另一个是Python,好像第一个字母要大写的。那个linus是人名,不用大写,除非这不是评论,而是书面用语。

    其实我来给你补充下论据啊(我比较喜欢写议论文的,我不喜欢写那些没有一点真情实感的记叙文,我学习从来不是为了分数)。
    第一个论据是特斯拉,呵呵,看过关于他的一些电视和纪录片资料,听说他计算和画图都用脑而已……太那个了。
    第二个论据是是个反面论据啦(一般我习惯把话说死),王小云教授,好像有点陌生,其实我也是无意间搜索MD5值重值才知道这件事情的。http://baike.baidu.com/view/350813.html#10这里的观点与上面的观点如出一辙。

    我还没完毕的,家里人叫我睡觉了。明天再来看下。

  23. songtianyi
    2011年7月5日15:28 | #23

    @那个昵称好像不太好听

    你的话易读性低 :(

  24. 2011年7月13日12:23 | #24

    同上

  25. 2011年7月24日21:49 | #25

    能写出这样的程序也不容易啊

  26. 承志
    2011年7月26日19:46 | #26

    @浮槎
    呃,原文就是《十年自学编程》(Teach Yourself Programming in Ten Years)啊?
    另外,Malcolm Gladwell 研究报告也提到,虽然贝多芬、海顿、莫扎特成名都很早,但他们从很小就开始学习音乐,投入的时间只多不少(所以我们看到计算投入时间是按小时而不是年计算,因为那样更准确),没有这些努力就没有后面的成就。

  27. shuiren
    2011年8月3日14:42 | #27

    @那个昵称好像不太好听
    没看懂想说什么

  28. 2011年8月7日01:23 | #28

    真是很形象生动!

  29. 2011年8月17日20:36 | #29

    这样的书目总会给急于求成的人很多希望,可是,急于求成是无法做好任何事情的。基础不搭好,最后会很痛苦。

  30. 2011年11月1日21:12 | #30

    为什么每个人都急不可耐?

  31. Kevin
    2011年11月27日15:35 | #31

    好多次看见这个文章题目都没进来,因为我根本就不相信21天能学会门语言。
    意外点链接进来,发现不同。所以还是换个题目好:《21学会C++???》

    看到评论有反对声音。这也让我有点动摇,你说,我没事干我学一门烂语言,我图什么啊?
    后来想想,无论是linus说了C++烂,还是C++的创造者说了,这都基于一个事实:他们也多少研究过C++。

    我也没有期望能发明一个语言,一个系统,但是C++能让我有饭吃,让我以后生活有提高。既然如此,我不介意学C++,如果你们说C++不好,那我就再学一门语言,反正我现在也会接触好几门语言,关键是精通问题。

    所以假如从实际角度看,或者学术,C++还是可以学的。
    就像我们没有因为历史上哪个国家战败了,就不认可那个国家的历史的。

  32. HgG
    2011年12月13日14:27 | #32

    网上流传的 Teach Yourself Programming in Ten Years 中译本是我的作品,我不同意你在大部分照搬我的作品的同时对局部进行修改,尤其你还要改错掉。
    我要求,你要么提供原本的译文并标明作者,你希望做出改动的地方可以用不致令人混淆作者的方式表明,比如用删除线或者不同的颜色等。
    要么你自己重新译一份。

  1. 2010年3月30日19:41 | #1
  2. 2010年3月31日01:27 | #2
  3. 2010年3月31日20:10 | #3
  4. 2010年4月1日09:02 | #4
  5. 2010年4月3日15:44 | #5
  6. 2010年4月5日20:22 | #6
  7. 2010年8月2日17:40 | #7
  8. 2010年8月17日20:45 | #8
  9. 2010年10月19日18:36 | #9
  10. 2011年3月4日08:27 | #10
  11. 2011年3月30日12:41 | #11
  12. 2011年4月1日13:12 | #12
  13. 2011年4月1日13:15 | #13
  14. 2011年4月26日21:38 | #14
  15. 2011年5月4日14:24 | #15
  16. 2011年7月18日10:39 | #16
  17. 2011年7月18日22:25 | #17
  18. 2011年7月18日23:09 | #18
  19. 2011年7月19日14:45 | #19
  20. 2011年7月19日16:13 | #20
  21. 2011年7月19日16:56 | #21
  22. 2011年7月19日17:03 | #22
  23. 2011年7月20日00:25 | #23
  24. 2011年7月20日08:42 | #24
  25. 2011年7月21日14:47 | #25
  26. 2011年7月22日23:15 | #26
  27. 2011年7月24日04:18 | #27
  28. 2011年7月25日16:01 | #28
  29. 2011年7月25日17:30 | #29
  30. 2011年7月28日09:37 | #30
  31. 2011年7月28日21:08 | #31
  32. 2011年7月30日10:36 | #32
  33. 2011年8月8日14:02 | #33
  34. 2011年8月14日01:32 | #34
  35. 2011年8月14日16:01 | #35
  36. 2011年8月24日17:52 | #36
  37. 2011年9月6日14:36 | #37
  38. 2011年9月16日17:37 | #38
  39. 2011年10月18日18:14 | #39
  40. 2011年10月20日00:49 | #40
  41. 2011年10月29日16:38 | #41
  42. 2011年12月6日22:47 | #42
  43. 2011年12月13日08:44 | #43
  44. 2011年12月17日22:19 | #44
  45. 2011年12月20日14:44 | #45
  46. 2011年12月29日09:10 | #46
  47. 2012年1月7日19:55 | #47
  48. 2012年2月7日15:51 | #48

无觅相关文章插件,快速提升流量