为什么大家都这么着急?
走进任何一家书店,您都会看到如何在24小时内自学Java,以及在几天或几个小时内自学C、SQL、Ruby、算法等各种各样的语言。亚马逊高级搜索[标题:teach, yourself, hours, since: 2000,找到了512本这样的书。在前十本书中,九本是编程书(另一本是关于簿记的)。用“学习”代替“自学”,用“天”代替“小时”,也会得到类似的结果。
结论是,要么人们急于学习编程,要么编程比其他任何东西都要容易得多。Felleisen等人在他们的《如何设计程序》一书中承认了这一趋势,他们说“糟糕的编程很容易。”傻瓜可以在21天内学会它,即使他们是傻瓜。”《Abtruse Goose》漫画也有自己的风格。
让我们来分析一下《24小时自学c++》这款游戏的意义:
自学:在24小时内,你将没有时间写几个重要的程序,并从你的成功和失败中学习。您将没有时间与有经验的程序员一起工作,了解在c++环境中生活是什么样子的。简而言之,你没有时间学太多东西。所以这本书只能谈论肤浅的熟悉,而不是深刻的理解。正如亚历山大·蒲柏所说,一知半解是一件危险的事情。
c++:在24小时内,你可能能够学习一些c++的语法(如果你已经知道另一种语言),但你不可能学到很多关于如何使用这门语言的知识。简而言之,如果你是一个基本的程序员,你可以学习用c++语法编写Basic风格的程序,但是你不能学习c++到底有什么好处(和坏处)。那么重点是什么呢?Alan Perlis曾经说过:“如果一门语言不影响你思考编程的方式,那么它就不值得你去了解。”一个可能的问题是,您必须学习一点c++知识(或者更有可能是JavaScript或Processing之类的知识),因为您需要与现有的工具进行接口,以完成特定的任务。但是你并不是在学习如何编程;你正在学习如何完成这项任务。
24小时:不幸的是,这还不够,如下一节所示。
十年内自学编程
研究人员(布鲁姆(1985),布莱恩和哈特(1899),海斯(1989),西蒙& Chase(1973))显示大约需要十年开发经验的各种领域,包括国际象棋、音乐作曲,电报操作,绘画、弹钢琴、游泳、网球以及神经心理学和拓扑学的研究。关键是深思熟虑的练习:不仅仅是一遍又一遍地做,而是挑战自己,做一个超出你目前能力范围的任务,尝试它,在做的时候和之后分析你的表现,并纠正任何错误。然后重复。并再次重复。似乎没有真正的捷径:即使是4岁的音乐天才莫扎特,也花了13年多的时间才开始创作出世界级的音乐作品。在另一个流派中,甲壳虫乐队似乎以一系列的热门歌曲和1964年在埃德·苏利文秀上亮相而突然走红。但自1957年以来,他们一直在利物浦和汉堡的小俱乐部踢球,虽然他们在早期有广泛的吸引力,但他们的第一个巨大的成功是1967年发行的Sgt. Peppers。
马尔科姆•格拉德威尔(Malcolm Gladwell)推广了这一观点,尽管他专注于1万个小时,而不是10年。亨利·卡蒂埃-布列松(1908-2004)有另一个衡量标准:“你的前一万张照片是你最差的。”(他没有预料到,有了数码相机,有些人能在一周内达到这个水平。)真正的专长可能需要一生的时间:塞缪尔•约翰逊(Samuel Johnson, 1709-1784)曾说过:“任何部门的卓越成就都只能通过一生的努力获得;不能以较低的价格购买。”乔叟(1340-1400)抱怨道:“吕弗河太短,去勒内的船太长。”希波克拉底(约公元前400年)以摘录“ars longa, vita brevis”而闻名,这是较长的引文“ars longa, vita brevis, praeceps, experimentum pericullosum, idirium difficile”的一部分,英文翻译为“生命短暂,工艺漫长,机会稍息,实验不确定,判断困难”。当然,没有一个数字可以最终答案:这似乎不合理假设所有技能(如编程,国际象棋,跳棋,和播放音乐)可能都需要完全相同的时间掌握,也没有,所有的人将完全相同的时间。正如k·安德斯·埃里克森(K. Anders Ericsson)教授所说:“在大多数领域,即使是最有才华的人也需要多少时间才能达到最高水平,这是值得注意的。”1万小时这个数字给你的感觉是我们在说的是每周10到20小时的年数,有些人会认为这些人是最有天赋的人
所以你想成为一名程序员
以下是我的编程成功秘诀:
对编程感兴趣,并做一些因为它很有趣的事情。确保你的工作始终充满乐趣,这样你才愿意为之投入10年或1万个小时。
程序。最好的学习是在实践中学习。更专业地说,“在一个特定领域中,个人的最高表现水平并不是通过积累经验而自动达到的,但即使是经验丰富的个人,也可以通过有意识的努力来提高表现水平。”(第366页)和“最有效的学习需要一个明确定义的任务,对特定的个人有适当的难度水平,信息反馈,以及重复和纠正错误的机会。”(p. 20-21)《实践中的认知:日常生活中的心智、数学和文化》一书为这一观点提供了有趣的参考。
与其他程序员交谈;阅读其他程序。这比任何书籍或培训课程都重要。
如果你愿意,在大学里读四年(或者在研究生院读更多)。这会让你获得一些需要证书的工作,也会让你对这个领域有更深的了解,但如果你不喜欢学校,你可以(通过一些努力)在自己或工作中获得类似的经验。无论如何,光靠书本知识是不够的。《新黑客词典》(The New Hacker’s Dictionary)的作者埃里克•雷蒙德(Eric Raymond)说:“计算机科学教育不能让任何人成为专业程序员,就像学习画笔和颜料不能让人成为专业画家一样。”我曾经雇佣过的最好的程序员之一只有高中学历;他制作了很多很棒的软件,拥有自己的新闻集团,通过股票期权赚的钱足以买下自己的夜总会。
和其他程序员一起做项目。在某些项目中成为最好的程序员;在另一些人身上做最差的。当你是最好的,你可以测试自己领导一个项目的能力,以及用你的愿景激励他人的能力。当你是最糟糕的时候,你会了解大师们做什么,以及他们不喜欢做什么(因为他们让你为他们做这些)。
在其他程序员之后做项目。理解别人写的程序。当最初的程序员不在时,看看如何理解和修复它。考虑如何设计您的程序,使那些在您之后维护它们的人能够更容易地维护它们。
学习至少六种编程语言。包括一种强调类抽象的语言(如Java或c++),一种强调函数抽象的语言(如Lisp或ML或Haskell),一种支持语法抽象的语言(如Lisp),一种支持声明性规范的语言(如Prolog或c++模板),以及一种强调并行性的语言(如Clojure或Go)。
记住,在“计算机科学”中有一个“计算机”。知道你的计算机执行一条指令、从内存中取一个字(有或没有缓存丢失)、从磁盘中读取连续的字以及寻找磁盘上的新位置需要多长时间。(答案)。
参与语言标准化工作。它可以是ANSI c++委员会,或者它可以决定你的本地编码风格是有2个或4个空格缩进级别。无论哪种方式,你都可以了解到其他人在语言中喜欢什么,他们的感受有多深,甚至可能了解一点他们为什么会有这样的感觉。
有良好的判断力,尽快摆脱语言标准化工作。
考虑到所有这些,仅仅通过书本学习你能走多远是值得怀疑的。在我的第一个孩子出生之前,我读了所有的“如何做”的书,仍然觉得自己是个毫无头绪的新手。30个月后,当我的第二个孩子出生的时候,我是否又回到书中复习了一下?不。相反,我依靠的是我的个人经验,这对我来说比专家写的成千上万页要有用得多,也更让我安心。
Fred Brooks在他的文章No Silver Bullet中指出了寻找优秀软件设计师的三部分计划:
尽早系统地确定顶级设计师。
指派一名职业导师,负责发展未来客户,并仔细保存职业档案。
为成长中的设计师提供相互交流和激励的机会。
这是假设有些人已经具备成为优秀设计师的必备素质;要做的就是好好地哄着它们。艾伦·佩利斯(Alan Perlis)说得更简洁:“每个人都可以被教会雕刻,而米开朗基罗(Michelangelo)则必须被教会如何不去雕刻。”伟大的程序员也是如此。”佩利斯说的是,伟人有一些内在的品质超越了他们的训练。但质量从何而来?是天生的吗?还是通过勤奋来发展?就像奥古斯特·古斯特(《料理鼠王》中虚构的厨师)说的那样,“人人都能做菜,但只有无所畏惧的人才能变得伟大。”我认为它更多的是一种愿意把一个人的很大一部分l奉献出来的意愿
所以去买一本Java/Ruby/Javascript/PHP的书吧;你可能会用它的。但在24小时或21天内,你不会改变你的生活,或你真正的程序员专业知识。在过去的24个月里努力工作以不断提高怎么样?现在你开始有进展了…
参考文献
本杰明·布卢姆(编著)《培养年轻人的才能》,百龄坛出版社,1985年版。
布鲁克斯,弗雷德,《没有银弹》,IEEE计算机,第20卷,No。1987年4月,第10-19页。
布莱恩,W.L. &哈特,N.;“电报语言的研究:习惯层次的习得。”《心理学评论》1899年8,345 -375
John R. Hayes,《完全问题解决者Lawrence Erlbaum》,1989年。
蔡斯,威廉G. &西蒙,赫伯特A.。《国际象棋中的知觉》,认知心理学,1973年,4,55 -81。
《实践中的认知:思维、数学和日常生活中的文化》,剑桥大学出版社,1988年。
答案
在典型PC上的各种操作的近似时间:
执行典型指令1/ 1000,000,000秒= 1纳秒
从L1缓存中读取0.5纳秒
分支错误预测5毫微秒
从L2缓存内存中获取7纳秒
互斥锁锁定/解锁25纳秒
从主存中获取100纳秒
通过1Gbps网络发送2K字节,20,000纳秒
从内存中连续读取1MB 25万纳秒
从新磁盘位置(寻址)获取800万纳秒
从磁盘上连续读取1MB 2000万纳秒
将数据包发送到欧洲,然后返回150毫秒= 1.5亿纳秒
附录:语言选择
有几个人问他们应该首先学习哪种编程语言。没有一个答案,但考虑以下几点:
使用你的朋友。当被问到“我应该用什么操作系统,Windows, Unix还是Mac?”,我的回答通常是:“随便你朋友用什么都行。”从朋友那里学习的好处将抵消操作系统或编程语言之间的内在差异。还要考虑你未来的朋友:如果你继续下去,你将成为其中一员的程序员社区。你选择的语言有一个正在成长的大社区还是一个正在消亡的小社区?是否有书籍、网站和在线论坛可以得到答案?你喜欢那些论坛里的人吗?
保持简单。像c++和Java这样的编程语言是专为专业开发而设计的,这些开发团队由经验丰富的程序员组成,他们关心代码的运行时效率。因此,这些语言有针对这些情况而设计的复杂部件。你关心的是学习编程。你不需要那么复杂。你想要一种语言被设计成一个新程序员容易学习和记忆。
玩了。你更愿意用哪种方式来学习弹钢琴:正常的、互动的方式,即你一按下一个键就能听到每个音符,还是“批量”模式,即你只在完成整首歌后才能听到每个音符?显然,交互模式使学习钢琴和编程变得更容易。坚持使用具有交互模式的语言并使用它。
鉴于这些标准,我建议首选编程语言是Python或Scheme。另一个选择是Javascript,不是因为它为初学者设计得非常好,而是因为有很多关于它的在线教程,比如可汗学院的教程。但你的情况可能会有所不同,还有其他好的选择。如果您的年龄是个位数,您可能更喜欢Alice或Squeak或Blockly(年龄较大的学习者可能也喜欢这些)。重要的是你选择并开始。
附录:书籍和其他资源
一些人问他们应该从哪些书籍和网页中学习。我重申,“单靠书本学习是不够的”,但我可以推荐以下内容:
《方案:计算机程序的结构和解释》(Abelson & Sussman)可能是最好的计算机科学入门,它将编程作为理解计算机科学的一种方式来教授。你可以在网上看到这本书的讲座视频,以及完整的文本。这本书具有挑战性,它将淘汰一些可能通过另一种方法获得成功的人。
《方案:如何设计程序》(Felleisen等人)是关于如何以优雅和实用的方式实际设计程序的最好的书籍之一。
《Python: Python编程:CS入门》(Zelle)是一本很好的使用Python的入门书。
Python:在Python.org上可以找到一些在线教程。
《Oz:计算机编程的概念、技术和模型》(Van Roy & Haridi)被一些人视为Abelson & Sussman的现代继承者。这是一次编程的大理念之旅,涵盖范围比Abelson & Sussman更广泛,但可能更容易阅读和理解。它使用一种语言,奥兹,不广为人知,但作为学习其他语言的基础。<笔记>
T. Capey指出,亚马逊上的完整问题解决页面现在有“在21天内自学孟加拉语”和“自学语法和风格”的书籍,在“买过这种商品的顾客也买过这些商品”的栏目下。我猜大部分看这本书的人都来自这一页。感谢罗斯·科恩对希波克拉底的帮助。
翻译
感谢以下作者,本页的翻译可在:
阿拉伯语
(穆罕默德·a·Yahya)
保加利亚
(Boyko Bantchev)
中国人
(于宁波郭)
克罗地亚
(Tvrtko Bedekovic)
世界语
(费德里科•中国人)
法国
(艾蒂安Beauchesne)
德国
(Stefan Ram)
希伯来语
(Eric麦凯恩)
北印度语
(Vikash女子)
匈牙利
(Marton Mestyan)
印尼
(Tridjito Santoso)
意大利
(法比奥·z . Tessitore)
日本
(yomoyomo)
韩国(约翰·黄)
波斯
(Mehdi Asgari)
波兰的
(库巴地毯诺瓦克)
葡萄牙语
(奥古斯托Radtke)
罗马尼亚
(Ştefan有没有ăr)
俄罗斯
(康斯坦丁Ptitsyn)
塞尔维亚
(Lazar Kovacevic)
西班牙语
(Carlos达)
斯洛伐克语
(Jan Waclawek)
土耳其
(Cağıl Uluşahin)
乌克兰
(Oleksii Molchanovskyi)