以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  Teach Yourself Programming in Ten Years  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=15515)


--  作者:awt
--  发布时间:3/13/2005 10:43:00 PM

--  Teach Yourself Programming in Ten Years
Teach Yourself Programming in Ten Years
Peter Norvig
Why is everyone in such a rush?
Walk into any bookstore, and you'll see how to Teach Yourself Java in 7 Days a

longside endless variations offering to teach Visual Basic, Windows, the Inter

net, and so on in a few days or hours. I did the following power search at Ama

zon.com:
     pubdate: after 1992 and title: days and
      (title: learn or title: teach yourself)
and got back 248 hits. The first 78 were computer books (number 79 was Learn B

engali in 30 days). I replaced "days" with "hours" and got remarkably similar

results: 253 more books, with 77 computer books followed by Teach Yourself Gra

mmar and Style in 24 Hours at number 78. Out of the top 200 total, 96% were co

mputer books.
The conclusion is that either people are in a big rush to learn about computer

s, or that computers are somehow fabulously easier to learn than anything else

. There are no books on how to learn Beethoven, or Quantum Physics, or even Do

g Grooming in a few days.

Let's analyze what a title like Learn Pascal in Three Days could mean:

Learn: In 3 days you won't have time to write several significant programs, an

d learn from your successes and failures with them. You won't have time to wor

k with an experienced programmer and understand what it is like to live in tha

t environment. In short, you won't have time to learn much. So they can only b

e talking about a superficial familiarity, not a deep understanding. As Alexan

der Pope said, a little learning is a dangerous thing.

Pascal: In 3 days you might be able to learn the syntax of Pascal (if you alre

ady knew a similar language), but you couldn't learn much about how to use the

syntax. In short, if you were, say, a Basic programmer, you could learn to wr

ite programs in the style of Basic using Pascal syntax, but you couldn't learn

what Pascal is actually good (and bad) for. So what's the point? Alan Perlis

once said: "A language that doesn't affect the way you think about programming

, is not worth knowing". One possible point is that you have to learn a tiny b

it of Pascal (or more likely, something like Visual Basic or JavaScript) becau

se you need to interface with an existing tool to accomplish a specific task.

But then you're not learning how to program; you're learning to accomplish tha

t task.

in Three Days: Unfortunately, this is not enough, as the next section shows.


Teach Yourself Programming in Ten Years
Researchers (Hayes, Bloom) have shown it takes about ten years to develop expe

rtise in any of a wide variety of areas, including chess playing, music compos

ition, painting, piano playing, swimming, tennis, and research in neuropsychol

ogy and topology. There appear to be no real shortcuts: even Mozart, who was a

musical prodigy at age 4, took 13 more years before he began to produce world

-class music. In another genre, the Beatles seemed to burst onto the scene wit

h a string of #1 hits and an appearance on the Ed Sullivan show in 1964. But t

hey had been playing small clubs in Liverpool and Hamburg since 1957, and whil

e they had mass appeal early on, their first great critical success, Sgt. Pepp

ers, was released in 1967. Samuel Johnson thought it took longer than ten year

s: "Excellence in any department can be attained only by the labor of a lifeti

me; it is not to be purchased at a lesser price." And Chaucer complained "the

lyf so short, the craft so long to lerne."
Here's my recipe for programming success:

Get interested in programming, and do some because it is fun. Make sure that i

t keeps being enough fun so that you will be willing to put in ten years.

Talk to other programmers; read other programs. This is more important than an

y book or training course.

Program. The best kind of learning is learning by doing. To put it more techni

cally, "the maximal level of performance for individuals in a given domain is

not attained automatically as a function of extended experience, but the level

of performance can be increased even by highly experienced individuals as a r

esult of deliberate efforts to improve." (p. 366) and "the most effective lear

ning requires a well-defined task with an appropriate difficulty level for the

particular individual, informative feedback, and opportunities for repetition

and corrections of errors." (p. 20-21) The book Cognition in Practice: Mind,

Mathematics, and Culture in Everyday Life is an interesting reference for this

viewpoint.

If you want, put in four years at a college (or more at a graduate school). Th

is will give you access to some jobs that require credentials, and it will giv

e you a deeper understanding of the field, but if you don't enjoy school, you

can (with some dedication) get similar experience on the job. In any case, boo

k learning alone won't be enough. "Computer science education cannot make anyb

ody an expert programmer any more than studying brushes and pigment can make s

omebody an expert painter" says Eric Raymond, author of The New Hacker's Dicti

onary. One of the best programmers I ever hired had only a High School degree;

he's produced a lot of great software, has his own news group, and through st

ock options is no doubt much richer than I'll ever be.

Work on projects with other programmers. Be the best programmer on some projec

ts; be the worst on some others. When you're the best, you get to test your ab

ilities to lead a project, and to inspire others with your vision. When you're

the worst, you learn what the masters do, and you learn what they don't like

to do (because they make you do it for them).

Work on projects after other programmers. Be involved in understanding a progr

am written by someone else. See what it takes to understand and fix it when th

e original programmers are not around. Think about how to design your programs

to make it easier for those who will maintain it after you.

Learn at least a half dozen programming languages. Include one language that s

upports class abstractions (like Java or C++), one that supports functional ab

straction (like Lisp or ML), one that supports syntactic abstraction (like Lis

p), one that supports declarative specifications (like Prolog or C++ templates

), one that supports coroutines (like Icon or Scheme), and one that supports p

arallelism (like Sisal).

Remember that there is a "computer" in "computer science". Know how long it ta

kes your computer to execute an instruction, fetch a word from memory (with an

d without a cache miss), read consecutive words from disk, and seek to a new l

ocation on disk. (Answers here.)

Get involved in a language standardization effort. It could be the ANSI C++ co

mmittee, or it could be deciding if your local coding style will have 2 or 4 s

pace indentation levels. Either way, you learn about what other people like in

a language, how deeply they feel so, and perhaps even a little about why they

feel so.

Have the good sense to get off the language standardization effort as quickly

as possible.
With all that in mind, its questionable how far you can get just by book learn

ing. Before my first child was born, I read all the How To books, and still fe

lt like a clueless novice. 30 Months later, when my second child was due, did

I go back to the books for a refresher? No. Instead, I relied on my personal e

xperience, which turned out to be far more useful and reassuring to me than th

e thousands of pages written by experts.
Fred Brooks, in his essay No Silver Bullets identified a three-part plan for f

inding great software designers:

Systematically identify top designers as early as possible.

Assign a career mentor to be responsible for the development of the prospect a

nd carefully keep a career file.

Provide opportunities for growing designers to interact and stimulate each oth

er.

This assumes that some people already have the qualities necessary for being a

great designer; the job is to properly coax them along. Alan Perlis put it mo

re succinctly: "Everyone can be taught to sculpt: Michelangelo would have had

to be taught how not to. So it is with the great programmers".
So go ahead and buy that Java book; you'll probably get some use out of it. Bu

t you won't change your life, or your real overall expertise as a programmer i

n 24 hours, days, or even months.

------------------------------------------------------------------------------

--

References
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

.

Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday

Life, Cambridge University Press, 1988.


------------------------------------------------------------------------------

--

Answers
Timing for various operations on a typical 1GHz PC in summer 2001:
execute single instruction  1 nsec = (1/1,000,000,000) sec  
fetch word from L1 cache memory  2 nsec  
fetch word from main memory  10 nsec  
fetch word from consecutive disk location  200 nsec  
fetch word from new disk location (seek)  8,000,000nsec = 8msec  


为什么每个人都急不可耐?

走进任何一家书店,你会看见《Teach Yourself Java in 7 Days》(7天Java无师自通)

的旁边是一长排看不到尽头的类似书籍,它们要教会你Visual Basic、Windows、Interne

t等等,而只需要几天甚至几小时。我在Amazon.com上进行了如下搜索:
    pubdate: after 1992 and title: days and (title: learn or title: teach

yourself)    (出版日期:1992年后 and 书名:天 and (书名:学会 or 书名:无

师自通))
我一共得到了248个搜索结果。前面的78个是计算机书籍(第79个是《Learn Bengali in

30 days》,30天学会孟加拉语)。我把关键词“days”换成“hours”,得到了非常相似

