李开复2003年12月


三年前离开中国时,我在《给中国学生的一封信》中,与广大青年学生一道,讨论了一些大家共同关心的话题,并结合自己的学习和工作经历,就青年学生如何对待机遇、学业、工作、他人、自己等问题,阐述了我的个人意见。我提出诚信和正直、主动意识、交流和沟通、努力一生学习这几个个人素质方面值得中国学生高度重视,

在这三年,许多中国学生,经过电子邮件、讲座后的问答、座谈、和其他渠道(例如在电视节目“对话”中),常对我提到“如何成才”的问题。对于这个大家关注的问题,我整理了许多材料,集成这封“第二封信”。

在第一封信力所提到的个人素质或“价值观”是成材的必要的基础。但是,除了素质之外,成才同样的需要领导能力(leadership)。很多人误以为领导能力最重视的是天资、号召力、管理能力。但是,根据我个人的经验,和最近一些研究的结论,如果你想成为一名成功的领导,最重要的不是你的智商(IQ),而是你的情商(EQ)。最重要的不是要成为一个有号召力令人信服的领导,而是要成为一个有 “谦虚”、“执著”和“勇气” 的领导。

这“给中国学生的第二封信”是为那些希望不断提高自己,不断学习事业成功所必需的基本技能和领导艺术的人所写的。第一部分重申了《给中国学生的一封信》中讨论过的有关个人素质的话题;第二部分阐释了领导能力中最重要的情商;第三部分给出了卓越的领导所必须具备的、有别于普通人的基本特质。


 

如何提高个人素质
 

诚信和正直

一个人的人品如何直接决定了这个人对于社会的价值。而在与人品相关的各种因素之中,诚信又是最为重要的一点。微软公司在用人时非常强调诚信,我们只雇佣那些最值得信赖的人。去年,当微软列出对员工期望的“核心价值观”时,诚信(honesty and integrity)被列为一位。

在我发表“第一封信”后,曾经有一位同学问我:为什么一个公司要涉入员工的道德呢?我回答:这是为了公司自己的利益。例如,一位应聘者在面试时曾对我说,如果他能加入微软公司,他就可以把他在前一家公司所做的发明成果带过来。对这样的人,无论他的技术水平如何,我都不会雇用他。他既然可以在加入微软时损害先前公司的利益,那他也一定会在加入微软后损害微软公司的利益。

另外有一位同学看了“对话”后问我,为什么我会把诚信放在智慧之前呢?难道我们会去衡量员工的诚信和他们的智慧而给诚信更高的比重?其实,我们的衡量都在直接的工作目标上,并不会对诚信或智慧做直接的衡量。但是,作为第一“核心价值”,诚信是我们对员工最基本的要求。 我们根本不会去雇用没有诚信的人。如果一个员工发生了严重诚信的问题,他会被立刻解雇。

当一个公司这么重视诚信,员工一定更值得信赖。因此,公司对员工也能够完全信任,让他们发挥自己的才能。在微软公司,公司的各级管理者都会给员工较大的自由和空间发展他们的事业,并在工作和生活上充分信任、支持和帮助员工。只要是微软录用的人,微软就会百分之百地信任他。和一些软件企业对员工处处提防的做法不同,微软公司内的员工可以看到许多源代码,接触到很多技术或商业方面的机密。正因为如此得到公司的信任,微软的员工对公司才有更强的责任心和更高的工作热情。



培养主动意识

坦白地说,中国的学生和职员大多属于比较内向的类型,在学习和工作中还不够主动。在学校时,学生们往往需要老师安排学习任务,或是按照老师的思路做课题研究。在公司里,中国职员常常要等老板吩咐做什么事、怎么做之后,才开始工作。此外,许多中国人并不善于推销和宣传自己,这恐怕和中国自古以来讲求中庸的文化氛围有很大关系。

但是,要想在现代企业中获得成功,就必须努力培养自己的主动意识:在工作中要勇于承担责任,主动为自己设定工作目标,并不断改进方式和方法;此外,还应当培养推销自己的能力,在领导或同事面前要善于表现自己的优点,有了研究成果或技术创新之后要通过演讲、展示、交流、论文等方式和同事或同行分享,在工作中犯了错误也要勇于承认。只有积极主动的人才能在瞬息万变的竞争环境中获得成功,只有善于展示自己的人才能在工作中获得真正的机会。



客观、直接的交流和沟通


开诚布公的交流和沟通是团队合作中最重要的环节。人与人之间遮遮掩掩、言不由衷甚至挑拨是非的做法都会严重破坏团队中的工作氛围,阻碍团队成员间的正常交流,并最终导致项目或企业经营失败。

比如,在开会讨论问题的时候,与会的所有人员都应当坦诚地交换意见,这样才能做出正确的决定。如果某个人因为考虑到某些其他因素(比如不愿反驳上级领导的意见)而在会议上不敢表达自己的观点,一味地唯唯诺诺,会后到了洗手间里再和别人说“其实我不同意他的观点”,这种戴着假面具工作的人不但不能坚持自己的观点,还会破坏公司内部的沟通和交流渠道,对工作产生负面的影响。

微软公司有一个非常好的文化叫“开放式交流(Open communication)”,它要求所有员工在任何交流或沟通的场合里都能敞开心扉,完整地表达自己的观点。在微软开会时,大家如果意见的不统一,一定要表达出来,否则公司可能错过良机。当Internet刚开始时,很多微软的领导者不理解、不赞成花太多精力做这个“不挣钱”的技术。但是有几位技术人员,他们不断地提出他们的意见和建议,虽然他们的上司不理解,但是仍然支持他们“开放式交流”的权利。后来,他们的声音很快的达到比尔•盖茨的耳里,促成比尔改变公司方向,彻底支持Internet。从这个例子我们可以看到,这种开放的交流环境对微软公司保持企业活力和创新能力都是非常重要的。

彻底的开放式交流也有缺点。开放式交流有时会造成激烈的辩论甚至是争吵,而吵到气头上有时会说出不尊重别人的语言,会破坏人与人之间的关系。因此,微软公司的总裁史蒂夫•鲍尔默去年在微软的核心价值观中,提出我们要把这种开放式交流文化改进成“开放并相互尊重(Open and respectful)”。这要求我们在相互交流时充分尊重对方。当我们不同意对方的意见时,一定要用建设性的语言提出。



挑战自我、学无止境

从一名大学生到一名程序员,再到一位管理者,在软件人才的成长历程中,学习是永无止境的。在大学期间,我们要打好基础,培养自己各方面的素质和能力;工作以后,我们应当努力在实际工作中学习新的技术并积累相关经验;即使走上了管理岗位,我们也应当不断学习,不断提高自己。软件产业本身就是一个每天都会有新技术、新概念诞生,充满了活力和创造力的产业。作为软件产业的从业人员,如果只知道闭门造车、抱残守缺,我们就必然会落伍,必然会被市场淘汰。

许多中国学生喜欢与别人竞争,但这种竞争更多地表现为一种“零和游戏”,无法使自己和他人得到真正的提高。我建议大家最好能不断和自己竞争——不要总想着胜过别人,而要努力超越自我,不断在自身的水平上取得进步。

在学习的过程中,打好基础最为重要。从软件产业对人才的需求来看,我们必须学好数学和英语这两门基础学科。数学是所有工程科学的基础,无论是软件产品的开发,还是软件技术的研究,都要大量使用数学方法和数学原理。英文则是软件行业中的国际语言,要想了解国际上软件技术的发展趋势,掌握最新的研究成果,或是与国外同行进行技术交流,就必须掌握英文的听、说、读、写,能够在工作中熟练使用英文来解决问题。

 


情商和领导能力


同学们都希望增进自己的leadership skills(领导能力)。从我的经验和一些最近的研究结果看来,领导能力中最重要的是所谓的“情商”( EQ)。

智商(IQ)反映人的智慧水平,情商则反映了人在情感、情绪方面的自控和协调能力。在高新技术企业中,大家都知道智慧的重要,但是情商的重要性甚至超过了智商。我看过一篇文章,该文的作者调查了188个公司,他用心理学方法测试了这些公司里每一名员工的智商和情商,并将测试结果和该员工在工作上的表现联系在一起进行分析。经过研究,该文的作者发现,在对个人工作业绩的影响方面,情商的影响力是智商的两倍。此外,他还专门对公司中的高级管理者进行了分析。他发现在高级管理者中,情商对于个人成败的影响力是智商的九倍。这说明,智商略逊他人的人如果拥有更高的情商指数,也一样可以获得成功;反之,智商很高,但情商不足的人欠缺“领导能力”,很难成为一个成功的领导。


什么是情商?
 

在现代社会,如果你只知道智商而不晓得情商的话,你至少在意识上已经落伍了。许多心理学家早已明确地指出,单单使用智商的标准考察一个人在才智方面的表现,并不足以准确预测这个人在事业上可能取得的成就。为了全面考察个人能力,特别是考察个人在社会生活中的适应能力和创造能力,心理学家们提出了情商的概念。

情商主要是指那些与认识自我、控制情绪、激励自己以及处理人际关系等相关的个人能力。在情商所描述的各项能力因素中,自觉、同理心、自律和人际关系是四种对现代人的事业成败起决定性作用的关键因素。

智商是先天赋予的,但是情商是可以培养的。多花功夫理解和应用这四种情商的关键因素。除此之外,因为情商不是自己能看清楚的,我建议可多理解别人对你的看法、多吸取别人(尤其是情商高的人)的意见。


自觉

中国人常说,人贵有自知之明。这实际上是说,社会生活中的每个人都应当对自己的素质、潜能、特长、缺陷、经验等各种基本能力有一个清醒的认识,对自己在社会工作生活中可能扮演的角色有一个明确的定位。心理学上把这种有自知之明的能力称为“自觉”,这通常包括察觉自己的情绪对言行的影响,了解并正确评估自己的资质、能力与局限,相信自己的价值和能力等几个方面。

我的下属中有一个“自觉心”明显不足的人:他虽然有一些能力,但是他自视甚高,总是对自己目前的职位不满意,随时随地自吹自擂,总是不满现状。前一段时间,他认为我不识才,没有重用他,决定离开我的组,并期望在微软其他组中另谋高就。但是,他最终发现,自己不但找不到更好的工作,公司里的同事也都对他颇有微辞,认为他缺少自知之明,期望和现实相距太远。最近,他沮丧地离开了公司。接替他职位的人,是一个能力很强,而且很有“自觉心”的人。虽然这个人在上一个职位工作时不很成功,但他理解自己升迁太快,愿意自降一级来做这份工作,以便打好基础。他现在的确做得很出色。

简单地说,一个人既不能对自己的能力判断过高,也不能轻易低估自己的潜能。对自己判断过高的人往往容易浮躁、冒进,不善于和他人合作,在事业遭到挫折时心理落差较大,难以平静对待客观事实;低估了自己的能力的人,则会在工作中畏首畏尾、踟蹰不前,没有承担责任和肩负重担的勇气,也没有主动请缨的积极性。无论是上述哪一种情况,个人的潜力都不能得到充分的发挥,个人事业也不可能取得最大的成功。

有自知之明的人既能够在他人面前展示自己的特长,也不会刻意掩盖自己的欠缺。谈成自己的不足而向他人求教不但不会降低了自己,反而可以表示出自己虚心和自信,赢得他人的青睐。比如,当一个领导对某个职员说“在技术上你是专家,我不如你,我要多向你学习”的时候,职员不但认为这个领导非常谦虚,也一定会对这个领导更加信任,因为他理解自己的能力。

在微软公司,大家在技术上互帮互学,在工作中互相鼓励,没有谁天天都摆出盛气凌人的架子,也没有谁自觉矮人一头,这就自然营造出了一种坦诚、开放的工作氛围。

有自知之明的人在工作遇到挫折的时候不会轻言失败,在工作取得成绩时也不会沾沾自喜。认识自我,准确定位自我价值的能力不仅仅可以帮助个人找到自己合适的空间及发展方向,也可以帮助企业建立起各司其职、协同工作的优秀团队。有自知之明的人让人感觉他是一个自信、谦虚、真诚的人。



同理心

同理心(Empathy)是一个比较抽象的心理学概念,但解释起来非常简单:同理心指的是人们常说的设身处地、将心比心的做法。也就是说,在发生冲突或误解的时候,当事人如果能把自己放在对方的处境中想一想,也许就可以更容易地了解对方的初衷,消除误解。我们在生活中常说“人同此心,心同此理”,就是这个道理。

人与人之间的关系没有固定的公式可循,要从关心别人、体谅别人的角度出发,做事时为他人留下空间和余地,发生误会时要替他人着想,主动反省自己的过失,勇于承担责任。只要有了同理心,我们在工作和生活中就能避免许多抱怨、责难、嘲笑和讥讽,大家就可以在一个充满鼓励、谅解、支持和尊重的环境中愉快地工作和生活。

对于软件企业中的管理者来说,体现同理心的最重要一点就是要体谅和重视职员的想法,要让职员们觉得你是一个非常在乎他们的领导。拿我自己来说,我在工作中不会盲目地褒奖下属,不会动不动就给职员一些“非常好”、“不错”、“棒极了”等泛泛的评价,但是我会在职员确实做出了成绩的时候及时并具体地指出他对公司的贡献,并将他的业绩公之于众。例如,我会给部门内的全体职员发电子邮件说某个员工在上一周的工作中取得了出色的成绩,并详细说明他的工作成果,列举他的工作对于公司的重要价值,给出具体的表彰意见。这种激励员工的方式能够真正赢得员工的信任和支持,能够对企业的凝聚力产生巨大的影响。

同理心也是一种了解和认识他人的有效方法。我被调到新部门担任领导职位的时候,部门中有400多名员工,我都不认识。于是,我每周选出了10名员工,与他们共进午餐。在午餐时,我详细了解了每一个人的姓名、履历、工作情况以及他们对部门工作的建议。这些信息对于一个部门领导来说非常重要。在午餐会后,我立即根据这10名员工对部门的建议,安排部署相关的工作,并给这10名员工一一发回反馈意见,告诉他们我的处理方法。我的计划是在一个不长的时间里,认识并了解部门中的每一位员工,并在充分听取员工意见的基础上合理地安排工作。


自律

自律(Self-Regulation)指的是自我控制和自我调整的能力。这包括:自我控制不安定的情绪或冲动,在压力面前保持清晰的头脑;以诚实赢得信任,并且随时都清晰地理解自己的行为将影响他人。

自律对于领导者来说更为重要。作为软件企业的领导,要管理别人,要让下属信服,就要先从自我做起。这是因为,领导的做法通常是大家做事的目标和榜样,领导的每一次举手投足都会给下属留下深刻的印象,如果处理不好的话,可能会造成负面的影响。特别是当公司或团队处于危急时刻,需要领导带领大家克服困难、冲出重围的时候,如果领导表现得比职员还要急躁,翻来覆去拿不定主意,大家就会对领导丧失信心,公司或团队也会因此而走向失败。

有一次,我见过公司里的两个组即将被合并。第一个组的经理缺少自律,开会时对他的队伍说合并不是他的决定,他自己也不知下一步该怎么办。这个经理对未来没有信心,并猜测自己的队伍可能会被裁员。而第二个组的经理则在合并后告诉他的队伍这次合并对公司的好处。他也坦诚地说自己并不掌握所有的信息,但是他承诺会提醒上级尽快地做决定。并且,第二个经理还告诉大家他会尽其所能,帮助每一个员工安排最合理、最公平的出路。最后的结果是,第一个组的人很快就散了,他们的经理离开了公司,而第二个组的经理接管了合并后的机构。

自律必须建立在诚信的基础上。为了表现所谓的“自律”而在他人面前粉饰、遮掩自己的缺点,刻意表演的做法是非常不可取的。只有在赢得他人信任的基础上,严于律己、宽以待人,才能真正获得他人的尊重和赞许。



人际关系

人际关系包括在社会交往中的影响力、倾听与沟通的能力,处理冲突的能力、建立关系、合作与协调的能力,说服与影响的能力等等。

有些人在人际交往中的影响力是与生俱来的,他们在参加酒会或庆典的时候,只要很短的时间就能和所有人交上朋友。但也有些人并不具备这样的天赋,他们在社交活动中常常比较内向,宁愿一个人躲在角落里也不愿主动与人交谈。

我个人就缺乏人际交往的倾向。以前,我并不认为这有什么不妥,直到我遇到了一位非常具有个人影响力的经理为止。那个经理没有超人的智慧,但是他自称他认识了公司中几乎每一个有能力的人,并和其中的许多人成为了非常要好的朋友。我不知道他是怎么做到这一点的,但我很快就发现,他的这种能力对公司非常有用。比如,我需要在公司内部选拔一些职员到我的部门工作时,我就可以从他那里获得许多有关该职员的详细信息;与公司其他部门协调工作时,他的人际关系网也可以发挥非常大的作用。从那时起,我发现处理人际关系的能力对于一个人,特别是一个领导者来说非常重要,我开始特别注重培养自己在人际关系方面的影响力。

在技术研究和开发方面,沟通和说服的能力也至关重要。比如,我们开发出了一项先进的技术,要把它变成公司的产品。这首先要说服公司的决策层。我们必须细心准备我们的产品建议书,并通过精彩的演讲和现场展示让领导者相信我们研究出的技术对公司来说大有裨益,让决策层认为即将开发的产品可以在市场上取得成功。这些工作都需要我们具备处理人际关系、展示自己、影响他人的能力。

 


从优秀到卓越


在著名企业管理学家吉姆·柯林斯的《从优秀到卓越》(中信出版社,2002年)一书中,作者通过大量的案例调查和统计,讨论并分析了一家企业或一位企业的领导者是如何从优秀(Good)上升到卓越(Great)的层次的。柯林斯和他的研究小组耗费了10.5个人年,阅读并系统整理了6000多篇文章,记录了2000多页的专访内容,对1435家企业进行了问卷调查,收集了28家公司过去50年甚至更早的信息,进行了大范围的定性和定量分析,得出了如何使公司和公司的管理者从优秀跨越到卓越的令人惊异而振奋的答案。

根据吉姆·柯林斯得出的结论,优秀的公司和优秀的领导者很多,许多公司都可以在各自的行业里取得不俗的业绩。但如果以卓越的标准来衡量公司和个人的成绩,那么,能够保持持续健康增长的企业和能够不断取得事业成功的领导者都非常少。一位企业的领导者在成功的基础上,要想进一步提高自己,使自己的企业保持持续增长,使自己的个人能力从优秀向卓越迈进,就必须努力培养自己在“谦虚”、“执著”和“勇气”这三个方面的品质。

