十年内自学编程
研究者(Bloom(1985)、Bryan & Harter(1899)、Hayes(1989)、Simmon & Chase(1973))都表明,在下棋、音乐创作、电报操作、绘画、弹钢琴、游泳、网球以及神经心理学和拓扑学研究等众多领域中的任何一个领域,都需要大约10年的时间来发展专业知识。关键是刻意练习:不是一味地重复做,而是用一个刚好超出你目前能力的任务来挑战自己,尝试一下,在做的时候和做完之后分析自己的表现,并纠正任何错误。然后再重复。然后再重复。似乎没有真正的捷径:即使是4岁就成为音乐神童的莫扎特,也花了13年时间才开始创作出世界级的音乐。在另一种类型中,披头士乐队似乎是凭借一连串的#1热门歌曲和1964年在埃德-沙利文节目中的亮相而崭露头角的。但自1957年以来,他们一直在利物浦和汉堡的小俱乐部演出,虽然他们早期具有大众吸引力,但他们的第一个巨大的评论成功,Sgt.Peppers,于1967年发布。
马尔科姆-格拉德威尔(Malcolm Gladwell)已经普及了这个想法,尽管他专注于10000小时,而不是10年。亨利-卡蒂尔-布列松(1908-2004)有另一个衡量标准:"你的前一万张照片是你最糟糕的作品"。他没有预料到,用数码相机,有些人可以在一周内达到这个大关)。真正的专业技能可能需要一生的时间。塞缪尔-约翰逊(1709-1784)说过 "任何部门的卓越只有通过一生的努力才能达到,它是不可能用较低的价格买到的。" 而乔叟(1340-1400)抱怨 "lyf so short,the craft so long to lerne"。希波克拉底(Hippocrates,约公元前400年)以节选 "Ars longa,vita brevis "著称,这是较长引文 "Ars longa,vita brevis,occasionio praeceps,experimentum periculosum,iudicium difficile "的一部分,英文译为 "Life is short,[the]craft long,opportunity fleeting,experiment treacherous,judge difficult"。当然,没有一个单一的数字可以作为最终的答案:假设所有的技能(如编程、下棋、下跳棋和音乐演奏)都可能需要完全相同的时间来掌握,也假设所有的人都需要完全相同的时间,这似乎并不合理。正如安德斯-爱立信教授所说:"在大多数领域,即使是最有天赋的人也需要多少时间才能达到最高水平的表现。1万小时这个数字只是让你感觉到,我们说的是每周10到20个小时的年限,而那些有些人认为是最有天分的人仍然需要这样的时间才能达到最高水平。
为什么大家都这么着急?
走进任何一家书店,你都会看到《24小时内自学Java》,旁边还有无穷无尽的变种,提供在几天或几个小时内教授C、SQL、Ruby、算法等。亚马逊高级搜索【标题:教,自己,小时,自:2000年以来,发现512本这样的书。前十名中,有9本是编程类书籍(另一本是关于记账的)。把 "教自己 "换成 "学",或者把 "小时 "换成 "天",也有类似的结果。
结论是,要么是人们大肆学习编程,要么是编程在某种程度上比其他东西更容易学得美妙。Felleisen等人在他们的《如何设计程序》一书中对这一趋势进行了点拨,他们说:"糟糕的编程很容易。白痴可以在21天内学会它,即使他们是傻瓜。" Abtruse Goose的漫画也有他们的看法。
所以你想成为一名程序员
这是我的编程成功秘诀:
对编程感兴趣,因为好玩,所以要做一些。确保它一直足够有趣,这样你才会愿意投入你的十年/10000小时。
程序。最好的学习是在实践中学习。更技术化地讲,"个人在某一领域中的最大表现水平并不是作为长期经验的函数而自动达到的,但即使是经验丰富的个人,也可以通过刻意努力提高表现水平"。(第366页)而 "最有效的学习需要有一个明确的任务,对特定个体来说有适当的难度,有信息反馈,有重复和纠正错误的机会"。(第20-21页)《实践中的认知》一书。"(第20-21页)《实践中的认知:日常生活中的心智、数学和文化》一书是这一观点的有趣参考。
与其他程序员交流;阅读其他程序。这比任何书籍或培训课程都重要。
如果你愿意,在大学里投入四年的时间(或者在研究生院里投入更多)。这将使你有机会从事一些需要证书的工作,而且会使你对这个领域有更深的了解,但如果你不喜欢上学,你可以(在有一定的奉献精神的情况下)自己或在工作中获得类似的经验。无论如何,仅靠书本学习是不够的。新黑客词典》的作者埃里克-雷蒙德(Eric Raymond)说:"计算机科学教育不能使任何人成为程序员专家,就像学习毛笔和颜料可以使某人成为画家专家一样"。我曾经雇佣过的一个最好的程序员只有高中学历,他制作了很多优秀的软件,拥有自己的新闻集团,股票期权赚得足够买下自己的夜总会。
与其他程序员一起做项目。在一些项目上成为最好的程序员,在另一些项目上成为最差的程序员。当你是最好的,你可以检验你领导项目的能力,并以你的眼光激励他人。当你是最差的时候,你可以学习高手们做的事情,也可以学习他们不喜欢做的事情(因为他们让你为他们做)。
跟着其他程序员做项目。理解别人写的程序。当原来的程序员不在的时候,看看要怎么理解和修复它。思考如何设计你的程序,让你之后维护程序的人更轻松。
至少学习半打编程语言。包括一门强调类抽象的语言(如Java或C++),一门强调功能抽象的语言(如Lisp或ML或Haskell),一门支持语法抽象的语言(如Lisp),一门支持声明式规范的语言(如Prolog或C++模板),一门强调并行的语言(如Clojure或Go)。
记住,"计算机科学 "中有个 "计算机"。知道你的计算机执行一条指令、从内存中取一个字(有和没有缓存遗漏)、从磁盘中连续读取字、寻找到磁盘上的新位置需要多长时间。(答案在此。)
参与语言标准化工作。可能是ANSI C++委员会,也可能是决定你的本地编码风格是采用2个还是4个空格缩进级别。不管是哪种方式,你都能了解到其他人喜欢的语言是什么,他们有多深的感受,甚至可能会了解到他们为什么会有这样的感受。
要有良好的意识,尽快摆脱语言标准化工作。
考虑到这些,其仅靠书本学习能走多远,值得商榷。在第一个孩子出生前,我把所有的How To书都看了一遍,但还是觉得自己是个毫无头绪的新手。30个月后,当我的第二个孩子即将出生时,我又回到书本上复习了吗?相反,我依靠自己的亲身经历,这比专家们写的几千页书更有用,也更让我放心。
Fred Brooks在他的文章《No Silver Bullet》中指出了寻找优秀软件设计师的三个部分计划:
1.尽早系统地识别顶级设计师。
2.指派一名职业导师负责对潜在客户的培养,并认真保存职业档案。
3.为成长中的设计师提供相互交流、相互激励的机会
这就假设有些人已经具备了成为一名优秀设计师的必备素质,工作就是要适当地诱导他们。Alan Perlis说得更简洁。"每个人都可以被教成雕塑家 米开朗基罗就得教他如何不雕刻。伟大的程序员也是如此"。Perlis的意思是说,伟大的人都有一些超越他们训练的内在品质。但这种品质从何而来?是与生俱来的吗?还是他们通过勤奋培养出来的?正如Auguste Gusteau(《料理鼠王》中虚构的厨师)所说,"任何人都可以做饭,但只有无畏者才能成为伟大的人"。我认为更多的是愿意将自己生命中的大部分时间投入到刻意的实践中。但也许无畏是一种概括的方式。或者,正如食神的批评家安东-埃戈所说:"不是每个人都能成为伟大的艺术家,但伟大的艺术家可以来自任何地方。"
所以去买那本Java/Ruby/Javascript/PHP的书吧;你可能会从中得到一些用处。但你不会在24小时或21天内改变你的生活,也不会改变你作为一个程序员的真正的整体专业知识。怎么样在24个月内努力地不断提高呢?好了,现在你开始有收获了......