为什么大家都这么着急?
走进任何一家书店,你就会看到教自己Java24小时内除了提供无穷无尽的变体来教C,几天或几个小时内,SQL、Ruby、算法等等。亚马逊高级搜索标题:教书,你自己,小时数,自2000年起找到512本这样的书。在前十名中,有九本是编程书(另一本是关于簿记的)。类似的结果来自于将“自学”改为“学习”,或将“小时”替换为“天”。
结论是,这两个人中的任何一个人都急于学习。关于编程,或者说编程在某种程度上更容易学习比其他任何东西都重要。费莱森等人他们在书中对这一趋势表示赞同。如何设计程序,当他们说“糟糕的编程很容易。白痴可以在21天,即使他们是假人“疯狂的鹅漫画也有他们的观点.
让我们分析一下标题是什么样子的24小时内自学C++可能意味着:
自学:再过24小时,你就没有时间写几篇了重要的程序,并从您的成功和失败中学习他们。你没有时间和一个有经验的程序员一起工作了解在C++环境中生活是什么感觉。总之,你不会有时间学到很多东西。所以这本书只能说肤浅的熟悉,不是深刻的理解。正如亚历山大·波普所说,小小的学习是一件危险的事情。
C++:在24小时内,您就可以学习到C++(如果你已经知道另一种语言),但你不能学习更多关于如何使用这种语言的知识。总之,如果你是,比如说,基本程序员,您可以学习用基本使用C++语法,但你无法了解C++是什么实际上是好的(也有坏的)。那有什么意义?阿兰佩利斯曾经说过:“一种不影响你的方式的语言想一想编程是不值得知道的“。你必须学习一点C++(或者更有可能,(比如JavaScript或处理),因为您需要与完成特定任务的现有工具。但你不是学习如何编程,你正在学习如何完成这一任务。
在24小时内:不幸的是,这还不够,因为部分显示。
十年内自学编程
研究人员(布卢姆(1985年), 布赖恩和哈特(1899年), 海耶斯(1989年), Simmon&Chase(1973年))已经显示出来了要花大约十年的时间,才能在各种不同的领域中发展出专门知识。领域,包括下棋,音乐创作,电报。操作,绘画,钢琴演奏,游泳,网球和研究神经心理学和拓扑学。关键是审议练习:不只是一次又一次地做,但是挑战自己一项超出你目前能力范围的任务,分析你在做的时候和之后的表现,并改正。任何错误。那就重复一遍。再重复一遍。似乎没有真正的捷径:即使是莫扎特,他在4岁时是一个音乐天才,采取了13年后,他开始创作世界级的音乐。在……里面另一种类型,披头士乐队似乎以一种在1964年的埃德·沙利文秀上出现了一系列的第一乐章。但从那时起,他们就一直在利物浦和汉堡打小俱乐部。1957年,虽然他们很早就有了群众诉求,但他们的第一次伟大关键的成功,胡椒中士于1967年获释。
马尔科姆格拉德威尔虽然他专注于10,000小时,而不是10年,但他推广了这一理念。HenriCartier-Bresson(1908-2004)有另一个指标:“你的前10,000张照片是你最差的。”(他没有预计使用数码相机,一些人可以在一周内达到这一目标。)真正的专门知识可能需要一辈子:塞缪尔约翰逊(1709-1784)说过:“任何部门都可以做到卓越。只有毕生的劳动才能获得;不能在乔叟(1340-1400)抱怨道:“这艘船太短了。”“希波克拉底”(公元前400年)以摘录“阿尔斯·隆加”而闻名,“Vita brevis”,这是较长的引文“Ars Longa,vita”的一部分短肢、偶尔头肌、周围神经实验“艰难”,在英语中被描绘成“生命是短暂的,[技术]”长时间,机会转瞬即逝,实验变幻莫测,判断力困难。“当然,没有一个数字是最终的答案:这似乎不合理。假设所有技能(例如编程、下棋、跳棋和音乐演奏)所有的人都需要完全相同的时间去掌握,也不可能所有的人会花同样的时间。如罗氏K.安德斯·爱立信他说:“在大多数领域,即使是最多的时间,也有多少时间是值得注意的。有才能的人需要达到最高的绩效水平。10,000小时的数字让你感觉到,我们说的是每周10到20小时,有些人会认为这些人是最有天赋的人,但他们仍然需要达到最高水平。“
所以你想成为一名程序员
下面是我编程成功的秘诀:
到达感兴趣在编程中,并做一些,因为它是有趣的。确保它一直是足够的乐趣,所以你会愿意投入你的十年/10,000小时。
程序。最好的学习方式是学习通过做。更严格地说,“未达到给定域中个人的性能。自动作为一个功能扩展的经验,但水平即使是经验丰富的个人,绩效也可以提高。这是有意改进的结果。“(p.366)“最有效的学习需要一个定义明确的任务特定个人的适当难度,信息反馈以及重复和纠正的机会“(第20至21页)这本书 实践中的认知:思想、数学与日常文化生命很有趣这一观点的参考。
与人交谈其他程序员;阅读其他程序。这更重要比任何一本书或培训课程都要好。
如果你愿意,把四年学院(或更多在研究生院)。这将使您能够获得一些需要的工作。证书,它会让你更深入地了解这个领域,但是如果你不喜欢上学,你可以(用一些奉献精神)得到类似的经验,你自己或在工作中。无论如何,单靠书本学习是不可能的够了。“计算机科学教育不能使任何人成为专家。程序员就像学习画笔和颜料一样作者埃里克·雷蒙德(Eric Raymond)说。新黑客词典。我雇的最好的程序员之一只有高中学位,他产生了很多太棒了 软件,有他自己的新闻组,并有足够的股票期权购买他自己的股票。夜总会.
研究项目其他程序员。做最好的程序员在某些项目上;在另一些项目上最差。当你是最好的,你可以测试你领导一个项目的能力,以及激励你的能力。其他和你有远见的人。当你是最坏的时候,你会学到大师们这样做,而你却学到了他们不喜欢做的事情(因为他们让你为他们做这件事)。
研究项目后其他程序员。理解别人写的程序。看看要做什么当最初的程序员不是四处转转。考虑如何设计程序,使其更容易那些在你身后维护他们的人。
至少学半打编程语言。包括一个强调类抽象的语言(如Java或C++)强调函数抽象(如Lisp、ML或Haskell),支持语法抽象(比如Lisp)支持声明性规范(如Prolog或C++)。),以及强调并行性的人(如Clojure或Go)。
请记住,有一个“电脑在“计算机科学”中。知道吗?您的计算机执行指令所需的时间,获取内存中的单词(有或没有缓存错误),从磁盘读取连续单词,并寻求磁盘上的新位置。(答案在这里。)
卷入一种语言标准化努力。可能是ANSI C++委员会,或者可能决定您的本地编码样式是否有2或4个空格。压痕水平不管是哪种方式,你都会了解到其他人就像在一种语言中,他们有多深的感觉,甚至一点点。他们为什么这么觉得。
有很好的判断力下语言标准化工作越快越好。
考虑到这一切,你能走多远就成问题了读书学习。在我的第一个孩子出生之前,我读了所有的多么到还觉得自己是个无知的新手。30个月后,当我的第二个孩子出生时,我是否回到书本上复习?没有。相反,我依靠我的个人经验被证明是更有用和更令人安心的给我的比成千上万页写的专家。
弗雷德·布鲁克斯,在他的文章中没有银弹确定了一个发现伟大的三部分计划软件设计者:
系统地尽早确定顶级设计师。
指派一位职业导师负责前景的发展,并仔细保存一份职业档案。
为不断成长的设计师提供互动和相互激励的机会。
这假设有些人已经具备了必要的素质。做一个伟大的设计师;工作是适当地哄他们。阿兰佩利斯更简洁地说:“每个人都可以学会雕刻:米开朗基罗必须学会如何不去做。也是如此“伟大的程序员”。佩利斯说,伟大的人有一些超越训练的内在品质。但是在哪里质量来自于?是天生的吗?或者他们是通过勤奋?作为奥古斯特·古斯托(小说中的厨师)拉塔托维尔)说:“任何人都会做饭,但只有无畏的人才会做饭。“我认为这更像是愿意奉献一大笔钱。一生中的一部分用于深思熟虑的实践。但也许无畏是总结这一点的一种方式。或者,作为古斯托的批评家,安东·伊戈说:“不是每个人都能成为伟大的艺术家,而是一个伟大的艺术家。艺术家可以来自任何地方。“
因此,继续购买Java/Ruby/Javascript/PHP书籍;您将可能会从中得到一些利用。但你不会改变你的生活,或者在24小时或21天内,作为一名程序员,你真正的专业知识。在过去的24个月里,努力工作,不断提高,怎么样?现在你开始有进展了..。
参考文献
布卢姆,本杰明(编辑)培养青年人才,巴兰汀,1985年。
布鲁克斯弗雷德没有银子弹,IEEE Computer,第20卷,第4号,1987年,第10-19页。
Bryan,W.L.&Harter,N.“电报语言研究:养成一种习惯的等级。心理学评论, 1899, 8, 345-375
海斯,约翰·R.完全问题求解器Lawrence Erlbaum,1989年。
放大图片作者:William G.&Simon,Herbert A.“国际象棋中的知觉” 认知心理学, 1973, 4, 55-81.
拉维简实践中的认知:思想、数学与日常文化生命,剑桥大学出版社,1988年。
答案
典型PC上各种操作的大致时间:
执行典型指令 1/1 000 000 000秒=1纳塞克
从L1高速缓存存储器中提取 0.5纳米
分支误判 5纳米级
从L2缓存存储器中提取 7纳米
互斥锁/解锁 25纳米
从主记忆 100纳米
在1 Gbps网络上发送2K字节 20 000纳塞克
从内存中顺序读取1MB 25万纳塞克
从新磁盘位置获取(查找) 8,000,000纳塞c
从磁盘顺序读取1MB 20,000,000纳塞c
把美国包裹寄回欧洲 150毫秒=150 000 000纳塞克
附录:语言选择
有几个人问他们应该先学哪种编程语言。没有一个答案,但请考虑以下几点:
利用你的朋友。当被问到“什么操作系统应该我使用Windows、Unix还是Mac?“,我的回答通常是:”什么都用你的朋友说:“你从你的朋友那里学到的优势朋友将抵消操作系统之间的任何内在差异,或在编程语言之间。同时也要考虑你未来的朋友:您将成为程序员社区的一员,如果您继续。你所选择的语言是否有一个不断增长的群体?还是一个小的垂死的?有书籍,网站和在线论坛吗?才能得到答案?你喜欢那些论坛上的人吗?
保持简单。C++等编程语言的大型团队为专业开发而设计的有经验的程序员,他们关心的是运行时的效率。他们的密码。因此,这些语言具有为这些情况设计的复杂部分。你关心的是学习编程。你不需要那种并发症。您需要一种设计为易于学习和记忆的语言。一个新程序员。
玩。你更愿意学习弹钢琴吗?正常的互动方式,你一按下键就能听到每一个音符,还是“批处理”模式,只有在你唱完整首歌后才能听到音符?显然,交互模式使钢琴学习更容易,同时也使学习更容易。编程。坚持一种互动的语言,并使用它。
考虑到这些标准,我对第一次编程的建议语言Python或方案。另一个选择是Javascript,并不是因为它是为初学者设计的,但是因为有那么多的在线教程,比如汗学院教程。但是你的情况可能会有所不同,还有其他好的选择。如果你年龄是个位数,你可能更喜欢爱丽丝或吱吱声或布洛克(年长的学习者也可能喜欢这些)。重要问题是你选择并开始。
附录:书籍和其他资源
有几个人问他们应该学习哪些书籍和网页?从…。我再说一遍,“光靠书本学习是不够的”,但我可以建议如下:
计划: 结构和计算机程序的解释(Abelson&Sussman)是也许是对计算机科学最好的介绍,而且确实如此。教授编程作为理解计算机科学的一种方式。你可以看到网上讲座录像在这本书上,以及在线全文。这本书是挑战并将淘汰出一些可能是用另一种方法成功。
计划: 如何设计程序(Felleisen)等人)是最好的书之一如何以优雅和实用的方式设计程序。
Python: Python编程:CS简介(Zelle)是一个很好的介绍使用Python。
Python:几个在线教程可在Python.org.
奥兹: 概念,计算机编程技术和模型(Van Roy&Haridi)被一些人视为现代阿伯尔森和苏斯曼的继承者。它是一次关于编程的伟大思想的旅行,涵盖范围更广。比Abelson和Sussman更容易读懂跟着。它使用的是一种语言,Oz,它并不广为人知,但它的作用是学习其他语言的基础。<
注记
T.Capey指出完全问题解决器亚马逊的网页现在有了“自己教自己”“21天里的孟加拉语”和“自学语法和风格”的书下购买这种商品的顾客也购买这些商品部分。我想很大一部分人看过这本书是从这一页来的。感谢罗斯·科恩帮助希波克拉底。