谦虚使人进步。许多领导者在工作中唯我独尊,不能听取他人的规谏,不能容忍他人和自己意见相左,这些不懂得谦虚谨慎的领导者也许可以取得暂时的成功,但却无法在事业上不断进步,达到卓越的境界。这是因为,一个人的力量终究有限,在瞬息万变的商业环境中,领导者必须不断学习,善于综合他人的意见,否则就将陷入一意孤行的泥潭,被市场所淘汰。比尔·盖茨就是一个非常谦虚的人。例如,他在每一次演讲结束后,请撰写演讲稿的人分析一下他的演讲有哪些不足之处,以便下一次改进。

执着是指我们坚持正确方向,矢志不移的决心和意志。无论是公司也好,还是个人也好,一旦认明了工作的方向,就必须在该方向的指引下锲而不舍地努力工作。在工作中轻言放弃或者朝三暮四的做法都不能取得真正的成功。微软公司在Windows 95操作系统取得了巨大的成功之后,比尔·盖茨仍然坚持发展企业级的Windows NT和Windows 2000操作系统。这是因为,他看到了企业级市场的广阔前景和微软在此方面的巨大潜力。经过几年的发展,微软公司的企业级操作系统终于在原本被Unix统治的市场上取得了成功,现在,包括个人操作系统在内的所有Windows产品都已经被构建在了更加安全、可靠的Windows NT架构之上。


成功者需要有足够的勇气来面对挑战。任何事业上的成就都不是轻易就可以取得的。一个人想要在工作中出类拔萃,就必须面对各种各样的艰难险阻,必须正视事业上的挫折和失败。只有那些有勇气正视现实,有勇气迎接挑战的人才能真正实现超越自我的目标,达到卓越的境界。正如马克·吐温所说:“勇气不是缺少恐惧心理,而是对恐惧心理的抵御和控制能力。”



结论


很多人认为,在IT和其他高科技领域内,西方人表现得更为出色,因此中国人只有吸取西方的企业文化才能获得一席之地。的确,IT产业内的一些新观点、新理念,与中国古老的东方文化之间确实有差异(例如,西方文化直截了当的沟通和主动参与的意识)。

不过,从本文中我们不难发现,成功所需要的一些最重要、最基本的素质大多还是中华的传统美德。在故宫里,我看到“正大光明”的匾额,其含义也就是“诚信和正直”;“学无止境”、“人贵有自知之明”、“将心比心”、“严于律己、宽以待人”都是中国历来推崇的道德观;人际关系更是在西方人公认在中国成功的秘诀;而最重要的“谦虚”、“执著”、“勇气”这三点则是中国传统文化的直接体现。因此,我认为中国人的EQ决不低于西方人,我对中国卓越的人才无比乐观。

在今天这个充满机遇和挑战的时代里,在软件产业这个高速发展、不断创新的领域内,只有那些不懈努力、善于把握自己、勇于迎接挑战的人才能取得真正的成功。我个人衷心地希望中国高新技术产业能够在新世纪中蓬勃发展,中国的人才能够在事业上不断取得成功,实现从优秀到卓越的跨越。

posted @ 2006-12-14 14:20 重归本垒(Bing) 阅读(218) | 评论 (0)编辑 收藏
 

李开复2000年4月


今年5月23日,比尔·盖茨先生在《华尔街日报》上撰文,支持和敦促美国政府给予中国永久性正常贸易国待遇。文中,他特别谈到了在清华大学与中国大学生那次对话的愉快经历以及因此而留下的深刻印象。

这篇文章令我不禁想到,在中国的这两年来,我工作中最大的享受也是到国内各高校与学生们进行交流。这些访问和交流使得我有机会与成千上万的青年学生就他们所关心的事业、前途等问题进行面对面的沟通。中国学生的聪明、好学和上进给我留下了非常深刻的印象。

在与这些青年学生的交流过程中,我发现有一些问题是大家都十分关心的。那些已经获得国外大学奖学金的学生,大都希望我谈一谈应该如何度过自己在美国的学习生涯;那些决定留在国内发展的学生,非常关心如何确定一个正确的方向,并以最快的速度在科研和学业方面取得成功;还有那些刚刚踏进大学校门的学生,则希望我能讲给他们一些学习、做人的经验之谈。最近,更有一些学生关心网络信息产业的发展,希望了解美国的大学生是如何创业和致富的。

看到这么多双渴求知识、充满希望的眼睛,我突然产生了一种冲动,那就是给中国的学生们写一封信,将我与同学们在交流过程中产生的一些想法以及我要对中国学生的一些忠告写出来,帮助他们在未来的留学、工作或者创业的过程中能够人格更完美、生活更顺利,事业更成功。



坚守诚信、正直的原则


我在苹果公司工作时,曾有一位刚被我提拔的经理,由于受到下属的批评,非常沮丧地要我再找一个人来接替他。我问他:“你认为你的长处是什么?”他说,“我自信自己是一个非常正直的人。”我告诉他:“当初我提拔你做经理,就是因为你是一个公正无私的人。管理经验和沟通能力是可以在日后工作中学习的,但一颗正直的心是无价的。”我支持他继续干下去,并在管理和沟通技巧方面给予他很多指点和帮助。最终,他不负众望,成为一个出色的管理人才。现在,他已经是一个颇为成功的公司的首席技术官。

与之相反,我曾面试过一位求职者。他在技术、管理方面都相当的出色。但是,在谈论之余,他表示,如果我录取他,他甚至可以把在原来公司工作时的一项发明带过来。随后他似乎觉察到这样说有些不妥,特作声明:那些工作是他在下班之后做的,他的老板并不知道。这一番谈话之后,对于我而言,不论他的能力和工作水平怎样,我都肯定不会录用他。原因是他缺乏最基本的处世准则和最起码的职业道德“诚实”和“讲信用”。如果雇用这样的人,谁能保证他不会在这里工作一段时间后,把在这里的成果也当作所谓“业余之作”而变成向其它公司讨好的“贡品”呢?这说明:一个人品不完善的人是不可能成为一个真正有所作为的人的。

在美国,中国学生的勤奋和优秀是出了名的,曾经一度是美国各名校最欢迎的留学生群体。而最近,却有一些学校和教授声称,他们再也不想招收中国学生了。理由很简单,某些中国学生拿着读博士的奖学金到了美国,可是,一旦找到工作机会,他们就会马上申请离开学校,将自己曾经承诺要完成的学位和研究抛在一边。这种言行不一的做法已经使得美国相当一部分教授对中国学生的诚信产生了怀疑。应该指出,有这种行为的中国学生是少数,然而就是这样的“少数”,已经让中国学生的名誉受到了极大的损害。另外,目前美国有很多教授不理会大多数中国学生的推荐信,因为他们知道这些推荐信根本就出自学生自己之手,已无参考性可言。这也是诚信受到损害以后的必然结果。

我在微软研究院也曾碰到过类似的问题。一位来这里实习的学生,有一次出乎意料地报告了一个非常好的研究结果。但是,他做的研究结果别人却无法重复。后来,他的老板才发现,这个学生对实验数据进行了挑选,只留下了那些合乎最佳结果的数据,而舍弃了那些“不太好”的数据。我认为,这个学生永远不可能实现真正意义的学术突破,也不可能成为一名真正合格的研究人员。

最后想提的是一些喜欢贪小便宜的人。他们用学校或公司的电话打私人长途、多报销出租车票。也许有人认为,学生以成绩、事业为重,其它细节只是一些小事,随心所欲地做了,也没什么大不了的。然而,就是那些身边的所谓“小事”,往往成为一个人塑造人格和积累诚信的关键。一些贪小便宜、耍小聪明的行为只会把自己定性为一个贪图小利、没有出息的人的形象,最终因小失大。对于这些行为,一言以敝之,就是“勿以恶小而为之”。



生活在群体之中

与大多数美国学生比较而言,中国学生的表达能力、沟通能力和团队精神要相对欠缺一些。这也许是由于文化背景和教育体制的不同而造成的。今天,当我们面对一个正在走向高度全球化的社会时,生活在群体之中,做出更好的表现,得到更多的和收获,是尤为重要的。

表达和沟通的能力是非常重要的。不论你做出了怎样优秀的工作,不会表达,无法让更多的人去理解和分享,那就几乎等于白做。所以,在学习阶段,你不可以只生活在一个人的世界中,而应当尽量学会与各阶层的人交往和沟通,主动表达自己对各种事物的看法和意见,甚至在公众集会时发表演讲,锻炼自己的表达能力。

表达能力绝不只是你的“口才”。哈佛大学的Ambady教授最近做过一个非常有趣的实验,他让两组学生分别评估几位教授的授课质量。他把这几位教授的讲课录像带先无声地放两秒钟给一组学生看,得出一套评估结果。然后与那些已经听过这几位教授几个月讲课的学生的结果进行对比,两个小组的结论竟然惊人的相似。这表明,在表达自己思想的过程中,非语言表达方式和语言同样重要,有时作用甚至更加明显。这里所讲的非语言表达方式是指人的仪表、举止、语气、声调和表情等。因为从这些方面,人们可以更直观、更形象地判断你为人、做事的能力,看出你的自信和热情,从而获得十分重要的“第一印象”。

对于一个集体、一个公司、甚至是一个国家,团队精神都是非常关键性的。微软公司在美国以特殊的团队精神著称。象Windows 2000这样产品的研发,微软公司有超过3000名开发工程师和测试人员参与,写出了5000万行代码。没有高度统一的团队精神,没有全部参与者的默契与分工合作,这项工程是根本不可能完成的。

相对来说,以前我在别的公司时也曾见到这样的现象。一项工程布置下来,大家明明知道无法完成,但都心照不宣,不告诉老板。因为反正也做不完,大家索性也不努力去做事,却花更多的时间去算计怎么把这项工程的失败怪罪到别人身上去。就是这些人和这样的工作作风几乎把这家公司拖垮。

为了培养团队精神,我建议同学们在读书之余积极参加各种社会团体的工作。在与他人分工合作、分享成果、互助互惠的过程中,你们可以体会团队精神的重要性。

在学习过程中,你千万不要不愿意把好的思路、想法和结果与别人分享,担心别人走到你前面的想法是不健康的,也无助于你的成功。有一句谚语说,“你付出的越多,你得到的越多”。试想,如果你的行为让人觉得“你的是我的,我的还是我的”,当你需要帮忙时,你认为别人会来帮助你吗?反之,如果你时常慷慨地帮助别人,那你是不是会得到更多人的回报?

在团队之中,要勇于承认他人的贡献。如果借助了别人的智慧和成果,就应该声明。如果得到了他人的帮助,就应该表示感谢。这也是团队精神的基本体现。


做一个主动的人

三十年前,一个工程师梦寐以求的目标就是进入科技最领先的IBM。那时IBM对人才的定义是一个有专业知识的、埋头苦干的人。斗转星移,事物发展到今天,人们对人才的看法已逐步发生了变化。现在,很多公司所渴求的人才是积极主动、充满热情、灵活自信的人。

作为当代中国的大学生,你应该不再只是被动地等待别人告诉你应该做什么,而是应该主动去了解自己要做什么,并且规划它们,然后全力以赴地去完成。想想今天世界上最成功的那些人,有几个是唯唯诺诺、等人吩咐的人?对待自己的学业和研究项目,你需要以一个母亲对孩子那样的责任心和爱心全力投入不断努力。果真如此,便没有什么目标是不能达到的。

一个积极主动的人还应该虚心听取他人的批评和意见。其实,这也是一种进取心的体现。不能虚心接受别人的批评,并从中汲取教训,就不可能有更大的进步。比尔·盖茨曾经对公司所有员工说过:“客户的批评比赚钱更重要。从客户的批评中,我们可以更好地汲取失败的教训,将它转化为成功的动力。”

除了虚心接受别人的批评,你还应该努力寻找一位你特别尊敬的良师。这位良师应该是直接教导你的老师以外的人,这样的人更能客观地给你一些忠告。这位良师除了可以在学识上教导你之外,还可以在其它一些方面对你有所指点,包括为人处世,看问题的眼光,应对突发事件的技能等等。我以前在苹果公司负责一个研究部门时,就曾有幸找到这样一位良师。当时,他是负责苹果公司全球运作和生产业务的高级副总裁,他在事业发展方面给我的许多教诲令我终身受益。如果有这样的人给你帮助,那你成长的速度一定会比别人更快一些。

中国学生大多比较含蓄、害羞,不太习惯做自我推销。但是,要想把握住转瞬即逝的机会,就必须学会说服他人、向别人推销自己或自己的观点。在说服他人之前,要先说服自己。你的激情加上才智往往折射出你的潜力,这就是人们常说的化学反应。一般来说,一个好的自我推销策略可以令事情的发展锦上添花。

例如,有一次我收到了一份很特殊的求职申请书。不同于已往大多数求职者,这位申请人的求职资料中包括了他的自我介绍、他对微软研究院的向往、以及他为什么认为自己是合适的人选,此外还有他已经发表的论文、老师的推荐信和他希望来微软作的课题等。尽管他毕业的学校不是中国最有名的学校,但他的自我推销奏效了。我从这些文件中看到了他的热情和认真。在我面试他时,他又递交了一份更充分的个人资料。最后,当我问他有没有问题要问我时,他反问我,:“你对我还有没有任何的保留?”当时,我的确对他能否进入新的研究领域有疑虑,于是就进一步问了他一些这方面的问题。他举出了两个很有说服力的例子。最后,我们雇用了这名应聘者。他现在做得非常出色。



挑战自我、开发自身潜力


我在苹果公司工作的时候,有一天,老板突然问我什么时候可以接替他的工作?我非常吃惊,表示自己缺乏象他那样的管理经验和能力。但是他却说,这些经验是可以培养和积累的,而且他希望我在两年之后就可以做到。有了这样的提示和鼓励,我开始有意识地加强自己在这方面的学习和实践。果然,我真的在两年之后接替了他的工作。我个人认为:一个人的领导素质对于他将来的治学、经商或从政都是十分重要的。在任何时候、任何环境里,我们都应该有意识地培养自己的领导才能。同时, 我建议你给自己一些机会展示这方面的能力,或许象我一样,你会惊讶自己在这一方面的潜力远远超过了想象中那样。

给自己设定目标是一件十分重要的事情。目标设定过高固然不切实际,但是目标千万不可定得太低。在二十一世纪,竞争已经没有疆界,你应该放开思维,站在一个更高的起点,给自己设定一个更具挑战性的标准,才会有准确的努力方向和广阔的前景,切不可做“井底之蛙”。另外,只在一所学校取得好成绩、好名次就认为自己已经功成名就是可笑的,要知道,山外有山,人上有人,而且,不同地方的衡量标准又不一样。所以,在订立目标方面,千万不要有“宁为鸡首,不为牛后”的思想。

一个一流的人与一个一般的人在一般问题上的表现可能一样,但是在一流问题上的表现则会有天壤之别。美国著名作家威廉·福克纳说过:“不要竭尽全力去和你的同僚竞争。你更应该在乎的是:你要比现在的你更强。”你应该永远给自己设立一些很具挑战性、但并非不可及的目标。

在确立将来事业的目标时,不要忘了扪心自问:“这是不是我最热爱的专业?我是否愿意全力投入?”我希望你们能够对自己选择所从事的工作充满激情和想象力,对前进途中可能出现的各种艰难险阻无所畏惧。谈到对工作的热爱,我认识的一位微软的研究员曾经让我深有感触。他经常周末开车出门说去见“女朋友”,后来,一次偶然机会我在办公室里看见他,问他“女朋友在哪里?”他笑着指着电脑说:“就是她呀。”对于工作的热爱,比尔·盖茨也曾有过非常精彩的阐述,他说:“每天早晨醒来,一想到所从事的工作和所开发的技术将会给人类生活带来的巨大影响和变化,我就会无比兴奋和激动。”

几个月前,《北京青年报》上曾有一场探讨比尔·盖茨和保尔·柯察金谁更伟大的讨论。由于从小在美国长大,我并不知道保尔和他的那些事迹。但是,我非常赞同保尔的这段名言:“人最宝贵的东西是生命,生命属于我们只有一次。人的一生应当这样度过,当他回首往事的时候,不因虚度年华而悔恨,也不因碌碌无为而羞耻……”所以,选择一个你真心热爱的事业,不断地挑战自我、完善自我,让自己的一生过得精彩和充实。


客观、直接了当的沟通


有一次,一位中国的大学教授找到我,希望我帮他找一位国外的专家在他组织的会议上去作主题演讲,末了还特意加了一句,最好是一个洋人。我很不以为然地对他说:“这个领域最具权威的人士就是在北京的一个中国人,为什么你一定要找一位洋人呢?”他表面上同意我的说法,但是他仍然请了一个美国人来作这个演讲,结果效果很差。所以,我们不应该陷入盲目的崇洋情结。我们应该用客观的眼光来判断事物,而不是以他的肤色或他的居住地来决定。

有一句话说,“真理总是掌握在少数人手中”。我们理解这句话的意思,应该有自己的眼光,有独立思考的能力,不一定大多数人认可的,或某个权威说的,就是对的。不论是作学问、搞研究还是经商,我们都不能盲从,要多想几个为什么。

有了客观的意见,你就应该直接了当地表达。如果做任何事情都象“打太极拳”,会让人不知所云,也会造成很多误会。有一次,在微软研究院工作的一位研究人员就自己所选择的研究方向来征求我的意见,我作了一番分析,认为这个方向有不少问题,我个人认为对学术界的贡献不大,但如果他坚持,我愿意支持他试着去做。结果他认为我这句话的意思实际上就是不允许他去做,所以他就选择了其它的方向。后来他要出差时,负责行政事务的人告诉他,你可以选择坐火车或者坐飞机。他认为行政人员实际上是在暗示他坐火车,因为坐飞机太贵。其实,他的猜测都是错误的。因为我们的沟通方式是直接了当,而他却在“打太极拳”。这之后,我们通过一系列的公司文化讲座,让员工们了解到:心里想什么就讲什么,不要把简单的问题复杂化。现在,研究院里这类的误会少了很多。

拐弯抹角,言不由衷,结果浪费了大家的宝贵时间。瞻前顾后,生怕说错话,结果是变成谨小慎微的懦夫。更糟糕的是还有些人,当面不说,背后乱讲,这样对他人和自己都毫无益处,最后只能是破坏了集体的团结。这样的人和作风既不能面对社会,也不可能在科学研究中走出新路,更不可能在激烈的商战中脱颖而出。

