`
阿尔萨斯
  • 浏览: 4398225 次
社区版块
存档分类
最新评论

10年编程无师自通

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>

  原文:TeachYourselfProgramminginTenYears
  作者:PeterNorvig
  翻译:郭晓刚(foosleeper@163.net
  最后修订日期:2004-3-19
  2005-01-12增加了新的译本链接。

  本中文译本得到了PeterNorvig的许可。

为什么每个人都急不可耐?

  走进任何一家书店,你会看见《TeachYourselfJavain7Days》(7天Java无师自通)的旁边是一长排看不到尽头的类似书籍,它们要教会你VisualBasic、Windows、Internet等等,而只需要几天甚至几小时。我在Amazon.com上进行了如下搜索

    pubdate:after1992andtitle:daysand(title:learnortitle:teachyourself)
    (出版日期:1992年后and书名:天and(书名:学会or书名:无师自通))

  我一共得到了248个搜索结果。前面的78个是计算机书籍(第79个是《LearnBengaliin30days》,30天学会孟加拉语)。我把关键词“days”换成“hours”,得到了非常相似的结果:这次有253本书,头77本是计算机书籍,第78本是《TeachYourselfGrammarandStylein24Hours》(24小时学会文法和文体)。头200本书中,有96%是计算机书籍。

  结论是,要么是人们非常急于学会计算机,要么就是不知道为什么计算机惊人地简单,比任何东西都容易学会。没有一本书是要在几天里教会人们欣赏贝多芬或者量子物理学,甚至怎样给狗打扮。

  让我们来分析一下像《LearnPascalinThreeDays》(3天学会Pascal)这样的题目到底是什么意思:

  ·学会:在3天时间里,你不够时间写一些有意义的程序,并从它们的失败与成功中学习。你不够时间跟一些有经验的程序员一起工作,你不会知道在那样的环境中是什么滋味。简而言之,没有足够的时间让你学到很多东西。所以这些书谈论的只是表面上的精通,而非深入的理解。如AlexanderPope(译注:英国诗人、作家,1688-1744)所言,一知半解是危险的(alittlelearningisadangerousthing)。

  ·Pascal:在3天时间里你可以学会Pascal的语法(如果你已经会一门类似的语言),但你无法学到多少如何运用这些语法。简而言之,如果你是,比如说一个Basic程序员,你可以学会用Pascal语法写出Basic风格的程序,但你学不到Pascal真正的优点(和缺点)。那关键在哪里?AlanPerlis(译注:ACM第一任,图灵奖得主,1922-1990)曾经说过:“如果一门语言不能影响你对编程的想法,那它就不值得去学”。另一种观点是,有时候你不得不学一点Pascal(更可能是VisualBasic和JavaScript之类)的皮毛,因为你需要接触现有的工具,用来完成特定的任务。但此时你不是在学习如何编程,你是在学习如何完成任务。

  ·3天:不幸的是,这是不够的,正如下一节所言。

10年编程无师自通

  一些研究者(HayesBloom)的研究表明,在许多领域,都需要大约10年时间才能培养出专业技能,包括国际象棋、作曲、绘画、钢琴、游泳、网球,以及神经心理学和拓扑学的研究。似乎并不存在真正的捷径:即使是莫扎特,他4岁就显露出音乐天才,在他写出世界级的音乐之前仍然用了超过13年时间。再看另一种音乐类型的代表--披头士,他们似乎是在1964年的EdSullivan节目中突然冒头的。但其实他们从1957年就开始表演了,即使他们很早就显示出了巨大的吸引力,他们第一次真正的成功之作《Sgt.Peppers》也要到1967年才发行。SamuelJohnson(译注:英国诗人)认为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)也抱怨说:“生命如此短暂,掌握技艺却要如此长久。”(thelyfsoshort,thecraftsolongtolerne.)
下面是我在编程这个行当里获得成功的处方:

  ·对编程感兴趣,因为乐趣而去编程。确定始终都能保持足够的乐趣,以致你能够将10年时间投入其中。

  ·跟其他程序员交谈;阅读其他程序。这比任何书籍或训练课程都更重要。

  ·编程。最好的学习是从实践中学习。用更加技术性的语言来讲,“个体在特定领域最高水平的表现不是作为长期的经验的结果而自动获得的,但即使是非常富有经验的个体也可以通过刻意的努力而提高其表现水平。”(p.366),而且“最有效的学习要求为特定个体制定适当难度的任务,有意义的反馈,以及重复及改正错误的机会。”(p.20-21)《CognitioninPractice:Mind,Mathematics,andCultureinEverydayLife》(在实践中认知:心智、数学和日常生活的文化)是关于这个观点的一本有趣的参考书。

  ·如果你愿意,在大学里花上4年时间(或者再花几年读研究生)。这能让你获得一些工作的入门资格,还能让你对此领域有更深入的理解,但如果你不喜欢进学校,(作出一点牺牲)你在工作中也同样能获得类似的经验。在任何情况下,单从书本上学习都是不够的。“计算机科学的教育不会让任何人成为内行的程序员,正如研究画笔和颜料不会让任何人成为内行的画家”,EricRaymond,《TheNewHacker'sDictionary》(新黑客字典)的作者如是说。我曾经雇用过的最优秀的程序员之一仅有高中学历;但他创造出了许多伟大的软件,甚至有讨论他本人的新闻组,而且股票期权让他达到我无法企及的富有程度(译注:指JamieZawinski,XEmacs和NetscapeNavigator的作者)。

  ·跟别的程序员一起完成项目。在一些项目中成为最好的程序员;在其他一些项目中当最差的一个。当你是最好的程序员时,你要测试自己领导项目的能力,并通过你的洞见鼓舞其他人。当你是最差的时候,你学习高手们在做些什么,以及他们不喜欢做什么(因为他们让你帮他们做那些事)。

  ·接手别的程序员完成项目。用心理解别人编写的程序。看看在没有最初的程序员在场的时候理解和修改程序需要些什么。想一想怎样设计你的程序才能让别人接手维护你的程序时更容易一些。

  ·学会至少半打编程语言。包括一门支持类抽象(classabstraction)的语言(如Java或C++),一门支持函数抽象(functionalabstraction)的语言(如Lisp或ML),一门支持句法抽象(syntacticabstraction)的语言(如Lisp),一门支持说明性规约(declarativespecification)的语言(如Prolog或C++模版),一门支持协程(coroutine)的语言(如Icon或Scheme),以及一门支持并行处理(parallelism)的语言(如Sisal)。

  ·记住在“计算机科学”这个词组里包含“计算机”这个词。了解你的计算机执行一条指令要多长时间,从内存中取一个word要多长时间(包括缓存命中和未命中的情况),从磁盘上读取连续的数据要多长时间,定位到磁盘上的新位置又要多长时间。(答案在这里。

  ·尝试参与到一项语言标准化工作中。可以是ANSIC++委员会,也可以是决定自己团队的编码风格到底采用2个空格的缩进还是4个。不论是哪一种,你都可以学到在这门语言中到底人们喜欢些什么,他们有多喜欢,甚至有可能稍微了解为什么他们会有这样的感觉。

  ·拥有尽快从语言标准化工作中抽身的良好判断力。

  抱着这些想法,我很怀疑从书上到底能学到多少东西。在我第一个孩子出生前,我读完了所有“怎样……”的书,却仍然感到自己是个茫无头绪的新手。30个月后,我第二个孩子出生的时候,我重新拿起那些书来复习了吗?不。相反,我依靠我自己的经验,结果比专家写的几千页东西更有用更靠得住。

  FredBrooks在他的短文《NoSilverBullets》(没有银弹)中确立了如何发现杰出的软件设计者的三步规划:

  1、尽早系统地识别出最好的设计者群体。

  2、指派一个事业上的导师负责有潜质的对象的发展,小心地帮他保持职业生涯的履历。

  3、让成长中的设计师们有机会互相影响,互相激励。

  这实际上是假定了有些人本身就具有成为杰出设计师的必要潜质;要做的只是引导他们前进。AlanPerlis说得更简洁:“每个人都可以被教授如何雕塑;而对米开朗基罗来说,能教给他的倒是怎样能够不去雕塑。杰出的程序员也一样”。

  所以尽管去买那些Java书;你很可能会从中找到些用处。但你的生活,或者你作为程序员的真正的专业技术,并不会因此在24小时、24天甚至24个月内发生真正的变化。

参考文献

  Bloom,Benjamin(ed.)DevelopingTalentinYoungPeople,Ballantine,1985.
  Brooks,Fred,NoSilverBullets,IEEEComputer,vol.20,no.4,1987,p.10-19.
  Hayes,JohnR.,CompleteProblemSolver,LawrenceErlbaum,1989.
  Lave,Jean,CognitioninPractice:Mind,Mathematics,andCultureinEverydayLife,
  CambridgeUniversityPress,1988.

答案

  各种操作的计时,2001年夏天在一台典型的1GHzPC上完成:

    执行单条指令            1纳秒=(1/1,000,000,000)秒
    从L1缓存中取一个word        2纳秒
    从主内存中取一个word        10纳秒
    从连续的磁盘位置中取一个word    200纳秒
    从新的磁盘位置中取一个word(寻址) 8,000,000纳秒=8毫秒

脚注

  T.Capey指出Amazon上面《CompleteProblemSolver》的页面中,《TeachYourselfBengaliin21days》和《TeachYourselfGrammarandStyle》被列在了“购买此书的顾客还买了以下书籍”栏目里面。我猜其中一大部分察看这两本书的人都是从我这里过去的。

译本

  感谢以下作者将本文翻译成其他语言:

  日文(YasushiMurakawa),中文(郭晓刚),繁体中文(JasonChen),西班牙文(CarlosRueda),德文(StefanRam),法文(P.E.Allary),土耳其文(Ça lUlu ahin)。

  PeterNorvig(Copyright2001)




分享到:
评论

相关推荐

    Python灰帽子-黑客与逆向工程师的Python编程之道[简体中文版]

    中文名: Python灰帽子-黑客与逆向工程师的Python编程之道 原名: Gray Hat Python:Python Programming for Hackers and Reverse Engineers 作者:Justin Seitz 资源格式: PDF 版本: 扫描版 出版社: 电子工业出版社 ...

    可编程控制器程序设计师.doc

    【可编程控制器程序设计师】是涉及工业自动化领域中PLC(可编程逻辑控制器)编程的专业职位,该职位要求掌握PLC的基本原理、编程语言、硬件配置及故障排查等技能。以下将从多个方面详细阐述相关知识点: 1. **PLC...

    可编程控制器程序设计师.pdf

    【可编程控制器程序设计师】是涉及工业自动化领域中PLC(可编程逻辑控制器)程序设计的专业知识。PLC是工业控制系统中的核心设备,用于逻辑控制、顺序控制、定时和计数等功能。 1. **PLC直流控制电压**:在工业控制...

    C++应用编程200例

    【C++应用编程200例】是一份深入学习C++编程语言的资源,旨在帮助初学者通过实际案例掌握C++的基本概念和技术。...通过这样的实践,你将逐步掌握C++编程,实现“无师自通”,并且“好好学习,天天向上”。

    2022年可编程序控制系统设计师四级理论知识考核试卷.doc

    可编程序控制系统设计师是从事工业自动化领域中编程和系统设计的专业人员,他们负责设计、调试、维护和优化基于可编程逻辑控制器(PLC)的控制系统。四级理论知识考核试卷主要测试考生在职业道德、基础理论、专业...

    计算机软考~2016年下半年软件评测师(上午题)与答案

    ### 计算机软考~2016年下半年软件评测师(上午题)与答案解析 #### 1. 寻址方式与寄存器 **题目解析:** - **问题:** 在汇编指令中,操作数在某寄存器中的寻址方式称为? - **选项分析:** - A. 直接寻址:操作数...

    机器人革命:深度解析未来10年AI对就业的影响.pdf

    3. 尽管机器人可能取代部分工作岗位,但同样会创造新的工作机会,如机器人的设计、维护和编程等。 4. 某些低风险的职业可能会成为未来劳动市场的热点,例如休闲理疗师、社会工作者等。 三、技术进步的双刃剑效应 1....

    2009年上半年软件设计师上午试题.pdf

    在软件开发过程中,“谁做”通常指的是一系列角色,包括项目经理、分析师、设计师、程序员、测试人员等。每个角色都有其特定的职责和任务,共同协作完成软件项目的开发和实施。 ### 项目关键路径分析 关键路径是...

    2011年上半年信息系统监理师上午试题和标准答案

    【信息系统监理师考试知识点】 ...以上是对信息系统监理师考试相关知识点的详细解释,涵盖了网络基础、系统建设、面向对象编程、存储技术、网络管理等多个方面。这些知识点对于理解和操作信息系统项目至关重要。

    19春福师《计算机原理与接口技术》在线作业二.doc

    - EPROM是可编程只读存储器,可以通过紫外线擦除并重新编程。 18. 与非门: - 与非门的输出为0,当所有输入均为1。 19. 二级存储体系: - 主存与辅存构成二级存储体系,主存速度快但容量小,辅存容量大但速度慢...

    信息系统项目管理师2006年试题及答案

    【信息系统项目管理师】是信息技术领域的一个专业资格认证,针对的是负责信息系统的规划、构建、运维和管理的专业人士。这个认证涵盖了项目管理、系统分析、系统设计、实施、安全等多个方面的知识。 1. **计算机...

    2010年下半年软件设计师答案分析.pdf

    5. **PC(程序计数器)**:PC是计算机硬件中的一个重要寄存器,用于存储下一条指令的地址,程序员可以通过编程来访问它。 6. **磁盘管理**:磁盘碎片整理和磁盘整理有助于优化磁盘性能,但分区和格式化会删除磁盘上...

    2022年可编程序控制器设计师题库.doc

    它的核心特点是具有编程灵活性、可靠性和抗干扰能力。PLC的工作方式通常采用串行循环扫描,即不断循环读取输入信号、执行程序逻辑和更新输出信号的过程。 1. PLC的工作方式:D、串行循环扫描。在每次扫描周期中,...

    2021届河南省九师联盟高三下学期数学理2月联考试题.doc

    16. 随机变量的分布列与期望:随机变量X表示从8年中随机抽取两年,其中游客人次高于平均数的年份数,需要计算X的分布列和期望值。 17. 线性回归分析:线性回归是一种统计方法,用来预测两个变量间的关系,通过已有...

    ATmeg328P资料.pdf

    - 4/8/16/32KB的在线自编程Flash程序存储器 - 256/512/512/1K字节的EEPROM - 512/1K/1K/2K字节的内部SRAM - 具有高达10,000次擦写循环的Flash和100,000次擦写循环的EEPROM - 数据保留能力在85°C温度下可达20年,25...

    ATmega169A

    ATmega169A拥有高性能的非易失性内存段,包括系统内自编程的Flash程序存储器、EEPROM和内部SRAM。Flash存储器的容量为16KB、32KB或64KB,具体取决于型号。 EEPROM存储器的大小为512B、1K或2K,内部SRAM的大小为1K、...

    JAVA入门课件

    描述中还提到了“1998年2页的Basic说明书没有网络一个暑假无师自通”,这反映了一种自学的经历。在1998年计算机刚兴起的时候,很多程序员是通过阅读说明书、书籍以及实践来学习编程的。在那个时期,网络还没有现在...

Global site tag (gtag.js) - Google Analytics