2013年10月25日星期五

用十年来学编程 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》(新黑客字典)的作者如是说。我曾经雇用过的最优秀的程序员之一仅有高中学历;但他创造出了许多伟大的软件(XEmacsMozilla),甚至有讨论他本人的新闻组,而且股票期权让他达到我无法企及的富有程度(译注:指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个月内发生真正的变化。现在你开始得到的地方...



参考文献

本杰明·布鲁姆(主编)青年,1985年,百龄坛培养人才
布鲁克斯,弗雷德,没有银弹,IEEE计算机,第一卷。20,没有。4,1987年,第 10-19。
布莱恩,WL哈特,“电汇语言研究:收购习惯的层次。心理学评论“,1899年,8,345-375
海耶斯,约翰·R.,完整的解决问题的方法,1989年劳伦斯Erlbaum。
大通,威廉·G·西蒙,赫伯特A. 知觉“国际象棋”的 认知心理学,1973年,4,55-81。
莱夫,吉恩,在实践中认知:心智,数学和日常生活的文化,剑桥大学出版社,1988年。


答案

约一个典型的PC上进行各种操作时间:
执行典型的指令1/1,000,000,000秒= 1纳秒
取L1快取记忆体0.5纳秒
分支预测错误5纳秒
取L2快取记忆体7纳秒
互斥锁/解锁25纳秒
从主内存中取100纳秒
超过1Gbps网络发送2K字节20000纳秒
依次从内存中读取1MB250,000纳秒
取新的磁盘位置(寻求)800纳秒
从磁盘顺序读取1MB20,000,000纳秒
发送数据包到欧洲和美国150毫秒= 150,000,000纳秒


附录:语言选择

有几个人问他们首先应该学习什么编程语言。有没有一个答案,但请考虑以下几点:
  • 使用你的朋友。当记者问“我应该使用什么操作系统,在Windows,Unix或Mac?”,我的回答通常是:“使用任何你的朋友使用。” 你从你的朋友学习的优势将抵消任何内在的操作系统之间的差异,或者编程语言之间。还要考虑你未来的朋友:程序员社区,你将成为其中的一部分,如果你继续。您所选择的语言是否有一个大的成长中的社区或垂死一小?有书籍,网站和网上论坛得到答案吗?你喜欢的人在那些论坛?
  • 保持简单。谁关心他们的代码的运行效率的大型团队有经验的程序员,编程语言,如C + +和Java是专为教师的专业发展。其结果是,这些语言具有专为这种情况下的复杂的零件。你关注学习编程。你不需要的并发症。你想要一种语言被设计为一个单一的新程序员很容易学习和记忆。
  • 哪种方式你更愿意学习弹钢琴:正常的,互动的方式,在你听到的每一个音符,只要你打一个键,或“批量”模式,你只听到票据完成后播放。一个整首歌?很显然,互动模式,使学习更轻松的钢琴,同时还进行编程。坚持语言与互动模式,并使用它。
鉴于这些条件,我建议,第一门编程语言Python或 计划。但是,你的情况可能有所不同,还有其他不错的选择。如果你的年龄是个位数,你可能更喜欢 爱丽丝佳乐(旧学习者也可能享受这些)。最重要的事情是你所选择上手。

附录:书籍及其他资源

不少人问我,他们应该学习什么样的书籍和网页。我再说一遍,“啃书本是不够的”,但我可以推荐以下:


笔记

T. Capey的指出,现在有完整的解决问题的方法页面上亚马逊“自学孟加拉语21天”和“自学语法和风格”下的“客户逛过此项目也逛过这些项目”部分书籍。我想看看那本书的人,很大一部分是来自此页。感谢罗斯·科恩希波克拉底帮助。

“21天教你学会C++”

2010年3月30日  发表评论 阅读评论 95,915 人阅读    
下面是一个《Teach Yourself  C++ in 21 Days》的流程图,请各位程序员同仁认真领会。如果有必要,你可以查看这个图书以作参照:http://www.china-pub.com/27043
看完上面这个图片,我在想,我学习C++有12年了,好像C++也没有学得特别懂,看到STL和泛型,还是很头大。不过,我应该去考虑研究量子物理和生物化学,这样,我才能重返98年杀掉还在大学的我,然后达到21天搞定C++的目标。另外,得要特别提醒刚刚开始学习C++的朋友,第21天的时候,小心被人杀害。呵呵。
当然,上面只是一个恶搞此类图片,学习一门技术,需要你很长的时间,正如图片中的第三图和第四图所示,你需要用十年的时间去不断在尝试,并在错误中总结经验教训,以及在项目开发中通过与别人相互沟通互相学习来历练自己。你才能算得上是真正学会。


2013年9月19日星期四

私有设备_数码高清机用KEYS收看138的TVB8高清教程(图文)



经过数码天空公司的努力,现在数码高清机很完美地支持用KEYS解密高清台 了,对大家收看108.2的CR台及138的TVB8高清及100.5C的大量的SNG高清体育直播相对有用,这次升级,让数码高清机D300更好用,画 质更好,P组几乎不再黑屏了,KEYS也能保存下来了。以下北部湾通过图来简单介绍数码高清机如何用KEYS收看TVB8高清。 第一步:首先,大家把机器放在C1这个台上等卫星自动升级,升级后发现机器变为036这个新的版本了:

第二步:增加12681V04285这个频点并扫描出TVB8高清这个台:

第三步:输入这个TVB8高清台的KEYS码88 62 26 10 56 15 01 6C,输完后按OK保存即可以收看了: