`
long_yu2
  • 浏览: 312151 次
社区版块
存档分类
最新评论

给自己十年的时间编程

阅读更多
逛逛书店,你会看到《7天自学Java》等诸如此类的N天或N小时学习Visual Basic、Windows、Internet的书。我用了亚马逊网站的强大搜索(点此),出版年份选92年以后,书名关键词“天”、“自学”、“教你”,然后有248个结果,前78个是计算机类图书,第79个是《30天学孟加拉语》。我用“小时”换下“天”,结果惊人,有多达253本书,其中77本计算机图书,第78是《24小时自学语法句式》。在前200中,96%是计算机的书。
结论就是要么人们急于学习电脑,要么计算机比其他东西学起来要异常简单。没有任何书是关于几天学习贝多芬或量子物理的,甚至连犬类装扮都没有。费雷森(Felleisen)等人在其著作《如何设计程序》中同意这个趋势,因为提到:“坏设计很简单,笨蛋才用21天学,尽管他们还是真傻。”
让我们看看书名如《三日学C++》的意味:
学习: 三天内你可能没有时间写出有意义的程序,或者从中积累经验。你不可能有时间去跟职业编程者一起去理解在C++环境下的状况。简而言之,你没有充足的时间学很多。所以这本书只能说肤浅的知识。正如亚历山大·波普(Alexander Pope)所言:一知半解乃危殆之事。
C++: 三天内你可能学会C++的句法(如果你已经了解其他的语言),但你还不会使用它。简言之,假如是个Basic程序员,你可能写C++程序是Basic的风格,但你不能理解C++的真实好处。那要点是什么?艾伦·佩里斯(Alan Perlis)曾经说过:“一门不能影响你编程观点的语言不足学。”. 有可能你学了一点点C++(更确切地说是如Javascript或Flash的Flex),因为你需要一个界面有现成的工具去完成特定的任务。但是你不是学习如何编程,而是学习如何去完成任务。
三天: 不幸地是,这远远不够,下一部分会详细讲。
十年磨砺编程
研究人员 (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) 得出结论欲在诸多领域达到职业水平需要十年,比如国际象棋,作曲,电报操作,绘画,弹钢琴,游泳,网球以及神经心理学和拓扑学的研究。 关键是精心练习,不只是一遍一遍重复,而是挑战一项恰好超越你能限的事情,尝试并思考你的表现,并自我矫正。然后不断挑战。这并无捷径,4岁的音乐奇才莫扎特用了13年才能创作世界级的音乐。另外,披头士乐队似乎在1964年的埃德·苏利文( Ed Sullivan show)演出中一炮而红,但是他们自从1957年就在利物浦和汉堡的酒吧演出,在取得广泛关注后的早期,第一部重量级作品《佩珀军士》(Sgt. Peppers)发行是在1967年。 马尔科姆·格兰德维尔(Malcolm Gladwell)撰文描述了一项针对柏林音乐学院学生的研究,他们被分为尖子,中等和不足三类,并被问到他们练琴的情况:
所以,更确切地说,一万小时,而非十年,是个神奇之数。萨缪尔·约翰逊(Samuel Johnson, 1709-1784) 认为还需更长时间:“卓越乃一生之追求,而非其他。” 乔叟(Chaucer , 1340-1400)抱怨道"the lyf so short, the craft so long to lerne." (生之有限,学也无涯)。希波克拉底(Hippocrates , c. 400BC)因这句话被世人所知:"ars longa, vita brevis"(译注:拉丁语,意为“艺无尽,生有涯”),更长的版本是 "Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile",翻译成英文就是 "Life is short, [the] craft long, opportunity fleeting, experiment treacherous, judgment difficult." (生有涯,艺无尽,机遇瞬逝,践行误导,决断不易),然而在拉丁语中,ars 既含艺术,又寓工艺,希腊语原文使用的 "techne" 只表示“技艺”,而非“艺术”。
我的编程成功秘笈是:
首先要对编程感冒,你编程你快乐。一定要让它足够有趣,因为你要保持你的兴趣长达十年。
与别的编程者交流;阅读别人的代码。这比看任何书或参加培训课都重要。
实践。最好的学习乃实践。技术上讲,“编程之化境非通过充裕的实践经验而自然达到,但个人的性能可由专致的努力大力提升。” (p. 366)  “最有效率的学习需要明确的目标,适当的难度,知识回馈,并容许重复或修正错误。” (p. 20-21) 《实践认知:日常之思维、数学及文化》(Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life) 在这方面可做参考。
如果你确想,让其中四年置于大学(或者加上读研院)。这将给你赢得某些工作机会,并与你该领域的深层见解。但如果你不是通过教授学习的类型,你同样可以在工作中习得相似的经验。无论如何,单靠书本远远不足。“计算机科学的学习不会让任何人成为编程专家,真如同学习绘画和色彩理论不会让你成为画家一样” 语出埃里克·莱蒙(Eric Raymond),《新骇客字典》(The New Hacker's Dictionary)的作者。我曾雇过的最优秀的编程者只有高中文凭,他开发过许多伟大软件,有自己的新闻组(news group),通过公司认股赚的钱就让他买下了自己的夜店(nightclub)。
和其他程序员一起参与工程。在某些工程中担当最优秀程序员,在其他工程里当最差劲程序员。当你最出色,你要测试你的领导一项工程的能力,并用你的视野来激发他人。当你是老底,学习大手们做什么,以及他们不喜欢做的(因为他们把那些活让给你做)。
继续别人的工程。去理解先前程序员写的程序。学习如何理解并解决先前程序员未考虑到的问题。并考虑设计你的程序以便你之后的程序员更容易维护你的代码。
至少学六种程序语言。其中包括一种支持类抽象的(Java和C++),一种支持函数抽象的(如Lisp或ML),一种支持语义抽象的(Lisp),一种支援声明规范的(如Prolog或C++模板),还有一种支援协程的(Icon或Scheme),另外一种支持并发的(Sisal)。
记住,在“计算机科学”里有“计算机”一词。理解计算机执行你的代码的时候花费的时间,如从内存中取一个字(考虑有无缓存未命中情形),连续从磁盘读字,或者在磁盘中搜寻新位置。(答案见此文附表)
参与语言标准化工作。这可能是有关 ANSI C++ 委员会,也可能是决定你编码风格诸如两格或四格缩进。无论如何,你要知道其他人对语言的喜好程度,有时还要想想他们为什么喜欢这样。
要知道何时应该立刻脱身于语言标准化之努力。
知道统统这些,只通过书本的学习达到之程度就令人持疑。我的第一个孩子降生的时候,我读了所有的“如何做”(How To)系列书籍,仍然对于育婴是个漫无头绪的新手。30个月后,我第二个孩子出生,我还要温习一下那些书?绝对不,相反,我根据个人经验,结果相当有用,并让我确信我的经验比那些专家们写的上千页文字强。
弗莱德·布鲁克斯(Fred Brooks) 撰文《没有尚方宝剑》(No Silver Bullet,又译“没有银弹”) 给出了寻找顶级设计师的三条建议:
尽早系统地识别出顶级设计师。
分配一个负责其发展的生涯导师,认真对待生涯资料。
给予机遇让成长中的设计师互相磨砺。
这里假定有部分人已经有成为伟大设计师的潜质,你所需的就是要诱导他们。艾伦·佩里斯(Alan Perlis)一针见血:"谁人都可以学雕刻,要如此,那要教米开朗基罗如何不去干雕刻。对于伟大程序员来讲亦如是。”
所以径直去买那本Java书,你或许发现些许有用的东西。但你不会改变你的未来,或者在24小时内甚至24天,抑或24月成为专才里手。
 
参引文献
Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Bryan, W.L. & Harter, N. "Studies on the telegraphic language: The acquisition of a hierarchy of habits. Psychology Review, 1899, 8, 345-375
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Chase, William G. & Simon, Herbert A. "Perception in Chess" Cognitive Psychology, 1973, 4, 55-81.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.
答案
典型操作在个人电脑上的大概运行时间:
普通指令 1/1,000,000,000 sec = 1 nanosec
L1缓存中取字 0.5 nanosec
分支错误预测 5 nanosec
L2缓存中取字 7 nanosec
互斥量上锁/解锁 25 nanosec
主存中取字 100 nanosec
在1Gbps网络发送2KB的信息 20,000 nanosec
从内存中顺次取1MB内容 250,000 nanosec
在新的磁盘位置取内容(搜索) 8,000,000 nanosec
从磁盘顺次读1MB内容 20,000,000 nanosec
信息在美国到欧洲一个来回 150 milliseconds = 150,000,000 nanosec
附录:语言甄选
有人问先学那种语言合适。这里有一个答案,但要考虑下述几点:
参照朋友. 当被问及“我该用哪个系统,Windows、Unix还是Mac?”我的回答总会是“你朋友用啥你用啥。” 好处就是避免操作系统间的本质不同,或者说程序语言间的不同。而且想下你未来的朋友:你将参与的编程社区。你选用的编程语言的社区正在壮大或正在消亡?有没有书,网站或者在线论坛可以获取答案?你喜欢这些论坛上的人么?
要简单. C++和Java是给那些大型团队经验丰富的职业开发者而设计的,他们关注其代码的运行时效率。结果就是,这些语言为达此目的部件变得繁杂。你要考虑你在学习如何编程。你不需那么复杂。 你要学习的是一个简单易学,对于一个新手合适的语言。
尽兴. 你喜欢怎么学弹钢琴:正常的,交互式的,那种敲一下听一个音的,还是“批量”模式,显然,交互式让学习变得简单,同样适用于编程。扣住一门语言,交互式学习,并使用它。
有了这些基准,我的建议是你要学的第一门语言是 Python 或者 Scheme. 但是你的情况可能不同,选择也多多。如果你的年龄还是个位数,你可能更喜欢 Alice 或者 Squeak (年龄大的一些人也可能喜欢哦). 重要的是选择一种并开始学习。
附录:书目和其他资源
也有人问应该从何学起,看哪些书哪些网站。我反复讲“只读书远远不够”,但我还是推荐一些:
Scheme: 《计算机程序的结构和阐述》(Structure and Interpretation of Computer Programs (Abelson & Sussman) )或许是导论中最好的。确实给程序员教许多计算机科学理论。有相关的在线视频(online videos of lectures),以及完整的教材( complete text online)。这本书很有挑战性,可能把一些不适合这个方法的人剔除掉。
Scheme: 《如何进行程序设计》(How to Design Programs (Felleisen et al.))是优雅和高效编程的杰出作品。
Python: 《Python编程:计算机科学导论》(Python Programming: An Intro to CS (Zelle) )是基于Python的优秀绍介书。
Python: Python.org 网站的一些教程(tutorials)。
Oz: 《计算机编程的概念技巧和模型》Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi) 被一些人认为是Abelson & Sussman当前的继任者。它引你导览编程的经典观念,比Abelson & Sussman涵盖更广,更易于阅读。它使用了叫Oz的语言,这不为人知,但是作为学习其他语言的基础。
分享到:
评论
2 楼 yiday 2012-05-15  
现代人非常的浮躁
1 楼 哈包祥明 2012-04-28  

相关推荐

    Visual C++编程宝典十年典藏版part1

    发行时间: 2011年1月1日  本书是一本集技能、范例、项目和应用为一体的学习手册,书中介绍了应用Visual C++ 6.0进行程序开发的各种技术、技巧。全书分4篇,共22章内容,其中,第1篇为技能学习篇,主要包括Visual ...

    Visual C++编程宝典十年典藏版part3

    发行时间: 2011年1月1日  本书是一本集技能、范例、项目和应用为一体的学习手册,书中介绍了应用Visual C++ 6.0进行程序开发的各种技术、技巧。全书分4篇,共22章内容,其中,第1篇为技能学习篇,主要包括Visual ...

    C#编程宝典 十年典藏版

    C#编程宝典 ,内容全面,包含22个经典范例,4个实用开发项目和大型商业应用案例。全书集基本知识、范例、项目和商业系统开发于一体,以“学习、实践、实战、开发”四个阶段为主线,有助于初学者进行全面系统的学习,...

    Java编程宝典(十年典藏版)part2/2

    Java编程宝典(十年典藏版),这是第2部分,共2部分。 《Java编程宝典(十年典藏版)》集基础知识、范例、项目和商业系统开发于一体,以“学习”、“实践”、“实战”、“开发”4个阶段为主线,精,心打造出一套完整、...

    Java编程宝典(十年典藏版)part1/2

    Java编程宝典(十年典藏版),这是第1部分,共2部分。 《Java编程宝典(十年典藏版)》集基础知识、范例、项目和商业系统开发于一体,以“学习”、“实践”、“实战”、“开发”4个阶段为主线,精,心打造出一套完整、...

    我和LabVIEW-一个NI工程师十年的编程经验word文档资料.zip

    我和LabVIEW_一个NI工程师十年的编程经验word文档资料: 1.我和 LabVIEW 序言.doc 10顺序结构.doc 11.选择结构.doc 12.事件结构.doc 13.循环结构.doc 14.定时结构.doc 15.缓存重用结构.doc 16.LabVIEW 中的泛型容器....

    Java学习之道 用脑编程而不是用手

    时间并不等于经验,编程十年比编程三年的人并不一定要强。我曾经在一家软件公司做PM时,有人写代码已经八年了,而他写的代码我们测试的Bug也几乎是最多的。有人喜欢用代码行/日产量来评估一个程序员的编程能力,我...

    编程语言快速记忆手册

    四年专业英语单词快速记忆经验,一年时间精心打造“编程语言快速记忆手册”,第一版的编程语言快速记忆手册,里面共收录了4345个和编程,计算机相关的英语单词,并给出了理解学单词里的,独特的英语单词快速记忆法。...

    Visual C++编程宝典十年典藏版part2

    发行时间: 2011年1月1日  本书是一本集技能、范例、项目和应用为一体的学习手册,书中介绍了应用Visual C++ 6.0进行程序开发的各种技术、技巧。全书分4篇,共22章内容,其中,第1篇为技能学习篇,主要包括Visual ...

    Java编程的逻辑

    这种收获是我反复阅读教程十几遍,花大量时间上机练习调试得到的,这是一个比较痛苦的过程。我想,如果把我学到的知识更为清晰易懂地表达出来,其他人不就可以掌握编程容易一些,并体会到那种喜悦了吗?不过,当时...

    JAVA的编程逻辑 高清 请支持正版为作者点赞

    现在满大街的讲逻辑,满天飞的编程书,浪费资源不讲,浪费大家的时间可惜,有如作者这般深入浅出,通俗易懂而不乏严谨,真正从程序的内在逻辑,揭示编程思维奥秘的人,国内十年来几乎没有,所幸作者的倾心奉献,不仅...

    编程实践:Java进阶100例

    发行时间: 2012年10月27日 地区: 大陆 语言: 简体中文 Java行业是一直被业界看重的既有前景又有钱景的行业,越来越多的优秀的人才加入到Java大军中,随之应运而生的是各种培训机构和速成班。 编者结合自己多年来...

    编程语言快速记忆手册(视频+pdf) v2.0

    四年专业英语单词快速记忆经验,一年时间精心打造“编程语言快速记忆手册”,第一版的编程语言快速记忆手册,里面共收录了4345个和编程,计算机相关的英语单词,并给出了理解学单词里的,独特的英语单词快速记忆法。...

    ROS2编程基础课程文档.pdf

    凭借在建立ROS 1作为机器人研发的事实上的全球标准方面的十年经验,ROS 2从一开始就被建立在工业级 基础上并可用于生产,包括高可靠性和安全关键系统。 ROS 2的设计选择、开发实践和项目管理基于行业利 益相关者的...

    Tcl_TK编程权威指南pdf

    我接触Tcl语言大概已经有10年的时间了,而本书的第一版也已经出版5年了。在过去的几年中,我一直在John Ousterhout的手下工作,最初是在Sun微系统公司,而现在是在Scriptics公司。我一直使自己在很大程度上保持着一...

    KB66键盘编程工具

    1.4. 特别设计静电保护电路,并采用EPROM保存数据,无需电池,数据保存时间不少于100年。 1.5. 提供标准PS/2键盘接口,能外接标准键盘和标准条形码扫描枪。 1.6. 提供“TSL-True Status Lock”功能。能对任意一个...

    Perl高效编程.(第2版).pdf

    本书第1 版曾畅销十年之久,而在第2 版中不仅修正了前版存在的一些问题,更与时俱进地引入了许多Perl 领域的新主题,使内容更加完善丰富,也更具实用性。  本书为初级Perl 程序员铺就了一条通往高阶之路,而对高级...

    Linux C编程一站式学习

    大学的计算机专业有四年时间从零基础开始培养一个人,微积分、线代、随机、离散、组合、自动机、编译原理、操作系统、计算机组成原理等等一堆基础课,再加上C/C++、Java、数据库、网络、软件工程、计算机图形学等等...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    Java Web编程宝典-十年典藏版.pdf 是PDF电子书,不是源码。共分2个包。 《Java Web编程宝典(十年典藏版)》是一本集技能、范例、项目和应用为一体的学习手册,书中介绍了应用Java Web进行程序开发的各种技术、技巧。...

    我的编程感悟(中文PDF)(共37M二分卷)分卷二

    本书忠实地记录了作者十余年来对游戏编程的所思、所感、所悟。全书按照作者本人学习和实践的过程,带着读者从基础的计算机知识到高级的编程技术,从非常专业的汇编优化到非常实际的项目管理进行了一次游戏开发的全景...

Global site tag (gtag.js) - Google Analytics