十年内自学编程
彼得·诺维格
为什么大家都这么着急?
走进任何一家书店,您将了解如何在 24 小时内自学 Java,同时在几天或几小时内提供无休止的变体来教授 C、SQL、Ruby、算法等。亚马逊高级搜索 [标题: 教, 你自己, 小时, 自: 2000 年以来, 并发现了 512 这样的书。前十名中,有九本是编程书籍(另一本是关于簿记的)。类似的结果来自将"自学"替换为"学习"或"小时"与"天"。
结论是,要么人们急于学习编程,要么编程比什么都容易学。Felleisen等人在《如何设计程序》一书中对这种趋势点头,当时他们说"糟糕的编程很容易。白痴可以在21天内学会,即使他们是假人。阿布特鲁斯鹅漫画也有他们采取。
让我们分析一下 24 小时内"C++"标题可能意味着什么:
教导自己:在24小时内,你将没有时间写几个重要的程序,并学习你的成功和失败与他们。您没有时间与经验丰富的程序员合作,并了解生活在一个良好的环境中C++。总之,你将没有时间学习太多。所以这本书只能说是肤浅的熟悉,不能是深刻的理解。正如亚历山大·波普说的,一点学习是危险的事情。
C++:在24小时内,你也许能够学习C++的一些语法(如果你已经知道另一种语言),但你不能学到很多如何使用的语言。简言之,如果你是一个基本程序员,你可以学会用C++语法编写基本风格的程序,但是你不能学习C++实际上是好(和坏)什么。那有什么意义呢?艾伦·佩利斯曾经说过:"一种不影响你编程方式的语言,不值得了解。一个可能的观点是,你必须学习一点点C++(或者更可能,像JavaScript或处理),因为你需要与现有的工具接口来完成一个特定的任务。但是,你并没有学习如何编程;你正在学习完成那个任务
在24小时:不幸的是,这是不够的,如下一节显示。
十年内自学编程
研究人员(Bloom(1985年)、布莱恩和哈特(1899年)、海耶斯(1989年)、西蒙和蔡斯(1973年))表明,在象棋、音乐创作、电报操作、绘画、钢琴演奏、游泳、网球以及神经心理学和拓扑学研究等许多领域,大约需要10年时间。关键是审议实践:不只是一次又一次地做,而是用一个超出你当前能力的任务来挑战自己,尝试一下,在做之后分析你的表现,并纠正任何错误。然后重复。再重复一遍似乎没有真正的捷径:即使是4岁时音乐神童的莫扎特,也花了13年时间才开始创作世界级的音乐。在另一种类型中,披头士乐队似乎以一连串的#1和1964年埃德·沙利文的时装秀而登上舞台。但是他们自1957年以来一直在利物浦和汉堡打小俱乐部,虽然他们很早就有大众的吸引力,但他们的第一次重大成功,佩珀斯中士,在1967年被释放。
马尔科姆·格拉德威尔已经推广了这个想法,尽管他专注于10,000小时,而不是10年。亨利·卡蒂埃-布雷森(1908-2004)还有另一个指标:"你的前10,000张照片是你们最差的。"(他没想到,使用数码相机,有些人可以在一个星期内达到这个目标。真正的专业知识可能需要一生的时间:塞缪尔·约翰逊(Samuel Johnson,1709-1784)说:"任何部门都只有一生的劳动才能取得卓越成就;它不应该以较低的价格购买。乔瑟 (1340 - 1400) 抱怨道: "莱夫这么短, 工艺这么久, 对勒恩来说。Hippocrates (c. 400BC) 以摘录 "ars longa, vita brevis" 而广为人知, 这是较长语录 "阿尔斯 · 朗加, 维塔 · 布雷维斯, 偶尔练习, 实验腹膜, 胆汁困难" 的一部分, 在英语中渲染为 "生命是短暂的, [the] 工艺长, 机会转瞬即逝, 实验背信弃义, 判断困难" 。当然,没有一个数字可以是最终的答案:似乎不合理地假设所有技能(如编程、棋牌、跳棋和音乐演奏)都需要完全相同的时间来掌握,也不认为所有人都需要完全相同的时间。正如安德斯·爱立信教授所说,"在大多数领域,即使是最有才华的个人也需要多少时间才能达到最高水平,这一点令人瞩目。10,000 小时的数字只是让您感觉到,我们谈论的是每周 10 到 20 小时,有些人会认为这些人是天生的天才人才,仍然需要达到最高水平。
所以你想成为一名程序员
以下是我的编程成功秘诀:
对编程感兴趣,并做一些,因为它很有趣。确保它一直足够有趣,这样你才愿意投入你的十年/10,000小时。
程序。最好的学习就是通过做学习。更技术上说,"给定领域中个人的最高绩效水平不是作为扩展经验的函数自动实现的,但即使经验丰富的个人,由于经过深思熟虑,可以提高绩效水平。罗夫。(第366)和"最有效的学习需要一个明确界定的任务,对于特定的个人,信息丰富的反馈,以及重复和纠正错误的机会,具有适当的难度级别。(第20-21号)《实践认知:日常生活中的思维、数学和文化》一书是这一观点的有趣参考。
与其他程序员交谈;阅读其他程序。这一点比任何书籍或培训课程都重要。
如果你想的话,在一所大学里工作四年(或者多在研究生院)。这将让您访问一些需要证书的工作,并让您更深入地了解该领域,但如果您不喜欢学校,您可以(有一些奉献精神)获得类似的经验,自己或工作。无论如何,单靠书本学习是不够的。《新黑客词典》的作者埃里克·雷蒙德(Eric Raymond)说:"计算机科学教育不能让任何人成为专家程序员,更不能让任何人成为专家程序员,更不能让任何人成为专家画家。我雇佣过的最好的程序员之一只有高中学位;他制作了很多伟大的软件, 有自己的新闻集团, 并做了足够的股票期权, 以购买自己的夜总会。
与其他程序员一起处理项目。成为某些项目的最佳程序员;是其他人最差的。当你是最好的,你可以测试你的能力,领导一个项目,并激励别人与你的远见。当你是最差的时候,你学习主人做什么,你学习他们不喜欢做什么(因为他们让你为他们做)。
在其他程序员之后处理项目。了解其他人编写的程序。看看当原始程序员不在的时候,需要什么来理解和修复它。考虑如何设计程序,使那些在您之后维护程序的人更容易。
学习至少六种编程语言。包括一种强调类抽象的语言(如Java或C++)、一种强调函数抽象的语言(如Lisp或ML或哈斯克尔)、一种支持句法抽象的语言(如Lisp)、一种支持声明性规范(如Prolog或C++模板)的语言,以及一种强调并行性的语言(如Cljure或 Go)。
请记住,"计算机科学"中存在"计算机"。了解计算机执行指令、从内存中获取单词(有和没有缓存错过)、从磁盘读取连续单词以及查找磁盘上的新位置需要多长时间。(答案在这里。
参与语言标准化工作。它可能是 ANSI C++,也可以决定您的本地编码风格是否具有 2 或 4 个空间缩进级别。无论哪种方式,你都了解别人喜欢的语言,他们感觉有多深,甚至一点点关于他们为什么这样的感觉。
有好感,尽快摆脱语言标准化工作。
想到这一切, 你只要通过书本学习能多远, 就值得怀疑了。在我的第一个孩子出生之前,我读了所有的《如何》一书,仍然觉得自己是一个无知的新手。30 个月后, 当我的第二个孩子到期时, 我回到书本上复习一下吗?不。相反,我依靠我个人的经验,事实证明,这比我有用和放心得多,比专家写的数千页。
弗雷德·布鲁克斯在他的论文《没有银弹》中确定了寻找伟大软件设计师的三部分计划:
尽早系统地确定顶级设计师。
指派一位职业导师负责潜在客户的发展,并仔细保存职业档案。
为成长的设计师提供互动和刺激的机会。
这假定有些人已经具备成为伟大设计师所需的素质;工作是正确地哄他们一起。艾伦·佩利斯说得更简洁:"每个人都可以被教导去雕刻:米开朗基罗必须被教导如何不雕刻。因此,这是与伟大的程序员"。佩利斯说,伟大的球员有一些超越他们训练的内部素质。但是质量从何而来呢?是天生的吗?还是他们通过勤奋来发展?正如奥古斯特·古斯托(拉塔图耶虚构的厨师)所说,"任何人都可以做饭,但只有无所畏惧的人才能是伟大的。我认为更多的是愿意把一生中的很大一部分用于审议实践。但也许无所畏惧是总结这一点的一种方式。或者,正如古斯托的批评家安东·埃戈所说:"不是每个人都能成为一个伟大的艺术家,但一个伟大的艺术家可以来自任何地方。
因此,继续购买 Java/Ruby/Javascript/PHP 书籍;你可能会从中得到一些利用。但你不会改变你的生活,或者你作为程序员在24小时或21天内真正的整体专业知识。努力在24个月内不断改进怎么样?现在你开始找个地方了...
引用
布鲁姆,本杰明(Ed.)培养年轻人的人才,巴兰廷,1985年。
布鲁克斯, 弗雷德, 没有银弹, IEEE 电脑, 第 20 卷, 第 4 号, 1987 年, 第 10 - 19 周。
布莱恩, W. l. – 哈特, N. "关于电报语言的研究: 获得习惯的层次。心理学评论, 1899, 8, 345-375
海斯,约翰R.,完全问题解决者劳伦斯·埃鲍姆,1989年。
蔡斯, 威廉 G. & 西蒙, 赫伯特 A. "国际象棋感知" 认知心理学, 1973 年, 4, 55 - 81 。
拉夫,让,实践认知:思维,数学和文化的日常生活,剑桥大学出版社,1988年。
答案
典型 PC 上各种操作的大致计时:
执行典型指令 1/1,000,000,000 秒 = 1 纳米秒从 L1 缓存内存 0。5 nanosec 分网预测错误 5 纳米秒从 L2 缓存存储器 7 nanosecMutex 锁 / 解锁 25 nanosecfetch 从主存储器 100 nanosecsend 2K 字节超过 1Gbps 网络 20,000 nanosecread 1MB 顺序从内存 250,000 从新的磁盘位置 (寻求) 8,000,000 nanosecread 1MB 顺序从磁盘 20,000,000 nanosec 发送数据包美国到欧洲和回 150 毫秒 = 150,000,000 nanosec
附录:语言选择
有几个人问他们应该先学什么编程语言。没有一个答案,但请考虑以下几点:
用你的朋友。当被问及"我应该使用什么操作系统,Windows,Unix,还是Mac?从朋友那里学习的好处将抵消操作系统之间或编程语言之间的任何内在差异。还要考虑你未来的朋友:如果你继续,你将成为其中一员的程序员社区。您选择的语言是有一个庞大的成长社区还是一个垂死的小社区?是否有书籍、网站和在线论坛可以获得答案?你喜欢那些论坛里的人吗?
保持简单。编程语言(C++ 和 Java)是由经验丰富的程序员团队为专业开发而设计的,他们关注代码的运行时效率。因此,这些语言具有专为这些情况设计的复杂部分。你关心的是学习编程。你不需要这种并发症。您想要一种由单个新程序员设计得易于学习和记忆的语言。
玩。你宁愿学习哪种方式弹钢琴:正常的互动方式,你一点击一个键,或"批"模式,你只听到音符后,你完成了一整首歌?显然,交互式模式使钢琴和编程的学习更加容易。坚持使用交互式模式的语言并使用它。
鉴于这些标准,我对第一种编程语言的建议将是Python或S方案。另一个选择是Javascript,不是因为它是为初学者设计得完美的,而是因为有这么多的在线教程,如Khan学院的教程。但是,你的情况可能会有所不同,还有其他不错的选择。如果你的年龄是一位数,你可能更喜欢爱丽丝或吱吱声或块(年龄较大的学习者也可能喜欢这些)。重要的是你选择并开始。
附录:书籍和其他资源
有几个人问他们应该从哪些书籍和网页中学习。我再说一遍, "单靠书学习是不够的", 但我可以推荐以下内容:
方案:计算机程序的结构和解释(Abelson & Sussman)可能是计算机科学的最佳介绍,它教编程作为理解计算机科学的一种方式。您可以在线查看有关本书的讲座视频,以及完整的文本。这本书很有挑战性,将一些人从另一种方法中去掉。
方案:如何设计程序(Felleisen等人)是有关如何以优雅和实用的方式实际设计程序的最佳书籍之一。
Python: Python 编程: 使用 Python 的 Cs 简介 (Zelle) 是一个很好的介绍。
Python:在一些在线教程Python.org。
奥兹: 计算机编程的概念、技术和模型 (范罗伊和哈里迪) 被一些人视为阿贝尔森和苏斯曼的现代接班人。这是一个通过编程的大想法之旅, 涵盖比亚伯森和苏斯曼更广泛的范围, 而也许更容易阅读和遵循。它使用一种语言,Oz,这是不广为人知,但作为学习其他语言的基础。<
笔记
T. Capey指出,亚马逊上的"完全问题解决者"页面现在有"在21天内自学孟加拉语"和"自学语法和风格"的书籍下"为这个项目购物的顾客也为这些物品购物"部分。我猜看那本书的人很多来自这个页面。感谢罗斯·科恩对希波克拉底的帮助