的结果:这次有253本书,头77本是计算机书籍,第78 本是《Teach Yourself Grammar a

nd Style in 24 Hours》(24小时学会文法和文体)。头200本书中,有96%是计算机书籍

结论是,要么是人们非常急于学会计算机,要么就是不知道为什么计算机惊人地简单,比

任何东西都容易学会。没有一本书是要在几天里教会人们欣赏贝多芬或者量子物理学,甚

至怎样给狗打扮。 让我们来分析一下像《Learn Pascal in Three Days》(3天学会Pasc

al)这样的题目到底是什么意思:

学会:在3天时间里,你不够时间写一些有意义的程序,并从它们的失败与成功中学习。你

不够时间跟一些有经验的程序员一起工作,你不会知道在那样的环境中是 什么滋味。简而

言之,没有足够的时间让你学到很多东西。所以这些书谈论的只是表面上的精通,而非深

入的理解。如Alexander Pope(译注:英国诗人、作家,1688-1744)所言,一知半解是危

险的(a little learning is a dangerous thing) 。

Pascal:在3天时间里你可以学会Pascal的语法(如果你已经会一门类似的语言),但你无

法学到多少如何运用这些语法。简而言之,如果你是,比如 说一个Basic程序员,你可以

学会用Pascal语法写出Basic风格的程序,但你学不到Pascal真正的优点(和缺点)。那关

键在哪里?Alan Perlis(译注:ACM第一任主席,图灵奖得主,1922-1990)曾经说过:“

如果一门语言不能影响你对编程的想法,那它就不值得去学”。另一种 观点是,有时候你

不得不学一点Pascal(更可能是Visual Basic和JavaScript之类)的皮毛,因为你需要接

触现有的工具,用来完成特定的任务。但此时你不是在学习如何编程,你是在学习如何完

成任务。

3天:不幸的是,这是不够的,正如下一节所言。


10年编程无师自通

一些研究者(Hayes、Bloom)的研究表明,在许多领域,都需要大约10 年时间才能培养出

专业技能,包括国际象棋、作曲、绘画、钢琴、游泳、网球,以及神经心理学和拓扑学的

研究。似乎并不存在真正的捷径:即使是莫扎特,他4 岁就显露出音乐天才,在他写出世

界级的音乐之前仍然用了超过13年时间。再看另一种音乐类型的代表??披头士,他们似乎

是在1964年的Ed Sullivan节目中突然冒头的。但其实他们从1957年就开始表演了,即使他

们很早就显示出了巨大的吸引力,他们第一次真正的成功之作《Sgt. Peppers》也要到19

67年才发行。Samuel Johnson(译注:英国诗人)认为10 年还是不够的:“任何领域的卓

越成就都只能通过一生的努力来获得;稍低一点的代价也换不来。”(Excellence in an

y department can be attained only by the labor of a lifetime; it is not to be

purchased at a lesser price.)乔叟(译注:Chaucer,英国诗人,1340-1400)也抱怨

说:“生命如此短暂,掌握技艺却要如此长久。”(the lyf so short, the craft so l

ong to lerne.)

下面是我在编程这个行当里获得成功的处方:

对编程感兴趣,因为乐趣而去编程。确定始终都能保持足够的乐趣,以致你能够将10年时

间投入其中。

跟其他程序员交谈;阅读其他程序。这比任何书籍或训练课程都更重要。

编程。最好的学习是从实践中学习。用更加技术性的语言来讲,“个体在特定领域最高水

平的表现不是作为长期的经验的结果而自动获得的,但即使是非常富有经验 的个体也可以

通过刻意的努力而提高其表现水平。”(p. 366),而且“最有效的学习要求为特定个体

制定适当难度的任务,有意义的反馈,以及重复及改正错误的机会。”(p. 20-21)《Co

gnition in Practice: Mind, Mathematics, and Culture in Everyday Life》(在实践

中认知:心智、数学和日常生活的文化)是关于这个观点的一本有趣的参考书。

如果你愿意,在大学里花上4年时间(或者再花几年读研究生)。这能让你获得一些工作的

入门资格,还能让你对此领域有更深入的理解,但如果你不喜欢进学校, (作出一点牺牲

)你在工作中也同样能获得类似的经验。在任何情况下,单从书本上学习都是不够的。“

计算机科学的教育不会让任何人成为内行的程序员,正如研 究画笔和颜料不会让任何人成

为内行的画家”,Eric Raymond,《The New Hacker's Dictionary》(新黑客字典)的作

者如是说。我曾经雇用过的最优秀的程序员之一仅有高中学历;但他创造出了许多伟大的

软件,甚至有讨论他本人的新 闻组,而且股票期权让他达到我无法企及的富有程度(译注

:指Jamie Zawinski,XEmacs和Netscape Navigator的作者)。

跟别的程序员一起完成项目。在一些项目中成为最好的程序员;在其他一些项目中当最差

的一个。当你是最好的程序员时,你要测试自己领导项目的能力,并通过你的洞见鼓舞其

他人。当你是最差的时候,你学习高手们在做些什么,以及他们不喜欢做什么(因为他们

让你帮他们做那些事)。

接手别的程序员完成项目。用心理解别人编写的程序。看看在没有最初的程序员在场的时

候理解和修改程序需要些什么。想一想怎样设计你的程序才能让别人接手维护你的程序时

更容易一些。

学会至少半打编程语言。包括一门支持类抽象(class abstraction)的语言(如Java或C

++),一门支持函数抽象(functional abstraction)的语言(如Lisp或ML),一门支持

句法抽象(syntactic abstraction)的语言(如Lisp),一门支持说明性规约(declara

tive specification)的语言(如Prolog或C++模版),一门支持协程(coroutine)的语

言(如Icon或Scheme),以及一门 支持并行处理(parallelism)的语言(如Sisal)。

记住在“计算机科学”这个词组里包含“计算机”这个词。了解你的计算机执行一条指令

要多长时间,从内存中取一个word要多长时间(包括缓存命中和未命中的情况),从磁盘

上读取连续的数据要多长时间,定位到磁盘上的新位置又要多长时间。(答案在这里。)

尝试参与到一项语言标准化工作中。可以是ANSI C++委员会,也可以是决定自己团队的编

码风格到底采用2个空格的缩进还是4个。不论是哪一种,你都可以学到在这门语言中到底

人们喜欢些什么,他们有多喜欢,甚至有可能稍微了解为什么他们会有这样的感觉。

拥有尽快从语言标准化工作中抽身的良好判断力。

抱着这些想法,我很怀疑从书上到底能学到多少东西。在我第一个孩子出生前,我读完了

所有“怎样……”的书,却仍然感到自己是个茫无头绪的新手。30个月 后,我第二个孩子

出生的时候,我重新拿起那些书来复习了吗?不。相反,我依靠我自己的经验,结果比专

家写的几千页东西更有用更靠得住。

Fred Brooks在他的短文《No Silver Bullets》(没有银弹)中确立了如何发现杰出的软

件设计者的三步规划:


尽早系统地识别出最好的设计者群体。指派一个事业上的导师负责有潜质的对象的发展,

小心地帮他保持职业生涯的履历。让成长中的设计师们有机会互相影响,互相激励。

这实际上是假定了有些人本身就具有成为杰出设计师的必要潜质;要做的只是引导他们前

进。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

.
Hayes, John R., Complete Problem Solver, Lawrence Erlbaum, 1989.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday

Life, Cambridge University Press, 1988.


答案

各种操作的计时,2001年夏天在一台典型的1GHz PC上完成:
    执行单条指令            1 纳秒 = (1/1,000,000,000) 秒   

 从L1缓存中取一个word        2 纳秒    从主内存中取一个word   

     10 纳秒    从连续的磁盘位置中取一个word    200 纳秒    从

新的磁盘位置中取一个word(寻址) 8,000,000纳秒 = 8毫秒


--  作者:JoeNT
--  发布时间:3/20/2005 10:00:00 PM

--  
我觉得任何这种书都存在骗人的成分的,呵呵,个人感觉

我就从来不看什么几天之内学会什么的书


--  作者:xmzhy
--  发布时间:4/1/2005 2:04:00 PM

--  
是阿
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
78.125ms