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