希望同学们能够做到开诚布公,敢于说“不”,这才是尊重自己思想意愿的表现。当然,在表达你的意见时,无论反对和批评都应是建设性的,有高度诚意的,而不是为批评而批评,为辩论而批评。我赞成的方式是提供建设性的正面的意见。在开始讨论问题时,任何人先不要拒人千里之外,大家把想法都摆在桌面上,充分体现个人的观点,这样才会有一个容纳大部分人意见的结论。当然,你也要学习用适当的方法和口气表达你的意见,比如说不要在很多人面前让别人难堪。这样,你的批评才会奏效。


珍惜校园学习生活


几天前,报纸上登出一条消息,说有中学生辍学去开网络公司。我认为这并不值得提倡。对绝大多数学生来讲,在校生活是系统地学习基础理论知识,学习思考和解决问题方式的好机会。这些知识将成为你未来发展过程中所需要的最基本的知识和技能。就象建一栋高楼,如果不打好基础是经不起风吹雨打的。

在全球范围内,美国的研究水平无疑是世界一流的。而除了美国之外,你会发现英国的研究水平也是相当突出的。究其原因,其实就是语言问题。英国人可以毫无阻碍地阅读美国乃至全球各种最新的英文研究报告和资料。这对于他们把握研究方向,跟踪最新进展,发表研究成果都有很大的帮助。因此,英语学习对于我们作研究的人来说,也是相当重要的。只有加强这方面素质的培养,才能适应将来的发展。我建议:学英语先学听说,再学读写,而且务必在大学阶段完全解决英语学习的问题。等到年龄大了,要付出的代价相比就会大得多。

除了英语之外,数学、统计学对理工科学生也是很重要的基础课程,是不可忽视的。数学是人类几千年的智慧结晶,你们一定要用心把它学好,不能敷衍了事。我今天就很后悔自己当初没有花更多功夫把数学学得更好些。另外,计算机应用、算法和编程也都是每一个工科学生应该熟悉和掌握的,它们是将来人人必须会用的工具。

科技的发展可谓日新月异。在校学习的目的,其实就是掌握最基本的学习工具和方法。将来利用这些工具和方法,再去学习新的东西。比如:上课学会了C++, 能否自己学会Java? 上课学会了HTML, 能否自己学会XML? 与其说上大学是为了学一门专业,不如说是为了学会如何学习,让自己能够“无师自通”。

大学毕业后的前两年,同学们聚到一起,发现变化都还不算大。五年后再聚到一起,变化就大多了。一些人落伍了,因为他们不再学习,不再能够掌握新的东西,自然而然地落在了社会发展的后面。如果我们要在这个竞争激烈的社会中永不落伍,那就得永远学习。

我的老板 - Rick Rashid博士是目前微软公司主管研究的高级副总裁,他已经功成名就,却始终保持着一颗学习和进取的心。现在,他每年仍然编写大约50,000行程序。他认为:用最新的技术编程可以使他保持对计算机最前沿技术的敏感,使自己能够不断进步。今天,有些博士生带着低年级的本科生和硕士生做项目,就自满地认为自己已经没有必要再编程了。其实,这样的做法是很不明智的。

每次到清华和其它学校访问,被问到最多的就是学生打工的问题。我认为,打工从总体来说对学生是一件好事,是拓宽视野的一种方式。例如:在研究机构打工,可以学到最新的科技;在产品部门打工,可以学到开发的技术和技能;在市场部门打工,可以理解商业的运作。我认为每一个学生都应该有打工的经验,但不要打一些“没用的工”。首先要明白打工只是学生生活中的一种补充,学习才是最重要的。打工的目的是开阔眼界,不是提前上班。如果你把翻译书本、录入数据库所花的时间投入学习,将来可以赚更多的钱。那些钱将远远超出目前打工的收入。


此外,还有一些学生受到目前退学创业的鼓励,为成为中国的比尔·盖茨和迈克尔·戴尔而中途辍学。以我的观点,除了十分特殊的情况,我不建议在校学生退学创业。你所看到的那些退学创业的成功者实际上少之又少。目前,大部分学生虽有创业的想法,但缺少创业的经验,所以失败的可能性非常大。如果要成功,我建议你们先把书读好。如果是要学习创业的经验,你完全可以利用假期的时间先去一间公司边打工边学。比尔·盖茨也曾说过,“如果你正在考虑自己成立一家新公司,你应该首先明确地知道:创办公司需要巨大的精力投入,要冒巨大的风险。我觉得你们不必象我,一开始就创办一家公司。你应该考虑加盟其他公司并在这家公司中学习他们的工作、创业方法。”


你想戴一顶什么样的博士帽

在我进入卡内基梅隆大学攻读计算机博士学位时,系主任曾对我讲,当你拿到你的博士学位时,你应该成为你所从事的研究领域里世界第一的专家。这句话对于初出茅庐的我来说简直高不可攀,但也让我踌躇满志、跃跃欲试。就这样,在经过五年寒窗、夜以继日的努力工作后,他所期待的结果就那么自然而然地出现了。一个打算攻读博士学位的人,就应该给自己树立一个很高的目标。如果没有雄心壮志,就千万不要自欺欺人,也许经商或从事其它工作,会有更大的成绩。

在目标确立之后,我建议你为自己设计一个三年的学习和科研计划。首先,你需要彻底地了解在相关领域他人已有的工作和成绩。然后再提出自己的想法和见解,做脚踏实地的工作。另外,还要不断跟踪这个领域的最新研究进展。只有这样,才可以把握好方向,避免重复性工作,把精力集中在最有价值的研究方向上。

在学术界,人们普遍认为“名师出高徒”。可见导师在你的成长道路中作用是多么的大。所以,你应该主动去寻找自己所研究的领域里最好的老师。除了你的老师之外,你还应该去求教于周围所有的专家。更不要忘了常去求教“最博学的老师”- Internet!现在,几乎所有的论文、研究结果、先进想法都可以在网上找到。我还鼓励你直接发电子邮件去咨询一些世界公认的专家和教授。以我的经验,对于这样的邮件,他们中的大部分都会很快给你回复。

我在攻读博士学位时,每周工作七天,每天工作16个小时,大量的统计结果和分析报告几乎让我崩溃。那时,同领域其他研究人员采用的是与我不同的传统方法。我的老师虽然支持我,但并不认可我的研究方向。我也曾不止一次地怀疑自己的所作所为是否真的能够成功。但终于有一天,在半夜三点时做出的一个结果让我感受到了成功的滋味。后来,研究有了突飞猛进的进展,导师也开始采用我的研究方法。我的博士论文使我的研究成为自然语言研究方面当时最有影响力的工作之一。读博士不是一件轻松的事,切忌浮躁的情绪,而要一步一个脚印,扎扎实实地工作。也不可受一些稍纵即逝的名利的诱惑,而要200%的投入。也许你会疲劳,会懊悔,会迷失方向,但是要记住,你所期待的成功和突破也正孕育其中。那种一切都很顺利,谁都可以得到的工作和结果,我相信研究价值一定不高。

从一定意义上讲,一个人如果打算一辈子从事研究工作,那么从他在读博士学位期间所形成的做事习惯、研究方法和思维方式基本上就可以判断出他未来工作的轮廓。所以,你一定要做一个“有心人”,充分利用在校的时间,为自己的将来打好基础。

上述一些观点,是我在与同学们交往过程中的一些感受。我希望这些建议和想法能对正在未来之路上跋涉的你们有所启发,能对你们目前的学习有所帮助。或许因为观点不同、人各有志,或许因为忠言逆耳,这封信可能无法为每一位同学所接受。但是只要一百位阅读这封信的同学中有一位从中受益,这封信就已经比我所作的任何研究都更有价值。我真诚地希望,在新的世纪,中国学生无论是在国内,还是国外;无论是做研究,还是经商,都显得更成熟一些,成功的机率更大一些。

posted @ 2006-12-14 14:14 重归本垒(Bing) 阅读(196) | 评论 (0)编辑 收藏
 
1.RequestDispatcher.forward()
是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在b.jsp都可以获得,参数自动传递.
但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面.

  重定向后浏览器地址栏URL不变.

例:在servlet中进行重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{

    response.setContentType("text/html; charset=gb2312");

    ServletContext sc = getServletContext();

    RequestDispatcher rd = null;

    rd = sc.getRequestDispatcher("/index.jsp");   //定向的页面

    rd.forward(request, response);

}
通常在servlet中使用,不在jsp中使用。

2.response.sendRedirect()
  是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.
  重定向后在浏览器地址栏上会出现重定向页面的URL。

sendRedirect()实际上是reponse.setStatus(302)的快捷方式,后者用于设置Http响应的状态代码。


例:在servlet中重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)

    throws ServletException,IOException

