十年自学编程
彼得·诺维格
为什么大家都这么着急?
走进任何一家书店,你就会知道怎么做24小时自学Java除了提供无休止的变化之外,还提供在几天或几小时内教授C、 SQL、Ruby、算法等。亚马逊高级搜索[标题:自学,自2000年起,小时数找到了512本这样的书。其他十本书中,编程类书籍占上风。类似的结果来自于用“学习”代替“自学”,或者用“天”代替“小时”
结论是,要么人们急于学习编程,要么编程比其他任何东西都容易得多。费莱森等等。在他们的书中对这种趋势表示赞同如何设计程序,当他们说“糟糕的编程很容易。白痴可以在21天即使他们是假人“《阿不勒斯鹅》漫画也有他们的看法.
我们来分析一下标题是什么样的24小时自学C++可能意味着:
自学:在24小时内,你将没有时间编写几个重要的程序,并从成功和失败中吸取教训。你没有时间和有经验的程序员一起工作,也没有时间去理解生活在C++环境中的感觉。简而言之,你没有时间去学习。所以这本书只能说是肤浅的熟悉,而不是深刻的理解。正如亚历山大·波普所说:“一点点学习是一件危险的事。
C++:在24小时内,你也许能学会一些C++的语法(如果你已经知道另一种语言的话),但是你不能学到很多关于如何使用这种语言的知识。如果你用C++编写的程序很糟糕,你可以说用C++编写的程序很糟糕。那么有什么意义呢?阿兰 珀利斯曾经说过:“一种不影响你思考编程方式的语言是不值得知道的”。一个可能的观点是,你必须学习一点C++(或者更可能的是,像JavaScript或处理之类的东西),因为你需要与现有的工具交互来完成特定的任务。但你并不是在学习如何编程,而是在学习如何完成这项任务。
24小时内:不幸的是,这是不够的,正如下一节所示。
十年自学编程
研究人员(布鲁姆(1985),哈提恩和布莱恩(1899),海耶斯(1989),西蒙蔡斯(1973))研究表明,要培养出各种领域的专业知识需要大约十年的时间,包括国际象棋、音乐创作、电报操作、绘画、钢琴演奏、游泳、网球以及神经心理学和拓扑学的研究。关键是深思熟虑的练习:不只是一次又一次地做,而是挑战你自己——用一个超出你目前能力的任务,去尝试它,在做的时候和之后分析你的表现,纠正任何错误。然后重复。再重复一遍。似乎没有真正的捷径:即使是4岁时音乐天才的莫扎特,也花了13年的时间才开始创作世界级的音乐。在另一种类型中,披头士乐队似乎以一串一串的热门歌曲和1964年的埃德·沙利文秀(Ed Sullivan show)亮相而登场,但他们从1957年开始就在利物浦和汉堡打小型俱乐部,虽然他们很早就有了大众的吸引力,但他们的第一次重大成功,辣椒中士,于1967年被释放。
马尔科姆•格拉德威尔他还没想到10年前卡地亚用数码相机拍了10万张照片,真正的专业知识可能需要一辈子的时间:塞缪尔·约翰逊(Samuel Johnson,1709-1784)曾说:“任何部门的卓越都只能通过一生的努力才能达到,而不是以更低的价格买到的。”乔叟(1340-1400)抱怨道:“lyf太短了,利恩的手艺很长。”希波克拉底(约公元前400年)因节选“ars longa, vita brevis”而闻名,这是较长的引语“ars longa,vita brevis,occasio preceps,experitum periculosum,iudicium difficile”,在英语中的意思是“生命短暂,[这]工艺漫长,机会转瞬即逝,实验危险,判断困难。”当然,没有一个数字可以作为最终答案:假设所有技能(例如编程、下棋、下棋和玩音乐)都需要完全相同的时间来掌握,也不认为所有人都需要完全相同的时间来掌握。作为 教授。K、 安德斯·爱立信他说:“在大多数领域,即使是最有才华的人也需要多少时间才能达到最高水平的绩效,这一点是值得注意的。1万小时的数字让你感觉到,我们说的是一周10到20个小时的工作时间,有些人会说,那些天生最有才华的人,仍然需要达到最高水平。”
所以你想成为一名程序员
以下是我编程成功的秘诀:
得到感兴趣的在编程方面,做一些因为它很有趣。一定要保持足够的乐趣,这样你才会愿意投入10年/10000小时。
程序. 最好的学习方式是在实践中学习. 从技术上讲,“个人在某一领域的最高水平的绩效并不是随着经验的增长而自动达到的,但即使是经验丰富的个人,也可以通过深思熟虑的努力来提高绩效水平。”(第366页)“最有效的学习需要一个明确的任务,对特定的个体有适当的难度水平,信息反馈,以及重复和纠正错误的机会”(第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页。
Bryan,W.L.&Harter,N.,《电报语言研究:习惯等级的习得》。心理学评论,1899年8月345-375
海斯,约翰·R。,完成问题解决者劳伦斯·厄尔鲍姆,1989年。
威廉·G·蔡斯和赫伯特·A·西蒙。“象棋中的知觉” 认知心理学1973年4月55-81日。
拉维,珍,实践中的认知:日常生活中的思维、数学、文化,剑桥大学出版社,1988年。
答案典型PC上各种操作的大致时间:
执行典型指令1/1000000000秒=1纳秒
从一级缓存内存提取0.5纳秒
分支误预测5纳秒
从二级缓存内存提取7毫微秒
互斥锁/解锁25毫微秒
从主存取出100毫微秒
通过1Gbps网络发送2K字节20000毫微秒
从内存中按顺序读取1MB250000毫微秒
从新磁盘位置获取(seek)8000000纳秒
从磁盘按顺序读取1MB20000000纳秒
把包裹寄到欧洲再寄回来150毫秒=150000000纳秒
附录:语言选择
有几个人问他们应该先学什么编程语言。 没有一个答案,但请考虑以下几点:
利用你的朋友. 问我应该用什么操作系统,我的回答通常是:“使用你朋友使用的任何东西。”从朋友那里学习所获得的好处将抵消操作系统之间或编程语言之间的任何内在差异。同时考虑你未来的朋友:如果你继续下去,你将成为程序员社区的一部分。你所选择的语言是有一个正在成长的大社区,还是一个正在消亡的小社区?是否有书籍、网站和在线论坛可以获得答案?你喜欢那些论坛里的人吗?
保持简单. C++和Java这样的编程语言是为专业开发而设计的,他们都是由经验丰富的程序员组成的,他们关心自己代码的运行时效率。因此,这些语言都有针对这些情况而设计的复杂部分。您关心的是如何学习编程。你不需要这种复杂的语言,你需要的是一种简单易学、易于记忆的语言。
玩吧。你更愿意用哪种方式学习弹钢琴:一种普通的、互动的方式,即你一按一个键就听到每一个音符,或者“批处理”模式,在这种模式下,你只在完成一整首歌之后才听到音符?很明显,交互式模式使钢琴学习和编程更容易。坚持一种具有互动模式的语言并加以运用。
考虑到这些标准,我对第一种编程语言的建议是蟒蛇或方案. 另一个选择是Javascript,这并不是因为它非常适合初学者,而是因为它有很多在线教程,比如可汗学院教程但是你的情况可能会有所不同,还有其他好的选择。如果你的年龄是个位数,你可能更喜欢爱丽丝或吱吱声或块状(年长的学习者可能也喜欢这些)。重要的是你选择并开始行动。
附录:书籍和其他资源
有几个人问他们应该从什么书和网页中学到什么。我重申“光靠书本学习是不够的”,但我可以推荐以下几点:
方案: 计算机程序的结构和解释(Abelson&Sussman)可能是最好的计算机科学入门课程,而且它确实把编程作为理解计算机科学的一种方式。你可以看到讲座在线视频在这本书上,以及在线全文. 这本书具有挑战性,它将淘汰一些可能通过另一种方法获得成功的人。
方案: 如何设计程序(Felleisen等等。)是最好的书籍之一 如何实际设计一个优雅和功能性的程序。
蟒蛇: Python编程:CS简介(Zelle)是使用Python的一个很好的介绍。
蟒蛇:几个 在线教程可在Python.org网站.
奥兹: 计算机程序设计的概念、技术和模型(范罗伊和哈里迪)它被一些人看作是现代的Abelson&Sussman的继承者。它是一个关于编程的大思想的旅行,覆盖范围比Abelson&Sussman更广,同时也更易于阅读和理解。它使用一种不为人所知的语言Oz,它是学习其他语言的基础<
笔记
T、 卡佩指出完成 问题解决者亚马逊的页面现在有“21天自学孟加拉语”和“自学语法和风格”两本书,分别位于“购买该产品的客户也购买这些产品”部分。我想大部分看那本书的人都是从这一页来的。多亏了罗斯·科恩对希波克拉底的帮助。