`
xiongmao3
  • 浏览: 42820 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

十年学会编程

阅读更多

原始地址:daiyuwen.freeshell.org/gb/misc/21-days-cn.html

十年学会编程

著者: Peter Norvig

翻译: Dai Yuwen


 

为何人人都这么着急?

信步走进任何一家书店,你会看到名为《如何在7天内学会Java》的书,还有各种各样类似的书:在几天内或几小时内学会Visual Basic, Windows, Internet等等,一眼望不到尽头。我在Amazon 上做了如下的 强力检索

     pubdate: after 1992 and title: days and
      (title: learn or title: teach yourself)

得到了248个结果。前78个都是计算机类书籍(第79个是 Learn Bengali in 30 days)。我用"hours"替换"days",得到了类似的结果:更多的253书。前77本是计算机类书籍,第78本是 Teach Yourself Grammar and Style in 24 Hours。在前200本书中,有96% 是计算机类书籍。

结论是:要么人们都在忙忙地学习计算机,要么计算机比其它任何东西都容易学。没有书籍教你在几天内学会古典音乐、量子物理,或者是养狗。

让我们分析一下,象一本名为《三天内学会Pascal》的书意味着什么:

  • 学习: 在三天里,你没有时间写一些重大的程序,并从成功或失败中得益。你没有时间与有经验的程序员合作,并理解在那样的环境下工作是怎么回事。一句话,你不会有时间学到太多东西。因此他们只能谈论一些肤浅的东西,而不是深入的理解。正如亚力山大教皇所说,浅尝辄止是危险的事情。

     

  • Pascal: 在三天时间里,你可能学会Pascal的语法(如果你已经学过类似的语言),但你学不到更多的如何使用这些语法的知识。也就是说,假如你曾是个BASIC程序员,你可以学着用Pascal语法写出BASIC风格的程序,但你不可能了解Pascal真正的好处(和坏处)。那么关键是什么? Alan Perlis 说过:“一种不改变你编程的思维方式的语言,不值得去学。” 一种可能的情况是:你必须学一点儿Pascal(或可能性更大的象Visual Basic 或 JavaScript之类),因为你为了完成某种特定的任务,需要与一个现存的工具建立接口。不过那不是学习如何编程,而是在学习如何完成那个任务。

     

  • 三天内: 很不幸,这不够,原因由下一节告诉我们。

在十年里学会编程

研究表明 (HayesBloom)在任何一种领域内,象下棋、作曲、绘画、钢琴演奏、游泳、网球、以及原子物理学和拓扑学,等等,要达到专家水平大约都要化十年时间。没有真正的捷径:即使是莫扎特,4岁时就是音乐神童,13年后才开始写出世界级的作品。在另一方面,披头士似乎在1964年的Ed Sullivan表演上一炮走红。但他们从1957年就开始表演,在获得大众青睐后,他们的第一个重大成功,Sgt. Peppers,是1967年发行的。Samuel Johnson (塞缪尔·约翰逊,英国辞典编纂家及作家)认为要花比十年更长的时间:“在任何领域中出类拔萃都要用毕生的劳作来取得;它不可能用较低的代价获得。” 而Chaucer(乔叟,英国诗人)感叹到:“人生短暂,学海无涯。”

这是我为编程成功开出的方子:

  • 设法对编程感兴趣,并且因为它有趣而编一些程序。确保编程一直充满足够乐趣,这样你才愿意投入十年宝贵时间。

     

  • 与其他程序员交流; 阅读其它程序。这比任何书本或训练课程都重要。

     

  • 写程序。 最好的学习方式是 从实践中学习。 用更技术性的话说,“在一个给定的领域内,个人的最大能力不是自动地由扩展了的经验取得的,但即使是高度有经验的人也可以通过有意识的努力来提高自己的能力” (p. 366) 和 “最有效的学习需要因人而异的适当难度,目标明确的任务,丰富的信息反馈,以及重复的机会和错误修正。” (p. 20-21) 此书 Cognition in Practice: Mind,Mathematics,and Culture in Everyday Life 是阐明此观点的令人感兴趣的参考文献。

     

  • 如果愿意,在大学里呆上4年或更长(在研究生院里)。你会接触到一些需要学历证明的工作,你会对此领域有更深的理解。如果你不喜欢学校,你可以(通过一些贡献)在工作中获得相似的经验。在任何情况下,光啃书本是不够的。Eric Raymond,The New Hacker's Dictionary一书的作者,说过,“计算机科学不能把任何人变成编程专家,就象光研究刷子和颜料不会使人变成画家一样。” 我雇佣过的最好的程序员之一仅有高中程度;他做出了许多优秀的 软件,有他自己的新闻组,而且通过股票期权,他无疑比我富有的多。

     

  • 和其他程序员一起做项目。在其中的一些项目中作为最好的程序员; 而在另一些项目中是最差的。当你是最好的,你能测试领导项目的能力,用你的观点激发别人。当你是最差的,你学习杰出者是怎么做的,了解他们不喜欢做什么(因为他们吩咐你做事)。

     

  • 在其他程序员 之后接手项目。使自己理解别人写的程序。当程序的原作者不在的时候,研究什么需要理解并且修改它。思考如何设计你的程序以便后来者的维护。

     

  • 学习至少半打的编程语言。包括一种支持类抽象的语言(象Java 或C++),一种支持函数化抽象的语言(象Lisp或ML),一种支持语法抽象的语言(象 Lisp),一种支持声明规格说明的语言(象Prolog或C++ 的模板),一种支持共行程序(coroutine)的语言(象Icon或Scheme),一种支持并行的语言(象Sisal)。

     

  • 请记住“计算机科学”中有“计算机”一词。了解你的计算机要花多长时间执行一条指令,从内存中取一个字(有cache),从磁盘中读取连续的字,和在磁盘中找到新的位置。(答案

     

  • 参与一种语言标准化的工作。它可以是ANSI C++委员会,也可以是决定你周围小范围内的编程风格是应该两个还是四个空格缩进。通过任何一种方式,你了解到其他人在某种语言中的想法,他们的理解深度,甚至一些他们这样想的原因。

     

  • 找到适当的理由尽快地从语言标准化的努力中脱身。

明白了这些,仅从书本中你能得到多少就成了一个问题。在我第一个孩子出生前,我读了所有的(关于育儿的)How to 书籍,仍然感觉是个手足无措的新手。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 PC的各种操作要花的时间

答案

 

 

执行一条指令 1 nsec = (1/1,000,000,000) sec
从L1 cache memory 中取一个字 2 nsec
从内存中取一个字 10 nsec
从磁盘的连续位置取一个字 200 nsec
从磁盘的新位置取一个字(seek) 8,000,000nsec = 8msec

附录:语言的选择

不少人问我,他们首先该学哪种编程语言。没有绝对的答案,不过请考虑以下几点:

 

  • 用你的朋友的。当被问起“我该用哪种操作系统,Windows,Unix,还是Mac?”,我总是回答:“你朋友用什么,你就用什么。” 你从朋友那能学到知识,这种优势可以抵销不同操作系统或语言之间本质的差异。也考虑你将来的朋友:程序员社区 — 你将成为它的一部分如果你继续往前走的话。你选择的语言是否有一个成长中的社区,还是人数不多、即将消亡? 有没有书籍、网站、在线论坛回答你的问题? 你喜欢论坛里的那些人吗?

     

  • Keep it simple, stupid. 象C++和Java这样的语言是为经验丰富的程序员组成的团队进行专业开发而设计的,他们专注于代码运行时的效率。因此,这些语言有些部分非常复杂。 而你关注的是如何编程,不需要那些复杂性。你需要的是这样的语言: 对单个的编程新手来说,它易学易记。

     

  • 练习。你偏爱哪种学弹钢琴的方式:通常的交互式的方式,你一按下琴键就能听到音符;还是“批量”模式,你只有弹完整首曲子才能听到音符?显然,用交互模式学习弹钢琴更容易些,编程也一样。坚持用交互模式学习并使用一种语言。

有了上面的准则,我推荐的第一个编程语言是PythonScheme。因人而异,还有其它好的选择。如果你的年纪是10岁以下,你可能更喜欢Alice。关键是你要选择并开始实践。

附录:书籍和其它资源

不少人问我,他们该从什么书籍或网页开始学起。我重申“仅从书本里学习是不够的。” 但我还是推荐:

 

 


 

脚注

This page also available in Japanese translation thanks to Yasushi Murakawa, in Spanish translation thanks to Carlos Rueda and in German translation thanks to Stefan Ram.

T. Capey points out that the Complete Problem Solver page on Amazon now has the "Teach Yourself Bengali in 21 days" and "Teach Yourself Grammar and Style" books under the "Customers who shopped for this item also shopped for these items" section. I guess that a large portion of the people who look at that book are coming from this page.


Peter Norvig(Copyright 2001)

分享到:
评论

相关推荐

    十年学会编程.doc

    著者: Peter Norvig 翻译: Dai Yuwen

    十年学会编程.pdf

    ### 十年学会编程——深度解析编程学习的本质 #### 编程学习的现状与误区 在当前社会,人们对于快速掌握技能的需求日益增加,尤其是在信息技术领域。书店里充斥着诸如《7天学会Java》之类的书籍,承诺能在极短的...

    十年编程无师自通.txt

    ### 十年编程无师自通 #### 原文:Teach Yourself Programming in Ten Years #### 作者:Peter Norvig #### 翻译:郭晓刚(foosleeper@163.net) #### 最后修订日期:2004-3-19 #### 格式:.TXT ### 知识点总结 #...

    Java编程宝典:十年典藏版6

    《Java编程宝典:十年典藏版6》是一本深入探讨Java编程技术的权威著作,旨在为读者提供全面、深入的Java学习资源。这本典藏版汇集了过去十年Java编程领域的精华,涵盖了从基础到高级,从理论到实践的各种知识点,是...

    我和LabVIEW-一个NI工程师十年的编程经验

    最初,用户可以不用任何LabVIEW书籍即可通过试错的方式学会基本操作,但这种方式带来的不便也促使用户进一步阅读专业资料,以提升编程技能。LabVIEW编程的直观性和易用性使其特别适合初学者和非专业编程人员。它提供...

    LabVIEW十年编程经验

    本文将基于"LabVIEW十年编程经验"这一主题,深入探讨LabVIEW的核心概念、编程技巧以及在实际应用中的注意事项。 1. **基础知识**:LabVIEW的基础在于G编程语言,它通过连接不同的函数节点来构建程序。每个函数节点...

    2021年03月中国电子学会青少年编程等级考试Python二级真题+答案

    ### 2021年03月中国电子学会青少年编程等级考试Python二级知识点解析 #### 知识点一:字典操作与管理 **题目描述**:对于字典 `infor = {"name":"tom", "age":13, "sex":"male"}`,如何删除 `"age":13` 键值对? *...

    《电子学会Scratch考级》2019年12月图形化编程 二级考试真题(含答案)

    ### 《电子学会Scratch考级》2019年12月图形化编程二级考试真题解析 #### 一、单选题 ##### 1. 角色面向方向问题 **题目描述**:以下程序执行后,角色面向的方向是? - A. 右上 - B. 右下 - C. 左上 - D. 左下 ...

    《电子学会Scratch考级》2019年12月图形化编程 三级考试真题(含答案)

    根据提供的信息,《电子学会Scratch考级》2019年12月图形化编程三级考试真题(含答案),我们可以从中提炼出一系列与Scratch编程相关的知识点。 ### 一、选择题 #### 1. 图章颜色的修改 题目询问了如何修改图章的...

    最新十套 中国电子学会青少年编程Python一级历年真题(22年03月-24年06月).zip

    中国电子学会青少年编程Python一级考试主要考察学生对Python编程的基础知识和基本技能的掌握。以下是一级考试的范围和内容: 编程环境:了解Python的多种开发环境,熟练使用Python自带的IDLE开发环境,包括新建文件...

    我和LabVIEW:一个NI工程师的十年编程经验

    ### LabVIEW:一个NI工程师的十年编程经验 #### LabVIEW概览 - **起源与发展**:LabVIEW(Laboratory Virtual Instrumentation Engineering Workbench)是由美国国家仪器公司(National Instruments,简称NI)研发...

    编程语言快速记忆手册

    如果编程语言里面的所有英语单词你都不认识,那么很难想像你怎么可能学会编程语言。 特别是当看别人的源码或自己写源码时,会用到很多的英语单词来命名变量名称、类名称、字段名称等的,如果单词量达不到的话,会...

    十天学会易语言!PDF+例程!欢迎广大易语言爱好者下载。

    "十天学会易语言"这个课程可能按照渐进的方式安排,每天涵盖一个或多个关键主题,帮助学习者逐步建立编程思维和掌握易语言基础。这些主题可能包括: 1. **基础概念**:介绍易语言的基本结构、变量、常量、运算符等...

    vc++编程宝典十年典藏版源代码13-18章

    《VC++编程宝典十年典藏版》是面向C++编程者的一本经典教程,它涵盖了从基础到高级的各种主题,旨在帮助读者深入理解和熟练掌握VC++编程技术。该书的源代码13-18章,分别涉及了C++编程中的多个关键知识点,包括但不...

    十年编程经验凝结 与新人们分享

    ### 十年编程经验凝结 与新人们分享 #### 关键知识点提炼: 1. **抽象思维的重要性**:这是编程中最基本且最重要的能力之一。它指的是从现实生活中复杂的现象或问题中提炼出共性,形成一种更高层次的概念或模型。 ...

    十天学会易语言教程

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

    UNIX编程艺术1~3试读

    《UNIX编程艺术》的作者将Unix三十年中未见纸端的艰难胜利的软件工程智慧熔入文字。使Unix家庭成为最最具创新软件的哲学、设计模式、工具、文化和传统,Raymond将之第一次带给我们,并向我们展示它们如何影响当今的...

    小朋友讲C++编程入门(1-12课)-2023.09.21.pdf

    C++是一种强大的、面向对象的编程语言,由Bjarne Stroustrup于1979年在贝尔实验室开发。它是C语言的超集,不仅继承了C语言的高效性和系统访问能力,还引入了类、模板、异常处理、命名空间等高级特性,使得程序设计...

    十天学会PHP教程(PHP入门宝典)

    自1995年诞生以来,PHP已经发展成为一个功能强大的服务器端脚本语言,尤其在处理表单数据、数据库交互以及服务器端编程方面表现突出。 【PHP与MySQL的结合】 PHP与MySQL的结合是Web开发中的经典组合。MySQL是一种...

    《全国青少年软件编程等级考试》2021年6月C语言一级真题(含答案).pdf

    《全国青少年软件编程等级考试》2021年6月C语言一级真题(含答案) 本资源是关于全国青少年软件编程等级考试的C语言一级真题,包含5道题目,分别是数的输入和输出、(a/b)*c 的值、大写字母的判断、特殊求和、硬币...

Global site tag (gtag.js) - Google Analytics