{

    response.setContentType("text/html; charset=gb2312");

    response.sendRedirect("/index.jsp");

}
由于response是jsp页面中的隐含对象,故在jsp页面中可以用response.sendRedirect()直接实现重定位。
注意:
(1).使用response.sendRedirect时,前面不能有HTML输出。
这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制,一般在8K(我是说JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。
(2).response.sendRedirect之后,应该紧跟一句return;
我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。
比较:
(1).Request Dispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
(2).response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。
前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法.

注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。

3.<jsp:forward page="" />

它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。


如果在<jsp:forward>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。
另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交

4.JSP中实现在某页面停留若干秒后,自动重定向到另一页面
在html文件中,下面的代码:
  <meta http-equiv="refresh" content="300; url=target.jsp">
  它的含义:在5分钟之后正在浏览的页面将会自动变为target.html这一页。代码中300为刷新的延迟时间,以秒为单位。targer.html为你想转向的目标页,若为本页则为自动刷新本页。
  由上可知,可以通过setHeader来实现某页面停留若干秒后,自动重定向到另一页面。
  关键代码:
      String content=stayTime+";URL="+URL;
      response.setHeader("REFRESH",content);
 

posted @ 2006-12-14 09:44 重归本垒(Bing) 阅读(279) | 评论 (0)编辑 收藏
 
一 热诚的态度 我们的态度决定了我们的未来一个人能否成功,取决了他的态度!
  成功人士与失败之间的判别是:
  成功人士始终有最热诚的态度最积极的思考,最乐观的精神和最辉煌的以经验支配和控制自己的人生,失败者则相反,他们的人生是受过人生的种种失败怀疑虑所引导和支配。 我们的态度决定了我们人生的成功

  1,我们怎样对待生活,生活就怎样对待我们。
  2,我们怎样对待别人,别人怎样对待我们。
  3,我们在一项任务刚开始时的态度就决定了最后的多大成功。

  我们的环境---心里的\感情的\精神的\----完全由我们自己的态度来创造。

二 目标明确\目标管理

  1目标明确

  没有线路图什么地方也去不了。
  目标就是构筑成功的砖石。
  目标使我们产生积极性,你给自己定了目标,有两个方面的作用:一是你努力的依据二是你的鞭策。目标给你一个看得着的射击靶,随着你努力去实现这些目标,你就会有成就感。有9 8%的人对心目中的世界没有一幅清晰的图画。如果计划不具体,无法衡量是否实现了----那会降低了你的积极性。

  2目标管理

  把整体目标分解成一个个易记的目标把你的目标象成一金字塔,塔顶就是你的人生目标,你定的目标和为达目标而做的每一件事都必须指向你的人生目标。
  金字塔由五层组成,最上的一层最小,最核心的。这一层包含着你的人生总目标。
  下面每层是为实现上一层较大目标而要达到的较小目标。

三 一勤天下无难事

  一心向着自己目标前进的人,整个世界都给他让路。

四 擅于理财、预算时间和金钱

五 喜欢运动

  健康的体魄是成就事业的资本。成功人士几乎都有自己喜欢的体育项目。

六 自律

  自控能力的强弱对人生的成功也有很大的影响。

  1 当你生气时,你能沉默不语吗?
  2 你习惯于三思而行吗?
  3 你的性情一般是平和的吗?
  4 你习惯让你的情绪控制你的理智。

七 谦虚好学

  1 你是否把不断的学习更多的知识作为你的职责?
  2 你是否有一种习惯:对你所不熟悉的问题发表"意见"?
  3 当你需要知识时,你知道如何寻找吗?

  越是成功的人,他们越会抓住一切可以学习的机会。

八 良好的人际关系

  成功意味着别人的参与

九 信念

十 立即行动
  有了价值连城的目标计划,成功已向你展示。有位先生几年以来一直暗恋着某位小姐,可是,连续几年过去了,他一直没有采取任何行动,他一直在等待,直到那位小姐成为他人之妻,他紧张起来,但是为时已晚! 别再犹豫,请立即行动吧!

posted @ 2006-12-14 09:26 重归本垒(Bing) 阅读(228) | 评论 (0)编辑 收藏
 
李开复
2004年5月
此前,我和中国学生的多次交流都是围绕如何达到优秀和卓越、如何成为领导人才而展开的。最近,在新浪网的聊天室和我收到的许多电子邮件中,我发现更多的中国学生需要知道的不是如何从优秀到卓越,而是如何从迷茫到积极、从失败到成功、从自卑到自信、从惆怅到快乐、从恐惧到乐观。

一个极端的例子是2004年2月发生在云南大学的马加爵事件。马加爵残忍地杀害了自己的4名同学。但从马家爵被捕后与心理学家的对话内容看来,他应该不是一个邪恶的人,而是一个迷失方向、缺乏自信、性格封闭的孩子。他和很多大学生一样,迫切希望知道如何才能获得成功、自信和快乐。

我这一封信是写给那些渴望成功但又觉得成功遥不可及,渴望自信却又总是自怨自艾,渴望快乐但又不知快乐为何物的学生看的。希望这封信能够带给读者一个关于成功的崭新定义,鼓励读者认识和肯定自己,做一个快乐的人。也希望这封信能够帮助读者理解成功、自信、快乐是一个良性循环:从成功里可以得到自信和快乐,从自信里可以得到快乐和成功,从快乐里可以得到成功和自信。

成功就是成为最好的你自己
美国作家威廉·福克纳说过:“不要竭尽全力去和你的同僚竞争。你应该在乎的是,你要比现在的你强。”

中国社会有个通病,就是希望每个人都照一个模式发展,衡量每个人是否“成功”采用的也是一元化的标准:在学校看成绩,进入社会看名利。尤其是在今天的中国,人们对财富的追求首当其冲,各行各业,对一个人的成功的评价,更多地以个人财富为指标。但是,有了最好的成绩就能对社会有所贡献吗?有名利就一定能快乐吗?

真正的成功应是多元化的。成功可能是你创造了新的财富或技术,可能是你为他人带来了快乐,可能是你在工作岗位上得到了别人的信任,也可能是你找到了回归自我、与世无争的生活方式。每个人的成功都是独一无二的。所以,凌志军在其《成长》一书中得出的重要结论是“成为最好的你自己”。也就是说,成功不是要和别人相比,而是要了解自己,发掘自己的目标和兴趣,努力不懈地追求进步,让自己的每一天都比昨天更好。

成功的第一步:把握人生目标,做一个主动的人
在新浪聊天室里,当网友问我的人生目标是什么时,我是这么回答的:“人生只有一次,我认为最重要的就是要有最大的影响力(impact),能够帮助自己、帮助家庭、帮助国家、帮助世界、帮助后人,能够让他们的日子过得更好、更有效率,能够为他们带来幸福和快乐。”我回答这个问题时丝毫不需要思考,因为我从大学二年级起就把“影响力”当作自己的人生目标。

对我来说,人生目标不是一个口号,而是我最好的智囊,它曾多次帮我解决工作和生活中的难题。我当初放弃在美国的工作,只身来到中国创立微软中国研究院,就是因为我觉得后一项工作有更大的影响力,和我的人生目标更加吻合。此外,当我收到一封封迷茫学生的来信,给他们写回信时,我也会想:“如何让回信有更大的影响力?”我先后公开的三封“给中国学生的信”都是如此诞生的。

马加爵也悟出了他的人生目标,只可惜他是在案发被捕后才悟出的。他说:“姐,现在我对你讲一次真心话,我这个人最大的问题就是出在我觉得人生的意义到底是为了什么?……在这次事情以后,此时此刻我明白了,我错了。其实人生的意义在于人间有真情。”如果马加爵能早几个月悟出人生目标,他在做傻事前就会问问自己,充满真情的父母、姐姐会怎么看待这件事?这样,他可能就不会走上歧途了。

所以,无论是为了真情,为了影响力,还是为了快乐、家人、道德、宁静、求知、创新……一旦确定了人生目标,你就可以像我一样在人生目标的指引下,果断地做出人生中的重大决定。每个人的人生目标都是独特的。最重要的是,你要主动把握自己的人生目标。但你千万不能操之过急,更不要为了追求所谓的“崇高”,或为了模仿他人而随便确定自己的目标。

那么,该怎么去发现自己的目标呢?许多同学问我他们的目标该是什么?我无法回答,因为只有一个人能告诉你人生的目标是什么,那个人就是你自己。只有一个地方你能找到你的目标,那就是你心里。

我建议你闭上眼睛,把第一个浮现在你脑海里的理想记录下来,因为不经过思考的答案是最真诚的。或者,你也可以回顾过去,在你最快乐、最有成就感的时光里,是否存在某些共同点?它们很可能就是最能激励你的人生目标了。再者,你也可以想象一下,十五年后,当你达到完美的人生状态时,你将会处在何种环境下?从事什么工作?其中最快乐的事情是什么?当然,你也不妨多和亲友谈谈,听听他们的意见。

成功的第二步:尝试新的领域、发掘你的兴趣
为了成为最好的你自己,最重要的是要发挥自己所有的潜力,追逐最感兴趣和最有激情的事情。当你对某个领域感兴趣时,你会在走路、上课或洗澡时都对它念念不忘,你在该领域内就更容易取得成功。更进一步,如果你对该领域有激情,你就可能为它废寝忘食,连睡觉时想起一个主意,都会跳起来。这时候,你已经不是为了成功而工作,而是为了“享受”而工作了。毫无疑问的,你将会从此得到成功。

相对来说,做自己没有兴趣的事情只会事倍功半,有可能一事无成。即便你靠着资质或才华可以把它做好,你也绝对没有释放出所有的潜力。因此,我不赞同每个学生都追逐最热门的专业,我认为,每个人都应了解自己的兴趣、激情和能力(也就是情商中所说的“自觉”),并在自己热爱的领域里充分发挥自己的潜力。

比尔·盖茨曾说:“每天清晨当你醒来的时候,都会为技术进步给人类生活带来的发展和改进而激动不已。”从这句话中,我们可看出他对软件技术的兴趣和激情。1977年,因为对软件的热爱,比尔·盖茨放弃了数学专业。如果他留在哈佛继续读数学,并成为数学教授,你能想象他的潜力将被压抑到什么程度吗?2002年,比尔·盖茨在领导微软25年后,却又毅然把首席执行官的工作交给了鲍尔默,因为只有这样他才能投身于他最喜爱的工作——担任首席软件架构师,专注于软件技术的创新。虽然比尔·盖茨曾是一个出色的首席执行官,但当他改任首席软件架构师后,他对公司的技术方向做出了重大贡献,更重要的是,他更有激情、更快乐了,这也鼓舞了所有员工的士气。

比尔·盖茨的好朋友,世界第二富人华伦·巴菲特也同样认可激情的重要性。当学生请他指示方向时,他总这么回答:“我和你没有什么差别。如果你一定要找一个差别,那可能就是我每天有机会做我最爱的工作。如果你要我给你忠告,这这是我能给你的最好忠告了。”

比尔·盖茨和华伦·巴菲特给我们的另一个启示是,他们热爱的并不是庸俗的、一元化的名利,他们的名利是他们的理想和激情带来的。美国一所著名的经管学院曾做过一个调查,结果发现,虽然大多数学生在入学时都想追逐名利,但在拥有最多名利的校友中,有90%是入学时追逐理想、而非追逐名利的人。

我刚进入大学时,想从事法律或政治工作。一年多后我才发现自己对它没有兴趣,学习成绩也只在中游。但我爱上了计算机,每天疯狂地编程,很快就引起了老师、同学的重视。终于,大二的一天,我做了一个重大的决定:放弃此前一年多在全美前三名的哥伦比亚大学法律系已经修成的学分,转入哥伦比亚大学默默无名的计算机系。我告诉自己,人生只有一次,不应浪费在没有快乐、没有成就感的领域。当时也有朋友对我说,改变专业会付出很多代价,但我对他们说,做一个没有激情的工作将付出更大的代价。那一天,我心花怒放、精神振奋,我对自己承诺,大学后三年每一门功课都要拿A。若不是那天的决定,今天我就不会拥有在计算机领域所取得的成就,而我很可能只是在美国某个小镇上做一个既不成功又不快乐的律师。

即便如此,我对职业的激情还远不能和我父亲相比。我从小一直以为父亲是个不苟言笑的人,直到去年见到父亲最喜爱的两个学生(他们现在都是教授),我才知道父亲是多么热爱他的工作。他的学生告诉我:“李老师见到我们总是眉开眼笑,他为了让我们更喜欢我们的学科,常在我们最喜欢的餐馆讨论。他在我们身上花的时间和金钱,远远超过了他微薄的收入。”我父亲是在70岁高龄,经过从军、从政、写作等职业后才找到了他的最爱——教学。他过世后,学生在他抽屉里找到他勉励自己的两句话:“老牛明知夕阳短,不用扬鞭自奋蹄。”最令人欣慰的是,他在人生的最后一段路上,找到了自己的最爱。

那么,如何寻找兴趣和激情呢?首先,你要把兴趣和才华分开。做自己有才华的事容易出成果,但不要因为自己做得好就认为那是你的兴趣所在。为了找到真正的兴趣和激情,你可以问自己:对于某件事,你是否十分渴望重复它,是否能愉快地、成功地完成它?你过去是不是一直向往它?是否总能很快地学习它?它是否总能让你满足?你是否由衷地从心里(而不只是从脑海里)喜爱它?你的人生中最快乐的事情是不是和它有关?当你这样问自己时,注意不要把你父母的期望、社会的价值观和朋友的影响融入你的答案。

如果你能明确回答上述问题,那你就是幸运的,因为大多数学生在大学四年里都在摸索或悔恨。如果你仍未找到这些问题的答案,那我只有一个建议:给自己最多的机会去接触最多的选择。记得我刚进卡内基·梅隆的博士班时,学校有一个机制,允许学生挑老师。在第一个月里,每个老师都使尽全身解数吸引学生。正因为有了这个机制,我才幸运地碰到了我的恩师瑞迪教授,选择了我的博士题目“语音识别”。虽然并不是所有学校都有这样的机制,但你完全可以自己去了解不同的学校、专业、课题和老师,然后从中挑选你的兴趣。你也可以通过图书馆、网络、讲座、社团活动、朋友交流、电子邮件等方式寻找兴趣爱好。唯有接触你才能尝试,唯有尝试你才能找到你的最爱。

我的同事张亚勤曾经说:“那些敢于去尝试的人一定是聪明人。他们不会输,因为他们即使不成功,也能从中学到教训。所以,只有那些不敢尝试的人,才是绝对的失败者。”希望各位同学尽力开拓自己的视野,不但能从中得到教益,而且也能找到自己的兴趣所在。

成功的第三步:针对兴趣,定阶段性目标,一步步迈进
找到了你的兴趣,下一步该做的就是制定具体的阶段性目标,一步步向自己的理想迈进。

首先,你应客观地评估距离自己的兴趣和理想还差些什么?是需要学习一门课、读一本书、做一个更合群的人、控制自己的脾气还是成为更好的演讲者?十五年后达到的完美的自己和今天的自己会有什么差别?。。。你应尽力弥补这些差距。例如,当我决定我一生的目的是要让我的影响力最大化时,我发现我最欠缺的是演讲和沟通能力。我以前是一个和人交谈都会脸红,上台演讲就会恐惧的学生。我做助教时表现特别差,学生甚至给我取了个“开复剧场”的绰号。因此,为了实现我的理想,我给自己设定了多个提高演讲和沟通技巧的具体目标。

其次,你应定阶段性的、具体的目标,再充分发挥中国人的传统美德——勤奋、向上和毅力,努力完成目标。比如,我要求自己每个月做两次演讲,而且每次都要我的同学或朋友去旁听,给我反馈意见。我对自己承诺,不排练三次,决不上台演讲。我要求自己每个月去听演讲,并向优秀的演讲者求教。有一个演讲者教了我克服恐惧的几种方法,他说,如果你看着观众的眼睛会紧张,那你可以看观众的头顶,而观众会依然认为你在看他们的脸,此外,手中最好不要拿纸而要握起拳来,那样,颤抖的手就不会引起观众的注意。当我反复练习演讲技巧后,我自己又发现了许多秘诀,比如:不用讲稿,通过讲故事的方式来表达时,我会表现得更好,于是,我仍准备讲稿但只在排练时使用;我发现我回答问题的能力超过了我演讲的能力,于是,我一般要求多留时间回答问题;我发现自己不感兴趣的东西就无法讲好,于是,我就不再答应讲那些我没有兴趣的题目。几年后,我周围的人都夸我演讲得好,甚至有人认为我是个天生的好演说家,其实,我只是实践了中国人勤奋、向上和毅力等传统美德而已。

任何目标都必须是实际的、可衡量的目标,不能只是停留在思想上的口号或空话。制定目标的目的是为了进步,不去衡量你就无法知道自己是否取得了进步。所以,你必须把抽象的、无法实施的、不可衡量的大目标简化成为实际的、可衡量的小目标。举例来说,几年前,我有一个目标是扩大我在公司里的人际关系网,但“多认识人”或“增加影响力”的目标是无法衡量和实施的,我需要找一个实际的、可衡量的目标。于是,我要求自己“每周和一位有影响力的人吃饭,在吃饭的过程,要这个人再介绍一个有影响的人给我”。衡量这个目标的标准是“每周与一人一餐、餐后再认识一人”。当然,我不会满足于这些基本的“指标”。扩大人际关系网的目的是使工作更成功,所以,我还会衡量“每周一餐”中得到了多少信息,有多少我的部门雇用的人是在这样的人际网中认识的。一年后,我的确从这些衡量标准中,看到了自己的关系网有了显著的扩大。

制定具体目标时必须了解自己的能力。目标设定过高固然不切实际,但目标也不可定得太低。对目标还要做及时的调整:如果超出自己的期望,可以把期望提高;如果未达到自己的期望,可以把期望调低。达成了一个目标后,可以再制定更有挑战性的目标;失败时要坦然接受,认真总结教训。

最后,再一次提醒同学们,目标都是属于你的,只有你知道自己需要什么。制定最合适的目标,主动提升自己,并在提升过程中客观地衡量进度,这样才能获得成功,才能成为更好的你自己。

自信是自觉而非自傲
自信的人敢于尝试新的领域,能更快地发展自己的兴趣和才华,更容易获得成功。自信的人也更快乐,因为他不会时刻担心和提防失败。

很多人认为自信就是成功。一个学生老得第一名,他有了自信。一个员工总是被提升,他也有了自信。但这只是一元化的成功和一元化的自信。

其实,自信不一定都是好事。没有自觉的自信会成为自傲,反而会失去了别人的尊重和信赖。好的自信是自觉的,即很清楚自己能做什么,不能做什么。自觉的人自信时,他成功的概率非常大;自觉的人不自信时,他仍可努力尝试,但会将风险坦诚地告诉别人。自觉的人不需要靠成功来增强自信,也不会因失败而丧失自信。

自信的第一步:不要小看自己,多给自己打气
“自”信的关键在于自己。如果你自己总认为自己不行,你是无法得到自信的。例如,马加爵曾说:“我觉得我太失败的,同学都看不起我……很多人比我老练,让我很自卑。”虽然马加爵很聪明也很优秀,但他从没有真正自信过。

自信的秘密是相信自己有能力。中国古谚:“天生我才必有用”,“一枝草,一点露”,每个人都有自己的特性和长处,值得看重和发挥。我记得我11岁刚到美国时,课堂上一句英语都听不懂,有一次老师问“1/7换算成小数等于几?”我虽然不懂英文,但认得黑板上的“1/7”,这是我以前“背”过的。我立刻举手并正确回答了这个问题。不会“背书”的美国老师诧异地认为我是个“数学天才”,并送我去参加数学竞赛,鼓励我加入数学夏令营,帮助同学学习数学。她的鼓励和同学的认可给了我自信。我开始告诉自己,我有数学的天分。这时,我特别想把英文学好,因为只有这样才能学习更多的数学知识。这种教育方式不但提高了我的自信,也帮助我在各方面取得了长足的进步。

中国式教育认为人的成长是不断克服缺点的过程,所以老师更多是在批评学生,让学生弥补最差的学科。虽然应把每科都学得“足够好”,但人才的价值在于充分发挥个人最大的优点。美国盖洛普公司最近出了一本畅销书《现在,发掘你的优势》。盖洛普的研究人员发现:大部分人在成长过程中都试着“改变自己的缺点,希望把缺点变为优点”,但他们却碰到了更多的困难和痛苦;而少数最快乐、最成功的人的秘诀是“加强自己的优点,并管理自己的缺点”。“管理自己的缺点”就是在不足的地方做得足够好,“加强自己的优点”就是把大部分精力花在自己有兴趣的事情上,从而获得无比的自信。

凌志军的《成长》一书里还有很多得到自信的例子:微软亚洲工程院院长张宏江说他从小就“相信我是最聪明的。即使再后来的日子里我常常不如别人,但我还是对自己说:我能比别人做得好”;微软亚洲研究院的主任研究员周明小时候在“学生劳动”中刷了108个瓶子,打破了纪录,从而获得自信。他说:“我原来一直是没有自信心的,但是这件事给了我自信。这是我一生中最快乐的经验,散发着一种迷人的力量,一直持续到今天。我发现了天才的全部秘密,其实只有6个字:不要小看自己。”

自信是一种感觉,你没有办法用背书的方法“学习”自信,而唯一靠“学习”提升自信的方法是以实例“训练”你的大脑。要得到自信,你必须成为自己最好的拉拉队,每晚入睡前不妨想想,今天发生了什么值得你自豪的事情?你得到了好的成绩吗?你帮助了别人吗?有什么超出了你的期望吗?有谁夸奖了你吗?我相信每个人每天都可以找到一件成功的事情,你会慢慢发现,这些“小成功”可能会越来越有意义。

有个著名教练在每次球赛前,总会要求队员回忆自己最得意的一次比赛。他甚至让队员把最得意的比赛和一个动作(如紧握拳头)联系起来,以便使自己每次做这个动作时,就会下意识地想到得意的事,然后在每次比赛前反复做这个动作以“训练”大脑,提升自信。

希望同学们都能成为自己最好的拉拉队,同时多结交为你打气的朋友,多回味过去的成功,千万不要小看自己。

自信的第二步:用毅力、勇气,从成功里获得自信,从失败里增加自觉
当你感觉到自信时,无论多么小的成功,你都会特别期望再一次得到自己或别人的肯定,这时,你需要有足够的毅力。只要你有毅力,就会像周明所说的那样,“什么事情只要我肯干,就一定可以干好。你能学会你想学会的任何东西,这不是你能不能学会的问题,而是你想不想学的问题。如果你对自己手里的东西有强烈的欲望,你就会有一种坚韧不拔的精神,尤其当你是普通人的时候。”

有时,你可能没做过某一件事,不知道能不能做成。这时,除了毅力外,你还需要勇气。我以前在工作中,一般的沟通没有问题,但到了总裁面前,总是不敢讲话,怕说错话。直到有一天,公司要做改组,总裁召集十多个人开会,他要求每个人轮流发言。我当时想,既然一定要讲,那不如把心里话讲出来。于是,我鼓足勇气说:“我们这个公司,员工的智商比谁都高,但是我们的效率比谁都差,因为我们整天改组,不顾到员工的感受和想法……”我说完后,整个会议室鸦雀无声。会后,很多同事给我发电子邮件说:“你说得真好,真希望我也有你的胆子这么说。”结果,总裁不但接受了我的建议,改变了公司在改组方面的政策,而且还经常引用我的话。从此,我充满了自信,不惧怕在任何人面前发言。这个例子充分印证了“你没有试过,你怎么知道你不能”这句话。

有勇气尝试新事物的同时,也必须有勇气面对失败。大家不能只凭匹夫之勇去做注定要失败的事。但当你畏惧失败时,不妨想一想,你怕失去什么?最坏的下场是什么?你不能接受吗?在上面的例子中,如果总裁否定了我的看法,他会不尊重我吗?不但不会,别人很可能还会认为我勇气可嘉。而且,自觉的人会从失败中学习,认识到自己不适合做什么事情,再提升自己的自觉。因此,不要畏惧失败,只要你尽了力,愿意向自己的极限挑战,你就应为自己的勇气而自豪。

一个自信和自觉的人,如果能勇敢地尝试新的事物,并有毅力把它做好,他就会从成功里获得自信,从失败里增加自觉。

自信的第三步:自觉地定具体的目标,虚心地听他人的评估
培养自信也要设定具体的目标,一步步地迈进。这些目标也必须是可衡量的。我曾把我在总裁面前发言的例子讲给我女儿听,因为她的老师认为她很害羞,在学校不举手发言,我希望鼓励她勇于发言。她同意试一试,但她认为只有在适当的时候,有最好的意见时才愿意发言。但是,我认为有了“最好的意见”这个主观的评估,目标就很难衡量。于是,我和她制定了一个可衡量的、实际的目标:她每天举一次手,如果坚持一个月就有奖励。然后,我们慢慢增加举手的次数。一年后,老师注意到,她对课堂发言有了足够的自信。

自信绝非自我偏执、不容许自己犯错,或过度自我中心,失去客观的立场。我有个绝顶聪明的同事,他一生认准了“我永远不会错”这句“真理”。他表现得无比自信,一旦证明他某句话是对的,他就会提醒所有人几个月前他早就说过了。但因为他几乎是为了自信而活着,一旦证明他某句话是错的,他就会顾左右而言他,或根本否认此事。虽然他的正确率高达95%,但5%的错误让他失去了自己的信誉和他人的尊敬。这个例子告诉我们,自傲的自信或不自觉的自信甚至比不自信更加危险。

情商中的自觉有两个层面:对自己和环境皆能俱到,掌握主客观的情势。有自觉的人不会过度地自我批评,也不会天真地乐观,他们能客观地评估自己。所以,他们会坦诚地面对自己的能力极限,不会轻易地接受自己能力范围外的工作。当然,他们仍乐于接受挑战,但会在接受挑战时做客观的风险评估。这样的人不但对自己坦诚,对他人也坦诚。坦诚地面对失败会得到别人的信赖,因为他们知道你接受了教训。坦诚地面对自己的缺点也会得到别人的尊敬,因为他们知道你不会自不量力。所以,自觉的人容易成功,也容易自信。

自觉的人不但公平地评价自己,还主动要求周围的人给自己批评和反馈。他们明白,虽然自己很自觉,但别人眼中的自己是更为重要的。一方面,别人眼中的自己更为客观,另一方面,别人眼中的自己才是真正存在的自己(“Perception is reality”),也就是说,如果别人都认为你错了,只有你自认为没有错,那么在社会、学校或公司眼中,你就是错了。所以,你必须虚心地理解和接受别人的想法,而且以别人的想法作为最终的目标。比如,我女儿可以每天评估自己的发言,但最终,只有当老师和同学们认为她是个开朗的、有想法的学生时,她才达到了最终的目标。

获得坦诚的反馈特别是负面的回馈并不容易。所以,你最好能有一些勇敢坦诚的知心好友,他们愿意在私下对你说真心话。当然,你不能对负面的反馈有任何不满,否则你以后就听不到真心话了。除了私下的反馈外,在美国的公司里,还有一种“360度”意见调查,可以对员工的上司、下属同时做多方面的调查。因为这种调查是匿名的,它往往能获得真实的意见,如果很多人都说你在某方面仍须改进,这样的说法就比自己的或老板的看法更有说服力。虽然在学校里没有这种正式的调查,但是你仍然可以尽力地去理解他人对你的想法。我的父亲常教诲我们凡事谋之于众,就是指开放心胸,切勿以井观天,局限了自己的视野。

马加爵说:“同学都看不起我。”其实,如果他有勇气向他信任的同学求证,他也许会发现自己错怪了同学,也许会发现交错了朋友,也许会证实同学确实看不起他并了解其中的原因,然后自我改进。坦诚的交流和真心的朋友或许都可以帮助马加爵避免悲剧的发生。

有自觉的人会为自己制定现实的目标,客观地衡量自己,并会请他人帮助评估。这样的人能持续提升自己的自信,并能避免自信发展为自傲。

快乐比成功更重要
科学研究证明:心情好的人最能发挥潜力;快乐能提高效率、创造力和正确决策的概率;快乐的人有开明的思想,愿意帮助别人。但与其说快乐带来成功,还不如说成功的目的是带来快乐。我曾建议同学们追逐自己的理想和兴趣,其实做自己理想的、有兴趣的事情就是一种快乐。所以,快乐比成功更应成为我们的最终目标。

快乐的第一步:接受你的父母、环境、自己
不快乐的人总对一些无奈的事生闷气,不喜欢自己、父母和老师,不愿意读枯燥的书、不愿意应付考试。对于这些无奈的事,我希望同学们能学会坦然地接受它们。

在所有“不能改变的事情” 中,最不能改变的是父母,最应接受的也是父母。有不少学生说:“父母不理解我,不接受我,不体会我的想法,总要求我用他们的价值观和理念来做事、读书、求学。所以我总是避开他们,越来越孤独。”对这些同学,我的回答包括以下两个方面:

第一,你应该接受你的父母,千万不要因为感觉父母不理解你而自我封闭。父母的成长环境不同,思维方式不同,他们对成功的定义可能也不同,对你的期望与你对自己的期望就有较大的差异。但他们人生的路走得比你长,经验比你丰富,你不能先入为主地排斥他们。另外,你必须理解,父母是世界上最爱你的人,他们也是唯一可以无条件为你付出的人,你应该无条件地接受你的父母。作子女的经常把父母亲过度理想化,而疏忽了绝大多数的父母,在他们生长的环境中,比我们更为匮乏、不足,他们可能没有机会学习如何当一个称职的父母,但以他们的条件,也尽力了。如果我们鄙视、排斥父母,无异是对自己生命的来源不敬,那如何能快乐?

第二,你可以试着去改变父母的想法,但你首先应反问,你理解和接受你的父母吗?你能体会父母的想法吗?当你抱怨父母总是期望你完美时,难道你不也是在期望父母完美吗?凌志军建议说:“父母对你们的期望没有错,只是你们应该让父母了解,你们对他们的期望。”所以,在要求他们理解你之前,你应先去理解他们,这样才能更成功地和他们沟通。相互了解后,也许你们仍有不同意见但能彼此谅解,也许你或他们会改变原来的看法而达到共识。为此,你首先应和父母建立一个坦诚的沟通关系。也许起初你们会觉得别扭,但我相信你们很快就会体会到亲情与温馨。

除了接受父母,你还应接受环境中不能改变的事情。有些同学期望着不必考他们认为没用的题目,不必上他们认为没用的课,不必听他们不信任的老师讲课。但在社会中生存,我们必须学会接受那些不能改变的事。凌志军说:“如果我遇到‘应该做的事情’和‘喜欢做的事情’之间的冲突,我会给自己安排一个时间表,每天在规定的时间里完成‘应该做的事情’——时间表能激励你集中精力并提高效率。然后去做‘喜欢做的事情’。”人生是有限的,大家应把有限的时间用在“喜欢做的事情”上,但必须先把“应该做的事情”做得足够好。

最无谓的“发愁”就是对自己不满意。这不但浪费了时间,而且会造成事倍功半。所以,同学们一方面要培养自己的自信,以每一个小的成功来激励自己,另一方面也必须能接受自己,理解你们是为自己而生活的。为自己而生活就是要为了自己的快乐、兴趣和人生目标而努力,不要活在别人的价值观里。微软亚洲研究院院长沈向洋小时候一直活在别人的价值观里,为了“第一名”拼命,但是有一天,“我忽然意识到原来的想法错了。打败别人,得第一名,不是最重要的。最重要的是,你能不能学会尊重你自己,能不能发现自己的价值在哪里。”

当你开始为自己而生活,接受并喜欢你自己,接受并接近你的父母,接受环境中不能改变的事情,你就会发现你开始快乐了。

快乐的第二步:宣泄你的情感,控制你的脾气
心理学家认为,马加爵“在精神上一直是孤独的,因为他总不愿与人交流,不愿说出自己真实的感受……是一个情绪反应相当激烈的人,但是他外表上又是一个相当压抑的人。”马加爵给亲人的信上也写道:“我这个人动情的话历来就讲不出口。”如果马加爵能直接地宣泄自己的感情,他也许可以防止悲剧发生。事后马加爵也想到:“逃亡的时候觉得自己傻,可以选择吵架就算了,没有必要杀人。”

中国人总认为矜持、含蓄是美德。但我认为,在今天的时代里,直截了当的沟通更为重要。拐弯抹角、言不由衷、瞻前顾后、当面不说、背后乱讲都是坏习惯。有一位中国老板和他的下属吵架,他问我是不是该请第三者调解,我给他的建议是:因为这是情感的事情,你应该直接去和下属沟通;第三者为了做和事佬,可能会说出违背你或你的下属意愿的话(例如谎称你已经认错,但其实你没有),这反而会造成更多的麻烦。

当然,在情感问题上,直接沟通也需要技巧。例如,那位老板如果第一句话就对下属说:“你错了,但是我不和你计较。”那么下属肯定会反感。如果老板说:“你在那么多人面前骂我,很显然是你想抢我的工作。”结果就更不堪设想。显然,当你直接沟通时,不要论对错,不要猜测别人的动机,更不要再趁机补一句。最有效的沟通就是直接谈到你的感情,比如那位老板可以说:“当你在那么多人面前骂我时,我感到失去尊严,非常为难。”这样一句话是不能反驳的,甚至可能会引发理解和同情。

当你怒火中烧时,把愤怒的话转变成感性的话并不容易。要做到这一点,我们又需要依靠“自觉”和 “自控”。自觉不只是认识自己的能力,更是认识自己的感情。自觉的人知道自己何时会喜怒哀乐,也理解喜怒哀乐的宣泄会造成何种后果。如果他感到气愤,他不会瞬间爆炸,因为他知道爆炸的后果,但他也不会压抑自己的感情,因为那会对心灵造成很大的伤害,他通常会尽量自控地用最有建设性的方式处理。正面、感性的沟通可以降低火爆的气氛。感情和沟通都是最有感染性的,你完全可以用有建设性的、宽容的态度来与他人沟通并影响他人。

自控是一种内心的自我对话,可以提醒自己不要落入恶劣态度的陷阱。除了上溯的理智分析外,深呼吸是最快、最简单的情绪调节方法,中国人说:“心浮气躁”、“心神不宁”、“心乱如麻”、“心焦如焚”,指的都是心情紊乱和情绪及精神状态的关系,而“气定神闲”、“心安理得”最方便的作法就是深呼吸,也就藉由调气调息,把气调顺了,比较能摆脱情绪的牵扯,回到理性思考。美国对有暴力行为的加害人,都会施以团体教育,而教导他们认清暴力的毁灭性,学习控制自己的冲动,也就是懂得“叫停”或“离开现场”,以保护自己和对方的安全,避免铸成大错。

如果认为自控不容易,那么,你可以请你的知心好友随时提醒你。我过去的一个老板常常一生气就一发不可收拾,而且他生气都有前兆:他会先用刁钻的问题考倒你,然后他开始战抖,最后他才发脾气。但他想改掉这个毛病,于是他要求我在每次看到前兆时,用一句“密语”(如“让我们言归正传吧”)来提醒他。几次“密语”提醒之后,他就有了自觉和自控的能力,再也不需要别人提醒了。

快乐的第三步:有人分享快乐加倍,有人分担痛苦减半
科学研究告诉我们,调节自己的心情最好的方法就是找到知心的人倾诉和沟通。科学的根据是,感情源于人脑的lymbic系统,而该系统主要靠与他人的接触调节。科学证明,在一起交谈的两个人会慢慢达到同样的心理状态(喜怒哀乐)和生理状态(体温、心跳等)。因此,若想达到感情的平衡,我们必须懂得依靠别人。与人沟通是提升你的情商和快乐的唯一方法。与世隔绝的人只会越来越苦闷。西方有一古谚:“有人分享快乐加倍,有人分担痛苦减半。”马加爵所谓的真情,应该就是指能分享心情、内心的人吧!

所以,如果你情绪不好,或受了委屈时,应多向父母、朋友倾诉,不要像马加爵那样总把话闷在心里,只对日记倾诉。马加爵很苦闷,却没有倾诉苦闷的渠道。他说:“我在学校一个朋友也没有,我在学校那么落魄……在各种孤独中间,人最怕精神上的孤独。”马加爵在人际交往中碰到很多障碍,这些障碍带给他苦闷,而这些苦闷又没有渠道宣泄,进而造成更大的苦闷。这个恶性循环最终导致了悲剧的发生。其实,马加爵的内心独白,证明他是一个有自觉的人,他能看清自己的困境,可惜他将自己锁在自我封闭的牢笼里,让仇恨把他带向毁灭。记得去年,非典风波,最恐怖的威胁就是被隔离,可是平日里我们却常忽略了心里的孤立,使我们和快乐绝缘。

要得到快乐,你需要幽默、乐观的想法和沟通。在所有的沟通中,“笑”的感染力是最大的。耶鲁大学的研究发现,“笑”的感染力超过了所有其他感情,人们总会反射式地以微笑来回报你的微笑,而开怀的大笑更能迅速创造一个轻松的气氛,此外,幽默的笑也能促进相互信任,激发灵感。乐观、正面思考的力量是无穷的。近年来忧郁症已成为全世界来势汹汹的心理疾病,而其和负面思考有极大的关系,有些人习惯钻牛角尖,往悲观无助的方向想,困在死胡同中。如果能换个角度,半杯水有一半满的而非一半空的!现在的不如意,代表有无限成长进步的空间。学习检查自己,常保正念。

无论是驱逐悲伤或是获取快乐,我们都需要从倾诉和沟通中得到正面的激励。最自然的沟通对象可能是你的亲人,特别是你的父母。我相信,所有的父母都愿意听孩子的倾诉。

但是,“在家靠父母,出外靠朋友”,所以我们也需要和知心朋友沟通、倾诉。交朋友时不要只看朋友的嗜好和个性,更重要的是,你需要一些会鼓励人的、乐观的、幽默的、诚恳的、有同理心的、乐于助人的、愿意听人诉说的朋友。也许你会说:“我没有这样的朋友,也不敢去乱找朋友,如果别人拒绝怎么办?”如果别人拒绝你,你没有失去任何东西,但如果别人接受你,你可能因此找到你自己。

我希望你也会在寻找好友的过程中,也让自己成为这样一个会鼓励人的、乐观的、幽默的、诚恳的、有同理心的、乐于助人的、愿意听人诉说的人,并尽力去帮助你周围的亲人和朋友。唯有更多人愿意付出,快乐才能更迅速地通过人际网扩散。

给中国学生的祝福
我一直信奉以下做事的三原则:有勇气来改变可以改变的事情,有度量接受不可改变的事情,有智慧来分辨两者的不同。

祝福中国的学生,当你碰到挫折时,能用这三个原则,以度量、勇气、智慧来帮助你渡过难关。

祝福中国的学生,当你追求成功、自信、快乐时,不要忘了成功是多元化的,不要忘了自信是自觉而非自傲,不要忘了快乐的人总能理解、接受和喜欢自己。

祝福中国的学生,当你逐步获得成功、自信、快乐时,会发现一个良性循环:从成功里得到自信和快乐,从自信里得到快乐和成功,从快乐里得到成功和自信。

祝福中国的学生,当你拥有成功、自信、快乐后,不要忘了帮助他人获得成功、自信和快乐。
posted @ 2006-12-14 09:24 重归本垒(Bing) 阅读(219) | 评论 (0)编辑 收藏
 
在我们不断塑造自我的过程中,影响最大的莫过于是选择乐观的态度还是悲观的态度。我们思想上的这种抉择可能给我们带来激励,也有可能阻滞我们前进。

  清晰地规划目标是人生走向成功的第一步,但塑造自我却不仅限于规划目标。要真正塑造自我和自己想要的生活,我们必须奋起行动。莎士比亚说得好:"行动胜过雄辩。"

  一旦掌握自我激励,自我塑造的过程也就随即开始。以下方法可以帮你塑造自我,塑造那个你一直梦寐以求的自我。

  树立远景 迈向自我塑造的第一步,要有一个你每天早晨醒来为之奋斗的目标,它应是你人生的目标。远景必须即刻着手建立,而不要往后拖。你随时可以按自己的想法做些改变,但不能一刻没有远景。

  离开舒适区 不断寻求挑战激励自己。提防自己,不要躺倒在舒适区。舒适区只是避风港,不是安乐窝。它只是你心中准备迎接下次挑战之前刻意放松自己和恢复元气的地方。

  把握好情绪 人开心的时候,体内就会发生奇妙的变化,从而获得阵阵新的动力和力量。但是,不要总想在自身之外寻开心。令你开心的事不在别处,就在你身上。因此,找出自身的情绪高涨期用来不断激励自己。

  调高目标 许多人惊奇地发现,他们之所以达不到自己孜孜以求的目标,是因为他们的主要目标太小、而且太模糊不清,使自己失去动力。如果你的主要目标不能激发你的想象力,目标的实现就会遥遥无期。因此,真正能激励你奋发向上的是,确立一个既宏伟又具体的远大目标。

  加强紧迫感 20世纪作者Anais Nin(阿耐斯)曾写道:"沉溺生活的人没有死的恐惧"。自以为长命百岁无益于你享受人生。然而,大多数人对此视而不见,假装自己的生命会绵延无绝。惟有心血来潮的那天,我们才会筹划大事业,将我们的目标和梦想寄托在enis Waitley(丹尼斯)称之为 "虚幻岛" 的汪洋大海之中。其实,直面死亡未必要等到生命耗尽时的临终一刻。事实上,如果能逼真地想象我们的弥留之际,会物极必反产生一种再生的感觉,这是塑造自我的第一步。

  撇开朋友 对于那些不支持你目标的 "朋友" ,要敬而远之。你所交往的人会改变你的生活。与愤世嫉俗的人为伍,他们就会拉你沉沦。结交那些希望你快乐和成功的人,你就在追求快乐和成功的路上迈出最重要的一步。对生活的热情具有感染力。因此同乐观的人为伴能让我们看到更多的人生希望。

  迎接恐惧 世上最秘而不宣的秘密是,战胜恐惧后迎来的是某种安全有益的东西。哪怕克服的是小小的恐惧,也会增强你对创造自己生活能力的信心。如果一味想避开恐惧,它们会象疯狗一样对我们穷追不舍。此时,最可怕的莫过于双眼一闭假装它们不存在。

  做好调整计划 实现目标的道路绝不是坦途。它总是呈现出一条波浪线,有起也有落。但你可以安排自己的休整点。事先看看你的时间表,框出你放松、调整、恢复元气的时间。即使你现在感觉不错,也要做好调整计划。这才是明智之举。在自己的事业波峰时,要给自己安排休整点。安排出一大段时间让自己隐退一下,即使是离开自己爱的工作也要如此。只有这样,在你重新投入工作时才能更富激情。

  直面困难 每一个解决方案都是针对一个问题的。二者缺一不可。困难对于脑力运动者来说,不过是一场场艰辛的比赛。真正的运动者总是盼望比赛。如果把困难看作对自己的诅咒,就很难在生活中找到动力。如果学会了把握困难带来的机遇,你自然会动力陡生。

  首先要感觉好 多数人认为,一旦达到某个目标,人们就会感到身心舒畅。但问题是你可能永远达不到目标。把快乐建立在还不曾拥有的事情上,无异于剥夺自己创造快乐的权力。记住,快乐是天赋权利。首先就要有良好的感觉,让它使自己在塑造自我的整个旅途中充满快乐,而不要再等到成功的最后一刻才去感受属于自己的欢乐。

  加强排练 先"排演"一场比你要面对的珲要复杂的战斗。如果手上有棘手活而自己又犹豫不决,不妨挑件更难的事先做。生活挑战你的事情,你定可以用来挑战自己。这样,你就可以自己开辟一条成功之路。成功的真谛是:对自己越苛刻,生活对你越宽容;对自己越宽容,生活对你越苛刻。

  立足现在 锻炼自己即刻行动的能力。充分利用对现时的认知力。不要沉浸在过去,也不要耽溺于未来,要着眼于今天。当然要有梦想、筹划和制订创造目标的时间。不过,这一切就绪后,一定要学会脚踏实地、注重眼前的行动。要把整个生命凝聚在此时此刻。

  敢于竞争 竞争给了我们宝贵的经验,无论你多么出色,总会人外有人。所以你需要学会谦虚。努力胜过别人,能使自己更深地认识自己;努力胜过别人,便在生活中加入了竞争 "游戏 " 。不管在哪里,都要参与竞争,而且总要满怀快乐的心情。要明白最终超越别人远没有超越自己更重要。

  内省 大多数人通过别人对自己的印象和看法来看自己。获得别人对自己的反映很不错,尤其正面反馈。但是,仅凭别人的一面之辞,把自己的个人形象建立在别人身上,就会面临严重束缚自己的危险。因此,只把这些溢美之词当作自己生活中的点缀。人生的棋局该由自己来摆。不要从别人身上找寻自己,应该经常自省并塑造自我。

  走向危机 危机能激发我们竭尽全力。无视这种现象,我们往往会愚蠢地创造一种追求舒适的生活,努力设计各种越来越轻松的生活方式,使自己生活得风平浪静。当然,我们不必坐等危机或悲剧的到来,从内心挑战自我是我们生命力量的源泉。圣女贞德(Joan of Arc)说过:"所有战斗的胜负首先在自我的心里见分晓。"

  精工细笔 创造自我,如绘巨幅画一样,不要怕精工细笔。如果把自己当作一幅正在描绘中杰作,你就会乐于从细微处做改变。一件小事做得与众不同,也会令你兴奋不已。总之,无论你有多么小的变化,点点都于你很重要。

  敢于犯错 有时候我们不做一件事,是因为我们没有把握做好。我们感到自己"状态不佳"或精力不足时,往往会把必须做的事放在一边,或静等灵感的降临。你可不要这样。如果有些事你知道需要做却又提不起劲,尽管去做,不要怕犯错。给自己一点自嘲式幽默。抱一种打趣的心情来对待自己做不好的事情,一旦做起来了尽管乐在其中。

  不要害怕拒绝 不要消极接受别人的拒绝,而要积极面对。你的要求却落空时,把这种拒绝当作一个问题: "自己能不能更多一点创意呢?"不要听见不字就打退堂鼓。应该让这种拒绝激励你更大的创造力。

  尽量放松 接受挑战后,要尽量放松。在脑电波开始平和你的中枢神经系统时,你可感受到自己的内在动力在不断增加。你很快会知道自己有何收获。自己能做的事,不必祈求上天赐予你勇气,放松可以产生迎接挑战的勇气。

  一生的缩影 塑造自我的关键是甘做小事,但必须即刻就做。塑造自我不能一蹴而就,而是一个循序渐进的过程。这儿做一点,那儿改一下,将使你的一天(也就是你的一生)有滋有味。今天是你整个生命的一个小原子,是你一生的缩影。

  大多数人希望自己的生活富有意义。但是生活不在未来。我们越是认为自己有充分的时间去做自己想做的事,就越会在这种沉醉中让人生中的绝妙机会悄然流逝。只有重视今天,自我激励的力量才能汩汩不绝。

posted @ 2006-12-14 09:22 重归本垒(Bing) 阅读(188) | 评论 (0)编辑 收藏
 
     摘要: ---servlet文件 import  java.io. * ; import  java.util.Date; import  javax.servlet. * ; import  javax.servlet.http. * ;...  阅读全文
posted @ 2006-12-12 10:43 重归本垒(Bing) 阅读(394) | 评论 (0)编辑 收藏
 
1.文件打包

      jar cf myname.jar *.class

2.证书位置

自签名的数字证书要放在一个文件中(通常称为“密钥链”(keychain)),如果输入
      keytool -list
那么访问缺省文件,如果没有这个文件,那么就要创建一个,或指定一个已存在的文件。一般为“cacerts”,运行:
      keytool -list -file <path/filename>
缺省位置一般为:
      {java.home}/lib/security/cacerts

3.创建签名

运行:
      keytool -genkey -alias <keyname> -keystore <url>
这里keyname就是为你的密钥取一个别名,url就放密钥的位置,通常为"cacerts".按提示输入密码等信息。
keytool有很多的运行参数,如-valid就是可以指定密钥的有效天数。

4.查看新建的密钥

运行:
      keytool -list -keystore <url>

5.给自己的jar文件签名

运行:
   jarsigner -keystore <url> <jarfile> <keyname>
url表示cacerts文件的位置,jarfile是自己的jar文件的名称,keyname是密钥的名称。

6.在网页用使用

现在就有一个jar文件,它标识成是采用自己提供的密钥进行签名的,这样子就能保证在签名之后,这个jar文件没有被篡改过。
不过要确保html文件中的applet标记包含了“archive”属性,来指定jar文件的名称。

    <applet code=ifpre.io.FileAccessApplet
     achive=ifpreFileAccessApplet 
     width=200 
     heigt =100> 
    </applet> 
posted @ 2006-12-12 09:51 重归本垒(Bing) 阅读(1021) | 评论 (2)编辑 收藏
 

 

          

========

Chap11    对象的集合

 

       1.数组

       数组与其它容器的区别体现在三个方面:效率,类型识别,以及可以持有primitives。

       数组是Java提供的,能随机存储和访问reference序列的诸多方法中,最高效的一种。速度的代价是,当一个数组创建后,容量就固定了。

       创建数组的时候,同时指明了数组元素的类型。而泛型容器类如List,Set和Map等,所持有的对象均被上传为Object。

      

       2.数组是第一流的对象

       数组的标识符实际上是一个“创建在堆(heap)里的实实在在的对象的”reference。这个对象持有其它对象的reference,或直接持有primitive类型的值。

      

       3.Arrays类

       java.util.Arrays类,包括了一组可用于数组的static方法。其中asList()方法,可把数组转成一个List。

       Arrays.fill()方法,把一个值或对象的reference拷贝到数组的各个位置,或指定的范围。

      

       4.复制一个数组

       相比for循环,System.arrayCopy()能以更快的速度拷贝数组。如果是对象数组,拷贝的是数组中对象的reference,对象本身不会被拷贝。这被称为浅拷贝(Shallow copy)。

      

       5.数组的比较

       Arrays提供了equals()方法。数组是否相等是基于其内容的。

       数组要想完全相等,它们必须有相同数量的元素,且数组的每个元素必须与另一个数组的对应位置上的元素相等。

       元素的相等性,用equals()判断。对于primitive,会使用其wrapper类的equals()。

      

       6.数组元素的比较

       实现比较功能的一个方法是实现java.lang.Comparable接口。这个接口只有一个compareTo()方法。

       Arrays.sort()会把传给它的数组的元素转换成Comparable。如果数组元素没有实现Comparable接口,就会引发一个ClassCastException。

       实现比较功能的另一个方法使用策略模式(strategy design pattern),即实现Comparator接口。

       Arrays.sort()可接受一个数组和一个Comparator,根据Comparator的compare()方法对数组元素排序。

       Java标准类库所用的排序算法已经作了优化--对于primitive,它用的是快速排序(Quicksort),对于对象,它用的是稳定合并排序(stable merge sort)。

      

       7.查询有序数组

       一旦对数组进行了排序,就能用Arrays.binarySearch()进行快速查询了。但切忌对一个尚未排序的数组使用binarySearch()。

       如果Arrays.binarySearch()查找到了,就返回一个大于或等于0的值。否则返回负值。这个负值的意思是,如果手动维护这个数组,这个值应该插在哪个位置。这个值是:

       -(插入点)-1

       “插入点”就是,在所有比要找的值更大的值中,最小的那个值的下标。如果数组中所有值都比要查找的值小,它就是a.size()。

       如果数组里有重复元素,binarySearch()不能保证返回哪一个,但也不报错。

       如果排序的时候用到了Comparator,那么调用binarySearch()的时候,也必须使用同一个Comparator。

      

       8.数组部分的总结

       如果要持有一组对象,首选,同时效率最高的,应该是数组。如果是要持有一组primitive,也只能用数组。

      

       9.容器简介

       Java2的容器类要解决“怎样持有对象”,它把这个问题分成两类:

       (1).Collection:通常是一组有一定规律的独立元素。List必须按特定的顺序持有这些元素,而Set不能保存重复的元素。

       (2).Map:一组以“键-值”(key-value)形式出现的pair。Map可以返回键(Key)的Set,值的Collection,或者pair的Set。

      

       10.填充容器

       Collection也有一个辅助类Collections,它包含了一些静态的使用工具方法,其中有fill()。fill()只是把同一个对象的reference负值到整个容器,而且只能为List,不能为Set和Map工作。并且这个fill()只能替换容器中的值,而不是往List加新元素。如:

       List list = new ArrayList();

       for(int i = 0; i<10; i++)

              list.add("");

       Collections.fill(list, "Hello");

      

       11.容器的缺点:不知道对象的类型

       Java的容器只持有Object。容器对“能往里面加什么类型的对象”没有限制。在使用容器中的对象之前,还必须进行类型转换

      

       12.迭代器

       迭代器(iterator),又是一个设计模式。iterator能让程序员在不知道或不关心他所处理的是什么样的底层序列结构的情况下,在一个对象序列中前后移动,并选取其中的对象。iterator是“轻量级”的对象,即创建代价很小的对象。

       不经意的递归(Unintended recursion)

       public class A{

              public String toString(){

                     return "A address:" + this +"\n";//

              }

              public static void main(String[] args){

                     System.out.println(new A());

              }

       }

       上面的程序会出现无穷无尽的异常。

       "A address:" + this         ,编译器会试着将this转换成String,要用大toString(),于是就变成递归调用了。

       如果想打印对象的地址,应该调用Object的toString()方法。而不要用this,应该写super.toString()。

      

       13.List的功能

       ArrayList,一个用数组实现的List。能进行快速的随机访问,但是往列表中插入和删除元素比较慢。

       LinkedList,对顺序访问进行了优化。在List中插入和删除元素代价也不高。但是随机访问的速度相对较慢。可以把它当成栈(Stack),队列(queue)或双向队列(deque)来用。

      

       14.Set的功能

       加入Set的每个元素必须是唯一的。要想加进Set,Object必须定义equals(),才能标明对象的唯一性。

       HashSet,为优化查询速度而设计的Set。要放进HashSet的Object还要定义hashCode()。

       TreeSet,一个有序的Set,能从中提取一个有序序列。用了红黑树(red-black tree)数据结构。

       LinkedHashSet,使用链表的Set,既有HashSet的查询速度,又能保存元素的插入顺序。用Iterator遍历Set的时候,它是按插入顺序进行访问的。

       Set要有一个判断以什么顺序来存储元素的标准,也就是说必须实现Comparable接口,并且定义compareTo()方法。

      

       15.SortedSet

       SortedSet(只有TreeSet这一个实现可用)中的元素一定是有序的。SortedSet的意思是“根据对象的比较顺序”,而不是“插入顺序”进行排序。

      

       16.Map的功能

       如果知道get()是怎么工作的,就会发觉在ArrayList里面找对象是相当慢的。而这正是HashMap的强项。HashMap利用对象的hashCode()来进行快速查找。

       Map的keySet()方法返回一个由Map的键组成的Set。values()返回的是由Map的值所组成的Collection。由于这些Collection的后台都是map,因此对这些Collection的任何修改都会反映到Map上。

      

       17.SortedMap

       SortedMap(只有TreeMap这一个实现)的键肯定是有序的。

      

       18.LinkedHashMap

       为提高速度,LinkedHashMap对所有东西都作了hash,而且遍历的时候,还会按插入顺序返回pair。此外,还可通过构造函数进行配置,让它使用基于访问的LRU(least-recently-used)算法,这样没被访问过的元素(通常也是要删除的候选对象)就会出现在队列的最前面。

      

       19.散列算法与Hash数

       要想用自己的类作HashMap的键,必须覆写equals()和hashCode()。HashMap用equals()来判断查询用的键是否与表里其它键相等。

       Object的hashCode(),在缺省情况下就是返回对象的内存地址。

      

       一个合适的equals()必须做到以下五点:

       (1).反身性:对任何x,x.equals(x)必须是true。

       (2).对称性:对任何x和y,如果y.equals(x)是true的,那么x.equals(y)也必须是true。

       (3).传递性:对任何x,y和z,如果x.equals(y)是true,且y.equals(z)也是true,那么x.equals(z)也必须是true。

       (4).一致性:对任何x和y,如果对象里面用来判断相等性的信息没有修改过,那么无论调用多少次x.equals(y),它都必须一致地返回true或false。

       (5).对于任何非空的x,x.equals(null)必须返回false。

      

       默认的Object.equals()只是简单地比较两个对象的地址,所以一个Dog("A")会不等于另一个Dog("A")。

       下面是覆写equals()和hashCode()的例子。

       public class Dog{

              public int id;

              public Dog(int x){ id = x; }

              public int hashCode(){ return id; }

              public boolean equals(Object o){

                     return (o instanceof Dog) && (id == ((Dog)o).id)

              }

       }

       equals()在利用instanceof检查参数是不是Dog类型的同时,还检查了对象是不是null,如果是null,instanceof会返回false。

      

       20.理解hashCode()

       数组是最快的数据结构,所以很容易想到用数组存储Map的键的信息(而不是键本身)。Map要能存储任意数量的pair,而键的数量又被数组的固定大小限制了,所以不能用数组存储键本身。

       要解决定长数组的问题,就得允许多个键生成同一个hash数,也就是会有冲突,每个键对象都会对应数组的某个位置。

       查找过程从计算hash数开始,算完后用这个数在数组里定位。如果散列函数能确保不产生冲突(如果对象数量是固定的,这是可能的),那么它就被称为“完全散列函数”,这是特例。通常,冲突是由“外部链(external chaining)”处理的:数组并不直接指向对象,而是指向一个对象的列表。然后再用equals()在这个列表中一个个找。如果散列函数定义得好,每个hash数只对应很少的对象,这样,与搜索整个序列相比,能很快跳到这个子序列,比较少量对象,会快许多。

       hash表的“槽位”常被称为bucket。

      

       21.影响HashMap性能的因素

       Capacity:hash表里bucket的数量。

       Initial capacity:创建hash表时,bucket的数量。

       Size:当前hash表的记录的数量。

       Load factor:size/capacity。一个负载较轻的表会有较少的冲突,因此插入和查找的速度会比较快,但在用迭代器遍历的时候会比较慢。

       HashMap和HashSet都提供了能指定load factor的构造函数,当load factor达到这个阀值的时候,容器会自动将capacity(bucket的数量)增加大约一倍,然后将现有的对象分配到新的bucket里面(这就是所谓的rehash)。缺省情况下HashMap会使用0.75的load factor。

      

       22.选择实现

       HashTable,Vector和Stack属于老版本遗留下来的类,应该避免使用。

       如何挑选List

       数组的随机访问和顺序访问比任何容器都快。ArrayList的随机访问比LinkedList快,奇怪的时LinkedList的顺序访问居然比ArrayList略快。LinkedList的插入和删除,特别时删除,比ArrayList快很多。Vector各方面速度都比ArrayList慢,应避免使用。

       如何挑选Set

       HashSet各项性能都比TreeSet好,只有在需要有序的Set时,才应该用TreeSet。

       LinkedHashSet的插入比HashSet稍慢一些,因为要承担维护链表和hash容器的双重代价,但是它的遍历速度比较快。

       如何挑选Map

       首选HashMap,只有在需要有序map时,才选TreeMap。LinkedHashMap比Hashmap稍慢一些。

      

       23.把Collection和Map设成不可修改的

       Collections.unmodifiableCollection()方法,会把传给它的容器变成只读版返回。这个方法有四种变形,unmodifiableCollection(),unmodifiableList(),unmodifiableSet(),unmodifiableMap()。

      

       24.Collection和Map的同步

       Collections里有一个自动对容器做同步的方法,它的语法与“unmodifiable”方法有些相似。synchronizedCollection(),synchronizedList(),synchronizedSet(),synchronizedMap()。

      

       25.Fail fast

       Java容器类库继承了fail-fast(及早报告错误)机制,它能防止多个进程同时修改容器的内容。当它发现有其它进程在修改容器,就会立即返回一个ConcurrentModificationException。

      

       26.可以不支持的操作

       可以用Arrays.asList()把数组改造成List,但它只是部分的实现了Collection和List接口。它支持的都是那些不改变数组容量的操作,不支持add(),addAll(),clear(),retainAll(),remove(),removeAll()等。调用不支持的方法会引发一个UnsupportedOperationException异常。

       要想创建普通容器,可以把Arrays.asList()的结果做为构造函数参数传给List或Set,这样就能使用它的完整接口了。

      

      

      

      

=============

Chap12   Java I/O系统

 

       1.File类

       File类有一个极具欺骗性的名字,可以用来表示某个文件的名字,也可以用来表示目录里一组文件的名字。

       File类的功能不仅限于显示文件或目录。它能创建新的目录,甚至是目录路径。此外还能检查文件的属性,判断File对象表示的是文件还是目录,以及删除文件等。

      

       2.输入与输入

       流(Stream)是一种能生成或接受数据的,代表数据的源和目标的对象。流把I/O设备内部的具体操作给隐藏起来了。

       Java的I/O类库分成输入和输出两大部分。

      

       3.添加属性与适用的接口

       使用“分层对象(layered objects)”,为单个对象动态地,透明地添加功能的做法,被称为Decorator Pattern。Decorator模式要求所有包覆在原始对象之外的对象,都必须具有与之完全相同的接口。无论对象是否被decorate过,传给它的消息总是相同的。

       为InputStream和OutputStream定义decorator类接口的类,分别是FilterInputStream和FilterOutputStream,它们都继承自I/O类库的基类InputStream和OutputStream,这是decorator模式的关键(惟有这样,decorator类的接口才能与它要服务的对象的完全相同)。

       对于I/O类库来说,比较明智的做法是,普遍都做缓冲,把不缓冲当特例。

      

       Reader和Writer类系

       InputStream和OutputStream的某些功能已经淘汰,但仍然提供了很多有价值的,面向byte的I/O功能。而Java 1.1引进的Reader和Writer则提供了Unicode兼容的,面向字符的I/O功能。Java 1.1还提供了两个适配器(adapter)类,InputStreamReader和OutputStreamWriter负载将InputStream和OutputStream转化成Reader和Writer。

       Reader和Writer要解决的,最主要是国际化。原先的I/O类库只支持8位的字节流,因此不可能很好地处理16位的Unicode字符流。此外新类库的性能也比旧的好。

      

       4.数据源和目的

       几乎所有的Java I/O流都有与之对应的,专门用来处理Unicode的Reader和Writer。但有时,面向byte的InputStream和OutputStream才是正确的选择,特别是java.util.zip,它的类都是面向byte的。

       明智的做法是,先用Reader和Writer,等到必须要用面向byte的类库时,你自然会知道,因为程序编译不过去了。

      

       5.常见的I/O流的使用方法

       (1).对输入文件做缓冲

       BufferedReader in = new BufferedReader( new FileReader("IOStreamDemo.java"));

       String s, s2 = new String();

       while((s = in.readLine())!= null)

              s2 += s + "\n";//readLine()会把换行符剥掉,所以在这里加上。

       in.close();

       //读取标准输入

       BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in));

       System.out.print("Enter a line:");

       System.out.println(stdin.readLine());

      

       (2).读取内存

       StringReader in2 = new StringReader(s2);

       int c;

       while((c = in2.read())!=-1)//read()会把读出来的byte当做int

              System.out.print((char)c);

      

       (3).读取格式化内存

       try{

              DataInputStream in3 = new DataInputStream(new ByteArrayInputStream(s2.getBytes()));

              while(true)

                     System.out.print((char)in3.readByte());//无法根据readByte()返回值判断是否结束

       } catch(EOFException e){

              System.err.println("End of stream");

       }

       //使用available()来判断还有多少字符

       DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("TestEOF.java")));

       while(in.available() != 0)

              System.out.print((char)in.readByte());

      

       (4).读取文件

       try{

              BfferedReader in4 = new BufferedReader(new StringReader(s2));

              PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter(IODemo.out)));

              int lineCount = 1;

              while((s = in4.readLine())!= null)

                     out1.println(lineCount++ +": "+ s);

              out1.close();

       } catch(EOFException e){

              System.err.println(End of stream);

       }

       使用PrintWriter去排版,就能得出能够读得懂的,普通的文本文件。

      

       6.标准I/O

       标准I/O是Unix的概念,意思是,一个程序只使用一个信息流。所有输入都是从“标准输入”进来的,输出都从“标准输出”出去,错误消息都送到“标准错误”里。

       Java遵循标准I/O的模型,提供了Syetem.in,System.out,以及System.err。

      

       将System.out转换成PrintWriter

       System.out是PrintStream,也就是说它是OutputStream。不过可通过PrintWriter的构造函数把它改造成PrintWriter。

       PrintWriter out = new PrintWriter(System.out, true);

       out.println("Hello, world");

       为了启动自动清空缓冲区的功能,一定要使用双参数版的构造函数,并把第二个参数设成true。这点非常重要,否则就有可能会看不到输出。

      

       标准I/O的重定向

       Java的System类提供了几个能重定向标准输入,标准输出和标准错误的静态方法:

       setIn(InputStream),setOut(PrintStream),setErr(PrintStream)。

       I/O重定向处理的不是character流,而是byte流,因此不能用Reader和Writer,要用InputStream和OutputStream。

      

       7.New I/O

       Java 1.4的java.nio.*引入了一个新的I/O类库,其目的就是提高速度。实际上,旧的I/O类库已经用nio重写。

       性能的提高源于它用了更贴近操作系统的结构:channel和buffer。

       java.nio.ByteBuffer是唯一一个能直接同channel打交道的buffer。它是一个相当底层的类,存储和提取数据的时候,可以选择是以byte形式还是以primitive形式,但它不能存储对象。这是为了有效地映射到绝大多数操作系统上。

       新I/O修改了旧I/O的三个类,即FileInputStream,FileOutputStream,以及RandomAccessFile,以获取FileChannel。

       // Write a file:

    FileChannel fc = new FileOutputStream("data.txt").getChannel();

    fc.write(ByteBuffer.wrap("Some text ".getBytes()));

    fc.close();

    // Add to the end of the file:

    fc = new RandomAccessFile("data.txt", "rw").getChannel();

    fc.position(fc.size()); // Move to the end

    fc.write(ByteBuffer.wrap("Some more".getBytes()));

    fc.close();

    // Read the file:

    fc = new FileInputStream("data.txt").getChannel();

    ByteBuffer buff = ByteBuffer.allocate(4096);

    fc.read(buff);

    buff.flip();

    while(buff.hasRemaining())

      System.out.print((char)buff.get()); 

       用wrap( )方法把一个已经拿到手的byte数组"包"到ByteBuffer。如果是用这种方法,新创建的ByteBuffer是不会去拷贝底层的(byte)数组的,相反它直接用那个byte数组来当自己的存储空间。所以我们说ByteBuffer的"后台"是数组。

       从buffer中取数据前,要调用buffer的flip()。往buffer中装数据前,要调用buffer的clear()。

       FileChannel

      in = new FileInputStream(args[0]).getChannel(),

      out = new FileOutputStream(args[1]).getChannel();

    ByteBuffer buffer = ByteBuffer.allocate(BSIZE);

    while(in.read(buffer) != -1) {

      buffer.flip(); // Prepare for writing

      out.write(buffer);

      buffer.clear();  // Prepare for reading

    }

 

       View Buffers

      

       View Buffer能让你从特殊的视角,来观察其底层的ByteBuffer。对view的任何操作都会作用到ByteBuffer上。同一个ByteBuffer,能读出不同的数据。ByteBuffer以1字节区分数据,CharBuffer是2字节,IntBuffer,FloatBuffer是4字节,LongBuffer和DoubleBuffer是8字节。

       ByteBuffer bb = ByteBuffer.wrap(new byte[]{ 0, 0, 0, 0, 0, 0, 0, 'a' });

    bb.rewind();

    System.out.println("Byte Buffer");

    while(bb.hasRemaining())

      System.out.println(bb.position()+ " -> " + bb.get());

    CharBuffer cb = ((ByteBuffer)bb.rewind()).asCharBuffer();

    System.out.println("Char Buffer");

    while(cb.hasRemaining())

      System.out.println(cb.position()+ " -> " + cb.get());

    FloatBuffer fb = ((ByteBuffer)bb.rewind()).asFloatBuffer();

    System.out.println("Float Buffer");

    while(fb.hasRemaining())

      System.out.println(fb.position()+ " -> " + fb.get());

    IntBuffer ib = ((ByteBuffer)bb.rewind()).asIntBuffer();

    System.out.println("Int Buffer");

    while(ib.hasRemaining())

      System.out.println(ib.position()+ " -> " + ib.get());

     

    Buffer的细节

    如果使用相对定位的get()和put()方法,buffer的position会跟着变化。也可以用下标参数调用绝对定位的get()和put()方法,这时它不会改动buffer的position。

    mark()方法会记录当前position,reset()会把position设置到mark的位置。rewind()把position设置到buffer的开头,mark被擦掉了。flip()把limit设为position,把position设为零。当你将数据写入buffer,准备读取的时候,必须先调用这个方法。

   

       内存映射文件

       memory-mapped file能让你创建和修改那些大到无法读入内存的文件(最大2GB)。

       int length = 0x8FFFFFF; // 128 Mb

       MappedByteBuffer out = new RandomAccessFile("test.dat","rw").getChannel().map(FileChannel.MapMode.READ_WRITE,0,length);

       for(int i = 0; i < length; i++)

              out.put((byte)'x');

       for(int i = length/2;i<length/2+6;i++)

              System.out.print((char)out.get(i));

       MappedByteBuffer是ByteBuffer的派生类。例程创建了一个128MB的文件,文件的访问好像只是一瞬间的事,这是因为,真正调入内存的只是其中的一小部分,其余部分则被放在交换文件上。Java是调用操作系统的"文件映射机制(file-mapping facility)"来提升性能的。只有RandomAccessFile才能写映射文件。

      

       文件锁

       Java的文件锁是直接映射操作系统的锁机制的,因此其它进程也能看到文件锁。

       FileOutputStream fos= new FileOutputStream("file.txt");

    FileLock fl = fos.getChannel().tryLock();

    if(fl != null) {

      System.out.println("Locked File");

      Thread.sleep(100);

      fl.release();

      System.out.println("Released Lock");

    }

    fos.close();

    tryLock( ) 是非阻塞的。它会试着去获取这个锁,但是如果得不到(其它进程已经以独占方式得到这个锁了),那它就直接返回。而lock( )是阻塞的。如果得不到锁,它会在一直处于阻塞状态,除非它得到了锁,或者你打断了调用它(即lock( )方法)的线程,或者关闭了它要lock( )的channel,否则它是不会返回的。最后用FileLock.release( )释放锁。

    还可以像这样锁住文件的某一部分,

tryLock(long position, long size, boolean shared)

       或者

lock(long position, long size, boolean shared)

这个方法能锁住文件的某个区域(size - position)。其中第三个参数表示锁能不能共享。

       对于带参数的lock( )和tryLock( )方法,如果你锁住了position到position+size这段范围,而文件的长度又增加了,那么position+size后面是不加锁的。而无参数的lock方法则会锁定整个文件,不管它变不变长。

 

       8.压缩

       Java I/O类库还收录了一些能读写压缩格式流的类,它们是InputStream和OutputStream的派生类。这是因为压缩算法是针对byte而不是字符的。

       GZIP的接口比较简单,因此如果你只有一个流要压缩的话,用它会比较合适。

       BufferedReader in = new BufferedReader(new FileReader(args[0]));

    BufferedOutputStream out = new BufferedOutputStream(

      new GZIPOutputStream(new FileOutputStream("test.gz")));

    System.out.println("Writing file");

    int c;

    while((c = in.read()) != -1)

      out.write(c);

    in.close();

    out.close();

    System.out.println("Reading file");

    BufferedReader in2 = new BufferedReader(

      new InputStreamReader(new GZIPInputStream(new FileInputStream("test.gz"))));

    String s;

    while((s = in2.readLine()) != null)

      System.out.println(s);

       只要用GZIPOutputStream 或ZipOutputStream把输出流包起来,再用GZIPInputStream 或ZipInputStream把输入流包起来就行了。

      

       用Zip存储多个文件

       FileOutputStream f = new FileOutputStream("test.zip");

    CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());

    ZipOutputStream zos = new ZipOutputStream(csum);

    BufferedOutputStream out = new BufferedOutputStream(zos);

    zos.setComment("A test of Java Zipping");

    // No corresponding getComment(), though.

    for(int i = 0; i < args.length; i++) {

      System.out.println("Writing file " + args[i]);

      BufferedReader in = new BufferedReader(new FileReader(args[i]));

      zos.putNextEntry(new ZipEntry(args[i]));

      int c;

      while((c = in.read()) != -1)

        out.write(c);

      in.close();

    }

    out.close();

    // Checksum valid only after the file has been closed!

    System.out.println("Checksum: " + csum.getChecksum().getValue());

    // Now extract the files:

    System.out.println("Reading file");

    FileInputStream fi = new FileInputStream("test.zip");

    CheckedInputStream csumi = new CheckedInputStream(fi, new Adler32());

    ZipInputStream in2 = new ZipInputStream(csumi);

    BufferedInputStream bis = new BufferedInputStream(in2);

    ZipEntry ze;

    while((ze = in2.getNextEntry()) != null) {

      System.out.println("Reading file " + ze);

      int x;

      while((x = bis.read()) != -1)

        System.out.write(x);

    }

    System.out.println("Checksum: " + csumi.getChecksum().getValue());

    bis.close();

    // Alternative way to open and read zip files:

    ZipFile zf = new ZipFile("test.zip");

    Enumeration e = zf.entries();

    while(e.hasMoreElements()) {

      ZipEntry ze2 = (ZipEntry)e.nextElement();

      System.out.println("File: " + ze2);

      // ... and extract the data as before

    }

       虽然标准的Zip格式是支持口令的,但是Java的Zip类库却不支持。

      

       Java ARchives (JARs)

       一个JAR只有一个文件,包含两个文件,一个是Zip文件,另一个是描述Zip文件所包含的文件的"manifest(清单)"。

       如果JAR是用0(零)选项创建的,不会进行压缩,那么它就能被列入CLASSPATH了。

       不能往已经做好的JAR里添加新文件或修改文件。不能在往JAR里移文件的同时把原来的文件给删了。不过JAR格式是跨平台的,无论JAR是在哪个平台上创建的,jar程序都能将它读出来(zip格式有时就会有问题了)。

 

       9.对象的序列化

       Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte,需要的时候,根据byte数据重新构建那个对象。这一点甚至在跨网络的环境下也是如此,序列化机制能自动补偿操作系统方面的差异。

       对象序列化不仅能保存对象的副本,而且还会跟着对象里面的reference,把它所引用的对象也保存起来,然后再继续跟踪那些对象的reference,以此类推。这种情形常被称为"单个对象所联结的'对象网'"。这个机制所涵盖的范围不仅包括对象的成员数据,而且还包含数组里面的reference。

       Worm w = new Worm(6, 'a');

    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("worm.out"));

    out.writeObject("Worm storage\n");

    out.writeObject(w);

    out.close(); // Also flushes output

    ObjectInputStream in = new ObjectInputStream(new FileInputStream("worm.out"));

    String s = (String)in.readObject();

    Worm w2 = (Worm)in.readObject();

 

       把对象从序列化状态中恢复出来的必要条件是,一定要让JVM找到.class文件。

      

       控制序列化

       可以让对象去实现Externalizable而不是Serializable接口,并以此来控制序列化的过程。

       对于Externalizable对象,readExternal( )要在默认的构造行为会发生之后(包括在定义数据成员时进行的初始化)才启动。

       不但要在writeExternal( )的时候把重要的数据保存起来(默认情况下,Externalizable对象不会保存任何成员对象),还得在readExternal( )的时候把它们恢复出来。为了能正确地存取其父类的组件,你还得调用其父类的writeExternal( )和readExternal( )。

      

       transient关键词

       要想禁止敏感信息的序列化,除了可以实现Externalizable外。还可以使用transient关键词修饰Serializable对象中不想序列化的成员。

       默认情况下,Externalizable对象不保存任何字段,因此transient只能用于Serializable对象。

      

       Externalizable的替代方案

       如果你不喜欢Externalizable,还可以选择Serializable接口,然后再加入(注意,我没说"覆写"或"实现")序列化和恢复的时候会自动调用的writeObject( )和readObject( )方法。也就是说,如果你写了这两个方法,Java就会避开默认的序列化机制而去调用这两个方法了。

       两个方法的特征签名如下,(它们都是private的,怪异):

