10年编程无师自通[转自LQQM]<script language="javascript" type="text/javascript"> document.title="10年编程无师自通[转自LQQM] - "+document.title </script>     
作者:Peter Norvig
翻译:郭晓刚(foosleeper@163.net)
最后修订日期:2004-3-19

本中文译本得到了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》也要到196
7年才发行。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)《Cog
nition 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),一门支持说明性规约(declarativ
e 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个月内发生真正的变化。

10年编程无师自通[转]相关推荐

  1. Peter Norvig 给程序员们的一份传世典文:10年编程无师自通

    你好,我是zhenguo 这篇文章的作者:Peter Norvig,可以说是程序员中最牛叉的人物之一,现任谷歌研究总监,是誉满全球的人工智能专家,著有<Artificial intelligen ...

  2. (转)开发心得分享:10年编程无师自通

    原文:Teach Yourself Programming in Ten Years 作者:Peter Norvig 翻译:郭晓刚(foosleeper@163.net) 最后修订日期:2004-3- ...

  3. 10年编程无师自通(转)

    一些研究者( Hayes. Bloom)的研究表明,在许多领域,都需要大约10 年时间才能培养出专业技能,包括国际象棋.作曲.绘画.钢琴.游泳.网球,以及神经心理学和拓扑学的研究.似乎并不存在真正的捷 ...

  4. 我的体会:十年编程无师自通

    为什么每个人都急不可耐? 走进任何一家书店,你会看见<Teach Yourself Java in 7 Days>(7天Java无师自通)的旁边是一长排看不到尽头的类似书籍,它们要教会你V ...

  5. python无师自通课后答案_python 编程-无师自通—命令行(笔记)

    上周时间买了一本<python 编程-无师自通>,这个周末就快看完了,里面讲得非常基础,很适合初学者看,但对于一些 python 段位比较高程序员的就不太合适了,比较这本书知识讲得很浅. ...

  6. 【阅读心得】Python编程无师自通——专业程序员的养成

    读书笔记: 笔者是一个稍微有点编程基础的人,学习python一开始是从吴恩达的视频入门的,但是直接套用框架,使用模块,对python的语法却不甚了解,我也试过直接去廖雪峰的python学习网站上面学习 ...

  7. Python编程无师自通--函数

    "函数应该做一件事.做好这件事.只能做这一件事." --罗伯特·C.马丁(Robert C.Martin) 本章将介绍函数(function):可接受输入,执行指令并返回输出的复合 ...

  8. Python编程无师自通--编程概论

    "这是我能想到的,唯一可以让我既当工程师又做艺术家的工作.它要求具备极其缜密的技术思维,因为你必须要完成精确的思考,这点我很喜欢.另一方面,它又鼓励你肆意挥洒自己的创意,只有你想不到没有你做 ...

  9. 每位开发人员都应铭记的10句编程谚语 (我超喜欢,转载了)

    所谓谚语,就是用言简意赅.通俗易懂的方式传达人生箴言和普遍真理的话,它们能很好地帮助你处理生活和工作上的事情.也正因如此,我才整理了10句编程谚语,每位开发人员都应该铭记他们,武装自己. 1. 无风不 ...

最新文章

  1. list.sort(reverse=true) 和 list.reverse() 排序上有什么区别吗?
  2. 争夺基础架构主导权,AI 新一轮战争将打响?
  3. 谷歌发表“移动AR设计的最佳做法”
  4. pythonwin 崩溃的解决办法【转贴】
  5. 【☀️~爆肝万字总结递归~❤️玩转算法系列之我如何才能掌握递归解题的能力❤️~十大经典问题助你突破极限~建议收藏☀️】
  6. 从EXCEL文件将数据导入数据库的向导程序设计!
  7. Docker部署Elasticsearch集群
  8. origin画图_3分钟浏览,Origin绘图中的12个经典问题集锦,早看早知道,躲坑没烦恼!!!...
  9. python读取data_Python批处理数据读取方法的细节:dataloader,Pytorch,批量,详解,DataLoader...
  10. vant部署_详解VUE项目中安装和使用vant组件
  11. java几种集合遍历速度对比
  12. 运维工程师之-MySQL的故障问题总结
  13. Java aio(异步网络IO)初探
  14. Java Web整合开发(37) -- SVN
  15. Qt 实现Windows系统Win10 c++音量调节
  16. Tomcat原理整理
  17. 腾讯云为什么做不过阿里云?说腾讯云败了合适吗?
  18. python量化交易书籍推荐知乎_GitHub - XingkaiLiang/vnpy: 基于python的开源量化交易平台开发框架...
  19. C语言删除字符串的所有尾部空格
  20. Java和go加密,解密,Base64失败

热门文章

  1. centos7配置自动更新安装安全补丁
  2. ubuntu使用NAT实现局域网的网络共享
  3. 想要用好三维建模软件,这些技巧一定可以帮到你
  4. php设置一个日历,一个PHP日历程序
  5. vue 封装 瀑布流
  6. 证明二项式系数平方和等于组合数C(2n,n)
  7. ijkplayer源码分析之surface与opengl关联初始化
  8. 如何一站式查询所有快递单号物流信息并进行保存
  9. python 查看某个模块包含函数方法
  10. 美团笔试题1:用正则表达式