十年内自学编程
彼得·诺维格
为什么大家都这么着急?
走进任何一家书店,你就会看到24小时内自学Java除了提供在几天或几个小时内教授C、nSQL、Ruby、算法等的无休止的变体之外。亚马逊高级搜索标题:教书,自学,小时数,自2000年起找到512本这样的书。在前十名中,有九本是编程书(另一本是关于簿记的)。类似的结果来自于将“自学”改为“学习”,或将“小时”替换为“天”。
结论是,要么人们急于学习nAbout编程,要么编程在某种程度上比其他任何东西都容易得多。纳费莱森等人他们在书中对这一趋势表示赞同。如何设计程序当他们说“糟糕的编程很容易”的时候。白痴可以在21天,即使他们是假人。“疯狂的鹅漫画也有他们的观点.
让我们分析一下标题是什么样子的24小时内自学C++可能意味着:
自学:在24小时内,您将没有时间编写几个重要的程序,并从您的成功和失败与nnr学习。您将没有时间与有经验的程序员一起工作,也不了解在C++环境中生活是什么感觉。总之,你没有时间学到很多东西。因此,这本书只能谈论一种肤浅的熟悉,而不是一种深刻的理解。正如亚历山大·波普所说,很少学习是一件危险的事情。
C++:在24小时内,您可能能够学习nc++的一些语法(如果您已经知道另一种语言),但是对于如何使用该语言您不太了解。简而言之,如果您是nBasic程序员,您可以学习使用C++语法以nBasic的风格编写程序,但是您无法了解C++实际上是好的(和不好的)什么。那有什么意义?艾伦·恩佩利斯曾经说过:“一种不影响你对编程的思考方式的语言是不值得知道的”。一个可能的问题是,您必须学习一点C++(或者更有可能是一些类似于JavaScript或处理的东西),因为您需要与n现有工具接口来完成特定的任务。但是你不是在学习如何编程,而是在学习如何完成这个任务。
在24小时内:不幸的是,正如下一节所示,这还不够。
十年内自学编程
研究人员(布鲁姆·n(1985), 布赖恩和哈特(1899年), Hayes n(1989), Simmon&Chase(1973年))已经证明,在各种领域,包括国际象棋、音乐创作、电报操作、绘画、钢琴演奏、游泳、网球以及神经心理学和拓扑学的研究,都需要大约十年的时间才能发展出专业知识。关键是审议练习:不只是一次又一次地去做,而是挑战自己--一项超出你当前能力范围的任务,尝试它,分析你在做的时候和之后的表现,并纠正错误。那就重复一遍。再重复一遍。似乎没有真正的捷径:即使是莫扎特,他在4岁时是一个音乐天才,在他开始创作世界一流的音乐之前,花费了13多年的时间。在另一种流派中,披头士乐队似乎突然出现在现场,出现在1964年的埃德·沙利文秀上。但是他们从1957年起就一直在利物浦和汉堡打小俱乐部,虽然他们很早就有了群众的吸引力,这是他们第一个伟大的成功,胡椒中士于1967年获释。
马尔科姆·格拉德威尔虽然他专注于10,000小时,而不是10年,但他推广了这一理念。NHenriCartier-Bresson(1908-2004)有另一个指标:“你的前10,000张照片是你最差的。”(他没有预料到,使用数码相机,一些人可以在一周内达到这一目标。)真正的专业知识可能需要一生的时间:nsamel johnson(1709-1784)说:“任何部门的卓越只有通过一生的劳动才能达到,而不是以更低的价格购买。”乔叟(1340-1400)抱怨道:“赖夫太短了,工艺太长了。”Hippocrates(公元前400年)以摘录“Ars Longa,nvita brevis”而闻名,这是较长的引语“Ars Longa,vita nbrevis,equo o precep,试验性周膜,niudicium n荆棘”的一部分,在英语中,这段摘录被描述为“生命短暂,工艺短暂,机会飞逝,实验变化无常,判断困难”。当然,没有一个数字是最终的答案:假设所有技能(例如编程、下棋、跳棋和音乐演奏)都需要完全相同的时间来掌握,也不认为所有的人都需要完全相同的时间,这似乎是不合理的。作为非教授。K.安德斯·爱立信他说:“在大多数领域,即使是最没有天赋的人也需要多少时间才能达到最高水平,这是很值得注意的。1万小时的时间让你感觉到,我们谈论的是每周10到20小时的时间,有些人会认为,那些天生最有天赋的人仍然需要达到最高水平。”
所以你想成为一名程序员
下面是我编程成功的秘诀:
到达感兴趣在编程中,并做一些,因为它是有趣的。确保它保持足够的乐趣,这样你就会愿意投入你的十年/10,000小时。
程序。最好的学习方式是边做边学。更严格地说,“在特定领域中,个人的最高性能水平并不是随着经验的扩展而自动达到的,但是,即使是经验丰富的个人,也可以通过刻意改进的努力来提高nPerformance的水平。”(第366页)“最有效的学习需要一个明确的任务,对于特定的个体来说,有一个不合适的难度水平,信息反馈,以及重复和纠正错误的机会。”(第20-21页)书 实践中的认知:日常生活中的思维、数学与文化是这个观点的有趣的参考。
与人交谈其他程序员;阅读其他程序。这比任何书籍或培训课程都更重要。
如果你愿意,把四年学院(或更多在一所研究所)。这会让你获得一些需要国家职业证书的工作,也会让你对这个领域有更深入的了解,但如果你不喜欢上学,你可以(用一些奉献精神)独自或在工作中获得类似的经验。无论如何,单靠书本学习是不够的。“计算机科学教育不能使任何人成为专业程序员,就像研究画笔和颜料可以使某人成为专业画家一样”埃里克·雷蒙德(Eric Raymond)说。“新黑客词典”。我雇的最好的程序员之一只有高中学位,他产生了很多太棒了 软件,有他自己的新闻组,并有足够的股票期权购买他自己的股票。夜总会.
研究项目其他程序员。做最好的程序员,不做某些项目;在其他项目上做最差的程序员。当你是最好的,你可以测试你的能力,领导一个项目,并以你的远见鼓舞他人。当你是最坏的时候,你学会了主人做什么,你学会了他们不喜欢做的事情(因为他们不让你为他们做)。
研究项目后其他程序员。理解别人写的程序。看看当最初的程序员不在的时候,需要做些什么来理解和修复它。想一想如何设计你的程序,让那些在你之后维护它们的人更容易。
至少学半打编程语言。包括一种强调类抽象(比如Java或C++)、一种强调函数抽象(比如Lisp、ML或Haskell)、一种支持语法抽象(比如Lisp)、一种支持声明性规范(比如Prolog或C++nTemplate)、以及一种强调并行性(比如Clojure或Go)的nlanguage。
请记住,有一个“电脑在“计算机科学”中。知道您的计算机执行指令、从内存中获取一个单词(有或没有缓存错误)、从磁盘中读取连续单词以及在磁盘上寻找一个新位置需要多长时间。答案在这里。)
卷入一种语言标准化努力。它可能是ANSI C++委员会,也可能是nn决定您的本地编码样式是否有2或4个空格缩进级别。不管是哪种方式,你都会了解到其他人在一种语言中喜欢什么,他们有多深的感觉,也许还有一点,他们为什么会有这种感觉。
有很好的判断力下语言标准化工作越快越好。
考虑到所有这些,通过nbook学习你能走多远,这是值得怀疑的。在我的第一个孩子出生之前,我读了所有的如何还觉得自己是个无知的新手。30个月后,当我的第二个孩子即将出生的时候,我是否回到书本上去做复习?没有。相反,我依靠的是我的个人经验,事实证明,比起成千上万页的专家撰写的文章,这些经验对我来说更有用,也更让我放心。
弗雷德·布鲁克斯,在他的文章中没有银弹为寻找优秀的nsoft设计人员确定了三部分计划:
系统地尽早确定顶级设计师。
指派一位职业导师负责前景的发展,并仔细保存一份职业档案。
为不断成长的设计师提供互动和相互激励的机会。
这假设有些人已经具备了成为一名伟大设计师所必需的素质;工作就是适当地哄他们坚持下去。艾伦·恩佩利斯更简洁地说:“每个人都可以被教导雕刻:nMichelangelo将不得不被教导如何不这样做。伟大的程序员也是如此。”佩利斯说伟大的球员有一些超越训练的内在素质。但是质量是从哪里来的呢?是天生的吗?或者他们是通过勤奋来发展它的呢?作为奥古斯特·古斯托(小说中的厨师)拉塔托维尔)说:“任何人都会做饭,但只有无畏的人才能做得好。”我认为它更多的是愿意把一个人一生中的大部分时间花在深思熟虑的实践上。但也许无畏是总结这一点的一种方式。或者,正如古斯托的批评家南顿·艾格所说:“不是每个人都能成为伟大的艺术家,但伟大的艺术家可以来自任何地方。”
因此,继续购买Java/Ruby/Javascript/PHP书籍;您可能会从中得到一些使用。但你不会在24小时或21天内改变你的生活,也不会改变你作为程序员的真正专业知识。为什么要努力工作,在24个月内不断提高呢?现在你开始有进展了..。
参考文献
布卢姆,本杰明(编辑)培养青年人才,巴兰汀,1985年。
布鲁克斯弗雷德没有银子弹,IEEE Computer,第20卷,第4号,1987年,第10-19页。
Bryan,W.L.&Harter,N.“关于电报语言的研究:n.养成一种习惯的等级制度。心理学评论, 1899, 8, 345-375
海斯,约翰·R.完全问题求解器Lawrence Erlbaum,1989年。
放大图片作者:William G.&Simon,Herbert A.“国际象棋中的知觉” 认知心理学, 1973, 4, 55-81.
拉维简实践中的认知:日常生活中的思维、数学与文化,剑桥大学出版社,1988年。
答案
典型PC上各种操作的大致时间:
执行典型指令 1/1 000 000 000秒=1纳塞克
从L1高速缓存存储器中提取 0.5纳米
分支误判 5纳米级
从L2缓存存储器中提取 7纳米
互斥锁/解锁 25纳米
从主存储器中取出 100纳米
在1 Gbps网络上发送2K字节 20 000纳塞克
从内存中顺序读取1MB 25万纳塞克
从新磁盘位置获取(查找) 8,000,000纳塞c
从磁盘顺序读取1MB 20,000,000纳塞c
把美国包裹寄回欧洲 150毫秒=150 000 000纳塞克
附录:语言选择
有几个人问他们应该先学哪种编程语言。没有一个答案,但请考虑以下几点:
利用你的朋友。当被问到“ni应该使用什么操作系统、Windows、Unix还是Mac?”时,我的回答通常是:“使用朋友使用的任何东西。”从您的nFriends学习中获得的优势将抵消操作系统之间或编程语言之间的任何内在差异。还要考虑你未来的朋友:如果你不继续的话,你会成为程序员社区的一部分。你所选择的语言是一个成长中的大社区,还是一个即将消亡的小群体?是否有书籍、网站和在线论坛可以获得答案?你喜欢那些论坛上的人吗?
保持简单。像C++NANDJava这样的编程语言是为专业开发而设计的,由大量的有经验的程序员组成,他们关心nnd代码的运行时效率。因此,这些语言具有为这些情况设计的复杂部分。你关心的是学习编程。你不需要那种并发症。你想要一种设计成易于学习和记住的语言,而不是一个新的程序员。
玩。你更愿意学习弹钢琴的哪一种方式:非常规的互动方式,在你一按下键就能听到每个音符,而不是“分批”模式,即你只在完成整首歌之后才能听到音符?交互模式使钢琴和编程更容易学习。坚持一种互动的语言,并使用它。
考虑到这些标准,我对第一种编程语言的建议是:Python或方案。另一个选择是Javascript,不是因为它为初学者设计得很好,而是因为它有很多在线教程,例如汗学院教程。但你的情况可能会不同,还有其他好的选择。如果你的吨位是个位数,你可能更喜欢爱丽丝或吱吱声或布洛克(年长的学习者也可能喜欢这些)。重要的是你选择并开始。
附录:书籍和其他资源
有几个人问他们应该向哪些书籍和网页学习。我再说一遍,“光靠书本学习是不够的”,但我不能推荐以下几点:
计划: 计算机程序的结构与解释(Abelson&Sussman)也许是对计算机科学的最好的介绍,它确实教编程作为理解计算机科学的一种方式。你可以看到网上讲座录像在这本书上,以及在线全文。这本书不具挑战性,并将淘汰一些人,也许他们可能不会成功的另一种方法。
计划: 如何设计程序(Felleisen)等人)是最好的书籍之一,而非如何以优雅和实用的方式实际设计程序。
Python: Python编程:NaN Introto CS(Zelle)是一个很好的介绍使用Python。
Python:几个nOnline教程可在Python.org.
奥兹: 计算机程序设计的概念、技术和模型(Van Roy&Haridi)被一些人视为现代阿伯尔森和苏斯曼的继承者。Nit是一个关于编程的伟大思想的旅行,它涵盖的范围比Abelson和Sussman更广,而且可能更容易阅读和理解。它使用的一种语言,Oz,并不广为人知,但作为学习其他语言的NA基础。N<
注记
T.Capey指出完全n问题求解器亚马逊的网页现在有了“21天内教你自己‘孟加拉语’”和“教你自己语法和风格”的书,在购买这一商品的n“顾客”下也有购买这些物品的“n”部分。我想看这本书的人中有很大一部分是从这一页来的。感谢罗斯·科恩帮助希波克拉底。
翻译
由于nPosting作者的存在,可以在以下网站中找到next页面的翻译:
阿拉伯语
(Mohamed A.Yahya)
保加利亚语
(Boyko Bantchev)
中国人
(郭晓刚)
克罗地亚语
(Tvrtko Bedekovic)
世界语
(Federico Gobbo)
法式
(Etienne Beauchesne)
德文
(斯特凡·拉姆)
希伯来语
(埃里克·麦凯恩)
印地语
(Vikash Tiwari)
匈牙利语
(Marton Mestyan)
印尼语
(Tridjito Santoso)
意大利语
(Fabio Z.Tessitore)
日本语
(约莫莫莫)
韩语n(黄约翰)
波斯语
(Mehdi Asgari)
波兰人
(Kuba Nowak)
葡萄牙语
(Augusto Radtke)
罗马尼亚文
(ŞTefan Lazăr)
俄文
(Konstantin Ptisyn)
塞尔维亚语
(Lazar Kovacevic)
西班牙语
(卡洛斯·鲁达)
斯洛伐克语
(Jan Waclawek)
土耳其语
(圣徒ğıl UluşAhin)
乌克兰
(Oleksii Molchanovskyi)
Peter Norvig(Copyright 2001—2014)