`
xiongmao3
  • 浏览: 42133 次
  • 性别: 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

    十年学会编程.pdf

    编程语言快速记忆手册

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

    十天学会易语言教程

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

    UNIX编程艺术1~3试读

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

    《中国电子学会青少年编程Python》2023年3月3级题目及答案

    青少年软件编程(Python)等级考试试卷(三级) 分数:100 题数:38一、单选题(共25题,共50分) 1. 十进制数111转换成二进制数是?( ) A. 111 B. 1111011 C. 101111 D. 1101111 试题编号:20230113-ylx...

    Linux C编程一站式学习

    然而学员入学时的水平是非常初级而且参差不齐的:学历有专科、本科也有研究生,专业有和计算机相关的也有很不相关的(例如会计专业),以前从事的职业有和技术相关的也有完全不相关的(例如HR),年龄从二十出头到三...

    《中国电子学会青少年编程Python》2022年9月3级题目及答案

    青少年软件编程(Python)等级考试试卷(三级) 分数:100 题数:38 一、单选题(共25题,共50分) 1. 十六进制数100,对应的十进制数为 ?( )   A.  128 B.  256 C.  28 D.  56 试题编号:20220425-ll-...

    [原创] 【汉语编程】开源公益软件:华夏万年历4709(甲)

    作者原本计算机知识欠缺,无缘进行软件开发的,直到西历2008年秋,在网络上发现了一种中文编程语言:汉语程序设计语言,感觉这种编程语言简单易学,用十多天时间就学会了,而且成功调试出汉语编程初级教程上的实例...

    SmartNest切割套料编程软件

    SmartNest是武汉智格科技有限公司历经十余年不懈努力、精心研发的一款具有自主知识产权的切割套料编程软件,该软件的核心技术指标已达到国际先进水平! (1)全自动高速优化套料——利用率提高1%~5% (2)全自动...

    2021.12电子协会青少年python考试(三级)含答案已整理好格式

    2021.12电子协会青少年python考试(三级)含答案已整理好格式

    编程巨星的唯一秘诀

    由于坚持这个真理,一个资深的程序员能在一天的时间里学会一门新的编程语言,而由于不坚持这条真理,一个初级的程序员用十年时间也只能挣到一份糊口的钱、永远是来实现别人的设计、永远不够优秀而得不到晋升的机会。...

    Chastity Checkerboard:使用 C 编程语言绘制棋盘格-开源

    这个项目中有多个文件,它们包含我最好的代码,随着我找到时间进行编程,这些代码已经缓慢改进了十多年。 通过将我与 C 编程语言的经验相结合,并从 2019 年开始学习使用 SDL 库,我设法在我的计算机屏幕上获得了一...

    搭建之星可视化中文编程教程

    《搭建之星》采用国际流行的可视中文开发模式,不懂英文也会开发,开发过程就像搭积木一样简单。...让不会电脑的人不会英语的人也很轻松的学会编程,在学习完本课程后再学习其他编程语言会觉得很容易。

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

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

    IEEE_电气工程师_数字信号处理_FORTRAN程序库-3

    本书是在1976年初,由IEEE声学、语言学以及信号处理学会所组成的数字信号处理委员会,着手进行的一项计划的结晶。 本书所有程序符合下列要求: (1)必须包括全部用户文件。 (2)程序必须用FORTRAN语言,并且符合...

    CCF CSP认证注册、报名、查询成绩、做模拟题等答疑.pdf

    中国计算机学会(CCF)联合华为、360、滴滴等十余家知名IT企业以及清华、北航、国防科大等15所著名高校于2014年推出CCF CSP(计算机软件能力)认证标准,用于评价业界人士的计算机软件能力。 截至2022年4月,CCF ...

    Python 小白书

    在翻遍了我能找到的几十本国内外的 Python 编程教程 之后,我还是似懂非懂。那些教程里面到处都是抽象的概念、复杂的逻辑,对于专业开发者这些再平常 不过,而对于我这样一个学设计出身的编程小白,没有被视觉化的...

    活用UML-软件设计高手

    讲师有近十年的应用UML进行软件分析的经验,曾主持和指导多个大型项目的软件架构、用户体验设计、数据库设计、详细设计等工作,对软件设计有独到的理解。同时讲师有多年的授课经验,讲课深入浅出,注重引导学员思考...

Global site tag (gtag.js) - Google Analytics