转载——10年编程无师自通_alittlelearningisadangerousthing-程序员宅基地

技术标签: 语言  pascal  lisp  磁盘  编程  basic  

 

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


走进任何一家书店,你会看见《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年还是不够的:“任何领域的卓越成就都只能通过一生的努力来获得;稍低一点的代价也换不来。”(Excellenceinanydepartmentcanbeattainedonlybythelaborofalifetime;itisnottobepurchasedatalesserprice.)乔叟(译注: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毫秒

原文(英文): http://www.norvig.com/21-days.html#answers
(中文): http://www.javaresearch.org/article/12568.htm
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yw0031/article/details/1706624

智能推荐

自动部署开源AI模型到生产环境:Sklearn、XGBoost、LightGBM、和PySpark_离线 开源ai模型 报表-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏24次。介绍了如何通过DaaS-Client Python客户端自动部署开源AI模型到生产环境中:Sklearn、XGBoost、LightGBM和PySpark,并且在DaaS网络客户端管理这些模型和部署_离线 开源ai模型 报表

BloomFilter应用与D-Lelft BloomFilter实现_dleft hash bloomfilter-程序员宅基地

文章浏览阅读812次。此篇文章是开发过程中对BloomFilter应用场景的一些介绍,另外项目中实现了D-Left BloomFilter,相关实现时一些注意的地方,简单介绍下!首先看一些应用场景:1.海量的黑白名单。2.爬虫抓取时重复的URL处理。3.数据key是否存在检测4.(一些面试题几十亿不重复整数中判断其中一个整数是否存在的问题,BitMap/BloomFilter能很好的解决)。。。_dleft hash bloomfilter

利用递归函数调用方式,将所输入的五个字符,以相反顺序打印出来-程序员宅基地

文章浏览阅读1k次。递归void palin(int n);int main(){ int i=5; printf("please input 5 numbers:"); palin(i); printf("\n"); } void palin(int n){ char next; if(n<=1) { next=getchar(); printf("\n"); putchar(nex..._要求利 递归函数调 的 式,将获取到所输 的5个字符,以相反顺序分别输

工作中常用的Git命令整理_工作中常用git命令-程序员宅基地

文章浏览阅读384次。背景码农10年,git命令还是经常使用的,这里整理下常用的git命令,用于新人上手。常用git命令一览:从远端拉一个分支:git checkout -b accuse origin/accusegit push origin HEAD -u 【将新建分支推送到远端服务器】从当前分支拉一个分支:git checkout -b accuse创建分支 git checkout -b new_branch 注意,new_branch的代码来自于当前分支切换分_工作中常用git命令

百兆以太网口通信速率_千兆以太网的传输速度-程序员宅基地

文章浏览阅读3.1k次。千兆以太网主流标准千兆以太网络技术早在上世纪90年代末就已成熟,其中,1995年国际标准化组织TIA/EIA颁布了1000Base-TX标准,该标准的目的是把双绞线用于千兆以太网中,其目的是在6类非屏蔽双绞线(UTP)上以1000Mbps速率传输100米。1000Base-TX基于4对双绞线,采用快速以太网中与100Base-TX标准类似的传输机制,是以两对线发送,两对线接收。由于每对线缆本身不进..._bi_da+

python图书管理系统基本增删改查函数实现_python实习报告图书-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏55次。# 准备工作warning = ["傻", "蠢", "笨", "呆", "愚"] # 敏感词users = [{"user_name": "张三", "user_password": "18546732149"}, {"user_name": "manger", "user_password": "000000"}, {"user_name": "user1", "user_password": "123456"}]def menu(): while True: ._python实习报告图书

随便推点

macbook 开发推荐_macbook 开发必备-程序员宅基地

文章浏览阅读447次。1. IDEPhpStorm,收费的但绝对物有所值,世界上有家公司叫JetBrains,他们开发的IDE都炒鸡好使,谁用谁知道 JetBrains IDEs to create a better Web: IntelliJ IDEA, ReSharper, RubyMine, WebStorm, PhpStorm, PyCharm2. 数据库ClientSequel Pro ,可以..._macbook 开发必备

一文概览主要语义分割网络,FCN、UNet、SegNet、DeepLab 等等等等应有尽有_语义分割网络有哪些-程序员宅基地

文章浏览阅读2.4k次。文章目录介绍 网络架构 Fully Convolution Networks (FCNs) 全卷积网络 SegNet U-Net DeepLab v1 DeepLab v2 DeepLab v3 Fully Convolutional DenseNet E-Net 和 Link-Net Mask R-CNN PSPNet RefineNet G-..._语义分割网络有哪些

PAT 1151 LCA in a Binary Tree(30 分)- 甲级_lca in a binary tree 柳婼-程序员宅基地

文章浏览阅读8.3k次,点赞47次,收藏17次。The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U and V as descendants.Given any two nodes in a binary tree, you are supposed to find their LCA.In..._lca in a binary tree 柳婼

HAL库教程10:定时器的PWM模式应用_mx_tim2_ini pwm-程序员宅基地

文章浏览阅读6.5k次,点赞13次,收藏41次。  本节通过定时器的PWM模式驱动无源蜂鸣器,来演奏一段音乐。本博客在掌机的系列教程中介绍过蜂鸣器的驱动原理,感兴趣的可以参考电子琴无源蜂鸣器驱动电路  蜂鸣器按照有无震荡源(不是电源),可以分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器上电就能工作,控制简单,但是只有一个音调。无源蜂鸣器需要单片机提供震荡源,虽然控制稍微复杂一点,但是可以发出不同频率的声音。PWM原理  根据我们的电路,引脚输..._mx_tim2_ini pwm

06第四章:Android生命周期_输出警告日志信息使用lo02类的( ) 方法-程序员宅基地

文章浏览阅读296次。Android程序的什么周期Android程序的什么周期是指在Android系统中,进程从启动到终止的所有阶段,即Android程序从启动到停止的全过程。Android程序的生命周期是由系统控制,而非程序自身直接控制。优先级从高到低:前台、可见、服务、后台、空进程前台进程:前台进程是Android系统中最重要的进程,它是与用户正在进行交互的进程。这样的进程重要性最高,一般情况下,系统中只有少数这样的进程。除非系统内存非常低,否则系统不会选择终止前台进程。满足前台进程的条件:进程正在最前段运行一个_输出警告日志信息使用lo02类的( ) 方法

Android Multimedia框架总结(二十六)利用FFmpeg进行解码直播流_multimedia android framework ffmpeg 系统图-程序员宅基地

文章浏览阅读8.4k次,点赞8次,收藏16次。转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/59225373早在去年九月份时,写过一篇《手把手图文并茂教你用Android Studio编译FFmpeg库并移植》,今天用去年编译好的3.1.3的ffmpeg,进行在Android平台上解码直播流。看下Agenda:_multimedia android framework ffmpeg 系统图

推荐文章

热门文章

相关标签