`
jw2007
  • 浏览: 18454 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

十年学会程序设计

阅读更多

十年学会程序设计


Peter Norvig (Copyright 2001) 原文网址

 

本文转自:http://blog.youxu.info/fyi/21-days/

 



为何大家如此匆忙?


走进任何一家书店,你会看到书架上一排不见尽头的放着如 <7天自学Java语言> 以及几天或者几小时学会Windows, 因特网或者Visual Basic 这类书。我在Amazon 网上书店用一下的方式进行高级搜索:


出版年份: 1992以后 书名包括:“天” 和 “学习” 或 “自学”


得到了268条搜索结果,其中前78条都是计算机书(第79条是 30天学会孟加拉语)。 我用 “小时” 代替“天” 作为关键字,得到了神奇般类似的结果:这次有253本书,前77本是计算机书, 第78本是 24小时自学语法和写作风格。排名前200的书中有96%是计算机书。


由此可见,人们要不就是急着想学会计算机,要不就是计算机相比于其他事情太容易学会了。比如说把,没有书是写在几天弹奏贝多芬或几天学会量子物理,甚至也没有几天学会帮小狗打扮这样的书。


让我们分析一下 三天学会Pascal语言 [英文网页] 这样的标题表达了什么意思:




  • 学会:


在三天内,你没有时间去写几个有意义的程序,或者从成功和失败中学到东西。你也没时间跟有经验的程序员一起工作,所以也无法了解在真正编程是什么样子。简短的说,就学会而言,时间显然不够。所以这些书只是浮于表面的熟悉,而不是深刻的理解。如同Alexander Pope 所说,一知半解是危险的。




  • Pascal 语言:


三天内你可能学会Pasacl语言的语法(如果你已经掌握一个类似的编程语言),但你无法学会如何合理运用这些语法。简言之,如果你是个Basic 程序员,你可以用Pascal 语言写出类似Basic 风格的程序,但你学不到Pascal语言的优点(还有缺点)到底在哪。重点是什么呢? Alan Perlis 曾说: “如果编程语言不能影响你的编程思维,那就不值得去学.” 另一个可能是,你必须学会一点点Pascal语言(或是像VB语言、Javascript等),因为你需要跟现成的工具组合完成特定的工作。不过这个时候,你实际上学的不是怎么写程序,而是要学着如何完成工作。




  • 三天


不幸的是三天根本不够;下面的章节会告诉你为什么


十年学会程序设计


研究者 Hayes, Bloom 的研究表明,在几乎所有的各种领域,大约要十年才能培养出专业技能。这些领域包括下西洋棋、音乐作曲、绘画、钢琴、游泳、网球,及神经心理学和数学拓扑学。似乎没有真正的捷径--即便是莫扎特在四岁就展露出音乐天才,在他写出世界级的音乐之前仍然用了超过十三年的时间。


再看另一种类型的领域。披头士乐团似乎是在1964年的Ed Sullivan 剧场表演突然地火起来并成为第一乐队的。但其实他们从 1957 年开始,就在利物浦、汉堡等地的小型俱乐部表演。虽然他们很早就显现强大的吸引力,但他们决定性的成功作品 Sgt Pepper 也到1967年才发行。Samuel Johnson 则认为或许还不止十年才行,他说:任何领域的卓越成就都必须用一生的努力才能取得; 稍微低一点的代价都是换不到的。Chaucer 则感叹道: “生命如此短促,学习技艺却要这么地长”


以下是我在编程上成功的秘诀:




  • 对编程产生感兴趣并因为乐趣而写程序。确信你自始至终都能乐在其中,这样你才愿意将十年光阴投入编程事业.


  • 与其他程序员交流;阅读别人的代码。这比任何书任何培训都重要。


  • 不断地编写。 最好的学习方法是在实践中学习 。从技术角度说,”在特定领域的个人最高效率并不因为经验够多就会自动获得;但若有意识的通过努力去提升经验,个人效率会变高”(第336页)而 “高效的学习一般需要明确的任务和因人而异的适当难度,以及及时的反馈和重复或者修正错误的机会”(20~21页)Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life实践中认知:心智、数学与日常文化) 是这个观点的一本有趣参考书籍。


  • 如果你愿意,你可以去读四年大学(或再读研究生)。这可以让你满足一些工作的学历要求,同时也可让你对这个领域有更深的认识。但如你不喜欢上学,你也能(得有牺牲)通过工作获得类似的经验。无论如何,只读书是不够的。《New Hacker’s Dictionary》的作者Eric Raymond 曾经说过: “计算机的教育无法让人成为编程的专家,正如研究画笔与颜料不能让人成为专业画家一样.” 一个在我所有招聘过的人中属于最优秀之一的程序员只有高中毕业,但他写出很多很棒程序,他甚至有自己的新闻组。他获得的股票期权使得他可以拥有自己的午夜酒吧.


  • 跟其他程序员一起完成项目。在一些项目中成为最好的程序员;在一些中则充当最差的一个。当你是最佳的,你要测试自己领导项目的能力,并以你的能力鼓励他人。当你是最差的,要看看高手做些什么,他们不喜欢做什么 (因为他们会叫你去帮他们做).


  • 接手别的程序员完成项目。全心投入并理解别人的程序。当原作者不在的时候,看看在理解与修改时有什么要注意的。想想如何设计你的程序使得后来维护的人容易上手。


  • 至少学会六门编程语言。一种要支持类/对象(class abstractions)的语言, 如Java或C++; 一种函数式(functional abstraction)语言, 如 LISP 或 ML; 一种支持语法抽象(syntactic abstraction) 的语言 如 LISP; 一种声明式语言, 如Prolog或 C++模版; 一种支持协同式(coroutines)编程, 如 Icon 或 Scheme; 还有一种支持并行(parallelism)的语言, 如 Sisal.


  • 记住在 “计算机科学” 中包括”计算机” 这个词。要知道你的计算机执行一条指令需要多久,到内存中取一个字需要多久(缓存是否击中), 到磁盘读取连续的字需要多久,而磁盘的定位又需要多久. (解答见文末)


  • 进行语言标准化的工作。可以像是由ANSI C++ 委员会,或由你自己的团队,来决定你们的编码风格,譬如说缩排是2或4个空格。不管怎样,你都能学到别人到底喜欢什么,对语言的感受有多深,甚至能了解到一点他们为什么有这样的感觉。


  • 并具备良好的判断力,也别老纠缠在语言标准化上.


谈 了上面所有的想法后,我不禁要问究竟能从书上学到多少。在第一个孩子出生前,我读完了所有的 “怎样…” 的书,仍觉得自己是个一无所知的(照顾孩子的)菜鸟。30个月后,第二个孩子出世,我要重回这些书好好复习么? 不! 取而代之的是,我开始相信自己的个人经验。这些难得的经验,比专家写的几千页手册还要有用,而且让我重新找到了自信.


Fred Brooks (译注: <人月神话>作者) 在他的文章 没有银弹 中指出,发掘卓越软体设计者的三部曲:


1.尽早尽可能地以系统化的方式发掘最佳设计人员。
2.给有潜力者指派生涯规划师,并谨慎地规划他们的职业生涯。
3.提供机会给正在成长的程序员,让他们能相互影响,彼此激励。


这里假定了某些人已具备成为卓越设计师的必要潜能;工作只是诱导他们前进。Alan Perlis 说得更简洁了,你可以教任何人学雕塑,但对米开朗基罗而言,要教他的
反倒是有哪些事不要做, 卓越的程序员也一样。


所以,尽管买那些 Java 书吧!你或许能从中找到点有用的,但是在24小时,几天或者几个月中,这些都不会改变你的人生,你也不能掌握一个真正的程序员应该具备的真正的综合的技能。



参考文献:


Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.


Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.


Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.


Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.


________________________________


解答:


各种操作的时间,以2001年夏季,典型配置的 1GHz 个人计算机为标准:






























执行单一指令 1 纳秒
从L1 高速缓存取一个字 2 纳秒
从内存取一个字 10 纳秒
从磁盘取连续存放的一个字 200 纳秒
磁盘寻址并取字 8 毫秒


________________________________

附录 I: 语言的选择

好几个人问过我一开始应该先学哪个计算机编程语言,这个问题没有唯一的答案,不过选择的时候可以从以下的几个方面考虑:




  • 朋友在用的. 当人们问我:”我该用什么操作系统的时候”, 我通常的回答是:“用你朋友用的”. 这样的好处是从朋友那儿学习可以弥补复杂的操作系统差异或者编程语言差异(给你造成的困惑)。这里也要考虑你未来的朋友:如果你一直使用的话,开发社区会是你的朋友。你选择了一个具有有巨大的增长的开发社区还是一个小的快消失的开发社区的语言? 它有相关的书,网站和论坛可以获取解答么? 你喜欢那些论坛上的人么?




  • 保持简单. 诸如C++和Java 是为那些关心代码执行效率的有经验的大型团队的开发人员设计的。因此这些语言中有些为这些特殊场合设计的部件。你只是关心编程而不需要关心复杂情况。你需要一个为新学编程的人设计的容易学习和理解的语言。




  • 实践. 什么是学习钢琴的好方法呢? 是一边听音一边弹奏的“交互式” 的方法呢,还是全听完整首歌然后再弹奏的那种“批处理”方式呢? 很显然, 交互学习的方式能够让学钢琴变得简单–这也适用于编程. 选取一种交互式的编程语言并且坚持使用.


基于以上的这些标准,我对于第一次接触编程的人推荐 Python 或 Scheme. 但是情况各有不同,或许也有其他的选择. 如果你不满10岁,你可能会喜欢Alice 或者Squeak(年龄大的人或许也喜欢这些). 重要的是在选择后, 立即开始学习和使用.


附录II: 书和其他资源:


很多人问我该从什么书或者什么网页开始看起。我重申一句:“仅仅看书是不够的”,不过我也推荐一下的一些:








  • Oz: 计算机编程的概念,技术和模型(Van Roy & Haridi) 可以视为第一本书的现代版. 他是关于编程的一些总揽,包含了比第一本书更加广泛也更加容易阅读和理解的领域。这本书使用了一个不太为人所知的编程语言叫 Oz, 不过这个可以作为学习其他编程语言的一个基础。


________________________________


注: T. Capey 指出,在Amazon 的 问题彻底解决者 的页面上购买了这本书的人还买了: “21天学孟加拉语” 和 “自学语法和写作风格” 这两本书,我估计大部分是我这个页面带过去的用户.


Peter Norvig (Copyright 2001)


Eric You XU 翻译,2007年4月



译者附记:


这是一篇经典的揭示计算机学习和计算机编程领域浮躁苗头的文章。原有的中文翻译链接已经失效,因此特此重新翻译一次。在翻译的过程中,我参考了台湾网友的部分遣词造句以及个别我不能理解的句子的含义,特此向他表示感谢.


如果有什么地方因为个人水平疏漏翻译不到或者打字错误的地方,恳请网友不吝指出。 我的邮件地址是 youxu A@T wustl.edu, 把 A@T 换成 @, 我叫Eric You XU, 你可以直接叫我Eric.


 


分享到:
评论

相关推荐

    [C.程序设计语言.特别版.十周年纪念版].(The.C.Programming.Language.Special.Edition)

    《C程序设计语言 特别版 十周年纪念版》是C语言的经典之作,由C++之父Bjarne Stroustrup撰写。这本书深入浅出地介绍了C语言的基础知识和高级特性,对于学习和理解C语言有着极高的指导价值。 在第一章“致读者”中,...

    大学十年 林锐 本文摘自《高质量C++/C程序设计指南》

    从给定的文件信息来看,这是一篇关于林锐在大学十年的学习经历和个人成长的叙述,其中穿插了对《高质量C++/C程序设计指南》的引用,以及作者对于学习态度、专业选择、个人兴趣与挑战的深刻反思。下面将从几个关键点...

    《C程序设计》(谭浩强)[PDF]

    C语言是国内外广泛使用的计算机语言,学会使用C语言进行程序设计是计算机工作者的一项基本功。 本书的第一版于1991年出版,第二版于1999年出版。由于本书作者具有丰富的教学经验和编写教材的经验,并针对初学者的...

    高级语言程序设计

    - 《C语言程序设计》,作者:何钦铭、颜晖,出版社:高等教育出版社,2008年版。 2. **学习策略**: - 自主学习:通过自学教材和其他资源来理解和掌握C语言。 - 重视上机实践:通过实际操作加深对概念的理解,并...

    江科大818计算机程序设计语言真题及答案2008-2018年

    《江科大818计算机程序设计语言真题及答案2008-2018年》集合了过去十年间江科大818计算机程序设计语言考试的历年试题和对应答案,对于备考该科目而言,是一份极具价值的学习资料。这份资料不仅能够帮助考生了解考试...

    Java程序设计教学大纲

    Java程序设计教学大纲是针对3年制高职专科软件技术专业的教学计划,旨在教授学生Java语言的设计原理和开发技术。这门课程是专业基础必修课,共计75学时,其中包括理论学时75学时,32学时的课内上机实践,以及2周的...

    蓝桥杯第十三届国赛程序设计题

    第十三届蓝桥杯国赛程序设计题无疑是对参赛者编程技巧的一次严峻考验,涵盖了一系列的算法和数据结构问题。 在准备蓝桥杯竞赛时,参赛者需要对以下几个关键知识点有深入的理解和熟练的运用: 1. **基础算法**:...

    计算机程序设计艺术(第一卷清晰版).part4.rar (共4卷)

     本书是国内外业界广泛关注的7 卷本《计算机程序设计艺术》第1卷的最新版,以基本的程序设计概念和技术开始,然后专注于信息结构——计算机内部信息的表示、数据元素之间的结构关系以及如何有效地处理它们,给出了...

    计算机导论与程序设计试题

    这份2017年的试题集提供了丰富的练习机会,帮助学生巩固计算机导论与程序设计课程的关键概念。通过解答这些问题,学生可以检验自己对计算机系统、编程语言、算法设计的理解程度,同时提升实际编程和问题解决的能力。...

    郭天祥十天学会单片机

    第二讲 流水灯设计、蜂鸣器发声、继电器控制 简单延时程序、子程序调用、带参数子程序设计、流水灯同时蜂鸣器响、如何驱动蜂鸣器,及如何驱动继电器,集电极开路的概念及应用。 第三讲 数码管显示的原理、 数码管的...

    计算机程序设计艺术(第一卷清晰版).part1.rar (共4卷)

     本书是国内外业界广泛关注的7 卷本《计算机程序设计艺术》第1卷的最新版,以基本的程序设计概念和技术开始,然后专注于信息结构——计算机内部信息的表示、数据元素之间的结构关系以及如何有效地处理它们,给出了...

    “微机原理与汇编语言程序设计”实验内容及报告要求(2009年下期自动化07级)

    ### 微机原理与汇编语言程序设计实验知识点解析 #### 实验一:键盘、显示程序设计实验 **实验目标**: - 掌握键盘输入处理的基本方法。 - 学会将键盘输入的字符转化为ASCII码并在屏幕上显示。 - 理解字符串输入...

    单片机程序设计的十层功力

    ### 单片机程序设计的十层功力解析 #### 第一层:初识门径 - **核心能力**:能够运用C语言实现简单的逻辑控制任务,例如控制LED闪烁、简易的数码管显示等。 - **典型特征**:对于单片机产生浓厚兴趣,能够通过实践...

    C程序设计_第三版_谭浩强+课后习题答案.rar

    C语言是国内外广泛使用的计算机语言,学会使用C语言进行程序设计是计算机工作者的一项基本功。  本书的第一版于1991年出版,第二版于1999年出版。由于本书作者具有丰富的教学经验和编写教材的经验,并针对初学者的...

    十天学会易语言教程

    易语言是一门计算机程序设计语言,也通常代指与之对应的集成开发环境,其特点是通过汉语进行编程。 易语言的创始人是吴涛。早期版本的名字为E语言。 易语言最早的版本的发布可追溯至2000年9月16日。 吴涛曾表示,...

    ACM 程序设计:程序设计 前言-6.pdf

    【ACM程序设计】是关于美国计算机学会(Association for Computing Machinery,简称ACM)组织的一项重要竞赛——国际大学生程序设计竞赛(International Collegiate Programming Contest,简称ICPC)的介绍。这项比赛自...

    十天学会单片机C语言的课后答案--郭天祥

    在第二讲中,我们将学习流水灯设计,包括蜂鸣器发声、继电器控制简单延时程序、子程序调用、带参数子程序设计、流水灯同时蜂鸣器响、如何驱动蜂鸣器、如何驱动继电器、集电极开路的概念及应用等。 在第三讲中,我们...

    c语言练习题当代最优秀的程序设计语

    但是,在《K&R》中并没有定义一个完整的标准C语言,后来由美国国家标准学会在此基础上制定了一个C 语言标准,于一九八三年发表。通常称之为ANSI C。 当代最优秀的程序设计语  早期的C语言主要是用于UNIX系统。由于...

    第十四届中北大学ACM程序设计竞赛.zip

    ACM,全称Association for Computing Machinery,中文名为国际计算机学会,是一个世界性的计算机从业员专业组织,创立于1947年,是世界上第一个科学性及教育性计算机学会,目的是集合计算机工业界、学术界、研究实验...

Global site tag (gtag.js) - Google Analytics