十年内自学编程

彼得·诺维格

为什么大家都这么着急?

走进任何一家书店,你会看到如何教自己爪哇在24小时内与无尽的变化提供教C,SQL,红宝石,算法,等等在几天或几个小时。亚马逊高级搜索 [标题: 教, 你自己, 小时, 因为: 2000年, 并发现了 512 本这样的书。在前十名中,有九本是编程书籍(另一本是关于簿记的)。类似的结果来自用"学习"或"小时"代替"天"来代替"自学"。

结论是,要么人们急于学习编程,要么编程比什么都容易学。费利森等人在他们的书《如何设计程序》中对这种趋势给予了点头,他们说"糟糕的编程很容易。白痴可以在21天内学会它,即使他们是假人。阿布特鲁斯鹅漫画也有他们采取

让我们来分析一个标题,如教自己C++在24小时内可能意味着什么:

自学:在 24 小时内,您将没有时间编写几个重要的程序,并从他们的成功和失败中吸取教训。您将没有时间与经验丰富的程序员一起工作,并了解生活在C++环境中的感觉。简言之,你没有时间学到很多东西。所以这本书只能讲表面的熟悉,不能说深刻的理解。正如亚历山大·波普所说,一点点学习是一件危险的事情。

C++:在24小时内,你也许能够学习一些C++的语法(如果你已经知道另一种语言),但你不能学到很多如何使用语言。简言之,如果你是一个基础程序员,你可以学会用C++语法编写基础程序,但是你无法了解C++实际上是好的(和坏的)。那有什么意义呢?艾伦·佩利斯曾经说过:"一种不影响你思考编程方式的语言,不值得知道"。一个可能的点是,你必须学习一点点C++(或更可能,像JavaScript或处理的东西),因为你需要与现有的工具接口,以完成一个特定的任务。但是,你并没有学习如何编程:你正在学习完成那项任务

在24小时内:不幸的是,24小时不够的,如下一节所示。

十年内自学编程

研究人员(布鲁姆(1985年),布莱恩和哈特(1899年),海耶斯(1989年),西蒙和蔡斯(1973年)已经表明,它需要大约十年的时间,以发展任何广泛的领域的专业知识,包括国际象棋演奏,音乐创作,电报操作,绘画,钢琴演奏,游泳,网球,神经心理学和拓扑学的研究。关键是深思熟虑的实践:不只是一次又一次地做,而是挑战自己,任务超出了你目前的能力,尝试它,分析你的表现,而做和做后,并纠正任何错误。然后重复。再重复一遍似乎没有真正的捷径:即使是莫扎特,谁是音乐神童在4岁,花了13年多之前,他开始生产世界级的音乐。在另一种类型中,披头士乐队似乎以一连串的#1热门歌曲和1964年埃德·沙利文的演出而轰动一时。但是他们从1957年开始在利物浦和汉堡打小俱乐部,虽然他们很早就有大众的吸引力,但他们的第一次重大成功,佩珀斯中士,在1967年被释放。

马尔科姆·格拉德威尔已经推广了这个想法,尽管他专注于10,000小时,而不是10年。亨利·卡地亚-布雷松(1908-2004)有另一个指标:"你的前10,000张照片是你最差的。(他没想到,有了数码相机,有些人可以在一周内达到这个目标。真正的专业知识可能需要一生的时间:塞缪尔·约翰逊(1709-1784)说:"任何部门的卓越只能靠一生的劳动才能实现:它不是以较低的价格购买的。乔瑟 (1340 - 1400) 抱怨道: "lyf 这么短, 工艺这么久, 以勒恩。希波克拉底(约公元前400年)以摘录"阿尔斯龙加,维塔布雷维斯"而闻名,这是较长的引文"阿尔斯朗加,维塔布雷维斯,奥卡西奥普拉塞普斯,实验性皮质,硫化物难"的一部分,这在英语中呈现为"生命短暂,[工艺长,机会转瞬即逝,实验背信弃义,判断困难"。 当然,没有一个数字可以成为最终答案:假设所有技能(例如编程、下棋、跳棋和音乐演奏)都需要完全相同的时间来掌握,而且所有人都需要完全相同的时间,这似乎并不合理。正如安德斯·爱立信教授所说,"在大多数领域,即使是最有才华的个人也需要多少时间才能达到最高水平,这很了不起。10,000小时的数字只是让你感觉,我们谈论的年份是每周10到20小时,有些人会争辩说,那些天生最有才华的人仍然需要达到最高水平。

所以你想成为一名程序员

以下是我编程成功的秘诀:

对编程感兴趣,并做一些,因为它很有趣。确保它保持足够的乐趣,这样你就会愿意把你的10年/10,000小时。

程序。最好的学习是通过做来学习。更严格地说,"特定领域个人的最高绩效水平不会自动作为扩展经验的函数来实现,但即使经验丰富的个人出于深思熟虑的改进努力,性能水平也会提高。(第366页)和"最有效的学习需要一项定义明确的任务,为特定个人提供适当的难度水平、翔实的反馈以及重复和纠正错误的机会。(第20-21页)《实践中的认知:日常生活中的思维、数学和文化》一书是这一观点的有趣参考。

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

如果你愿意,在大学学习四年(或在研究生院多)。这将使你有机会获得一些需要证书的工作,它会给你一个更深入的了解领域,但如果你不喜欢学校,你可以(与一些奉献精神)获得类似的经验,你自己或在工作。无论如何,光靠读书是不够的。《新黑客词典》的作者埃里克·雷蒙德(Eric Raymond)说:"计算机科学教育不能使任何人成为专家程序员,而学习画笔和颜料可以使某人成为专家画家。我聘请过的最好的程序员之一只有高中学位:他生产了很多伟大的软件,有自己的新闻集团,并做了足够的股票期权购买自己的夜总会

与其他程序员一起从事项目。成为某些项目的最佳程序员:是其他一些人最糟糕的。当你是最好的,你可以测试你的能力,领导一个项目,并激励别人与你的远见。当你是最坏的,你了解主人做什么,你学习他们不喜欢做什么(因为他们让你为他们做)。

在其他程序员之后进行项目工作。了解其他人编写的程序。当原始程序员不在时,查看需要什么来理解和修复它。考虑如何设计您的程序,使那些谁将维护他们后,你更容易。

学习至少六种编程语言。包括一种强调类抽象(如Java或C++)的语言,一种强调功能抽象(如Lisp或ML或哈斯克尔)的语言,一种支持语法抽象(如Lisp)的语言,一种支持声明性规范(如Prolog或C++模板)的语言,以及一种强调并行性(如 Clojure 或 Go)的语言。

请记住,在"计算机科学"中有一个"计算机"。了解计算机执行指令需要多长时间,从内存中获取一个单词(有和没有缓存遗漏),从磁盘中连续读取单词,并寻求磁盘上的新位置。(答案如下。)

参与语言标准化工作。它可能是 ANSI C++委员会,也可能决定您的本地编码样式是否具有 2 或 4 个空间凹痕级别。无论哪种方式,你了解其他人喜欢什么语言,他们有多深的感觉,甚至一点点,为什么他们觉得如此。

有良好的意识尽快摆脱语言标准化的努力。

考虑到这一切, 仅仅通过读书就能走多远是值得怀疑的。在我第一个孩子出生之前,我读了所有的《如何读书》,仍然觉得自己是个无知的新手。30个月后,当我的第二个孩子到期时,我是否回到书本上复习一下?不。相反,我依靠我的个人经验,事实证明,这与专家撰写的数千页相比,对我更有用和更让人放心。

弗雷德布鲁克斯,在他的文章没有银弹确定了一个三部分的计划,寻找伟大的软件设计师:

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

指派职业导师负责前景的发展,并仔细保存职业档案。

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

这假定有些人已经具备了成为伟大设计师所必需的素质:工作是适当地哄骗他们。艾伦·佩利斯说得更简洁:"每个人都可以被教导要雕刻:米开朗基罗将不得不被教导如何不雕刻。因此,这是与伟大的程序员"。佩利斯说,伟人有一些超越他们训练的内在品质。但是质量从何而来呢?是与生俱来的吗?还是他们通过勤奋发展?正如奥古斯特·古斯托(拉塔图耶虚构的厨师)所说,"任何人都会做饭,但只有无畏的人才能伟大。我更愿意把一生的很大一部分时间用于审议实践。但也许无所畏惧是总结这一点的一种方式。或者,正如古斯托的评论家安东·埃戈所说:"不是每个人都能成为一个伟大的艺术家,但一个伟大的艺术家可以来自任何地方。

因此,继续购买那本爪哇/鲁比/贾瓦脚本/PHP书;你可能会得到一些使用它。但你不会改变你的生活,或你真正的整体专业知识作为一个程序员在24小时或21天。努力工作,在24个月内不断改进怎么样?现在你开始找个地方了。。。

引用

布鲁姆,本杰明(ed.)在年轻人中培养人才,巴兰廷,1985年。

布鲁克斯,弗雷德,没有银弹,IEEE电脑,第20卷,第4卷,1987年,第10-19页。

布莱恩, W. l. 和哈特, N. "关于电报语言的研究: 习性等级的习性。心理学评论, 1899, 8, 345-375

海耶斯,约翰R.,完全问题解决者劳伦斯埃尔鲍姆,1989年。

蔡斯,威廉·格和西蒙,赫伯特A。《国际象棋中的感知》认知心理学,1973年,4,55-81。

拉夫,让,实践认知:日常生活中的思想、数学和文化,剑桥大学出版社,1988年。

答案典型 PC 上各种操作的大致时间:

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

从L1缓存内存提取0.5 纳米秒

分支误判5纳米秒

从L2缓存内存提取7纳米秒

穆特克斯锁/解锁25纳米秒

从主内存提取100纳米秒

通过1Gbps网络发送2K字节20,000 纳秒

从内存中按顺序读取1MB250,000 纳秒

从新磁盘位置提取(查找)8,000,000 纳秒

从磁盘中按顺序读取1MB20,000,000 纳秒

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

附录:语言选择

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

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

保持简单。C++和 Java 等编程语言由大量经验丰富的程序员团队设计,他们关注其代码的运行时间效率。因此,这些语言具有针对这些情况设计的复杂部分。你关心的是学习编程。你不需要这种并发症。您想要一种由单个新程序员设计为易于学习和记忆的语言。

玩吧你宁愿学习哪种方式弹钢琴:正常,互动的方式,你听到每一个音符,只要你击中一个键,或"批量"模式,其中你只听到音符后,你完成一整首歌?显然,交互式模式使钢琴学习更加容易,编程也更加容易。坚持使用交互式模式的语言并使用它。

鉴于这些标准,我建议的第一种编程语言将是Python计划。另一个选择是Javascript,不是因为它是完全精心设计的初学者,而是因为有这么多的在线教程,如汗学院的教程。但你的情况可能会有所不同,还有其他不错的选择。如果你的年龄是一位数,你可能会喜欢爱丽丝吱吱声状(年长的学习者可能也喜欢这些)。重要的是你选择和开始。

附录:书籍和其他资源

有几个人问他们应该学习什么书和网页。我重复一遍,"单靠读书是不够的",但我可以推荐以下几点:

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

方案:如何设计程序(费莱森等人是有关如何以优雅和实用的方式实际设计程序的最佳书籍之一。

Python: Python 编程: Cs (Zelle) 的介绍是使用 Python 的一个很好的介绍。

蟒蛇:几个在线教程可在Python.org。

奥兹: 计算机编程的概念、技术和模型 (范罗伊和哈里迪)被一些人视为阿贝尔森和苏斯曼的现代接班人。这是一次通过编程的大想法之旅, 涵盖的范围比阿贝尔森和苏斯曼更广泛, 同时也许更容易阅读和关注。它使用的语言,奥兹,这是不广为人知的,但作为学习其他语言的基础。和:

笔记

T. Capey指出,亚马逊上的"完全问题解决者"页面现在有"在21天内自学孟加拉语"和"自学语法和风格"的书籍,下面是"购买此商品的客户也购买这些物品"部分。我想看那本书的人很大一部分来自这个页面。感谢罗斯 · 科恩对希波克拉底的帮助。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容