十年内自学编程

为什么每个人都这么着急?


走进任何一家书店,你都会看到如何自学Java24小时内除了提供教授C的无尽变化,几天或几小时内就可以使用SQL、Ruby、算法等。 亚马逊高级搜索 [标题: 教学,你自己,小时,从2000开始发现了512本这样的书。在前十名中,有九本是编程书籍 (另一种是关于簿记的)。类似的结果来自于用 “学习” 代替 “自学” 或 “小时” 代替 “天数”。"


结论是,要么两个人都急于学习关于编程,或者编程在某种程度上非常容易学习比其他任何东西。 Felleisen等。在他们的书中向这一趋势致敬如何设计程序,当他们说“糟糕的编程很容易。 白痴可以学习21天,即使他们是傻瓜.“Abtruse鹅漫画也有他们的看法.


让我们来分析标题是什么样的24小时自学C + +可能意味着:


自学:24小时内你将没有时间写几个重要的项目,并从你的成功和失败中学习他们。你没有时间和一个有经验的程序员一起工作了解生活在C + + 环境中的感觉。简而言之,你没有时间学到很多东西。所以这本书只能谈论肤浅的熟悉,而不是深刻的理解。作为亚历山大·蒲柏说,一点点学习是一件危险的事情。


C + +:在24小时内,你也许可以学习一些语法C ++ (如果您已经懂另一种语言),但是您不能了解更多有关如何使用该语言的知识。简而言之,如果你是,比方说,一个基本程序员,你可以学习以基本使用C + + 语法,但是你不能知道什么是C + +实际上是好的 (和坏的)。那有什么意义呢? 艾伦Perlis曾经说过: “一种不影响你生活方式的语言想想编程,不值得知道 ”。一个可能的点是你必须学习一点点C + + (或者更有可能,一些东西像JavaScript或处理),因为您需要与完成特定任务的现有工具。但那你不是学习如何编程; 你正在学习完成那个任务。


24小时内:不幸的是,这还不够,因为下一个部分显示。


十年自学编程


研究人员 (绽放(1985), 布赖恩和哈特 (1899), 海斯(1989), 西蒙和蔡斯 (1973)) 已显示需要大约十年的时间来发展各种各样的专业知识区域,包括下棋、音乐创作、电报操作、绘画、钢琴演奏、游泳、网球和研究神经心理学和拓扑。关键是协商练习: 不仅仅是一次又一次地做,而是挑战你自己一项超出你目前能力的任务,尝试一下,分析你的表现和之后的表现,并纠正任何错误。然后重复。再重复一遍。似乎没有真正的捷径: 甚至莫扎特,他4岁时是音乐天才,在他开始创作世界级音乐之前的13年多。在另一种类型,甲壳虫乐队似乎以串 #1命中和外观上埃德·沙利文表演1964年。但是从那以后他们一直在利物浦和汉堡玩小型俱乐部1957,虽然他们很早就有了大众的吸引力,但他们的第一个伟大关键的成功中士辣椒,于1967年发行。


马尔科姆格拉德威尔虽然他专注于10,000小时,而不是10年,但他还是推广了这个想法。亨利 · 卡蒂埃 · 布列松 (Henri Cartier-Bresson,1908-2004) 有另一个指标: “您的前10,000张照片是最糟糕的。”(他没有预计有了数码相机,有些人可以在一周内达到这个目标。)真正的专业知识可能需要一生:塞繆爾·約翰遜 (1709-1784) 说 ”卓越任何可只有一生的劳动才能实现; 不购买在价格更低。“乔叟 (1340-1400) 抱怨” lyf如此短,工艺对勒恩来说太好了。”希波克拉底 (c。公元前400年) 以摘录 “ars longa,vita brevis ”,这是较长报价“ Ars longa,vita的一部分短时间,小猪,小猪实验,iudicium,iudicium艰难 ”,在英语中被描述为“ 生命短暂,[工艺]漫长的,机会转瞬即逝,实验危险,判断困难。" 当然,没有一个数字可以成为最终答案: 这似乎不合理假设所有技能 (例如g.、编程、下棋、跳棋和音乐演奏)可能需要完全相同的时间来掌握,也不需要所有人将花费完全相同的时间。作为教授 K.安德斯爱立信这样说,“在大多数领域,即使是最长的时间有才华的个人需要达到最高水平的绩效。10,000小时的数字只是给您一种感觉,我们谈论的是每周10到20个小时的年份,有些人会认为他们是天生最有才华的人,仍然需要达到最高水平。"


所以你想成为一名程序员


这是我编程成功的秘诀:


得到兴趣在编程方面,做一些,因为它很有趣。确保它一直保持足够的乐趣,因此您愿意投入十年/10,000小时。


程序.最好的学习方式是学习通过做.更严格地说,“最大水平在给定领域的个人绩效没有达到自动作为扩展经验的函数,但水平即使是经验丰富的个人也可以提高绩效深思熟虑努力改进的结果。" (第366)“最有效的学习需要一个定义明确的任务适合特定个体的难度等级,信息反馈,以及重复和纠正的机会错误。”(第20-21) 这本书 实践中的认知: 日常思维、数学和文化生活是一个有趣的此观点的参考。


与其他程序员; 阅读其他程序。这更重要比任何书籍或培训课程都多。


如果你愿意,在一个大学(或更多研究生院)。这将使您能够访问一些需要的工作凭证,它会让你对这个领域有更深入的了解,但是如果你不喜欢学校,你可以 (有一些奉献精神) 得到你自己或工作中有类似的经历。无论如何,单靠书本学习是不会的够了。“计算机科学教育不能让任何人成为专家程序员除了研究刷子和颜料之外“一个专业画家” 埃里克 · 雷蒙德说,他新的黑客词典.我雇佣过的最好的程序员之一只有高中学位; 他制作了很多伟大 软件,有自己的新闻组,并有足够的股票期权来购买他自己的夜总会.


继续工作项目其他程序员。成为最好的程序员一些项目; 对其他人来说是最糟糕的。当你是最好的时候,你可以测试你领导一个项目的能力,并激励其他有你的愿景。当你最糟糕的时候,你会知道大师会这样做,你会学到他们不喜欢做什么 (因为他们让你为他们做这件事)。


继续工作项目后其他程序员。理解别人写的程序。看看需要什么理解和修复时原装程序员不周围。想想如何设计你的程序,让它更容易那些会在你之后维护它们的人。


至少学习六个编程语言.包括一个强调类抽象的语言 (如Java或C + +),一种强调功能抽象 (如Lisp或ML或Haskell),一个支持语法抽象 (如Lisp),一个支持声明性规范 (如Prolog或C + +模板),以及强调排比的方法 (如clojuror或Go)。


记住有一个“电脑”在“ 计算机科学 ”中。知道您的计算机执行一条指令需要多长时间,获取一条来自内存中的word (有或没有缓存丢失),从磁盘读取连续的单词,并查找到磁盘上的新位置。 (这里有答案。)


参与语言标准化努力。它可以是ANSI C + + 委员会,也可以可能决定你的本地编码风格是有2还是4个空间压痕级别。不管怎样,你会了解其他人是什么就像在一种语言中,他们有多深,甚至可能有一点关于他们为什么会有这种感觉。


有良好的判断力下车语言标准化工作尽快。


考虑到所有这些,你能走多远是有问题的书本学习。在我的第一个孩子出生之前,我读了所有如何转书,仍然觉得自己是个无知的新手。30个月后,当我的第二个孩子到期时,我有没有回到书上复习?编号相反,我依靠我的个人经历结果证明它更加有用和令人放心对我来说,比写了几千页由专家提供。


佛瑞德·布鲁克斯,文章没有银弹 确定了一个由三部分组成的计划来寻找伟大的软件设计师:


尽早系统地识别顶级设计师。


指派一名职业导师负责潜在客户的发展,并仔细保存一份职业档案。


为成长中的设计师提供相互交流和刺激的机会。


这假设有些人已经具备必要的素质成为一名伟大的设计师; 工作是恰当地哄骗他们。 艾伦Perlis更简洁地说: “每个人都可以被教导雕刻:米开朗基罗将不得不教导如何不。所以它与伟大的程序员 ”。佩里斯说大人物有一些超越他们训练的内部素质。但哪里质量来自?这是天生的吗?或者他们通过勤奋?奥古斯特 · 古斯特 (虚构的厨师料理鼠王) 说,“任何人都可以做饭,但只有无所畏惧可以很棒。“我认为它更像是愿意投入大量一个人生命的一部分到协商实践。但是也许无畏是总结这一点的一种方式。或者,作为古斯特的批评家,安东 · 艾格说: “不是每个人都能成为一个伟大的艺术家,而是一个伟大的艺术家可以来自任何地方。"


所以去买那本Java/Ruby/Javascript/PHP书吧; 你会可能会从中得到一些利用。但是你不会改变你的生活,或者作为一名程序员,你在24小时或21天内真正的整体专业知识。努力工作在24个月内不断提高怎么样?现在你开始有所作为了……


引用


本杰明 · 布鲁姆 (编辑。) 培养年轻人的人才,百龄坛,1985。


布鲁克斯,弗瑞德,没有银色子弹,IEEE计算机,卷20号4,198710-19.


布赖恩,W。长度& 哈特,北“电报语言研究:习惯层次结构的获得。 心理学评论,1899 345-375


约翰 · 海斯, 完整的问题解决者劳伦斯 · 厄尔鲍姆,1989。


威廉 · G · 蔡斯& 西蒙,赫伯特 “国际象棋中的感知” 认知心理学,1973-81。


莱夫,吉恩,实践中的认知: 日常思维、数学和文化生活,剑桥大学出版社,1988。


答案


典型电脑上各种操作的近似计时:


执行典型指令 1/1,000,000,000秒 = 1纳米


从L1缓存存储器中获取 0。5纳秒


分支错误预测 5纳秒


从L2缓存存储器中获取 7纳秒


互斥锁/解锁 25纳秒


从主内存中获取 100纳秒


通过1gbps网络发送2k字节 20,000纳秒


从内存中依次读取1mb 250,000纳秒


从新磁盘位置获取 (搜索) 8,000,000纳秒


从磁盘顺序读取1mb 20,000,000纳秒


将数据包发送给欧洲并返回 150毫秒 = 150,000,000纳米


附录: 语言选择


一些人问他们应该先学习什么编程语言。没有一个答案,但是考虑以下几点:


使用你的朋友.当被问及 “什么操作系统应该我使用Windows、Unix或Mac?”,我的回答通常是:“ 使用任何东西你的朋友用。“你从学习中获得的优势朋友将抵消操作系统之间的任何内在差异,或者在编程语言之间。也考虑你未来的朋友:社区程序员,你将一部分如果你继续。你选择的语言是否有一个庞大的成长社区还是一个垂死的小家伙?有书籍、网站和在线论坛吗从那里得到答案?你喜欢那些论坛里的人吗?


保持简单.编程语言,如C + +Java是为大型团队的专业发展而设计的经验丰富的程序员关心运行时效率他们的代码。因此,这些语言有针对这些情况设计的复杂部分。你关心的是学习编程。你不需要那种复杂的东西。你想要一种设计成易于学习和记住的语言单个新程序员。


玩吧。你更喜欢用哪种方式学习弹钢琴:正常的互动方式,你一按下一个键就能听到每个音符,或者 “批处理” 模式,在这种模式下,你只在完成整首歌后才能听到音符?显然,互动模式让钢琴和编程。坚持使用具有交互模式的语言并使用它。


鉴于这些标准,我对第一次编程的建议语言应该是Python或方案. 另一个选择是Javascript,不是因为它是为初学者精心设计的,但是因为有太多的在线教程,比如可汗学院教程.但是你的情况可能会有所不同,还有其他好的选择。如果你的年龄是一位数,你可能更喜欢爱丽丝或吱吱声 或Blockly(年长的学习者可能也会喜欢这些)。重要的问题是你选择并开始。


附录: 书籍和其他资源


一些人问他们应该学什么书和网页从。我重复一遍,“单靠书本学习是不够的”,但我可以推荐以下内容:


方案: 结构和计算机程序的解释 (阿贝尔森和苏斯曼)是可能是计算机科学的最佳介绍,它确实教授编程作为理解计算机科学的一种方式。 你可以看到讲座在线视频在这本书上,以及在线全文.这本书是具有挑战性,并将淘汰一些可能通过另一种方法取得成功。


方案: 如何设计程序 (费勒森等。)是最好的书之一如何以优雅和实用的方式实际设计程序。


【十年内自学编程】蟒蛇: Python编程:CS (Zelle) 介绍是使用Python的一

    推荐阅读