private void writeObject(ObjectOutputStream stream) throws IOException;

private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException

       如果你决定用默认的序列化机制来存储非transient的数据,你就得在writeObject( )里面调用defaultWriteObject( ),不带参数,而且得第一个做。恢复的时候,也要在readObject( )的开头部分调用defaultReadObject( )。

       如果你要序列化static数据,就必须亲自动手。

      

       Preferences

       JDK 1.4所引入的Preferences API能自动存储和恢复信息。但是,它只能存取很少几种数据——primitive和String,而且每个String的长度都不能超过8K。

       Preferences是一组存储在"由节点所组成的层次体系(a hierarchy of nodes)"里的键值集(很像Map)。Preferences API是借用操作系统的资源来实现功能的。对于Windows,它就放在注册表里。

       //也可以用systemNodeForPackage( )

       //"user"指的是单个用户的preference,而"system"指整个系统的共用配置

       //一般用XXX.class做节点的标识符

       Preferences prefs = Preferences.userNodeForPackage(PreferencesDemo.class);

    prefs.put("Location", "Oz");

    prefs.putInt("Companions", 4);

    prefs.putBoolean("Are there witches?", true);

   

    10.正则表达式

    正则表达式是JDK 1.4的新功能。由java.util.regex的Pattern和Matcher类实现的。

    Pattern p = Pattern.compile(("\\w+");

       Matcher m = p.matcher(args[0]);

       while(m.find()) {

         System.out.println("Match \"" + m.group() +

           "\" at positions " +

           m.start() + "-" + (m.end() - 1));

       }

    只要字符串里有这个模式,find( )就能把它给找出来,但是matches( )成功的前提是正则表达式与字符串完全匹配,而lookingAt( )成功的前提是,字符串的开始部分与正则表达式相匹配。

      

       split()

       所谓分割是指将以正则表达式为界,将字符串分割成String数组。

       String[] split(CharSequence charseq)

       String[] split(CharSequence charseq, int limit)//限定分割的次数

       String input = "This!!unusual use!!of exclamation!!points";

    System.out.println(Arrays.asList(Pattern.compile("!!").split(input)));

 

 

===========

Chap13   并发编程

 

       1.基本线程

       要想创建线程,最简单的办法就是继承java.lang.Thread。run( )是Thread最重要的方法,什么时候run( )返回了,线程也就中止了。

       Thread的start( )方法会先对线程做一些初始化,再调用run( )。

       整个步骤应该是:调用构造函数创建一个Thread对象,并且在构造函数里面调用start( )来配置这个线程,然后让线程的执行机制去调用run( )。如果你不调用start( ),那么线程永远也不会启动。

       有时我们创建了Thread,但是却没去拿它的reference。如果是普通对象,这一点就足以让它成为垃圾,但Thread不会。Thread都会为它自己"注册",所以实际上reference还保留在某个地方。除非run( )退出,线程中止,否则垃圾回收器不能动它。

       线程的调度机制是非决定性,即多个线程的执行顺序是不确定的。

      

       yielding

       如果知道run()已经告一段落了,你就可以用yield( )形式给线程调度机制作一个暗示。Java的线程调度机制是抢占式的(preemptive),只要它认为有必要,它会随时中断当前线程(运行到yield之前),并且切换到其它线程。总之,yield( )只会在很少的情况下起作用。

      

       Sleeping

       sleep( )一定要放在try域里,这是因为有可能会出现时间没到sleep( )就被中断的情况。如果有人拿到了线程的reference,并且调用了它的interrupt( ),这种事就发生了。(interrupt( )也会影响处于wait( )或join( )状态的线程,所以这两个方法也要放在try域里。)如果你准备用interrupt( )唤醒线程,那最好是用wait( )而不是sleep( ),因为这两者的catch语句是不一样的。

      

       优先级

       线程往控制台打印的时候是不会被中断的,否则控制台的显示就乱了。

      

       守护线程

       所谓"守护线程(daemon thread)"是指,只要程序还在运行,它就应该在后台提供某种公共服务的线程,但是守护线程不属于程序的核心部分。因此,当所有非守护线程都运行结束的时候,程序也结束了。

       要想创建守护线程,必须在它启动之前就setDaemon(true)。守护线程所创建的线程也自动是守护线程。

      

       连接线程

       线程还能调用另一个线程的join( ),等那个线程结束之后再继续运行。如果线程调用了另一个线程t的t.join( ),那么在线程t结束之前(判断标准是,t.isAlive( )等于false),主叫线程会被挂起。

      

       另一种方式:Runable

       类可能已经继承了别的类,这时就需要实现Runable接口了。

       如果要在这个实现了Runable的类里做Thread对象才有的操作,必须用Thread.currentThread()获取其reference。

       除非迫不得已只能用Runnable,否则选Thread。

      

       2.共享有限的资源

       多线程环境的最本质的问题:永远也不会知道线程会在什么时候启动。

       我们不能从线程内部往外面抛异常,因为这只会中止线程而不是程序。

      

       资源访问的冲突

       Semaphore是一种用于线程间通信的标志对象。如果semaphore的值是零,则线程可以获得它所监视的资源,如果不是零,那么线程就必须等待。如果申请到了资源,线程会先对semaphore作递增,再使用这个资源。递增和递减是原子操作(atomic operation,也就是说不会被打断的操作),由此semaphore就防止两个线程同时使用同一项资源。

      

       解决共享资源的冲突

       一个特定的对象中的所有的synchronized方法都会共享一个锁,而这个锁能防止两个或两个以上线程同时读写一块共用内存。当你调用synchronized方法时,这个对象就被锁住了。在方法返回并且解锁之前,谁也不能调用同一个对象的其它synchronized方法。

       一定要记住:所有访问共享资源的方法都必须是synchronized的,否则程序肯定会出错。

       一个线程能多次获得对象的锁。比如,一个synchronized方法调用了另一个synchronized方法,而后者又调用了另一synchronized方法。线程每获一次对象的锁,计数器就加一。当然,只有第一次获得对象锁的线程才能多次获得锁。线程每退出一个synchronized方法,计数器就减一。等减到零了,对象也就解锁了。

       此外每个类还有一个锁(它属于类的Class对象),这样当类的synchronized static方法读取static数据的时候,就不会相互干扰了。

      

       原子操作

       通常所说的原子操作包括对非long和double型的primitive进行赋值,以及返回这两者之外的primitive。不过如果你在long或double前面加了volatile,那么它就肯定是原子操作了。最安全的原子操作只有读取和对primitive赋值这两种。

       如果你要用synchronized修饰类的一个方法,索性把所有的方法全都synchronize了。要判断,哪个方法该不该synchronize,通常是很难的,而且也没什么把握。

       并发编程的最高法则:绝对不能想当然。

      

       关键段

       有时你只需要防止多个线程同时访问方法中的某一部分,而不是整个方法。这种需要隔离的代码就被称为关键段(critical section)。创建关键段需要用到synchronized关键词,指明执行下列代码需获得哪个对象的锁。

synchronized(syncObject) {

  // This code can be accessed by only one thread at a time

}

       关键段又被称为"同步块(synchronized block)"。相比同步整个方法,同步一段代码能显著增加其它线程获得这个对象的机会。

      

       3.线程的状态

       线程的状态可归纳为以下四种:

       (1).new: 线程对象已经创建完毕,但尚未启动(start),因此还不能运行。

       (2).Runnable: 处在这种状态下的线程,只要分时机制分配给它CPU周期,它就能运行。

       (3).Dead: 要想中止线程,正常的做法是退出run( )。

       (4).Blocked: 就线程本身而言,它是可以运行的,但是有什么别的原因在阻止它运行。线程调度机制会直接跳过blocked的线程,根本不给它分配CPU的时间。除非它重新进入runnable状态,否则什么都干不了。

       如果线程被阻塞了,那肯定是出了什么问题。问题可能有以下几种:

       (1).你用sleep(milliseconds)方法叫线程休眠。在此期间,线程是不能运行的。

       (2).你用wait( )方法把线程挂了起来。除非收到notify( )或notifyAll( )消息,否则线程无法重新进入runnable状态。

       (3).线程在等I/O结束。

       (4).线程要调用另一个对象的synchronized方法,但是还没有得到对象的锁。

      

       4.线程间的协作

       wait与notify

       线程sleep( )的时候并不释放对象的锁,但是wait( )的时候却会释放对象的锁。也就是说在线程wait( )期间,别的线程可以调用它的synchronized方法。    此外,sleep( )属于Thread。wait( ), notify( ), 和notifyAll( )是根Object的方法。

       只能在synchronized方法里或synchronized段里调用wait( ),notify( )或notifyAll( )。

       wait( )能让你在等待条件改变的同时让线程休眠,当其他线程调用了对象的notify( )或notifyAll( )的时候,线程自会醒来,然后检查条件是不是改变了。

       安全的做法就是套用下面这个wait( )定式:

       while(conditionIsNotMet)

              wait( );

             

       用管道进行线程间的I/O操作

       在很多情况下,线程也可以利用I/O来进行通信。对Java I/O类库而言,就是PipedWriter(可以让线程往管道里写数据)和PipedReader(让另一个线程从这个管道里读数据)。

      

       5.死锁

       Dijkstra发现的经典的死锁场景:哲学家吃饭问题。

       只有在下述四个条件同时满足的情况下,死锁才会发生:

       (1).互斥:也许线程会用到很多资源,但其中至少要有一项是不能共享的(同一时刻只能被一个线程访问)。

       (2).至少要有一个进程会在占用一项资源的同时还在等另一项正被其它进程所占用的资源。也就是说,要想让死锁发生,哲学家必须攥着一根筷子等另一根。

       (3).(调度系统或其他进程)不能从进程里抢资源。所有进程都必须正常的释放资源。我们的哲学家都彬彬有礼,不会从他的邻座手里抢筷子。

       (4).需要有等待的环。一个进程在等一个已经被另一进程抢占了的资源,而那个进程又在等另一个被第三个进程抢占了的资源,以此类推,直到有个进程正在等被第一个进程抢占了的资源,这样就形成了瘫痪性的阻塞了。这里,由于每个哲学家都是先左后右的拿筷子,所以有可能会造成等待的环。在例程中,我们修改了最后一位哲学家的构造函数,让他先右后左地拿筷子,从而破解了死锁。

       Java语言没有提供任何能预防死锁的机制。

      

       6.停止线程的正确的方法

       为了降低死锁的发生几率,Java 2放弃了Thread类stop( ),suspend( )和resume( )方法。

       应该设置一个旗标(flag)来告诉线程什么时候该停止。

 

       7.打断受阻的线程

       有时线程受阻之后就不能再做轮询了,比如在等输入,这时你就不能像前面那样去查询旗标了。碰到这种情况,你可以用Thread.interrupt( )方法打断受阻的线程。最后要把受阻线程的 reference设成null。

      

       8.总结

       诺贝尔经济学奖得主Joseph Stiglitz有一条人生哲学,就是所谓的承诺升级理论:

"延续错误的代价是别人付的,但是承认错误的代价是由你付的。"

       多线程的主要缺点包括:

       (1).等待共享资源的时候,运行速度会慢下来。

       (2).线程管理需要额外的CPU开销。

       (3).如果设计得不不合理,程序会变得异常复杂。

       (4).会引发一些不正常的状态,像饥饿(starving),竞争(racing),死锁(deadlock),活锁(livelock)。

       (5).不同平台上会有一些不一致。

       通常你可以在run( )的主循环里插上yield( ),然后让线程调度机制帮你加快程序的运行。

 

 

==============

Chap14 创建Windows与Applet程序

      

       设计中一条基本原则:让简单的事情变得容易,让困难的事情变得可行。

       软件工业界的“三次修订”规则:产品在修订三次后才会成熟。

      

       1.控制布局

       在Java中,组件放置在窗体上的方式可能与其他GUI系统都不相同。首先,它完全基于代码,没有用来控制组件布局的“资源”。第二,组件的位置不是通过绝对坐标控制,二十由“布局管理器”(layout manager)根据组件加入的顺序决定其位置。使用不同的布局管理器,组件的大小、形状和位置将大不相同。此外,布局管理器还可以适应applet或视窗的大小,调整组件的布局。

       JApplet,JFrame,JWindow和JDialog都可以通过getContentPane()得到一个容器(Container),用来包含和显示组件。容器有setLayout()方法,用来设置布局管理器。

      

       2.Swing事件模型

       在Swing的事件模型中,组件可以触发一个事件。每种事件的类型由单独的类表示。当事件被触发时,它将被一个或多个监听器接收,监听器负责处理事件。

       所谓事件监听器,就是一个“实现了某种类型的监听器接口的”类的对象。程序员要做的就是,先创建一个监听器对象,然后把它注册给触发事件的组件。注册动作是通过该组件的addXXXListener()方法完成的。

       所有Swing组件都具有addXXXListener()和removeXXXListener()方法。

 

       3.Swing组件一览

      

       工具提示ToolTip

       任何JComponent子类对象都可以调用setToolTipText(String)。

      

       Swing组件上的HTML

       任何能接受文本的组件都可以接受HTML文本,且能根据HTML格式化文本。例如,

       JButton b = new JButton("<html><b><font size=+2>Hello<br>Press me");

       必须以"<html>"标记开始,但不会强制添加结束标记。

       对于JApplet,在除init()之外的地方添加新组件后,必须调用容器的validate()来强制对组件进行重新布局,才能显示新添加的组件。

      

       4.选择外观(Look & Feel)

       “可插拔外观”(Pluggable Look & Feel)使你的程序能够模仿不同操作系统的外观。

       设置外观的代码要在创建任何可视组件之前调用。Swing的跨平台的金属外观是默认外观。

       try{

              UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

       } catch(Exception e){

       }

       catch子句中什么也不用做,因为缺省情况下,如果设置外观失败,UIManager将设置成跨平台的外观。

      

       动态绑定事件

       不能保证事件监听器被调用的顺序与它们被添加的顺序相同。

      

       5.Swing与并发

       始终存在着一个Swing事件调度线程,它用来依次对Swing的所有事件进行调度。

      

       管理并发

       当你在类的main()方法中,或在一个独立线程中,准备修改任何Swing组件属性的时候,要注意,Swing的事件调度线程可能会与你竞争同一资源。

       要解决这个问题,必须确保在任何情况下,只能在事件调度线程里修改Swing组件的属性。Swing提供了两种机制:SwingUtilities.invokeLater(Runnable)和SwingUtilities.invokeAndWait(Runnable)。它们都接受runnable对象作参数,并且在Swing的事件处理线程中,只有当事件队列中的任何未处理的事件都被处理完毕之后,它们才会调用runnable对象的run()方法。

       SwingUtilities.invokeLater(new Runnable(){

              public void run(){

                     txt.setText("ready");

              }

       });

       invokeLater()是异步方法,会立即返回。invokeAndWait()是同步方法,会一直阻塞,直到事件处理完毕才会放回。

      

       6.JavaBean与同步

       当你创建Bean的时候,你必须要假设它可能会在多线程环境下运行。也就是说:

       (1).尽可能让Beand中的所有公共方法都是synchronized。这将导致synchronized的运行时开销。

       (2).当一个多路事件触发了一组对该事件感兴趣的监听器时,必须假定,在遍历列表进行通知的同时,监听器可能会被添加或移除。

       public void notifyListeners(){

              ActionEvent a = new ActionEvent(BangBean2.this, ActionEvent.ACTION_PERFORMED, null);

              ArrayList lv = null;

              //Make a shallow copy of the List in case someone adds a listener while we're

              //calling listeners

              synchronized(this){

                     lv = (ArrayList)actinListeners.clone();

              }

              for(int i = 0; i < lv.size(); i++){

                     ((ActionListener)lv.get(i)).actionPerformed(a);

              }

       }

      

      

      

      

 

==============

Chap15 发现问题

 

       1.单元测试

       //Discover the name of the class this object was created within:

       className = new Throwable().getStackTrace()[1].getClassName();

      

       JUnit

       JUnit在输出消息中使用"."表示每个测试的开始。

       JUnit为每个测试创建一个测试对象(继承自TestCase),以确保在测试运行之间没有不利的影响。所有的测试对象都是同时被创建的,而不是正好在测试方法执行之前才创建。

       setUp是在每个测试方法运行之前被调用的。

      

       2.利用断言提高可靠性

       断言语法

       assert boolean-expression;

       assert boolean-expression: information-expression;

      

       在JDK 1.4中,缺省情况下断言是关闭的。为了防止编译时的错误,必须带下面的标志进行编译:

       -source 1.4

       如:javac -source 1.4 Assert1.java

      

       运行程序也必须加上标志-ea,全拼是-enableassertions。这样才会执行所有的断言语句。

      

       我们也可以基于类名或包名来决定打开或关闭断言。

       还有另一种动态控制断言的方法:通过ClassLoader对象的方法setDefaultAssertionStatus(),它为所有随后载入的类设置断言的状态。

       public static void main(String[] args){

              ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);

              //other statements

       }

       这样可以在运行时,不必使用-ea标志,但是仍然必须使用-source 1.4标志编译。

      

       为DBC使用断言

      

       DBC(Design by Contract)是由Bertrand Meyer(Eiffel编程语言的创建者)所阐明的一个概念,它通过确保对象遵循特定的、不能被编译时的类型检查所验证的规则,来帮助建立健壮的程序。

      

       3.剖析和优化

       “我们应该忽略较小的效率,在97%的时间里我们都应该说:不成熟的优化是万恶之源。”--Donald Knuth

      

       最优化指南

       避免为性能而牺牲代码的可读性。

       不能孤立地考虑性能。要权衡所需付出的努力与能得到的利益之间的关系。

       性能是大型工程要关心的问题,但通常不是小型工程要考虑的。

       使程序可运转比钻研程序的性能有更高的优先权。仅当性能被确定是一个关键因素的时候,在初始设计开发过程期间才应该予以考虑。

       不要假设瓶颈在什么地方,而应该运行剖析器来获得数据。

       在任何可能的情况下,尽量通过将对象设置为null,从而显式地将其销毁。有时这可能是对垃圾回收器的一种很有帮助的提示。

       程序大小的问题。仅当程序是大型的、运行时间长而且速度也是一个问题时,性能优化才有价值。

       static final变量可以通过JVM进行优化以提高程序的速度。

      

       做可以运转的最简单的事物。(极限编程)

      

 

 

