“21天教你学会C++”
下面是一个《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
为什么每个人都急不可耐?
(出版日期:1992年后 and 书名:天 and (书名:学会 or 书名:无师自通))
- 学会:在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年学编程
在这三个小组中的每一个人基本上都是从相同的时间开始练习的(在五岁的时候)。在开始的几年里,每个人都是每周练习2-3个小时。但是在八岁的时候,练习的强度开始显现差异。在这个班中水平最牛的人开始比别人练习得更多——在九岁的时候每周练习6个小时,十二岁的时候,每周8个小时,十四岁的时候每周16个小时,并在成长过程中练习得越来越多,到20岁的时候,其每周练习可超过30个小时。到了20岁,这些优秀者在其生命中练习音乐总共超过 10,000 小时。与之对比,其它人只平均有8,000小时,而未来只能留校当老师的人仅仅是4,000 小时。
- 对编程感兴趣,因为乐趣而去编程。确定始终都能保持足够的乐趣,以致你能够将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个月内发生真正的变化。
(全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《“21天教你学会C++”》的相关评论
说的很好。
很多让都明白这个道理“罗马不是一天建成的”,但是往往大家又想去找一些所谓的捷径。
Teach Yourself to Learn for a Lifetime.
看这代码就头痛
这漫画有些意思,编程的东西都不是速成的,经验是最重要的
好的程序员确实应该努力
兄弟,加个链接吧,http://www.iwobz.com
出现这种情况,我觉得与计算机发展的速度也有关系。没几天就推出一项新的技术。让人应接不暇。
汝果欲学诗,功夫在诗外
每次我也很纳闷,当然是羡慕嫉妒恨
这么多年了,我都不敢说 会或懂 C and C++
为什么有很多书21天,3天,30天就能学会?
哇!我很喜欢你的网站!
“坏的程序是很容易的,就算他们是哑巴,白痴都可以在21天内学会。”
dummy不应该翻译成哑巴,我看不出“哑巴”和学不会编程有什么关系。这里dummy表示的意思是“笨蛋”,要保持原文的递进意思,我觉得可以这样翻译:
“写出坏的程序是很容易的,笨蛋都可以在21天内学会,即使他们真的愚蠢透顶。”
“而对米开朗基罗来说,能教给他的倒是怎样能够不去雕塑”
“Michelangelo would have had to be taught how not to.”
这里原文说的how not to表示的是“给他指出哪些方法是错误的”,而不是“如果才能够抑制自己去雕塑的冲动”。一个相关的例子是“国际象棋高手”与“一般人”的差距是高手知道哪些走法是错误的。
原文的意思是像米开朗琪罗这样秉赋极好的人来说,让他自己探索出雕塑的方法并不难(而一般人可能需要手把手地教他),更重要的在于帮助他避免一些错误的雕塑方法(这些来自于前人长时间积累的经验)。
我想到的一个翻译是:
而对米开朗基罗来说,更重要的是避免他养成坏习惯。
@Rocky
所言即是,那是我更新了一个原有的翻译。
呵呵,英雄所见略同。感谢楼主的帖子,非常有意思。所以转了。
要是在9年前看到这篇文章该多好啊,或许我现在已经成了一个程序员
杀掉吧。。。
这篇贴子我用了好几年才看懂
从来不看什么《xx天学会xx》的小菜飘过~
很有道理,很有哲理
大哥,你学C++有12年了?
21天***,***从入门到精通,后来想想可笑之极/*敢不敢用”21天***从小白到大师”*/
看到用十年的时间学习编程,我还可以接受;
要是有谁用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岁做出了伟大的作品,然后走向学术的高度。
我们却在教导用十年时间做一个码农。
完毕。
感觉很有道理啊@浮槎
@浮槎
抱歉,同学(若是你愿意被我这样叫的话)你的那个单词好像拼错了。
似乎是linus才是所谓的Linux之父吧。而且我看那个开源的电影(或者说他的一段回忆篇)里面说他是在大学里面对他老师的那个东西不认同才”Just for fun“写出了Linux的。另一个是Python,好像第一个字母要大写的。那个linus是人名,不用大写,除非这不是评论,而是书面用语。
其实我来给你补充下论据啊(我比较喜欢写议论文的,我不喜欢写那些没有一点真情实感的记叙文,我学习从来不是为了分数)。
第一个论据是特斯拉,呵呵,看过关于他的一些电视和纪录片资料,听说他计算和画图都用脑而已……太那个了。
第二个论据是是个反面论据啦(一般我习惯把话说死),王小云教授,好像有点陌生,其实我也是无意间搜索MD5值重值才知道这件事情的。http://baike.baidu.com/view/350813.html#10这里的观点与上面的观点如出一辙。
我还没完毕的,家里人叫我睡觉了。明天再来看下。
@那个昵称好像不太好听
你的话易读性低 :(
同上