`
xiaoshenge
  • 浏览: 170883 次
  • 性别: Icon_minigender_1
  • 来自: 十堰
社区版块
存档分类
最新评论

十年学会程序设计[转载]

 
阅读更多

 

http://blog.youxu.info/21-days/

 

 

十年学会程序设计

Peter Norvig (Copyright 2001) 原文网址

为何大家如此匆忙?

走进任何一家书店,你会看到书架上一排不见尽头的放着如 <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等),因为你需要跟现成的工具组合完成特定的工作。不过这个时候,你实际上学的不是怎么写程序,而是要学着如何完成工作。

  • 三天

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

十年学会程序设计

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

再看另一种类型的领域。披头士乐团似乎是在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小时,几天或者几个月中,这些都不会改变你的人生,你也不能掌握一个真正的程序员应该具备的真正的综合的技能。

分享到:
评论

相关推荐

    Web程序设计13 Web程序设计13 Web程序设计13 Web程序设计13

    Web程序设计是构建和维护互联网应用程序的关键领域,它涵盖了多种技术和工具,用于创建交互式的、动态的、用户友好的网站。在这个主题中,"Web程序设计13"可能指的是一个课程或者系列教程的第13个部分,着重于进一步...

    第十三届湖南省大学生计算机程序设计竞赛获奖名单.docx

    第十三届湖南省大学生计算机程序设计竞赛获奖名单.docx第十三届湖南省大学生计算机程序设计竞赛获奖名单.docx第十三届湖南省大学生计算机程序设计竞赛获奖名单.docx第十三届湖南省大学生计算机程序设计竞赛获奖名单....

    Python 语言程序设计

    在介绍面向对象程序设计和GUI编程之前,首先介绍基本逻辑和程序设计概念。书中除了给出一些以游戏和数学为主的典型实例外,还在每章的开始使用简单的图形给出一两个例子,以激发学生的学习兴趣。 本书特色  以...

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

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

    C++程序设计(谭浩强)

    参阅了国内外数十种有关C++的教材,认真分析了读者在学习中的困难和认识规律,设计了读者易于学习的教材体系,于2004年出版了《C++程序设计》一书。该书降低入门起点,不需要C语言的基础,从零起点介绍程序设计和C++...

    C.程序设计语言 十周年纪念版

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

    Java语言程序设计 进阶篇 原书第10版

    本书是Java语言的经典教材 ,中文版分为基础篇和进阶篇,主要介绍程序设计基础、面向对象程序设计、GUI程序设计、数据结构和算法 、高级Java程序设计等内容。本书以示例讲解解决问题的技巧,提供大量的程序清单,每...

    java语言程序设计 基础篇原书第10版part1

    本书是Java语言的经典教材,中文版分为基础篇和进阶篇,主要介绍程序设计基础、面向对象程序设计、GUI程序设计、数据结构和算法、高级Java程序设计等内容。本书以示例讲解解决问题的技巧,提供大量的程序清单,每章配...

    程序设计实践 程序设计实践

    在编程领域,程序设计实践是核心能力之一,它涵盖了从问题定义、算法设计、编码实现到测试调试等一系列步骤。在程序设计实践中,我们不仅要掌握一种或多种编程语言,还需要理解软件工程的基本原则,具备良好的代码...

    Windows程序设计第十章

    Windows程序设计第十章 Windows程序设计第十章

    IBM PC汇编语言程序设计

    第十~十二章分别说明图形显示、发声和磁盘文件存取的程序设计方法及程序实例;第十三章为包括汇编语言和高级语言相连接在内的多个模块的连接技术。全书提供了大量程序实例,每章后均附有习题。\r\n 本书适于初学者...

    《Python语言程序设计》[刘卫国][习题解答]

    Python语言不仅语法优雅、清晰、简洁,而且具有大量的第三方函数模块,因此很适合初学者作为程序设计入门语言进行学习,对学科交叉应用也很有帮助。本书介绍Python语言程序设计的基础知识。全书以Python作为实现工具...

    2020年(第十二届)四川省大学生程序设计竞赛方案【模板】.pdf

    2020年(第十二届)四川省大学生程序设计竞赛方案【模板】.pdf2020年(第十二届)四川省大学生程序设计竞赛方案【模板】.pdf2020年(第十二届)四川省大学生程序设计竞赛方案【模板】.pdf2020年(第十二届)四川省大学生程序...

    [详细完整版]飞行程序设计.pdf

    飞行程序设计是航空领域至关重要的一个环节,它关乎着航空器起飞、爬升、巡航、下降直至降落的全过程。飞行程序定义为航空器按规定顺序执行的一系列机动飞行,包括飞行路线、高度和机动区域,是确保航空安全和效率的...

    十年学会编程.doc

    著者: Peter Norvig 翻译: Dai Yuwen

    Rust 程序设计Rust 程序设计语言

    Rust程序设计语言的升级迭代中,还包括了新的`impl Trait`语法的引入,这在第十章有所体现。`impl Trait`语法简化了类型说明,允许在函数签名中使用`impl Trait`来代替复杂的泛型类型,从而简化了泛型编程的复杂性。...

    郭天祥之十天学会单片机视频配套程序-实用!

    郭天祥之十天学会单片机视频配套程序实用! 本资源提供了郭天祥之十天学会单片机视频配套程序,旨在帮助学习者快速掌握单片机编程技术。该资源包含七个实验项目,涵盖了位操作和总线操作两种方式来控制单片机上的...

    Java程序设计:第十一章 多线程程序设计.ppt

    Java程序设计:第十一章 多线程程序设计.ppt

    java语言程序设计 梁勇 第十版答案.zip

    梁勇编著的《Java语言程序设计》第十版是一本广泛使用的教材,旨在帮助读者深入理解Java编程。这本书不仅涵盖了Java的基础知识,还包含了面向对象编程的核心理念和实践技巧。 在提供的压缩包"java语言程序设计 梁勇...

    Java语言程序设计 (原书第10版) (全本完整版)

    8的特性,采用“基础优先,问题驱动”的教学方式,循序渐进地介绍了程序设计基础、解决问题的方法、面向对象程序设计、图形用户界面设计、异常处理、I/O和递归等内容。此外,本书还全面且深入地覆盖了一些高级主题,...

Global site tag (gtag.js) - Google Analytics