================

附录A:对象的传递与返回

 

       确切地说,Java有指针。Java中(除了基本类型)每个对象的标识符就是一个指针。但是它们受到了限制,有编译器和运行期系统监视着它们。Java有指针,但没有指针的相关算法。可以将它们看作“安全的指针”。

       “别名效应”是指,多个引用指向同一个对象。将引用作为方法的参数传递时,它会自动被别名化。

      

       制作局部拷贝

       Java中所有的参数传递,执行的都是引用传递。当你传递对象时,真正传递的只是一个引用,指向存活于方法外的“对象”。对此引用做的任何修改,都是在修改方法外的对象。此外:

       (1).别名效应在参数传递时自动发生。

       (2).方法内没有局部对象,只有局部引用。

       (3).引用有作用域,对象则没有。

       (4).在Java中,不需要为对象的生命周期操心。

       (5).没有提供语言级别的支持(例如“常量”)以阻止对象被修改,或者消除别名效应的负面影响。不能简单地使用final关键字来修饰参数,它只能阻止你将当前引用指向其他对象。

      

       克隆对象

       如果确实要在方法调用中修改参数,但又不希望修改外部参数,那么就应该在方法内部制作一份参数的副本,以保护原参数。

       Object类提供了protected方法clone(),要使用它,必须在子类中以public方式重载此方法。例如,ArrayList就重载了clone()。ArrayList的clone()方法,并不自动克隆容器中包含的每个对象,只是将原ArrayList中的对象别名化,即只复制了ArrayList中对象的引用。这称为浅拷贝(shallow copy)。

      

       使类具有克隆能力

       虽然在所有类的基类Object中定义了克隆方法,但也不是每个类都自动具有克隆能力。

       克隆对象时有两个关键问题:

       (1).调用super.clone()

       (2).将子类的clone()方法声明为public

       基类的clone()方法,能“逐位复制(bitwise copy)”对象。

      

       实现Cloneable接口

       interface Cloneable{}

       这样的空接口称为“标记接口(tagging interface)”。

       Cloneable接口的存在有两个理由。第一,如果某个引用上传为基类后,就不知道它是否能克隆。此时,可以用instanceof检查该引用是否指向一个可克隆的对象。

       if(myref instanceof Cloneable)//...

       第二,与克隆能力的设计有关,考虑到也许你不愿意所有类型的对象都是可克隆的。所以Object.clone()会检查当前类是否实现了Cloneable接口,如果没有,就抛出CloneNotSupportedException异常。所以,作为实现克隆能力的一部分,通常必须实现Cloneable接口。

      

       ==与!=

       Java比较对象相等的等价测试并未深入对象的内部。==和!=只是简单地比较引用。如果引用代表的内存地址相同,则它们指向同一个对象,因此视为相等。所以,该操作符测试的是:不同的引用是否是同一个对象的别名。

      

       Object.clone()的效果

       克隆过程的第一步通常都是调用super.clone()。它制作出完全相同的副本,为克隆操作建立了基础。在此基础上,你可以执行对完成克隆必要的其他操作。

       这里的其他操作是指,对对象中的每个引用,都明确地调用clone()。否则,那些引用会被别名化,仍指向原本的对象。

       只要没有向子类中添加需要克隆的引用,那么无论clone()定义于继承层次中多深的位置,只需要调用Object.clone()一次,就能完成所有必要的复制。

       对ArrayList深层拷贝而言,以下操作是必须的:克隆ArrayList之后,必须遍历ArrayList中的每个对象,逐一克隆。对HashMap做深层拷贝,也必须做类似的操作。

      

       向继承体系的更下层增加克隆能力

       可以向任意层次的子类添加克隆能力,从那层以下的子类,也就都具备了克隆能力。

      

       克隆小结

       如果希望一个类可以被克隆:

       (1).实现Cloneable接口。

       (2).重载clone(),声明为public。

       (3).在clone()中调用Super.clone()。

       (4).在clone()中捕获异常。

      

       只读类

       在只读类中所有数据都是private的,并且没有定义会修改对象内部状态的方法。只读类的对象可以有很多别名,也不会造成伤害。例如,Java标准类库中所有基本类型的包装类。

      

       恒常性(immutability)的缺点

       当你需要一个被修改过的此类的对象的时候,必须承受创建新对象的开销,也会更频繁地引发垃圾回收。对于有些类(如String),其代价让人不得不禁止这么做。

       解决之道是创建一个可被修改的伴随类(companion class)。

      

 

