`
MauerSu
  • 浏览: 513499 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一份传世典文:十年编程(Teach Yourself Programming in Ten Years)

 
阅读更多
源:http://www.cnblogs.com/TimePartners/articles/1177079.html
评:
一份传世典文:十年编程(Teach Yourself Programming in Ten Years)
原文:Teach Yourself Programming in Ten Years
作者:郭晓刚翻译:郭晓刚(foosleeper@163.net)
最后修订日期:2004-3-19
2005-01-12增加了新的译本链接。

本中文译本得到了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%是计算机书籍。
结论是,要么是人们非常急于学会计算机,要么就是不知道为什么计算机惊人地简单,比任何东西都容易学会。没有一本书是要在几天里教会人们欣赏贝多芬或者量子物理学,甚至怎样给狗打扮。
让我们来分析一下像《Learn Pascal in Three Days》(3天学会Pascal)这样的题目到底是什么意思:


    学会:在3天时间里,你不够时间写一些有意义的程序,并从它们的失败与成功中学习。你不够时间跟一些有经验的程序员一起工作,你不会知道在那样的环境中是什么滋味。简而言之,没有足够的时间让你学到很多东西。所以这些书谈论的只是表面上的精通,而非深入的理解。如Alexander Pope(译注:英国诗人、作家,1688-1744)所言,一知半解是危险的(a little learning is a dangerous thing)。
    Pascal:在3天时间里你可以学会Pascal的语法(如果你已经会一门类似的语言),但你无法学到多少如何运用这些语法。简而言之,如果你是,比如说一个Basic程序员,你可以学会用Pascal语法写出Basic风格的程序,但你学不到Pascal真正的优点(和缺点)。那关键在哪里?Alan Perlis(译注:ACM第一任主啊席,图灵奖得主,1922-1990)曾经说过:“如果一门语言不能影响你对编程的想法,那它就不值得去学”。另一种观点是,有时候你不得不学一点Pascal(更可能是Visual Basic和JavaScript之类)的皮毛,因为你需要接触现有的工具,用来完成特定的任务。但此时你不是在学习如何编程,你是在学习如何完成任务。
    3天:不幸的是,这是不够的,正如下一节所言。




10年编程无师自通

一些研究者(Hayes、Bloom)的研究表明,在许多领域,都需要大约10 年时间才能培养出专业技能,包括国际象棋、作曲、绘画、钢琴、游泳、网球,以及神经心理学和拓扑学的研究。似乎并不存在真正的捷径:即使是莫扎特,他4 岁就显露出音乐天才,在他写出世界级的音乐之前仍然用了超过13年时间。再看另一种音乐类型的代表--披头士,他们似乎是在1964年的Ed Sullivan节目中突然冒头的。但其实他们从1957年就开始表演了,即使他们很早就显示出了巨大的吸引力,他们第一次真正的成功之作《Sgt. Peppers》也要到1967年才发行。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》(新黑客字典)的作者如是说。我曾经雇用过的最优秀的程序员之一仅有高中学历;但他创造出了许多伟大的软件,甚至有讨论他本人的新闻组,而且股票期权让他达到我无法企及的富有程度(译注:指Jamie Zawinski,XEmacs和Netscape Navigator的作者)。
    跟别的程序员一起完成项目。在一些项目中成为最好的程序员;在其他一些项目中当最差的一个。当你是最好的程序员时,你要测试自己领导项目的能力,并通过你的洞见鼓舞其他人。当你是最差的时候,你学习高手们在做些什么,以及他们不喜欢做什么(因为他们让你帮他们做那些事)。
    接手别的程序员完成项目。用心理解别人编写的程序。看看在没有最初的程序员在场的时候理解和修改程序需要些什么。想一想怎样设计你的程序才能让别人接手维护你的程序时更容易一些。
    学会至少半打编程语言。包括一门支持类抽象(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个月内发生真正的变化。


参考文献

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 纳秒 = (1/1,000,000,000) 秒
    从L1缓存中取一个word        2 纳秒
    从主内存中取一个word        10 纳秒
    从连续的磁盘位置中取一个word    200 纳秒
    从新的磁盘位置中取一个word(寻址) 8,000,000纳秒 = 8毫秒


脚注

T. Capey指出Amazon上面《Complete Problem Solver》的页面中,《Teach Yourself Bengali in 21 days》和《Teach Yourself Grammar and Style》被列在了“购买此书的顾客还买了以下书籍”栏目里面。我猜其中一大部分察看这两本书的人都是从我这里过去的。


译本

感谢以下作者将本文翻译成其他语言:
日文(Yasushi Murakawa),中文(郭晓刚),繁体中文(Jason Chen),西班牙文(Carlos Rueda),德文(Stefan Ram),法文(P. E. Allary),土耳其文(Çağıl Uluşahin)。
分享到:
评论

相关推荐

    传世引擎代码全套

    《传世引擎代码全套》是针对“传世”游戏的一款引擎开发源代码,适用于2.0版本的“传世仙官”。...这套源代码对于想要学习游戏开发,特别是对“传世”系列游戏有特殊兴趣的人来说,是一份宝贵的教育资源。

    UNIX网络编程_卷2_进程间通信

    UNIX网络编程 : 第2版. 第2卷, 进程间通信(中文版)(已故著名技术作家Stevens的传世之作) 基本信息 原书名: UNIX Network Programming, Volume 2: Interprocess Communications (2nd Edition) 原出版社: Prentice ...

    传世地图格式

    "传世地图格式"是一种专用于游戏开发,特别是游戏地图编辑和存储的特定文件格式。在游戏编程领域,创建和管理地图是至关重要的任务,这种格式可能是为了优化资源存储、提高加载速度或实现特定的游戏逻辑而设计的。...

    jg.rar_传世_传世服务端_传世私服_服务端

    总的来说,想要在"传世"私服开发的道路上取得成功,不仅需要扎实的编程基础,还需要对服务端架构有深入的理解。"传世服务端的结构.txt"和"www.pudn.com.txt"这两份资源,无疑是开发者探索"传世"服务端的重要工具。...

    易语言模块传世注册.rar

    易语言是一种专为中国人设计的编程语言,它的目标是让编程变得简单易学,使得非专业程序员也能快速上手。"易语言模块传世注册"很可能是易语言中用于游戏《传世》(可能指的是《传奇世界》)的注册功能模块,这个模块...

    UNIX环境高级编程_第二版

    本书是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的更新版。在本书第1版出版后的十几年中,UNIX行业已经有了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持了...

    清风工作室传世登陆器易语言源代码.rar

    易语言,是中国本土开发的一款面向中文用户的编程语言,以其直观的汉字编程语法和丰富的库支持,使得初学者也能快速上手编程。这个项目是用易语言编写的,主要服务于传奇世界这款网络游戏的登录需求。 1. **易语言...

    AFT引擎新增脚本命令详解大全.rar_aft_aft刷新_传世_传世引擎_传世脚本代码

    《AFT引擎新增脚本命令详解大全》是针对传世游戏引擎中AFT反辅助工具的一项重要资料,主要涵盖的是0307更新1.33版及其后续版本中的脚本命令使用。AFT引擎是游戏开发和管理中不可或缺的一部分,它的主要功能是防止...

    PY1.939_传世引擎1.939全套源码_复古引擎_

    在IT行业中,游戏开发是一项技术密集型的工作,而“传世引擎1.939”则是一款专为传奇世界类游戏设计的引擎,它以其独特的复古风格和丰富的功能特性,在游戏开发领域占据一席之地。本篇文章将深入探讨这款引擎的全套...

    UNIX网络编程.卷1:套接字联网API(第3版)

    这是一部传世之作!顶级网络编程专家bill fenner和andrew m. rudoff应邀执笔,对w. richard stevens的经典作品进行修订。书中吸纳了近几年网络技术的发展,增添了ipv6、sctp协议和密钥管理套接字等内容,深入讨论了...

    木木传世引擎代码

    【木木传世引擎代码】是一款专为游戏《传世》设计和开发的游戏引擎,它提供了丰富的功能,包括对心魔系统的支持以及其他创新的游戏机制。心魔系统在许多角色扮演游戏中是一个独特的元素,通常指的是玩家角色内心的...

    传世复古引擎龙腾全套最新源代码

    《传世复古引擎龙腾全套最新源代码》是一款专为游戏开发设计的软件引擎,它在游戏业内被称为“传世引擎”或“龙腾引擎”。这个引擎主要用于开发复古风格的游戏,尤其是那些模仿经典传奇世界风格的游戏,带给玩家一种...

    易语言传世1.96X以上版本通用登录器

    本资源是一款由易语言编写的“传世”游戏1.96X及以上版本的通用登录器,其开发者于2009年2月23日完成了这个程序。此登录器的强大之处在于它的兼容性,能够适应传奇世界的最新客户端,为玩家提供了方便的登录服务。 ...

    烽火传世引擎源码不报错

    本文将深入探讨“烽火传世引擎源码”这一话题,特别是修复了报错问题的版本,这对于游戏开发者和爱好者来说无疑是一份宝贵的资源。首先,我们来了解一下“烽火传世”这款游戏。 “烽火传世”是一款基于网络的角色...

    飘逸传世引擎源代码

    "飘逸传世引擎源代码"是一套专为游戏开发设计的引擎,主要应用于类似"飘逸传世"这样的大型多人在线角色扮演游戏(MMORPG)。这个引擎的源代码提供了游戏服务器和客户端的核心功能,允许开发者深入理解和定制游戏逻辑...

    传世MYSQL工具专用版

    MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它以其高效、稳定和易于扩展的特性在IT行业中占据了重要的地位。"传世MYSQL工具专用版"是专为《传奇世界》这款游戏设计的数据管理工具,主要用于处理游戏...

    The Art of Computer Programming第一卷

    总之,《计算机程序设计艺术》第一卷不仅是学习和掌握计算机编程基础的宝贵教材,也是计算机科学领域中的一部传世之作。通过阅读这本书,读者不仅可以提高解决实际问题的能力,还能够培养对编程美学和科学性的认识和...

    清风工作室传世登陆器易语言源代码.rar.rar

    《清风工作室传世登陆器易语言源代码》是一个关于游戏客户端登录器开发的资源,主要涉及易语言编程技术和网络游戏的客户端实现。易语言是一种基于中国本土的、易学易用的编程语言,旨在降低编程的门槛,让更多人能够...

    传世内挂源码,支持老客户端

    《传世内挂源码解析:支持老客户端的编程实践》 在IT行业中,游戏外挂的开发一直是程序员们热议的话题。"传世内挂"是针对经典游戏"传奇世界"的一款辅助工具,其源码的公开对于研究游戏辅助程序的开发流程、逆向工程...

    传世注册.zip易语言程序源码资源下载

    总的来说,"传世注册.zip"中的易语言程序源码资源,无论对于初学者还是专业人士,都是一份极好的学习材料。它不仅可以帮助我们提升编程技能,还能激发我们对编程的兴趣,推动我们在IT领域的探索和发展。在学习过程中...

Global site tag (gtag.js) - Google Analytics