作者: feifei 转自: http://book.douban.com/review/1629135/
维特根斯坦在当代可算是最重要的哲学家(可能没有之一),他的《哲学研究》也被评为近五十年来最重要的哲学著作(参见豆列 www.douban.com/doulist/165269),可见他在西方的地位。然而他在中国却未能获得应有的关注度,特别是在大众中。在哲学的热度达到顶峰的八十年代,他却在中国的哲学界销声匿迹,其实他在四十年代便被带到中国。总而言之,他不是受大众欢迎的哲学家,他讨论的问题大众也不感兴趣。因此有人说,维特根斯坦是面向哲学家的哲学家。
一切从语言说起
维特根斯坦的哲学可以分成前后两个截然不同的阶段,两者的差别甚至使他的著作好像出自两个人之手。然而其中有一条线索贯穿这两个阶段,那就是语言问题,准确的来讲,是语言与哲学的关系,这种哲学主要是指形而上学。前期注重的是语言的局限性,认为语言所表达的东西是有限的,而哲学问题恰恰就在语言世界之外。因此,哲学问题就属于不可言说的范围,哲学问题应该在我们的语言中消失。后期的维特根斯坦强调的是语言的多样性,认为哲学问题源于哲学家未能理解日常语言的多样性而产生了对语言的误用,并在运用语言的时候背离了它的日常用法。这个观点下面会仔细的说,总而言之,当我们了解了语言的特性,哲学问题就会随之消失。用两句话总结维特根斯坦前后期的语言观,那就是有些事我们不能说,而有些事我们不能说清楚。
他的书适合一些话多或者爱较真的人来读。读了他的书,我发现我的话少了,不知是不是好事,不过同时废话也少了,而且发现别人的废话也不少。
要了解维特根斯坦的语言观所针对的标靶,只需看一下高中的政治课本就可以了。例如马克思建立的那种用一个理论就可以把天下所有事情都解释一通的体系,显然就是维特根斯坦一直反对的哲学企图,而教科书上例如“矛盾”、“物质”之类的说法则显然违背了这些词的日常用法。我曾在教科书上看见过一个论证:3-2=1,式子中3和-2一正一负,构成矛盾,最后得出结果1,这证明了数学在矛盾中辩证地运动。事实上,在我们对矛盾的日常用法中,我们会说如果得出3-2既等于1又等于3,那就是矛盾,我们却从不会说3-2=1里面有“矛盾”。
当然,他针对的并不仅仅是马克思,而是一种唯理主义传统,它认为世界上所有事物都可通过理性弄清,我们也可以通过语言精确的阐释一切事物。
介绍几本书
1、哲学研究 http://www.douban.com/subject/1315184/?i=0
如果你没时间只能看他的一本书,那我建议你看这本。实在太忙的话,那看前面几十页就可以使你获益良多了。阅读这本书的过程就是一个纠正我们使用语言的错误的过程。
我们经常都会提出像“xx是什么?”这种形式的问题,例如生命是什么。维特根斯坦认为这个问题的关键并不是要理解生命的“本质”,而是要理解 “生命”这个词的用法。两个优秀的生物学家也会为病毒是不是生命而争吵,其实他们都很了解病毒,只是他们对生命这个词的用法有分歧罢了。这不是生物问题,而是语言问题。很多哲学问题其实也是一种语言问题。
在生活中我们也遇到这种情况,A和B在争论C是不是好人,他们对C做过什么事都很清楚,没有分歧,然而他们还是会争吵,其实也只是因为他们对好人的定义有不同而已。知道这一点,我们就会明白很多争论都没有进入问题的实质。
语言的意义在于它的用法,他得出了这个结论,这只是他整本书的一个起点而已,后面还有很多重要的观点,碍于能力所限就不说了。提一下对我启发最大的“家族相似”论点。我们经常用一个词指代一类事物,如用金属来指金、银、铜等物质,马来指白马黑马等多种马,似乎各个事物因为有一种本质的相似,所以我们要用一个词称呼他们。维特根斯坦认为这只是一种“家族类似”,一类事物就象一个家族,他们的样子有些相似,然而他们的行为、思想却很可能有很大不同。例如,我们习惯把文化分成东方文化和西方文化两类,似乎两者之间有一道鸿沟。然而在东方文化内部果真有种本质上的共同点吗?老子与孔子的区别要比孔子与苏格拉底的区别要少吗?也许看了哲学研究,我们会对一切以集体名义作出的行为保持警惕。
2、论确实性http://www.douban.com/subject/1013410/?i=0
这本书是他的遗作,比哲学研究还要凌乱,然而如果你已经对它感兴趣,这本书还是值得一读。这本书围绕着一些我们称之为公理的东西而展开,例如物质在我看不到的时候依旧存在、每个人都有父母。维特根斯坦研究我们为什么会确信这些命题,他认为并不是这些命题无法怀疑,而是我们的生活决定了我们的怀疑没有意义,因为如果我们怀疑,我们就无法生活。例如我们原本可以怀疑自己其实身处黑客帝国,这理论上完全有可能,但你如果真的这么想,我们就会以为你是疯子,因为你的怀疑触及了生活的根本。相反,怀疑相对论却是可以接受的,因为相对论还离我们的日常生活很远,尽管你的怀疑已被很多实验否定。
3、逻辑哲学论http://www.douban.com/subject/1005354/
前期代表作。可以找到很多适合用作签名档的警句,可是不推荐阅读,在现在看来,这本书的现实意义不大。
终于写完了,算是对思想的一次整理吧,大脑的混沌状态终于要结束了...
Sunday, November 7, 2010
维特根斯坦论确实性——从摩尔对怀疑主义的反驳说起
作者: 西江月, 转自: http://book.douban.com/review/2073062/
康德曾在其《纯粹理性批判》第二版序言中提到哲学和普遍人类理性的丑闻,即理性之无法真正反驳怀疑主义:“唯心论尽可以就形而上学的根本目的而言仍然被看作是无辜的,然而哲学和普遍人类理性的丑闻仍然存在,即不得不仅仅在信仰上假定在我们之外的物的存有,并且,如果有人忽然想到要怀疑这种存有,我们没有任何足够的证据能够反驳他” 。
针对这一丑闻,摩尔(George Edward Moore)在《外在世界的证明》(1939年)一文中做出了他的回答。摩尔认为他可以给出数量庞大的不同证明来反驳怀疑论者。“比如,我现在就可以证明存在两只手。如何证明呢?通过举起我的两只手,并且在我用右手做出某个手势时说‘这里有一只手’,而在用左手做出某个手势的时候补充‘这里还有另一只手’。” 摩尔继续说,如果这个证明成立,那么显然他还能举出更多其它证明。
但摩尔的这种证明显然不能让许多哲学家感到满意,因为摩尔并不能对“这里有一只手”和“这里还有另一只手”这些前提给出证明。摩尔对此说道: “虽然我不能对一些事情给出证明,但我仍然能够知道它们。”关于这一点,摩尔也曾在《为常识辩护》(1925年)一文中提到,存在一系列命题,“对于其中任何一个,我都确信地知道为真。”这一系列命题包括:“我有身体,它在过去某时出生,并且从那以后一直停留在地球附近”,“在三维空间中存在许多其它有形状大小的东西”,“除了我自己以外还有别人”,“地球在我出生之前很久就已存在”等等。
摩尔究竟有没有对怀疑主义做出有效的反驳?其对外在世界的证明是否有效?对此,维特根斯坦在《论确实性》一书中指出,摩尔对怀疑主义的反驳根本不得要领。摩尔并不知道怀疑主义者的怀疑在何种意义上是非法的,因此并不能对其做出有效的反驳。在维特根斯坦看来,怀疑论者对外在世界之存在的怀疑之所以不合法,原因并非在于外在世界确实存在,而在于他们的怀疑本身是有问题的。在此意义上,摩尔对于怀疑论者看似有力的正面回击,即证明外在世界如何的确存在,就成为不得要领的了。此外,摩尔用“我知道……”来证明外在世界的存在,恰恰暴露出他根本不知道“知道”一词的正确用法,而错将“知道”等同于一种绝对的确实性。
在《论确实性》这本书里,维特根斯坦认为,反对怀疑主义并不意味着支持绝对的确实性。恰恰相反,确实性只相对一种体系、世界图景、语言游戏而言,即任何命题的确实性只是相对的。即便是摩尔所举出的貌似无可反驳的命题,也只具有相对的确实性。因为关于外在世界,我们所拥有的至多不过是一些不可穷究其根据的基本信念。不过,对于这些信念我们虽然无法拥有绝对的确信,但亦无法怀疑,因为我们向来就生活在这些基本信念之中。只是在此意义上,怀疑主义才是无效的。
一、 摩尔不知道“知道”的正当用法
维特根斯坦指出,摩尔错误地使用了“知道”这个概念。摩尔认为,“知道”这一陈述“不可能是一种错误”。维特根斯坦指出,摩尔在这里忽视了 “知道”背后隐藏的“我相信我知道”的公式。“因为‘我知道’似乎是描述一种事态,这种事态保证所知的东西是一种事实,人们总是忘记‘我认为我知道’这个表达。”
在维特根斯坦那里,“知道”的正当用法如下:“‘我知道’经常表示这样的意思:我有正当的理由支持我说的语句”。而能够为某事提供正当理由并不意味着某事是绝对正确的,或言具有一种绝对的确实性,恰恰相反,具有正当理由意味着不具有正当理由情形,即“错误”的可能性。知识和错误是一对相伴相生的概念。凡我们所知道的东西,都有犯错的可能性。因为“说出‘我知道’这种保证是不够的,因为我不可能弄错毕竟只是一种保证,而在那件事上我不可能弄错却需要在客观上加以证实”。
这也意味着,“知道”和“出错”的使用是有界限的。维特根斯坦认为,对于一些无法用真假对错去评判的、关涉生活世界基础的基本信念,我们无法说“我知道”或“出错了”。“知道”所处的是日常的体系内部的因果链条,它在体系内部中可以进行有效的运作;但是对于那些规定了体系本身、规定了世界和语言界限的基本命题,我们可做的只有相信。一个人可以有效地计算,但是却无法为计算的确实性找到绝对的证明,因为一切诸如“这是老师教我的”之类的解释最终会走到尽头:“如果有人教某个人学计算,那么是否也要教他:他能够依靠他老师的计算?但是这些说明到时候毕竟会走到尽头”,“难道验证不是终有个完结吗?”。在穷尽处,即基本信念领域,我们不可再问根据,而只需相信。
二、关于基本信念、确实性和世界图景
这些基本命题或基本信念首先包括,比如摩尔所说的“我有一只手”,或者“我是一个人”、“我有大脑”“地球在我出生之前很久就已存在”等等。对于这些命题,既无法说真,亦无法说假。而之所以如此,其中理由并不在于怀疑论者所提出的感觉经验的可骗性,或是摩尔提出的常识辩护,而仅仅在于,这些命题是我们生活中的基本信念,它们构成了其它信念之所以可能的基础。一般情况下,对于这些命题既无法谈“知道”,亦无法谈“出错”。在此意义上,这些命题是不可怀疑的。在这些基本信念上出问题,关涉的不是错误,而是精神问题。“如果我的朋友有一天想像他在某某地方已经住了很长一段时间,等等,等等,我不会把这件事叫做错误,而是叫做精神失常,也许是暂时性的精神失常。”以此类推,没有特殊理由的不知道他有一只手或他是一个人,也只能被归于精神失常。
这些基本信念来源于人们的生活共同体,来自人们习以为常、约定俗成的使用,来自“没有理由的行动方式”。由于这些信念规定了我们日常生活的基本框架,所以它们的反面在通常情况下是不可想象的。“表达摩尔所‘知道’的事物的命题都属于这样一类命题,即很难想像一个人为什么应当相信其反面。例如那个讲摩尔已经贴近地球生活了一辈子的命题。……我看到的和听到的所有事物都让我确信没有人曾远离地球。在我的世界图景中没有一件事物支持其反面的说法。” 这些命题是“一切思想(语言)运作的基础”,是“我们思想的框架”,是“我一切行动的基础”,以故,虽然维特根斯坦批评摩尔采取了错误的方式去维护常识,但摩尔的维护常识的态度的确为维特根斯坦所赞同。“维特根斯坦相信摩尔所列举的命题的程度绝不亚于摩尔本人。”
当然,这并不意味着这些命题具有自明的绝对的确实性,而只是因为既然我们处于共同体之中,我们便没有理由不相信,也不可能不相信。这些基本信念既然来自人类生活共同体,就必定是历史性的,有诞生有消灭。一些在这代人那里曾经是基本信念的,到了下代人就不一定还是基本信念。在此,维特根斯坦有一个极为生动的比喻,他将生活比作河流,而将基本信念比作通道或河床:“可以想像,一些经验命题得以凝结,对其后来凝结的,仍然是有流动性的命题起到作为通道的作用;也可以想像,随着时间的推移,上述关系将发生变化:曾经具有流动性的命题获知凝结,而曾经凝结了的命题,变得具有流动性”。“这种神话可能变为原来的流动状态,思想的河床可能移动。”
在维特根斯坦那里,并不存在绝对的确实性,确实性仅仅具有相对的含义,仅仅针对某一民族某一阶段的生活而言。在此意义上,确实性只是虚的东西:“确实性就像是一种语气,人们用这种语气肯定事态,但是人们并不是从语气中推导出这样说就有道理”。确信并不是推理的基础,而只是所有推理之可能进行的前提。依靠这种虚的确定性,人们才能建立起所有一般信念,并在其中做有效的推理。海德格尔也曾经向我们揭示出“虚”的重要性。他指出我们的文化往往并非关注实的东西,那些由实的东西承载的虚的东西才是关键。此在的意义在于虚的东西。种种虚的指引让人烦劳操心,虚的时间性结构是此在的本质结构。维特根斯坦和海德格尔在很多方面不一致,但却不约而同地指出了如下一点,即:人们往往刻意地努力去追求实在,却不知自己总已处身于虚之中。
而仅仅具有相对确实性的基本信念必定总已处于一个体系之中。在信念之流之中,河床的沉积或者被冲刷与流水相关。没有任何一个命题具有绝对的确定性,意味着没有任何一个命题能够被单独抽离来看——所有命题都属于一个相互依赖的体系。“某些经验命题的真实性(Wahrheit)属于我们的参照系(Bezugssystem)。”“使我认为明显无误的并不是一些单独的公理,而是一个前提与结论互相支持的体系。”“某个信念之所以占有稳固的地位,与其说是由于其本身显而易见或令人信服,倒不如说是靠其周围的信念才使它不可动摇。”“有关一种假设的一切检验、一切证实或否证都早已发生在一个体系之中。这个体系并不是我们进行一切论证时所采用的多少带有任意性或者不太可靠的出发点,而是属于我们称之为论证的本质。这个体系与其说是论证的出发点,不如说是赋予论证以生命的活力。”这个体系自身并不绝对确实,但是却构成相应人群生活的统一背景,是一切论证和检验可以生效的前提。换言之,这个体系是一个共同体的世界图景。对此维特根斯坦说道:“我有一个世界图景。这个世界图景是真还是假?最重要的在于它是我的一切探讨和断言的基础。那些描述它的命题并不是全都同样受到检验的制约。”
不同时代有着几乎完全不同的世界图景。在古希腊人那里,他们的祖先和奥林匹亚诸神以各种方式渗透了他们的生活;在中世纪的欧洲,上帝是最高的实在,存在地上之城和上帝之城两个世界;而在不信神的现代人眼前展现的,则是科学的客观的世界图景。即便是在同一时代,不同地域人们的世界图景亦有天差地别,比如当今美国人民与非洲某原始部落之世界图景的差别。甚至即便是在同一时代、同一地域的人们,也有可能拥有彼此相异的世界图景,比如基督徒与无神论者。在自然环境、社会、以及各种偶然因素的影响下,人们从各自的实践中沉淀出属于自己种群的独特的世界图景。而不同的世界图景意味着不同的基本信念体系,意味着不同的语法规则,并在此意义上无所谓优劣差等。身处某一世界图景之中的人们总是以自己的世界观为正确,并力图让处于其外的人们也接受它。维特根斯坦将这种世界图景等同于一种积极意义上的神话:“描述这幅世界图景的命题也许是一种神话的一部分,其功用类似于一种游戏的规则。这种游戏可从全靠实践而不是靠任何明确的规则学会。”
三、基本信念说意味着什么
1怀疑主义者的怀疑是非法的
维特根斯坦反对怀疑主义,但他的反对并非出于对绝对确实性的相信——像摩尔所以为的那样。维特根斯坦只承认一种相对的确定性,但相对的确定性将并不导致怀疑主义,而恰恰将揭示出,怀疑论者所说的怀疑是没有意义的。我们向来总已生活在一个统一背景之中,基本信念规定了我们思想和语言的框架,在此意义上,要想进行彻底怀疑是根本不可能的。“如果你想怀疑一切,你就什么也不能怀疑。怀疑这种游戏本身就预先假定了确实性。”“如果你什么事实也不确知,那么你也就不能确知你所用的词的意义。”“怀疑出现在信念之后。”“我知道”是怀疑之可能的基础。若不能说“我知道”,就不能说“我怀疑”。“对于一种存在的怀疑只能在一种语言游戏中进行。”“一种怀疑一切的怀疑就不成其为怀疑。”“这表明不容怀疑属于语言游戏的本质”,而语言游戏归根结底乃是一种生活形式,“因为行动才是语言游戏的根基”。“我们不怀疑所有这些事实只是我们的判断方式,因而也就是我们的行为方式。”
事实上,康德所说的“哲学和普遍人类理性的丑闻”直接来自休谟的怀疑论。而维特根斯坦之所以能够成功地抵制休谟的怀疑论,其原因恰恰在于维特根斯坦在一定程度上承认了休谟的前提,即因果关系本不是必然的,我们日常以为真的只是些暂时固定下来的信念,并不必然真。但是,正是在此意义上,跳出基本信念的圈子去绝对怀疑才是不可能的。人无法离开生活之流而在地面上进行观察,因为这样的地面根本就不存在。而摩尔对怀疑主义不恰当的反驳透露出,摩尔其实既不知道“知道”,也不知道“怀疑”。
2自笛卡儿以来的对知识确定性的追求被宣布为无效
在《第一哲学沉思集》中,笛卡儿致力于通过彻底怀疑找出人类知识的最后支点,即我们能够绝对确信的东西:“我思故我在”。笛卡儿相信由此他便可以重建人类知识大厦,并最终克服怀疑主义。而在维特根斯坦看来,根本上说,是因为笛卡儿非法地使用了怀疑概念,才构建出所谓绝对确信的东西。而事实是,我们始终在生活的河流之中,所能触及的只能是暂时或者相对持久地沉积下来的河床。我们无法怀疑这些沉淀下来的东西,因为它们是我们的怀疑之所以可能的基础,在此意义上,它们是确实性命题。但这并不意味着这些沉淀下来的东西具有永恒的真理性,具有绝对的确实性。并且,这些确实性命题无法被单独抽离来看,因为它们属于一个相互依赖的体系,属于一个统一的世界图景。由此,“维特根斯坦在这里最有力地抨击了笛卡儿以来认识论只顾追求某种‘完全确实’的东西这一错误方向” 。
由此,维特根斯坦消解了哲学家对绝对确信的信仰。自笛卡儿以来的对知识确定性的追求被宣布为无效。在此意义上,连同他们为知识确定性找到的保障(唯理论者斯宾诺莎的作为最高理性的上帝,经验论者洛克的感觉经验基础),都失去了意义。笛卡儿向人们指出的知识确定性能够给人以安全感,它令人们相信自己处于一栋十足稳固的知识大厦之中。而维特根斯坦让人们重新认识到,他们其实仍旧身处生活之河流中,这河流有的只是相对稳固的河床。
3康德对分析命题和综合命题的区分是无意义的
对知识确定性的消解,意味着康德对分析命题和综合命题的区分是无意义的。康德曾经这样区分分析命题和综合命题,即分析命题指像数学和逻辑命题那样相对于任何经验事实其值皆恒为真的命题,而综合命题则指像经验科学命题那样其值取决于经验事实的命题。而在维特根斯坦的河流比喻中,即便是分析命题,也仅仅只能充当暂时性的或者相对持久的河床。2*2=4并非像康德所认为的那样永恒真。“‘2*2=4’是一个正确的算术命题——不是‘在特殊场合下’,也不是‘永远’——但是说出的或写出的‘2*2=4’这个公式在中文中也许可以有一种不同的意义或者是完全无意义的胡说,由此可以看出这个命题只有在使用时才有意义。”维特根斯坦认为,并不存在独立于人和独立于人之计算学习的所谓计算本质。计算归根结底是一种使用,并且仅仅因人们的使用才慢慢硬化为语法规则。“我们是通过学习计算而得以知道计算的本质(Wesen)的。”“但是这样一来难道对于我们怎样确信计算的可靠性就不能加以描述了吗?噢,确实是这样。”“人们就是这样计算的。计算就是这样。这就是我们(比如说)在学校学会的东西。忘掉这种超验的确实性吧,因为它同你的精神的概念关联在一起。”“即使这次计算对我来说是已经确定的东西,这也仅仅是一种为了达到实用目的而采取的决定。”由此,计算首先服务于实用目的,而非自身绝对确实,在此意义上,根本不存在所谓绝对正确的“天赋观念”。而人们对永远可靠的计算和尚未确定的计算的区分,也只是“一种逻辑上的区别”——这就意味着,在本质上没有差别。它们都不绝对确实,而只是就人类共同体的语法规则而言具有相对的确实性。
奎因曾在其著名论文《经验论的两个教条》中提出相似观点。“他指出,在现实中,即便是一直以来被视为具有确定性的数学和逻辑命题,也存在着因其为伪命题而被合理地加以抛弃的情况;即便是经验科学命题,也可能存在无论在任何情况下都将其视为真而合理地继续加以使用的情况,因此,必然的分析命题与偶然的综合命题这两者间的界限,是流动不居的。” 奎因的这篇论文与维特根斯坦的《论确定性》大致完成于同一时期,其中观点也与《论确定性》有着惊人的相似。然而具有讽刺意味的却是,从60年代后期开始,维特根斯坦对英语圈哲学的影响出现了明显的衰落之势,而取而代之的正是奎因的哲学。
4知识、信念与谎言
基本信念还意味着,知识亦不过是一种信念。信念与知识对应的是同一种“心灵状态”(Seelenzustaende)。“认为与‘相信’和 ‘知道’这些词相对应的必然是些不同的心灵状态,这就好像人们相信与‘我’这个词和‘路德维希’这个名字相对应的因概念的不同而必然是不同的人一样。” (同上)一种“知道”既然以基本信念为前提,而基本信念又是没有根据的,那么知识归根结底也只是信念而已,同信念一样有其诞生和消灭,是有朽的。而信念之有朽意味着什么?尼采在其《敌基督者》一书中认为,信念与谎言并无实质差别。“每个信念都拥有其历史,拥有其原始形式、尝试阶段和错误:在它成为信念之前,它很长时间都不是信念,更长时间后几乎不可能成为信念。”“父亲所谓的谎言,在儿子那儿变成了信念。” 由此,信念打破了知识(真理)与谎言之间的严格对立:这世上本无所谓真理,信的人多了,就成了真理;这世上也本无所谓谎言,不信的人多了,就成了谎言。
海德格尔在《存在与时间》中揭示了此在的存在状态:此在往往在种种因缘际会中自以为“知”,却在所有因缘中断之时、在此在自身面前、在巨大的空无面前方觉出自己一无所知。此在“茫然失其所在” ,此在一头撞进空无。知背后隐藏的是一无所知,而此在一旦意识到自己一无所知,所知的一切就都立刻失去意义。作为因缘整体和意蕴结构的世界陷落,并开始变得无关紧要。不过,海德格尔对此在“畏”之状态的揭示,在维特根斯坦那里或许是无意义的。我们向来生活在人类共同体之中,对我们有意义的仅仅是这个共同体所习以为常的种种“知”,而我们根本无法追问超出共同体、超出日常用法的领域。“通常关于世界的实在性的断言实际上就是关于这样的世界的实在性的断言,通常所谓对于世界的认识也只是对于这样的世界的认识。至于独立于人们的概念框架或表现手段的(进而独立于人的)世界本身究竟是什么样子的,人们根本不可能知道(当然,这并不是说这样的世界不存在);甚至于,这样的问题根本没有任何意义。”
并且,维特根斯坦指出,不同的信念之间仍然存在区别。充当信念之流的河床或通道的基本信念,有的像岩石一般坚硬,有的则如同随时会被冲走的泥沙:“那条河流的岸边一部分是不发生变化或者变化小得令人察觉不到的坚硬的岩石,另一部分是随时随地被水冲走或者淤积下来的泥沙”。只不过,那些坚硬的岩石亦仅仅就河流而言,并非绝对真理。
从无根据的信念那里,尼采返回大地,海德格尔返回此在的存在本身,维特根斯坦返回人的日常生活。不同的是,在尼采那里,真正能做到返回大地的只有超人;在海德格尔那里,本真的向死存在始终作为一种可能性召唤人们痛下决心;而维特根斯坦所告诉人们的,仅仅是日常生活本身。他抵制了做形而上学家、做教导者的诱惑,而这诱惑对于古往今来的几乎所有哲学家来说,都似乎是无法抗拒的。
结论
在《论确实性》一书中,维特根斯坦指出了对摩尔对怀疑主义的反驳之不得要领,并进一步指出了怀疑主义者之怀疑在何种意义上才是不合法的。反对怀疑主义,并不意味着相信一种绝对确实性;恰恰相反,正是一种只具有相对确实性的基本信念体系、语言游戏规则、统一世界图景决定了彻底怀疑之不可能。维特根斯坦认为,这些无根据的基本信念来自人类共同体的生活,根据不同共同体的生活,可能形成不同的语言游戏、世界图景,但是却根本不存在哲学家所追求的所谓绝对真理。在此意义上,维特根斯坦的言说止于日常生活,而拒绝再做任何传统形而上学的演绎。
康德曾在其《纯粹理性批判》第二版序言中提到哲学和普遍人类理性的丑闻,即理性之无法真正反驳怀疑主义:“唯心论尽可以就形而上学的根本目的而言仍然被看作是无辜的,然而哲学和普遍人类理性的丑闻仍然存在,即不得不仅仅在信仰上假定在我们之外的物的存有,并且,如果有人忽然想到要怀疑这种存有,我们没有任何足够的证据能够反驳他” 。
针对这一丑闻,摩尔(George Edward Moore)在《外在世界的证明》(1939年)一文中做出了他的回答。摩尔认为他可以给出数量庞大的不同证明来反驳怀疑论者。“比如,我现在就可以证明存在两只手。如何证明呢?通过举起我的两只手,并且在我用右手做出某个手势时说‘这里有一只手’,而在用左手做出某个手势的时候补充‘这里还有另一只手’。” 摩尔继续说,如果这个证明成立,那么显然他还能举出更多其它证明。
但摩尔的这种证明显然不能让许多哲学家感到满意,因为摩尔并不能对“这里有一只手”和“这里还有另一只手”这些前提给出证明。摩尔对此说道: “虽然我不能对一些事情给出证明,但我仍然能够知道它们。”关于这一点,摩尔也曾在《为常识辩护》(1925年)一文中提到,存在一系列命题,“对于其中任何一个,我都确信地知道为真。”这一系列命题包括:“我有身体,它在过去某时出生,并且从那以后一直停留在地球附近”,“在三维空间中存在许多其它有形状大小的东西”,“除了我自己以外还有别人”,“地球在我出生之前很久就已存在”等等。
摩尔究竟有没有对怀疑主义做出有效的反驳?其对外在世界的证明是否有效?对此,维特根斯坦在《论确实性》一书中指出,摩尔对怀疑主义的反驳根本不得要领。摩尔并不知道怀疑主义者的怀疑在何种意义上是非法的,因此并不能对其做出有效的反驳。在维特根斯坦看来,怀疑论者对外在世界之存在的怀疑之所以不合法,原因并非在于外在世界确实存在,而在于他们的怀疑本身是有问题的。在此意义上,摩尔对于怀疑论者看似有力的正面回击,即证明外在世界如何的确存在,就成为不得要领的了。此外,摩尔用“我知道……”来证明外在世界的存在,恰恰暴露出他根本不知道“知道”一词的正确用法,而错将“知道”等同于一种绝对的确实性。
在《论确实性》这本书里,维特根斯坦认为,反对怀疑主义并不意味着支持绝对的确实性。恰恰相反,确实性只相对一种体系、世界图景、语言游戏而言,即任何命题的确实性只是相对的。即便是摩尔所举出的貌似无可反驳的命题,也只具有相对的确实性。因为关于外在世界,我们所拥有的至多不过是一些不可穷究其根据的基本信念。不过,对于这些信念我们虽然无法拥有绝对的确信,但亦无法怀疑,因为我们向来就生活在这些基本信念之中。只是在此意义上,怀疑主义才是无效的。
一、 摩尔不知道“知道”的正当用法
维特根斯坦指出,摩尔错误地使用了“知道”这个概念。摩尔认为,“知道”这一陈述“不可能是一种错误”。维特根斯坦指出,摩尔在这里忽视了 “知道”背后隐藏的“我相信我知道”的公式。“因为‘我知道’似乎是描述一种事态,这种事态保证所知的东西是一种事实,人们总是忘记‘我认为我知道’这个表达。”
在维特根斯坦那里,“知道”的正当用法如下:“‘我知道’经常表示这样的意思:我有正当的理由支持我说的语句”。而能够为某事提供正当理由并不意味着某事是绝对正确的,或言具有一种绝对的确实性,恰恰相反,具有正当理由意味着不具有正当理由情形,即“错误”的可能性。知识和错误是一对相伴相生的概念。凡我们所知道的东西,都有犯错的可能性。因为“说出‘我知道’这种保证是不够的,因为我不可能弄错毕竟只是一种保证,而在那件事上我不可能弄错却需要在客观上加以证实”。
这也意味着,“知道”和“出错”的使用是有界限的。维特根斯坦认为,对于一些无法用真假对错去评判的、关涉生活世界基础的基本信念,我们无法说“我知道”或“出错了”。“知道”所处的是日常的体系内部的因果链条,它在体系内部中可以进行有效的运作;但是对于那些规定了体系本身、规定了世界和语言界限的基本命题,我们可做的只有相信。一个人可以有效地计算,但是却无法为计算的确实性找到绝对的证明,因为一切诸如“这是老师教我的”之类的解释最终会走到尽头:“如果有人教某个人学计算,那么是否也要教他:他能够依靠他老师的计算?但是这些说明到时候毕竟会走到尽头”,“难道验证不是终有个完结吗?”。在穷尽处,即基本信念领域,我们不可再问根据,而只需相信。
二、关于基本信念、确实性和世界图景
这些基本命题或基本信念首先包括,比如摩尔所说的“我有一只手”,或者“我是一个人”、“我有大脑”“地球在我出生之前很久就已存在”等等。对于这些命题,既无法说真,亦无法说假。而之所以如此,其中理由并不在于怀疑论者所提出的感觉经验的可骗性,或是摩尔提出的常识辩护,而仅仅在于,这些命题是我们生活中的基本信念,它们构成了其它信念之所以可能的基础。一般情况下,对于这些命题既无法谈“知道”,亦无法谈“出错”。在此意义上,这些命题是不可怀疑的。在这些基本信念上出问题,关涉的不是错误,而是精神问题。“如果我的朋友有一天想像他在某某地方已经住了很长一段时间,等等,等等,我不会把这件事叫做错误,而是叫做精神失常,也许是暂时性的精神失常。”以此类推,没有特殊理由的不知道他有一只手或他是一个人,也只能被归于精神失常。
这些基本信念来源于人们的生活共同体,来自人们习以为常、约定俗成的使用,来自“没有理由的行动方式”。由于这些信念规定了我们日常生活的基本框架,所以它们的反面在通常情况下是不可想象的。“表达摩尔所‘知道’的事物的命题都属于这样一类命题,即很难想像一个人为什么应当相信其反面。例如那个讲摩尔已经贴近地球生活了一辈子的命题。……我看到的和听到的所有事物都让我确信没有人曾远离地球。在我的世界图景中没有一件事物支持其反面的说法。” 这些命题是“一切思想(语言)运作的基础”,是“我们思想的框架”,是“我一切行动的基础”,以故,虽然维特根斯坦批评摩尔采取了错误的方式去维护常识,但摩尔的维护常识的态度的确为维特根斯坦所赞同。“维特根斯坦相信摩尔所列举的命题的程度绝不亚于摩尔本人。”
当然,这并不意味着这些命题具有自明的绝对的确实性,而只是因为既然我们处于共同体之中,我们便没有理由不相信,也不可能不相信。这些基本信念既然来自人类生活共同体,就必定是历史性的,有诞生有消灭。一些在这代人那里曾经是基本信念的,到了下代人就不一定还是基本信念。在此,维特根斯坦有一个极为生动的比喻,他将生活比作河流,而将基本信念比作通道或河床:“可以想像,一些经验命题得以凝结,对其后来凝结的,仍然是有流动性的命题起到作为通道的作用;也可以想像,随着时间的推移,上述关系将发生变化:曾经具有流动性的命题获知凝结,而曾经凝结了的命题,变得具有流动性”。“这种神话可能变为原来的流动状态,思想的河床可能移动。”
在维特根斯坦那里,并不存在绝对的确实性,确实性仅仅具有相对的含义,仅仅针对某一民族某一阶段的生活而言。在此意义上,确实性只是虚的东西:“确实性就像是一种语气,人们用这种语气肯定事态,但是人们并不是从语气中推导出这样说就有道理”。确信并不是推理的基础,而只是所有推理之可能进行的前提。依靠这种虚的确定性,人们才能建立起所有一般信念,并在其中做有效的推理。海德格尔也曾经向我们揭示出“虚”的重要性。他指出我们的文化往往并非关注实的东西,那些由实的东西承载的虚的东西才是关键。此在的意义在于虚的东西。种种虚的指引让人烦劳操心,虚的时间性结构是此在的本质结构。维特根斯坦和海德格尔在很多方面不一致,但却不约而同地指出了如下一点,即:人们往往刻意地努力去追求实在,却不知自己总已处身于虚之中。
而仅仅具有相对确实性的基本信念必定总已处于一个体系之中。在信念之流之中,河床的沉积或者被冲刷与流水相关。没有任何一个命题具有绝对的确定性,意味着没有任何一个命题能够被单独抽离来看——所有命题都属于一个相互依赖的体系。“某些经验命题的真实性(Wahrheit)属于我们的参照系(Bezugssystem)。”“使我认为明显无误的并不是一些单独的公理,而是一个前提与结论互相支持的体系。”“某个信念之所以占有稳固的地位,与其说是由于其本身显而易见或令人信服,倒不如说是靠其周围的信念才使它不可动摇。”“有关一种假设的一切检验、一切证实或否证都早已发生在一个体系之中。这个体系并不是我们进行一切论证时所采用的多少带有任意性或者不太可靠的出发点,而是属于我们称之为论证的本质。这个体系与其说是论证的出发点,不如说是赋予论证以生命的活力。”这个体系自身并不绝对确实,但是却构成相应人群生活的统一背景,是一切论证和检验可以生效的前提。换言之,这个体系是一个共同体的世界图景。对此维特根斯坦说道:“我有一个世界图景。这个世界图景是真还是假?最重要的在于它是我的一切探讨和断言的基础。那些描述它的命题并不是全都同样受到检验的制约。”
不同时代有着几乎完全不同的世界图景。在古希腊人那里,他们的祖先和奥林匹亚诸神以各种方式渗透了他们的生活;在中世纪的欧洲,上帝是最高的实在,存在地上之城和上帝之城两个世界;而在不信神的现代人眼前展现的,则是科学的客观的世界图景。即便是在同一时代,不同地域人们的世界图景亦有天差地别,比如当今美国人民与非洲某原始部落之世界图景的差别。甚至即便是在同一时代、同一地域的人们,也有可能拥有彼此相异的世界图景,比如基督徒与无神论者。在自然环境、社会、以及各种偶然因素的影响下,人们从各自的实践中沉淀出属于自己种群的独特的世界图景。而不同的世界图景意味着不同的基本信念体系,意味着不同的语法规则,并在此意义上无所谓优劣差等。身处某一世界图景之中的人们总是以自己的世界观为正确,并力图让处于其外的人们也接受它。维特根斯坦将这种世界图景等同于一种积极意义上的神话:“描述这幅世界图景的命题也许是一种神话的一部分,其功用类似于一种游戏的规则。这种游戏可从全靠实践而不是靠任何明确的规则学会。”
三、基本信念说意味着什么
1怀疑主义者的怀疑是非法的
维特根斯坦反对怀疑主义,但他的反对并非出于对绝对确实性的相信——像摩尔所以为的那样。维特根斯坦只承认一种相对的确定性,但相对的确定性将并不导致怀疑主义,而恰恰将揭示出,怀疑论者所说的怀疑是没有意义的。我们向来总已生活在一个统一背景之中,基本信念规定了我们思想和语言的框架,在此意义上,要想进行彻底怀疑是根本不可能的。“如果你想怀疑一切,你就什么也不能怀疑。怀疑这种游戏本身就预先假定了确实性。”“如果你什么事实也不确知,那么你也就不能确知你所用的词的意义。”“怀疑出现在信念之后。”“我知道”是怀疑之可能的基础。若不能说“我知道”,就不能说“我怀疑”。“对于一种存在的怀疑只能在一种语言游戏中进行。”“一种怀疑一切的怀疑就不成其为怀疑。”“这表明不容怀疑属于语言游戏的本质”,而语言游戏归根结底乃是一种生活形式,“因为行动才是语言游戏的根基”。“我们不怀疑所有这些事实只是我们的判断方式,因而也就是我们的行为方式。”
事实上,康德所说的“哲学和普遍人类理性的丑闻”直接来自休谟的怀疑论。而维特根斯坦之所以能够成功地抵制休谟的怀疑论,其原因恰恰在于维特根斯坦在一定程度上承认了休谟的前提,即因果关系本不是必然的,我们日常以为真的只是些暂时固定下来的信念,并不必然真。但是,正是在此意义上,跳出基本信念的圈子去绝对怀疑才是不可能的。人无法离开生活之流而在地面上进行观察,因为这样的地面根本就不存在。而摩尔对怀疑主义不恰当的反驳透露出,摩尔其实既不知道“知道”,也不知道“怀疑”。
2自笛卡儿以来的对知识确定性的追求被宣布为无效
在《第一哲学沉思集》中,笛卡儿致力于通过彻底怀疑找出人类知识的最后支点,即我们能够绝对确信的东西:“我思故我在”。笛卡儿相信由此他便可以重建人类知识大厦,并最终克服怀疑主义。而在维特根斯坦看来,根本上说,是因为笛卡儿非法地使用了怀疑概念,才构建出所谓绝对确信的东西。而事实是,我们始终在生活的河流之中,所能触及的只能是暂时或者相对持久地沉积下来的河床。我们无法怀疑这些沉淀下来的东西,因为它们是我们的怀疑之所以可能的基础,在此意义上,它们是确实性命题。但这并不意味着这些沉淀下来的东西具有永恒的真理性,具有绝对的确实性。并且,这些确实性命题无法被单独抽离来看,因为它们属于一个相互依赖的体系,属于一个统一的世界图景。由此,“维特根斯坦在这里最有力地抨击了笛卡儿以来认识论只顾追求某种‘完全确实’的东西这一错误方向” 。
由此,维特根斯坦消解了哲学家对绝对确信的信仰。自笛卡儿以来的对知识确定性的追求被宣布为无效。在此意义上,连同他们为知识确定性找到的保障(唯理论者斯宾诺莎的作为最高理性的上帝,经验论者洛克的感觉经验基础),都失去了意义。笛卡儿向人们指出的知识确定性能够给人以安全感,它令人们相信自己处于一栋十足稳固的知识大厦之中。而维特根斯坦让人们重新认识到,他们其实仍旧身处生活之河流中,这河流有的只是相对稳固的河床。
3康德对分析命题和综合命题的区分是无意义的
对知识确定性的消解,意味着康德对分析命题和综合命题的区分是无意义的。康德曾经这样区分分析命题和综合命题,即分析命题指像数学和逻辑命题那样相对于任何经验事实其值皆恒为真的命题,而综合命题则指像经验科学命题那样其值取决于经验事实的命题。而在维特根斯坦的河流比喻中,即便是分析命题,也仅仅只能充当暂时性的或者相对持久的河床。2*2=4并非像康德所认为的那样永恒真。“‘2*2=4’是一个正确的算术命题——不是‘在特殊场合下’,也不是‘永远’——但是说出的或写出的‘2*2=4’这个公式在中文中也许可以有一种不同的意义或者是完全无意义的胡说,由此可以看出这个命题只有在使用时才有意义。”维特根斯坦认为,并不存在独立于人和独立于人之计算学习的所谓计算本质。计算归根结底是一种使用,并且仅仅因人们的使用才慢慢硬化为语法规则。“我们是通过学习计算而得以知道计算的本质(Wesen)的。”“但是这样一来难道对于我们怎样确信计算的可靠性就不能加以描述了吗?噢,确实是这样。”“人们就是这样计算的。计算就是这样。这就是我们(比如说)在学校学会的东西。忘掉这种超验的确实性吧,因为它同你的精神的概念关联在一起。”“即使这次计算对我来说是已经确定的东西,这也仅仅是一种为了达到实用目的而采取的决定。”由此,计算首先服务于实用目的,而非自身绝对确实,在此意义上,根本不存在所谓绝对正确的“天赋观念”。而人们对永远可靠的计算和尚未确定的计算的区分,也只是“一种逻辑上的区别”——这就意味着,在本质上没有差别。它们都不绝对确实,而只是就人类共同体的语法规则而言具有相对的确实性。
奎因曾在其著名论文《经验论的两个教条》中提出相似观点。“他指出,在现实中,即便是一直以来被视为具有确定性的数学和逻辑命题,也存在着因其为伪命题而被合理地加以抛弃的情况;即便是经验科学命题,也可能存在无论在任何情况下都将其视为真而合理地继续加以使用的情况,因此,必然的分析命题与偶然的综合命题这两者间的界限,是流动不居的。” 奎因的这篇论文与维特根斯坦的《论确定性》大致完成于同一时期,其中观点也与《论确定性》有着惊人的相似。然而具有讽刺意味的却是,从60年代后期开始,维特根斯坦对英语圈哲学的影响出现了明显的衰落之势,而取而代之的正是奎因的哲学。
4知识、信念与谎言
基本信念还意味着,知识亦不过是一种信念。信念与知识对应的是同一种“心灵状态”(Seelenzustaende)。“认为与‘相信’和 ‘知道’这些词相对应的必然是些不同的心灵状态,这就好像人们相信与‘我’这个词和‘路德维希’这个名字相对应的因概念的不同而必然是不同的人一样。” (同上)一种“知道”既然以基本信念为前提,而基本信念又是没有根据的,那么知识归根结底也只是信念而已,同信念一样有其诞生和消灭,是有朽的。而信念之有朽意味着什么?尼采在其《敌基督者》一书中认为,信念与谎言并无实质差别。“每个信念都拥有其历史,拥有其原始形式、尝试阶段和错误:在它成为信念之前,它很长时间都不是信念,更长时间后几乎不可能成为信念。”“父亲所谓的谎言,在儿子那儿变成了信念。” 由此,信念打破了知识(真理)与谎言之间的严格对立:这世上本无所谓真理,信的人多了,就成了真理;这世上也本无所谓谎言,不信的人多了,就成了谎言。
海德格尔在《存在与时间》中揭示了此在的存在状态:此在往往在种种因缘际会中自以为“知”,却在所有因缘中断之时、在此在自身面前、在巨大的空无面前方觉出自己一无所知。此在“茫然失其所在” ,此在一头撞进空无。知背后隐藏的是一无所知,而此在一旦意识到自己一无所知,所知的一切就都立刻失去意义。作为因缘整体和意蕴结构的世界陷落,并开始变得无关紧要。不过,海德格尔对此在“畏”之状态的揭示,在维特根斯坦那里或许是无意义的。我们向来生活在人类共同体之中,对我们有意义的仅仅是这个共同体所习以为常的种种“知”,而我们根本无法追问超出共同体、超出日常用法的领域。“通常关于世界的实在性的断言实际上就是关于这样的世界的实在性的断言,通常所谓对于世界的认识也只是对于这样的世界的认识。至于独立于人们的概念框架或表现手段的(进而独立于人的)世界本身究竟是什么样子的,人们根本不可能知道(当然,这并不是说这样的世界不存在);甚至于,这样的问题根本没有任何意义。”
并且,维特根斯坦指出,不同的信念之间仍然存在区别。充当信念之流的河床或通道的基本信念,有的像岩石一般坚硬,有的则如同随时会被冲走的泥沙:“那条河流的岸边一部分是不发生变化或者变化小得令人察觉不到的坚硬的岩石,另一部分是随时随地被水冲走或者淤积下来的泥沙”。只不过,那些坚硬的岩石亦仅仅就河流而言,并非绝对真理。
从无根据的信念那里,尼采返回大地,海德格尔返回此在的存在本身,维特根斯坦返回人的日常生活。不同的是,在尼采那里,真正能做到返回大地的只有超人;在海德格尔那里,本真的向死存在始终作为一种可能性召唤人们痛下决心;而维特根斯坦所告诉人们的,仅仅是日常生活本身。他抵制了做形而上学家、做教导者的诱惑,而这诱惑对于古往今来的几乎所有哲学家来说,都似乎是无法抗拒的。
结论
在《论确实性》一书中,维特根斯坦指出了对摩尔对怀疑主义的反驳之不得要领,并进一步指出了怀疑主义者之怀疑在何种意义上才是不合法的。反对怀疑主义,并不意味着相信一种绝对确实性;恰恰相反,正是一种只具有相对确实性的基本信念体系、语言游戏规则、统一世界图景决定了彻底怀疑之不可能。维特根斯坦认为,这些无根据的基本信念来自人类共同体的生活,根据不同共同体的生活,可能形成不同的语言游戏、世界图景,但是却根本不存在哲学家所追求的所谓绝对真理。在此意义上,维特根斯坦的言说止于日常生活,而拒绝再做任何传统形而上学的演绎。
Monday, October 18, 2010
内存杂碎
编译时分配内存 ---------------
楼上说的对的,编译时是不分配内存的。此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确。所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误。
运行时分配内存 ---------------
这是对的,运行时程序是必须调到“内存”的。因为CPU(其中有多个寄存器)只与内存打交道的。程序在进入实际内存之前要首先分配物理内存。
编译过程 --------------
只能简单说一下,因为如果要详细的话,就是一本书了《编译原理》。编译器能够识别语法,数据类型等等。然后逐行逐句检查编译成二进制数据的obj文件,然后再由链接程序将其链接成一个EXE文件。此时的程序是以EXE文件的形式存放在磁盘上。
运行过程 --------------
当执行这个EXE文件以后,此程序就被加载到内存中,成为进程。此时一开始程序会初始化一些全局对象,然后找到入口函数(main()或者WinMain()),就开始按程序的执行语句开始执行。此时需要的内存只能在程序的堆上进行动态增加/释放了。
--http://zhidao.baidu.com/question/41868474.html?fr=qrl&cid=866&index=1&fr2=query
编译其实只是一个扫描过程,进行词法语法检查,代码优化而已,编译程序越好,程序运行的时候越高效。 我想你说的“编译时分配内存”是指“编译时赋初值”,它只是形成一个文本,检查无错误,并没有分配内存空间。 当你运行时,系统才把程序导入内存。一个进程(即运行中的程序)在主要包括以下五个分区: 栈、堆、bss、data、code 代码(编译后的二进制代码)放在code区,代码中生成的各种变量、常量按不同类型分别存放在其它四个区。系统依照代码顺序执行,然后依照代码方案改变或调用数据,这就是一个程序的运行过程。
--http://zhidao.baidu.com/question/41868474.html?fr=qrl&cid=866&index=1&fr2=query
我对于C++动态绑定的理解,一句话,就是编译器用静态分析的方法加上虚拟函数的设计实现在程序运行时动态 智能执行正确虚拟函数的技术。因此要彻底理解动态绑定技术,只需要掌握两点,一是编译器的静态编译过程,二是 虚拟函数的基本知识。只要有了这两点理解,任何动态绑定的分析都是很容易的。 下面就以例子代码说明:
#include
using namespace std;
class A
...{
public:
void fA() ...{ cout << "A::fA()" << endl; }
virtual void vfA() ...{ cout << "A::vfA()" << endl; }
void emptyB() ...{ cout << "A::emptyB()" << endl; }
void vfAonly() ...{ cout << "A::vfAonly()" << endl; }
};
class B : public A
...{
public:
void fB() ...{ cout << "B::fB()" << endl; }
virtual void vfA() ...{ cout << "B::vfA()" << endl; }
virtual void vfB() ...{ cout << "B::vfB()" << endl; }
void emptyA() ...{ cout << "B::emptyA()" << endl; }
virtual void vfAonly() ...{ cout << "B::vfAonly()" << endl; }
};
int main()
...{
A* p = new B;
B& r = *(B*)p;
p->fA(); // 1
//p->fB(); // 2
p->vfA(); // 3
//p->vfB(); // 4
//p->emptyA(); // 5
p->emptyB(); // 6
p->vfAonly(); // 7
cout << endl;
r.fA(); // 8
r.fB(); // 9
r.vfA(); // 10
r.vfB(); // 11
r.emptyA(); // 12
r.emptyB(); // 13
r.vfAonly(); // 14
delete p;
return 0;
}
输出结果:
A::fA()
B::vfA()
A::emptyB()
A::vfAonly()
A::fA()
B::fB()
B::vfA()
B::vfB()
B::emptyA()
A::emptyB()
B::vfAonly()
分析: 我们通过模拟编译器的编译过程来进行解释。只看编译器是怎么编译带有标号的那些函数调用的行的。 行1. 在编译器眼中,p就是一个纯粹的A类指针,跟他指向的B类对象没有任何联系。因此,当看到 p->fA()时,编译器便去A的定义中寻找fA,找到了,于是生成调用代码。 行2. 这行如果不被注释,编译器去A的定义中寻找定义fB,但是找不到这个名字,便会输出错误信息。 行3. 编译器继续去A定义中寻找vfA,这次找到了,而且发现关键字virtual,于是,采用虚拟函数调用 代码生成技术,根据vfA的偏移值,生成代码调用虚拟函数表中该偏移值指向的函数。特别指出的 是,在静态编译期间,编译器只知道偏移值,并不知道运行时该偏移到底指向什么函数。实际效果 是,因为运行时,p指向的是B对象,因此调用的是B的虚拟函数vfA(). 行4. 这行如果不被注释,编译器去A的定义中寻找名字vfB,找不到,出错。记住第一条原则,编译器 是静态编译,不知道p和类B有联系。 行5. 同4,找不到名字emptyA。 行6. 简单,找到名字emptyB. 行7. 简单,找到名字vfAonly。 行8. 从这里开始,函数由B类引用r调用。在编译器眼中,r就是一个纯粹的B类引用,他不假设r和A有任何 关系。因此这一行,编译器去B类定义寻找名字fA。由于B继承自A,包括所有A的public函数定义, 编译器成功找到A::fA。 行9. 类似行8,找到B自身的函数定义fB。 行10. 类似行3,编译器生成代码调用虚拟函数表某偏移指向的函数。运行时该偏移指向B::vfA. 行11. 编译器生成代码调用虚拟函数表某偏移指向的函数。运行时该偏移指向B::vfB. 行12. 简单,找到名字emptyA. 行13. 简单,找到名字A::emptyB. 因为B继承自A。 行14. 编译器生成代码调用虚拟函数表某偏移指向的函数。运行时该偏移指向B::vfAonly. 为什么编译器知道 指向的是B的虚拟函数vfAonly而不是A的非虚拟函数呢?这跟另一个静态编译规则,名字隐藏,有关。 继承类的作用域中如果有基类的同名函数,继承类中的名字将隐藏基类同名函数,因此这时,编译器看 不见A::vfAonly--http://zhidao.baidu.com/question/36832319.html?si=1
所谓绑定是指,对于参与多态行为的类型,他们具有多态行为的接口是在公共基类的设计中就预先确定的。而非绑定则对于参与多态行为的类型,他们的接口没有预先定义。 在C++中通过继承实现的多态是动态绑定,通过模板实现的多态是静态绑定。动态绑定的接口是在运行期间(动态)完成的,静态绑定的接口是在编译期间(静态)完成的 --http://zhidao.baidu.com/question/16751113.html?si=5
在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。
要点:
堆:顺序随意
栈:先进后出
堆和栈的区别
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放(就会造成内存泄漏的问题),程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(data), 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(BSS,Block Started by Symbol)。 - 程序结束后有系统释放(在整个程序的执行过程中都是有效的)
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 (文字常量区内的数据可以修改吗?)
5、程序代码区(code)—存放函数体的二进制代码。
二、例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈 //abc是在栈里面,而下面的123456\0却在在常量区内,要注意这两种情况的区别
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 (所谓的优化是什么意思,是指P1和P2指向的是同一块内存吗?)
}
二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的。
2.2 申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会 遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内 存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大 小,系统会自动的将多余的那部分重新放入空闲链表中。
2.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数 据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因 此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
2.4申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活
2.5堆和栈中的存储内容
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由 右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。 当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
2.6存取效率的比较
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。
2.7小结:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗
菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
堆和栈的区别主要分:
操作系统方面的堆和栈,如上面说的那些,不多说了。
还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。
虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。
----http://blog.csdn.net/yulaotou/archive/2009/09/21/4577879.aspx
楼上说的对的,编译时是不分配内存的。此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确。所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误。
运行时分配内存 ---------------
这是对的,运行时程序是必须调到“内存”的。因为CPU(其中有多个寄存器)只与内存打交道的。程序在进入实际内存之前要首先分配物理内存。
编译过程 --------------
只能简单说一下,因为如果要详细的话,就是一本书了《编译原理》。编译器能够识别语法,数据类型等等。然后逐行逐句检查编译成二进制数据的obj文件,然后再由链接程序将其链接成一个EXE文件。此时的程序是以EXE文件的形式存放在磁盘上。
运行过程 --------------
当执行这个EXE文件以后,此程序就被加载到内存中,成为进程。此时一开始程序会初始化一些全局对象,然后找到入口函数(main()或者WinMain()),就开始按程序的执行语句开始执行。此时需要的内存只能在程序的堆上进行动态增加/释放了。
--http://zhidao.baidu.com/question/41868474.html?fr=qrl&cid=866&index=1&fr2=query
编译其实只是一个扫描过程,进行词法语法检查,代码优化而已,编译程序越好,程序运行的时候越高效。 我想你说的“编译时分配内存”是指“编译时赋初值”,它只是形成一个文本,检查无错误,并没有分配内存空间。 当你运行时,系统才把程序导入内存。一个进程(即运行中的程序)在主要包括以下五个分区: 栈、堆、bss、data、code 代码(编译后的二进制代码)放在code区,代码中生成的各种变量、常量按不同类型分别存放在其它四个区。系统依照代码顺序执行,然后依照代码方案改变或调用数据,这就是一个程序的运行过程。
--http://zhidao.baidu.com/question/41868474.html?fr=qrl&cid=866&index=1&fr2=query
我对于C++动态绑定的理解,一句话,就是编译器用静态分析的方法加上虚拟函数的设计实现在程序运行时动态 智能执行正确虚拟函数的技术。因此要彻底理解动态绑定技术,只需要掌握两点,一是编译器的静态编译过程,二是 虚拟函数的基本知识。只要有了这两点理解,任何动态绑定的分析都是很容易的。 下面就以例子代码说明:
#include
using namespace std;
class A
...{
public:
void fA() ...{ cout << "A::fA()" << endl; }
virtual void vfA() ...{ cout << "A::vfA()" << endl; }
void emptyB() ...{ cout << "A::emptyB()" << endl; }
void vfAonly() ...{ cout << "A::vfAonly()" << endl; }
};
class B : public A
...{
public:
void fB() ...{ cout << "B::fB()" << endl; }
virtual void vfA() ...{ cout << "B::vfA()" << endl; }
virtual void vfB() ...{ cout << "B::vfB()" << endl; }
void emptyA() ...{ cout << "B::emptyA()" << endl; }
virtual void vfAonly() ...{ cout << "B::vfAonly()" << endl; }
};
int main()
...{
A* p = new B;
B& r = *(B*)p;
p->fA(); // 1
//p->fB(); // 2
p->vfA(); // 3
//p->vfB(); // 4
//p->emptyA(); // 5
p->emptyB(); // 6
p->vfAonly(); // 7
cout << endl;
r.fA(); // 8
r.fB(); // 9
r.vfA(); // 10
r.vfB(); // 11
r.emptyA(); // 12
r.emptyB(); // 13
r.vfAonly(); // 14
delete p;
return 0;
}
输出结果:
A::fA()
B::vfA()
A::emptyB()
A::vfAonly()
A::fA()
B::fB()
B::vfA()
B::vfB()
B::emptyA()
A::emptyB()
B::vfAonly()
分析: 我们通过模拟编译器的编译过程来进行解释。只看编译器是怎么编译带有标号的那些函数调用的行的。 行1. 在编译器眼中,p就是一个纯粹的A类指针,跟他指向的B类对象没有任何联系。因此,当看到 p->fA()时,编译器便去A的定义中寻找fA,找到了,于是生成调用代码。 行2. 这行如果不被注释,编译器去A的定义中寻找定义fB,但是找不到这个名字,便会输出错误信息。 行3. 编译器继续去A定义中寻找vfA,这次找到了,而且发现关键字virtual,于是,采用虚拟函数调用 代码生成技术,根据vfA的偏移值,生成代码调用虚拟函数表中该偏移值指向的函数。特别指出的 是,在静态编译期间,编译器只知道偏移值,并不知道运行时该偏移到底指向什么函数。实际效果 是,因为运行时,p指向的是B对象,因此调用的是B的虚拟函数vfA(). 行4. 这行如果不被注释,编译器去A的定义中寻找名字vfB,找不到,出错。记住第一条原则,编译器 是静态编译,不知道p和类B有联系。 行5. 同4,找不到名字emptyA。 行6. 简单,找到名字emptyB. 行7. 简单,找到名字vfAonly。 行8. 从这里开始,函数由B类引用r调用。在编译器眼中,r就是一个纯粹的B类引用,他不假设r和A有任何 关系。因此这一行,编译器去B类定义寻找名字fA。由于B继承自A,包括所有A的public函数定义, 编译器成功找到A::fA。 行9. 类似行8,找到B自身的函数定义fB。 行10. 类似行3,编译器生成代码调用虚拟函数表某偏移指向的函数。运行时该偏移指向B::vfA. 行11. 编译器生成代码调用虚拟函数表某偏移指向的函数。运行时该偏移指向B::vfB. 行12. 简单,找到名字emptyA. 行13. 简单,找到名字A::emptyB. 因为B继承自A。 行14. 编译器生成代码调用虚拟函数表某偏移指向的函数。运行时该偏移指向B::vfAonly. 为什么编译器知道 指向的是B的虚拟函数vfAonly而不是A的非虚拟函数呢?这跟另一个静态编译规则,名字隐藏,有关。 继承类的作用域中如果有基类的同名函数,继承类中的名字将隐藏基类同名函数,因此这时,编译器看 不见A::vfAonly--http://zhidao.baidu.com/question/36832319.html?si=1
所谓绑定是指,对于参与多态行为的类型,他们具有多态行为的接口是在公共基类的设计中就预先确定的。而非绑定则对于参与多态行为的类型,他们的接口没有预先定义。 在C++中通过继承实现的多态是动态绑定,通过模板实现的多态是静态绑定。动态绑定的接口是在运行期间(动态)完成的,静态绑定的接口是在编译期间(静态)完成的 --http://zhidao.baidu.com/question/16751113.html?si=5
在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。
要点:
堆:顺序随意
栈:先进后出
堆和栈的区别
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放(就会造成内存泄漏的问题),程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(data), 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(BSS,Block Started by Symbol)。 - 程序结束后有系统释放(在整个程序的执行过程中都是有效的)
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 (文字常量区内的数据可以修改吗?)
5、程序代码区(code)—存放函数体的二进制代码。
二、例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈 //abc是在栈里面,而下面的123456\0却在在常量区内,要注意这两种情况的区别
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 (所谓的优化是什么意思,是指P1和P2指向的是同一块内存吗?)
}
二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的。
2.2 申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会 遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内 存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大 小,系统会自动的将多余的那部分重新放入空闲链表中。
2.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数 据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因 此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
2.4申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活
2.5堆和栈中的存储内容
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由 右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。 当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
2.6存取效率的比较
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。
2.7小结:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗
菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
堆和栈的区别主要分:
操作系统方面的堆和栈,如上面说的那些,不多说了。
还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。
虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。
----http://blog.csdn.net/yulaotou/archive/2009/09/21/4577879.aspx
Tuesday, October 12, 2010
编译原理学习导论
转自 四川大学唐良
CSDN
大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决著名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间诞生不少名著的相关数论。
推荐参考书
虽然编译理论发展到今天,已经有了比较成熟的部分,但是作为一个大学生来说,要自己写出一个像Turboc C,Java那样的编译器来说还是太难了。不仅写编译器困难,学习编译原理这门课程也比较困难。
正是因为编译原理学习相对困难,那么就要求有好的教师和好的教材。教师方面不是我们能自己更改的,而在教材方面我们却可以按自己的意愿来阅读。我下面推荐几本好的编译原理的教材。我推荐的书籍都是国外的经典教材,因为在国内的教材中,确实还没发现什么让人满意的。
第一本书的原名叫《Compilers Principles,Techniques,and Tools》,另外一个响亮的名字就是龙书。原因是这本书的封面上有条红色的龙,也因为这本书在编译原理基础领域确实太有名气了,所以很多国外的学者都直接取名为龙书。最近机械工业出版社已经出版了此书的中文版,名字就叫《编译原理》。该书出的比较早,大概是在85或86年编写完成的,作者之一还是著名的贝尔实验室的科学家。里面讲解的核心编译原理至今都没有变过,所以一直到今天,它的价值都非凡。这本书最大的特点就是一开始就通过一个实际的小例子,把编译原理的大致内容罗列出来,让很多编译原理的初学者很快心里有了个底,也知道为什么会有这些理论,怎么运用这些理论。而这一点是我感觉国内的教材缺乏的东西,所以国内的教材都不是写给愿意自学的读者,总之让人看了半天,却不知道里面的东西有什么用。
第二本书的原名叫《Modern Compiler Design》,中文名字叫做《现代编译程序设计》。该书由人民邮电出版社所出。此书比较关注的是编译原理的实践,书中给出了不少的实际程序代码,还有很多实际的编译技术问题等等。此书另外一个特点就是其“现代”而字。在传统的编译原理教材中,你是不可能看到如同Java中的“垃圾回收”等算法的。因为Java这样的解释执行语言是在近几年才流行起来的东西。如果你想深入学习编译原理的理论知识,那么你肯定得看前面那本龙书,如果你想自己动手做一个先进的编译器,那么你得看这本《现代编译程序设计》。
第三本书就是很多国内的编译原理学者都推荐的那本《编译原理及实践》。或许是这本书引入国内比较早吧,我记得我是在高中就买了这本书,不过也是在前段时间才把整本书看完。此书作为入门教程也的确是个不错的选择。书中给出的编译原理讲解也相当细致,虽然不如前面的龙书那么深入,但是很多地方都是点到为止,作为大学本科教学已经是十分深入了。该书的特点就是注重实践,不过感觉还不如前面那本《现代编译程序设计》的实践味道更重。此书的重点还是在原理上的实践,而非前面那本那样的技术实践。《编译原理及实践》在讲解编译原理的各个部分的同时,也在逐步实践一个现代的编译器Tiny C.等你把整本书看完,差不多自己也可以写一个Tiny C了。作者还对Lex和Yacc这两个常用的编译相关的工具进行了很详细的说明,这一点也是很难在国内的教材中看到的。
推荐了这三本教材,都有英文版和中文版的。很多英文好的同学只喜欢看原版的书,不我的感觉是这三本书的翻译都很不错,没有必要特别去买英文版的。理解理论的实质比理解表面的文字更为重要。
编译原理的实质
前面已经说过,学习编译原理其实也就是学习算法而已,没什么特别的。只不过这些算法的产生已经形成了一套理论。下面我来看看编译原理里面到底有什么高深的理论吧。
几乎每本编译原理的教材都是分成词法分析,语法分析(LL算法,递归下降算法,LR算法),语义分析,运行时环境,中间代码,代码生成,代码优化这些部分。其实现在很多编译原理的教材都是按照85,86出版的那本龙书来安排教学内容的,所以那本龙书的内容格式几乎成了现在编译原理教材的定式,包括国内的教材也是如此。一般来说,大学里面的本科教学是不可能把上面的所有部分都认真讲完的,而是比较偏重于前面几个部分。像代码优化那部分东西,就像个无底洞一样,如果要认真讲,就是单独开一个学期的课也不可能讲得清楚。所以,一般对于本科生,对词法分析和语法分析掌握要求就相对要高一点了。
词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显,就是要让词法分析从程序上升到理论的地步。
语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法,LL自顶向下算法和LR自底向上算法。LL算法还好说,到了LR算法的时候,困难就来了。很多自学编译原理的都是遇到LR算法的理解成问题后就放弃了自学。其实这些东西都是只要大家理解就可以了,又不是像词法分析那样非得自己写出来才算真正的会。像LR算法的语法分析器,一般都是用工具Yacc来生成,实践中完全没有比较自己来实现。对于LL算法中特殊的递归下降算法,因为其实践十分简单,那么就应该要求每个学生都能自己写。当然,现在也有不少好的LL算法的语法分析器,不过要是换在非C平台,比如Java,Delphi,你不能运用YACC工具了,那么你就只有自己来写语法分析器。
等学到词法分析和语法分析时候,你可能会出现这样的疑问:“词法分析和语法分析到底有什么?”就从编译器的角度来讲,编译器需要把程序员写的源程序转换成一种方便处理的数据结构(抽象语法树或语法树),那么这个转换的过程就是通过词法分析和语法分析的。其实词法分析并非一开始就被列入编译器的必备部分,只是我们为了简化语法分析的过程,就把词法分析这种繁琐的工作单独提取出来,就成了现在的词法分析部分。除了编译器部分,在其它地方,词法分析和语法分析也是有用的。比如我们在DOS,Unix,Linux下输入命令的时候,程序如何分析你输入的命令形式,这也是简单的应用。总之,这两部分的工作就是把不“规则”的文本信息转换成一种比较好分析好处理的数据结构。那么为什么编译原理的教程都最终把要分析的源分析转换成“树”这种数据结构呢?数据结构中有Stack, Line,List…这么多数据结构,各自都有各自的特点。但是Tree这种结构有很强的递归性,也就是说我们可以把Tree的任何结点Node提取出来后,它依旧是一颗完整的Tree。这一点符合我们现在编译原理分析的形式语言,比如我们在函数里面使用函树,循环中使用循环,条件中使用条件等等,那么就可以很直观地表示在Tree这种数据结构上。同样,我们在执行形式语言的程序的时候也是如此的递归性。在编译原理后面的代码生成的部分,就会介绍一种堆栈式的中间代码,我们可以根据分析出来的抽象语法树,很容易,很机械地运用递归遍历抽象语法树就可以生成这种指令代码。而这种代码其实也被广泛运用在其它的解释型语言中。像现在流行的Java,.NET,其底层的字节码bytecode,可以说就是这中基于堆栈的指令代码的。
关于语义分析,语法制导翻译,类型检查等等部分,其实都是一种完善前面得到的抽象语法树的过程。比如说,我们写C语言程序的时候,都知道,如果把一个浮点数直接赋值给一个整数,就会出现类型不匹配,那么C语言的编译器是怎么知道的呢?就是通过这一步的类型检查。像C++语言这中支持多态函数的语言,这部分要处理的问题就更多更复杂了。大部编译原理的教材在这部分都是讲解一些比较好的处理策略而已。因为新的问题总是在发生,旧的办法不见得足够解决。
本来说,作为一个编译器,起作用的部分就是用户输入的源程序到最终的代码生成。但是在讲解最终代码生成的时候,又不得不讲解机器运行环境等内容。因为如果你不知道机器是怎么执行最终代码的,那么你当然无法知道如何生成合适的最终代码。这部分内容我自我感觉其意义甚至超过了编译原理本身。因为它会把一个计算机的程序的运行过程都通通排在你面前,你将来可能不会从事编译器的开发工作,但是只要是和计算机软件开发相关的领域,都会涉及到程序的执行过程。运行时环境的讲解会让你更清楚一个计算机程序是怎么存储,怎么装载,怎么执行的。关于部分的内容,我强烈建议大家看看龙书上的讲解,作者从最基本的存储组织,存储分配策略,非局部名字的访问,参数传递,符号表到动态存储分配(malloc,new)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成。
关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在《编译原理及实践》的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术,其实另外还有本叫做《Advance Compiler Desgin and Implement》,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本《Advance Compiler Desgin and Implement》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢?
关于实践
编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课关注讲解其基本理论。但是计算机科学本身就是一门实践性很强的课程,如果能够学以致用,那才叫真正的学会。李阳在讲解疯狂英语的时候就说到,只要当你会实际中运用一个单词一个词组的时候你才能叫学会了这个单词或者词组,而不是只是知道了它的拼写和意思。其实任何学习都是一样的,如果缺少了实践的结合,你不能算学会。
编译原理的课程主要就是讲解编译器产生的理论和原理,那么很简单,自己写个编译器就是最好的实践过程了。不过你得小心,编译系统可能是所有软件系统中最复杂的系统之一,不然为什么大学里面还会把编译器的编写开成一门叫做编译原理的课程来讲?我很佩服那些学了操作系统原理就开始自己写操作系统,学了编译原理就开始自己写编译器的人们,确实,在中国,敢这么做的学生太少了。且不管你这样做能不能做成功,至少有了这个尝试,会让你的程序设计,系统规划安排的功底增进不少。我下面给出一些关于实践过程中可能会遇到的困难,希望能够在你陷入困境的前帮你一把。
1. Lex和Yacc. 这两工具是作为词法分析很语法分析的工具。如果你自己写一个编译器,我十分不建议你连词法分析这种事情都亲手来写。Lex和Yacc应该是作为每本编译原理的教材的必备内容,可是在国内的教材中缺很少看到。这两个工具是Unix系统下的小东西,如果你要在Windows中运用,那么你最好去下在cygwin这个软件。它是个在Windows下模拟Unix的东东,里面就包含了flex.exe和bison.exe(yacc)这两个工具.这两个工具使用起来还挺麻烦的(其实unix 下的很多十分有用的工具都是这样), 不过在《编译原理与实践》这本书上对于这两个工具的讲解十分详细,还列举了不少实际的例子。
2. 做解释型语言比做生成机器代码的编译器简单。虽然说,做解释型的编译器,像Java那样的,你还得自己去写解释器,不过这样你就不必去查找机器代码的资料了。如果你做生成的最终机器代码编译器可能会遇到问题还有就是寄存器为基础的代码生成方法。前面说过,如果你生成的是以堆栈为基础的代码,那么其代码生成过程十分简单,需要考虑的东西也不多,如果你考虑最终的机器代码生成的话,你必须考虑机器的寄存器如何分配等麻烦的问题。
3. 考虑用别人已经生成的语法文件,尽量不要自己动手写词法文件和语法文件.以前一个朋友曾经说过,写出一个好的程序语言的语法定义,就几乎完成了一个编译器的一半.确实是这样,语法文件的编写是个很难的事情.现在网上到处都可以找到比如C语言,C++,Java, Tiny C,Minus C等语言的词法文件和语法文件,你完全可以自己下下来来用.
在《编译原理及实践》的书中,作者给出了一个Tiny C的全部代码.我自我感觉作者的这个编译器做得很不错,相对于其它php,perl等语言的源代码来说,简单得多,容易看懂,而且很清晰地展现了一个完成的编译系统的实现过程.其源代码可以在作者的网站上下载.
后话
编译原理的学习可能算是一个困难的历程,特别是对于那些不对编译系统感兴趣的同学来说.既然它已经作为了大学本科的必修课程,那么就说明的它引申出来的一套理论在整个计算机科学领域还是占有相对重要的地位.
如果我们考究一下历史,就会发现很多被称为程序设计大师的人都是编译领域的高手.写出第一个微型机上运行的Basic语言的比尔盖茨,设计出Delphi的Borland的”世界上最厉害的程序员”, Sun的JAVA之父, 贝尔实验室的C++之父…
附一篇:
编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易懂的。 从笔者学习实践来看,第一次学了一个多月,理论部分一知半解,第二次学了一星期,基本看懂词法分析的理论部分,语法分析就一知半解了,第三次学了一星期,才基本看懂词法分析和语法分析.由此看来,这门课确实有难度.网上有的帖子,把编译器的编写搞得高深莫测一般,似乎难度极大,非常人能及. 编译原理究竟难在哪里?笔者的体会,主要在这几点: 1.错误认识: 很多人以为编译原理只能应用在写程序语言的编译器上,觉得用处不大,学习兴趣不高.而且可能觉得写编译器就必须完全手工来写. 2.自动机理论: 象NFA,DFA之类,比较抽象,要费些脑子,特别如果学离散数学时没有学自动机理论的话,更是需要多花点时间. 3.集合论的推演: 主要是一些闭包运算之类,数学基础不好的话,学起来也会感到吃力. 4.LR文法: 主要是又引入了自动机 不管哪本编译教材,即使是绝对经典”龙书”也不例外,都要涉及到这几个难点.由于这些内容本身不好懂,作者有再大的本事,也很难把书写得象小说那么流畅好懂. 明确了难点,接着想对策.大致有这么几种: 1.端正认识: 编译原理在静态文本处理上有广泛的应用,举个简单的例子,把HTML文件转化为纯文本,利用编译原理来实现”非常”简单.理解了编译原理的实用性,大概可以提高学习兴趣. 2.反复看书: 这个办法看起来最笨,却是基本的方法.忘了是哪位名人说过,书只要多看,总能看得懂的. 3.结合源码来看: 这是经典教材Compiler Design in C的作者Allen Hollub建议的方法.这本教材的特色就是包含了大段yacc,lex的代码.这也是个好方法,而且,只有看懂了代码,才能说在根本上理解了理论.当然,要完全看懂yacc的代码,工作量是很大的,而且同样要先理解理论. 4.删繁就简,避重就轻.网上流传较广的一篇《编译原理学习导论》(作者四川大学唐良)就基本是这种思路,对于词法分析,作者避免了自动机理论和集合论推演的介绍,直接搬出源码来,大大降低了理解难度,对于语法分析,作者介绍了递归下降和LL文法及相应的源码,而对LR文法,只说”理解理论就可以了”.虽然这种方法回避了对于难点的学习,但是用这种方法学习,可以在较短时间内编写出一个能够运行的词法分析器和语法分析器,可以大大提高学习积极性. --http://www.pconline.com.cn/pcedu/empolder/life/0504/597581.html
笔者的思路大体上类似第4种方法,但也稍有不同.由于一个偶然的原因, 笔者需要编写一个词法分析器和语法分析器,用于程序源代码的静态分析.开始无从下手,硬着头皮看了点编译原理,觉得困难很大.后来偶然找到一个类似的开源程序,是利用一个叫做PCCTS的编译器自动生成工具开发的,大受启发.开源就是好!笔者找来了一个叫做ANTLR的工具(它是PCCTS的新版,支持生成java,c++和c#代码),又下载了一个c语言的语法文件(因为笔者需要处理c代码文件),然后自己编了少量动作(action)语句,界面代码,分析处理代码等,就这样,在对编译原理所知甚少(以前学过的因为理解不深都忘了,只记得正则表达式)的情况下,仅用一个星期就写出了程序. 这次实践使笔者对编译原理兴趣大增,重新又学了一遍编译原理,并归纳出笔者认为比较实用有效的编译原理学习步骤: 1.先利用ANTLR之类的编译器生成工具,做一个小程序(如上面提到的HTML文件转化成纯文本文件的程序),所需知识只是正则表达式的基本知识和生成工具本身的使用方法(可以看联机帮助和网上教程(tutorial)来掌握). 这样做的好处是: 1)可以体会到编译原理的实用性,提高学习兴趣 2)入门容易,消除编译原理学习的畏难情绪. 3)获得词法分析器和语法分析器的感性认识,有利于加深对理论的理解. 4)获得编译器自动生成工具(compiler compiler)的使用经验,提高解决实际问题的能力.(实际工作很多都不是手编而是利用工具的) 2.象ANTLR之类的工具是开源(open source)的,可研究其源码,以便必要时自己手编分析程序. 3.回过头来看编译原理教材. 这时大概会发现,很多理论很容易懂,剩下的只有上面说的几个难点,多看几遍,重点突破. 4.结合教材所附源码,进一步加深对教材的理解 这里顺便提一下,有的编译原理的教材,对于输入子系统不单立一章来讲,有的甚至完全忽略,笔者认为, 输入子系统相对于词法分析器和语法分析器来说当然简单地多,但也是两者的基础,故有必要看源码来理解.在这方面,ANTLR的实现机制和Lex是不同的(当然和java与c的差异有关),可对照着看. 笔者学习VC++时,深切体会到好教材的重要.笔者开始吃了劣质光盘版”教材”和”21天学VC++”的祸害,看了一个月还如入云雾之中,后来看了《VC++技术内幕》,方才豁然开朗.但是编译原理的教材却似乎质量相差不是特别大,关键还在于合适的方法.以上方法笔者也是误打误撞总结出来的,希望有所参考价值. --http://pcedu.pconline.com.cn/empolder/life/0504/597581_1.html
CSDN
大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决著名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间诞生不少名著的相关数论。
推荐参考书
虽然编译理论发展到今天,已经有了比较成熟的部分,但是作为一个大学生来说,要自己写出一个像Turboc C,Java那样的编译器来说还是太难了。不仅写编译器困难,学习编译原理这门课程也比较困难。
正是因为编译原理学习相对困难,那么就要求有好的教师和好的教材。教师方面不是我们能自己更改的,而在教材方面我们却可以按自己的意愿来阅读。我下面推荐几本好的编译原理的教材。我推荐的书籍都是国外的经典教材,因为在国内的教材中,确实还没发现什么让人满意的。
第一本书的原名叫《Compilers Principles,Techniques,and Tools》,另外一个响亮的名字就是龙书。原因是这本书的封面上有条红色的龙,也因为这本书在编译原理基础领域确实太有名气了,所以很多国外的学者都直接取名为龙书。最近机械工业出版社已经出版了此书的中文版,名字就叫《编译原理》。该书出的比较早,大概是在85或86年编写完成的,作者之一还是著名的贝尔实验室的科学家。里面讲解的核心编译原理至今都没有变过,所以一直到今天,它的价值都非凡。这本书最大的特点就是一开始就通过一个实际的小例子,把编译原理的大致内容罗列出来,让很多编译原理的初学者很快心里有了个底,也知道为什么会有这些理论,怎么运用这些理论。而这一点是我感觉国内的教材缺乏的东西,所以国内的教材都不是写给愿意自学的读者,总之让人看了半天,却不知道里面的东西有什么用。
第二本书的原名叫《Modern Compiler Design》,中文名字叫做《现代编译程序设计》。该书由人民邮电出版社所出。此书比较关注的是编译原理的实践,书中给出了不少的实际程序代码,还有很多实际的编译技术问题等等。此书另外一个特点就是其“现代”而字。在传统的编译原理教材中,你是不可能看到如同Java中的“垃圾回收”等算法的。因为Java这样的解释执行语言是在近几年才流行起来的东西。如果你想深入学习编译原理的理论知识,那么你肯定得看前面那本龙书,如果你想自己动手做一个先进的编译器,那么你得看这本《现代编译程序设计》。
第三本书就是很多国内的编译原理学者都推荐的那本《编译原理及实践》。或许是这本书引入国内比较早吧,我记得我是在高中就买了这本书,不过也是在前段时间才把整本书看完。此书作为入门教程也的确是个不错的选择。书中给出的编译原理讲解也相当细致,虽然不如前面的龙书那么深入,但是很多地方都是点到为止,作为大学本科教学已经是十分深入了。该书的特点就是注重实践,不过感觉还不如前面那本《现代编译程序设计》的实践味道更重。此书的重点还是在原理上的实践,而非前面那本那样的技术实践。《编译原理及实践》在讲解编译原理的各个部分的同时,也在逐步实践一个现代的编译器Tiny C.等你把整本书看完,差不多自己也可以写一个Tiny C了。作者还对Lex和Yacc这两个常用的编译相关的工具进行了很详细的说明,这一点也是很难在国内的教材中看到的。
推荐了这三本教材,都有英文版和中文版的。很多英文好的同学只喜欢看原版的书,不我的感觉是这三本书的翻译都很不错,没有必要特别去买英文版的。理解理论的实质比理解表面的文字更为重要。
编译原理的实质
前面已经说过,学习编译原理其实也就是学习算法而已,没什么特别的。只不过这些算法的产生已经形成了一套理论。下面我来看看编译原理里面到底有什么高深的理论吧。
几乎每本编译原理的教材都是分成词法分析,语法分析(LL算法,递归下降算法,LR算法),语义分析,运行时环境,中间代码,代码生成,代码优化这些部分。其实现在很多编译原理的教材都是按照85,86出版的那本龙书来安排教学内容的,所以那本龙书的内容格式几乎成了现在编译原理教材的定式,包括国内的教材也是如此。一般来说,大学里面的本科教学是不可能把上面的所有部分都认真讲完的,而是比较偏重于前面几个部分。像代码优化那部分东西,就像个无底洞一样,如果要认真讲,就是单独开一个学期的课也不可能讲得清楚。所以,一般对于本科生,对词法分析和语法分析掌握要求就相对要高一点了。
词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显,就是要让词法分析从程序上升到理论的地步。
语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法,LL自顶向下算法和LR自底向上算法。LL算法还好说,到了LR算法的时候,困难就来了。很多自学编译原理的都是遇到LR算法的理解成问题后就放弃了自学。其实这些东西都是只要大家理解就可以了,又不是像词法分析那样非得自己写出来才算真正的会。像LR算法的语法分析器,一般都是用工具Yacc来生成,实践中完全没有比较自己来实现。对于LL算法中特殊的递归下降算法,因为其实践十分简单,那么就应该要求每个学生都能自己写。当然,现在也有不少好的LL算法的语法分析器,不过要是换在非C平台,比如Java,Delphi,你不能运用YACC工具了,那么你就只有自己来写语法分析器。
等学到词法分析和语法分析时候,你可能会出现这样的疑问:“词法分析和语法分析到底有什么?”就从编译器的角度来讲,编译器需要把程序员写的源程序转换成一种方便处理的数据结构(抽象语法树或语法树),那么这个转换的过程就是通过词法分析和语法分析的。其实词法分析并非一开始就被列入编译器的必备部分,只是我们为了简化语法分析的过程,就把词法分析这种繁琐的工作单独提取出来,就成了现在的词法分析部分。除了编译器部分,在其它地方,词法分析和语法分析也是有用的。比如我们在DOS,Unix,Linux下输入命令的时候,程序如何分析你输入的命令形式,这也是简单的应用。总之,这两部分的工作就是把不“规则”的文本信息转换成一种比较好分析好处理的数据结构。那么为什么编译原理的教程都最终把要分析的源分析转换成“树”这种数据结构呢?数据结构中有Stack, Line,List…这么多数据结构,各自都有各自的特点。但是Tree这种结构有很强的递归性,也就是说我们可以把Tree的任何结点Node提取出来后,它依旧是一颗完整的Tree。这一点符合我们现在编译原理分析的形式语言,比如我们在函数里面使用函树,循环中使用循环,条件中使用条件等等,那么就可以很直观地表示在Tree这种数据结构上。同样,我们在执行形式语言的程序的时候也是如此的递归性。在编译原理后面的代码生成的部分,就会介绍一种堆栈式的中间代码,我们可以根据分析出来的抽象语法树,很容易,很机械地运用递归遍历抽象语法树就可以生成这种指令代码。而这种代码其实也被广泛运用在其它的解释型语言中。像现在流行的Java,.NET,其底层的字节码bytecode,可以说就是这中基于堆栈的指令代码的。
关于语义分析,语法制导翻译,类型检查等等部分,其实都是一种完善前面得到的抽象语法树的过程。比如说,我们写C语言程序的时候,都知道,如果把一个浮点数直接赋值给一个整数,就会出现类型不匹配,那么C语言的编译器是怎么知道的呢?就是通过这一步的类型检查。像C++语言这中支持多态函数的语言,这部分要处理的问题就更多更复杂了。大部编译原理的教材在这部分都是讲解一些比较好的处理策略而已。因为新的问题总是在发生,旧的办法不见得足够解决。
本来说,作为一个编译器,起作用的部分就是用户输入的源程序到最终的代码生成。但是在讲解最终代码生成的时候,又不得不讲解机器运行环境等内容。因为如果你不知道机器是怎么执行最终代码的,那么你当然无法知道如何生成合适的最终代码。这部分内容我自我感觉其意义甚至超过了编译原理本身。因为它会把一个计算机的程序的运行过程都通通排在你面前,你将来可能不会从事编译器的开发工作,但是只要是和计算机软件开发相关的领域,都会涉及到程序的执行过程。运行时环境的讲解会让你更清楚一个计算机程序是怎么存储,怎么装载,怎么执行的。关于部分的内容,我强烈建议大家看看龙书上的讲解,作者从最基本的存储组织,存储分配策略,非局部名字的访问,参数传递,符号表到动态存储分配(malloc,new)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成。
关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在《编译原理及实践》的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术,其实另外还有本叫做《Advance Compiler Desgin and Implement》,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本《Advance Compiler Desgin and Implement》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢?
关于实践
编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课关注讲解其基本理论。但是计算机科学本身就是一门实践性很强的课程,如果能够学以致用,那才叫真正的学会。李阳在讲解疯狂英语的时候就说到,只要当你会实际中运用一个单词一个词组的时候你才能叫学会了这个单词或者词组,而不是只是知道了它的拼写和意思。其实任何学习都是一样的,如果缺少了实践的结合,你不能算学会。
编译原理的课程主要就是讲解编译器产生的理论和原理,那么很简单,自己写个编译器就是最好的实践过程了。不过你得小心,编译系统可能是所有软件系统中最复杂的系统之一,不然为什么大学里面还会把编译器的编写开成一门叫做编译原理的课程来讲?我很佩服那些学了操作系统原理就开始自己写操作系统,学了编译原理就开始自己写编译器的人们,确实,在中国,敢这么做的学生太少了。且不管你这样做能不能做成功,至少有了这个尝试,会让你的程序设计,系统规划安排的功底增进不少。我下面给出一些关于实践过程中可能会遇到的困难,希望能够在你陷入困境的前帮你一把。
1. Lex和Yacc. 这两工具是作为词法分析很语法分析的工具。如果你自己写一个编译器,我十分不建议你连词法分析这种事情都亲手来写。Lex和Yacc应该是作为每本编译原理的教材的必备内容,可是在国内的教材中缺很少看到。这两个工具是Unix系统下的小东西,如果你要在Windows中运用,那么你最好去下在cygwin这个软件。它是个在Windows下模拟Unix的东东,里面就包含了flex.exe和bison.exe(yacc)这两个工具.这两个工具使用起来还挺麻烦的(其实unix 下的很多十分有用的工具都是这样), 不过在《编译原理与实践》这本书上对于这两个工具的讲解十分详细,还列举了不少实际的例子。
2. 做解释型语言比做生成机器代码的编译器简单。虽然说,做解释型的编译器,像Java那样的,你还得自己去写解释器,不过这样你就不必去查找机器代码的资料了。如果你做生成的最终机器代码编译器可能会遇到问题还有就是寄存器为基础的代码生成方法。前面说过,如果你生成的是以堆栈为基础的代码,那么其代码生成过程十分简单,需要考虑的东西也不多,如果你考虑最终的机器代码生成的话,你必须考虑机器的寄存器如何分配等麻烦的问题。
3. 考虑用别人已经生成的语法文件,尽量不要自己动手写词法文件和语法文件.以前一个朋友曾经说过,写出一个好的程序语言的语法定义,就几乎完成了一个编译器的一半.确实是这样,语法文件的编写是个很难的事情.现在网上到处都可以找到比如C语言,C++,Java, Tiny C,Minus C等语言的词法文件和语法文件,你完全可以自己下下来来用.
在《编译原理及实践》的书中,作者给出了一个Tiny C的全部代码.我自我感觉作者的这个编译器做得很不错,相对于其它php,perl等语言的源代码来说,简单得多,容易看懂,而且很清晰地展现了一个完成的编译系统的实现过程.其源代码可以在作者的网站上下载.
后话
编译原理的学习可能算是一个困难的历程,特别是对于那些不对编译系统感兴趣的同学来说.既然它已经作为了大学本科的必修课程,那么就说明的它引申出来的一套理论在整个计算机科学领域还是占有相对重要的地位.
如果我们考究一下历史,就会发现很多被称为程序设计大师的人都是编译领域的高手.写出第一个微型机上运行的Basic语言的比尔盖茨,设计出Delphi的Borland的”世界上最厉害的程序员”, Sun的JAVA之父, 贝尔实验室的C++之父…
附一篇:
编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易懂的。 从笔者学习实践来看,第一次学了一个多月,理论部分一知半解,第二次学了一星期,基本看懂词法分析的理论部分,语法分析就一知半解了,第三次学了一星期,才基本看懂词法分析和语法分析.由此看来,这门课确实有难度.网上有的帖子,把编译器的编写搞得高深莫测一般,似乎难度极大,非常人能及. 编译原理究竟难在哪里?笔者的体会,主要在这几点: 1.错误认识: 很多人以为编译原理只能应用在写程序语言的编译器上,觉得用处不大,学习兴趣不高.而且可能觉得写编译器就必须完全手工来写. 2.自动机理论: 象NFA,DFA之类,比较抽象,要费些脑子,特别如果学离散数学时没有学自动机理论的话,更是需要多花点时间. 3.集合论的推演: 主要是一些闭包运算之类,数学基础不好的话,学起来也会感到吃力. 4.LR文法: 主要是又引入了自动机 不管哪本编译教材,即使是绝对经典”龙书”也不例外,都要涉及到这几个难点.由于这些内容本身不好懂,作者有再大的本事,也很难把书写得象小说那么流畅好懂. 明确了难点,接着想对策.大致有这么几种: 1.端正认识: 编译原理在静态文本处理上有广泛的应用,举个简单的例子,把HTML文件转化为纯文本,利用编译原理来实现”非常”简单.理解了编译原理的实用性,大概可以提高学习兴趣. 2.反复看书: 这个办法看起来最笨,却是基本的方法.忘了是哪位名人说过,书只要多看,总能看得懂的. 3.结合源码来看: 这是经典教材Compiler Design in C的作者Allen Hollub建议的方法.这本教材的特色就是包含了大段yacc,lex的代码.这也是个好方法,而且,只有看懂了代码,才能说在根本上理解了理论.当然,要完全看懂yacc的代码,工作量是很大的,而且同样要先理解理论. 4.删繁就简,避重就轻.网上流传较广的一篇《编译原理学习导论》(作者四川大学唐良)就基本是这种思路,对于词法分析,作者避免了自动机理论和集合论推演的介绍,直接搬出源码来,大大降低了理解难度,对于语法分析,作者介绍了递归下降和LL文法及相应的源码,而对LR文法,只说”理解理论就可以了”.虽然这种方法回避了对于难点的学习,但是用这种方法学习,可以在较短时间内编写出一个能够运行的词法分析器和语法分析器,可以大大提高学习积极性. --http://www.pconline.com.cn/pcedu/empolder/life/0504/597581.html
笔者的思路大体上类似第4种方法,但也稍有不同.由于一个偶然的原因, 笔者需要编写一个词法分析器和语法分析器,用于程序源代码的静态分析.开始无从下手,硬着头皮看了点编译原理,觉得困难很大.后来偶然找到一个类似的开源程序,是利用一个叫做PCCTS的编译器自动生成工具开发的,大受启发.开源就是好!笔者找来了一个叫做ANTLR的工具(它是PCCTS的新版,支持生成java,c++和c#代码),又下载了一个c语言的语法文件(因为笔者需要处理c代码文件),然后自己编了少量动作(action)语句,界面代码,分析处理代码等,就这样,在对编译原理所知甚少(以前学过的因为理解不深都忘了,只记得正则表达式)的情况下,仅用一个星期就写出了程序. 这次实践使笔者对编译原理兴趣大增,重新又学了一遍编译原理,并归纳出笔者认为比较实用有效的编译原理学习步骤: 1.先利用ANTLR之类的编译器生成工具,做一个小程序(如上面提到的HTML文件转化成纯文本文件的程序),所需知识只是正则表达式的基本知识和生成工具本身的使用方法(可以看联机帮助和网上教程(tutorial)来掌握). 这样做的好处是: 1)可以体会到编译原理的实用性,提高学习兴趣 2)入门容易,消除编译原理学习的畏难情绪. 3)获得词法分析器和语法分析器的感性认识,有利于加深对理论的理解. 4)获得编译器自动生成工具(compiler compiler)的使用经验,提高解决实际问题的能力.(实际工作很多都不是手编而是利用工具的) 2.象ANTLR之类的工具是开源(open source)的,可研究其源码,以便必要时自己手编分析程序. 3.回过头来看编译原理教材. 这时大概会发现,很多理论很容易懂,剩下的只有上面说的几个难点,多看几遍,重点突破. 4.结合教材所附源码,进一步加深对教材的理解 这里顺便提一下,有的编译原理的教材,对于输入子系统不单立一章来讲,有的甚至完全忽略,笔者认为, 输入子系统相对于词法分析器和语法分析器来说当然简单地多,但也是两者的基础,故有必要看源码来理解.在这方面,ANTLR的实现机制和Lex是不同的(当然和java与c的差异有关),可对照着看. 笔者学习VC++时,深切体会到好教材的重要.笔者开始吃了劣质光盘版”教材”和”21天学VC++”的祸害,看了一个月还如入云雾之中,后来看了《VC++技术内幕》,方才豁然开朗.但是编译原理的教材却似乎质量相差不是特别大,关键还在于合适的方法.以上方法笔者也是误打误撞总结出来的,希望有所参考价值. --http://pcedu.pconline.com.cn/empolder/life/0504/597581_1.html
Saturday, October 2, 2010
Why is the Federal Reserve Buying US Treasury Bills?
http://econ.economicshelp.org/2008/12/why-is-federal-reserve-buying-us.html
今天和友人讨论到为何Federal要购买债券, 我顺手查了点资料, 转发一篇写得比较简单的.
At the moment banks are reluctant to lend to the private sector. This is because the recession has made lending to private companies quite risky. Also, banks are reluctant to lend to each other because of the credit crunch. Banks are buying 30 year treasury bonds because they are seen as a safe investment. They may only yield 2%, but with interest rates at 0-0.25%, it does represent some profit for a bank; in addition it is seen as safe.
Because the Fed is worried about deflation and lack of credit, they are trying to get the banks to resume more normal lending practices (lending to each other and lending to private sector.
The Federal Reserve are buying treasury bonds because:
* By buying bonds, the value increases and the interest rate on them declines. The Fed are trying to reduce interest rates on long term bonds to encourage banks to spend less money on buying Treasury bonds and lend more to private sector. (If treasury yields fell to 0%, it is less attractive to buy bonds)
* The Federal Reserve are also trying to improve the balance sheet of banks by buying 'toxic assets' - mortgage backed securities which currently have little market value.
If successful, this will create inflationary expectations (rather than deflation), encourage lending and therefore encourage economic growth.
Problems With This Scheme
1. The Federal Reserve are increasing the monetary base, there is a danger this could lead to high levels of inflation, when the velocity of circulation picks up.
2. Increasing quantity of US dollars and reducing interest rates on bonds is likely to reduce value of dollar, so dollar is likely to fall.
3. US National Debt is over 73% of GDP and is increasing all the time. This relies on people being willing to buy bonds and finance the debt.
4. The worry is that lower interest rates and a falling dollar, will discourage foreign investors from holding US treasury bills and bonds. Then the US would struggle to finance its national debt. This would then cause either inflation (potentially very high) or an increase in interest rates to attract savers.
A key issues is whether:
* Investors retain trust in the dollar
* The US government's credit worthiness - If people feared US government could default this would create real problems for the US dollar and US deficit.
今天和友人讨论到为何Federal要购买债券, 我顺手查了点资料, 转发一篇写得比较简单的.
The Federal Reserve are buying 30 year Treasury Bills in an attempt to increase the money supply and stimulate economic activity.
At the moment banks are reluctant to lend to the private sector. This is because the recession has made lending to private companies quite risky. Also, banks are reluctant to lend to each other because of the credit crunch. Banks are buying 30 year treasury bonds because they are seen as a safe investment. They may only yield 2%, but with interest rates at 0-0.25%, it does represent some profit for a bank; in addition it is seen as safe.
Because the Fed is worried about deflation and lack of credit, they are trying to get the banks to resume more normal lending practices (lending to each other and lending to private sector.
The Federal Reserve are buying treasury bonds because:
* By buying bonds, the value increases and the interest rate on them declines. The Fed are trying to reduce interest rates on long term bonds to encourage banks to spend less money on buying Treasury bonds and lend more to private sector. (If treasury yields fell to 0%, it is less attractive to buy bonds)
* The Federal Reserve are also trying to improve the balance sheet of banks by buying 'toxic assets' - mortgage backed securities which currently have little market value.
If successful, this will create inflationary expectations (rather than deflation), encourage lending and therefore encourage economic growth.
Problems With This Scheme
1. The Federal Reserve are increasing the monetary base, there is a danger this could lead to high levels of inflation, when the velocity of circulation picks up.
2. Increasing quantity of US dollars and reducing interest rates on bonds is likely to reduce value of dollar, so dollar is likely to fall.
3. US National Debt is over 73% of GDP and is increasing all the time. This relies on people being willing to buy bonds and finance the debt.
4. The worry is that lower interest rates and a falling dollar, will discourage foreign investors from holding US treasury bills and bonds. Then the US would struggle to finance its national debt. This would then cause either inflation (potentially very high) or an increase in interest rates to attract savers.
A key issues is whether:
* Investors retain trust in the dollar
* The US government's credit worthiness - If people feared US government could default this would create real problems for the US dollar and US deficit.
Friday, September 17, 2010
闲话GEB
按:
研究生课程里学了半年的C++, 自以为各种语法钻得很细, 一些巧妙的算法花一定功夫也能琢磨出来. 但实习的时候真正开始写大的project的时候就傻眼了. 现在看来, 编程的一方面乐趣可以叫做:规则, 这教会我们怎样从基本的语句和各种元素发展成庞大的工程; 另一方面乐趣逆过来思考, 就是如何把庞大的工程, 生活中的问题, 或许是跟编程完全无联系的东西拆解成可以用计算机执行的基本元素, 这是反向的过程, 同时也是更实际的问题. 两头都打通了, 智力就更上一个层次了.
转自豆瓣 GEB书评
http://book.douban.com/review/1596919/
GEB(《哥德尔,埃舍尔和巴赫——集异璧之大成》)是本妙书。作为标题的三个人,两个跟我是老 朋友——巴赫和哥德尔。从计算机科学来看,如果说得玄一点,不确定性原理以及图灵机这样的概念,是可以当成哲学来说的。巴赫老人家的音乐在某种意义上也可 以当作神秘主义符号来说。荷兰画家埃舍尔我了解有限,不过作品倒还很合我口味:充满悖论和幻觉。
总的来说,我们这个世界是可以被不同的定义和推演 所描述的。拟定一个方向,所有的“数”都乖乖地沿它长下去。至于“语言”,说白了就是从游戏规则出发——可能是荒谬的规则,但从这规则你可以定义整个世 界。世界被一条描述分成两半:属于和不属于。巴赫的音乐可以被解释出一种“数字意”,因为他一直在攀爬,重复,不经意间回到起点。我常常把巴赫的灵感,想 成一种荒诞的规则,一颗怪异的种子。在羽管键琴的机械敲打中,种子当当当地长成盘旋的绿藤。
也正因为此,我一直悄悄把写复调的作曲家巴赫当成现代艺术家,拓扑观念的高手。
隐喻
个人一向反对硬做文章式地联系科学和艺术。自己乐意做个老实人,哪怕被人称 为只见树木不见森林的工匠,盯住细节死板地研究。然而我又认为,从艺术和科学层面去想,其实不应看成对艺术和科学的归纳,而是走出新的一径,对世界重新定 义。我常常嘲笑那种要用科学解释艺术的人,是把立体的东西放到二维座标系中按扁,然而按GEB的作者的目光看去,不是把三维按成二维,而是让它长成四维 了。如今我不由自主深深赞美这种新鲜的眼光。顺手拈来一则,是作者谈 “堆栈” 。堆栈是一种程序中常用的数据结构,即存数据是先进先出(比如一节节车厢通过山洞) 还是先进后出(如同一头堵死的竹筒) 。作者用巴赫的晚期杰作《赋格的艺术》来讲它,“紧张和释放是音乐进行的基本动力”,《赋格的艺术》中,先用转调形成一种压力,然后在那个基础上继续变 形,而解开压力的顺序与之相反——倒退着解开。呵呵,把巴赫和堆栈联系在一起的人,应该受我一拜。
我读计算机系硕士的导师,专门搞一些“形式语 言”,让我们活活抓狂而死。那时我们定义语言,总有一项是unknown(未知,未定义)。GEB的作者Hofstadter画了一幅图,两棵树,一黑一 白,中间有unreachable falsehoods & unreachable truths。一个“异常”就一下子把过程扔到深渊里去了,最后扑通扔出一个错误信息了事。在我看来,这其实是对世界的一种隐喻。计算机科学充满了这种对 人世的模仿和寓言。比如图灵机,答答答答地在带子上打出结果,有时有确定的答案,有时没有。这个东西奇妙在完全不能用实验印证。我们做题听课热火朝天,却 完全是在一个乌托邦里闹,根本看不到后果。我们的证明,往往就是为得出一个“不可解”的结论,在一个并不存在的空间里,我们抓瞎着在概念丛中穿行。
当 然,习惯了那些概念丛,它们就是真的了,比真还真,成为意识的一部分。而里面的磕磕碰碰,都有真实质感。素质好的人,从一丝碰撞的触觉摸去,就能撞见个新 洞天。我过去有个很年轻的老师,读硕士时就发表了很出色的论文。后来他不无得意地对我们回忆那个下午,一个闷热孤单的地方,他一个人郁闷一大顿之后,给外 出开会的导师发了一封振聋发聩的邮件,汇报自己的发现。有一次,我问他,你的研究其实根本不用计算机,对吗?他笑着举起一张写了些铅笔字的小纸片,看,这 就是我的全部研究。
递归
上面说了图灵机。它不是真实的机器,是一种抽象数学模型,用纸带模拟数学运 算。看上去,它原始得不可思议,但又永恒得不可思议。因为假设纸带无限长,又假设可以保存整个纸带的当前状况。它正是计算机的理论模型和概念的开端。英国 数学家图灵认为这样的假想“机器”就能模拟人类所能进行的任何计算过程——抵达如此简洁的概括,真乃天才。
同为英国人的散文家兰姆,写过一个半小 说半散文的东西,说某个国家(似乎是中国)的一个男孩发现房子烧毁了,碰巧烤熟猪肉,就很好吃。为了有熟猪肉,他们就一间一间地烧房子。现在看来,早期计 算机的思想,简直就是这样,笨手笨脚地绕许多弯才能解决一个最最简单的问题。其实,现在的机器定理证明也是这样的,对初学者来说,证明x+1 > x 需要繁琐的定义,动辄面对大量错误信息。然而那就是计算机的发端,跟人类直觉思维截然不同的思考方式。从那里开始,人的思想史开始了新的头绪—当人发现自 己的直觉太过聪明,聪明到了头,打算换成笨办法的时候,才开始了一种“可持续发展”的新聪明。
递归本来是一种编程技术,简单地说,是让一个函数从 其内部调用其自身。比如计算阶乘。0 的阶乘被特别地定义为 1。 更大数的阶乘是通过计算 1 * 2 *…来求得的,每次增加 1,直至达到要计算其阶乘的那个数。也就是说,每一步都保存形式(每次增加1),但变更内容(被增加的数字时刻在变化),变到你不需要再变为止。递归思路 本身和编程应用都不太直观,需要学习和适应,才能有对“样式” 的坚强守护——它不是保留一个具体公式反复调用和推算,而是保持一个“样式”,比如一个数乘以一个比它小1的数,这个“比它小1”的“它”,每次都变,所 以设计者必须在脑子里整好这个样式和结构,能够在抽象的状态中,从抽象到抽象。
而递归一旦开始,形式就固定了,只有到了终止条件才停住。条件未满 足的时候,闭眼往前走即可。也就是说,这个过程完全不用知道整体的信息,而是只关心前一步结果是什么,然后据此推出下一步是什么,至于以后是什么,旁边是 什么,前一步的前一步,完全不管,它闭着眼睛摸黑走下去。这种对自身的不停调用的方式,好象混凝土一样,高效地合成整个世界。在我看来,递归是一种认知哲 学:把所知减到最少,驴拉磨一样。最少产生了最多——由最低能的图灵机生出计算机,由最简易的程序生发出人工智能。
美国人Mitchell Waldrop写过一本叫做《复杂》的书,说的是一群博士研究生命科学,提到进化,认为以达尔文的理论,人能从无序的生命,进化成如今的样子,机率不超过 猴子在打字机上乱打,打出莎士比亚全集。有人说,最早的有机分子,由少数粘合成“大分子” ,一步步继续粘合,长成更“大”的生物,经过多少万年的进化、选择、粘合,才有了生命。不论是否经过证实,至少在我听来是有道理的。说到底,这理论仍然是 一种“生命递归”,由种子开始,由少变多,由小变大,动态积累,不能跳步。生命其实是盲目的,不知道自己在整体中的位置,只能从现存状态做有限的挣扎,当 然,不像计算机算法那样处于封闭状态,而是不时受扰动和灾难,可能犯错误、跃进、终止。这流向仍然是一般意义上的递归:发端是一种难以言说的天意或者“第 一推动”,而生命如默默跟着头羊走的羊群,不知所来,不知所终。
出发
递归在我眼中也意味着生命的无限——纸带无限长,记忆无限多,可以运行无限 的时间。而以递归为本的图灵机,却从一开始就既盲目,又“知道”自己的局限——图灵用它证明第一个不可决定问题——图灵机会不会停。结论是,没有一个一般 规律能够决定,对一些输入和算法,图灵机停还是不停。停,这里是个预定条件,比如我可规定,移动的读写头走到某位置,整个机器停下来。条件因机器游戏规则 而异,而最后我们知道的是,我们什么也不知道,无法一般性地预言,那个期待的地方能否抵达。因为一旦预言,结论必然矛盾,所以只好不预言。
所以,生命出发了,然而不知道有没有终点,不知道前进的意义。上帝预设了谜给我们,一代一代才有兴致递归式生存,不知所终。我们是快乐的亚当夏娃。
在 我看来,一方面,“样式” 是一种存在——一种由物质构成的“宏物质”——它粘合物质,把猴子向人带领。所以你我是一堆物理化学生物实体,更是“样式”的迭加计算结果---如果非要 用计算机模拟一下,我们的一举一动,一颦一笑,都是无数递归计算的结果,从此时可倒推到生命之初。而另一方面,“样式”这个东西,又可类比为人世中的“精 神层面”,因为人只有运用智力才能吸收并且保持形式。所谓精神、智慧、道德、伦理之类,可以跟物质保持一定的独立,这正是“形式”跟“内容”的关系。上面 说过,N的阶乘,N乘以N-1, 一直乘下去,不到那个尽头的1,也就是物质资源完全用光,这个形式一直保持,无论N有多小。
跑题一下,记得 历史学家吉多(H.D. Kitto) 的《希腊历史》引言里说,与古希腊同时的民族,比如希伯莱,埃及等等,生活经验和智慧上本来一点不逊于古希腊,而且这些民族,各自有自己的文学传世。然而 只有希腊人形成了真正的科学,为什么?因为只有他们有意识地交流和总结,把数学哲学变成体系的学问,流传下来。相比较而言,希伯莱人积累的生活经验却一代 代化为云烟。古希腊人跟当时别的民族的比较,好比成人的智力跟儿童智力的比较。说到底,文化的积累本来都是递归式,然而还远远不够,因为递归中的元素,自 己不携带任何全局信息。大家盲目地跟着眼前的法则走,不介意整体状态,走到南墙活活撞死也得认命。
递归的伟大在于将它抽象成“样式”的人。被递归的元素,却可舒坦地保持弱智状态。而人的社会,总要有人站在递归之外,为递归洪流设置终止条件吧。
抵达
音乐上有荒岛CD一说,那么“荒岛书”可就太多了。对我来说,GEB算一本,斯宾格勒的《西方的没落》也算一本。到了一个荒岛上,你念念不忘这个世界横竖在没落,左一文明,右一文明,“神龟虽寿,尤有竟时”,既然生出来也要衰落,那为什么还生呢?
而GEB 是一本阳光之书。我每天等咖啡烧好那片刻都在读。今天下午在科学楼底买了只水果冰激淋,吃的时候不知看什么,就看它。那时,自己坐在圆桌跟前,周围的老师 同学也在买咖啡和冰激凌。书真是旧了,书皮从书脊脱落,落下很多黄屑。此刻,圆桌、黄屑,这些沙沙作响的东西,都可成为“观念”。在荒芜的桌旁,我凝视书 中的巴赫音乐谱例。其实,这本书里谈论巴赫的部份并非发前人所未发,毕竟作者不是音乐家。不过作者将数学和计算机的想法跟巴赫联系一下,有时别有奇趣。比 如说到巴赫的Hemiola和声,作者说,这是世界的不确定性。说得太简单干脆,让我以为这是我说的,简直想跳起来跟作者争版权。
巴赫的管风琴赋 格作品的结尾,常有这种和声,节奏飘忽地变了一下,很蛮不讲理地把乐意扯到别处,给听者吃了贴迷幻药。那时我就想,上帝为我们设计巴赫这个人物的存在,是 跟量子力学一道给人类准备好的礼物。人秉承牛顿之意似乎把这个世界越算越妥贴,然而最终上帝撕碎我们的信心,毁掉人的骄傲。这一切,真是一种轮回。
依 我看,GEB缺了重要的内容。如果我写,定要加上美国诗人史蒂文斯(Wallace Stevens)。史蒂文斯的诗歌充满荒诞意象,在我看来,往往是是对世界的拓朴式解构,赤裸裸的循环递归迭代,把信仰都绕进去。他喜欢写“一个基督徒女 人”这种题目,更喜欢慢条斯理地细细数来“十三种方式看黑鸟”,喜欢追究“存在”、“记忆”、“消失”。注意,在我看来,这些理念都“后计算机”得不得 了,而且自己丁丁当当搭起概念集合的架子。而且,他的诗意是放射性的,从语词中心出发,从那些华丽怪诞的动物名或者地名出发,最后形成凸多边形——是凸 的,不包括弯弯的蚕豆那样内凹的形状。
我们就这样站在荒岛上,看各种轮回,看船来船往。
研究生课程里学了半年的C++, 自以为各种语法钻得很细, 一些巧妙的算法花一定功夫也能琢磨出来. 但实习的时候真正开始写大的project的时候就傻眼了. 现在看来, 编程的一方面乐趣可以叫做:规则, 这教会我们怎样从基本的语句和各种元素发展成庞大的工程; 另一方面乐趣逆过来思考, 就是如何把庞大的工程, 生活中的问题, 或许是跟编程完全无联系的东西拆解成可以用计算机执行的基本元素, 这是反向的过程, 同时也是更实际的问题. 两头都打通了, 智力就更上一个层次了.
转自豆瓣 GEB书评
http://book.douban.com/review/1596919/
GEB(《哥德尔,埃舍尔和巴赫——集异璧之大成》)是本妙书。作为标题的三个人,两个跟我是老 朋友——巴赫和哥德尔。从计算机科学来看,如果说得玄一点,不确定性原理以及图灵机这样的概念,是可以当成哲学来说的。巴赫老人家的音乐在某种意义上也可 以当作神秘主义符号来说。荷兰画家埃舍尔我了解有限,不过作品倒还很合我口味:充满悖论和幻觉。
总的来说,我们这个世界是可以被不同的定义和推演 所描述的。拟定一个方向,所有的“数”都乖乖地沿它长下去。至于“语言”,说白了就是从游戏规则出发——可能是荒谬的规则,但从这规则你可以定义整个世 界。世界被一条描述分成两半:属于和不属于。巴赫的音乐可以被解释出一种“数字意”,因为他一直在攀爬,重复,不经意间回到起点。我常常把巴赫的灵感,想 成一种荒诞的规则,一颗怪异的种子。在羽管键琴的机械敲打中,种子当当当地长成盘旋的绿藤。
也正因为此,我一直悄悄把写复调的作曲家巴赫当成现代艺术家,拓扑观念的高手。
隐喻
个人一向反对硬做文章式地联系科学和艺术。自己乐意做个老实人,哪怕被人称 为只见树木不见森林的工匠,盯住细节死板地研究。然而我又认为,从艺术和科学层面去想,其实不应看成对艺术和科学的归纳,而是走出新的一径,对世界重新定 义。我常常嘲笑那种要用科学解释艺术的人,是把立体的东西放到二维座标系中按扁,然而按GEB的作者的目光看去,不是把三维按成二维,而是让它长成四维 了。如今我不由自主深深赞美这种新鲜的眼光。顺手拈来一则,是作者谈 “堆栈” 。堆栈是一种程序中常用的数据结构,即存数据是先进先出(比如一节节车厢通过山洞) 还是先进后出(如同一头堵死的竹筒) 。作者用巴赫的晚期杰作《赋格的艺术》来讲它,“紧张和释放是音乐进行的基本动力”,《赋格的艺术》中,先用转调形成一种压力,然后在那个基础上继续变 形,而解开压力的顺序与之相反——倒退着解开。呵呵,把巴赫和堆栈联系在一起的人,应该受我一拜。
我读计算机系硕士的导师,专门搞一些“形式语 言”,让我们活活抓狂而死。那时我们定义语言,总有一项是unknown(未知,未定义)。GEB的作者Hofstadter画了一幅图,两棵树,一黑一 白,中间有unreachable falsehoods & unreachable truths。一个“异常”就一下子把过程扔到深渊里去了,最后扑通扔出一个错误信息了事。在我看来,这其实是对世界的一种隐喻。计算机科学充满了这种对 人世的模仿和寓言。比如图灵机,答答答答地在带子上打出结果,有时有确定的答案,有时没有。这个东西奇妙在完全不能用实验印证。我们做题听课热火朝天,却 完全是在一个乌托邦里闹,根本看不到后果。我们的证明,往往就是为得出一个“不可解”的结论,在一个并不存在的空间里,我们抓瞎着在概念丛中穿行。
当 然,习惯了那些概念丛,它们就是真的了,比真还真,成为意识的一部分。而里面的磕磕碰碰,都有真实质感。素质好的人,从一丝碰撞的触觉摸去,就能撞见个新 洞天。我过去有个很年轻的老师,读硕士时就发表了很出色的论文。后来他不无得意地对我们回忆那个下午,一个闷热孤单的地方,他一个人郁闷一大顿之后,给外 出开会的导师发了一封振聋发聩的邮件,汇报自己的发现。有一次,我问他,你的研究其实根本不用计算机,对吗?他笑着举起一张写了些铅笔字的小纸片,看,这 就是我的全部研究。
递归
上面说了图灵机。它不是真实的机器,是一种抽象数学模型,用纸带模拟数学运 算。看上去,它原始得不可思议,但又永恒得不可思议。因为假设纸带无限长,又假设可以保存整个纸带的当前状况。它正是计算机的理论模型和概念的开端。英国 数学家图灵认为这样的假想“机器”就能模拟人类所能进行的任何计算过程——抵达如此简洁的概括,真乃天才。
同为英国人的散文家兰姆,写过一个半小 说半散文的东西,说某个国家(似乎是中国)的一个男孩发现房子烧毁了,碰巧烤熟猪肉,就很好吃。为了有熟猪肉,他们就一间一间地烧房子。现在看来,早期计 算机的思想,简直就是这样,笨手笨脚地绕许多弯才能解决一个最最简单的问题。其实,现在的机器定理证明也是这样的,对初学者来说,证明x+1 > x 需要繁琐的定义,动辄面对大量错误信息。然而那就是计算机的发端,跟人类直觉思维截然不同的思考方式。从那里开始,人的思想史开始了新的头绪—当人发现自 己的直觉太过聪明,聪明到了头,打算换成笨办法的时候,才开始了一种“可持续发展”的新聪明。
递归本来是一种编程技术,简单地说,是让一个函数从 其内部调用其自身。比如计算阶乘。0 的阶乘被特别地定义为 1。 更大数的阶乘是通过计算 1 * 2 *…来求得的,每次增加 1,直至达到要计算其阶乘的那个数。也就是说,每一步都保存形式(每次增加1),但变更内容(被增加的数字时刻在变化),变到你不需要再变为止。递归思路 本身和编程应用都不太直观,需要学习和适应,才能有对“样式” 的坚强守护——它不是保留一个具体公式反复调用和推算,而是保持一个“样式”,比如一个数乘以一个比它小1的数,这个“比它小1”的“它”,每次都变,所 以设计者必须在脑子里整好这个样式和结构,能够在抽象的状态中,从抽象到抽象。
而递归一旦开始,形式就固定了,只有到了终止条件才停住。条件未满 足的时候,闭眼往前走即可。也就是说,这个过程完全不用知道整体的信息,而是只关心前一步结果是什么,然后据此推出下一步是什么,至于以后是什么,旁边是 什么,前一步的前一步,完全不管,它闭着眼睛摸黑走下去。这种对自身的不停调用的方式,好象混凝土一样,高效地合成整个世界。在我看来,递归是一种认知哲 学:把所知减到最少,驴拉磨一样。最少产生了最多——由最低能的图灵机生出计算机,由最简易的程序生发出人工智能。
美国人Mitchell Waldrop写过一本叫做《复杂》的书,说的是一群博士研究生命科学,提到进化,认为以达尔文的理论,人能从无序的生命,进化成如今的样子,机率不超过 猴子在打字机上乱打,打出莎士比亚全集。有人说,最早的有机分子,由少数粘合成“大分子” ,一步步继续粘合,长成更“大”的生物,经过多少万年的进化、选择、粘合,才有了生命。不论是否经过证实,至少在我听来是有道理的。说到底,这理论仍然是 一种“生命递归”,由种子开始,由少变多,由小变大,动态积累,不能跳步。生命其实是盲目的,不知道自己在整体中的位置,只能从现存状态做有限的挣扎,当 然,不像计算机算法那样处于封闭状态,而是不时受扰动和灾难,可能犯错误、跃进、终止。这流向仍然是一般意义上的递归:发端是一种难以言说的天意或者“第 一推动”,而生命如默默跟着头羊走的羊群,不知所来,不知所终。
出发
递归在我眼中也意味着生命的无限——纸带无限长,记忆无限多,可以运行无限 的时间。而以递归为本的图灵机,却从一开始就既盲目,又“知道”自己的局限——图灵用它证明第一个不可决定问题——图灵机会不会停。结论是,没有一个一般 规律能够决定,对一些输入和算法,图灵机停还是不停。停,这里是个预定条件,比如我可规定,移动的读写头走到某位置,整个机器停下来。条件因机器游戏规则 而异,而最后我们知道的是,我们什么也不知道,无法一般性地预言,那个期待的地方能否抵达。因为一旦预言,结论必然矛盾,所以只好不预言。
所以,生命出发了,然而不知道有没有终点,不知道前进的意义。上帝预设了谜给我们,一代一代才有兴致递归式生存,不知所终。我们是快乐的亚当夏娃。
在 我看来,一方面,“样式” 是一种存在——一种由物质构成的“宏物质”——它粘合物质,把猴子向人带领。所以你我是一堆物理化学生物实体,更是“样式”的迭加计算结果---如果非要 用计算机模拟一下,我们的一举一动,一颦一笑,都是无数递归计算的结果,从此时可倒推到生命之初。而另一方面,“样式”这个东西,又可类比为人世中的“精 神层面”,因为人只有运用智力才能吸收并且保持形式。所谓精神、智慧、道德、伦理之类,可以跟物质保持一定的独立,这正是“形式”跟“内容”的关系。上面 说过,N的阶乘,N乘以N-1, 一直乘下去,不到那个尽头的1,也就是物质资源完全用光,这个形式一直保持,无论N有多小。
跑题一下,记得 历史学家吉多(H.D. Kitto) 的《希腊历史》引言里说,与古希腊同时的民族,比如希伯莱,埃及等等,生活经验和智慧上本来一点不逊于古希腊,而且这些民族,各自有自己的文学传世。然而 只有希腊人形成了真正的科学,为什么?因为只有他们有意识地交流和总结,把数学哲学变成体系的学问,流传下来。相比较而言,希伯莱人积累的生活经验却一代 代化为云烟。古希腊人跟当时别的民族的比较,好比成人的智力跟儿童智力的比较。说到底,文化的积累本来都是递归式,然而还远远不够,因为递归中的元素,自 己不携带任何全局信息。大家盲目地跟着眼前的法则走,不介意整体状态,走到南墙活活撞死也得认命。
递归的伟大在于将它抽象成“样式”的人。被递归的元素,却可舒坦地保持弱智状态。而人的社会,总要有人站在递归之外,为递归洪流设置终止条件吧。
抵达
音乐上有荒岛CD一说,那么“荒岛书”可就太多了。对我来说,GEB算一本,斯宾格勒的《西方的没落》也算一本。到了一个荒岛上,你念念不忘这个世界横竖在没落,左一文明,右一文明,“神龟虽寿,尤有竟时”,既然生出来也要衰落,那为什么还生呢?
而GEB 是一本阳光之书。我每天等咖啡烧好那片刻都在读。今天下午在科学楼底买了只水果冰激淋,吃的时候不知看什么,就看它。那时,自己坐在圆桌跟前,周围的老师 同学也在买咖啡和冰激凌。书真是旧了,书皮从书脊脱落,落下很多黄屑。此刻,圆桌、黄屑,这些沙沙作响的东西,都可成为“观念”。在荒芜的桌旁,我凝视书 中的巴赫音乐谱例。其实,这本书里谈论巴赫的部份并非发前人所未发,毕竟作者不是音乐家。不过作者将数学和计算机的想法跟巴赫联系一下,有时别有奇趣。比 如说到巴赫的Hemiola和声,作者说,这是世界的不确定性。说得太简单干脆,让我以为这是我说的,简直想跳起来跟作者争版权。
巴赫的管风琴赋 格作品的结尾,常有这种和声,节奏飘忽地变了一下,很蛮不讲理地把乐意扯到别处,给听者吃了贴迷幻药。那时我就想,上帝为我们设计巴赫这个人物的存在,是 跟量子力学一道给人类准备好的礼物。人秉承牛顿之意似乎把这个世界越算越妥贴,然而最终上帝撕碎我们的信心,毁掉人的骄傲。这一切,真是一种轮回。
依 我看,GEB缺了重要的内容。如果我写,定要加上美国诗人史蒂文斯(Wallace Stevens)。史蒂文斯的诗歌充满荒诞意象,在我看来,往往是是对世界的拓朴式解构,赤裸裸的循环递归迭代,把信仰都绕进去。他喜欢写“一个基督徒女 人”这种题目,更喜欢慢条斯理地细细数来“十三种方式看黑鸟”,喜欢追究“存在”、“记忆”、“消失”。注意,在我看来,这些理念都“后计算机”得不得 了,而且自己丁丁当当搭起概念集合的架子。而且,他的诗意是放射性的,从语词中心出发,从那些华丽怪诞的动物名或者地名出发,最后形成凸多边形——是凸 的,不包括弯弯的蚕豆那样内凹的形状。
我们就这样站在荒岛上,看各种轮回,看船来船往。
Inception:一场层层调用的函数大战
转自 安婆婆 科学松鼠会
http://songshuhui.net/archives/42661.html
就有这么凑巧的事:上周还在看侯世达 (Hofstadter)先生的《集异璧》,这周就在电影院里看到了书中概念的演绎版——哈,说的当然是日前火爆酷炫的高分电影Inception啦。废话少说,赶快剧透。还没看过的同学们海涵了,虽说透穿了剧情也不会影响你观影的效果。
Inception抓人眼球的是它“梦中做 梦”和盗梦的情节设计。在层层深入的梦境里,人的意识逐步放松警惕,入侵者便可以趁机盗走储存在大脑中的信息。控制梦中的意识,“我做你的梦”,两个 人的思想在同一个大脑中争斗……这都是令人看得过瘾的狂野想象。然而身为一个业余程序员和《集异璧》忠实读者,看到人在梦里死了掉进迷失域(limbo) 再也出不来,我第一反应还是忍不住叫出来:“哇,堆栈溢出!”
堆栈是一个计算机术语,我看来看去,觉得Cobb这群人在剧中完成任务的方法就像出自程序员的手笔。你看每个梦,都是同样的一组人物,抱着同样的目标,只是换到了不同的场景里。这多像一个函数调用的过程啊。
也许你没听说过函数调用,但你也许炒过青菜。 通常我们会先热锅、放油,然后爆炒、加盐、出锅。那么从热锅到出锅的一整套动作就可以写一个名为“炒”的函数。如果我们为白菜调用这个函数,就完成了“炒 白菜”的任务;如果为空心菜调用这个函数,就完成了“炒空心菜”这个任务。你还可以自由发挥,为各种包菜、韭菜、胡萝卜调用同一个函数,就把它们都炒了。
Cobb先生当然不在乎炒的是什么菜,他的任 务是在Fisher的脑中播种下拆分公司的念头。他为Fisher先生设计的函数就是梦,让Fisher的潜意识瓦解的梦。在计算机程序中,一个函数内部 可以调用另一个函数,在第二层函数运行的过程中,第一层的函数就在等待,直到第二层函数返回了运算结果,第一层函数再利用这个返回的值来继续它自身的运 算。这么一比较,Cobb的精心设计实际上就是用一个梦去调用另一个梦,上一层梦境中熟睡的人们都在等待下一层梦境中的人完成任务。一旦成功,就用音乐或失去平衡的方式返还(在迷失域则是死亡),来结束上一层梦境。

就像程序员喜欢在函数中调用函数来使问题步步细化,这些嵌套在一起的梦也起到了步步逼近Fisher内心深处的作用。但是这样层层的调用也有个风险,万一信息链被破坏,函数不知道自己身处的是哪一层,事情就要乱套。这样就使得“堆栈”这个概念变得重要了。
在计算机语言里,“栈”是内存中的存储区,它保存着正在运行中的程序的临时信息,在程序完成后就被新的程序信息覆盖。“堆栈”就是向这些存储区写入信息,好让系统知道现在哪个函数在等待返回值,以及返回来的值要到哪里去读取。
但是计算机的内存容量是有限的。当函数调用的 层数过多,新调用的函数信息在写入内存的时候空间不够,就把一些老的信息覆盖了。麻烦的是,被覆盖的那层函数还在等待下层函数的返回值来完成暂停的任务。 这样虽然新的函数成功运行,老函数却没法正确找到返回值,整个程序就出错了。这种因为空间不够而产生的错误覆盖,就是开头提到的堆栈溢出。
这和情节有什么联系呢?当然有啊,Cobb的 老婆Mal不就是堆栈出错的受害者嘛。根据影片情节设计,Mal在迷失域中就因为待得太久而失去了对现实的记忆。她一直在最底层的函数里,却认为活在最顶层的现实,不需要返回到任何地方。而Cobb的“栈”还是完好的,他还记得 现实中的孩子,知道应该返回到顶层去。
这个时候,如果Cobb直接带着Mal卧轨, 不和她说那些有的没的,两人也许就安全地从底层返还了。但是Cobb犯了个错误,他对Mal的潜意识进行了修改,这就相当于故意在Mal的“栈”里放置了 错误的但是有意义的数据。这样当Mal回到最顶层的现实时,本来整个大程序应该宣告结束,但因为她的“栈”被改写了,这个程序就错误地认为自己并不在顶 层。于是Mal就失去了对梦境和现实的分辨力,觉得自己应该再死一次才回到现实。
“悲剧啊!”看见Mal坠下高楼,我不由叹息,一出内存出错的惨剧。
与其说这是一部关于梦的科学幻想,倒不如说是 利用人类的算法对意识进行的一次设计。据说影片的灵感有部分来自侯世达先生的《集异璧》。这是本涉及甚广的奇书,试图综合各学科的知识来探讨意识的机制。 侯先生虽然也不能完全回答自己提出的这个问题,但他猜想意识的关键之处在于“我”这个概念的产生。而这个概念来自自我和外界的区分,来自人类和外界不断的 信息交流。于是对“我”的认知从出生时起就一层层叠进脑内,这种交流积累终其一生循环往复。书中曾把这个过程类比于函数对自身进行循环调用,那么影片中的 故事设计与计算机原理相似的情况倒也不太出乎人意料。
咦,那么有没有可能,导演在试图把计算机科学的知识植入到我们的潜意识里面?银幕前面的你,被他的Inception施中了吗?
http://songshuhui.net/archives/42661.html
就有这么凑巧的事:上周还在看侯世达 (Hofstadter)先生的《集异璧》,这周就在电影院里看到了书中概念的演绎版——哈,说的当然是日前火爆酷炫的高分电影Inception啦。废话少说,赶快剧透。还没看过的同学们海涵了,虽说透穿了剧情也不会影响你观影的效果。
Inception抓人眼球的是它“梦中做 梦”和盗梦的情节设计。在层层深入的梦境里,人的意识逐步放松警惕,入侵者便可以趁机盗走储存在大脑中的信息。控制梦中的意识,“我做你的梦”,两个 人的思想在同一个大脑中争斗……这都是令人看得过瘾的狂野想象。然而身为一个业余程序员和《集异璧》忠实读者,看到人在梦里死了掉进迷失域(limbo) 再也出不来,我第一反应还是忍不住叫出来:“哇,堆栈溢出!”
堆栈是一个计算机术语,我看来看去,觉得Cobb这群人在剧中完成任务的方法就像出自程序员的手笔。你看每个梦,都是同样的一组人物,抱着同样的目标,只是换到了不同的场景里。这多像一个函数调用的过程啊。
也许你没听说过函数调用,但你也许炒过青菜。 通常我们会先热锅、放油,然后爆炒、加盐、出锅。那么从热锅到出锅的一整套动作就可以写一个名为“炒”的函数。如果我们为白菜调用这个函数,就完成了“炒 白菜”的任务;如果为空心菜调用这个函数,就完成了“炒空心菜”这个任务。你还可以自由发挥,为各种包菜、韭菜、胡萝卜调用同一个函数,就把它们都炒了。
Cobb先生当然不在乎炒的是什么菜,他的任 务是在Fisher的脑中播种下拆分公司的念头。他为Fisher先生设计的函数就是梦,让Fisher的潜意识瓦解的梦。在计算机程序中,一个函数内部 可以调用另一个函数,在第二层函数运行的过程中,第一层的函数就在等待,直到第二层函数返回了运算结果,第一层函数再利用这个返回的值来继续它自身的运 算。这么一比较,Cobb的精心设计实际上就是用一个梦去调用另一个梦,上一层梦境中熟睡的人们都在等待下一层梦境中的人完成任务。一旦成功,就用音乐或失去平衡的方式返还(在迷失域则是死亡),来结束上一层梦境。

就像程序员喜欢在函数中调用函数来使问题步步细化,这些嵌套在一起的梦也起到了步步逼近Fisher内心深处的作用。但是这样层层的调用也有个风险,万一信息链被破坏,函数不知道自己身处的是哪一层,事情就要乱套。这样就使得“堆栈”这个概念变得重要了。
在计算机语言里,“栈”是内存中的存储区,它保存着正在运行中的程序的临时信息,在程序完成后就被新的程序信息覆盖。“堆栈”就是向这些存储区写入信息,好让系统知道现在哪个函数在等待返回值,以及返回来的值要到哪里去读取。
但是计算机的内存容量是有限的。当函数调用的 层数过多,新调用的函数信息在写入内存的时候空间不够,就把一些老的信息覆盖了。麻烦的是,被覆盖的那层函数还在等待下层函数的返回值来完成暂停的任务。 这样虽然新的函数成功运行,老函数却没法正确找到返回值,整个程序就出错了。这种因为空间不够而产生的错误覆盖,就是开头提到的堆栈溢出。
这和情节有什么联系呢?当然有啊,Cobb的 老婆Mal不就是堆栈出错的受害者嘛。根据影片情节设计,Mal在迷失域中就因为待得太久而失去了对现实的记忆。她一直在最底层的函数里,却认为活在最顶层的现实,不需要返回到任何地方。而Cobb的“栈”还是完好的,他还记得 现实中的孩子,知道应该返回到顶层去。
这个时候,如果Cobb直接带着Mal卧轨, 不和她说那些有的没的,两人也许就安全地从底层返还了。但是Cobb犯了个错误,他对Mal的潜意识进行了修改,这就相当于故意在Mal的“栈”里放置了 错误的但是有意义的数据。这样当Mal回到最顶层的现实时,本来整个大程序应该宣告结束,但因为她的“栈”被改写了,这个程序就错误地认为自己并不在顶 层。于是Mal就失去了对梦境和现实的分辨力,觉得自己应该再死一次才回到现实。
“悲剧啊!”看见Mal坠下高楼,我不由叹息,一出内存出错的惨剧。
与其说这是一部关于梦的科学幻想,倒不如说是 利用人类的算法对意识进行的一次设计。据说影片的灵感有部分来自侯世达先生的《集异璧》。这是本涉及甚广的奇书,试图综合各学科的知识来探讨意识的机制。 侯先生虽然也不能完全回答自己提出的这个问题,但他猜想意识的关键之处在于“我”这个概念的产生。而这个概念来自自我和外界的区分,来自人类和外界不断的 信息交流。于是对“我”的认知从出生时起就一层层叠进脑内,这种交流积累终其一生循环往复。书中曾把这个过程类比于函数对自身进行循环调用,那么影片中的 故事设计与计算机原理相似的情况倒也不太出乎人意料。
咦,那么有没有可能,导演在试图把计算机科学的知识植入到我们的潜意识里面?银幕前面的你,被他的Inception施中了吗?
Sunday, August 15, 2010
几个不错的博弈和决策的例题
An example of decision-making by backward induction
Consider an unemployed person who will be able to work for ten more years t = 1,2,...,10. Suppose that each year in which she remains unemployed, she may be offered a 'good' job that pays $100, or a 'bad' job that pays $44, with equal probability (50/50). Once she accepts a job, she will remain in that job for the rest of the ten years. (Assume for simplicity that she cares only about her monetary earnings, and that she values earnings at different times equally, i.e., the interest rate is zero.)
Should this person accept bad jobs? To answer this question, we can reason backwards from time t = 10.
* At time 10, the value of accepting a good job is $100; the value of accepting a bad job is $44; the value of rejecting the job that is available is zero. Therefore, if she is still unemployed in the last period, she should accept whatever job she is offered at that time.
* At time 9, the value of accepting a good job is $200 (because that job will last for two years); the value of accepting a bad job is 2*$44 = $88. The value of rejecting a job offer is $0 now, plus the value of waiting for the next job offer, which will either be $44 with 50% probability or $100 with 50% probability, for an average ('expected') value of 0.5*($100+$44) = $72. Therefore regardless of whether the job available at time 9 is good or bad, it is better to accept that offer than wait for a better one.
* At time 8, the value of accepting a good job is $300 (it will last for three years); the value of accepting a bad job is 3*$44 = $132. The value of rejecting a job offer is $0 now, plus the value of waiting for a job offer at time 9. Since we have already concluded that offers at time 9 should be accepted, the expected value of waiting for a job offer at time 9 is 0.5*($200+$88) = $144. Therefore at time 8, it is more valuable to wait for the next offer than to accept a bad job.
It can be verified by continuing to work backwards that bad offers should only be accepted if one is still unemployed at times 9 or 10; they should be rejected at all times up to t = 8. The intuition is that if one expects to work in a job for a long time, this makes it more valuable to be picky about what job to accept.
A dynamic optimization problem of this kind is called an optimal stopping problem, because the issue at hand is when to stop waiting for a better offer. Search theory is the field of microeconomics that applies problems of this type to contexts like shopping, job search, and marriage.--http://en.wikipedia.org/wiki/Backward_induction
逆向归纳法是求解动态博弈的具有演绎性质的方法,然而在蜈蚣博弈(罗森塔尔于1981年提出)之中由它得到的纳什均衡解因不合理,违反直觉而被认为是一个悖论。本文通过引进新的合作性的均衡解概念,使该悖论得到消解。合作性均衡是博弈参与人通过讨价还价这样的“言语行为”在“交流”中得以实现的,而由逆向归纳法得到的完美纳什均衡是在“沉默”中实现的。合作性的均衡所实现的是交流合理性,它能够使所有博弈参与人的支付都得到提高。 --http://www.cqvip.com/qk/92803X/200512/20890844.html
在图中,博弈从左到右进行,横向连杆代表合作策略,向下的连杆代表不合作策略。每个人下面对应的括号代表相应的人采取不合作策略,博弈结束后,各自的收益,括号内左边的数字代表A的收益,右边代表B的收益。如果一开始A就选择了不合作,则两人各得1的收益,而A如果选择合作,则轮到B选择,B如果选择不合作,则A收益为0,B的收益为3,如果B选择合作,则博弈继续进行下去。
可以看到每次合作后总收益在不断增加,合作每继续一次总收益增加1,如第一个括号中总收益为1+1=2,第二个括号为0+3=3,第二个括号则为2+2=4。这样一直下去,直到最后两人都得到10的收益,总体效益最大。遗憾的是这个圆满结局很难达到!
大家注意,在上图中最后一步由B选择时,B选择合作的收益为10,选择不合作的收益为11。根据理性人假设,B将选择不合作,而这时A的收益仅为8。A考虑到B在最后一步将选择不合作,因此他在前一步将选择不合作,因为这样他的收益为9,比8高。B也考虑到了这一点,所以他也要抢先A一步采取不合作策略……如此推论下去,最后的结论是:在第一步A将选择不合作,此时各自的收益为1!这个结论是令人悲伤的。
不难看出,在该博弈的推理过程中,运用的是逆推法。从逻辑推理来看,逆推法是严密的,但结论是不合理的。因为一开始就停止的策略A、B均只能获取1,而采取合作性策略有可能均获取10,当然A一开始采取合作性策略有可能获得0,但1或者0与10相比实在是很小。直觉告诉我们采取“合作”策略是好的。而从逻辑的角度看,A一开始应选择“不合作”的策略。人们在博弈中的真实行动“偏离”了运用逆推法关于博弈的理论预测,造成二者间的矛盾和不一致,这就是蜈蚣博弈的悖论。
A------B------A------B------A------B------A------B------A------A------B------(10,10)
|******|******|******|******|******|******|
(1,1)**(0,3)**(2,2)**(8,8)**(7,10)*(9,9)**(8,11)--http://www.changhai.org/forum/article_load.php?fid=6&aid=1168864387
介绍一个经典案例。
5个海盗抢得100枚金币后,讨论如何进行公正分配。他们商定的分配原则是:
(1)抽签确定各人的分配顺序号码(1,2,3,4,5);
(2)由抽到1号签的海盗提出分配方案,然后5人进行表决,如果方案得到超过半数的人同意,就按照他的方案进行分配,否则就将1号扔进大海喂鲨鱼;
(3)如果1号被扔进大海,则由2号提出分配方案,然后由剩余的4人进行表决,当且仅当超过半数的人同意时,才会按照他的提案进行分配,否则也将被扔入大海;
(4)依此类推。这里假设每一个海盗都是绝顶聪明而理性,他们都能够进行严密的逻辑推理,并能很理智地判断自身的得失,即能够在保住性命的前提下得到最多的金币。同时还假设每一轮表决后的结果都能顺利得到执行,那么抽到1号的海盗应该提出怎样的分配方案才能使自己既不被扔进海里,又可以得到更多的金币呢?
此题公认的标准答案是:1号海盗分给3号1枚金币,4号或5号2枚金币,自己则独得97枚金币,即分配方案为(97,0,1,2,0)或(97,0,1,0,2)。现来看如下各人的理性分析:
首先从5号海盗开始,因为他是最安全的,没有被扔下大海的风险,因此他的策略也最为简单,即最好前面的人全都死光光,那么他就可以独得这100枚金币了。
接下来看4号,他的生存机会完全取决于前面还有人存活着,因为如果1号到3号的海盗全都喂了鲨鱼,那么在只剩4号与5号的情况下,不管4号提出怎样的分配方案,5号一定都会投反对票来让4号去喂鲨鱼,以独吞全部的金币。哪怕4号为了保命而讨好5号,提出(0,100)这样的方案让5号独占金币,但是5号还有可能觉得留着4号有危险,而投票反对以让其喂鲨鱼。因此理性的4号是不应该冒这样的风险,把存活的希望寄托在5号的随机选择上的,他惟有支持3号才能绝对保证自身的性命。
再来看3号,他经过上述的逻辑推理之后,就会提出(100,0,0)这样的分配方案,因为他知道4号哪怕一无所获,也还是会无条件的支持他而投赞成票的,那么再加上自己的1票就可以使他稳获这100金币了。
但是,2号也经过推理得知了3号的分配方案,那么他就会提出(98,0,1,1)的方案。因为这个方案相对于3号的分配方案,4号和5号至少可以获得1枚金币,理性的4号和5号自然会觉得此方案对他们来说更有利而支持2号,不希望2号出局而由3号来进行分配。这样,2号就可以屁颠屁颠的拿走98枚金币了。
不幸的是,1号海盗更不是省油的灯,经过一番推理之后也洞悉了2号的分配方案。他将采取的策略是放弃2号,而给3号1枚金币,同时给4号或5号2枚金币,即提出(97,0,1,2,0)或(97,0,1,0,2)的分配方案。由于1号的分配方案对于3号与4号或5号来说,相比2号的方案可以获得更多的利益,那么他们将会投票支持1号,再加上1号自身的1票,97枚金币就可轻松落入1号的腰包了。
最后通牒博弈中理性的困境
有这样一个博弈:
两人分一笔总量固定的钱,比如100元。方法是:一人提出方案,另外一人表决。如果表决的人同意,那么就按提出的方案来分;如果不同意的话,两人将一无所得。比如A提方案,B表决。如果A提的方案是70∶30,即A得70元,B得30元。如果B接受,则A得70元,B得30元;如果B不同意,则两人将什么都得不到。
A提方案时要猜测B的反应,A会这样想:根据理性人的假定,A无论提出什么方案给B——除了将所有100元留给自己而一点不给B留这样极端的情况,B 只有接受,因为B接受了还有所得,而不接受将一无所获——当然此时A也将一无所获。此时理性的A的方案可以是:留给B一点点比如1分钱,而将99.99元归为己有,即方案是:99.99∶0.01。B接受了还会有0.01元,而不接受,将什么也没有。
这是根据理性人的假定的结果,而实际则不是这个结果。英国博弈论专家宾莫做了实验,发现提方案者倾向于提50∶50,而接受者会倾向于:如果给他的少于30%,他将拒绝;多于30%,则不拒绝。
这个博弈反映的是“人是理性的”这样的假定在某些时候存在着与实际不符的情况。
理论的假定与实际不符的另外一个例子是“彩票问题”。--http://blog.sina.com.cn/s/blog_53735c9d0100bo6q.html
高成本 低成本
默许 阻挠 默许 阻挠
进入 40,50 -10,0 30,100 -10,140
不进入 0,300 0,300 0,400 0,400
在无限重复中,行为规则可以用自动机来代表,于是不同行为规则的 相争,便成了机器与机器的角斗。假设甲和乙玩无限重复的囚犯博奕。甲相信《美德的起源》一书作者的教导,认定仁厚忠恕既高尚又有效,于是 以它为策略。乙信奉理性流氓主义,崇尚实力和实利,于是以流氓主义为策略。这样,二人间的博弈,就可以看作恕道机器与流氓机器的争斗。根 据上一贴中列出的框图,我们可以推演出各个回合双方的行为如下:第一回合,甲仁厚玩合作H,乙宰客玩欺骗D; 第二回合,甲报复玩欺骗D,乙仍然宰客玩欺骗D;第三回合,甲仍报复玩欺骗D,乙发现甲并非傻客,于是玩合作H; 第四回合,甲原谅乙,玩合作H;乙却因甲上次不合作,回头玩欺骗D宰客; ⋯⋯ 如此等等。采用我们上贴里的报偿表,整个结果序列如下图所示: 循 环 循 环 循 环 ┌———┐ ┌———┐ ┌———┐ ↓ ↓ ↓ ↓ ↓ ↓ 行为:甲 H D D H D D H D D 乙 D D H D D H D D H 报偿:甲 0 2 6 0 2 6 0 2 6 乙 6 2 0 6 2 0 6 2 0 ⋯⋯ 请注意,此序列呈现一个有趣的规律:就是每三个一组,不断循环重复。于是我们很容易算出,博弈各方平均每个回合的报偿有多少 只要 取相继三个回合,作个简单平均就够了。甲得到(0+2+6)/ 3 = 2.67,乙得到(6+2+0)/ 3=2.67。显然,两者平分秋色, 不相上下,谁也不比谁差,谁也不比谁强。这种循环重复并不是特例。可以证明,有限自动机玩无限重复博弈, 其结果最终都会变成循环重复序列。于是,利用类似的办法,我们可以针对上贴中列出的七种策略,算出每一对策略相博所产生的的平均报偿。这 些报偿可以写成一个7×7博奕矩阵,如下表所示(其中一些略去了小数,这不影响下面的讨论): 乙 傻客 恶棍 冷血 恕道 侠义 流氓 摇摆 ·---------------------------· 傻客|4,4|0,6|4,4|4,4|4,4|0,6|0,6| |---+---+---+---+---+---+---|恶棍|6,0|②,②|2,2|2,2|2,2|3,1|2,2| |---+---+---+---+---+---+---|冷血|4,4|2,2|④,④|④,④|2,2|3,1|2,2| |---+---+---+---+---+---+---|恕道|4,4|2,2|④,④|④,④|3,3|2,2|2,2| 甲 |---+---+---+---+---+---+---|侠义|4,4|2,2|2,2|3,3|2,2|2,2|2,2| |---+---+---+---+---+---+---|流氓|6,0|1,3|1,3|2,2|2,2|④,④|2,4| |---+---+---+---+---+---+---|摇摆|6,0|2,2|2,2|2,2|2,2|4,2|③,③| ·---------------------------· 上面这个表里面,有带圈数字的格子都是平衡点。比如,乙玩恶棍策 略时,甲无论玩什么,都不比当恶棍带来的好处更多,顶多不致受损而已。因此,甲乙双方都当恶棍,次次都玩欺骗,便是重复囚犯博奕的平衡点之 一,此时各方的报偿与一次性博奕相同,都是2。观察一下上面这个表,我们会发现它有多个平衡点。非重复博弈中的 均衡点,恶棍对恶棍,双方永远玩欺骗,仍然是无限重复博弈的均衡点。无条件合作的傻客策略,仍然不是重复博弈的均衡点 理性的人,决不 会当傻客。 更重要的是,重复博弈引进了许多新的平衡点,其中有不少平衡点,可以实现合作报偿(4,4)。 这包括恕道策略对恕道策略,恕道策略对冷血 策略,冷血策略对冷血策略,流氓策略对流氓策略等,都可以维持双方的合作。以流氓对流氓为例:第一回合,双方耍流氓互宰,发现对方不是好 惹的之后,双方转入合作心态,此后一直维持合作,这样无限次重复,其平均报偿都是4。 事实上,存在这无穷多对有限自动机策略,可以成为无限重复博弈的 平衡点,并同时实现双方的合作。这就是有名的“大众定理(Folk Theorem)”, 又译作“无名氏定理”。它之得名,是由于重复博弈促进合作的思想,早就有很多人提出,以致无法追溯到其原创者,于是以“无名氏”名之。 大众定理说明了行为规则的多样性:有无穷多种行为规则可以支持合作行为。在正常的平衡状态中,可观察到的行为可以完全相同的,此即博 弈双方相互合作,不玩欺骗。但其背后的行为规则却可能大不相同 合作,可以是由于双方都信奉仁厚的恕道主义,也可能是因为双方都是理性 流氓,还可能是因为双方都一冷血报复作威胁。这些行为规则上的区别,在正常的平衡状态中,是看不出来的,只有在非正常情况下,或在与外人 的交往中,才会表现出来。为说明此点,设想有两个相互隔离的社会:一个形成了理性流氓式的 行为规则,一个形成仁厚恕道的行为规则,他们各自内部都能维持相互合作,这形成了社会的正常状态。外人但凭观察这两个社会中人们的正常行 为,看不出他们有什么区别。现在假设两个社会打破隔离,相互接触,会产生甚么情况? 两套行为规则间会出现激烈的冲突! 初次接触,流氓主义者将把对方当傻客,大宰其客。恕道主义者假设对方是好人,选择合作,只是在吃了亏之后,才以回宰其客相回报。流氓 主义者见对方回宰,以为对方也是跟自己一样的流氓,于是转向合作心态,同时预期对方也选择合作。但恕道主义者根据“以直报怨”的原则,仍然 以宰客回报对方上次的欺骗。流氓主义者一看对方不合作,怒从心起,于是报之以宰客,如此循环往复,双方永远无法达成合作。 行为规则的冲突,类似于人文学科里常说的文化冲突。由于行为规则反映了人们对各自行为的稳定预期,一些博弈论者把不同的行为规则解释 为不同的文化信仰,应当是不无道理的。我觉得,重复博弈理论,为我们科学理解许多文化现象,打开了大门。 正是由于行为规则本身的多样性和复杂性,所以我对成朴文章中过分 抬高“一报还一报(tit for tat)”单一规则,将之推崇为美德的起源,始终抱有疑虑
Consider an unemployed person who will be able to work for ten more years t = 1,2,...,10. Suppose that each year in which she remains unemployed, she may be offered a 'good' job that pays $100, or a 'bad' job that pays $44, with equal probability (50/50). Once she accepts a job, she will remain in that job for the rest of the ten years. (Assume for simplicity that she cares only about her monetary earnings, and that she values earnings at different times equally, i.e., the interest rate is zero.)
Should this person accept bad jobs? To answer this question, we can reason backwards from time t = 10.
* At time 10, the value of accepting a good job is $100; the value of accepting a bad job is $44; the value of rejecting the job that is available is zero. Therefore, if she is still unemployed in the last period, she should accept whatever job she is offered at that time.
* At time 9, the value of accepting a good job is $200 (because that job will last for two years); the value of accepting a bad job is 2*$44 = $88. The value of rejecting a job offer is $0 now, plus the value of waiting for the next job offer, which will either be $44 with 50% probability or $100 with 50% probability, for an average ('expected') value of 0.5*($100+$44) = $72. Therefore regardless of whether the job available at time 9 is good or bad, it is better to accept that offer than wait for a better one.
* At time 8, the value of accepting a good job is $300 (it will last for three years); the value of accepting a bad job is 3*$44 = $132. The value of rejecting a job offer is $0 now, plus the value of waiting for a job offer at time 9. Since we have already concluded that offers at time 9 should be accepted, the expected value of waiting for a job offer at time 9 is 0.5*($200+$88) = $144. Therefore at time 8, it is more valuable to wait for the next offer than to accept a bad job.
It can be verified by continuing to work backwards that bad offers should only be accepted if one is still unemployed at times 9 or 10; they should be rejected at all times up to t = 8. The intuition is that if one expects to work in a job for a long time, this makes it more valuable to be picky about what job to accept.
A dynamic optimization problem of this kind is called an optimal stopping problem, because the issue at hand is when to stop waiting for a better offer. Search theory is the field of microeconomics that applies problems of this type to contexts like shopping, job search, and marriage.--http://en.wikipedia.org/wiki/Backward_induction
逆向归纳法是求解动态博弈的具有演绎性质的方法,然而在蜈蚣博弈(罗森塔尔于1981年提出)之中由它得到的纳什均衡解因不合理,违反直觉而被认为是一个悖论。本文通过引进新的合作性的均衡解概念,使该悖论得到消解。合作性均衡是博弈参与人通过讨价还价这样的“言语行为”在“交流”中得以实现的,而由逆向归纳法得到的完美纳什均衡是在“沉默”中实现的。合作性的均衡所实现的是交流合理性,它能够使所有博弈参与人的支付都得到提高。 --http://www.cqvip.com/qk/92803X/200512/20890844.html
在图中,博弈从左到右进行,横向连杆代表合作策略,向下的连杆代表不合作策略。每个人下面对应的括号代表相应的人采取不合作策略,博弈结束后,各自的收益,括号内左边的数字代表A的收益,右边代表B的收益。如果一开始A就选择了不合作,则两人各得1的收益,而A如果选择合作,则轮到B选择,B如果选择不合作,则A收益为0,B的收益为3,如果B选择合作,则博弈继续进行下去。
可以看到每次合作后总收益在不断增加,合作每继续一次总收益增加1,如第一个括号中总收益为1+1=2,第二个括号为0+3=3,第二个括号则为2+2=4。这样一直下去,直到最后两人都得到10的收益,总体效益最大。遗憾的是这个圆满结局很难达到!
大家注意,在上图中最后一步由B选择时,B选择合作的收益为10,选择不合作的收益为11。根据理性人假设,B将选择不合作,而这时A的收益仅为8。A考虑到B在最后一步将选择不合作,因此他在前一步将选择不合作,因为这样他的收益为9,比8高。B也考虑到了这一点,所以他也要抢先A一步采取不合作策略……如此推论下去,最后的结论是:在第一步A将选择不合作,此时各自的收益为1!这个结论是令人悲伤的。
不难看出,在该博弈的推理过程中,运用的是逆推法。从逻辑推理来看,逆推法是严密的,但结论是不合理的。因为一开始就停止的策略A、B均只能获取1,而采取合作性策略有可能均获取10,当然A一开始采取合作性策略有可能获得0,但1或者0与10相比实在是很小。直觉告诉我们采取“合作”策略是好的。而从逻辑的角度看,A一开始应选择“不合作”的策略。人们在博弈中的真实行动“偏离”了运用逆推法关于博弈的理论预测,造成二者间的矛盾和不一致,这就是蜈蚣博弈的悖论。
A------B------A------B------A------B------A------B------A------A------B------(10,10)
|******|******|******|******|******|******|
(1,1)**(0,3)**(2,2)**(8,8)**(7,10)*(9,9)**(8,11)--http://www.changhai.org/forum/article_load.php?fid=6&aid=1168864387
介绍一个经典案例。
5个海盗抢得100枚金币后,讨论如何进行公正分配。他们商定的分配原则是:
(1)抽签确定各人的分配顺序号码(1,2,3,4,5);
(2)由抽到1号签的海盗提出分配方案,然后5人进行表决,如果方案得到超过半数的人同意,就按照他的方案进行分配,否则就将1号扔进大海喂鲨鱼;
(3)如果1号被扔进大海,则由2号提出分配方案,然后由剩余的4人进行表决,当且仅当超过半数的人同意时,才会按照他的提案进行分配,否则也将被扔入大海;
(4)依此类推。这里假设每一个海盗都是绝顶聪明而理性,他们都能够进行严密的逻辑推理,并能很理智地判断自身的得失,即能够在保住性命的前提下得到最多的金币。同时还假设每一轮表决后的结果都能顺利得到执行,那么抽到1号的海盗应该提出怎样的分配方案才能使自己既不被扔进海里,又可以得到更多的金币呢?
此题公认的标准答案是:1号海盗分给3号1枚金币,4号或5号2枚金币,自己则独得97枚金币,即分配方案为(97,0,1,2,0)或(97,0,1,0,2)。现来看如下各人的理性分析:
首先从5号海盗开始,因为他是最安全的,没有被扔下大海的风险,因此他的策略也最为简单,即最好前面的人全都死光光,那么他就可以独得这100枚金币了。
接下来看4号,他的生存机会完全取决于前面还有人存活着,因为如果1号到3号的海盗全都喂了鲨鱼,那么在只剩4号与5号的情况下,不管4号提出怎样的分配方案,5号一定都会投反对票来让4号去喂鲨鱼,以独吞全部的金币。哪怕4号为了保命而讨好5号,提出(0,100)这样的方案让5号独占金币,但是5号还有可能觉得留着4号有危险,而投票反对以让其喂鲨鱼。因此理性的4号是不应该冒这样的风险,把存活的希望寄托在5号的随机选择上的,他惟有支持3号才能绝对保证自身的性命。
再来看3号,他经过上述的逻辑推理之后,就会提出(100,0,0)这样的分配方案,因为他知道4号哪怕一无所获,也还是会无条件的支持他而投赞成票的,那么再加上自己的1票就可以使他稳获这100金币了。
但是,2号也经过推理得知了3号的分配方案,那么他就会提出(98,0,1,1)的方案。因为这个方案相对于3号的分配方案,4号和5号至少可以获得1枚金币,理性的4号和5号自然会觉得此方案对他们来说更有利而支持2号,不希望2号出局而由3号来进行分配。这样,2号就可以屁颠屁颠的拿走98枚金币了。
不幸的是,1号海盗更不是省油的灯,经过一番推理之后也洞悉了2号的分配方案。他将采取的策略是放弃2号,而给3号1枚金币,同时给4号或5号2枚金币,即提出(97,0,1,2,0)或(97,0,1,0,2)的分配方案。由于1号的分配方案对于3号与4号或5号来说,相比2号的方案可以获得更多的利益,那么他们将会投票支持1号,再加上1号自身的1票,97枚金币就可轻松落入1号的腰包了。
最后通牒博弈中理性的困境
有这样一个博弈:
两人分一笔总量固定的钱,比如100元。方法是:一人提出方案,另外一人表决。如果表决的人同意,那么就按提出的方案来分;如果不同意的话,两人将一无所得。比如A提方案,B表决。如果A提的方案是70∶30,即A得70元,B得30元。如果B接受,则A得70元,B得30元;如果B不同意,则两人将什么都得不到。
A提方案时要猜测B的反应,A会这样想:根据理性人的假定,A无论提出什么方案给B——除了将所有100元留给自己而一点不给B留这样极端的情况,B 只有接受,因为B接受了还有所得,而不接受将一无所获——当然此时A也将一无所获。此时理性的A的方案可以是:留给B一点点比如1分钱,而将99.99元归为己有,即方案是:99.99∶0.01。B接受了还会有0.01元,而不接受,将什么也没有。
这是根据理性人的假定的结果,而实际则不是这个结果。英国博弈论专家宾莫做了实验,发现提方案者倾向于提50∶50,而接受者会倾向于:如果给他的少于30%,他将拒绝;多于30%,则不拒绝。
这个博弈反映的是“人是理性的”这样的假定在某些时候存在着与实际不符的情况。
理论的假定与实际不符的另外一个例子是“彩票问题”。--http://blog.sina.com.cn/s/blog_53735c9d0100bo6q.html
高成本 低成本
默许 阻挠 默许 阻挠
进入 40,50 -10,0 30,100 -10,140
不进入 0,300 0,300 0,400 0,400
在无限重复中,行为规则可以用自动机来代表,于是不同行为规则的 相争,便成了机器与机器的角斗。假设甲和乙玩无限重复的囚犯博奕。甲相信《美德的起源》一书作者的教导,认定仁厚忠恕既高尚又有效,于是 以它为策略。乙信奉理性流氓主义,崇尚实力和实利,于是以流氓主义为策略。这样,二人间的博弈,就可以看作恕道机器与流氓机器的争斗。根 据上一贴中列出的框图,我们可以推演出各个回合双方的行为如下:第一回合,甲仁厚玩合作H,乙宰客玩欺骗D; 第二回合,甲报复玩欺骗D,乙仍然宰客玩欺骗D;第三回合,甲仍报复玩欺骗D,乙发现甲并非傻客,于是玩合作H; 第四回合,甲原谅乙,玩合作H;乙却因甲上次不合作,回头玩欺骗D宰客; ⋯⋯ 如此等等。采用我们上贴里的报偿表,整个结果序列如下图所示: 循 环 循 环 循 环 ┌———┐ ┌———┐ ┌———┐ ↓ ↓ ↓ ↓ ↓ ↓ 行为:甲 H D D H D D H D D 乙 D D H D D H D D H 报偿:甲 0 2 6 0 2 6 0 2 6 乙 6 2 0 6 2 0 6 2 0 ⋯⋯ 请注意,此序列呈现一个有趣的规律:就是每三个一组,不断循环重复。于是我们很容易算出,博弈各方平均每个回合的报偿有多少 只要 取相继三个回合,作个简单平均就够了。甲得到(0+2+6)/ 3 = 2.67,乙得到(6+2+0)/ 3=2.67。显然,两者平分秋色, 不相上下,谁也不比谁差,谁也不比谁强。这种循环重复并不是特例。可以证明,有限自动机玩无限重复博弈, 其结果最终都会变成循环重复序列。于是,利用类似的办法,我们可以针对上贴中列出的七种策略,算出每一对策略相博所产生的的平均报偿。这 些报偿可以写成一个7×7博奕矩阵,如下表所示(其中一些略去了小数,这不影响下面的讨论): 乙 傻客 恶棍 冷血 恕道 侠义 流氓 摇摆 ·---------------------------· 傻客|4,4|0,6|4,4|4,4|4,4|0,6|0,6| |---+---+---+---+---+---+---|恶棍|6,0|②,②|2,2|2,2|2,2|3,1|2,2| |---+---+---+---+---+---+---|冷血|4,4|2,2|④,④|④,④|2,2|3,1|2,2| |---+---+---+---+---+---+---|恕道|4,4|2,2|④,④|④,④|3,3|2,2|2,2| 甲 |---+---+---+---+---+---+---|侠义|4,4|2,2|2,2|3,3|2,2|2,2|2,2| |---+---+---+---+---+---+---|流氓|6,0|1,3|1,3|2,2|2,2|④,④|2,4| |---+---+---+---+---+---+---|摇摆|6,0|2,2|2,2|2,2|2,2|4,2|③,③| ·---------------------------· 上面这个表里面,有带圈数字的格子都是平衡点。比如,乙玩恶棍策 略时,甲无论玩什么,都不比当恶棍带来的好处更多,顶多不致受损而已。因此,甲乙双方都当恶棍,次次都玩欺骗,便是重复囚犯博奕的平衡点之 一,此时各方的报偿与一次性博奕相同,都是2。观察一下上面这个表,我们会发现它有多个平衡点。非重复博弈中的 均衡点,恶棍对恶棍,双方永远玩欺骗,仍然是无限重复博弈的均衡点。无条件合作的傻客策略,仍然不是重复博弈的均衡点 理性的人,决不 会当傻客。 更重要的是,重复博弈引进了许多新的平衡点,其中有不少平衡点,可以实现合作报偿(4,4)。 这包括恕道策略对恕道策略,恕道策略对冷血 策略,冷血策略对冷血策略,流氓策略对流氓策略等,都可以维持双方的合作。以流氓对流氓为例:第一回合,双方耍流氓互宰,发现对方不是好 惹的之后,双方转入合作心态,此后一直维持合作,这样无限次重复,其平均报偿都是4。 事实上,存在这无穷多对有限自动机策略,可以成为无限重复博弈的 平衡点,并同时实现双方的合作。这就是有名的“大众定理(Folk Theorem)”, 又译作“无名氏定理”。它之得名,是由于重复博弈促进合作的思想,早就有很多人提出,以致无法追溯到其原创者,于是以“无名氏”名之。 大众定理说明了行为规则的多样性:有无穷多种行为规则可以支持合作行为。在正常的平衡状态中,可观察到的行为可以完全相同的,此即博 弈双方相互合作,不玩欺骗。但其背后的行为规则却可能大不相同 合作,可以是由于双方都信奉仁厚的恕道主义,也可能是因为双方都是理性 流氓,还可能是因为双方都一冷血报复作威胁。这些行为规则上的区别,在正常的平衡状态中,是看不出来的,只有在非正常情况下,或在与外人 的交往中,才会表现出来。为说明此点,设想有两个相互隔离的社会:一个形成了理性流氓式的 行为规则,一个形成仁厚恕道的行为规则,他们各自内部都能维持相互合作,这形成了社会的正常状态。外人但凭观察这两个社会中人们的正常行 为,看不出他们有什么区别。现在假设两个社会打破隔离,相互接触,会产生甚么情况? 两套行为规则间会出现激烈的冲突! 初次接触,流氓主义者将把对方当傻客,大宰其客。恕道主义者假设对方是好人,选择合作,只是在吃了亏之后,才以回宰其客相回报。流氓 主义者见对方回宰,以为对方也是跟自己一样的流氓,于是转向合作心态,同时预期对方也选择合作。但恕道主义者根据“以直报怨”的原则,仍然 以宰客回报对方上次的欺骗。流氓主义者一看对方不合作,怒从心起,于是报之以宰客,如此循环往复,双方永远无法达成合作。 行为规则的冲突,类似于人文学科里常说的文化冲突。由于行为规则反映了人们对各自行为的稳定预期,一些博弈论者把不同的行为规则解释 为不同的文化信仰,应当是不无道理的。我觉得,重复博弈理论,为我们科学理解许多文化现象,打开了大门。 正是由于行为规则本身的多样性和复杂性,所以我对成朴文章中过分 抬高“一报还一报(tit for tat)”单一规则,将之推崇为美德的起源,始终抱有疑虑
Wednesday, April 28, 2010
如何养成早起的习惯
在天亮之前起床是个好习惯,这将有助于你的健康,财富和智慧。——亚里斯多德
早起三光,晚起三慌。——中国谚语
早起的习惯是天生的还是后天养成的呢?在我身上,它显然是在后天养成的。在我20岁之前,我很少在午夜前睡觉,几乎总是睡的很晚,通常我会一直睡到每天的傍晚才起床。
但是后来的一段时间我不能继续忽视成功与早起之间的紧密联系了,尤其是在我身上看到了这一点。在我那些少有的早起的日子里,我意识到我的生产效率不 光是早上,而是整整一天都非常高。并且这样做我感觉非常好,我决定养成早起的好习惯,于是立即将闹钟调到了凌晨5点………
……..第二天早上,我在快到中午时才起床。
Hmmm………
我又进行了多次的尝试,基本上每一次都是在那个时间段醒来。我开始怀疑我的身上是不是没有携带早起的基因。每当我的闹钟响的时候,我的第一反应总是想将它关掉然后回去继续睡觉。这个习惯我又保持了几年,但是最终我偶然发现了几篇关于睡眠的调查研究,它们让我意识到我在这个问题上一直是错误的。只要我能把这些调查研究得到的方法应用到我自己身上,我就可以养成一个持久的早起习惯。
使用错误的策略很难使你养成早起的习惯,但是使用这些正确的策略,却相对容易的多。
最通常的错误策略是:你认为,如果你想要早起的话,你最好早点去睡觉。因此你会计算一下你现在一般每天要睡几个小时,然后计算出需要在新的基础上往回移动几个小时。比如说现在你从午夜(夜晚12点)睡到早上8点,你预测如果你在晚上10点睡的话,那么第二天你就可以在凌晨6点起床。听起来似乎很有道理,但是这通常会失效。
目前关于睡眠模式有两个主要的流派。其中一个学派认为你应该每天都按时睡觉,并按时起床。就好像在这两个时刻都有个闹钟一样——你试图在每天晚上的同一时刻入睡。这看起来好像适应于现代社会的节奏,我们需要有一个准确的日程安排表,并且要保证每天有足够的休息。
另外一个学派认为你应该根据身体的需要,累的时候就去休息,睡到自然醒就要起床。这种方法植根于生物学说,我们的身体知道我们需要多少睡眠,因此我们应该听从它们的命令。
通过试验,我发现对我来说两个都不是最佳的睡眠模式。如果你重视你的生产效率的话,它们都是错误的,以下是我这样说的原因:
如果你的睡眠时间固定,那么有时候你可能不是很困就要去睡觉。如果你需要花费超过5分钟的时间才能够入睡的话,这说明你并不是很困。你醒着躺在床上浪费时间,却不能入睡。另外一个问题是你认为你每天都需要同样长的睡眠时间,这是一个错误的假设。你的睡眠时间应该根据每天不同的情况而有所不同。(译者:我觉得还会有这样一个问题,比如说你假设你每天都需要睡够8个小时,可是你有时候早上会提前醒,但是这时候你告诉你自己:“我还没有睡够,在睡一会吧。”可是事实上,你几乎难以再次入睡,你只是在床上磨时间,把你认为你需要的睡眠时间磨完了才会起床 :) )
如果你根据身体的需要去睡眠,很有可能你的睡眠时间会超过你实际需要的睡眠时间——大多数情况下会超出很多,比如说每周会超出10-15个小时(这相当于整整醒着的一天)。许多以这种方式休息的人每晚上休息的时间都超过了8个小时,这通常是过多的。而且,如果你每天早上在不同的时间起床,那么你每天起床的时间就难以预测。因为有时候我们的生活会失去节奏(译者:比如说大学生的周末,一般都是3点之后才睡觉,而平时基本上都是12点睡觉,这样就会打乱生活的节奏),你可能会发现你的睡眠时间变得飘忽不定。
最佳得解决方案是把二者结合起来。方法非常简单,很多起早的人都在自觉不自觉中使用这个方法,虽然如此,它对我来说还是一个心理上的巨大突破。解决的方案是当我感到瞌睡的时候就去睡觉(只有当我感到瞌睡的时候),然后在每天的固定时间(每周七天)设置闹钟,响了就立刻起床。因此我总是在每天的同一个时刻(我定的是早上5点)起床,但是我上床睡觉的时间每天晚上都有所不同。
当我实在困了的时候我才会上床睡觉。我测试睡意的方法是:如果我不能够连续不间断地读完一本书的一两页,我就要准备去睡觉了。大多数情况是当我上床后,我会在三分钟之内睡着。我舒舒服服地躺下,然后立即就睡着了。有时候我会在晚上9点半就上床睡觉了,有时候我又会一直到午夜12点才睡觉,通常的情况是我在晚上10点到11点之间上床。如果我一直不想睡,我会一直忙到我不能睁开眼睛才去睡觉。在这段时间内,读书是一个很好的选择,因为当我困得实在不能在读下去的时候,这一般是显而易见的,我就会马上去睡觉。
每天早上当我的闹钟响的时候,我会把它关掉,伸一个长长的懒腰,然后坐起来。我这时候什么都不想,因为我知道,我赖在床上的时间越长,我接着再睡的可能性就越大。因此一旦闹钟响了,我就不允许我去想再睡一会的好处。即使我很想再睡一会,我通常也会立刻起床。
在坚持这个模式一段日子后,我发现我的睡眠规律逐渐变得有节奏了。如果前一天晚上我的睡眠时间不够充分,第二天晚上我自然而然地就会提前睡觉以补充足够的睡眠。而如果我的精力非常旺盛,一点都感觉不到累,我就会睡的少一些。我的身体学会了什么时候将我叫醒,因为它知道我通常会在每天的那个时刻起床。
这样做的一个很好的效果是,我平均每天晚上睡觉的时间减少了90分钟,但是我却感觉更轻松,我想这主要是因为我在床上的时间基本上都在睡眠中。
我得知这样一个情况,那些失眠的人都是那些明明不瞌睡却要上床睡觉的人。如果你不瞌睡,而且你发现自己无法立即入睡,那么立即起来,让你的头脑保持清醒一段时间。一直等到你的体内开始分泌激素,你的意识开始变得模糊,你再去睡觉。如果你能够在你瞌睡的时候去睡觉,在一个固定的时间起床,那么你的失眠症将会不治自愈。第一天晚上你可能要待到很晚,但是你会在上床之后立刻入睡。你可能会因为整晚只睡几个小时而在第二天起的太早时(相对太早)感到很累,但是经过一天的忙碌之后,你就会想在第二天晚上早一点上床睡觉。经过一段时间后,你就能养成每天晚上大概都在某一个时间上床,并且迅速入睡的习惯。
因此如果你想成为一个起早者(或者只是想更多的控制你的睡眠模式),那么就试试这样做吧:只有当你太瞌睡而不能继续坚持下去时才去睡觉,每天早上都在同一个固定的时间起床。
PS:关于如何成为一个起早者还有续文,介绍了需要注意的一些细节上的问题,具体的内容请参照:如何成为一个起早者(二)
如何成为一个起早者(二)
原文地址:How to Become an Early Riser - Part II
作者:Steve Pavlina
翻译:Angelived
译文地址:
http://angelived.org/2007/05/22/how-to-become-an-early-riser-part-ii/
(原作者 :上周一的那篇文章“如何成为一个起早者”显然引起了很多人的共鸣,那篇文章收到了很多反向链接(反向链接加上回复总共213个,后来作者把评论关闭了,否则会更多 :)),超过这个站点上任何一篇我写过的文章。...........)
(译者:因为上一篇文章反响很大,因此作者决定再写一篇文章来讲一下更细节方面的东西)
首先,在“当你困的时候才去睡觉”这个问题上,要想做到这一点,需要你能够意识到什么时候你瞌睡了。(不知道翻译的对不对 ;) 原句按单词的组合意思是“需要你有正确的混合意识和常识” )。
如果你在睡觉前做一些很刺激的活动,你就会(译者加:因为太兴奋而)睡地更晚,并且在睡觉前感觉不到瞌睡。大学期间我经常通宵与宿舍的同学打扑克,天亮之后我们常常会出去吃早餐。如果我要做工作、和朋友一起出去玩或者做其他很刺激的活动,我就可以容易地比平时晚些睡觉。
但是这不是我指的“你要意识到什么时候你瞌睡了”。我在这个测试中提到过“如果你不能够专心地连续读完一本书的一两页(说明你要准备去睡觉了)”。但是这并不意味着你要等到你快要精疲力尽的时候才去睡觉。
我所指的“想睡的征兆”是指当你的头脑开始释放激素,促使你瞌睡。这和感觉到累是不同的,事实上,你只是感觉到昏昏欲睡。但是为了使你的头脑释放激素,你需要创造一定的条件来使得它发生。这意味着你要让自己在睡之前把节奏放慢下来,我发现阅读是最棒的一个途径让你在睡之前放慢节奏。有些人说在床上看书是个不好的习惯.......可是我从来对在床上看书没有任何问题,因为当我太瞌睡而不能阅读下去的时候,我就可以把书放下,然后马上入睡。不过如果你喜欢的话,你也可以坐在椅子上看书。
另外一个测试你可以使用的是,问问你自己,“如果我现在去睡觉的话,我能多快入睡?”如果你认为你将需要超过15分钟的时间入睡的话,我会告诉你继续做你手中的事情,等会在去睡觉。
一旦你设定了一个固定的时间醒来,可能会需要你通过几次实践来确定你正确的睡觉时间范围。刚开始的时候你可能会看到变动比较大,一天晚上睡的太晚,另一天晚上睡的太早。但是最终你会找到一个感觉,你能够感觉到什么时候你去睡觉会马上睡着,并且第二天你仍然精力充沛。
为了防止你睡的过晚,给自己划定一个最晚睡觉时间,即使这时候你完全不瞌睡,无论如何你也要在那个时间上床睡觉。我知道我每天晚上至少需要6.5个小时的睡眠时间,但是如果遇到了紧急情况,那么我可以只睡5个小时,第二天还很好,前提是我并不是每天晚上都这么做。现在我的睡眠时间最长为7.5小时。在我开始每天早上准时醒之前,我经常每天晚上睡8到9个小时,如果有时候真的累的话,甚至睡10个小时。
如果你白天喝咖啡的话,好像这可能会打乱你的睡眠周期。因为起初的那篇文章假设你不依靠药物保持清醒,如果你喝咖啡有瘾的话,那么请先戒除你的咖啡瘾。如果你的大脑依靠化学物质的话,那么不要指望你的睡意会在合适的时间到来。
先前那篇文章的目的在于说明如何养成早起的好习惯。因此提的建议是直接关于如何养成这个习惯的。一旦这个习惯养成了,它就可以下意识的起作用。你可以做刺激的活动,比如说工作或者玩电动游戏,你将会知道什么时候你需要去睡觉了,即使它和以往晚上睡觉的时间不同。我说讲过的睡意测试对于养成这个习惯非常重要,不过在养成习惯之后,精确的信号(这里指的应该是你自己能够感觉到睡意的到来)会取代它起作用。
如果真的需要的话你可以不时的睡地晚一些。如果我一直到凌晨3点才睡觉,我就不打算在第二天早上5点起床,但是我会在第二天恢复到原来的起床时间。
我推荐你坚持每天在同一时间起床一个月,以此来养成早起的习惯。但是在这之后,你就会因为条件反射每天都在那个时间醒来,而你将很难再次入睡。我决定在周六早上起的晚一些,所以我没有设置闹钟,但是我自动地在4点58准时醒来。然后我试图再次入睡,但是我已经清醒了,我完全无法再次入睡。哦,好吧。一旦这个习惯被养成,那么想要准时起床就一点都不难了。这就像你知道什么时候你瞌睡了你就会去睡觉一样。
如果你有小孩的话,你必须尽量去适应它。我的两个孩子,一个5岁,另外一个只有1岁。有事他们把我从半夜吵醒——我的女儿有个习惯,她喜欢在睡床里 “摇晃着”告诉我妻子和我关于她做的梦,或者有时仅仅想和我们聊天。我知道你的婴儿隔几个小时就醒的状况,因此如果你是这种情况的话,我给你的建议是当你能睡的时候就睡。想让婴儿遵守“日程安排”是不大可能的 :)
如果你不能在你的闹钟响后起床的话,这好像要归咎于你缺乏自制力。如果你有足够的自制力的话,无论如何你都可以马上从被窝里跳起来的。起初的动机会有效,但是动机可能只会持续几天。规律就好像肌肉一样,你越是经常训练它,你就越能依靠它。每个人都有它自己的一些规律(你可以控制你的呼吸么?),但是并不是每个人都有意地去发展它。有很多方法可以养成规律——你可以看下整个六篇关于如何建立规律的系列文章(我会在之后将六篇文章中的经典部分翻译过来,想进一步了解如何养成规律的话,你可以用抓虾或者其他的订阅工具订阅我的博客 :) )。基本上它可以归结为克服一些小的挑战,战胜了它们,并逐渐地发展成为习惯,这就好像是举重练习一样。当你的自制力逐渐变强,像在某个特定的时间起床这样的挑战将最终变得那么简单。但是如果你的自制力衰退的话,那么它就好像是一个几乎不可逾越的障碍一样。
为什么要早起?
我要说主要的原因的是你可以有更多的时间来做比睡觉更有趣(译者:我认为是“更有意义” :) )的事情。
再提一次,我已经从每周节省出10到15个小时来做这些事情了。这些额外的时间效率是非常明显的。到上午6点半之前,我已经做完了锻炼,冲了个澡,吃了早饭,我已经在我的办公桌前准备去工作。我可以每天挤出不少时间来做一些富有成效的工作,并且我通常在下午5点之前完成了一天的工作(那包括私人的 “工作” 比如说发邮件,支付帐单,去幼儿园接我的女儿,等等)。这给了我每晚5到6个小时的自由时间来关心家人、参加休闲活动、主持节目、阅读、写日记等等。而最重要的是,我在这段时间中依然精力充沛。抽出时间来做那些所有对我重要的事情会使我感到非常平衡,放松和乐观。
想一想你可以利用空闲的时间来做些什么。即使每天多余出30分钟也足够你每天进行身体锻炼,读书,维护一个博客,冥想,煮健康的饭菜,学习一门乐器等等。积小成多,即使每天一段很短的时间经过一年的积累也将会变得巨大,每天多余出30分钟一年就是182.5个小时。这可比一个月的工作时间还要长(按每星期工作40个小时)。如果你能每天节省60分钟的话,一年你能节省的时间就会翻倍,如果你能每天节省90分钟的话,那么它就会变成三倍。对我来说,我每天大概能够节省90分钟的时间。那就是说我每工作十年,就相当于其他人工作十一年。我可以用那一年的时间来精力充沛地做以前我没有时间做的事情,这是多么美妙! :)--http://blog.renren.com/blog/228806186/457480942
早起三光,晚起三慌。——中国谚语
早起的习惯是天生的还是后天养成的呢?在我身上,它显然是在后天养成的。在我20岁之前,我很少在午夜前睡觉,几乎总是睡的很晚,通常我会一直睡到每天的傍晚才起床。
但是后来的一段时间我不能继续忽视成功与早起之间的紧密联系了,尤其是在我身上看到了这一点。在我那些少有的早起的日子里,我意识到我的生产效率不 光是早上,而是整整一天都非常高。并且这样做我感觉非常好,我决定养成早起的好习惯,于是立即将闹钟调到了凌晨5点………
……..第二天早上,我在快到中午时才起床。
Hmmm………
我又进行了多次的尝试,基本上每一次都是在那个时间段醒来。我开始怀疑我的身上是不是没有携带早起的基因。每当我的闹钟响的时候,我的第一反应总是想将它关掉然后回去继续睡觉。这个习惯我又保持了几年,但是最终我偶然发现了几篇关于睡眠的调查研究,它们让我意识到我在这个问题上一直是错误的。只要我能把这些调查研究得到的方法应用到我自己身上,我就可以养成一个持久的早起习惯。
使用错误的策略很难使你养成早起的习惯,但是使用这些正确的策略,却相对容易的多。
最通常的错误策略是:你认为,如果你想要早起的话,你最好早点去睡觉。因此你会计算一下你现在一般每天要睡几个小时,然后计算出需要在新的基础上往回移动几个小时。比如说现在你从午夜(夜晚12点)睡到早上8点,你预测如果你在晚上10点睡的话,那么第二天你就可以在凌晨6点起床。听起来似乎很有道理,但是这通常会失效。
目前关于睡眠模式有两个主要的流派。其中一个学派认为你应该每天都按时睡觉,并按时起床。就好像在这两个时刻都有个闹钟一样——你试图在每天晚上的同一时刻入睡。这看起来好像适应于现代社会的节奏,我们需要有一个准确的日程安排表,并且要保证每天有足够的休息。
另外一个学派认为你应该根据身体的需要,累的时候就去休息,睡到自然醒就要起床。这种方法植根于生物学说,我们的身体知道我们需要多少睡眠,因此我们应该听从它们的命令。
通过试验,我发现对我来说两个都不是最佳的睡眠模式。如果你重视你的生产效率的话,它们都是错误的,以下是我这样说的原因:
如果你的睡眠时间固定,那么有时候你可能不是很困就要去睡觉。如果你需要花费超过5分钟的时间才能够入睡的话,这说明你并不是很困。你醒着躺在床上浪费时间,却不能入睡。另外一个问题是你认为你每天都需要同样长的睡眠时间,这是一个错误的假设。你的睡眠时间应该根据每天不同的情况而有所不同。(译者:我觉得还会有这样一个问题,比如说你假设你每天都需要睡够8个小时,可是你有时候早上会提前醒,但是这时候你告诉你自己:“我还没有睡够,在睡一会吧。”可是事实上,你几乎难以再次入睡,你只是在床上磨时间,把你认为你需要的睡眠时间磨完了才会起床 :) )
如果你根据身体的需要去睡眠,很有可能你的睡眠时间会超过你实际需要的睡眠时间——大多数情况下会超出很多,比如说每周会超出10-15个小时(这相当于整整醒着的一天)。许多以这种方式休息的人每晚上休息的时间都超过了8个小时,这通常是过多的。而且,如果你每天早上在不同的时间起床,那么你每天起床的时间就难以预测。因为有时候我们的生活会失去节奏(译者:比如说大学生的周末,一般都是3点之后才睡觉,而平时基本上都是12点睡觉,这样就会打乱生活的节奏),你可能会发现你的睡眠时间变得飘忽不定。
最佳得解决方案是把二者结合起来。方法非常简单,很多起早的人都在自觉不自觉中使用这个方法,虽然如此,它对我来说还是一个心理上的巨大突破。解决的方案是当我感到瞌睡的时候就去睡觉(只有当我感到瞌睡的时候),然后在每天的固定时间(每周七天)设置闹钟,响了就立刻起床。因此我总是在每天的同一个时刻(我定的是早上5点)起床,但是我上床睡觉的时间每天晚上都有所不同。
当我实在困了的时候我才会上床睡觉。我测试睡意的方法是:如果我不能够连续不间断地读完一本书的一两页,我就要准备去睡觉了。大多数情况是当我上床后,我会在三分钟之内睡着。我舒舒服服地躺下,然后立即就睡着了。有时候我会在晚上9点半就上床睡觉了,有时候我又会一直到午夜12点才睡觉,通常的情况是我在晚上10点到11点之间上床。如果我一直不想睡,我会一直忙到我不能睁开眼睛才去睡觉。在这段时间内,读书是一个很好的选择,因为当我困得实在不能在读下去的时候,这一般是显而易见的,我就会马上去睡觉。
每天早上当我的闹钟响的时候,我会把它关掉,伸一个长长的懒腰,然后坐起来。我这时候什么都不想,因为我知道,我赖在床上的时间越长,我接着再睡的可能性就越大。因此一旦闹钟响了,我就不允许我去想再睡一会的好处。即使我很想再睡一会,我通常也会立刻起床。
在坚持这个模式一段日子后,我发现我的睡眠规律逐渐变得有节奏了。如果前一天晚上我的睡眠时间不够充分,第二天晚上我自然而然地就会提前睡觉以补充足够的睡眠。而如果我的精力非常旺盛,一点都感觉不到累,我就会睡的少一些。我的身体学会了什么时候将我叫醒,因为它知道我通常会在每天的那个时刻起床。
这样做的一个很好的效果是,我平均每天晚上睡觉的时间减少了90分钟,但是我却感觉更轻松,我想这主要是因为我在床上的时间基本上都在睡眠中。
我得知这样一个情况,那些失眠的人都是那些明明不瞌睡却要上床睡觉的人。如果你不瞌睡,而且你发现自己无法立即入睡,那么立即起来,让你的头脑保持清醒一段时间。一直等到你的体内开始分泌激素,你的意识开始变得模糊,你再去睡觉。如果你能够在你瞌睡的时候去睡觉,在一个固定的时间起床,那么你的失眠症将会不治自愈。第一天晚上你可能要待到很晚,但是你会在上床之后立刻入睡。你可能会因为整晚只睡几个小时而在第二天起的太早时(相对太早)感到很累,但是经过一天的忙碌之后,你就会想在第二天晚上早一点上床睡觉。经过一段时间后,你就能养成每天晚上大概都在某一个时间上床,并且迅速入睡的习惯。
因此如果你想成为一个起早者(或者只是想更多的控制你的睡眠模式),那么就试试这样做吧:只有当你太瞌睡而不能继续坚持下去时才去睡觉,每天早上都在同一个固定的时间起床。
PS:关于如何成为一个起早者还有续文,介绍了需要注意的一些细节上的问题,具体的内容请参照:如何成为一个起早者(二)
如何成为一个起早者(二)
原文地址:How to Become an Early Riser - Part II
作者:Steve Pavlina
翻译:Angelived
译文地址:
http://angelived.org/2007/05/22/how-to-become-an-early-riser-part-ii/
(原作者 :上周一的那篇文章“如何成为一个起早者”显然引起了很多人的共鸣,那篇文章收到了很多反向链接(反向链接加上回复总共213个,后来作者把评论关闭了,否则会更多 :)),超过这个站点上任何一篇我写过的文章。...........)
(译者:因为上一篇文章反响很大,因此作者决定再写一篇文章来讲一下更细节方面的东西)
首先,在“当你困的时候才去睡觉”这个问题上,要想做到这一点,需要你能够意识到什么时候你瞌睡了。(不知道翻译的对不对 ;) 原句按单词的组合意思是“需要你有正确的混合意识和常识” )。
如果你在睡觉前做一些很刺激的活动,你就会(译者加:因为太兴奋而)睡地更晚,并且在睡觉前感觉不到瞌睡。大学期间我经常通宵与宿舍的同学打扑克,天亮之后我们常常会出去吃早餐。如果我要做工作、和朋友一起出去玩或者做其他很刺激的活动,我就可以容易地比平时晚些睡觉。
但是这不是我指的“你要意识到什么时候你瞌睡了”。我在这个测试中提到过“如果你不能够专心地连续读完一本书的一两页(说明你要准备去睡觉了)”。但是这并不意味着你要等到你快要精疲力尽的时候才去睡觉。
我所指的“想睡的征兆”是指当你的头脑开始释放激素,促使你瞌睡。这和感觉到累是不同的,事实上,你只是感觉到昏昏欲睡。但是为了使你的头脑释放激素,你需要创造一定的条件来使得它发生。这意味着你要让自己在睡之前把节奏放慢下来,我发现阅读是最棒的一个途径让你在睡之前放慢节奏。有些人说在床上看书是个不好的习惯.......可是我从来对在床上看书没有任何问题,因为当我太瞌睡而不能阅读下去的时候,我就可以把书放下,然后马上入睡。不过如果你喜欢的话,你也可以坐在椅子上看书。
另外一个测试你可以使用的是,问问你自己,“如果我现在去睡觉的话,我能多快入睡?”如果你认为你将需要超过15分钟的时间入睡的话,我会告诉你继续做你手中的事情,等会在去睡觉。
一旦你设定了一个固定的时间醒来,可能会需要你通过几次实践来确定你正确的睡觉时间范围。刚开始的时候你可能会看到变动比较大,一天晚上睡的太晚,另一天晚上睡的太早。但是最终你会找到一个感觉,你能够感觉到什么时候你去睡觉会马上睡着,并且第二天你仍然精力充沛。
为了防止你睡的过晚,给自己划定一个最晚睡觉时间,即使这时候你完全不瞌睡,无论如何你也要在那个时间上床睡觉。我知道我每天晚上至少需要6.5个小时的睡眠时间,但是如果遇到了紧急情况,那么我可以只睡5个小时,第二天还很好,前提是我并不是每天晚上都这么做。现在我的睡眠时间最长为7.5小时。在我开始每天早上准时醒之前,我经常每天晚上睡8到9个小时,如果有时候真的累的话,甚至睡10个小时。
如果你白天喝咖啡的话,好像这可能会打乱你的睡眠周期。因为起初的那篇文章假设你不依靠药物保持清醒,如果你喝咖啡有瘾的话,那么请先戒除你的咖啡瘾。如果你的大脑依靠化学物质的话,那么不要指望你的睡意会在合适的时间到来。
先前那篇文章的目的在于说明如何养成早起的好习惯。因此提的建议是直接关于如何养成这个习惯的。一旦这个习惯养成了,它就可以下意识的起作用。你可以做刺激的活动,比如说工作或者玩电动游戏,你将会知道什么时候你需要去睡觉了,即使它和以往晚上睡觉的时间不同。我说讲过的睡意测试对于养成这个习惯非常重要,不过在养成习惯之后,精确的信号(这里指的应该是你自己能够感觉到睡意的到来)会取代它起作用。
如果真的需要的话你可以不时的睡地晚一些。如果我一直到凌晨3点才睡觉,我就不打算在第二天早上5点起床,但是我会在第二天恢复到原来的起床时间。
我推荐你坚持每天在同一时间起床一个月,以此来养成早起的习惯。但是在这之后,你就会因为条件反射每天都在那个时间醒来,而你将很难再次入睡。我决定在周六早上起的晚一些,所以我没有设置闹钟,但是我自动地在4点58准时醒来。然后我试图再次入睡,但是我已经清醒了,我完全无法再次入睡。哦,好吧。一旦这个习惯被养成,那么想要准时起床就一点都不难了。这就像你知道什么时候你瞌睡了你就会去睡觉一样。
如果你有小孩的话,你必须尽量去适应它。我的两个孩子,一个5岁,另外一个只有1岁。有事他们把我从半夜吵醒——我的女儿有个习惯,她喜欢在睡床里 “摇晃着”告诉我妻子和我关于她做的梦,或者有时仅仅想和我们聊天。我知道你的婴儿隔几个小时就醒的状况,因此如果你是这种情况的话,我给你的建议是当你能睡的时候就睡。想让婴儿遵守“日程安排”是不大可能的 :)
如果你不能在你的闹钟响后起床的话,这好像要归咎于你缺乏自制力。如果你有足够的自制力的话,无论如何你都可以马上从被窝里跳起来的。起初的动机会有效,但是动机可能只会持续几天。规律就好像肌肉一样,你越是经常训练它,你就越能依靠它。每个人都有它自己的一些规律(你可以控制你的呼吸么?),但是并不是每个人都有意地去发展它。有很多方法可以养成规律——你可以看下整个六篇关于如何建立规律的系列文章(我会在之后将六篇文章中的经典部分翻译过来,想进一步了解如何养成规律的话,你可以用抓虾或者其他的订阅工具订阅我的博客 :) )。基本上它可以归结为克服一些小的挑战,战胜了它们,并逐渐地发展成为习惯,这就好像是举重练习一样。当你的自制力逐渐变强,像在某个特定的时间起床这样的挑战将最终变得那么简单。但是如果你的自制力衰退的话,那么它就好像是一个几乎不可逾越的障碍一样。
为什么要早起?
我要说主要的原因的是你可以有更多的时间来做比睡觉更有趣(译者:我认为是“更有意义” :) )的事情。
再提一次,我已经从每周节省出10到15个小时来做这些事情了。这些额外的时间效率是非常明显的。到上午6点半之前,我已经做完了锻炼,冲了个澡,吃了早饭,我已经在我的办公桌前准备去工作。我可以每天挤出不少时间来做一些富有成效的工作,并且我通常在下午5点之前完成了一天的工作(那包括私人的 “工作” 比如说发邮件,支付帐单,去幼儿园接我的女儿,等等)。这给了我每晚5到6个小时的自由时间来关心家人、参加休闲活动、主持节目、阅读、写日记等等。而最重要的是,我在这段时间中依然精力充沛。抽出时间来做那些所有对我重要的事情会使我感到非常平衡,放松和乐观。
想一想你可以利用空闲的时间来做些什么。即使每天多余出30分钟也足够你每天进行身体锻炼,读书,维护一个博客,冥想,煮健康的饭菜,学习一门乐器等等。积小成多,即使每天一段很短的时间经过一年的积累也将会变得巨大,每天多余出30分钟一年就是182.5个小时。这可比一个月的工作时间还要长(按每星期工作40个小时)。如果你能每天节省60分钟的话,一年你能节省的时间就会翻倍,如果你能每天节省90分钟的话,那么它就会变成三倍。对我来说,我每天大概能够节省90分钟的时间。那就是说我每工作十年,就相当于其他人工作十一年。我可以用那一年的时间来精力充沛地做以前我没有时间做的事情,这是多么美妙! :)--http://blog.renren.com/blog/228806186/457480942
个人做Research的体会
个人做Research的体会
(转载自MITBBS)
完全个人观点,不见得试用于所有人。
第一不要太迷恋TECHNICAL的东西。从自己和周围一些朋友的例子,我发现很多中国学生对TECHNICAL的东西特别感兴趣。什么新的东西都想学,不管究竟对自己的RESEARCH有没有帮助。所以很多中国学生的通病是,前两年上基础课的时候都很优秀,经常是全A。但到了三四年级时,进入RESEARCH很慢。很多人的毕业论文都是匆忙上阵,甚至迟迟不能毕业。当然我并不是说TECHNICAL的东西不重要。博士课前两年是积累一些GENERAL TECHNICAL SKILLS很重要。剩下的时间主要集中在开始RESEARCH和学习与自己RESEARCH相关的TECHNICAL SKILLS。
第二要在三年级就开始选定一到两个具体的TOPIC。我觉得从什么报纸,杂志或网站上找灵感都是瞎掰。如果自己不是JOHN NASH那样的奇才,老老实实从文献里找灵感。看看自己的导师在作什么,看看自己领域的大牛(如自己领域TOP JOURNAL的EDITOR)在作什么。作研究都是大牛挖坑,小牛灌水。对于JUNIOR RESEARCHERS,我感觉最有效的研究方法就是紧跟大牛挖坑的步伐。认准一个题目后,静下心好好清理一下LITERATURE的脉络。不要朝三暮四,这山望着那山高,整天试图去追逐所谓的HOT TOPIC。
整理文献时先作一个LITERATURE TREE:谁提出了这个TOPIC,LITERATURE里都从什么方向研究了这个题目,它们的关系是什么。对每个分支只包括最重要的1到两个文章。把大牛和中牛抓住就行了,剩下的小鱼小虾就算了。参阅一些LITERATURE REVIEW的文章,如果有的话。然后对经典的文章,如提出TOPIC的文章要进行复制。每个公式,每个结果都试图从新作一边。如果有问题可以向原作者请教。我感觉他们大部份还是很NICE的。复制的工作量其实很大,但也可以学到很多东西。很多东西不靠亲自作是无法体会的。看看自己的导师和领域的大牛最近的研究在LITERATURE中的定位。复制自己感兴趣的文章。
有了这些准备工作之后就可以进行自己的RESEARCH了。有没有什么办法把导师或大牛的文章与其他研究联系起来,有没有什么EMPIRICAL STUDY可以做来支持导师和大牛的论点,这些都是不错的研究方向。另外,一般文章中都会提出一些自己的不足和未来的研究方向。这些都是不错的研究题材。我这里一直强调要跟大牛走。说白了,学术界其实就是被这些人控制着。大家都说中国有学霸,学阀。其实什么地方都一样。论文就是观点之争,不党结派怎么在江湖上混啊。对刚出道的人,最好还是厚道点。多作CONSTRUCTIVE的工作,少批评。我前面给的都是这方面的例子。江湖险恶,只是很多人在作学生的时候不知道罢了。比如说JOURNAL EDITOR的权力其实很大。他们很清楚什么人持有什么观点。他们喜欢的东西就发给持相同观点的审稿人,不喜欢的就发给不同观点的审稿人。结果可想而知。以前的导师不久前让我审一篇稿子。作者声称发现数据支持我导师一篇很重要的JPE文章。看了看文章的统计方法没什么大问题,我当然举双手双脚赞成发表了。
当然也可以指出大牛文章的不足。但是不能为批评而批评。能找出改进方法解决问题的文章才是好文章。比如可以这样写,我复制了A的模型,发现有什么地方和数据不符,原因是什么。我对原模型作了一些改动后,现在模型和数据MATCH了。写作过程一定要注意,多POSITIVE,少NEGATIVE。如在指出A模型和数据的冲突时,不要过多强调这种冲突可能引起的问题。而应该强调解决问题后带来的好处。这样其实已经是对原作者的间接批评了。如果A是领域大牛或作EDITOR,这篇文章十有八九能通过。想跟上大牛步伐,看JOURNAL ARTICLES是不够的。这些JOURNAL上的东西至少是3-4年前的东西了。要多留意WORKING PAPER。列出自己领域20大牛人。经常看看他们在干什么,和自己目前的RESEARCH有什么联系。参加一些WORKING PAPER的EMAILING LIST,比如NBER等。常看看TOP10 DEPARTMENT本领域的SEMINAR LIST。我想再强调一次,这样作的目的并不是要去追逐本领域的HOT TOPIC,而是看看别人的研究和自己目前的RESEARCH有什么联系,能不能给自己点灵感。至少在自己CAREER的前3-4年把RESEARCH INTEREST
限定在两个方向,每个方向整出2篇像样的文章,再考虑换方向。少而精要比泛泛涉猎几个不同方向更容易引起别人注意。就先谈这么多,以后有时间了再补充。
另外,要专心作RESEARCH就要减少在MITBBS的灌水时间。每天减少一小时灌水时间一年能多读多少篇论文啊。没有BBS北美广大WSN能平均提前1年毕业。:-)
再好的RESEARCH IDEA,如果不能很好交流也是白搭。 口语重要,有机会就要多练习。当TA是很好的锻炼。中国人之间也可以说。只有多说才能有进步。坚持说一个学期,你会发现本质的进步。口语不好也不用气馁,除了多练之外,口语其实不象传说中的那么重要,当然想去TEACHING COLLEGE的例外。口语的最低标准是UNDERSTANDABLE。个人认为语言交流有两种不同境界。一种人是滔滔不绝型。想成为这种人除了要思维活跃外,口语一定要能跟的上。另外一种人说的虽然不多,但句句点题。一句废话也不说。这两种人都能给人很深的印象。口语不行的可以建议向这种类型发展。在开口说话之前,先把思路想清楚。无论如何说到底,多练是根本。
关于写作,我同意有人的说法,能写汉语就会写英语。如果总觉得意思没有表达出来,不要找自己英语的问题。一定是思路还没有理清楚。换了让你用汉语写,一样表达不清楚。论文写作,精炼是KING。MANKIW和COCHRANE都有关于这方面的短文,如果你还没看过,不妨从他们的网站上找出来读读。文章最重要的是摘要和简介部份。如果REFEREE看了这两部份之后感觉一头雾水,十之八九要据掉文章。至少我审稿时是这样。从AER,JPE上找几篇文章一看你就对什么是好的写作有个大概了解了。我觉得好的INTRODUCTION上来第一段就要说明你这篇文章研究什么问题,得出什么结论。然后开始介绍这个问题是怎么引起的,你的文章在LITERATURE中是出于什么地位,你研究的贡献在什么地方。接下来稍微详细介绍你怎么实现你的结果的,如你的MODEL SETUP有什么不同,通过什么渠道实现了你想要得到的结果。最后指出论文中不足的地方及未来的研究方向。当然关于写作仁者见仁,智者见智。只要达到有效沟通的目的,形式有多种。
怎么提高写作?同样,多练习。从和导师的沟通练起。多给导师写一些关于自己RESEARCH PROGRESS的NOTES。不要太依赖从导师那里获得IDEA,如果你的导师能每个星期花一个小时执导你的研究,你就很幸运了。当然比较小的经济系情况可能好些,老师也往往更NICE一点。就算NICE的导师,一般也是你要先显示你作研究的潜力,老师才肯花更多时间和精力辅导你。
不要和导师空谈IDEA。如果跑去给导师说,我有一个IDEA,INTUITIVELY,应该可行,你觉得怎么样。从我的经验,导师一定说,SOUNDS PROMISING,不过你要把模型作出来我才知道。他不可能告诉你具体该怎么作。但你弄个30页的PAPER给他看,他也一定不看。为什么,成本太高。他的成本是一小时80多美元,能花2-3个小时看你的文章么。
那怎么办?我的策略是化整为零,多给导师写一些简短的NOTES。一个NOTES大概3-4页左右(DOUBLE SPACE) ,20分钟左右能看完为好。这样作有几个好处。第一,给老师充份时间考虑,得到的指导质量更高。第二,在PROJECT进行过程当中,你能及时得到一些FEEDBACK。如果开始有什么问题,做得越多就错的越多。更重要的是,在写作工程中,你的思路也被组织起来,当然也锻炼写作。
把每个NOTES都当一篇小论文来看待。上来先来个概括,如我最近作了什么工作,得到什么结果,有什么问题需要解决。然后再展开谈。下面是我的一些教训,希望能对大家有所帮助。
1。不要以为导师比你更了解你的TOPIC。第一篇NOTE一定要给导师作一个背景介绍。例如你的研究是基于哪几篇文章,他们之间的关系是什么,你想从什么地方下手等。要有思想准备给他重复几遍之后,他才能开始记住你到底在作什么。
2。不要浪费时间在空谈。没有具体结果支持自己的ARGUMENT之前不要说什么I BELIEVE BLAH BLAH, I THINK BLAH BLAH。把有限的空间用在具体问题和结果上。看看自己以前的NOTES,发现很多NAIIVE的论断。太多这种东西让导师感觉你在浪费时间,而且会觉得你思维不严谨。我觉得和导师在交流的过程当中,很大一个目的就是要让他感到你作研究很严谨。
3。每个NOTE都包括读者所需要的所有信息。不要写什么SEE EQUATION (2) OF MY LASTNOTE。导师没时间去找你上一个NOTE。把信息从新列一遍。如果实在需要很多上次的信息,就把上次的NOTE附在后面。
4。把NOTE要反复阅读几遍再给导师。
5。多用公式或者一些简单的例子帮助导师理解你的结果。
6。措辞上一定要和LITERATURE保持一致,大牛用过的表达方法自己再用。不要自己发明新的术语如果LITERATURE中已经有现成的了。在写作上,多把自己写的东西和大牛写的比较比较,看看同样的意思,别人怎么表达的。
说了这么多废话,提高口语和写作,就两个字:多练。
今天就写到这罢。下次有空了给大家介绍一些NET WORKING的体会。
所谓NETWORKING就是建立自己的关系网。关系网越大,REFEREE是自己朋友的可能性就越高。评TENURE时还需要校外人员对你RESEARCH进行评估。朋友多了自然好办事。当然NETWORKING和自己的研究能力是相辅相成的。不拿出点干货光靠NETWORKING是行不通的。学经济的精着呢。
NETWORKING分内部资源和外部资源。内部指你导师和读博士所在系的其他老师及同学。剩下的就是外部资源了。今天先说说内部的。
NETWORKING的第一步,也是最关键一步就是找导师。导师是你在关系网中的入口。不夸张的说,选对导师你就成功了一半。如果有教父级人物,象SARGENT,LAR HANSEN这种人作你导师,你赚大了。到什么地方都有人罩着。大家都明白导师并不是越有名越好。那好导师的标准是什么呢。首先年纪不能太大,50岁左右最合适。很多系都有一些熊猫级的人物,如年纪偏大的NOBEL PRIZE WINNER。这些人对你的发展帮助不大。只能回中国忽悠国人。首先他们基本已经不在学术前沿了。而且应酬特多,经常被邀请到亚非拉国家去讲座,没时间指导你。没办法,发展中国家就认牌子。更关键的是,你和导师的关系不能到你毕业就终止了。一定要想办法让他把你扶上马再送一程。至少再罩你个3-4年。年纪太大的导师不现实。学术界就这样,人走茶凉,没办法。
其次,导师要PRODUCTIVE。每年有2-3篇TOP FIELD JOURNAL以上的论文。不少教授被称作DEAD WOOD。一看就知道什么意思了罢。找了个DEAD WOOD你毕业时就DEAD了。另一个很重要的标准就是导师要肯花时间指导学生。导师对学生是否CARE, PLACEMENT是检验真理的唯一标准。有些导师把自己以前学生的信息放在自己的网站甚至简历上。一般这样的导师对学生都很CARE学生。老师的人品不要只道听途说。同一个导师对不同的学生也不一样。我在选导师前听说他曾经当面把学生的论文扔进垃圾筒。不过看他学生的PLACEMENT都很好就选了。其实有时候导师显得很MEAN也是被逼的。如果自己是大牛,对学生又“滥爱” ,所有人都会找你作导师。你不被学生烦死才怪。我们系有几个NICE的FACULTY就是这样被BURNED OUT的。学术界本身就是一个JUNGLE,再牛的人如果2-3年没什么像样的文章也会很快FADE OUT。所以你一般开始和这些人接触时,往往他们有点带理不理的。特别是你去找他们空谈一些什么IDEA,他们恨不得一脚把你踹出去。对导师期望不要太高。如果他一星期花一个小时指导你,已经很好了。
但不要因为困难就找JUNIOR FACULTY作导师。除非你自信能毕业前在TOP FIELD JOURNAL以上的刊物发表独立作者的文章。等毕业时你就知道导师的NETWORKING有多重要了。从我去年RECRUITING的经验看,没人会花时间把所有3-400份申请认真看一边。我们直接到TOP 15的网站,看看大牛有什么弟子。只要和要招的方向沾边的,统统面试。就算你是TOP 15,但导师是个JUNIOR,又没有PUBLICATION,一样不睬你。然后从15到30的网站上看有没有什么中牛的弟子看起来PROMISING的。如果有,把导师的推荐信找出来读。如果导师强烈推荐,也面试。这样下来,至少有30多个CANDIDATES了。让秘书把在LIST上人的申请拿出来,其他直接存档了。然后再大家传阅这30多个申请,从里面挑出25-30个人面试。如果你导师没有一定知名度,你又没有论文发表,你的申请被看的概率基本为零。
早在JOB MARKET正式开始前,你的导师已经在给你作宣传了。比较明显的是他可能在自己的WORKING PAPER中CITE你的毕业论文。大牛的WORKING PAPER都是万人瞻仰的被他CITE后你的知名度一下就上去了。还有很多幕后工作你根本不知道。在9-12月之间的SEMINAR和CONFERENCE上,除了讨论RESEARCH之外,一个重要的话题就是推销学生。“老张,今年你们招宏观的人么?我有一学生很好,他的毕业论文研究BLAH BLAH ” 这种宣传对15-30名之间的系非常重要。建议你把自己申请学校的LIST给你的导师。如果你有什么特别想去的地方,让他知道。他会在适当场合有的放矢地给你宣传一下。
对大多数人讲,自己拿博士学位的系可能是自己呆过的最好的经济系了。所以要好好利用。除了自己的导师外,要和系上其他老师保持紧密联系。如果有两个自己方向的牛人在系上,让他们COCHAIR。JUNIOR FACULTY虽然不能作CHAIR,但也要和他们经常交流。这些人往往更NICE,可以成为你COAUTHOR的对象。同FIELD的学生也是很好的资源。不要把他们当作你的竞争对手。如果别人作的比自己好,不要嫉妒。自己当不成明星,就当明星的朋友。想想自己平时还要挖空心思去接近牛人。如果自己的朋友一天成为牛人,自己岂不近水楼台先得月?
内部指你导师和读博士所在系的其他老师及同学。剩下的就是外部资源了。今天我们继续说说外部资源。
建立关系网前,首先对自己FIELD有什么牛人做个大概了解。基本策略和找女朋友一样,要普遍撒网,重点培养。列一个黑名单,包括本FIELD在 TOP 5 JOURNAL 担任EDITORIAL 职务的大牛;在本FIELD TOP JOURNAL里担任EDITORIAL职务的;加上你导师,如果他还没在LIST上。这样一划拉,至少也有二三十个了。怎么和这些人拉上关系呢?还是要从导师入手。找找黑名单上谁和导师合作过,谁和导师的观点比较接近。这些人十有八九和导师是朋友,列为重点发展对象。学术界错综复杂的关系其实完全和中国的关系网有一拼。不少牛人之间大学是ROOMMATE,或者研究生同一个导师。如果你是这种朋友的弟子,自然对你会有所照顾。
另外自己研究TOPIC领域的几个牛人也是重点发展对象。即使和自己导师没什么直接联系,也要想办法接近。第二批发展对象是自己领域里的RISING STAR。每年看看本领域TOP 15 SCHOOL里有什么人在MARKET上,TOP 30 DEPARTMENTS 里哪些AP是和自己一个方向。这些人由于初露头脚,往往更容易接近一些。相对大牛而言,这些人更容易成为自己的REFEREE。大牛一般不屑作我等小虾的REFEREE。他们经常把JUNIOR的SUBMISSION PASS 给别的JUNIOR。在我REFEREE的文章中,JUNIOR FACULTY 占了2/3。
列好了发展对象,什么时候开始建立关系网,怎么建立呢?我前面说过,说到底RESEARCH是KING,NETWORKING只是辅助作用。当自己的RESEARCH还不很成熟时,不要花太多精力去拉关系。这时候可以采用守株待兔的策略。可以积极接近系里的SEMINAR VISITOR 和其他短期VISITOR。如果有黑名单上的人作SEMINAR,一定要把论文提前认真读一遍,想一到两个SMART QUESTIONS。至于什么是SMART QUESTIONS,下面只是我个人看法。一句话,做人要厚道,尤其是刚踏入江湖的人。一定要牢记自己提问题的目的是帮助作者添砖加瓦,如何把论文作得更严谨,更完美,而不是去挖别人墙角。可以看看有没有相关的LITERATURE被作者漏掉了,文章逻辑是不是严谨,THEORY和EMPIRICAL部份是不是对应,有没有什么简单的ROBUSTNESS TEST作者可以考虑一下。总之,这种CONSTRUCTIVE的问题更容易引起作者的认真考虑,容易被采纳。
但是VISITOR不可能对你有什么印象如果你仅仅在SEMINAR上提个问题。要找机会和他们面谈一会儿。VISITOR往往会在系里呆一段时间。到他办公室去介绍一下自己的RESEARCH,自己的RESEARCH和VISITOR的有什么相关的地方。去之前要先作个RESEARCH,看看VISITOR以前作什么,现在正在作什么,这样话题更多一些。不要希望他们能记住你的名字。但一定要自报门户,让他知道你是谁的学生。让他知道你导师有个优秀的学生会在未来的MARKET上,方便导师以后推销你。
有了一篇像样的文章后,就可以加大NETWORKING的力度。把文章发给自己黑名单上的人。但发之前一定要认真考虑,可以征求一下导师的意见。文章要有一定的质量才能起到给自己作宣传的作用,不然会适得其反。尤其是在TOP SCHOOL 的学生,开始大家会很SERIOUS的对待你。如果发现你的论文也就是TERM PAPER的水平,下次你再发文章给他们,恐怕没人再看了。所以对外NETWORKING太早不但不能帮助你,反而可能把你BURN OUT。文章一定要认真修改之后在给大家传阅。找NATIVE SPEAKER纠正语法错误。
发给别人时,不要仅仅说我有一篇论文和你的研究相关,希望你看后给我提提意见。首先,如果自己引用了他的论文,要让他知道。其次,对自己的论文作一个简短的介绍。对于这种骚扰,大部份人不会有什么回应。NICE点的可能回个EMAIL说,感谢发论文给他,有什么COMMENTS会给你说。但能认真给你提建议的应该很少。但不要气馁,至少自己的名字让别人看到了。自己一二年级时对SEMINAR完全听不懂,但还是坚持去。不图别的,就是和老师混个脸熟。同样作为JUNIOR,不要怕热脸贴冷屁股,贴几次就热了。
有人问我读书期间去参加CONFERENCE有没有帮助。我个人感觉帮助不大。很多CONFERENCE有学生SESSION,去这些SESSION的往往是学生。接触的人很有限。但如果决定参加,就要好好利用。认真看看CONFERENCE的PROGRAM,有没有黑名单上的人参加。如果有,要参加他们的SESSION,SESSION结束后要留下来给他们聊几句再走。但这种大型CONFERENCE上大家都忙着SOCIAL,一般不愿意花太多时间和STUDENTS TALK。
真正的NETWORKING我觉得是在上JOB MARKET之后。有很多介绍JOB MARKET的文章里包括了怎么INTERVIEW和FLYOUT,我这里就不罗嗦了。这两个环节都是自己认识人的好机会。
工作后有什么资源可以利用么?第一是系里的SEMINAR,争取当系里的SEMINAR ORGANIZER。实在不行,每个学期争取请1到2个自己的朋友来讲座。这时的主动权就完全掌握在自己手里了。把黑名单上的人排个顺序。自己研究TOPIC的人排在前面,挨个请。以前不认识的也可以。一般这种邀请别人不会拒绝,除非是极牛的人。他们实在太忙。但给他们发个邀请,就算拒绝了他也会对你有个印象。人请来了自然要好好招待,安排旅馆,陪着吃饭自然免不了。吃饭时抓住时机给别人介绍自己的论文。而且要介绍自己正在或者正准备作的PROJECT,很多COAUTHORSHIP就是在饭桌上产生的。别以为这一套只有在中国行得通,其实是世界通用的。别人请来的SEMINAR SPEAKER如果有机会,吃饭也是要同去的。两杯酒一喝,不管中国人还是外国人,关系都感觉更近了一步。
有机会多参加CONFERENCE。在CONFERENCE上要PRESENT或作DISCUSSANT。这样才有暴光度。作DISCUSSANT时要肯花时间。一个好的DISCUSSANT很多时候比PRESENTER给人的印象还深。
刚毕业的JUNIOR一定要避免一个人单干。找导师合作一两篇文章。让他扶你上马后,再送你一程。如果本系有比较出名的SENIOR,想办法和他们合作效果可能更好。
毕业后REFEREE的工作会逐渐多起来。这时一个给EDITOR留个好印象的绝好机会。认真准时完成报告。写报告时要厚道,不要一味批评别人。当然有人写很MEAN的REPORT,这完全是个人选择。我一般即使决定要据某个文章,除了指出它不足的地方外,都列几个CONSTRUCTIVE的COMMENTS。REFEREE是匿名的,EDITOR可是署名的。虽然我们不应该TAKE IT PERSONALLY,但如果你从一个EDITOR手里收到一个很MEAN的REPORT,自然会多少有点迁怒于EDITOR。EDITOR还是希望有一篇中肯,NICE的REPORT。
在REPORT中不要让别人CITE自己的文章,尤其是自己要据的文章。除了给EDITOR留下不好印象外,还得罪了被审稿的。别人一下就可以猜出是你审的。你如果有什么仇人,可以害他一下。写一篇MEAN REPORT,然后让他CITE你仇人的文章。呵呵,开个玩笑而已。
如果文章不错,建议接受,写一篇很NICE的REPORT。写几句很明显的赞扬的话,让作者一看就知道你一定是建议REVISE&RESUBMIT。适当谈谈这篇文章和自己文章的关系。不要明显CITE自己的文章,除非是联系非常紧密。可以把自己文章的IDEA介绍一下,讨论一下这两篇文章的互补之处。作者回去作个LITERATURE SEARCH,十有八九能找到你。
以上只是我个人的一点儿体会,欢迎大家补充。--http://blog.renren.com/blog/220859777/461281742#nogo
(转载自MITBBS)
完全个人观点,不见得试用于所有人。
第一不要太迷恋TECHNICAL的东西。从自己和周围一些朋友的例子,我发现很多中国学生对TECHNICAL的东西特别感兴趣。什么新的东西都想学,不管究竟对自己的RESEARCH有没有帮助。所以很多中国学生的通病是,前两年上基础课的时候都很优秀,经常是全A。但到了三四年级时,进入RESEARCH很慢。很多人的毕业论文都是匆忙上阵,甚至迟迟不能毕业。当然我并不是说TECHNICAL的东西不重要。博士课前两年是积累一些GENERAL TECHNICAL SKILLS很重要。剩下的时间主要集中在开始RESEARCH和学习与自己RESEARCH相关的TECHNICAL SKILLS。
第二要在三年级就开始选定一到两个具体的TOPIC。我觉得从什么报纸,杂志或网站上找灵感都是瞎掰。如果自己不是JOHN NASH那样的奇才,老老实实从文献里找灵感。看看自己的导师在作什么,看看自己领域的大牛(如自己领域TOP JOURNAL的EDITOR)在作什么。作研究都是大牛挖坑,小牛灌水。对于JUNIOR RESEARCHERS,我感觉最有效的研究方法就是紧跟大牛挖坑的步伐。认准一个题目后,静下心好好清理一下LITERATURE的脉络。不要朝三暮四,这山望着那山高,整天试图去追逐所谓的HOT TOPIC。
整理文献时先作一个LITERATURE TREE:谁提出了这个TOPIC,LITERATURE里都从什么方向研究了这个题目,它们的关系是什么。对每个分支只包括最重要的1到两个文章。把大牛和中牛抓住就行了,剩下的小鱼小虾就算了。参阅一些LITERATURE REVIEW的文章,如果有的话。然后对经典的文章,如提出TOPIC的文章要进行复制。每个公式,每个结果都试图从新作一边。如果有问题可以向原作者请教。我感觉他们大部份还是很NICE的。复制的工作量其实很大,但也可以学到很多东西。很多东西不靠亲自作是无法体会的。看看自己的导师和领域的大牛最近的研究在LITERATURE中的定位。复制自己感兴趣的文章。
有了这些准备工作之后就可以进行自己的RESEARCH了。有没有什么办法把导师或大牛的文章与其他研究联系起来,有没有什么EMPIRICAL STUDY可以做来支持导师和大牛的论点,这些都是不错的研究方向。另外,一般文章中都会提出一些自己的不足和未来的研究方向。这些都是不错的研究题材。我这里一直强调要跟大牛走。说白了,学术界其实就是被这些人控制着。大家都说中国有学霸,学阀。其实什么地方都一样。论文就是观点之争,不党结派怎么在江湖上混啊。对刚出道的人,最好还是厚道点。多作CONSTRUCTIVE的工作,少批评。我前面给的都是这方面的例子。江湖险恶,只是很多人在作学生的时候不知道罢了。比如说JOURNAL EDITOR的权力其实很大。他们很清楚什么人持有什么观点。他们喜欢的东西就发给持相同观点的审稿人,不喜欢的就发给不同观点的审稿人。结果可想而知。以前的导师不久前让我审一篇稿子。作者声称发现数据支持我导师一篇很重要的JPE文章。看了看文章的统计方法没什么大问题,我当然举双手双脚赞成发表了。
当然也可以指出大牛文章的不足。但是不能为批评而批评。能找出改进方法解决问题的文章才是好文章。比如可以这样写,我复制了A的模型,发现有什么地方和数据不符,原因是什么。我对原模型作了一些改动后,现在模型和数据MATCH了。写作过程一定要注意,多POSITIVE,少NEGATIVE。如在指出A模型和数据的冲突时,不要过多强调这种冲突可能引起的问题。而应该强调解决问题后带来的好处。这样其实已经是对原作者的间接批评了。如果A是领域大牛或作EDITOR,这篇文章十有八九能通过。想跟上大牛步伐,看JOURNAL ARTICLES是不够的。这些JOURNAL上的东西至少是3-4年前的东西了。要多留意WORKING PAPER。列出自己领域20大牛人。经常看看他们在干什么,和自己目前的RESEARCH有什么联系。参加一些WORKING PAPER的EMAILING LIST,比如NBER等。常看看TOP10 DEPARTMENT本领域的SEMINAR LIST。我想再强调一次,这样作的目的并不是要去追逐本领域的HOT TOPIC,而是看看别人的研究和自己目前的RESEARCH有什么联系,能不能给自己点灵感。至少在自己CAREER的前3-4年把RESEARCH INTEREST
限定在两个方向,每个方向整出2篇像样的文章,再考虑换方向。少而精要比泛泛涉猎几个不同方向更容易引起别人注意。就先谈这么多,以后有时间了再补充。
另外,要专心作RESEARCH就要减少在MITBBS的灌水时间。每天减少一小时灌水时间一年能多读多少篇论文啊。没有BBS北美广大WSN能平均提前1年毕业。:-)
再好的RESEARCH IDEA,如果不能很好交流也是白搭。 口语重要,有机会就要多练习。当TA是很好的锻炼。中国人之间也可以说。只有多说才能有进步。坚持说一个学期,你会发现本质的进步。口语不好也不用气馁,除了多练之外,口语其实不象传说中的那么重要,当然想去TEACHING COLLEGE的例外。口语的最低标准是UNDERSTANDABLE。个人认为语言交流有两种不同境界。一种人是滔滔不绝型。想成为这种人除了要思维活跃外,口语一定要能跟的上。另外一种人说的虽然不多,但句句点题。一句废话也不说。这两种人都能给人很深的印象。口语不行的可以建议向这种类型发展。在开口说话之前,先把思路想清楚。无论如何说到底,多练是根本。
关于写作,我同意有人的说法,能写汉语就会写英语。如果总觉得意思没有表达出来,不要找自己英语的问题。一定是思路还没有理清楚。换了让你用汉语写,一样表达不清楚。论文写作,精炼是KING。MANKIW和COCHRANE都有关于这方面的短文,如果你还没看过,不妨从他们的网站上找出来读读。文章最重要的是摘要和简介部份。如果REFEREE看了这两部份之后感觉一头雾水,十之八九要据掉文章。至少我审稿时是这样。从AER,JPE上找几篇文章一看你就对什么是好的写作有个大概了解了。我觉得好的INTRODUCTION上来第一段就要说明你这篇文章研究什么问题,得出什么结论。然后开始介绍这个问题是怎么引起的,你的文章在LITERATURE中是出于什么地位,你研究的贡献在什么地方。接下来稍微详细介绍你怎么实现你的结果的,如你的MODEL SETUP有什么不同,通过什么渠道实现了你想要得到的结果。最后指出论文中不足的地方及未来的研究方向。当然关于写作仁者见仁,智者见智。只要达到有效沟通的目的,形式有多种。
怎么提高写作?同样,多练习。从和导师的沟通练起。多给导师写一些关于自己RESEARCH PROGRESS的NOTES。不要太依赖从导师那里获得IDEA,如果你的导师能每个星期花一个小时执导你的研究,你就很幸运了。当然比较小的经济系情况可能好些,老师也往往更NICE一点。就算NICE的导师,一般也是你要先显示你作研究的潜力,老师才肯花更多时间和精力辅导你。
不要和导师空谈IDEA。如果跑去给导师说,我有一个IDEA,INTUITIVELY,应该可行,你觉得怎么样。从我的经验,导师一定说,SOUNDS PROMISING,不过你要把模型作出来我才知道。他不可能告诉你具体该怎么作。但你弄个30页的PAPER给他看,他也一定不看。为什么,成本太高。他的成本是一小时80多美元,能花2-3个小时看你的文章么。
那怎么办?我的策略是化整为零,多给导师写一些简短的NOTES。一个NOTES大概3-4页左右(DOUBLE SPACE) ,20分钟左右能看完为好。这样作有几个好处。第一,给老师充份时间考虑,得到的指导质量更高。第二,在PROJECT进行过程当中,你能及时得到一些FEEDBACK。如果开始有什么问题,做得越多就错的越多。更重要的是,在写作工程中,你的思路也被组织起来,当然也锻炼写作。
把每个NOTES都当一篇小论文来看待。上来先来个概括,如我最近作了什么工作,得到什么结果,有什么问题需要解决。然后再展开谈。下面是我的一些教训,希望能对大家有所帮助。
1。不要以为导师比你更了解你的TOPIC。第一篇NOTE一定要给导师作一个背景介绍。例如你的研究是基于哪几篇文章,他们之间的关系是什么,你想从什么地方下手等。要有思想准备给他重复几遍之后,他才能开始记住你到底在作什么。
2。不要浪费时间在空谈。没有具体结果支持自己的ARGUMENT之前不要说什么I BELIEVE BLAH BLAH, I THINK BLAH BLAH。把有限的空间用在具体问题和结果上。看看自己以前的NOTES,发现很多NAIIVE的论断。太多这种东西让导师感觉你在浪费时间,而且会觉得你思维不严谨。我觉得和导师在交流的过程当中,很大一个目的就是要让他感到你作研究很严谨。
3。每个NOTE都包括读者所需要的所有信息。不要写什么SEE EQUATION (2) OF MY LASTNOTE。导师没时间去找你上一个NOTE。把信息从新列一遍。如果实在需要很多上次的信息,就把上次的NOTE附在后面。
4。把NOTE要反复阅读几遍再给导师。
5。多用公式或者一些简单的例子帮助导师理解你的结果。
6。措辞上一定要和LITERATURE保持一致,大牛用过的表达方法自己再用。不要自己发明新的术语如果LITERATURE中已经有现成的了。在写作上,多把自己写的东西和大牛写的比较比较,看看同样的意思,别人怎么表达的。
说了这么多废话,提高口语和写作,就两个字:多练。
今天就写到这罢。下次有空了给大家介绍一些NET WORKING的体会。
所谓NETWORKING就是建立自己的关系网。关系网越大,REFEREE是自己朋友的可能性就越高。评TENURE时还需要校外人员对你RESEARCH进行评估。朋友多了自然好办事。当然NETWORKING和自己的研究能力是相辅相成的。不拿出点干货光靠NETWORKING是行不通的。学经济的精着呢。
NETWORKING分内部资源和外部资源。内部指你导师和读博士所在系的其他老师及同学。剩下的就是外部资源了。今天先说说内部的。
NETWORKING的第一步,也是最关键一步就是找导师。导师是你在关系网中的入口。不夸张的说,选对导师你就成功了一半。如果有教父级人物,象SARGENT,LAR HANSEN这种人作你导师,你赚大了。到什么地方都有人罩着。大家都明白导师并不是越有名越好。那好导师的标准是什么呢。首先年纪不能太大,50岁左右最合适。很多系都有一些熊猫级的人物,如年纪偏大的NOBEL PRIZE WINNER。这些人对你的发展帮助不大。只能回中国忽悠国人。首先他们基本已经不在学术前沿了。而且应酬特多,经常被邀请到亚非拉国家去讲座,没时间指导你。没办法,发展中国家就认牌子。更关键的是,你和导师的关系不能到你毕业就终止了。一定要想办法让他把你扶上马再送一程。至少再罩你个3-4年。年纪太大的导师不现实。学术界就这样,人走茶凉,没办法。
其次,导师要PRODUCTIVE。每年有2-3篇TOP FIELD JOURNAL以上的论文。不少教授被称作DEAD WOOD。一看就知道什么意思了罢。找了个DEAD WOOD你毕业时就DEAD了。另一个很重要的标准就是导师要肯花时间指导学生。导师对学生是否CARE, PLACEMENT是检验真理的唯一标准。有些导师把自己以前学生的信息放在自己的网站甚至简历上。一般这样的导师对学生都很CARE学生。老师的人品不要只道听途说。同一个导师对不同的学生也不一样。我在选导师前听说他曾经当面把学生的论文扔进垃圾筒。不过看他学生的PLACEMENT都很好就选了。其实有时候导师显得很MEAN也是被逼的。如果自己是大牛,对学生又“滥爱” ,所有人都会找你作导师。你不被学生烦死才怪。我们系有几个NICE的FACULTY就是这样被BURNED OUT的。学术界本身就是一个JUNGLE,再牛的人如果2-3年没什么像样的文章也会很快FADE OUT。所以你一般开始和这些人接触时,往往他们有点带理不理的。特别是你去找他们空谈一些什么IDEA,他们恨不得一脚把你踹出去。对导师期望不要太高。如果他一星期花一个小时指导你,已经很好了。
但不要因为困难就找JUNIOR FACULTY作导师。除非你自信能毕业前在TOP FIELD JOURNAL以上的刊物发表独立作者的文章。等毕业时你就知道导师的NETWORKING有多重要了。从我去年RECRUITING的经验看,没人会花时间把所有3-400份申请认真看一边。我们直接到TOP 15的网站,看看大牛有什么弟子。只要和要招的方向沾边的,统统面试。就算你是TOP 15,但导师是个JUNIOR,又没有PUBLICATION,一样不睬你。然后从15到30的网站上看有没有什么中牛的弟子看起来PROMISING的。如果有,把导师的推荐信找出来读。如果导师强烈推荐,也面试。这样下来,至少有30多个CANDIDATES了。让秘书把在LIST上人的申请拿出来,其他直接存档了。然后再大家传阅这30多个申请,从里面挑出25-30个人面试。如果你导师没有一定知名度,你又没有论文发表,你的申请被看的概率基本为零。
早在JOB MARKET正式开始前,你的导师已经在给你作宣传了。比较明显的是他可能在自己的WORKING PAPER中CITE你的毕业论文。大牛的WORKING PAPER都是万人瞻仰的被他CITE后你的知名度一下就上去了。还有很多幕后工作你根本不知道。在9-12月之间的SEMINAR和CONFERENCE上,除了讨论RESEARCH之外,一个重要的话题就是推销学生。“老张,今年你们招宏观的人么?我有一学生很好,他的毕业论文研究BLAH BLAH ” 这种宣传对15-30名之间的系非常重要。建议你把自己申请学校的LIST给你的导师。如果你有什么特别想去的地方,让他知道。他会在适当场合有的放矢地给你宣传一下。
对大多数人讲,自己拿博士学位的系可能是自己呆过的最好的经济系了。所以要好好利用。除了自己的导师外,要和系上其他老师保持紧密联系。如果有两个自己方向的牛人在系上,让他们COCHAIR。JUNIOR FACULTY虽然不能作CHAIR,但也要和他们经常交流。这些人往往更NICE,可以成为你COAUTHOR的对象。同FIELD的学生也是很好的资源。不要把他们当作你的竞争对手。如果别人作的比自己好,不要嫉妒。自己当不成明星,就当明星的朋友。想想自己平时还要挖空心思去接近牛人。如果自己的朋友一天成为牛人,自己岂不近水楼台先得月?
内部指你导师和读博士所在系的其他老师及同学。剩下的就是外部资源了。今天我们继续说说外部资源。
建立关系网前,首先对自己FIELD有什么牛人做个大概了解。基本策略和找女朋友一样,要普遍撒网,重点培养。列一个黑名单,包括本FIELD在 TOP 5 JOURNAL 担任EDITORIAL 职务的大牛;在本FIELD TOP JOURNAL里担任EDITORIAL职务的;加上你导师,如果他还没在LIST上。这样一划拉,至少也有二三十个了。怎么和这些人拉上关系呢?还是要从导师入手。找找黑名单上谁和导师合作过,谁和导师的观点比较接近。这些人十有八九和导师是朋友,列为重点发展对象。学术界错综复杂的关系其实完全和中国的关系网有一拼。不少牛人之间大学是ROOMMATE,或者研究生同一个导师。如果你是这种朋友的弟子,自然对你会有所照顾。
另外自己研究TOPIC领域的几个牛人也是重点发展对象。即使和自己导师没什么直接联系,也要想办法接近。第二批发展对象是自己领域里的RISING STAR。每年看看本领域TOP 15 SCHOOL里有什么人在MARKET上,TOP 30 DEPARTMENTS 里哪些AP是和自己一个方向。这些人由于初露头脚,往往更容易接近一些。相对大牛而言,这些人更容易成为自己的REFEREE。大牛一般不屑作我等小虾的REFEREE。他们经常把JUNIOR的SUBMISSION PASS 给别的JUNIOR。在我REFEREE的文章中,JUNIOR FACULTY 占了2/3。
列好了发展对象,什么时候开始建立关系网,怎么建立呢?我前面说过,说到底RESEARCH是KING,NETWORKING只是辅助作用。当自己的RESEARCH还不很成熟时,不要花太多精力去拉关系。这时候可以采用守株待兔的策略。可以积极接近系里的SEMINAR VISITOR 和其他短期VISITOR。如果有黑名单上的人作SEMINAR,一定要把论文提前认真读一遍,想一到两个SMART QUESTIONS。至于什么是SMART QUESTIONS,下面只是我个人看法。一句话,做人要厚道,尤其是刚踏入江湖的人。一定要牢记自己提问题的目的是帮助作者添砖加瓦,如何把论文作得更严谨,更完美,而不是去挖别人墙角。可以看看有没有相关的LITERATURE被作者漏掉了,文章逻辑是不是严谨,THEORY和EMPIRICAL部份是不是对应,有没有什么简单的ROBUSTNESS TEST作者可以考虑一下。总之,这种CONSTRUCTIVE的问题更容易引起作者的认真考虑,容易被采纳。
但是VISITOR不可能对你有什么印象如果你仅仅在SEMINAR上提个问题。要找机会和他们面谈一会儿。VISITOR往往会在系里呆一段时间。到他办公室去介绍一下自己的RESEARCH,自己的RESEARCH和VISITOR的有什么相关的地方。去之前要先作个RESEARCH,看看VISITOR以前作什么,现在正在作什么,这样话题更多一些。不要希望他们能记住你的名字。但一定要自报门户,让他知道你是谁的学生。让他知道你导师有个优秀的学生会在未来的MARKET上,方便导师以后推销你。
有了一篇像样的文章后,就可以加大NETWORKING的力度。把文章发给自己黑名单上的人。但发之前一定要认真考虑,可以征求一下导师的意见。文章要有一定的质量才能起到给自己作宣传的作用,不然会适得其反。尤其是在TOP SCHOOL 的学生,开始大家会很SERIOUS的对待你。如果发现你的论文也就是TERM PAPER的水平,下次你再发文章给他们,恐怕没人再看了。所以对外NETWORKING太早不但不能帮助你,反而可能把你BURN OUT。文章一定要认真修改之后在给大家传阅。找NATIVE SPEAKER纠正语法错误。
发给别人时,不要仅仅说我有一篇论文和你的研究相关,希望你看后给我提提意见。首先,如果自己引用了他的论文,要让他知道。其次,对自己的论文作一个简短的介绍。对于这种骚扰,大部份人不会有什么回应。NICE点的可能回个EMAIL说,感谢发论文给他,有什么COMMENTS会给你说。但能认真给你提建议的应该很少。但不要气馁,至少自己的名字让别人看到了。自己一二年级时对SEMINAR完全听不懂,但还是坚持去。不图别的,就是和老师混个脸熟。同样作为JUNIOR,不要怕热脸贴冷屁股,贴几次就热了。
有人问我读书期间去参加CONFERENCE有没有帮助。我个人感觉帮助不大。很多CONFERENCE有学生SESSION,去这些SESSION的往往是学生。接触的人很有限。但如果决定参加,就要好好利用。认真看看CONFERENCE的PROGRAM,有没有黑名单上的人参加。如果有,要参加他们的SESSION,SESSION结束后要留下来给他们聊几句再走。但这种大型CONFERENCE上大家都忙着SOCIAL,一般不愿意花太多时间和STUDENTS TALK。
真正的NETWORKING我觉得是在上JOB MARKET之后。有很多介绍JOB MARKET的文章里包括了怎么INTERVIEW和FLYOUT,我这里就不罗嗦了。这两个环节都是自己认识人的好机会。
工作后有什么资源可以利用么?第一是系里的SEMINAR,争取当系里的SEMINAR ORGANIZER。实在不行,每个学期争取请1到2个自己的朋友来讲座。这时的主动权就完全掌握在自己手里了。把黑名单上的人排个顺序。自己研究TOPIC的人排在前面,挨个请。以前不认识的也可以。一般这种邀请别人不会拒绝,除非是极牛的人。他们实在太忙。但给他们发个邀请,就算拒绝了他也会对你有个印象。人请来了自然要好好招待,安排旅馆,陪着吃饭自然免不了。吃饭时抓住时机给别人介绍自己的论文。而且要介绍自己正在或者正准备作的PROJECT,很多COAUTHORSHIP就是在饭桌上产生的。别以为这一套只有在中国行得通,其实是世界通用的。别人请来的SEMINAR SPEAKER如果有机会,吃饭也是要同去的。两杯酒一喝,不管中国人还是外国人,关系都感觉更近了一步。
有机会多参加CONFERENCE。在CONFERENCE上要PRESENT或作DISCUSSANT。这样才有暴光度。作DISCUSSANT时要肯花时间。一个好的DISCUSSANT很多时候比PRESENTER给人的印象还深。
刚毕业的JUNIOR一定要避免一个人单干。找导师合作一两篇文章。让他扶你上马后,再送你一程。如果本系有比较出名的SENIOR,想办法和他们合作效果可能更好。
毕业后REFEREE的工作会逐渐多起来。这时一个给EDITOR留个好印象的绝好机会。认真准时完成报告。写报告时要厚道,不要一味批评别人。当然有人写很MEAN的REPORT,这完全是个人选择。我一般即使决定要据某个文章,除了指出它不足的地方外,都列几个CONSTRUCTIVE的COMMENTS。REFEREE是匿名的,EDITOR可是署名的。虽然我们不应该TAKE IT PERSONALLY,但如果你从一个EDITOR手里收到一个很MEAN的REPORT,自然会多少有点迁怒于EDITOR。EDITOR还是希望有一篇中肯,NICE的REPORT。
在REPORT中不要让别人CITE自己的文章,尤其是自己要据的文章。除了给EDITOR留下不好印象外,还得罪了被审稿的。别人一下就可以猜出是你审的。你如果有什么仇人,可以害他一下。写一篇MEAN REPORT,然后让他CITE你仇人的文章。呵呵,开个玩笑而已。
如果文章不错,建议接受,写一篇很NICE的REPORT。写几句很明显的赞扬的话,让作者一看就知道你一定是建议REVISE&RESUBMIT。适当谈谈这篇文章和自己文章的关系。不要明显CITE自己的文章,除非是联系非常紧密。可以把自己文章的IDEA介绍一下,讨论一下这两篇文章的互补之处。作者回去作个LITERATURE SEARCH,十有八九能找到你。
以上只是我个人的一点儿体会,欢迎大家补充。--http://blog.renren.com/blog/220859777/461281742#nogo
Excel使用技巧
快捷键之在工作表中移动和滚动向上、下、左或右移动单元格箭头键
移动到当前数据区域的边缘:CTRL+ 箭头键
移动到行首:HOME
移动到工作表的开头:CTRL+HOME
移动到工作表的最后一个单元格。:CTRL+END
向下移动一屏:PAGE DOWN
向上移动一屏:PAGE UP
向右移动一屏:ALT+PAGE DOWN
向左移动一屏:ALT+PAGE UP
移动到工作簿中下一个工作表:CTRL+PAGE DOWN
移动到工作簿中前一个工作表:CTRL+PAGE UP
移动到下一工作簿或窗口:CTRL+F6 或 CTRL+TAB
移动到前一工作簿或窗口:CTRL+SHIFT+F6
移动到已拆分工作簿中的下一个窗格:F6
移动到被拆分的工作簿中的上一个窗格:SHIFT+F6
滚动并显示活动单元格:CTRL+BACKSPACE
显示“定位”对话框:F5
显示“查找”对话框:SHIFT+F5
重复上一次“查找”操作:SHIFT+F4
在保护工作表中的非锁定单元格之间移动:TAB
2>Excel快捷键之处于END模式时在工作表中移动
打开或关闭 END 模式:END
在一行或列内以数据块为单位移动:END, 箭头键
移动到工作表的最后一个单元格.:END, HOME
在当前行中向右移动到最后一个非空白单元格。:END, ENTER
3>Excel快捷键之处于“滚动锁定”模式时在工作表中移动
打开或关闭滚动锁定:SCROLL LOCK
移动到窗口中左上角处的单元格:HOME
移动到窗口中右下角处的单元格:END
向上或向下滚动一行:上箭头键或下箭头键
向左或向右滚动一列:左箭头键或右箭头键
4>Excel快捷键之用于预览和打印文档
显示“打印”对话框:CTRL+P
在打印预览中时:
当放大显示时,在文档中移动:箭头键
当缩小显示时,在文档中每次滚动一页:PAGE UP
当缩小显示时,滚动到第一页:CTRL+上箭头键
当缩小显示时,滚动到最后一页:CTRL+下箭头键
5>Excel快捷键之用于工作表、图表和宏
插入新工作表:SHIFT+F11
创建使用当前区域的图表:F11 或 ALT+F1
显示“宏”对话框:ALT+F8
显示“Visual Basic 编辑器”:ALT+F11
插入 Microsoft Excel 4.0 宏工作表:CTRL+F11
移动到工作簿中的下一个工作表:CTRL+PAGE DOWN
移动到工作簿中的上一个工作表:CTRL+PAGE UP
选择工作簿中当前和下一个工作表:SHIFT+CTRL+PAGE DOWN
选择当前工作簿或上一个工作簿:SHIFT+CTRL+PAGE UP
6>Excel快捷键之选择图表工作表
选择工作簿中的下一张工作表:CTRL+PAGE DOWN
选择工作簿中的上一个工作表:CTRL+PAGE UP,END, SHIFT+ENTER
7>Excel快捷键之用于在工作表中输入数据
完成单元格输入并在选定区域中下移:ENTER
在单元格中折行:ALT+ENTER
用当前输入项填充选定的单元格区域:CTRL+ENTER
完成单元格输入并在选定区域中上移:SHIFT+ENTER
完成单元格输入并在选定区域中右移:TAB
完成单元格输入并在选定区域中左移:SHIFT+TAB
取消单元格输入:ESC
删除插入点左边的字符,或删除选定区域:BACKSPACE
删除插入点右边的字符,或删除选定区域:DELETE
删除插入点到行末的文本:CTRL+DELETE
向上下左右移动一个字符:箭头键
移到行首:HOME
重复最后一次操作:F4 或 CTRL+Y
编辑单元格批注:SHIFT+F2
由行或列标志创建名称:CTRL+SHIFT+F3
向下填充:CTRL+D
向右填充:CTRL+R
定义名称:CTRL+F3
8>Excel快捷键之设置数据格式
显示“样式”对话框:ALT+' (撇号)
显示“单元格格式”对话框:CTRL+1
应用“常规”数字格式:CTRL+SHIFT+~
应用带两个小数位的“贷币”格式:CTRL+SHIFT+$
应用不带小数位的“百分比”格式:CTRL+SHIFT+%
应用带两个小数位的“科学记数”数字格式:CTRL+SHIFT+^
应用年月日“日期”格式:CTRL+SHIFT+#
应用小时和分钟“时间”格式,并标明上午或下午:CTRL+SHIFT+@
应用具有千位分隔符且负数用负号 (-) 表示:CTRL+SHIFT+!
应用外边框:CTRL+SHIFT+&
删除外边框:CTRL+SHIFT+_
应用或取消字体加粗格式:CTRL+B
应用或取消字体倾斜格式:CTRL+I
应用或取消下划线格式:CTRL+U
应用或取消删除线格式:CTRL+5
隐藏行:CTRL+9
取消隐藏行:CTRL+SHIFT+( 左括号
隐藏列:CTRL+0(零)
取消隐藏列:CTRL+SHIFT+)右括号
9>Excel快捷键之编辑数据
编辑活动单元格并将插入点放置到线条末尾:F2
取消单元格或编辑栏中的输入项:ESC
编辑活动单元格并清除其中原有的内容:BACKSPACE
将定义的名称粘贴到公式中:F3
完成单元格输入:ENTER
将公式作为数组公式输入:CTRL+SHIFT+ENTER
在公式中键入函数名之后,显示公式选项板:CTRL+A
在公式中键入函数名后为该函数插入变量名和括号:CTRL+SHIFT+A
显示“拼写检查”对话框。:F7 键
10>Excel快捷键之插入、删除和复制选中区域
复制选定区域:CTRL+C
剪切选定区域:CTRL+X
粘贴选定区域:CTRL+V
清除选定区域的内容:DELETE
删除选定区域:CTRL+ 连字符
撤消最后一次操作:CTRL+Z
插入空白单元格:CTRL+SHIFT+ 加号
11>Excel快捷键之在选中区域内移动
在选定区域内由上往下移动:ENTER
在选定区域内由下往上移动:SHIFT+ENTER
在选定区域内由左往右移动:TAB
在选定区域内由右往左移动:SHIFT+TAB
按顺时针方向移动到选定区域的下一个角:CTRL+PERIOD
右移到非相邻的选定区域:CTRL+ALT+右箭头键
左移到非相邻的选定区域:CTRL+ALT+左箭头键
12>Excel快捷键之选择单元格、列或行
选定当前单元格周围的区域:CTRL+SHIFT+*(星号)
将选定区域扩展一个单元格宽度:SHIFT+ 箭头键
选定区域扩展到单元格同行同列的最后非空单元格:CTRL+SHIFT+ 箭头键
将选定区域扩展到行首:SHIFT+HOME
将选定区域扩展到工作表的开始:CTRL+SHIFT+HOME
将选定区域扩展到工作表的最后一个使用的单元格:CTRL+SHIFT+END
选定整列:CTRL+SPACEBAR
选定整行:SHIFT+SPACEBAR
选定整个工作表:CTRL+A
如果选定了多个单元格则只选定其中的单元格:SHIFT+BACKSPACE
将选定区域向下扩展一屏:SHIFT+PAGE DOWN
将选定区域向上扩展一屏:SHIFT+PAGE UP
选定了一个对象,选定工作表上的所有对象:CTRL+SHIFT+SPACEBAR
在隐藏对象、显示对象与对象占位符之间切换:CTRL+6
显示或隐藏“常用”工具栏:CTRL+7
使用箭头键启动扩展选中区域的功能:F8
将其他区域中的单元格添加到选中区域中:SHIFT+F8
将选定区域扩展到窗口左上角的单元格:SCROLLLOCK, SHIFT+HOME
将选定区域扩展到窗口右下角的单元格:SCROLLLOCK, SHIFT+END
13>Excel快捷键之处于End模式时展开选中区域
打开或关闭 END 模式:END
将选定区域扩展到单元格同列同行的最后非空单元格:END, SHIFT+ 箭头键
将选定区域扩展到工作表上包含数据的最后一个单元格:END, SHIFT+HOME
将选定区域扩展到当前行中的最后一个单元格:END, SHIFT+ENTER
14>Excel快捷键之选择含有特殊字符单元格
选中活动单元格周围的当前区域:CTRL+SHIFT+*(星号)
选中当前数组,此数组是活动单元格所属的数组:CTRL+/
选定所有带批注的单元格:CTRL+SHIFT+O (字母 O)
选择行中不与该行内活动单元格的值相匹配的单元格:CTRL+\
选中列中不与该列内活动单元格的值相匹配的单元格:CTRL+SHIFT+|
选定当前选定区域中公式的直接引用单元格:CTRL+[ (左方括号)
选定当前选定区域中公式直接或间接引用的所有单元格:CTRL+SHIFT+{ 左大括号
只选定直接引用当前单元格的公式所在的单元格:CTRL+] (右方括号)
选定所有带有公式的单元格,这些公式直接或间接引用当前单元格:CTRL+SHIFT+}右大括号--http://blog.renren.com/share/228687796/3843902696
1 编辑技巧
(1)分数的输入
如果直接输入“1/5”,系统会将其变为“1月5日”,解决办法是:先输入“0”,然后输入空格,再输入分数“1/5”。
(2)序列“001”的输入
如果直接输入“001”,系统会自动判断001为数据1,解决办法是:首先输入“'”(西文单引号),然后输入“001”。
(3)日期的输入
如果要输入“4月5日”,直接输入“4/5”,再敲回车就行了。如果要输入当前日期,按一下“Ctrl+;”键。
(4) 填充条纹
如果想在工作簿中加入漂亮的横条纹,可以利用对齐方式中的填充功能。先在一单元格内填入“*”或“~”等符号,然后单击此单元格,向右拖动鼠标,选中横向若干单元格,单击“格式”菜单,选中“单元格”命令,在弹出的“单元格格式”菜单中,选择“对齐”选项卡,在水平对齐下拉列表中选择“填充”,单击“确定”按钮。
(5)多张工作表中输入相同的内容
几个工作表中同一位置填入同一数据时,可以选中一张工作表,然后按住Ctrl键,再单击窗口左下角的Sheet1、Sheet2......来直接选择需要输入相同内容的多个工作表,接着在其中的任意一个工作表中输入这些相同的数据,此时这些数据会自动出现在选中的其它工作表之中。输入完毕之后,再次按下键盘上的Ctrl键,然后使用鼠标左键单击所选择的多个工作表,解除这些工作表的联系,否则在一张表单中输入的数据会接着出现在选中的其它工作表内。
(6)不连续单元格填充同一数据
选中一个单元格,按住Ctrl键,用鼠标单击其他单元格,就将这些单元格全部都选中了。在编辑区中输入数据,然后按住Ctrl键,同时敲一下回车,在所有选中的单元格中都出现了这一数据。
(7)在单元格中显示公式
如果工作表中的数据多数是由公式生成的,想要快速知道每个单元格中的公式形式,以便编辑修改,可以这样做:用鼠标左键单击“工具”菜单,选取“选项”命令,出现“选项”对话框,单击“视图”选项卡,接着设置“窗口选项”栏下的“公式”项有效,单击“确定”按钮。这时每个单元格中的分工就显示出来了。如果想恢复公式计算结果的显示,就再设置“窗口选项”栏下的“公式”项失效即可。
(8)利用Ctrl+*选取文本
如果一个工作表中有很多数据表格时,可以通过选定表格中某个单元格,然后按下Ctrl+*键可选定整个表格。Ctrl+*选定的区域为:根据选定单元格向四周辐射所涉及到的有数据单元格的最大区域。这样我们可以方便准确地选取数据表格,并能有效避免使用拖动鼠标方法选取较大单元格区域时屏幕的乱滚现象。
(9)快速清除单元格的内容
如果要删除内容的单元格中的内容和它的格式和批注,就不能简单地应用选定该单元格,然后按Delete键的方法了。要彻底清除单元格,可用以下方法:选定想要清除的单元格或单元格范围;单击“编辑”菜单中“清除”项中的“全部”命令,这些单元格就恢复了本来面目。
2、单元格内容的合并
根据需要,有时想把B列与C列的内容进行合并,如果行数较少,可以直接用“剪切”和“粘贴”来完成操作,但如果有几万行,就不能这样办了。
解决办法是:在C行后插入一个空列(如果D列没有内容,就直接在D列操作),在D1中输入“=B1&C1”,D1列的内容就是B、C两列的和了。选中D1单元格,用鼠标指向单元格右下角的小方块“■”,当光标变成"+"后,按住鼠标拖动光标向下拖到要合并的结尾行处,就完成了B列和C列的合并。这时先不要忙着把B列和C列删除,先要把D列的结果复制一下,再用“选择性粘贴”命令,将数据粘贴到一个空列上。这时再删掉B、C、D列的数据。
下面是一个“&”实际应用的例子。用AutoCAD绘图时,有人喜欢在EXCEL中存储坐标点,在绘制曲线时调用这些参数。存放数据格式为“x,y”的形式,首先在Excel中输入坐标值,将x坐标值放入A列,y坐标值放入到B列,然后利用“&”将A列和B列合并成C列,在C1中输入:=A1&","&B1,此时C1中的数据形式就符合要求了,再用鼠标向下拖动C1单元格,完成对A列和B列的所有内容的合并。
合并不同单元格的内容,还有一种方法是利用CONCATENATE函数,此函数的作用是将若干文字串合并到一个字串中,具体操作为“=CONCATENATE(B1,C1)”。比如,假设在某一河流生态调查工作表中,B2包含“物种”、B3包含“河鳟鱼”,B7包含总数45,那么:输入“=CONCATENATE("本次河流生态调查结果:",B2,"",B3,"为",B7,"条/公里。")” 计算结果为:本次河流生态调查结果:河鳟鱼物种为45条/公里。
3、条件显示
我们知道,利用If函数,可以实现按照条件显示。一个常用的例子,就是教师在统计学生成绩时,希望输入60以下的分数时,能显示为“不及格”;输入60以上的分数时,显示为“及格"。这样的效果,利用IF函数可以很方便地实现。假设成绩在A2单元格中,判断结果在A3单元格中。那么在A3单元格中输入公式: =if(A2<60,“不及格”,“及格”)同时,在IF函数中还可以嵌套IF函数或其它函数。
例如,如果输入: =if(A2<60,“不及格”,if(A2<=90,“及格”,“优秀"))就把成绩分成了三个等级。
如果输入 =if(A2<60,“差",if(A2<=70,“中”,if(A2<90,“良”,“优”)))就把成绩分为了四个等级。
再比如,公式: =if(SUM(A1:A5>0,SUM(A1:A5),0)此式就利用了嵌套函数,意思是,当A1至A5的和大于0时,返回这个值,如果小于0,那么就返回0。还有一点要提醒你注意:以上的符号均为半角,而且IF与括号之间也不能有空格。
4、自定义函数
虽然Excel中已有大量的内置函数,但有时可能还会碰到一些计算无函数可用的情况。假如某公司采用一个特殊的数学公式计算产品购买者的折扣,如果有一个函数来计算岂不更方便?下面就说一下如何创建这样的自定义函数。
自定义函数,也叫用户定义函数,是Excel最富有创意和吸引力的功能之一,下面我们在Visual Basic模块中创建一个函数。在下面的例子中,我们要给每个人的金额乘一个系数,如果是上班时的工作餐,就打六折;如果是加班时的工作餐,就打五折;如果是休息日来就餐,就打九折。首先打开“工具”菜单,单击“宏”命令中的“Visual Basic编辑器”,进入Visual Basic编辑环境,在“工程-VBAobject”栏中的当前表上单击鼠标右键,选择“插入”-“模块”,在右边栏创建下面的函数rrr,代码如下: Function rrr(tatol, rr) If rr = "上班" Then rrr = 0.6 * tatol ElseIf rr = "加班" Then rrr = 0.5 * tatol ElseIf rr = "休息日" Then rrr = 0.9 * tatol End If End Function。
这时关闭编辑器,只要我们在相应的列中输入rrr(F2,B2),那么打完折后的金额就算出来了。
5、矩阵计算
Excel的强大计算功能,不但能够进行简单的四则运算,也可以进行数组、矩阵的计算。
(1)数组和矩阵的定义
矩阵不是一个数,而是一个数组。在Excel里,数组占用一片单元域,单元域用大括号表示,例如{A1:C3},以便和普通单元域A1:C3相区别。设置时先选定单元域,同时按Shift+Ctrl+Enter键,大括弧即自动产生,数组域得以确认。
一个单元格就是一个变量,一片单元域也可以视为一组变量。为了计算上的方便,一组变量最好给一个数组名。例如A={A1:C3}、B={E1:G3}等。数组名的设置步骤是:选定数组域,单击“插入”菜单,选择“名称”项中的“定义”命令,输入数组名,单击“确定”按钮即可。更简单的命名办法为:选择数组域,单击名称框,直接输入名称就行了。
矩阵函数是Excel进行矩阵计算的专用模块。用“插入”-“函数”命令打开“粘贴函数”对话框,选中函数分类栏中的“数学与三角函数”,在右边栏常用的矩阵函数有: MDETERM——计算一个矩阵的行列式; MINVERSE——计算一个矩阵的逆矩阵; MMULT——计算两个矩阵的乘积; SUMPRODUCT——计算所有矩阵对应元素乘积之和。
(2)矩阵的基本计算
数组计算和矩阵计算有很大的区别,比如下面这个例子中,A和B都是定义好的数组,因为这两个数组都是3×3的,输出结果也是3×3个单元格。计算时先选定矩阵计算结果的输出域,为3×3的单元格区域,然后输入公式。如果输入“=A+B”或“=A-B”,计算结果是数组对应项相加或相减,输入“=A*B”表示数组A和B相乘,输入“=A/B”表示数组A除数组B。如果要进行矩阵计算,就要用到相应的矩阵函数。矩阵相加、相减与数组的加减表达形式是一样的,也是“=A+B”和“=A-B”,表示矩阵相乘可以输入“=MMULT(A,B)”,而矩阵相除是矩阵A乘B的逆矩阵,所以计算公式是“=MMULT(A,MINVERSE(B))”。公式输入后,同时按Shift+Ctrl+Enter键得到计算结果。对于更复杂的矩阵计算,可以采用分步计算。
6、自动切换输入法
在一张工作表中,往往是既有数据,又有文字,这样在输入时就需要来回在中英文之间反复切换输入法,非常麻烦。如果你要输入的东西很有规律性,比如这一列全是单词,下一列全是汉语解释,你可以用以下方法实现自动切换。方法是:
(1)选中要输入英文的列,单击“数据”菜单,选择“有效性...”命令,在弹出的“数据有效性”对话框中,选中“输入法模式”选项卡,在“模式”框中选择“关闭(英文模式)”命令,单击“确定”按钮。
(2)选中要输入汉字的列,在“有效数据”对话框中,单击“IME模式”选项卡,在“模式”框中选择“打开”命令,单击“确定”按钮。这样,当光标在前一列时,可以输入英文,在下一列时,直接可以输入中文,从而实现了中英文输入方式之间的自动切换。
7、批量删除空行
有时我们需要删除Excel工作薄中的空行,一般做法是将空行一一找出,然后删除。如果工作表的行数很多,这样做就非常不方便。我们可以利用“自动筛选”功能,把空行全部找到,然后一次性删除。做法:先在表中插入新的一个空行,然后按下Ctrl+A键,选择整个工作表,用鼠标单击“数据”菜单,选择“筛选”项中的“自动筛选”命令。这时在每一列的顶部,都出现一个下拉列表框,在典型列的下拉列表框中选择“空白”,直到页面内已看不到数据为止。
在所有数据都被选中的情况下,单击“编辑”菜单,选择“删除行”命令,然后按“确定”按钮。这时所有的空行都已被删去,再单击“数据”菜单,选取“筛选”项中的“自动筛选”命令,工作表中的数据就全恢复了。插入一个空行是为了避免删除第一行数据。
如果想只删除某一列中的空白单元格,而其它列的数据和空白单元格都不受影响,可以先复制此列,把它粘贴到空白工作表上,按上面的方法将空行全部删掉,然后再将此列复制,粘贴到原工作表的相应位置上。
8、宏的应用
宏是一个指令集,用来告诉EXCEL来完成用户指定的动作。宏类似于计算机程序,但是它是完全运行于EXCEL之中的,我们可以使用宏来完成枯燥的、频繁的重复性工作。宏完成动作的速度比用户自己做要快得多。例如,我们可以创建一个宏,用来在工作表的每一行上输入一组日期,并在每一单元格内居中对齐日期,然后对此行应用边框格式。我们还可以创建一个宏,在“页面设置”对话框中指定打印设置并打印文档。
由于宏病毒的影响和对编程的畏惧心理,使很多人不敢用“宏”,或是不知道什么时候可以找宏来帮忙。其实你尽管放心大胆地去用,如果只是用“录制宏”的方法,根本就没有什么难的,只是把一些操作象用录音机一样录下来,到用的时候,只要执行这个宏,系统就会把那操作再执行一遍。
下面给出了宏的应用场合,只要用“录制宏”就可以帮你完成任务,而不需要编程。如果想对所录制的宏再进行编辑,就要有一定的VBA知识了。
* 设定一个每个工作表中都需要的固定形式的表头;
* 将单元格设置成一种有自己风格的形式;
* 每次打印都固定的页面设置;
* 频繁地或是重复地输入某些固定的内容,比如排好格式的公司地址、人员名单等;
* 创建格式化表格;
* 插入工作表或工作薄等。
需要指出的是,EXCEL中的宏与WORD中的宏有些不同之处,对于录制的操作,它会记住单元格的坐标(即所有的引用都是绝对的),所以在涉及到与位置有关的操作时,要格外注意。如果相用相对引用,可以借助于Offset方法,比如下面的语句: ActiveCell.Offset(1,0). range("A1").select 宏的应用是很广的,上面提到的只是一点点,如果真的用起来,你会发现它有更丰富的内容和更灵活的应用方法。
9.函数的使用
这一章,我们来学习在Excel中使用公式和函数。这是相当重要的一部分,在Excel中实现数据计算功能全靠它们了。
我们在Excel中计算一下公式y=(3x+1)/2在x从1变化到20时y的值:先在第一列中输入好1到20这些数,然后在B1单元格中输入“=(3*A1+1)/2”,将其填充到下面的单元格中,就可以得到直观的结果了;可以很容易看出,这里“*”表示的是乘,“/”表示的就是除,括号的作用和平时是相同的。
创建公式是很容易的,关键在于你要想好怎么去创建这个公式,以及合理的使用单元格的引用。
最常用的函数功能就是求和,Excel中求和功能有很多的用法,最简单的就是自动求和功能了。
我们来看一个表格,现在我们需要把这个货物表的总值部分的全部款项汇总一下,看看到底有多少:选中这些单元格和下面的“总计”单元格,然后单击工具栏上的“自动求和”按钮,在“总计”栏中就出现了上面单元格的数字的和。
这个自动求和功能可以自动在行或列中求和,对行中数据的求和同对列中数据的求和方法基本一致;但是象下面这个表,要加和的单元格并不是在同一个行或者列上,这时自动求和功能就没有办法了。
这时我们就要用到Excel提供的函数功能来实现了:单击要填入分数和的单元格,单击工具栏上的“输入公式”按钮,现在左边的名称框变成了一个函数的选择列表框,单击这个列标框的下拉箭头,从中选择“SUM”项。在编辑栏中就出现了函数SUM,单击“SUM”栏的Number1输入框的拾取按钮,从工作表中选择要将数值相加的单元格,单击输入框中的“返回”按钮回到刚才的对话框,单击“确定”按钮就可以了。(如下图)如果要求和单元格不连续的话,你也可以用Ctrl键来配合鼠标进行选取。Excel也有求平均数的函数:选中要放置平均数的单元格,单击“输入公式”按钮,单击左边的函数选择下拉列表框的下拉箭头,选择平均数函数“AVERAGE”项,然后选择取值的单元格,单击“确定”按钮就可以了。
10、选择性粘贴
Excel为我们提供了一些自动功能。先来看看选择性粘贴:这里的选择性粘贴是指把剪贴板中的内容按照一定的规则粘贴到工作表中,而不是像前面那样简单地拷贝。就拿这个表来说吧。
这里的“利润”一栏是我们使用公式计算得到的,选择这一栏,复制到Sheet2中,可以看到数值并没有跟着复制过来;这时就可以使用选择性粘贴了:打开“编辑”菜单,单击“选择性粘贴”命令,打开“选择性粘贴”对话框,在“粘贴”一栏中选择“数值”,单击“确定”按钮,数值就可以粘贴过来了。这种情况不仅是在几个工作表之间复制时会发生,在同一个工作表中进行复制时也会遇到,到时可要注意。
选择性粘贴还有一个很常用的功能就是转置功能。简单地理解就是把一个横排的表变成竖排的或把一个竖排的表变成横排的:选择这个表格,复制一下,切换到另一个工作表中,打开“选择性粘贴”对话框,选中“转置”前的复选框,单击“确定”按钮,可以看到行和列的位置相互转换了过来。
另外一些简单的计算也可以用选择性粘贴来完成:选中这些单元格,复制一下,然后打开“选择性粘贴”对话框,在“运算”一栏选择“加”,单击“确定”按钮,单元格的数值就是原来的两倍了。此外你还可以粘贴全部格式或部分格式,或只粘贴公式等等。
11、拼写检查
Excel还提供了拼写检查的功能,打开“工具”菜单,单击“拼写”命令,Excel就会自动对当前工作表中的内容进行拼写检查,在错误的地方会弹出“拼写检查”对话框,第一行中显示的是Excel认为有错误的单词,下面的“更改为”输入框中显示的是Excel默认的应该替换为的单词,再下面的“建议”列表框中显示的是在词典中与错误的单词比较接近的词。
单击右边的“更改”按钮可以把当前的词替换为“更改为”输入框中的词;然后Excel就会自动搜寻下一个错误的单词,从“建议”列表中选择要替换为的单词,单击“更改”按钮,就可以把单词替换为所选择的词;而选择“忽略”按钮可以忽略此处错误。
12、自动更正
现在我们在单元格中输入(c)然后按一下回车,可以看到输入的字符变了。这是Excel的自动更正功能,我们再输入(r),回车;同样可以看到输入的字符又变了。其实这些都是可以设置的:打开“工具”菜单,单击“自动更正”命令,打开“自动更正”对话框,这里列出了所有自动更正的选择,在“键入时自动替换”列表中的头两个就是我们刚才看到的,输入(c)则替换为(c),输入(r)则替换为(r)。
我们还可以把自己容易犯错的词做一个自动更正的词条,以后再输入起来就很方便了:在“替换”输入框中写入“制做”,在“替换为”输入框中填上“制作”,单击“添加”按钮将其添加到列表中,单击“确定”按钮;在单元格中输入“制做”,回车,可以看到“制做”就被替换成了“制作”。
如果你不想使用哪个自动更正的选项了,就在自动更正对话框中把这个选项去掉就行了。
13、 宏的使用
另外还有一个最重要的自动功能,那就是“宏”。我们每次听到“宏”总是和病毒在一块儿,一般自己做的宏是不会对自己有害的。合理地使用宏可以大幅度地提高工作效率,而且有些操作不使用宏的话会很麻烦。最简单的宏可以通过录制来做。
比如我们写一个宏,让它删除A3单元格的内容:打开“工具”菜单,单击“宏”项,从子菜单中选择“录制新宏”命令,弹出“录制新宏”对话框,在“宏名”输入框中输入宏的名字,单击“确定”按钮,在界面中出现了“停止录制”工具栏,我们就可以进行宏的录制了,在状态栏的最左边可以看到目前的状态是“就绪录制”;单击A3单元格,按一下Delete键,这个宏的操作就算完成了,单击工具栏上的“停止录制”按钮,工具栏自动消失了。
现在在A3单元格中随便填上数值,选择其它的单元格,打开“工具”菜单中的“宏”子菜单,选择“宏”命令,打开“宏”对话框,选择我们刚才录制的宏,单击“执行”按钮,A3单元格的内容就没有了。现在我们打开一个带有宏的工作簿,Excel会提醒我们打开的文件中带有宏,如果你不能确定宏是否带有恶意的成分就选择“禁用宏”,否则可以选择“启用宏”;在禁用之后即使宏中有恶意成份也不会对你的机器起作用了。
14.补充部分
记忆式键入
在Excel的单元格中键入文本时,Excel会将扫描同一列中的所有条目并将列中与所输入的文字相匹配的条目显示在单元格中,这就是记忆式键入功能;此时直接按回车键就可以接受所匹配的条目。
“记忆式键入”仅匹配完整的单元格条目,而不是单元格中单个的词。当编辑公式时,“记忆式键入”不工作。选择“工具”菜单的“选项”命令,打开“选项”对话框,单击“编辑”选项卡,清除“记忆式键入”复选框就可以禁用“记忆式键入”功能。
选择列表
在单元格上单击右键,可以看到“选择列表”命令,这个命令在“记忆式键入”功能打开时是可见的,单击它就可以显示同一列上邻近单元格中的所有唯一条目的列表。选择列表中的某个条目就可以把它插入所选的单元格中。
默认文件夹
在使用打开或保存命令时会发现Excel自动把“我的文档”作为默认的保存和打开文件夹,如果我们平时的工作成果并不在这个文件夹中,这样是很不方便的,不过我们可以设置这个默认的文件夹:打开“工具”菜单,选择“选项”命令,打开“选项”对话框;单击“常规”选项卡;在“默认工作目录”输入框中输入文件夹的路径名,然后单击“确定”按钮就可以了。
默认字体
在默认情况下,Excel 工作表使用 10 磅的 Arial 字体;我们也可以将这个默认的设置改变:选择“工具”菜单的“选项”命令,打开“选项”对话框,从“常规”选项卡的“标准字体”下拉列表框中选择一种字体,从“大小”下拉列表框中选择字体的大小,单击“确定”按钮;Excel会弹出对话框提示我们要重新启动 Excel,重新启动Excel后Excel就会以设置的字体显示了。
单变量求解(数据分析)
用Excel可以进行比较复杂的数值计算,比如算式z=3x+4y+1,我们要求当z=20、y=2时x的值,就可以使用单变量求解功能:首先按一般的样子将公式建立起来,然后打开“工具”菜单,单击“单变量求解”命令,打开“单变量求解”对话框,拾取“目标”为公式所在的单元格,在“目标值”输入框中输入期望的值20,然后将“可变单元格”定位为x的数值所在单元格,单击“确定”按钮,在单元格中可以看到计算的结果;同时界面中出现了“单元格求解状态”对话框,此时单击“确定”可以接受通过计算导致单元格数值的改变,而单击“取消”按钮就可以撤消改变了。
模拟运算表(数据分析)
Excel作为一个电子表格其作用不仅仅是数据的电子化存储及排序和检索,它还有另外一项很重要的功能,那就是数据分析功能,这里用得最多的就是模拟运算表:用一个简单的算式z=3x+4y+1来看:要求当x等于从1到4间的所有整数,而y为1到7间所有整数时所有z的值,用模拟运算表做:首先排好x与y的位置,然后在下面的单元格中建立一个公式,在公式所在行的右边和下面分别输入两个变量的变化值,这里我们在行上为x,列上为y,然后选中这个方形的区域,选择“数据”菜单中的“模拟运算表”命令,打开“模拟运算表”对话框,将“输入引用行的单元格”选择为公式中x的数值所在单元格,“输入引用列的单元格”选择为公式中y的数值所在的单元格。
单击“确定”按钮,就可以看到运算的结果了。如果公式发生了改变,只要修改公式单元格中的公式就可以了。
补充部分
批注的使用
对于已经插入的批注,我们可以把它们都显示出来以方便查看和编辑:打开“视图”菜单,单击“批注”命令,就可以将工作表中的所有批注都显示出来;将鼠标移动到批注所在的位置,鼠标变成了“I”形,在批注的区域内单击,可以看到批注区域内出现了闪动的光标,此时就可以对批注进行编辑了;单击工作表的任意其它位置,可以取消对批注的编辑;打开“视图”菜单,单击“批注”命令,在视图中就看不到批注了。
我们还可以使用“审阅”工具栏来进行对批注的操作:用右键单击工具栏,单击快捷菜单中的“审阅”命令,界面中就出现了“审阅”工具栏,单击工具栏中的“显示所有批注”按钮,可以显示工作表中的所有批注,再单击这个按钮,工作表中的批注就隐藏了起来。
选中一个有批注的单元格,单击“显示批注”按钮,选中单元格的批注就显示出来了;同“显示所有批注”按钮一样,再单击,就可以将这个批注隐藏起来;单击工具栏中的左边第一个按钮:“编辑批注按钮”,可以编辑选中的单元格的批注;单击一个没有批注的单元格,刚才的“编辑批注”按钮变成了“插入批注”按钮,单击它就可以在选中的单元格中插入新的批注了;单击工作表的其它部分,取消编辑批注的状态,单击工具栏上的“下一批注”按钮,Excel会自动显示下一个批注;“前一批注”按钮的用法和这个后一批注基本相同;选中带有批注的单元格后单击“删除批注”按钮,可以删除单元格中的批注。使用右键菜单,一样可以进行批注的插入、编辑和删除。
与Web的互通
在Office 2000中,Html格式已经成为其组件内置的文件格式,因此在与Web的互通上Office 2000做得比以前所有版本都要好。在Excel 2000中,我们可以选择把工作簿保存为 Web 页,甚至把工作簿或所选工作簿的点发布到 Web 服务器,这样其他人也可以使用该工作簿。
把工作簿或所选工作簿保存为 Web 页:选择“文件”菜单的“另存为Web 页”命令,打开“另存为” 对话框,选择保存的位置,指定保存的文件名,单击“保存”按钮就可以将工作簿保存成Web页了。
在保存Web页面时可以选择保存整个工作簿或选定的工作表:打开“另存为”对话框,在这里有一个选项,可以选择整个工作簿或选择的工作表;另外单击“更改标题”按钮可以自己确定保存的Web页的标题。
单击“发布”按钮,可以选择发布工作表的一部分。
加载宏和报告管理器
Excel提供了很多现成的宏可以供我们调用,这里我们来看看比较常用的“报告管理器”:打开“工具”菜单,单击“加载宏”命令,打开“加载宏”对话框;选中“当前加载宏”列表框中“报告管理器”前面的复选框,单击“确定”按钮,我们就将“报告管理器”加载到了Excel中。
打开“视图”菜单,这里就多了一个“报告管理器”命令,单击它,打开“报告管理器”对话框,就可以使用“报告管理器”了。
电子邮件
选择“文件”菜单的“发送”命令,然后选择子菜单中的“邮件收件人(以附件形式)”命令,您就可以将活动的 Excel 工作簿用电子邮件发送给其他人。当您选择该命令时,Windows 会启动电子邮件程序并将当前编辑的工作簿作为附件添加到邮件中;然后像发送普通的邮件那样发送邮件就可以了。
15、如何避免错误信息
在Excel中输入公式后,有时不能正确地计算出结果,并在单元格内显示一个错误信息,这些错误的产生,有的是因公式本身产生的,有的不是。下面就介绍一下几种常见的错误信息,并提出避免出错的办法。
1)错误值:####
含义:输入到单元格中的数据太长或单元格公式所产生的结果太大,使结果在单元格中显示不下。或是日期和时间格式的单元格做减法,出现了负值。
解决办法:增加列的宽度,使结果能够完全显示。如果是由日期或时间相减产生了负值引起的,可以改变单元格的格式,比如改为文本格式,结果为负的时间量。 2)错误值:#DIV/0!
含义:试图除以0。这个错误的产生通常有下面几种情况:除数为0、在公式中除数使用了空单元格或是包含零值单元格的单元格引用。
解决办法:修改单元格引用,或者在用作除数的单元格中输入不为零的值。
3)错误值:#VALUE!
含义:输入引用文本项的数学公式。如果使用了不正确的参数或运算符,或者当执行自动更正公式功能时不能更正公式,都将产生错误信息#VALUE!。
解决办法:这时应确认公式或函数所需的运算符或参数正确,并且公式引用的单元格中包含有效的数值。例如,单元格C4中有一个数字或逻辑值,而单元格D4包含文本,则在计算公式=C4+D4时,系统不能将文本转换为正确的数据类型,因而返回错误值#VALUE!。
4)错误值:#REF!
含义:删除了被公式引用的单元格范围。
解决办法:恢复被引用的单元格范围,或是重新设定引用范围。
5)错误值:#N/A
含义:无信息可用于所要执行的计算。在建立模型时,用户可以在单元格中输入#N/A,以表明正在等待数据。任何引用含有#N/A值的单元格都将返回#N/A。
解决办法:在等待数据的单元格内填充上数据。
6)错误值:#NAME?
含义:在公式中使用了Excel所不能识别的文本,比如可能是输错了名称,或是输入了一个已删除的名称,如果没有将文字串括在双引号中,也会产生此错误值
解决办法:如果是使用了不存在的名称而产生这类错误,应确认使用的名称确实存在;如果是名称,函数名拼写错误应就改正过来;将文字串括在双引号中;确认公式中使用的所有区域引用都使用了冒号(:)。例如:SUM(C1:C10)。 注意将公式中的文本括在双引号中。
7)错误值:#NUM!
含义:提供了无效的参数给工作表函数,或是公式的结果太大或太小而无法在工作表中表示。
解决办法:确认函数中使用的参数类型正确。如果是公式结果太大或太小,就要修改公式,使其结果在-1×10307和1×10307之间。
8)错误值:#NULL!
含义:在公式中的两个范围之间插入一个空格以表示交叉点,但这两个范围没有公共单元格。比如输入:“=SUM(A1:A10 C1:C10)”,就会产生这种情况。
解决办法:取消两个范围之间的空格。上式可改为“=SUM(A1:A10 ,C1:C10)”--http://www.xici.net/u15568717/d83887823.htm
移动到当前数据区域的边缘:CTRL+ 箭头键
移动到行首:HOME
移动到工作表的开头:CTRL+HOME
移动到工作表的最后一个单元格。:CTRL+END
向下移动一屏:PAGE DOWN
向上移动一屏:PAGE UP
向右移动一屏:ALT+PAGE DOWN
向左移动一屏:ALT+PAGE UP
移动到工作簿中下一个工作表:CTRL+PAGE DOWN
移动到工作簿中前一个工作表:CTRL+PAGE UP
移动到下一工作簿或窗口:CTRL+F6 或 CTRL+TAB
移动到前一工作簿或窗口:CTRL+SHIFT+F6
移动到已拆分工作簿中的下一个窗格:F6
移动到被拆分的工作簿中的上一个窗格:SHIFT+F6
滚动并显示活动单元格:CTRL+BACKSPACE
显示“定位”对话框:F5
显示“查找”对话框:SHIFT+F5
重复上一次“查找”操作:SHIFT+F4
在保护工作表中的非锁定单元格之间移动:TAB
2>Excel快捷键之处于END模式时在工作表中移动
打开或关闭 END 模式:END
在一行或列内以数据块为单位移动:END, 箭头键
移动到工作表的最后一个单元格.:END, HOME
在当前行中向右移动到最后一个非空白单元格。:END, ENTER
3>Excel快捷键之处于“滚动锁定”模式时在工作表中移动
打开或关闭滚动锁定:SCROLL LOCK
移动到窗口中左上角处的单元格:HOME
移动到窗口中右下角处的单元格:END
向上或向下滚动一行:上箭头键或下箭头键
向左或向右滚动一列:左箭头键或右箭头键
4>Excel快捷键之用于预览和打印文档
显示“打印”对话框:CTRL+P
在打印预览中时:
当放大显示时,在文档中移动:箭头键
当缩小显示时,在文档中每次滚动一页:PAGE UP
当缩小显示时,滚动到第一页:CTRL+上箭头键
当缩小显示时,滚动到最后一页:CTRL+下箭头键
5>Excel快捷键之用于工作表、图表和宏
插入新工作表:SHIFT+F11
创建使用当前区域的图表:F11 或 ALT+F1
显示“宏”对话框:ALT+F8
显示“Visual Basic 编辑器”:ALT+F11
插入 Microsoft Excel 4.0 宏工作表:CTRL+F11
移动到工作簿中的下一个工作表:CTRL+PAGE DOWN
移动到工作簿中的上一个工作表:CTRL+PAGE UP
选择工作簿中当前和下一个工作表:SHIFT+CTRL+PAGE DOWN
选择当前工作簿或上一个工作簿:SHIFT+CTRL+PAGE UP
6>Excel快捷键之选择图表工作表
选择工作簿中的下一张工作表:CTRL+PAGE DOWN
选择工作簿中的上一个工作表:CTRL+PAGE UP,END, SHIFT+ENTER
7>Excel快捷键之用于在工作表中输入数据
完成单元格输入并在选定区域中下移:ENTER
在单元格中折行:ALT+ENTER
用当前输入项填充选定的单元格区域:CTRL+ENTER
完成单元格输入并在选定区域中上移:SHIFT+ENTER
完成单元格输入并在选定区域中右移:TAB
完成单元格输入并在选定区域中左移:SHIFT+TAB
取消单元格输入:ESC
删除插入点左边的字符,或删除选定区域:BACKSPACE
删除插入点右边的字符,或删除选定区域:DELETE
删除插入点到行末的文本:CTRL+DELETE
向上下左右移动一个字符:箭头键
移到行首:HOME
重复最后一次操作:F4 或 CTRL+Y
编辑单元格批注:SHIFT+F2
由行或列标志创建名称:CTRL+SHIFT+F3
向下填充:CTRL+D
向右填充:CTRL+R
定义名称:CTRL+F3
8>Excel快捷键之设置数据格式
显示“样式”对话框:ALT+' (撇号)
显示“单元格格式”对话框:CTRL+1
应用“常规”数字格式:CTRL+SHIFT+~
应用带两个小数位的“贷币”格式:CTRL+SHIFT+$
应用不带小数位的“百分比”格式:CTRL+SHIFT+%
应用带两个小数位的“科学记数”数字格式:CTRL+SHIFT+^
应用年月日“日期”格式:CTRL+SHIFT+#
应用小时和分钟“时间”格式,并标明上午或下午:CTRL+SHIFT+@
应用具有千位分隔符且负数用负号 (-) 表示:CTRL+SHIFT+!
应用外边框:CTRL+SHIFT+&
删除外边框:CTRL+SHIFT+_
应用或取消字体加粗格式:CTRL+B
应用或取消字体倾斜格式:CTRL+I
应用或取消下划线格式:CTRL+U
应用或取消删除线格式:CTRL+5
隐藏行:CTRL+9
取消隐藏行:CTRL+SHIFT+( 左括号
隐藏列:CTRL+0(零)
取消隐藏列:CTRL+SHIFT+)右括号
9>Excel快捷键之编辑数据
编辑活动单元格并将插入点放置到线条末尾:F2
取消单元格或编辑栏中的输入项:ESC
编辑活动单元格并清除其中原有的内容:BACKSPACE
将定义的名称粘贴到公式中:F3
完成单元格输入:ENTER
将公式作为数组公式输入:CTRL+SHIFT+ENTER
在公式中键入函数名之后,显示公式选项板:CTRL+A
在公式中键入函数名后为该函数插入变量名和括号:CTRL+SHIFT+A
显示“拼写检查”对话框。:F7 键
10>Excel快捷键之插入、删除和复制选中区域
复制选定区域:CTRL+C
剪切选定区域:CTRL+X
粘贴选定区域:CTRL+V
清除选定区域的内容:DELETE
删除选定区域:CTRL+ 连字符
撤消最后一次操作:CTRL+Z
插入空白单元格:CTRL+SHIFT+ 加号
11>Excel快捷键之在选中区域内移动
在选定区域内由上往下移动:ENTER
在选定区域内由下往上移动:SHIFT+ENTER
在选定区域内由左往右移动:TAB
在选定区域内由右往左移动:SHIFT+TAB
按顺时针方向移动到选定区域的下一个角:CTRL+PERIOD
右移到非相邻的选定区域:CTRL+ALT+右箭头键
左移到非相邻的选定区域:CTRL+ALT+左箭头键
12>Excel快捷键之选择单元格、列或行
选定当前单元格周围的区域:CTRL+SHIFT+*(星号)
将选定区域扩展一个单元格宽度:SHIFT+ 箭头键
选定区域扩展到单元格同行同列的最后非空单元格:CTRL+SHIFT+ 箭头键
将选定区域扩展到行首:SHIFT+HOME
将选定区域扩展到工作表的开始:CTRL+SHIFT+HOME
将选定区域扩展到工作表的最后一个使用的单元格:CTRL+SHIFT+END
选定整列:CTRL+SPACEBAR
选定整行:SHIFT+SPACEBAR
选定整个工作表:CTRL+A
如果选定了多个单元格则只选定其中的单元格:SHIFT+BACKSPACE
将选定区域向下扩展一屏:SHIFT+PAGE DOWN
将选定区域向上扩展一屏:SHIFT+PAGE UP
选定了一个对象,选定工作表上的所有对象:CTRL+SHIFT+SPACEBAR
在隐藏对象、显示对象与对象占位符之间切换:CTRL+6
显示或隐藏“常用”工具栏:CTRL+7
使用箭头键启动扩展选中区域的功能:F8
将其他区域中的单元格添加到选中区域中:SHIFT+F8
将选定区域扩展到窗口左上角的单元格:SCROLLLOCK, SHIFT+HOME
将选定区域扩展到窗口右下角的单元格:SCROLLLOCK, SHIFT+END
13>Excel快捷键之处于End模式时展开选中区域
打开或关闭 END 模式:END
将选定区域扩展到单元格同列同行的最后非空单元格:END, SHIFT+ 箭头键
将选定区域扩展到工作表上包含数据的最后一个单元格:END, SHIFT+HOME
将选定区域扩展到当前行中的最后一个单元格:END, SHIFT+ENTER
14>Excel快捷键之选择含有特殊字符单元格
选中活动单元格周围的当前区域:CTRL+SHIFT+*(星号)
选中当前数组,此数组是活动单元格所属的数组:CTRL+/
选定所有带批注的单元格:CTRL+SHIFT+O (字母 O)
选择行中不与该行内活动单元格的值相匹配的单元格:CTRL+\
选中列中不与该列内活动单元格的值相匹配的单元格:CTRL+SHIFT+|
选定当前选定区域中公式的直接引用单元格:CTRL+[ (左方括号)
选定当前选定区域中公式直接或间接引用的所有单元格:CTRL+SHIFT+{ 左大括号
只选定直接引用当前单元格的公式所在的单元格:CTRL+] (右方括号)
选定所有带有公式的单元格,这些公式直接或间接引用当前单元格:CTRL+SHIFT+}右大括号--http://blog.renren.com/share/228687796/3843902696
1 编辑技巧
(1)分数的输入
如果直接输入“1/5”,系统会将其变为“1月5日”,解决办法是:先输入“0”,然后输入空格,再输入分数“1/5”。
(2)序列“001”的输入
如果直接输入“001”,系统会自动判断001为数据1,解决办法是:首先输入“'”(西文单引号),然后输入“001”。
(3)日期的输入
如果要输入“4月5日”,直接输入“4/5”,再敲回车就行了。如果要输入当前日期,按一下“Ctrl+;”键。
(4) 填充条纹
如果想在工作簿中加入漂亮的横条纹,可以利用对齐方式中的填充功能。先在一单元格内填入“*”或“~”等符号,然后单击此单元格,向右拖动鼠标,选中横向若干单元格,单击“格式”菜单,选中“单元格”命令,在弹出的“单元格格式”菜单中,选择“对齐”选项卡,在水平对齐下拉列表中选择“填充”,单击“确定”按钮。
(5)多张工作表中输入相同的内容
几个工作表中同一位置填入同一数据时,可以选中一张工作表,然后按住Ctrl键,再单击窗口左下角的Sheet1、Sheet2......来直接选择需要输入相同内容的多个工作表,接着在其中的任意一个工作表中输入这些相同的数据,此时这些数据会自动出现在选中的其它工作表之中。输入完毕之后,再次按下键盘上的Ctrl键,然后使用鼠标左键单击所选择的多个工作表,解除这些工作表的联系,否则在一张表单中输入的数据会接着出现在选中的其它工作表内。
(6)不连续单元格填充同一数据
选中一个单元格,按住Ctrl键,用鼠标单击其他单元格,就将这些单元格全部都选中了。在编辑区中输入数据,然后按住Ctrl键,同时敲一下回车,在所有选中的单元格中都出现了这一数据。
(7)在单元格中显示公式
如果工作表中的数据多数是由公式生成的,想要快速知道每个单元格中的公式形式,以便编辑修改,可以这样做:用鼠标左键单击“工具”菜单,选取“选项”命令,出现“选项”对话框,单击“视图”选项卡,接着设置“窗口选项”栏下的“公式”项有效,单击“确定”按钮。这时每个单元格中的分工就显示出来了。如果想恢复公式计算结果的显示,就再设置“窗口选项”栏下的“公式”项失效即可。
(8)利用Ctrl+*选取文本
如果一个工作表中有很多数据表格时,可以通过选定表格中某个单元格,然后按下Ctrl+*键可选定整个表格。Ctrl+*选定的区域为:根据选定单元格向四周辐射所涉及到的有数据单元格的最大区域。这样我们可以方便准确地选取数据表格,并能有效避免使用拖动鼠标方法选取较大单元格区域时屏幕的乱滚现象。
(9)快速清除单元格的内容
如果要删除内容的单元格中的内容和它的格式和批注,就不能简单地应用选定该单元格,然后按Delete键的方法了。要彻底清除单元格,可用以下方法:选定想要清除的单元格或单元格范围;单击“编辑”菜单中“清除”项中的“全部”命令,这些单元格就恢复了本来面目。
2、单元格内容的合并
根据需要,有时想把B列与C列的内容进行合并,如果行数较少,可以直接用“剪切”和“粘贴”来完成操作,但如果有几万行,就不能这样办了。
解决办法是:在C行后插入一个空列(如果D列没有内容,就直接在D列操作),在D1中输入“=B1&C1”,D1列的内容就是B、C两列的和了。选中D1单元格,用鼠标指向单元格右下角的小方块“■”,当光标变成"+"后,按住鼠标拖动光标向下拖到要合并的结尾行处,就完成了B列和C列的合并。这时先不要忙着把B列和C列删除,先要把D列的结果复制一下,再用“选择性粘贴”命令,将数据粘贴到一个空列上。这时再删掉B、C、D列的数据。
下面是一个“&”实际应用的例子。用AutoCAD绘图时,有人喜欢在EXCEL中存储坐标点,在绘制曲线时调用这些参数。存放数据格式为“x,y”的形式,首先在Excel中输入坐标值,将x坐标值放入A列,y坐标值放入到B列,然后利用“&”将A列和B列合并成C列,在C1中输入:=A1&","&B1,此时C1中的数据形式就符合要求了,再用鼠标向下拖动C1单元格,完成对A列和B列的所有内容的合并。
合并不同单元格的内容,还有一种方法是利用CONCATENATE函数,此函数的作用是将若干文字串合并到一个字串中,具体操作为“=CONCATENATE(B1,C1)”。比如,假设在某一河流生态调查工作表中,B2包含“物种”、B3包含“河鳟鱼”,B7包含总数45,那么:输入“=CONCATENATE("本次河流生态调查结果:",B2,"",B3,"为",B7,"条/公里。")” 计算结果为:本次河流生态调查结果:河鳟鱼物种为45条/公里。
3、条件显示
我们知道,利用If函数,可以实现按照条件显示。一个常用的例子,就是教师在统计学生成绩时,希望输入60以下的分数时,能显示为“不及格”;输入60以上的分数时,显示为“及格"。这样的效果,利用IF函数可以很方便地实现。假设成绩在A2单元格中,判断结果在A3单元格中。那么在A3单元格中输入公式: =if(A2<60,“不及格”,“及格”)同时,在IF函数中还可以嵌套IF函数或其它函数。
例如,如果输入: =if(A2<60,“不及格”,if(A2<=90,“及格”,“优秀"))就把成绩分成了三个等级。
如果输入 =if(A2<60,“差",if(A2<=70,“中”,if(A2<90,“良”,“优”)))就把成绩分为了四个等级。
再比如,公式: =if(SUM(A1:A5>0,SUM(A1:A5),0)此式就利用了嵌套函数,意思是,当A1至A5的和大于0时,返回这个值,如果小于0,那么就返回0。还有一点要提醒你注意:以上的符号均为半角,而且IF与括号之间也不能有空格。
4、自定义函数
虽然Excel中已有大量的内置函数,但有时可能还会碰到一些计算无函数可用的情况。假如某公司采用一个特殊的数学公式计算产品购买者的折扣,如果有一个函数来计算岂不更方便?下面就说一下如何创建这样的自定义函数。
自定义函数,也叫用户定义函数,是Excel最富有创意和吸引力的功能之一,下面我们在Visual Basic模块中创建一个函数。在下面的例子中,我们要给每个人的金额乘一个系数,如果是上班时的工作餐,就打六折;如果是加班时的工作餐,就打五折;如果是休息日来就餐,就打九折。首先打开“工具”菜单,单击“宏”命令中的“Visual Basic编辑器”,进入Visual Basic编辑环境,在“工程-VBAobject”栏中的当前表上单击鼠标右键,选择“插入”-“模块”,在右边栏创建下面的函数rrr,代码如下: Function rrr(tatol, rr) If rr = "上班" Then rrr = 0.6 * tatol ElseIf rr = "加班" Then rrr = 0.5 * tatol ElseIf rr = "休息日" Then rrr = 0.9 * tatol End If End Function。
这时关闭编辑器,只要我们在相应的列中输入rrr(F2,B2),那么打完折后的金额就算出来了。
5、矩阵计算
Excel的强大计算功能,不但能够进行简单的四则运算,也可以进行数组、矩阵的计算。
(1)数组和矩阵的定义
矩阵不是一个数,而是一个数组。在Excel里,数组占用一片单元域,单元域用大括号表示,例如{A1:C3},以便和普通单元域A1:C3相区别。设置时先选定单元域,同时按Shift+Ctrl+Enter键,大括弧即自动产生,数组域得以确认。
一个单元格就是一个变量,一片单元域也可以视为一组变量。为了计算上的方便,一组变量最好给一个数组名。例如A={A1:C3}、B={E1:G3}等。数组名的设置步骤是:选定数组域,单击“插入”菜单,选择“名称”项中的“定义”命令,输入数组名,单击“确定”按钮即可。更简单的命名办法为:选择数组域,单击名称框,直接输入名称就行了。
矩阵函数是Excel进行矩阵计算的专用模块。用“插入”-“函数”命令打开“粘贴函数”对话框,选中函数分类栏中的“数学与三角函数”,在右边栏常用的矩阵函数有: MDETERM——计算一个矩阵的行列式; MINVERSE——计算一个矩阵的逆矩阵; MMULT——计算两个矩阵的乘积; SUMPRODUCT——计算所有矩阵对应元素乘积之和。
(2)矩阵的基本计算
数组计算和矩阵计算有很大的区别,比如下面这个例子中,A和B都是定义好的数组,因为这两个数组都是3×3的,输出结果也是3×3个单元格。计算时先选定矩阵计算结果的输出域,为3×3的单元格区域,然后输入公式。如果输入“=A+B”或“=A-B”,计算结果是数组对应项相加或相减,输入“=A*B”表示数组A和B相乘,输入“=A/B”表示数组A除数组B。如果要进行矩阵计算,就要用到相应的矩阵函数。矩阵相加、相减与数组的加减表达形式是一样的,也是“=A+B”和“=A-B”,表示矩阵相乘可以输入“=MMULT(A,B)”,而矩阵相除是矩阵A乘B的逆矩阵,所以计算公式是“=MMULT(A,MINVERSE(B))”。公式输入后,同时按Shift+Ctrl+Enter键得到计算结果。对于更复杂的矩阵计算,可以采用分步计算。
6、自动切换输入法
在一张工作表中,往往是既有数据,又有文字,这样在输入时就需要来回在中英文之间反复切换输入法,非常麻烦。如果你要输入的东西很有规律性,比如这一列全是单词,下一列全是汉语解释,你可以用以下方法实现自动切换。方法是:
(1)选中要输入英文的列,单击“数据”菜单,选择“有效性...”命令,在弹出的“数据有效性”对话框中,选中“输入法模式”选项卡,在“模式”框中选择“关闭(英文模式)”命令,单击“确定”按钮。
(2)选中要输入汉字的列,在“有效数据”对话框中,单击“IME模式”选项卡,在“模式”框中选择“打开”命令,单击“确定”按钮。这样,当光标在前一列时,可以输入英文,在下一列时,直接可以输入中文,从而实现了中英文输入方式之间的自动切换。
7、批量删除空行
有时我们需要删除Excel工作薄中的空行,一般做法是将空行一一找出,然后删除。如果工作表的行数很多,这样做就非常不方便。我们可以利用“自动筛选”功能,把空行全部找到,然后一次性删除。做法:先在表中插入新的一个空行,然后按下Ctrl+A键,选择整个工作表,用鼠标单击“数据”菜单,选择“筛选”项中的“自动筛选”命令。这时在每一列的顶部,都出现一个下拉列表框,在典型列的下拉列表框中选择“空白”,直到页面内已看不到数据为止。
在所有数据都被选中的情况下,单击“编辑”菜单,选择“删除行”命令,然后按“确定”按钮。这时所有的空行都已被删去,再单击“数据”菜单,选取“筛选”项中的“自动筛选”命令,工作表中的数据就全恢复了。插入一个空行是为了避免删除第一行数据。
如果想只删除某一列中的空白单元格,而其它列的数据和空白单元格都不受影响,可以先复制此列,把它粘贴到空白工作表上,按上面的方法将空行全部删掉,然后再将此列复制,粘贴到原工作表的相应位置上。
8、宏的应用
宏是一个指令集,用来告诉EXCEL来完成用户指定的动作。宏类似于计算机程序,但是它是完全运行于EXCEL之中的,我们可以使用宏来完成枯燥的、频繁的重复性工作。宏完成动作的速度比用户自己做要快得多。例如,我们可以创建一个宏,用来在工作表的每一行上输入一组日期,并在每一单元格内居中对齐日期,然后对此行应用边框格式。我们还可以创建一个宏,在“页面设置”对话框中指定打印设置并打印文档。
由于宏病毒的影响和对编程的畏惧心理,使很多人不敢用“宏”,或是不知道什么时候可以找宏来帮忙。其实你尽管放心大胆地去用,如果只是用“录制宏”的方法,根本就没有什么难的,只是把一些操作象用录音机一样录下来,到用的时候,只要执行这个宏,系统就会把那操作再执行一遍。
下面给出了宏的应用场合,只要用“录制宏”就可以帮你完成任务,而不需要编程。如果想对所录制的宏再进行编辑,就要有一定的VBA知识了。
* 设定一个每个工作表中都需要的固定形式的表头;
* 将单元格设置成一种有自己风格的形式;
* 每次打印都固定的页面设置;
* 频繁地或是重复地输入某些固定的内容,比如排好格式的公司地址、人员名单等;
* 创建格式化表格;
* 插入工作表或工作薄等。
需要指出的是,EXCEL中的宏与WORD中的宏有些不同之处,对于录制的操作,它会记住单元格的坐标(即所有的引用都是绝对的),所以在涉及到与位置有关的操作时,要格外注意。如果相用相对引用,可以借助于Offset方法,比如下面的语句: ActiveCell.Offset(1,0). range("A1").select 宏的应用是很广的,上面提到的只是一点点,如果真的用起来,你会发现它有更丰富的内容和更灵活的应用方法。
9.函数的使用
这一章,我们来学习在Excel中使用公式和函数。这是相当重要的一部分,在Excel中实现数据计算功能全靠它们了。
我们在Excel中计算一下公式y=(3x+1)/2在x从1变化到20时y的值:先在第一列中输入好1到20这些数,然后在B1单元格中输入“=(3*A1+1)/2”,将其填充到下面的单元格中,就可以得到直观的结果了;可以很容易看出,这里“*”表示的是乘,“/”表示的就是除,括号的作用和平时是相同的。
创建公式是很容易的,关键在于你要想好怎么去创建这个公式,以及合理的使用单元格的引用。
最常用的函数功能就是求和,Excel中求和功能有很多的用法,最简单的就是自动求和功能了。
我们来看一个表格,现在我们需要把这个货物表的总值部分的全部款项汇总一下,看看到底有多少:选中这些单元格和下面的“总计”单元格,然后单击工具栏上的“自动求和”按钮,在“总计”栏中就出现了上面单元格的数字的和。
这个自动求和功能可以自动在行或列中求和,对行中数据的求和同对列中数据的求和方法基本一致;但是象下面这个表,要加和的单元格并不是在同一个行或者列上,这时自动求和功能就没有办法了。
这时我们就要用到Excel提供的函数功能来实现了:单击要填入分数和的单元格,单击工具栏上的“输入公式”按钮,现在左边的名称框变成了一个函数的选择列表框,单击这个列标框的下拉箭头,从中选择“SUM”项。在编辑栏中就出现了函数SUM,单击“SUM”栏的Number1输入框的拾取按钮,从工作表中选择要将数值相加的单元格,单击输入框中的“返回”按钮回到刚才的对话框,单击“确定”按钮就可以了。(如下图)如果要求和单元格不连续的话,你也可以用Ctrl键来配合鼠标进行选取。Excel也有求平均数的函数:选中要放置平均数的单元格,单击“输入公式”按钮,单击左边的函数选择下拉列表框的下拉箭头,选择平均数函数“AVERAGE”项,然后选择取值的单元格,单击“确定”按钮就可以了。
10、选择性粘贴
Excel为我们提供了一些自动功能。先来看看选择性粘贴:这里的选择性粘贴是指把剪贴板中的内容按照一定的规则粘贴到工作表中,而不是像前面那样简单地拷贝。就拿这个表来说吧。
这里的“利润”一栏是我们使用公式计算得到的,选择这一栏,复制到Sheet2中,可以看到数值并没有跟着复制过来;这时就可以使用选择性粘贴了:打开“编辑”菜单,单击“选择性粘贴”命令,打开“选择性粘贴”对话框,在“粘贴”一栏中选择“数值”,单击“确定”按钮,数值就可以粘贴过来了。这种情况不仅是在几个工作表之间复制时会发生,在同一个工作表中进行复制时也会遇到,到时可要注意。
选择性粘贴还有一个很常用的功能就是转置功能。简单地理解就是把一个横排的表变成竖排的或把一个竖排的表变成横排的:选择这个表格,复制一下,切换到另一个工作表中,打开“选择性粘贴”对话框,选中“转置”前的复选框,单击“确定”按钮,可以看到行和列的位置相互转换了过来。
另外一些简单的计算也可以用选择性粘贴来完成:选中这些单元格,复制一下,然后打开“选择性粘贴”对话框,在“运算”一栏选择“加”,单击“确定”按钮,单元格的数值就是原来的两倍了。此外你还可以粘贴全部格式或部分格式,或只粘贴公式等等。
11、拼写检查
Excel还提供了拼写检查的功能,打开“工具”菜单,单击“拼写”命令,Excel就会自动对当前工作表中的内容进行拼写检查,在错误的地方会弹出“拼写检查”对话框,第一行中显示的是Excel认为有错误的单词,下面的“更改为”输入框中显示的是Excel默认的应该替换为的单词,再下面的“建议”列表框中显示的是在词典中与错误的单词比较接近的词。
单击右边的“更改”按钮可以把当前的词替换为“更改为”输入框中的词;然后Excel就会自动搜寻下一个错误的单词,从“建议”列表中选择要替换为的单词,单击“更改”按钮,就可以把单词替换为所选择的词;而选择“忽略”按钮可以忽略此处错误。
12、自动更正
现在我们在单元格中输入(c)然后按一下回车,可以看到输入的字符变了。这是Excel的自动更正功能,我们再输入(r),回车;同样可以看到输入的字符又变了。其实这些都是可以设置的:打开“工具”菜单,单击“自动更正”命令,打开“自动更正”对话框,这里列出了所有自动更正的选择,在“键入时自动替换”列表中的头两个就是我们刚才看到的,输入(c)则替换为(c),输入(r)则替换为(r)。
我们还可以把自己容易犯错的词做一个自动更正的词条,以后再输入起来就很方便了:在“替换”输入框中写入“制做”,在“替换为”输入框中填上“制作”,单击“添加”按钮将其添加到列表中,单击“确定”按钮;在单元格中输入“制做”,回车,可以看到“制做”就被替换成了“制作”。
如果你不想使用哪个自动更正的选项了,就在自动更正对话框中把这个选项去掉就行了。
13、 宏的使用
另外还有一个最重要的自动功能,那就是“宏”。我们每次听到“宏”总是和病毒在一块儿,一般自己做的宏是不会对自己有害的。合理地使用宏可以大幅度地提高工作效率,而且有些操作不使用宏的话会很麻烦。最简单的宏可以通过录制来做。
比如我们写一个宏,让它删除A3单元格的内容:打开“工具”菜单,单击“宏”项,从子菜单中选择“录制新宏”命令,弹出“录制新宏”对话框,在“宏名”输入框中输入宏的名字,单击“确定”按钮,在界面中出现了“停止录制”工具栏,我们就可以进行宏的录制了,在状态栏的最左边可以看到目前的状态是“就绪录制”;单击A3单元格,按一下Delete键,这个宏的操作就算完成了,单击工具栏上的“停止录制”按钮,工具栏自动消失了。
现在在A3单元格中随便填上数值,选择其它的单元格,打开“工具”菜单中的“宏”子菜单,选择“宏”命令,打开“宏”对话框,选择我们刚才录制的宏,单击“执行”按钮,A3单元格的内容就没有了。现在我们打开一个带有宏的工作簿,Excel会提醒我们打开的文件中带有宏,如果你不能确定宏是否带有恶意的成分就选择“禁用宏”,否则可以选择“启用宏”;在禁用之后即使宏中有恶意成份也不会对你的机器起作用了。
14.补充部分
记忆式键入
在Excel的单元格中键入文本时,Excel会将扫描同一列中的所有条目并将列中与所输入的文字相匹配的条目显示在单元格中,这就是记忆式键入功能;此时直接按回车键就可以接受所匹配的条目。
“记忆式键入”仅匹配完整的单元格条目,而不是单元格中单个的词。当编辑公式时,“记忆式键入”不工作。选择“工具”菜单的“选项”命令,打开“选项”对话框,单击“编辑”选项卡,清除“记忆式键入”复选框就可以禁用“记忆式键入”功能。
选择列表
在单元格上单击右键,可以看到“选择列表”命令,这个命令在“记忆式键入”功能打开时是可见的,单击它就可以显示同一列上邻近单元格中的所有唯一条目的列表。选择列表中的某个条目就可以把它插入所选的单元格中。
默认文件夹
在使用打开或保存命令时会发现Excel自动把“我的文档”作为默认的保存和打开文件夹,如果我们平时的工作成果并不在这个文件夹中,这样是很不方便的,不过我们可以设置这个默认的文件夹:打开“工具”菜单,选择“选项”命令,打开“选项”对话框;单击“常规”选项卡;在“默认工作目录”输入框中输入文件夹的路径名,然后单击“确定”按钮就可以了。
默认字体
在默认情况下,Excel 工作表使用 10 磅的 Arial 字体;我们也可以将这个默认的设置改变:选择“工具”菜单的“选项”命令,打开“选项”对话框,从“常规”选项卡的“标准字体”下拉列表框中选择一种字体,从“大小”下拉列表框中选择字体的大小,单击“确定”按钮;Excel会弹出对话框提示我们要重新启动 Excel,重新启动Excel后Excel就会以设置的字体显示了。
单变量求解(数据分析)
用Excel可以进行比较复杂的数值计算,比如算式z=3x+4y+1,我们要求当z=20、y=2时x的值,就可以使用单变量求解功能:首先按一般的样子将公式建立起来,然后打开“工具”菜单,单击“单变量求解”命令,打开“单变量求解”对话框,拾取“目标”为公式所在的单元格,在“目标值”输入框中输入期望的值20,然后将“可变单元格”定位为x的数值所在单元格,单击“确定”按钮,在单元格中可以看到计算的结果;同时界面中出现了“单元格求解状态”对话框,此时单击“确定”可以接受通过计算导致单元格数值的改变,而单击“取消”按钮就可以撤消改变了。
模拟运算表(数据分析)
Excel作为一个电子表格其作用不仅仅是数据的电子化存储及排序和检索,它还有另外一项很重要的功能,那就是数据分析功能,这里用得最多的就是模拟运算表:用一个简单的算式z=3x+4y+1来看:要求当x等于从1到4间的所有整数,而y为1到7间所有整数时所有z的值,用模拟运算表做:首先排好x与y的位置,然后在下面的单元格中建立一个公式,在公式所在行的右边和下面分别输入两个变量的变化值,这里我们在行上为x,列上为y,然后选中这个方形的区域,选择“数据”菜单中的“模拟运算表”命令,打开“模拟运算表”对话框,将“输入引用行的单元格”选择为公式中x的数值所在单元格,“输入引用列的单元格”选择为公式中y的数值所在的单元格。
单击“确定”按钮,就可以看到运算的结果了。如果公式发生了改变,只要修改公式单元格中的公式就可以了。
补充部分
批注的使用
对于已经插入的批注,我们可以把它们都显示出来以方便查看和编辑:打开“视图”菜单,单击“批注”命令,就可以将工作表中的所有批注都显示出来;将鼠标移动到批注所在的位置,鼠标变成了“I”形,在批注的区域内单击,可以看到批注区域内出现了闪动的光标,此时就可以对批注进行编辑了;单击工作表的任意其它位置,可以取消对批注的编辑;打开“视图”菜单,单击“批注”命令,在视图中就看不到批注了。
我们还可以使用“审阅”工具栏来进行对批注的操作:用右键单击工具栏,单击快捷菜单中的“审阅”命令,界面中就出现了“审阅”工具栏,单击工具栏中的“显示所有批注”按钮,可以显示工作表中的所有批注,再单击这个按钮,工作表中的批注就隐藏了起来。
选中一个有批注的单元格,单击“显示批注”按钮,选中单元格的批注就显示出来了;同“显示所有批注”按钮一样,再单击,就可以将这个批注隐藏起来;单击工具栏中的左边第一个按钮:“编辑批注按钮”,可以编辑选中的单元格的批注;单击一个没有批注的单元格,刚才的“编辑批注”按钮变成了“插入批注”按钮,单击它就可以在选中的单元格中插入新的批注了;单击工作表的其它部分,取消编辑批注的状态,单击工具栏上的“下一批注”按钮,Excel会自动显示下一个批注;“前一批注”按钮的用法和这个后一批注基本相同;选中带有批注的单元格后单击“删除批注”按钮,可以删除单元格中的批注。使用右键菜单,一样可以进行批注的插入、编辑和删除。
与Web的互通
在Office 2000中,Html格式已经成为其组件内置的文件格式,因此在与Web的互通上Office 2000做得比以前所有版本都要好。在Excel 2000中,我们可以选择把工作簿保存为 Web 页,甚至把工作簿或所选工作簿的点发布到 Web 服务器,这样其他人也可以使用该工作簿。
把工作簿或所选工作簿保存为 Web 页:选择“文件”菜单的“另存为Web 页”命令,打开“另存为” 对话框,选择保存的位置,指定保存的文件名,单击“保存”按钮就可以将工作簿保存成Web页了。
在保存Web页面时可以选择保存整个工作簿或选定的工作表:打开“另存为”对话框,在这里有一个选项,可以选择整个工作簿或选择的工作表;另外单击“更改标题”按钮可以自己确定保存的Web页的标题。
单击“发布”按钮,可以选择发布工作表的一部分。
加载宏和报告管理器
Excel提供了很多现成的宏可以供我们调用,这里我们来看看比较常用的“报告管理器”:打开“工具”菜单,单击“加载宏”命令,打开“加载宏”对话框;选中“当前加载宏”列表框中“报告管理器”前面的复选框,单击“确定”按钮,我们就将“报告管理器”加载到了Excel中。
打开“视图”菜单,这里就多了一个“报告管理器”命令,单击它,打开“报告管理器”对话框,就可以使用“报告管理器”了。
电子邮件
选择“文件”菜单的“发送”命令,然后选择子菜单中的“邮件收件人(以附件形式)”命令,您就可以将活动的 Excel 工作簿用电子邮件发送给其他人。当您选择该命令时,Windows 会启动电子邮件程序并将当前编辑的工作簿作为附件添加到邮件中;然后像发送普通的邮件那样发送邮件就可以了。
15、如何避免错误信息
在Excel中输入公式后,有时不能正确地计算出结果,并在单元格内显示一个错误信息,这些错误的产生,有的是因公式本身产生的,有的不是。下面就介绍一下几种常见的错误信息,并提出避免出错的办法。
1)错误值:####
含义:输入到单元格中的数据太长或单元格公式所产生的结果太大,使结果在单元格中显示不下。或是日期和时间格式的单元格做减法,出现了负值。
解决办法:增加列的宽度,使结果能够完全显示。如果是由日期或时间相减产生了负值引起的,可以改变单元格的格式,比如改为文本格式,结果为负的时间量。 2)错误值:#DIV/0!
含义:试图除以0。这个错误的产生通常有下面几种情况:除数为0、在公式中除数使用了空单元格或是包含零值单元格的单元格引用。
解决办法:修改单元格引用,或者在用作除数的单元格中输入不为零的值。
3)错误值:#VALUE!
含义:输入引用文本项的数学公式。如果使用了不正确的参数或运算符,或者当执行自动更正公式功能时不能更正公式,都将产生错误信息#VALUE!。
解决办法:这时应确认公式或函数所需的运算符或参数正确,并且公式引用的单元格中包含有效的数值。例如,单元格C4中有一个数字或逻辑值,而单元格D4包含文本,则在计算公式=C4+D4时,系统不能将文本转换为正确的数据类型,因而返回错误值#VALUE!。
4)错误值:#REF!
含义:删除了被公式引用的单元格范围。
解决办法:恢复被引用的单元格范围,或是重新设定引用范围。
5)错误值:#N/A
含义:无信息可用于所要执行的计算。在建立模型时,用户可以在单元格中输入#N/A,以表明正在等待数据。任何引用含有#N/A值的单元格都将返回#N/A。
解决办法:在等待数据的单元格内填充上数据。
6)错误值:#NAME?
含义:在公式中使用了Excel所不能识别的文本,比如可能是输错了名称,或是输入了一个已删除的名称,如果没有将文字串括在双引号中,也会产生此错误值
解决办法:如果是使用了不存在的名称而产生这类错误,应确认使用的名称确实存在;如果是名称,函数名拼写错误应就改正过来;将文字串括在双引号中;确认公式中使用的所有区域引用都使用了冒号(:)。例如:SUM(C1:C10)。 注意将公式中的文本括在双引号中。
7)错误值:#NUM!
含义:提供了无效的参数给工作表函数,或是公式的结果太大或太小而无法在工作表中表示。
解决办法:确认函数中使用的参数类型正确。如果是公式结果太大或太小,就要修改公式,使其结果在-1×10307和1×10307之间。
8)错误值:#NULL!
含义:在公式中的两个范围之间插入一个空格以表示交叉点,但这两个范围没有公共单元格。比如输入:“=SUM(A1:A10 C1:C10)”,就会产生这种情况。
解决办法:取消两个范围之间的空格。上式可改为“=SUM(A1:A10 ,C1:C10)”--http://www.xici.net/u15568717/d83887823.htm
word排版技巧
排版是让许多人头疼的问题,尤其是论文需要多次修改时更加令人头疼。本文将给你提供一些用Microsoft Word 2003进行论文排版的技巧,使你的论文排版更加方便和轻松,以便把更多的精力放在论文的内容上而不是文字的编排上。这些技巧不只在论文写作中可以使用,在写其他文档时也可以使用。本文将分五个专题来讲解论文排版过程中共存问题的解决方法,第六部分是一些小技巧。
一.图表和公式的自动编号
二.制表位的使用
三.目录的制作4
四.参考文献的编号和引用5
五.页眉页脚的制作6
六.其他技巧 :分页符(Ctrl+ Enter)换行符(Shift+Enter) 双击图标 居中和右对齐
一、图表和公式的自动编号
在论文中,图表和公式要求按在章节中出现的顺序分章编号,例如图1-1,表2-1,公式3-4等。在插入或删除图、表、公式时编号的维护就成为一个大问题,比如若在第二章的第一张图(图2-1)前插入一张图,则原来的图2-1变为2-2,2-2变为2-3,…,更糟糕的是,文档中还有很多对这些编号的引用,比如“流程图见图2-1”。如果图很多,引用也很多,想象一下,手工修改这些编号是一件多么费劲的事情,而且还容易遗漏!表格和公式存在同样的问题。
能不能让Word对图表公式自动编号,在编号改变时自动更新文档中的相应引用?答案是肯定的!下面以图的编号为例说明具体的作法。
自动编号可以通过Word的“题注”功能来实现。按论文格式要求,第一章的图编号格式为“图1-×”。将图插入文档中后,选中新插入的图,在“插入”菜单选“题注”,新建一个标签“图1-”,编号格式为阿拉伯数字(如果不是点击“编号”修改),位置为所选项目下方,单击“确定”后Word就插入了一个文本框在图的下方,并插入标签文字和序号,此时可以在序号后键入说明,比如“形态学膨胀运算示例”,还可以移动文本框的位置,改动文字的对齐方式等。再次插入图时题注的添加方法相同,不同的是不用新建标签了,直接选择就可以了。Word会自动按图在文档中出现的顺序进行编号。
在文档中引用这些编号时,比如“如图1-1所示”,分两步做。插入题注之后,选中题注中的文字“图1-1”,在“插入”菜单选“书签”,键入书签名,点“添加”。这样就把题注文字“图1-1”做成了一个书签。在需要引用它的地方,将光标放在插入的地方(上例中是“如”字的后面),在“插入”菜单选“交叉引用”,弹出对话框中引用类型选“书签”,“引用内容”为“书签文字”,选择刚才键入的书签名后点“插入”,Word就将文字“图1-1”插入到光标所在的地方。在其他地方需要再次引用时直接插入相应书签的交叉引用就可以了,不用再做书签。
至此我们就实现了图的编号的自动维护,当在第一张图前再插入一张图后,Word会自动把第一张图的题注“图1-1”改为“图1-2”,文档中的“图1-1”也会自动变为“图1-2”。
表格编号的作法与图相同,唯一不同的是表格的题注在表格上方,且要求左对齐。公式的编号略有不同,插入公式后,将公式单独放在一个段落,版式为“嵌入式”(Word默认),光标放在公式之后,不要(注意是“不要”)选中公式,在“插入”菜单选“题注”,由于没有选中项目,所以“位置”一项为灰色,新建标签“公式1-”,点击“插入”,Word就将标签文字和自动产生的序号插入到光标所在位置。在文档中引用公式编号的方法与图相同,此处不在赘述。公式的编号要求在右边行末,具体的方法在“制表位的使用”一节详细说明。
这里顺便说一下,交叉引用、书签和题注都是Word的域。域是文档中可能发生变化的内容,Word使用域来进行文档自动化。多个域的联合使用可以实现更复杂的功能,各个域的具体使用方法请参考Word的帮助。
注:
题注中新建标签时,Word会自动在标签文字和序号之间加一个空格,看起来不那么舒服,可以在插入题注后将空格删除,然后再将文字做成书签。²
书签名最好用图(表、公式)的说明文字,尽量做到见名知“图”。²
图(表、公式)的编号改变时,文档中的引用有时不会自动更新,可以鼠标右击引用文字,在弹出的菜单中选“更新域”。关闭文档再打开Word会更新所有的域。²
二、制表位的使用
制表位是指水平标尺上的位置,它指定了文字缩进的距离或一栏文字开始的位置,使用户能够向左、向右或居中对齐文本行;或者将文本与小数字符或竖线字符对齐。用户可以在制表符前自动插入特定字符,如句号或划线等。默认情况下,按一次Tab键,Word将在文档中插入一个制表符,其间隔为0.74厘米。
制表位的类型包括:左对齐,居中对齐,右对齐,小数点对齐和竖线对齐等,这些制表位的使用方法大致相同,这里仅根据论文中公式排版的要求和目录的制作为例说明制表位的使用方法和效果,更详细的说明请参阅Word的帮助文档。
论文里的公式要求单独放在一个段落,公式居中;按章节进行编号,编号用小括号括起来放在右边行末。首先输入公式和编号,公式的版式选择“嵌入式”,编号用小括号括起来。然后把光标放在公式所在的段落里,点击页面左上角的制表位图标,切换到居中制表位,用鼠标在水平标尺上大约中间的位置点一下,这样就放置了一个居中制表位在点击的地方,如果位置不合适还可以用鼠标拖动进行调节。再把左上角的制表位图标切换到右对齐制表位,用放置居中制表位相同的方法放置一个右对齐制表位在行末。
设置好制表位后,把光标放在公式的前面,按一下Tab键,这样就在公式的前面插入了一个制表符,此时公式以居中制表位为中心居中对齐,再把光标移到公式和左括号之间,再按Tab键插入一个制表符,编号就跑到行末了。
用制表位的方法来处理公式的排版,很简单也很方便,不用去敲很多空格去把公式挪到中间,编号推到行末。还有一个好处,若公式或编号的长度发生变化时,Word会自动调节以使公式始终在页面的中间,编号始终在行末,不会因为公式或编号变长而换行。更简单的作法是把公式段落的设置保存为样式,所有的公式段落应用此样式,即简单又方便,而且可以保持所有的公式段落制表位的一致。手工设置制表位,你能保证每次居中制表位的位置都一样吗?!
涉及到制表位还有一个概念:前导符。前导符是填充制表符所产生的空位的符号,一般有实线、虚线、点划线等,在目录中经常见到(就是标题和页码之间的圆点)。制作目录时,敲入标题和页码后,在行末设置一个右对齐制表位。点击“格式|制表位”,制表位对话框显示了光标所在段落的制表位信息。选择右对齐制表位,前导符选择圆点(Word默认无前导符),确定后在标题和页码之间插入一个制表符,可以看到页码跑到行末了,而且页码和标题之间用圆点进行了填充。当页码或标题长度变化时,Word会自动增加或删除圆点。这里用目录做例子只是想说明前导符的使用方法,其实制作目录还有更好的方法,下文详述。
注:
1)按一次Tab键插入的是一个制表符,因此不要在文档中用制表符代替空格来产生空白间隔。不然若把这段文字粘贴到其他存在不同制表位的段落,或文档的制表符默认设置变化时,版面就会混乱。
2)有时候按Tab键后Word会产生一个灰色箭头,这实际上是Word的制表符格式标记,格式标记还有段落标记(拐弯的箭头)、空格(灰色圆点)等。这些格式标记在打印文档时是不会打印出来的,格式标记是否显示以及显示哪些可以在“工具|选项”的“视图”选项卡里进行设置。
三、目录的制作
目录是用来列出文档中的各级标题及标题在文档中相对应的页码。首先介绍Word的一个概念:大纲级别。Word使用层次结构来组织文档,大纲级别就是段落所处层次的级别编号,Word提供9级大纲级别,对一般的文档来说足够使用了。Word的目录提取是基于大纲级别和段落样式的,在Normal模板中已经提供了内置的标题样式,命名为“标题1”、“标题2”,…,“标题9”,分别对应大纲级别的1-9。我们也可以不使用内置的标题样式而采用自定义样式,但有点麻烦。下文中的目录制作方法直接使用Word的内置标题样式,关于自定义样式的方法请参阅Word的帮助文档。
目录的制作分三步进行。
1)修改标题样式的格式。通常Word内置的标题样式不符合论文格式要求,需要手动修改。在菜单栏上点“格式|样式”,列表下拉框中选“所有样式”,点击相应的标题样式,然后点“更改”。可修改的内容包括字体、段落、制表位和编号等,按论文格式的要求分别修改标题1-3的格式。
2)在各个章节的标题段落应用相应的格式。章的标题使用“标题1”样式,节标题使用“标题2”,第三层次标题使用“标题3”。使用样式来设置标题的格式还有一个优点,就是更改标题的格式非常方便。假如要把所有一级标题的字号改为小三,只需更改“标题1”样式的格式设置,然后自动更新,所有章的标题字号都变为小三号,不用手工去一一修改,即麻烦又容易出错。关于如何应用样式和自动更新样式,请参考Word帮助。
3)提取目录。按论文格式要求,目录放在正文的前面。在正文前插入一新页(在第一章的标题前插入一个分页符),光标移到新页的开始,添加“目录”二字,并设置好格式。新起一段落,菜单栏选“插入|索引和目录”,点“目录”选项卡,“显示级别”为3级,其他不用改,确定后Word就自动生成目录。若有章节标题不在目录中,肯定是没有使用标题样式或使用不当,不是Word的目录生成有问题,请去相应章节检查。此后若章节标题改变,或页码发生变化,只需更新目录即可。
注:
目录生成后有时目录文字会有灰色的底纹,这是Word的域底纹,打印时是不会打印出来的(如果你愿意浪费一张纸可以试着打印一下目录)。在“工具|选项”的“视图”选项卡可以设置域底纹的显示方式。²
四、参考文献的编号和引用
参考文献的标注本不是一件麻烦的事情,但是对参考文献编号后就成了一件麻烦的事情,产生的问题和图表公式编号的问题是一样的。手工维护这些编号是一件费力而且容易出错的事情,我们的目的是让Word自动维护这些编号。很幸运,它可以做到,方法跟图表公式的作法相似。光标放在引用参考文献的地方,在菜单栏上选“插入|脚注和尾注”,弹出的对话框中选择“尾注”,点击“选项”按钮修改编号格式为阿拉伯数字,位置为“文档结尾”,确定后Word就在光标的地方插入了参考文献的编号,并自动跳到文档尾部相应编号处请你键入参考文献的说明,在这里按参考文献著录表的格式添加相应文献。参考文献标注要求用中括号把编号括起来,至今我也没找到让Word自动加中括号的方法,需要手动添加中括号。
在文档中需要多次引用同一文献时,在第一次引用此文献时需要制作尾注,再次引用此文献时点“插入|交叉引用”,“引用类型”选“尾注”,引用内容为“尾注编号(带格式)”,然后选择相应的文献,插入即可。不要以为已经搞定了,我们离成功还差一步。论文格式要求参考文献在正文之后,参考文献后还有发表论文情况说明、附录和致谢,而Word的尾注要么在文档的结尾,要么在“节”的结尾,这两种都不符合我们的要求。
解决的方法似乎有点笨拙。首先删除尾注文本中所有的编号(我们不需要它,因为它的格式不对),然后选中所有尾注文本(参考文献说明文本),点“插入|书签”,命名为“参考文献文本”,添加到书签中。这样就把所有的参考文献文本做成了书签。在正文后新建一页,标题为“参考文献”,并设置好格式。光标移到标题下,选“插入|交叉引用”,“引用类型”为“书签”,点“参考文献文本”后插入,这样就把参考文献文本复制了一份。选中刚刚插入的文本,按格式要求修改字体字号等,并用项目编号进行自动编号。
到这里,我们离完美还差一点点。打印文档时,尾注页同样会打印出来,而这几页是我们不需要的。当然,可以通过设置打印页码范围的方法不打印最后几页。这里有另外一种方法,如果你想多学一点东西,请接着往下看。
选中所有的尾注文本,点“格式|字体”,改为“隐藏文字”,切换到普通视图,选择“视图|脚注”,此时所有的尾注出现在窗口的下端,在“尾注”下拉列表框中选择“尾注分割符”,将默认的横线删除。同样的方法删除“尾注延续分割符”和“尾注延续标记”。删除页眉和页脚(包括分隔线),选择“视图|页眉和页脚”,首先删除文字,然后点击页眉页脚工具栏的“页面设置”按钮,在弹出的对话框上点“边框”,在“页面边框”选项卡,边框设置为“无”,应用范围为“本节”;“边框”选项卡的边框设置为“无”,应用范围为“段落”。切换到“页脚”,删除页码。选择“工具|选项”,在“打印”选项卡里确认不打印隐藏文字(Word默认)。
好了,试着打印一下尾注所在的页,是不是白纸?!
五、页眉页脚的制作
首先介绍一个概念:节。这里的“节”不同于论文里的章节,但概念上是相似的。节是一段连续的文档块,同节的页面拥有同样的边距、纸型或方向、打印机纸张来源、页面边框、垂直对齐方式、页眉和页脚、分栏、页码编排、行号及脚注和尾注。如果没有插入分节符,Word默认一个文档只有一个节,所有页面都属于这个节。若想对页面设置不同的页眉页脚,必须将文档分为多个节。
论文里同一章的页面采用章标题作为页眉,不同章的页面页眉不同,这可以通过每一章作为一个节,每节独立设置页眉页脚的方法来实现。首先介绍页眉的制作方法。
在各个章节的文字都排好后,设置第一章的页眉(若连页眉都不知怎么加,请参考Word帮助)。然后跳到第一章的末尾,菜单栏上选“插入|分隔符”,分节符类型选“下一页”,不要选“连续”(除非你想第二章的标题放在第一章的文字后面而不是另起一页),若是奇偶页排版根据情况选“奇数页”或“偶数页”。这样就在光标所在的地方插入了一个分节符,分节符下面的文字属于另外一节了。光标移到第二章,这时可以看到第二章的页眉和第一章是相同的,鼠标双击页眉Word会弹出页眉页脚工具栏,工具栏上有一个“同前”按钮(图像按钮,不是文字),这个按钮按下表示本节的页眉与前一节相同,我们需要的是各章的页眉互相独立,因此把这个按钮调整为“弹起”状态,然后修改页眉为第二章的标题,完成后关闭工具栏。如法炮制制作其余各章的页眉。
页脚的制作方法相对比较简单。论文页面的页脚只有页码,要求从正文开始进行编号,但是,在正文前还有扉页、授权声明、中英文摘要和目录,这些页面是不需要编页码的,页码从正文第一章开始编号。首先,确认正文的第一章和目录不属于同一节。然后,光标移到第一章,点击“视图|页眉和页脚”弹出页眉页脚工具栏,切换到页脚,确保“同前”按钮处于弹起状态,插入页码,这样正文前的页面都没有页码,页码从第一章开始编号。
注:
页眉段落默认使用内置样式“页眉”,页脚使用“页脚”样式,页码使用内置字符样式“页码”。如页眉页脚的字体字号不符合要求,修改这些样式并自动更新即可,不用手动修改各章的页眉页脚。²论文里页眉使用章标题,可以采用章标题做成书签,然后在页眉交叉引用的方法来维护两者的一致。²
六、其他技巧
分页符(Ctrl+Enter)
顾名思义,分页符是用来分页的,分页符后的文字将另起一页。论文中各章的标题要求新起一页,放在新页的第一行,这时就可以使用分页符。在前一章的最后放置一个分页符,这样不管前一章的版面有什么变化,后一章的标题总是出现在新的一页上。
肯定还有人用敲多个回车的方法来把章标题推到新页!这样做的缺点是显而易见的。若前一章的版面发生了变化,比如删掉了一行,这时后一章的标题就跑到前一章的最后一页的末尾;若增加一行,则后一章标题前又多了一个空行。快抛弃这种费力不讨好的作法吧!
换行符(Shift+Enter)u
这里又涉及Word的一个概念:段落。段落是独立的信息单位,具有自身的格式特征,如对齐方式、间距和样式。每个段落的结尾处都有段落标记(一个灰色的拐弯箭头)。敲Enter键有两个作用,一是在光标位置插入一个段落标记,表示一个段落的结束;二是另起一行。换行符和敲Enter键不同,它只有第二个作用,没有第一个,即换行符的前一行和后一行仍然属于同一个段落,共享相同的段落格式。
双击图标
以一个例子作为说明。你可能需要在论文里画一个简单的流程图,你先插入了需要的文本框并加入了相应的文字,排好位置,这时你需要用箭头把这些文本框连起来,你用鼠标在绘图工具栏上点了一下箭头图标,然后画了一个箭头,再点一下图标,又画一个箭头,第三次点图标,画了第三个箭头,…有点麻烦是不是?要是可以连续画该多好!事实上可以做到!用鼠标在箭头图标上双击,然后在需要的地方画箭头,看到了吗?当画完一个箭头时,图标依然保持为嵌入状态,表示可以连续作图。当所有箭头都画完后,再在嵌入的图标上点一下,嵌入的图标弹起,Word又回到了文字输入状态。
不只箭头图标具有这样的功能,其他许多图标都可以如此。格式刷就是一个。当需要把一段特殊的文字格式多次应用时,双击格式刷,连续刷需要的文字,很方便。
居中和右对齐
你还在用插入空格的方法来把章节标题推到页面中间吗?太土了吧!用格式工具栏上的居中按钮吧。右对齐按钮会从行末开始排列文字。--http://blog.renren.com/blog/239219075/390196190
一.图表和公式的自动编号
二.制表位的使用
三.目录的制作4
四.参考文献的编号和引用5
五.页眉页脚的制作6
六.其他技巧 :分页符(Ctrl+ Enter)换行符(Shift+Enter) 双击图标 居中和右对齐
一、图表和公式的自动编号
在论文中,图表和公式要求按在章节中出现的顺序分章编号,例如图1-1,表2-1,公式3-4等。在插入或删除图、表、公式时编号的维护就成为一个大问题,比如若在第二章的第一张图(图2-1)前插入一张图,则原来的图2-1变为2-2,2-2变为2-3,…,更糟糕的是,文档中还有很多对这些编号的引用,比如“流程图见图2-1”。如果图很多,引用也很多,想象一下,手工修改这些编号是一件多么费劲的事情,而且还容易遗漏!表格和公式存在同样的问题。
能不能让Word对图表公式自动编号,在编号改变时自动更新文档中的相应引用?答案是肯定的!下面以图的编号为例说明具体的作法。
自动编号可以通过Word的“题注”功能来实现。按论文格式要求,第一章的图编号格式为“图1-×”。将图插入文档中后,选中新插入的图,在“插入”菜单选“题注”,新建一个标签“图1-”,编号格式为阿拉伯数字(如果不是点击“编号”修改),位置为所选项目下方,单击“确定”后Word就插入了一个文本框在图的下方,并插入标签文字和序号,此时可以在序号后键入说明,比如“形态学膨胀运算示例”,还可以移动文本框的位置,改动文字的对齐方式等。再次插入图时题注的添加方法相同,不同的是不用新建标签了,直接选择就可以了。Word会自动按图在文档中出现的顺序进行编号。
在文档中引用这些编号时,比如“如图1-1所示”,分两步做。插入题注之后,选中题注中的文字“图1-1”,在“插入”菜单选“书签”,键入书签名,点“添加”。这样就把题注文字“图1-1”做成了一个书签。在需要引用它的地方,将光标放在插入的地方(上例中是“如”字的后面),在“插入”菜单选“交叉引用”,弹出对话框中引用类型选“书签”,“引用内容”为“书签文字”,选择刚才键入的书签名后点“插入”,Word就将文字“图1-1”插入到光标所在的地方。在其他地方需要再次引用时直接插入相应书签的交叉引用就可以了,不用再做书签。
至此我们就实现了图的编号的自动维护,当在第一张图前再插入一张图后,Word会自动把第一张图的题注“图1-1”改为“图1-2”,文档中的“图1-1”也会自动变为“图1-2”。
表格编号的作法与图相同,唯一不同的是表格的题注在表格上方,且要求左对齐。公式的编号略有不同,插入公式后,将公式单独放在一个段落,版式为“嵌入式”(Word默认),光标放在公式之后,不要(注意是“不要”)选中公式,在“插入”菜单选“题注”,由于没有选中项目,所以“位置”一项为灰色,新建标签“公式1-”,点击“插入”,Word就将标签文字和自动产生的序号插入到光标所在位置。在文档中引用公式编号的方法与图相同,此处不在赘述。公式的编号要求在右边行末,具体的方法在“制表位的使用”一节详细说明。
这里顺便说一下,交叉引用、书签和题注都是Word的域。域是文档中可能发生变化的内容,Word使用域来进行文档自动化。多个域的联合使用可以实现更复杂的功能,各个域的具体使用方法请参考Word的帮助。
注:
题注中新建标签时,Word会自动在标签文字和序号之间加一个空格,看起来不那么舒服,可以在插入题注后将空格删除,然后再将文字做成书签。²
书签名最好用图(表、公式)的说明文字,尽量做到见名知“图”。²
图(表、公式)的编号改变时,文档中的引用有时不会自动更新,可以鼠标右击引用文字,在弹出的菜单中选“更新域”。关闭文档再打开Word会更新所有的域。²
二、制表位的使用
制表位是指水平标尺上的位置,它指定了文字缩进的距离或一栏文字开始的位置,使用户能够向左、向右或居中对齐文本行;或者将文本与小数字符或竖线字符对齐。用户可以在制表符前自动插入特定字符,如句号或划线等。默认情况下,按一次Tab键,Word将在文档中插入一个制表符,其间隔为0.74厘米。
制表位的类型包括:左对齐,居中对齐,右对齐,小数点对齐和竖线对齐等,这些制表位的使用方法大致相同,这里仅根据论文中公式排版的要求和目录的制作为例说明制表位的使用方法和效果,更详细的说明请参阅Word的帮助文档。
论文里的公式要求单独放在一个段落,公式居中;按章节进行编号,编号用小括号括起来放在右边行末。首先输入公式和编号,公式的版式选择“嵌入式”,编号用小括号括起来。然后把光标放在公式所在的段落里,点击页面左上角的制表位图标,切换到居中制表位,用鼠标在水平标尺上大约中间的位置点一下,这样就放置了一个居中制表位在点击的地方,如果位置不合适还可以用鼠标拖动进行调节。再把左上角的制表位图标切换到右对齐制表位,用放置居中制表位相同的方法放置一个右对齐制表位在行末。
设置好制表位后,把光标放在公式的前面,按一下Tab键,这样就在公式的前面插入了一个制表符,此时公式以居中制表位为中心居中对齐,再把光标移到公式和左括号之间,再按Tab键插入一个制表符,编号就跑到行末了。
用制表位的方法来处理公式的排版,很简单也很方便,不用去敲很多空格去把公式挪到中间,编号推到行末。还有一个好处,若公式或编号的长度发生变化时,Word会自动调节以使公式始终在页面的中间,编号始终在行末,不会因为公式或编号变长而换行。更简单的作法是把公式段落的设置保存为样式,所有的公式段落应用此样式,即简单又方便,而且可以保持所有的公式段落制表位的一致。手工设置制表位,你能保证每次居中制表位的位置都一样吗?!
涉及到制表位还有一个概念:前导符。前导符是填充制表符所产生的空位的符号,一般有实线、虚线、点划线等,在目录中经常见到(就是标题和页码之间的圆点)。制作目录时,敲入标题和页码后,在行末设置一个右对齐制表位。点击“格式|制表位”,制表位对话框显示了光标所在段落的制表位信息。选择右对齐制表位,前导符选择圆点(Word默认无前导符),确定后在标题和页码之间插入一个制表符,可以看到页码跑到行末了,而且页码和标题之间用圆点进行了填充。当页码或标题长度变化时,Word会自动增加或删除圆点。这里用目录做例子只是想说明前导符的使用方法,其实制作目录还有更好的方法,下文详述。
注:
1)按一次Tab键插入的是一个制表符,因此不要在文档中用制表符代替空格来产生空白间隔。不然若把这段文字粘贴到其他存在不同制表位的段落,或文档的制表符默认设置变化时,版面就会混乱。
2)有时候按Tab键后Word会产生一个灰色箭头,这实际上是Word的制表符格式标记,格式标记还有段落标记(拐弯的箭头)、空格(灰色圆点)等。这些格式标记在打印文档时是不会打印出来的,格式标记是否显示以及显示哪些可以在“工具|选项”的“视图”选项卡里进行设置。
三、目录的制作
目录是用来列出文档中的各级标题及标题在文档中相对应的页码。首先介绍Word的一个概念:大纲级别。Word使用层次结构来组织文档,大纲级别就是段落所处层次的级别编号,Word提供9级大纲级别,对一般的文档来说足够使用了。Word的目录提取是基于大纲级别和段落样式的,在Normal模板中已经提供了内置的标题样式,命名为“标题1”、“标题2”,…,“标题9”,分别对应大纲级别的1-9。我们也可以不使用内置的标题样式而采用自定义样式,但有点麻烦。下文中的目录制作方法直接使用Word的内置标题样式,关于自定义样式的方法请参阅Word的帮助文档。
目录的制作分三步进行。
1)修改标题样式的格式。通常Word内置的标题样式不符合论文格式要求,需要手动修改。在菜单栏上点“格式|样式”,列表下拉框中选“所有样式”,点击相应的标题样式,然后点“更改”。可修改的内容包括字体、段落、制表位和编号等,按论文格式的要求分别修改标题1-3的格式。
2)在各个章节的标题段落应用相应的格式。章的标题使用“标题1”样式,节标题使用“标题2”,第三层次标题使用“标题3”。使用样式来设置标题的格式还有一个优点,就是更改标题的格式非常方便。假如要把所有一级标题的字号改为小三,只需更改“标题1”样式的格式设置,然后自动更新,所有章的标题字号都变为小三号,不用手工去一一修改,即麻烦又容易出错。关于如何应用样式和自动更新样式,请参考Word帮助。
3)提取目录。按论文格式要求,目录放在正文的前面。在正文前插入一新页(在第一章的标题前插入一个分页符),光标移到新页的开始,添加“目录”二字,并设置好格式。新起一段落,菜单栏选“插入|索引和目录”,点“目录”选项卡,“显示级别”为3级,其他不用改,确定后Word就自动生成目录。若有章节标题不在目录中,肯定是没有使用标题样式或使用不当,不是Word的目录生成有问题,请去相应章节检查。此后若章节标题改变,或页码发生变化,只需更新目录即可。
注:
目录生成后有时目录文字会有灰色的底纹,这是Word的域底纹,打印时是不会打印出来的(如果你愿意浪费一张纸可以试着打印一下目录)。在“工具|选项”的“视图”选项卡可以设置域底纹的显示方式。²
四、参考文献的编号和引用
参考文献的标注本不是一件麻烦的事情,但是对参考文献编号后就成了一件麻烦的事情,产生的问题和图表公式编号的问题是一样的。手工维护这些编号是一件费力而且容易出错的事情,我们的目的是让Word自动维护这些编号。很幸运,它可以做到,方法跟图表公式的作法相似。光标放在引用参考文献的地方,在菜单栏上选“插入|脚注和尾注”,弹出的对话框中选择“尾注”,点击“选项”按钮修改编号格式为阿拉伯数字,位置为“文档结尾”,确定后Word就在光标的地方插入了参考文献的编号,并自动跳到文档尾部相应编号处请你键入参考文献的说明,在这里按参考文献著录表的格式添加相应文献。参考文献标注要求用中括号把编号括起来,至今我也没找到让Word自动加中括号的方法,需要手动添加中括号。
在文档中需要多次引用同一文献时,在第一次引用此文献时需要制作尾注,再次引用此文献时点“插入|交叉引用”,“引用类型”选“尾注”,引用内容为“尾注编号(带格式)”,然后选择相应的文献,插入即可。不要以为已经搞定了,我们离成功还差一步。论文格式要求参考文献在正文之后,参考文献后还有发表论文情况说明、附录和致谢,而Word的尾注要么在文档的结尾,要么在“节”的结尾,这两种都不符合我们的要求。
解决的方法似乎有点笨拙。首先删除尾注文本中所有的编号(我们不需要它,因为它的格式不对),然后选中所有尾注文本(参考文献说明文本),点“插入|书签”,命名为“参考文献文本”,添加到书签中。这样就把所有的参考文献文本做成了书签。在正文后新建一页,标题为“参考文献”,并设置好格式。光标移到标题下,选“插入|交叉引用”,“引用类型”为“书签”,点“参考文献文本”后插入,这样就把参考文献文本复制了一份。选中刚刚插入的文本,按格式要求修改字体字号等,并用项目编号进行自动编号。
到这里,我们离完美还差一点点。打印文档时,尾注页同样会打印出来,而这几页是我们不需要的。当然,可以通过设置打印页码范围的方法不打印最后几页。这里有另外一种方法,如果你想多学一点东西,请接着往下看。
选中所有的尾注文本,点“格式|字体”,改为“隐藏文字”,切换到普通视图,选择“视图|脚注”,此时所有的尾注出现在窗口的下端,在“尾注”下拉列表框中选择“尾注分割符”,将默认的横线删除。同样的方法删除“尾注延续分割符”和“尾注延续标记”。删除页眉和页脚(包括分隔线),选择“视图|页眉和页脚”,首先删除文字,然后点击页眉页脚工具栏的“页面设置”按钮,在弹出的对话框上点“边框”,在“页面边框”选项卡,边框设置为“无”,应用范围为“本节”;“边框”选项卡的边框设置为“无”,应用范围为“段落”。切换到“页脚”,删除页码。选择“工具|选项”,在“打印”选项卡里确认不打印隐藏文字(Word默认)。
好了,试着打印一下尾注所在的页,是不是白纸?!
五、页眉页脚的制作
首先介绍一个概念:节。这里的“节”不同于论文里的章节,但概念上是相似的。节是一段连续的文档块,同节的页面拥有同样的边距、纸型或方向、打印机纸张来源、页面边框、垂直对齐方式、页眉和页脚、分栏、页码编排、行号及脚注和尾注。如果没有插入分节符,Word默认一个文档只有一个节,所有页面都属于这个节。若想对页面设置不同的页眉页脚,必须将文档分为多个节。
论文里同一章的页面采用章标题作为页眉,不同章的页面页眉不同,这可以通过每一章作为一个节,每节独立设置页眉页脚的方法来实现。首先介绍页眉的制作方法。
在各个章节的文字都排好后,设置第一章的页眉(若连页眉都不知怎么加,请参考Word帮助)。然后跳到第一章的末尾,菜单栏上选“插入|分隔符”,分节符类型选“下一页”,不要选“连续”(除非你想第二章的标题放在第一章的文字后面而不是另起一页),若是奇偶页排版根据情况选“奇数页”或“偶数页”。这样就在光标所在的地方插入了一个分节符,分节符下面的文字属于另外一节了。光标移到第二章,这时可以看到第二章的页眉和第一章是相同的,鼠标双击页眉Word会弹出页眉页脚工具栏,工具栏上有一个“同前”按钮(图像按钮,不是文字),这个按钮按下表示本节的页眉与前一节相同,我们需要的是各章的页眉互相独立,因此把这个按钮调整为“弹起”状态,然后修改页眉为第二章的标题,完成后关闭工具栏。如法炮制制作其余各章的页眉。
页脚的制作方法相对比较简单。论文页面的页脚只有页码,要求从正文开始进行编号,但是,在正文前还有扉页、授权声明、中英文摘要和目录,这些页面是不需要编页码的,页码从正文第一章开始编号。首先,确认正文的第一章和目录不属于同一节。然后,光标移到第一章,点击“视图|页眉和页脚”弹出页眉页脚工具栏,切换到页脚,确保“同前”按钮处于弹起状态,插入页码,这样正文前的页面都没有页码,页码从第一章开始编号。
注:
页眉段落默认使用内置样式“页眉”,页脚使用“页脚”样式,页码使用内置字符样式“页码”。如页眉页脚的字体字号不符合要求,修改这些样式并自动更新即可,不用手动修改各章的页眉页脚。²论文里页眉使用章标题,可以采用章标题做成书签,然后在页眉交叉引用的方法来维护两者的一致。²
六、其他技巧
分页符(Ctrl+Enter)
顾名思义,分页符是用来分页的,分页符后的文字将另起一页。论文中各章的标题要求新起一页,放在新页的第一行,这时就可以使用分页符。在前一章的最后放置一个分页符,这样不管前一章的版面有什么变化,后一章的标题总是出现在新的一页上。
肯定还有人用敲多个回车的方法来把章标题推到新页!这样做的缺点是显而易见的。若前一章的版面发生了变化,比如删掉了一行,这时后一章的标题就跑到前一章的最后一页的末尾;若增加一行,则后一章标题前又多了一个空行。快抛弃这种费力不讨好的作法吧!
换行符(Shift+Enter)u
这里又涉及Word的一个概念:段落。段落是独立的信息单位,具有自身的格式特征,如对齐方式、间距和样式。每个段落的结尾处都有段落标记(一个灰色的拐弯箭头)。敲Enter键有两个作用,一是在光标位置插入一个段落标记,表示一个段落的结束;二是另起一行。换行符和敲Enter键不同,它只有第二个作用,没有第一个,即换行符的前一行和后一行仍然属于同一个段落,共享相同的段落格式。
双击图标
以一个例子作为说明。你可能需要在论文里画一个简单的流程图,你先插入了需要的文本框并加入了相应的文字,排好位置,这时你需要用箭头把这些文本框连起来,你用鼠标在绘图工具栏上点了一下箭头图标,然后画了一个箭头,再点一下图标,又画一个箭头,第三次点图标,画了第三个箭头,…有点麻烦是不是?要是可以连续画该多好!事实上可以做到!用鼠标在箭头图标上双击,然后在需要的地方画箭头,看到了吗?当画完一个箭头时,图标依然保持为嵌入状态,表示可以连续作图。当所有箭头都画完后,再在嵌入的图标上点一下,嵌入的图标弹起,Word又回到了文字输入状态。
不只箭头图标具有这样的功能,其他许多图标都可以如此。格式刷就是一个。当需要把一段特殊的文字格式多次应用时,双击格式刷,连续刷需要的文字,很方便。
居中和右对齐
你还在用插入空格的方法来把章节标题推到页面中间吗?太土了吧!用格式工具栏上的居中按钮吧。右对齐按钮会从行末开始排列文字。--http://blog.renren.com/blog/239219075/390196190
Wednesday, April 21, 2010
快速掌握一个语言最常用的50%
http://blog.csdn.net/myan/archive/2008/10/25/3144661.aspx
现在的开发工作要求我们能够快速掌握一门语言。一般来说应对这种挑战有两种态度:其一,粗粗看看语法,就撸起袖子开干,边查Google边学习;其二是花很多时间完整地把整个语言学习一遍,做到胸有成竹,然后再开始做实际工作。然而这两种方法都有弊病。第二种方法的问题当然很明显,不仅浪费了时间,偏离了目标,而且学习效率不高。因为没有实际问题驱动的语言学习通常是不牢固不深入的。有的人学着学着成了语言专家,反而忘了自己原本是要解决问题来的。第一种路子也有问题,在对于这种语言的脾气秉性还没有了解的情况下大刀阔斧地拼凑代码,写出来的东西肯定不入流。说穿新鞋走老路,新瓶装旧酒,那都是小问题,真正严重的是这样的程序员可以在短时间内堆积大量充满缺陷的垃圾代码。由于通常开发阶段的测试完备程度有限,这些垃圾代码往往能通过这个阶段,从而潜伏下来,在后期成为整个项目的毒瘤,反反复复让后来的维护者陷入西西弗斯困境。
实际上语言学习有一定规律可循,对于已经掌握一门语言的开发者来说,对于一般的语言,完全可以以最快的速度,在几天至一周之内掌握其最常用的50%,而且保证路子基本正宗,没有出偏的弊病。其实真正写程序不怕完全不会,最怕一知半解的去攒解决方案。因为你完全不会,就自然会去认真查书学习,如果学习能力好的话,写出来的代码质量不会差。而一知半解,自己动手土法炼钢,那搞出来的基本上都是废铜烂铁。比如错误处理和序列化,很多人不去了解“正路子”,而是凭借自己的一知半解去攒野路子,这是最危险的。因此,即使时间再紧张,这些内容也是必须首先完整了解一遍的。掌握这些内容之后进入实际开发,即使有问题,也基本不会伤及项目大体。而开发者本人则可以安步当车,慢慢在实践中提高自己。
以下列出一个学习提纲,主要针对的是有经验的人,初学者不合适。这个提纲只能用于一般的庸俗编程语言学习,目前在流行编程语言排行榜上排前20的基本上都是庸俗语言。如果你要学的是LISP之类非庸俗语言,或是某个软件中的二次开发语言,这里的建议未必合适。还是那句话,仅供参考。
1. 首先了解该语言的基本数据类型,基本语法和主要语言构造,主要数学运算符和print函数的使用,达到能够写谭浩强程序设计书课后数学习题的程度;
2. 其次掌握数组和其他集合类的使用,有基础的话可以理解一下泛型,如果理解不了也问题不大,后面可以补;
3. 简单字符串处理。所谓简单,就是Regex和Parser以下的内容,什么查找替换,截断去字串之类的。不过这个阶段有一个难点,就是字符编码问题。如果理解不了,可以先跳过,否则的话最好在这时候把这个问题搞定,免留后患;
4. 基本面向对象或者函数式编程的特征,无非是什么继承、多态、Lambda函数之类的,如果有经验的话很快就明白了;
5. 异常、错误处理、断言、日志和调试支持,对单元测试的支持。你不一定要用TDD,但是在这个时候应该掌握在这个语言里做TDD的基本技能;
6. 程序代码和可执行代码的组织机制,运行时模块加载、符号查找机制,这是初学时的一个难点,因为大部分书都不太注意介绍这个极为重要的内容;
7. 基本输入输出和文件处理,输入输出流类的组织,这通常是比较繁琐的一部分,可以提纲挈领学一下,搞清楚概念,用到的时候查就是了。到这个阶段可以写大部分控制台应用了;
8. 该语言如何进行callback方法调用,如何支持事件驱动编程模型。在现代编程环境下,这个问题是涉及开发思想的一个核心问题,几乎每种语言在这里都会用足功夫,.NET的delegate,Java的anonymous inner class,Java 7的closure,C++OX的 tr1::function/bind,五花八门。如果能彻底理解这个问题,不但程序就不至于写得太走样,而且对该语言的设计思路也能有比较好的认识;
9. 如果有必要,可在这时研究regex和XML处理问题,如无必要可跳过;
10. 序列化和反序列化,掌握一下缺省的机制就可以了;
11. 如果必要,可了解一下线程、并发和异步调用机制,主要是为了读懂别人的代码,如果自己要写这类代码,必须专门花时间严肃认真系统地学习,严禁半桶水上阵;
12. 动态编程,反射和元数据编程,数据和程序之间的相互转化机制,运行时编译和执行的机制,有抱负的开发者在这块可以多下些功夫,能够使你对语言的认识高出一个层面;
13. 如果有必要,可研究一下该语言对于泛型的支持,不必花太多时间,只要能使用现成的泛型集合和泛型函数就可以了,可在以后闲暇时抽时间系统学习。需要注意的是,泛型技术跟多线程技术一样,用不好就成为万恶之源,必须系统学习,谨慎使用,否则不如不学不用;
14. 如果还有时间,最好咨询一下有经验的人,看看这个语言较常用的特色features是什么,如果之前没学过,应当补一下。比如Ruby的block interator, Java的dynamic proxy,C# 3的LINQ和extension method。没时间的话,我认为也可以边做边学,没有大问题。
15. 有必要的话,在工作的闲暇时间,可以着重考察两个问题,第一,这个语言有哪些惯用法和模式,第二,这个语言的编译/解释执行机制。
至此语言的基本部分就可以说掌握了,之后是做数据库、网络还是做图形,可以根据具体需求去搞,找相应的成熟框架或库,边做边学,加深理解。对于一个庸俗语言,我自己把上面的内容走一遍大概要花2-3周时间,不能算很快,但也耽误不了太多事情,毕竟不是每个月都学新语言。掌握了以上的内容,就给练武术打好了基本功,虽然不见得有多优秀,但是肯定是根正苗红,将来不必绕大弯子。就算是临时使用的语言,把上面这个提纲精简一下,只看蓝色重体字的部分,大致能在几天到一周内搞定,不算是太耗时,而且写出来的代码不会太不靠谱。
以上提纲未设及内存模型。对于C/C++,这个问题很重要,要放在显著位置来考虑,但对于其他语言,这个问题被透明化了,除非你要做hardcore项目,否则不必太关注。
现在的开发工作要求我们能够快速掌握一门语言。一般来说应对这种挑战有两种态度:其一,粗粗看看语法,就撸起袖子开干,边查Google边学习;其二是花很多时间完整地把整个语言学习一遍,做到胸有成竹,然后再开始做实际工作。然而这两种方法都有弊病。第二种方法的问题当然很明显,不仅浪费了时间,偏离了目标,而且学习效率不高。因为没有实际问题驱动的语言学习通常是不牢固不深入的。有的人学着学着成了语言专家,反而忘了自己原本是要解决问题来的。第一种路子也有问题,在对于这种语言的脾气秉性还没有了解的情况下大刀阔斧地拼凑代码,写出来的东西肯定不入流。说穿新鞋走老路,新瓶装旧酒,那都是小问题,真正严重的是这样的程序员可以在短时间内堆积大量充满缺陷的垃圾代码。由于通常开发阶段的测试完备程度有限,这些垃圾代码往往能通过这个阶段,从而潜伏下来,在后期成为整个项目的毒瘤,反反复复让后来的维护者陷入西西弗斯困境。
实际上语言学习有一定规律可循,对于已经掌握一门语言的开发者来说,对于一般的语言,完全可以以最快的速度,在几天至一周之内掌握其最常用的50%,而且保证路子基本正宗,没有出偏的弊病。其实真正写程序不怕完全不会,最怕一知半解的去攒解决方案。因为你完全不会,就自然会去认真查书学习,如果学习能力好的话,写出来的代码质量不会差。而一知半解,自己动手土法炼钢,那搞出来的基本上都是废铜烂铁。比如错误处理和序列化,很多人不去了解“正路子”,而是凭借自己的一知半解去攒野路子,这是最危险的。因此,即使时间再紧张,这些内容也是必须首先完整了解一遍的。掌握这些内容之后进入实际开发,即使有问题,也基本不会伤及项目大体。而开发者本人则可以安步当车,慢慢在实践中提高自己。
以下列出一个学习提纲,主要针对的是有经验的人,初学者不合适。这个提纲只能用于一般的庸俗编程语言学习,目前在流行编程语言排行榜上排前20的基本上都是庸俗语言。如果你要学的是LISP之类非庸俗语言,或是某个软件中的二次开发语言,这里的建议未必合适。还是那句话,仅供参考。
1. 首先了解该语言的基本数据类型,基本语法和主要语言构造,主要数学运算符和print函数的使用,达到能够写谭浩强程序设计书课后数学习题的程度;
2. 其次掌握数组和其他集合类的使用,有基础的话可以理解一下泛型,如果理解不了也问题不大,后面可以补;
3. 简单字符串处理。所谓简单,就是Regex和Parser以下的内容,什么查找替换,截断去字串之类的。不过这个阶段有一个难点,就是字符编码问题。如果理解不了,可以先跳过,否则的话最好在这时候把这个问题搞定,免留后患;
4. 基本面向对象或者函数式编程的特征,无非是什么继承、多态、Lambda函数之类的,如果有经验的话很快就明白了;
5. 异常、错误处理、断言、日志和调试支持,对单元测试的支持。你不一定要用TDD,但是在这个时候应该掌握在这个语言里做TDD的基本技能;
6. 程序代码和可执行代码的组织机制,运行时模块加载、符号查找机制,这是初学时的一个难点,因为大部分书都不太注意介绍这个极为重要的内容;
7. 基本输入输出和文件处理,输入输出流类的组织,这通常是比较繁琐的一部分,可以提纲挈领学一下,搞清楚概念,用到的时候查就是了。到这个阶段可以写大部分控制台应用了;
8. 该语言如何进行callback方法调用,如何支持事件驱动编程模型。在现代编程环境下,这个问题是涉及开发思想的一个核心问题,几乎每种语言在这里都会用足功夫,.NET的delegate,Java的anonymous inner class,Java 7的closure,C++OX的 tr1::function/bind,五花八门。如果能彻底理解这个问题,不但程序就不至于写得太走样,而且对该语言的设计思路也能有比较好的认识;
9. 如果有必要,可在这时研究regex和XML处理问题,如无必要可跳过;
10. 序列化和反序列化,掌握一下缺省的机制就可以了;
11. 如果必要,可了解一下线程、并发和异步调用机制,主要是为了读懂别人的代码,如果自己要写这类代码,必须专门花时间严肃认真系统地学习,严禁半桶水上阵;
12. 动态编程,反射和元数据编程,数据和程序之间的相互转化机制,运行时编译和执行的机制,有抱负的开发者在这块可以多下些功夫,能够使你对语言的认识高出一个层面;
13. 如果有必要,可研究一下该语言对于泛型的支持,不必花太多时间,只要能使用现成的泛型集合和泛型函数就可以了,可在以后闲暇时抽时间系统学习。需要注意的是,泛型技术跟多线程技术一样,用不好就成为万恶之源,必须系统学习,谨慎使用,否则不如不学不用;
14. 如果还有时间,最好咨询一下有经验的人,看看这个语言较常用的特色features是什么,如果之前没学过,应当补一下。比如Ruby的block interator, Java的dynamic proxy,C# 3的LINQ和extension method。没时间的话,我认为也可以边做边学,没有大问题。
15. 有必要的话,在工作的闲暇时间,可以着重考察两个问题,第一,这个语言有哪些惯用法和模式,第二,这个语言的编译/解释执行机制。
至此语言的基本部分就可以说掌握了,之后是做数据库、网络还是做图形,可以根据具体需求去搞,找相应的成熟框架或库,边做边学,加深理解。对于一个庸俗语言,我自己把上面的内容走一遍大概要花2-3周时间,不能算很快,但也耽误不了太多事情,毕竟不是每个月都学新语言。掌握了以上的内容,就给练武术打好了基本功,虽然不见得有多优秀,但是肯定是根正苗红,将来不必绕大弯子。就算是临时使用的语言,把上面这个提纲精简一下,只看蓝色重体字的部分,大致能在几天到一周内搞定,不算是太耗时,而且写出来的代码不会太不靠谱。
以上提纲未设及内存模型。对于C/C++,这个问题很重要,要放在显著位置来考虑,但对于其他语言,这个问题被透明化了,除非你要做hardcore项目,否则不必太关注。
转载一些金融书单
Hidden Gems Reading List
(注:中文名我已尽量用从网上找到的中文版译名)
Elementary School (小学)
- One Up on Wall Street,(彼得·林奇的成功投资)by Peter Lynch(彼得·林奇)
- Buffett: The Making of an American Capitalist(一个美国资本家的成长-巴菲特传), by Roger Lowenstein
- value Investing With the Masters(跟大师学价值投资), by Kirk Kazanjian (0735203210)
- The Davis Dynasty(戴维斯王朝——五十年华尔街成功投资历程), by John Rothchild
- valuegrowth Investing(价值成长型投资), by Glen Arnold
Junior High (初中)
- The 5 Keys to value Investing(价值投资五大关键), by J. Dennis Jean-Jacques
- Beating the Street(战胜华尔街), by Peter Lynch(彼得·林奇)
- Investment Fables(打破神话的投资十诫), by Aswath Damodaran
- The Vest Pocket Guide to value Investing(价值投资手册), by C. Thomas Howard
- Common Stocks and Uncommon Profits(怎样选择成长股), by Philip Fisher (菲利普.费雪)
High School (高中)
- Made in America(美国制造), by Sam Walton (萨姆.沃尔顿)
- Forbes' Greatest Investing Stories( 福布斯最大投资传奇), by Richard Phalon
- John Neff on Investing(约翰.聂夫谈投资), by John Neff (约翰.聂夫)
- The Intelligent Investor(聪明的投资者), by Benjamin Graham (本杰明.格雷厄姆)
- The Money Masters(金融大师), by John Train
University (大学)
- Stocks for the Long Run(股史风云话投资(第3版散户投资正典)), by Jeremy Siegel (西格尔)
- Quality of Earnings(盈利的质量), by Thornton Oglove (0029226309)
- Investing in Small-Cap Stocks(投资小盘股), by Christopher Graja and Elizabeth Ungar
- The Book of Investing Wisdom(投资智慧书), by Peter Krass
- You Can Be a Stock Market Genius(你能成为股市天才), by Joel Greenblatt
Grad School (研究院)
- Break Up!(分裂), by Campbell, Koch & Sadtler
- Investment Gurus(投资大师), by Peter Tanous
- value Investing: A Balanced Approach(《价值投资:平稳途径》), by Martin Whitman
- value Investing: From Graham to Buffett and Beyond(价值投资:从格雷厄姆到巴菲特及其他), by Bruce Greenwald
- The Road to Serfdom(通往奴役之路), by F.A. Hayek (哈谢克)
Post-Doc 1: (博士后1)
- It's Earnings that Count(起作用的是盈利), Heiserman
- The Five Rules for Successful Stock Investing(股市真规则), Dorsey
- Inside Intuit(Intuit公司内幕), Taylor & Scroeder
- Pour Your Heart Into It(星巴克咖啡王国传奇), Schultz & Yang
- Investment Philosophies(投资哲学), Damodaran
Post-Doc 2: (博士后2)
- Damodaran on Valuation(价值评估,另一个译本译名:论价值:投资与公司财务安全性分析), Damodaran
- Contrarian Investment Strategies: The Next Generation(反向投资策略:升级版), Dreman
- Moneyball(钱与球: 在不公平比赛中获胜的艺术), Lewis
- Investment Intelligence From Insider Trading (从内线交易中获得的投资情报)
- Financial Shenanigans(财务诡计), Schilit
Post-Doc 3: (博士后3)
- Bull! A History of the Boom, 1982-1999,(牛市!1982-1999的市场繁荣历史) Mahir
- Wall Street: A History,(华尔街史) Geisst
- The Effective Executive(有效的管理者), Drucker (彼得.德鲁克)
- The Essential Drucker(管理大师德鲁克精华), Drucker (彼得.德鲁克)
- The Essays of Warren Buffet(巴菲特致股东的信:股份公司教程), Buffet
Post-Doc 4: (博士后4)
- Letters to Shareholders: Warren Buffet (巴菲特致股东的信)
- Letters to Shareholders: Charlie Munger (芒格致股东的信)
- Bershire Hathaway Owners Manual(伯克夏所有者手册), Buffet (以上三个见伯克夏网站)
- The Dark Side of Valuation(深入价值评估), Damodaran
入门书籍:
1.Futures, Options and other derivatives--by John Hull.(买)
聪聪推荐:这本书不用多说了,买就是了。不管是找工作还是 senior quant都会用到。
John Hull 也是非常厉害的,各个方面都有开创性的成果。现在Toronto Uni.
本人看法:经典中的经典,涉猎还算广泛,不过不够数学----人称华尔街的圣经,自然不算很难。
2.Arbitrage theory in continuous time--by Tomas Bjork.(借)
聪聪推荐:这本书非常适合数学/物理背景的人读,注重数学理论的培养。本来我觉得也没什么,但是被公司老板大加赞扬后就 改变看法了。。。Bjork现在瑞典SSE。
本人看法:没看过。 -.-b 已在国大图书馆搜到,准备借阅。
3.Financial Calculus--Martin Baxter& Rennie(借)
聪聪推荐:非常薄但是elegant的一本书,1996年,算是比较早了,但是和 Hull的那本书齐名。也是聪聪的first book。作者1现在野村证券伦敦(nomura),作者2在美林伦敦(ml),都是fixed income。
本人看法:没看过。图书馆有,但是holder之多不知道我在毕业前是否轮的到。鉴于是入门书籍,如果借不到就算了,以后有机会再补。
4.Financial calculus for finance II--Shreve(印)
聪聪推荐:Shreve的新书,非常elegant, 非常仔细,非常数学完备,适合数学背景, 但是比较厚,对于入门来说还是3好。作者现在CMU纽约。教授。顶尖人物。
本人看法:和 I 一起印了,因为无数人推荐。I是讲离散模型,II讲连续模型。QJ美女一直对Shreve赞赏有加,害得我也充满了对此人的幻想。
4.5 Martingale methods in Financial modelling--Musiela & Rutkovski(借)
聪聪推荐:也很好的,作者现在BNP(巴黎银行)和华沙理工?都是顶尖人物。
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
数学背景
5. Brownian motion and stochastic calculus--Shreve& Karasatz
聪聪推荐:如果想在这一行发paper或者搞研究的话,或者读phd, 这是必须的。但是书比较难,要有心理准备。作者2是哥大教授。他们俩还有一本书我正在读,1998年写的,但是很难,不推荐。
本人看法:借不到。~~~><~~~~ 不过好在我不搞研究,暂时不考虑这本。
6.Stochastic differential equations:....--Oksendal(印)
聪聪推荐:如果你觉得5比较难,就读这一本,会少很多东西,但是更实用!作者在挪威什么学校。。。忘记了。
本人看法:stochastic calculus for financial math的课本,的确比较精简实用。但有些问题还是讲的不够透彻。
7.Stochastic integration and differential equations--Protter(借)
聪聪推荐:如果觉得5比 较不难,就读这一本。我的导师的入门书。。。作者原来在普渡,现在康纳尔。
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
8.Numerical analysis---任何作者
聪聪推荐:当然作为Phd学生,葱葱还拥有 Mathematics of Arbitrage & Malliavin calculus 等一些 advanced 书籍,我就不推荐了,因为对绝大多数人来说(包括我自己。。。)都太难了。。。
本人看法:还好我不是phd,挖哈哈哈。
Junior quant:
9.Concepts and practice of Mathematical Finance--Mark Joshi(借)
聪聪推荐:非常适合刚入行的quant,对于学生不推荐。非常实用,作者非常聪明。写书的时候在 RBS伦敦。
本人看法:hold乐,可以借来看看。
10. C++ design patterns and derivatives pricing--Mark Joshi
聪 聪推荐:对于懂得C++基础的人来说很重要,更重要的是教你学会Monte Carlo。
本人看法:图书馆没有,暂时不考虑。
11. Modeling derivatives in C++ --Justin London(印)
聪聪推荐:其实这一本就够了,各种model如 何编程都有写,虽然这些model比较老呵呵。最实用的一本书!!作者现在美国,具体干什么不清楚,拿了无数个学位。
本人看法:很厚的一本书,model覆盖全面。聪聪记错了书名,卡卡。
Senior quant:(我不够格!大家看看 当作搞笑吧)
12&13&14: Effective C++/More effective C++/effective STL--Scott Meyer
聪聪推荐:C++太重要了!我现在最愁的就是我的编程了!作者在美国,C++的顶尖人物。
15. Numerical recipes in C++--William, Saul(电子版)
聪聪推荐:计算方法,非常重要的一本书!作者都在美国各个 实验室?
本人看法:暂时都不考虑,有空再看。btw, 免费下载地址:www.nr.com
各 个专门方面:(这个大家就别信我了,看看再说)
Interest rate
16.Interest rate models and practice --Mecurio& Fabio
聪聪推 荐:rates非常好的一本书,适合quant读,比较数学。作者都在Banc IMI,意大利的一家bank。
本人看法:借不到。~~~><~~~
17.Modern Pricing of interest rate derivatives--Rebonato(印)
聪聪推荐:当当当当!我的偶像登场了!这本书我现在看,主要是 Libor market model,作者在RBS伦敦,顶尖人物。
再次说一遍,我是他的fans!
本人看法:很实用的一本书,给出了calibration的方法。
equity
18&19: Option pricing formulas / Exotic options--Haug/Zhang
聪聪推荐:没看过,也就不说了。(shy。。。)作者都在纽约
creidt
20: Credit risk--Lando
聪聪推荐:作者在丹麦一家商学院,我是 买的这一本。
21: Credit derivatives pricing models--Schonbucher(印)
聪聪推荐:作者是传奇人物!非常 年轻非常厉害,现在ETH-Zurich,ETH有很多顶尖专家。。。
本人看法:credit pricing的启蒙书,还是非常不错的,就是对概率的要求比较高。
stochastic volatility
22. Option valuation in stochastic vol--Alan lewis
聪聪推荐:非常厉害的一 本书!也很难,适合物理背景。作者在加州
本人看法:适合物理背景的,那么我就跳过了。
23.Volatility and correlation : the perfect hedger and the fox --Rebonato(借)
聪聪推荐:正在看,比较偏向rates, 我的偶像的书当然要捧啦
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
24. Stochastic implied vol--忘记作者了
聪聪推荐:买了,但是觉得不值-。。=
本人看法:那么当然跳过了。
FX
25.Mathematical methods for foreign exchange--Alex Lipton(借)
聪聪推荐:很详细的一本书,quant必读,作者在纽约 Citigroup?
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
Credit risk
26. Copula methods in Finance --Umberto Cherubini.(借)
聪聪推荐: Copula 是用来求联合分布的,其实用一般理论也能求,但是copula直观很多,简化很多,据说最初提出人之一是个中国人, David Li,现在 Citigroup 还是 BarCap 忘记了。这里要提一下 Barclay Capital,成立才没几年,现在很多方面都是世界顶尖的了,连去年的 quant of the year 都是他家的。
本 人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
Numerical Methods;
27. Monte Carlo methods in fianncial engineering.-- Paul Glasserman(印)
聪聪推荐:作者在纽约哥大,算是顶尖人物之一了,最近在研究Levy process。这本书很好,但由于是academic 写的,有点太学术了。quant一般会买另外一本书-----
本人看法:原来印了这本,还没时间看。
28. Monte Carlo in finance.--Peter Jackel
聪聪推荐:作者原来在RBS 伦敦,现在在ABN Amro伦敦。这本书太实用了!用MC的都应该有一本。
29.Financial Engineering with Finite Element-- 作者忘记了
聪聪推荐:这本书是用有限元方法,其实和 finite diferece 很像,书里面自称会更好。当初头脑发热买了一本,之后没看过。。。。罪过啊罪过!作者现在在德国。
本人看法:跳过。
Financial Markets
以下这些书呢,是我每天睡觉前看的。。。。(什么?你们怎么也知道 Penthouse??难道被发现了?。。。其实 Penthouse这样的杂志只买过一本,好贵啊,之后就没买了。。。)
30.Dynamic Hedging-- Nassim |Taleb(借)
聪聪推荐:作者是很有经 验的quant trader,现在纽约,同时在麻省教书。是我现在精读的一本书,因为比较不数学,所以放在睡觉之前看,非常实用,但毕竟是给trader看的,太过实用 了。。。。大家不要急着买!第二版就快出来了。
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
31.Fooled by randomness--Nassim Taleb(借)
聪聪推荐:看过这本书 就知道如何用random的眼光看这个世界了。。。。
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
32. Misbehaviour of financial markets-- Mandebrot
聪聪推荐:作者是 研究数学经济的得过Wolf奖的超级数学家!现在耶鲁。对金融市场有特别的看法。这本书一定要看啊!
本人看法:又一本借不到的书。~~~><~~~
33. Liar's poker--Lewis(电子版)
聪聪推荐:讲以前Solomon brothers的Arb team的,当时是世界最厉害的 quant trader。这本书搞trading的人都会看。
本人看法:我有电子版,呵呵,娱乐用书。顺便提一句,去investment banking interview时,千万别说这是你喜欢的书,这是一个bad answer.(具体参见beat the street P122)
34&35. Market wizards I II---Schwager(借)
聪聪推 荐:教你怎么做trader,这些是老一代 trader了,现在科技发展了,更加依靠Model了,但是好的trader会有共同点的!
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
36。 stochastic volatility--Nielsen?
聪聪推荐:这是一个论文集,关于stochastic vol的研究很多论文收入在内,但是买来之后觉得很亏!因为都是econometrics背景的论文,和我的研究并不怎么相关。大家不要买。。。
本人看法:跳过。
Levy process
37。 Financial modelling with jump process---Rama Cont(印)
聪聪推荐:作者是巴黎高科(Ecole polytechnique)的教授,这个学校的学生。。。。。donimate伦敦金融城quant领域!如果你要找quant职位,练好法语先。。。
法 国人的金融数学绝对最厉害,不仅仅金融数学起源于法国,现在一些最新的数学研究都是一群法国数学家在做。这本书非常好,数学绝对全面,也够深入,太喜欢 了。
这里得要提一下法国的银行,BNP(巴黎银行), SG(兴业银行),Calyon(农业信贷银行)都是市场的佼佼者。特别是前两个,在衍生品领域领先其他bank,不要提GS,ML,MS,在 derivatives研究方面,SG的equity, BNP的fixed income领先他们很多。如果你听说一个 equity deri. quant 来自SG, 他肯定经常受到猎头骚扰。
本人看法:内容的确很全,甚至还有beyond levy processes,恐怖。
38。 Levy processes in finance--Wim shouten(印)
聪 聪推荐:作者是比利时鲁汶大学的数学教授,最近很红,因为 Levy process很火。这本书很贵,只有193页,没怎么看过,因为我还舍不得买。。。。
本人看法:终于接触到levy process了,否则就像只学过牛顿经典力学一样。
general
39。 My life as a quant---E.Derman
聪聪推荐:作者是第一代quant,以前是 GS的quant 研究部门head,现在哥大。是stochastic vol领域顶尖人物。其实也是很多其他领域顶尖人物。书不错,但也不是那么好。主要还是作为一个物理学家的角度来写。
本人看法:物理,跳过。
40 & 41。Infectious greed & FIASCO--Frank Partnoy(借)
聪聪推荐:作者最初在 First Boston,后来在Morgan Stanley做衍生品的sales。书里讲了很多衍生品市场如何骗客户,如何赚取dirty money的事情。
本 人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
数量金融基本书目(Classic Books for Quantitative Finance Available in China)
一些有志于数量金融的朋友感叹国内资源不足,花大量时间泡网找电子书。其实这个领域的基本参考书就那么几本,全世界的学者都在用。据我多年泡图书馆和逛书店的经验,不妨给大伙数数国内公开出版的数量金融经典教材,影印版或者中译本,挂一漏万,欢迎随时添加指正(mailto:jiangtanghu(at)gmail(dot)com)。这些书应该都可以从网上书店如china-pub订到,而且单本不会超过一百块。说,材料都容易得到,稀缺的是钻研的耐心。
数量金融的基本书目,无非包括三类,金融、数学和编程(C++)。在金融这块,入门多用John Hull的那本所谓华尔街圣经,Options, Futures, and Other Derivatives(《期权、期货和其他衍生品》),现在都出到第七版了(可怜我手头那本6版还没有看完)。清华大学出版社有这本书的影印版(见过5 版,不知道有没有更新的),中译本就比较落后,华夏出版社有3版——那就看影印5版喽。Hull还有一本《期货与期权市场导论》 (第5版),北大出版社的中译本(这个本子较新),数学处理上比前面的“圣经”简单,但对了解领域知识一样有用。
金融数学这块,最好的书国内都引进了(除了Paul Wilmott on Quantitative Finance,北大图书馆跟国图有藏,最新2版三卷本):
Steven Shreve的两卷Stochastic Calculus for Finance,卷一The Binomial Asset Pricing Model和卷二Continuous-Time Models,世界图书出版公司都有影印本,叫做《金融随机分析》。世界图书还有他另外两本名气稍小的影印本子,Methods of Mathematical Finance(《金融数学方法》)和Brownian Motion and Stochastic Calculus(《布朗运动和随机计算》)。都是Springer的精装黄皮本子,比较精致,还便宜。
Salih Neftci的几本,武大出版社也有影印本,不过都是平装的本子,纸张看着不舒服,Principles of Financial Engineering(《金融工程原理》),以及An Introduction to the Mathematics of Financial Derivatives(《金融衍生工具数学导论》)。最后一本西南财经大学出版社也有影印本,叫做《金融衍生工具中的数学》。今年西南财经也引进了几本看着不错的书。
Baxter和Rennie合著的Financial Calculus: An Introduction to Derivative Pricing (Cambridge) ,图灵图书在人民邮电出版社有影印本和中译本,唤作《金融数学—衍生产品定价引论》。图灵做的书都比较漂亮。
最基本的金融数学(随机微积分)参考书,以上已经足够了。其他数学科目,如偏微分、数值分析之类,在数学系的书目里,能选择的就更多了。国内甚至还能找到Paul Glasserman的那本Monte Carlo Methods in Financial Engineering(《金融工程中的蒙特卡罗方法》),高教出版社刚出了一个影印版。
最后一组是编程。一些朋友还在犹豫,是用C好呢,还是Java好?或者,Excel VBA、Matlab似乎也不赖,最近C#也好像挺流行,Python也出了个数值计算的库,R也有金融计算的包rMetrics,S-Plus的 FinMetrics看着也不错,——都错!如果你不是学有余力精力过剩的话,C++应该是你唯一的选择。C++是数量金融界的标准语言,而且,即使你工作中不用C++,它也会是企业检验你水平的门槛。C++,全世界的程序员和Quant推荐得最多的就是这三本书,而且国内都有最新的影印本和中译本:Lippman的C++ Primer(人民邮电)、Eckel的Thinking in C++(机械工业)和Bjarne Stroustrup的The C++ Programming Language(《C++程序设计语言》,高教)。
http://johnthu.spaces.live.com/blog/cns!2053CD511E6D5B1E!583.entry?wa=wsignin1.0&sa=987638549
(注:中文名我已尽量用从网上找到的中文版译名)
Elementary School (小学)
- One Up on Wall Street,(彼得·林奇的成功投资)by Peter Lynch(彼得·林奇)
- Buffett: The Making of an American Capitalist(一个美国资本家的成长-巴菲特传), by Roger Lowenstein
- value Investing With the Masters(跟大师学价值投资), by Kirk Kazanjian (0735203210)
- The Davis Dynasty(戴维斯王朝——五十年华尔街成功投资历程), by John Rothchild
- valuegrowth Investing(价值成长型投资), by Glen Arnold
Junior High (初中)
- The 5 Keys to value Investing(价值投资五大关键), by J. Dennis Jean-Jacques
- Beating the Street(战胜华尔街), by Peter Lynch(彼得·林奇)
- Investment Fables(打破神话的投资十诫), by Aswath Damodaran
- The Vest Pocket Guide to value Investing(价值投资手册), by C. Thomas Howard
- Common Stocks and Uncommon Profits(怎样选择成长股), by Philip Fisher (菲利普.费雪)
High School (高中)
- Made in America(美国制造), by Sam Walton (萨姆.沃尔顿)
- Forbes' Greatest Investing Stories( 福布斯最大投资传奇), by Richard Phalon
- John Neff on Investing(约翰.聂夫谈投资), by John Neff (约翰.聂夫)
- The Intelligent Investor(聪明的投资者), by Benjamin Graham (本杰明.格雷厄姆)
- The Money Masters(金融大师), by John Train
University (大学)
- Stocks for the Long Run(股史风云话投资(第3版散户投资正典)), by Jeremy Siegel (西格尔)
- Quality of Earnings(盈利的质量), by Thornton Oglove (0029226309)
- Investing in Small-Cap Stocks(投资小盘股), by Christopher Graja and Elizabeth Ungar
- The Book of Investing Wisdom(投资智慧书), by Peter Krass
- You Can Be a Stock Market Genius(你能成为股市天才), by Joel Greenblatt
Grad School (研究院)
- Break Up!(分裂), by Campbell, Koch & Sadtler
- Investment Gurus(投资大师), by Peter Tanous
- value Investing: A Balanced Approach(《价值投资:平稳途径》), by Martin Whitman
- value Investing: From Graham to Buffett and Beyond(价值投资:从格雷厄姆到巴菲特及其他), by Bruce Greenwald
- The Road to Serfdom(通往奴役之路), by F.A. Hayek (哈谢克)
Post-Doc 1: (博士后1)
- It's Earnings that Count(起作用的是盈利), Heiserman
- The Five Rules for Successful Stock Investing(股市真规则), Dorsey
- Inside Intuit(Intuit公司内幕), Taylor & Scroeder
- Pour Your Heart Into It(星巴克咖啡王国传奇), Schultz & Yang
- Investment Philosophies(投资哲学), Damodaran
Post-Doc 2: (博士后2)
- Damodaran on Valuation(价值评估,另一个译本译名:论价值:投资与公司财务安全性分析), Damodaran
- Contrarian Investment Strategies: The Next Generation(反向投资策略:升级版), Dreman
- Moneyball(钱与球: 在不公平比赛中获胜的艺术), Lewis
- Investment Intelligence From Insider Trading (从内线交易中获得的投资情报)
- Financial Shenanigans(财务诡计), Schilit
Post-Doc 3: (博士后3)
- Bull! A History of the Boom, 1982-1999,(牛市!1982-1999的市场繁荣历史) Mahir
- Wall Street: A History,(华尔街史) Geisst
- The Effective Executive(有效的管理者), Drucker (彼得.德鲁克)
- The Essential Drucker(管理大师德鲁克精华), Drucker (彼得.德鲁克)
- The Essays of Warren Buffet(巴菲特致股东的信:股份公司教程), Buffet
Post-Doc 4: (博士后4)
- Letters to Shareholders: Warren Buffet (巴菲特致股东的信)
- Letters to Shareholders: Charlie Munger (芒格致股东的信)
- Bershire Hathaway Owners Manual(伯克夏所有者手册), Buffet (以上三个见伯克夏网站)
- The Dark Side of Valuation(深入价值评估), Damodaran
入门书籍:
1.Futures, Options and other derivatives--by John Hull.(买)
聪聪推荐:这本书不用多说了,买就是了。不管是找工作还是 senior quant都会用到。
John Hull 也是非常厉害的,各个方面都有开创性的成果。现在Toronto Uni.
本人看法:经典中的经典,涉猎还算广泛,不过不够数学----人称华尔街的圣经,自然不算很难。
2.Arbitrage theory in continuous time--by Tomas Bjork.(借)
聪聪推荐:这本书非常适合数学/物理背景的人读,注重数学理论的培养。本来我觉得也没什么,但是被公司老板大加赞扬后就 改变看法了。。。Bjork现在瑞典SSE。
本人看法:没看过。 -.-b 已在国大图书馆搜到,准备借阅。
3.Financial Calculus--Martin Baxter& Rennie(借)
聪聪推荐:非常薄但是elegant的一本书,1996年,算是比较早了,但是和 Hull的那本书齐名。也是聪聪的first book。作者1现在野村证券伦敦(nomura),作者2在美林伦敦(ml),都是fixed income。
本人看法:没看过。图书馆有,但是holder之多不知道我在毕业前是否轮的到。鉴于是入门书籍,如果借不到就算了,以后有机会再补。
4.Financial calculus for finance II--Shreve(印)
聪聪推荐:Shreve的新书,非常elegant, 非常仔细,非常数学完备,适合数学背景, 但是比较厚,对于入门来说还是3好。作者现在CMU纽约。教授。顶尖人物。
本人看法:和 I 一起印了,因为无数人推荐。I是讲离散模型,II讲连续模型。QJ美女一直对Shreve赞赏有加,害得我也充满了对此人的幻想。
4.5 Martingale methods in Financial modelling--Musiela & Rutkovski(借)
聪聪推荐:也很好的,作者现在BNP(巴黎银行)和华沙理工?都是顶尖人物。
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
数学背景
5. Brownian motion and stochastic calculus--Shreve& Karasatz
聪聪推荐:如果想在这一行发paper或者搞研究的话,或者读phd, 这是必须的。但是书比较难,要有心理准备。作者2是哥大教授。他们俩还有一本书我正在读,1998年写的,但是很难,不推荐。
本人看法:借不到。~~~><~~~~ 不过好在我不搞研究,暂时不考虑这本。
6.Stochastic differential equations:....--Oksendal(印)
聪聪推荐:如果你觉得5比较难,就读这一本,会少很多东西,但是更实用!作者在挪威什么学校。。。忘记了。
本人看法:stochastic calculus for financial math的课本,的确比较精简实用。但有些问题还是讲的不够透彻。
7.Stochastic integration and differential equations--Protter(借)
聪聪推荐:如果觉得5比 较不难,就读这一本。我的导师的入门书。。。作者原来在普渡,现在康纳尔。
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
8.Numerical analysis---任何作者
聪聪推荐:当然作为Phd学生,葱葱还拥有 Mathematics of Arbitrage & Malliavin calculus 等一些 advanced 书籍,我就不推荐了,因为对绝大多数人来说(包括我自己。。。)都太难了。。。
本人看法:还好我不是phd,挖哈哈哈。
Junior quant:
9.Concepts and practice of Mathematical Finance--Mark Joshi(借)
聪聪推荐:非常适合刚入行的quant,对于学生不推荐。非常实用,作者非常聪明。写书的时候在 RBS伦敦。
本人看法:hold乐,可以借来看看。
10. C++ design patterns and derivatives pricing--Mark Joshi
聪 聪推荐:对于懂得C++基础的人来说很重要,更重要的是教你学会Monte Carlo。
本人看法:图书馆没有,暂时不考虑。
11. Modeling derivatives in C++ --Justin London(印)
聪聪推荐:其实这一本就够了,各种model如 何编程都有写,虽然这些model比较老呵呵。最实用的一本书!!作者现在美国,具体干什么不清楚,拿了无数个学位。
本人看法:很厚的一本书,model覆盖全面。聪聪记错了书名,卡卡。
Senior quant:(我不够格!大家看看 当作搞笑吧)
12&13&14: Effective C++/More effective C++/effective STL--Scott Meyer
聪聪推荐:C++太重要了!我现在最愁的就是我的编程了!作者在美国,C++的顶尖人物。
15. Numerical recipes in C++--William, Saul(电子版)
聪聪推荐:计算方法,非常重要的一本书!作者都在美国各个 实验室?
本人看法:暂时都不考虑,有空再看。btw, 免费下载地址:www.nr.com
各 个专门方面:(这个大家就别信我了,看看再说)
Interest rate
16.Interest rate models and practice --Mecurio& Fabio
聪聪推 荐:rates非常好的一本书,适合quant读,比较数学。作者都在Banc IMI,意大利的一家bank。
本人看法:借不到。~~~><~~~
17.Modern Pricing of interest rate derivatives--Rebonato(印)
聪聪推荐:当当当当!我的偶像登场了!这本书我现在看,主要是 Libor market model,作者在RBS伦敦,顶尖人物。
再次说一遍,我是他的fans!
本人看法:很实用的一本书,给出了calibration的方法。
equity
18&19: Option pricing formulas / Exotic options--Haug/Zhang
聪聪推荐:没看过,也就不说了。(shy。。。)作者都在纽约
creidt
20: Credit risk--Lando
聪聪推荐:作者在丹麦一家商学院,我是 买的这一本。
21: Credit derivatives pricing models--Schonbucher(印)
聪聪推荐:作者是传奇人物!非常 年轻非常厉害,现在ETH-Zurich,ETH有很多顶尖专家。。。
本人看法:credit pricing的启蒙书,还是非常不错的,就是对概率的要求比较高。
stochastic volatility
22. Option valuation in stochastic vol--Alan lewis
聪聪推荐:非常厉害的一 本书!也很难,适合物理背景。作者在加州
本人看法:适合物理背景的,那么我就跳过了。
23.Volatility and correlation : the perfect hedger and the fox --Rebonato(借)
聪聪推荐:正在看,比较偏向rates, 我的偶像的书当然要捧啦
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
24. Stochastic implied vol--忘记作者了
聪聪推荐:买了,但是觉得不值-。。=
本人看法:那么当然跳过了。
FX
25.Mathematical methods for foreign exchange--Alex Lipton(借)
聪聪推荐:很详细的一本书,quant必读,作者在纽约 Citigroup?
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
Credit risk
26. Copula methods in Finance --Umberto Cherubini.(借)
聪聪推荐: Copula 是用来求联合分布的,其实用一般理论也能求,但是copula直观很多,简化很多,据说最初提出人之一是个中国人, David Li,现在 Citigroup 还是 BarCap 忘记了。这里要提一下 Barclay Capital,成立才没几年,现在很多方面都是世界顶尖的了,连去年的 quant of the year 都是他家的。
本 人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
Numerical Methods;
27. Monte Carlo methods in fianncial engineering.-- Paul Glasserman(印)
聪聪推荐:作者在纽约哥大,算是顶尖人物之一了,最近在研究Levy process。这本书很好,但由于是academic 写的,有点太学术了。quant一般会买另外一本书-----
本人看法:原来印了这本,还没时间看。
28. Monte Carlo in finance.--Peter Jackel
聪聪推荐:作者原来在RBS 伦敦,现在在ABN Amro伦敦。这本书太实用了!用MC的都应该有一本。
29.Financial Engineering with Finite Element-- 作者忘记了
聪聪推荐:这本书是用有限元方法,其实和 finite diferece 很像,书里面自称会更好。当初头脑发热买了一本,之后没看过。。。。罪过啊罪过!作者现在在德国。
本人看法:跳过。
Financial Markets
以下这些书呢,是我每天睡觉前看的。。。。(什么?你们怎么也知道 Penthouse??难道被发现了?。。。其实 Penthouse这样的杂志只买过一本,好贵啊,之后就没买了。。。)
30.Dynamic Hedging-- Nassim |Taleb(借)
聪聪推荐:作者是很有经 验的quant trader,现在纽约,同时在麻省教书。是我现在精读的一本书,因为比较不数学,所以放在睡觉之前看,非常实用,但毕竟是给trader看的,太过实用 了。。。。大家不要急着买!第二版就快出来了。
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
31.Fooled by randomness--Nassim Taleb(借)
聪聪推荐:看过这本书 就知道如何用random的眼光看这个世界了。。。。
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
32. Misbehaviour of financial markets-- Mandebrot
聪聪推荐:作者是 研究数学经济的得过Wolf奖的超级数学家!现在耶鲁。对金融市场有特别的看法。这本书一定要看啊!
本人看法:又一本借不到的书。~~~><~~~
33. Liar's poker--Lewis(电子版)
聪聪推荐:讲以前Solomon brothers的Arb team的,当时是世界最厉害的 quant trader。这本书搞trading的人都会看。
本人看法:我有电子版,呵呵,娱乐用书。顺便提一句,去investment banking interview时,千万别说这是你喜欢的书,这是一个bad answer.(具体参见beat the street P122)
34&35. Market wizards I II---Schwager(借)
聪聪推 荐:教你怎么做trader,这些是老一代 trader了,现在科技发展了,更加依靠Model了,但是好的trader会有共同点的!
本人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
36。 stochastic volatility--Nielsen?
聪聪推荐:这是一个论文集,关于stochastic vol的研究很多论文收入在内,但是买来之后觉得很亏!因为都是econometrics背景的论文,和我的研究并不怎么相关。大家不要买。。。
本人看法:跳过。
Levy process
37。 Financial modelling with jump process---Rama Cont(印)
聪聪推荐:作者是巴黎高科(Ecole polytechnique)的教授,这个学校的学生。。。。。donimate伦敦金融城quant领域!如果你要找quant职位,练好法语先。。。
法 国人的金融数学绝对最厉害,不仅仅金融数学起源于法国,现在一些最新的数学研究都是一群法国数学家在做。这本书非常好,数学绝对全面,也够深入,太喜欢 了。
这里得要提一下法国的银行,BNP(巴黎银行), SG(兴业银行),Calyon(农业信贷银行)都是市场的佼佼者。特别是前两个,在衍生品领域领先其他bank,不要提GS,ML,MS,在 derivatives研究方面,SG的equity, BNP的fixed income领先他们很多。如果你听说一个 equity deri. quant 来自SG, 他肯定经常受到猎头骚扰。
本人看法:内容的确很全,甚至还有beyond levy processes,恐怖。
38。 Levy processes in finance--Wim shouten(印)
聪 聪推荐:作者是比利时鲁汶大学的数学教授,最近很红,因为 Levy process很火。这本书很贵,只有193页,没怎么看过,因为我还舍不得买。。。。
本人看法:终于接触到levy process了,否则就像只学过牛顿经典力学一样。
general
39。 My life as a quant---E.Derman
聪聪推荐:作者是第一代quant,以前是 GS的quant 研究部门head,现在哥大。是stochastic vol领域顶尖人物。其实也是很多其他领域顶尖人物。书不错,但也不是那么好。主要还是作为一个物理学家的角度来写。
本人看法:物理,跳过。
40 & 41。Infectious greed & FIASCO--Frank Partnoy(借)
聪聪推荐:作者最初在 First Boston,后来在Morgan Stanley做衍生品的sales。书里讲了很多衍生品市场如何骗客户,如何赚取dirty money的事情。
本 人看法:没看过。-.-b 已在国大图书馆搜到,准备借阅。
数量金融基本书目(Classic Books for Quantitative Finance Available in China)
一些有志于数量金融的朋友感叹国内资源不足,花大量时间泡网找电子书。其实这个领域的基本参考书就那么几本,全世界的学者都在用。据我多年泡图书馆和逛书店的经验,不妨给大伙数数国内公开出版的数量金融经典教材,影印版或者中译本,挂一漏万,欢迎随时添加指正(mailto:jiangtanghu(at)gmail(dot)com)。这些书应该都可以从网上书店如china-pub订到,而且单本不会超过一百块。说,材料都容易得到,稀缺的是钻研的耐心。
数量金融的基本书目,无非包括三类,金融、数学和编程(C++)。在金融这块,入门多用John Hull的那本所谓华尔街圣经,Options, Futures, and Other Derivatives(《期权、期货和其他衍生品》),现在都出到第七版了(可怜我手头那本6版还没有看完)。清华大学出版社有这本书的影印版(见过5 版,不知道有没有更新的),中译本就比较落后,华夏出版社有3版——那就看影印5版喽。Hull还有一本《期货与期权市场导论》 (第5版),北大出版社的中译本(这个本子较新),数学处理上比前面的“圣经”简单,但对了解领域知识一样有用。
金融数学这块,最好的书国内都引进了(除了Paul Wilmott on Quantitative Finance,北大图书馆跟国图有藏,最新2版三卷本):
Steven Shreve的两卷Stochastic Calculus for Finance,卷一The Binomial Asset Pricing Model和卷二Continuous-Time Models,世界图书出版公司都有影印本,叫做《金融随机分析》。世界图书还有他另外两本名气稍小的影印本子,Methods of Mathematical Finance(《金融数学方法》)和Brownian Motion and Stochastic Calculus(《布朗运动和随机计算》)。都是Springer的精装黄皮本子,比较精致,还便宜。
Salih Neftci的几本,武大出版社也有影印本,不过都是平装的本子,纸张看着不舒服,Principles of Financial Engineering(《金融工程原理》),以及An Introduction to the Mathematics of Financial Derivatives(《金融衍生工具数学导论》)。最后一本西南财经大学出版社也有影印本,叫做《金融衍生工具中的数学》。今年西南财经也引进了几本看着不错的书。
Baxter和Rennie合著的Financial Calculus: An Introduction to Derivative Pricing (Cambridge) ,图灵图书在人民邮电出版社有影印本和中译本,唤作《金融数学—衍生产品定价引论》。图灵做的书都比较漂亮。
最基本的金融数学(随机微积分)参考书,以上已经足够了。其他数学科目,如偏微分、数值分析之类,在数学系的书目里,能选择的就更多了。国内甚至还能找到Paul Glasserman的那本Monte Carlo Methods in Financial Engineering(《金融工程中的蒙特卡罗方法》),高教出版社刚出了一个影印版。
最后一组是编程。一些朋友还在犹豫,是用C好呢,还是Java好?或者,Excel VBA、Matlab似乎也不赖,最近C#也好像挺流行,Python也出了个数值计算的库,R也有金融计算的包rMetrics,S-Plus的 FinMetrics看着也不错,——都错!如果你不是学有余力精力过剩的话,C++应该是你唯一的选择。C++是数量金融界的标准语言,而且,即使你工作中不用C++,它也会是企业检验你水平的门槛。C++,全世界的程序员和Quant推荐得最多的就是这三本书,而且国内都有最新的影印本和中译本:Lippman的C++ Primer(人民邮电)、Eckel的Thinking in C++(机械工业)和Bjarne Stroustrup的The C++ Programming Language(《C++程序设计语言》,高教)。
http://johnthu.spaces.live.com/blog/cns!2053CD511E6D5B1E!583.entry?wa=wsignin1.0&sa=987638549
Subscribe to:
Posts (Atom)