=============

附录B:Java编程指南

 

       设计

       1.优雅设计终将得到回报。精心设计程序的时候生产率不会很高,但欲速则不达。

       2.先能运行,再求快速。

       3.分而治之。

       4.尽量让所有东西自动化。(如测试和构建,先写测试,再编写类)

       5.尽可能使类原子化。

       建议重新设计类的线索有:

       (1).复杂的switch语句,请考虑使用多态。

       (2).有许多方法,处理类型极为不同的操作:请考虑划分成不同的类。

       (3).有许多成员变量,表示类型极为不同的属性:请考虑划分成不同的类。

       (4).参考《Refactoring:Improving the Design of Existing Code》,Martin Fowler著,(Addison-Wesley 1999)。

       6.将变动的和不变的因素分离。

       7.在判断应该使用继承还是组合的时候,考虑是否需要上传为基类。

      

       实现

       1.编写通用性的类时,请遵守标准形式。包括定义equals()、hashCode()、toString()、clone()(实现Cloneable接口,或者选择其它对象复制策略),并实现Comparable和Serialiable接口。

       2.在构造器中只做必要的动作:将对象设定为正确的状态。避免在构造器内调用其它方法(final方法除外),因为这些方法可能会被其他人重载,这就可能在构造期间得到意外的结果。

       3.优先选择接口而不是抽象类。只有在必须放进方法定义或成员变量时,才把它改为抽象类。接口只和客户希望的动作有关,而类则倾向于实现细节。
 

posted @ 2006-12-11 16:29 重归本垒(Bing) 阅读(876) | 评论 (0)编辑 收藏
 
安装orcale9i客户端时出问题:加载数据库时出错!
原来是在安装文件的路径有中文名,改了,就通过了。
posted @ 2006-12-01 11:28 重归本垒(Bing) 阅读(412) | 评论 (0)编辑 收藏
仅列出标题
共12页: First 上一页 4 5 6 7 8 9 10 11 12 下一页 
 
Web Page Rank Icon