彼得·诺维格
为什么大家都这么着急?
走进任何一家书店,你就会知道怎么做24小时自学爪哇除了无止境的变化之外,还提供在几天或几小时内教授C、SQL、Ruby、算法等。亚马逊高级搜索[标题:自学,自学,学时,自2000年起找到了512本这样的书。在前十名中,有九本是编程书籍(另一本是关于簿记)。类似的结果来自于用“学习”代替“自学”,或者用“天”代替“小时”
结论是,要么人们急于学习编程,要么编程比其他任何东西都容易得多。费雷森等等在他们的书中对这种趋势表示赞同如何设计程序,当他们说“糟糕的编程很容易。白痴可以在21天即使他们是假人“《阿不勒斯鹅》漫画也有他们的看法.
我们来分析一下标题是什么样的24小时自学C可能意味着:
自学:你可以在24小时内从失败中吸取教训。你没有时间和有经验的程序员一起工作,也没有时间去理解生活在C环境中的感觉。在短时间内,你不会学到很多东西。所以这本书只能说是一种表面的熟悉,而不是深刻的理解。正如亚历山大·波普所说,一点点学习是危险的。
C:在24小时内,你也许能学会一些of c的语法(如果你已经知道另一种语言的话),但你却无法学到很多关于如何使用这种语言的知识。简而言之,如果你是一个基础程序员,你可以学习用C语法以basic的风格编写程序,但是你不能学习C实际上的优点(和缺点)。那么有什么意义呢?丙泊酚曾经说过:“一种不影响你思考编程方式的语言是不值得知道的”。一个可能的观点是你必须学习一点C语言(或者更可能是JavaScript或处理之类的东西),因为你需要与一个现有的工具交互来完成特定的任务。但你并不是在学习如何编程,而是在学习如何完成这项任务。
24小时内:不幸的是,这还不够,正如下一节所示。
十年自学编程
研究人员(布鲁姆(1985),布莱恩和哈特(1899),海斯(1989),西蒙蔡斯(1973))已经证明了它需要十年的时间来发展在各个领域的专业知识,包括国际象棋、音乐创作、电视广播、绘画、钢琴演奏、游泳、网球以及欧洲心理学和拓扑学的研究。关键是深思熟虑的练习:不只是一次又一次地做,而是用一个超出你目前能力的任务来挑战你自己,尝试它,分析你在做的时候和之后的表现,并改正任何错误。然后重复。再重复一遍。似乎有诺雷亚尔的捷径:即使是莫扎特,他在4岁时是一个音乐天才,也比他开始创作世界级的音乐多了13年。沙利文在1965年首次在汉堡演出时,他们在其他类型的乐队中表现得很出色,但他们在1964年首次在汉堡演出时就表现得很抢眼,辣椒中士,于1967年被释放。
马尔科姆格拉德威尔尽管他专注于10000个小时,而不是10年。Henri Cartier-Bresson(1908-2004)有另一个衡量标准:“你的前10000张照片是你最差的。”(他没有想到数码相机,真正的专业知识可能需要一辈子的时间:塞缪尔·约翰逊(Samuel Johnson,1709-1784)曾说:“任何部门的卓越都只能靠一生的劳动来获得,而不是以较低的价格买到的。”乔叟(1340-1400)抱怨道:“lyf太短了,希波克拉底(约公元前400年)因节选“ars longa,vita brevis”而闻名,这是较长引语“ars longa,vita brevis,occasio praeceps,experitum periculosum,iudiciumdifficile”的一部分,在英语中是“生命是短暂的,[the]craftlong,机会转瞬即逝,实验充满危险,很难判断。”当然,没有一个数字可以作为最终答案:假设所有技能(例如编程、下棋、下棋和玩音乐)都需要完全相同的时间来掌握,也不认为所有人都需要完全相同的时间来掌握。作为教授。K、 安德斯·爱立信他说:“在大多数领域,即使是最优秀的个人也需要多少时间才能达到最高水平的绩效,这一点是值得注意的。1万小时的数字让你感觉到,我们说的是一周10到20个小时的工作时间,有些人会说,那些天生最有才华的人,仍然需要达到最高水平。”
所以你想成为一名程序员
以下是我编程成功的秘诀:
得到感兴趣的在编程方面,做一些因为它很有趣。一定要让它保持足够的乐趣,这样你才会愿意投入你的10年/10000小时。
程序. 最好的学习方式是边干边学. 从技术上讲,“个人在某一特定领域的最高绩效水平并不是作为经验扩展的函数自动实现的,但是即使是经验丰富的个人,通过深思熟虑的努力,绩效水平也可以提高。”(第366页)“最有效的学习需要一个明确的任务,对特定的个体有适当的难度,信息反馈,以及重复和纠正错误的机会。”(p.20-21)实践中的认知:日常生活中的思维、数学与文化是这个观点的一个有趣的参考。
与…交谈其他程序员;阅读其他程序。这比任何书籍或培训课程都重要。
如果你愿意的话,在一个学院(在农业学校或更多)。这会让你接触到一些需要进修的工作,也会让你对这个领域有更深入的了解,但如果你不喜欢上学,你可以(带着一些奉献精神)在自己或工作中获得类似的经验。无论如何,光靠书本学习是不够的。”计算机科学教育不能使任何人成为专业程序员,正如学习画笔和颜料可以使某人成为专家画家一样新黑客词典. 我雇过的最好的程序员之一只有高中学历,他已经做了很多工作伟大的软件,有他自己的新闻组他赚了足够的股票期权来买自己的夜总会.
从事项目其他程序员。在某些项目上做最好的程序员;在其他项目上做最差的。当你是最好的,你可以测试你的能力,领导一个项目,并用你的远见激励别人。当你是最差的时候,你会知道他们做什么,你也会知道他们不喜欢做什么(因为他们让你为他们做)。
从事项目之后其他程序员。理解别人写的程序。看看需要什么才能理解并在最初的程序员不在的时候修复它。想想如何设计你的程序,让那些在你之后维护它们的人更容易。
至少学半打程序设计语言. 包括一种强调类抽象的语言(如Java或C),一种强调功能抽象的语言(如Lisp或ML或Haskell),一种支持语法抽象(如Lisp),一种支持声明性规范(如Prolog或C模板),以及一种强调并行性的语言(如Clojure或Go)。
记住有一个“计算机在“计算机科学”。知道您的计算机执行一条指令、从内存中获取一个字(有或没有缓存未命中)、从磁盘读取连续的字以及在磁盘上寻找新位置所需的时间。(答案在这里)
学习一门语言标准化努力。它可以是ANSI C委员会,也可以是决定您的本地编码风格是否有2或4个空格缩进级别。无论哪种方式,你都能了解到其他人喜欢哪种语言,他们的感受有多深,甚至可能了解他们为什么这么想。
有理智下车语言标准化工作尽快进行。
这本书对你有什么疑问。在我第一个孩子出生之前,我读了怎么做书,还是觉得自己是个无知的新手。30个月后,当我的第二个孩子出生的时候,我有没有为了更新鲜的东西而回去读书?没有。相反,我依靠的是我的个人经验,这比专家写的几千页对我更有用,更让我安心。
弗雷德·布鲁克斯,在他的文章里没有银弹确定了寻找优秀软件设计师的三部分计划:
尽早系统地确定顶尖设计师。
指派一位职业导师负责潜在客户的发展,并认真保存职业档案。
为成长中的设计师提供互动和激励的机会。
这是假设有些人已经具备了成为一个伟大的设计师所必需的素质;工作就是适当地说服他们。丙泊酚更简洁地说:“每个人都可以被教导去雕塑:米开朗基罗本应该被教导如何不去雕塑。伟大的程序员也是如此。佩利斯说,伟大的球员有一些超越训练的内在品质。但质量从何而来?是天生的吗?或者他们是通过智力发展出来的?就像奥古斯特·古斯特(奥古斯特·古斯托)腊肠)“任何人都会做饭,但只有无畏的人才是伟大的。”我认为这更像是愿意把自己一生的大部分时间投入到深思熟虑的实践中。但也许吧无所畏惧是一种总结。正如古斯特所说:“不管是谁,也不是每个人都可以成为伟大的批评家。”
所以去买那本Java/Ruby/Javascript/PHP书吧;你可能会从中得到一些有用的东西。但你不会在24小时或21天内改变你的生活,也不会改变你作为一个程序员真正的整体专业知识。在24个月内努力工作以持续改进怎么样?好吧,现在你开始有所进展了。。。
工具书类
布鲁姆,本杰明(编辑)培养青年人才,百龄坛,1985年。
布鲁克斯,弗雷德,没有银弹,IEEE计算机,第20卷,第4期,1987年,第10-19页。
《语言习得的层次结构:语言习得研究》。心理学评论1899年8月345-375年
海斯,约翰·R。,完成问题解决者劳伦斯·厄尔鲍姆,1989年。
威廉·G·蔡斯和赫伯特·A·西蒙。“象棋中的知觉”认知心理学1973年4月55-81日。
拉维,珍,实践中的认知:日常生活中的思维、数学与文化,剑桥大学出版社,1988年。
答案典型PC上各种操作的大致时间:
执行典型指令1/1,000,000,000 sec = 1 nanosec
从一级缓存内存提取0.5纳秒
分支误预测5纳秒
从二级缓存内存提取7毫微秒
互斥锁/解锁25毫微秒
从主存取出100毫微秒
通过1Gbps网络发送2K字节20000毫微秒
从内存中按顺序读取1MB纳秒250000
从新磁盘位置获取(seek)8000000纳秒
从1MB磁盘顺序读取20000000纳秒
把包裹寄到欧洲再寄回来150 milliseconds = 150,000,000 nanosec
语言选择:附录
有几个人问他们应该先学什么编程语言。没有一个答案,但请考虑以下几点:
利用你的朋友. 当被问到“我应该使用什么操作系统,Windows、Unix还是Mac?”,我的回答通常是:“使用你朋友使用的任何东西。”从朋友那里学习所获得的好处将抵消操作系统之间或编程语言之间的任何内在差异。还要考虑你未来的朋友:如果你继续下去,你将成为程序员社区的一部分。你所选择的语言是有一个正在成长的大社区还是一个正在消亡的小社区?有没有书籍、网站和在线论坛可以得到答案?你喜欢那些论坛里的人吗?
保持简单. 像C和Java这样的编程语言都是为专业开发而设计的,他们都是由大量经验丰富的程序员团队设计的,他们关心的是代码的运行时效率。因此,这些语言有一些复杂的部分是为这些环境设计的。你关心的是如何学习编程。你不需要复杂的语言,你需要的是一个新程序员设计的易于学习和记忆的语言。
玩吧你更愿意用哪种方式来学习弹钢琴:一种正常的、互动的方式,即你一按一个键就听到每一个音符,或是“批处理”模式,即只在你完成一整首歌之后才听到音符?显然,交互模式使学习钢琴和编程更容易。坚持一种具有互动模式的语言并加以运用。
考虑到这些标准,我对第一种编程语言的建议是蟒蛇或方案. 另一个选择是Javascript,这并不是因为它非常适合初学者,而是因为有很多关于它的在线教程,比如可汗学院教程。但你的情况可能会有所不同,还有其他好的选择。如果你的年龄是个位数,你可能更喜欢爱丽丝或吱吱声或块状(年长的学习者可能也喜欢这些)。重要的是你选择并开始。
附录:书籍和其他资源
有几个人问他们应该从哪些书籍和网页上学习。我重申“光靠书本学习是不够的”,但我可以推荐以下几点:
方案:计算机程序的结构和解释(Abelson&Sussman)它无疑是计算机科学的最好的入门课程,它把编程作为理解计算机科学的一种方式。你可以看到讲座在线视频在这本书上,以及在线全文. 这本书很有挑战性,它将淘汰一些也许可以用另一种方法成功的人。
方案:如何设计程序(Felleisen等等)是一本关于如何以优雅而实用的方式设计程序的最好的书之一。
蟒蛇:Python编程:CS简介(Zelle)是使用Python的一个很好的介绍。
蟒蛇:几条线教程可在Python.org网站.
奥兹:计算机程序设计的概念、技术和模型(范罗伊和哈里迪)is seen by some as the modern-day successor to Abelson & Sussman.It is a tour through the big ideas of programming, covering a widerrange than Abelson & Sussman while being perhaps easier to read andfollow. It uses a language, Oz, that is not widely known but serves asa basis for learning other languages.<
笔记
T、 卡佩指出完成问题解决者现在在亚马逊的“学习你自己的语法”这一页上,你也可以教你自己的“21天”的书籍。我想大部分看这本书的人都是从这一页来的。多亏了罗斯·科恩对希波克拉底的帮助。
翻译