博文
李开复给中国学生的第四封信:大学四年应是这样度过(2006-08-30 17:09:00)
摘要:给中国学生的第四封信:大学最重要的七项学习
李开复 2005年02月23日
“就读大学时,你应当掌握七项学习,包括自修之道、基础知识、实践贯通、培养兴趣、积极主动、掌控时间、为人处世。
经过大学四年,你会从思考中确立自我,从学习中寻求真理,从独立中体验自主,从计划中把握时间,从表达中锻炼口才,从交友中品味成熟,从实践中赢得价值,从兴趣中获取快乐,从追求中获得力量。
离开大学时,只要做到了这些,你最大的收获将是“对什么都可以拥有的自信和渴望”。你就能成为一个有潜力、有思想、有价值、有前途的中国未来的主人翁。”
——李开复:现任微软公司全球副总裁,是微软亚洲研究院的首任院长。
近日,我回复了“开复学生网”开通以来的第1000个问题。关掉电脑后,始终有一封学生来信萦绕在我的脑海里,挥之不去:
开复老师:
就要毕业了。
回头看自己所谓的大学生活,我想哭,不是因为离别,而是因为什么都没学到。
我不知,简历该怎么写,若是以往我会让它空白。
最大的收获也许是……对什么都没有的忍耐和适应……
这封信道出了不少大三、大四学生的心声。大学期间,有许多学生放任自己、虚度光阴,还有许多学生始终也找不到正确的学习方向。当他们被第一次补考通知唤醒时,当他们收到第一封来自招聘企业的婉拒信时,这些学生才惊讶地发现,自己的前途是那么渺茫,一切努力似乎都为时已晚……
大学是人生的关键阶段。这是因为,进入大学是你一生中第一次放下高考的重担,开始追逐自己的理想、兴趣;这是你第一次离开家庭生活,独立参与团体和社会生活;这是你第一次可以有机会在学习理论的同时亲身实践;这是你第一次脱离被动,有足够的自由处置生活和学习中遇到的各类问题,支配所有属于自己的时间。
大学是人生的关键阶段。这是因为,这是你一生中最后一次有机会系统性地接受教育和建立知识基础。这很可能是你最后一次可以将大段时间用于学习的人生阶段,也可能是最后一次可以拥有较高的可塑性、可以不断修正自我的成长历程。这很可能是你最后一次能在相对宽容的,可以置身其中学习为人处世之道的理......
李开复给中国学生的第一封信:从诚信谈起(2006-08-30 17:08:00)
摘要:李开复:给中国学生的一封信(第一封信)
今年5月23日,比尔•盖茨先生在《华尔街日报》上撰文,支持和敦促美国政府给予中国永久性正常贸易国待遇。文中,他特别谈到了在清华大学与中国大学生那次对话的愉快经历以及因此而留下的深刻印象。
这篇文章令我不禁想到,在中国的这两年来,我工作中最大的享受也是到国内各高校与学生们进行交流。这些访问和交流使得我有机会与成千上万的青年学生就他们所关心的事业、前途等问题进行面对面的沟通。中国学生的聪明、好学和上进给我留下了非常深刻的印象。
在与这些青年学生的交流过程中,我发现有一些问题是大家都十分关心的。那些已经获得国外大学奖学金的学生,大都希望我谈一谈应该如何度过自己在美国的学习生涯;那些决定留在国内发展的学生,非常关心如何确定一个正确的方向,并以最快的速度在科研和学业方面取得成功;还有那些刚刚踏进大学校门的学生,则希望我能讲给他们一些学习、做人的经验之谈。最近,更有一些学生关心网络信息产业的发展,希望了解美国的大学生是如何创业和致富的。
看到这么多双渴求知识、充满希望的眼睛,我突然产生了一种冲动,那就是给中国的学生们写一封信,将我与同学们在交流过程中产生的一些想法以及我要对中国学生的一些忠告写出来,帮助他们在未来的留学、工作或者创业的过程中能够人格更完美、生活更顺利,事业更成功。
坚守诚信、正直的原则
我在苹果公司工作时,曾有一位刚被我提拔的经理,由于受到下属的批评,非常沮丧地要我再找一个人来接替他。我问他:“你认为你的长处是什么?”他说,“我自信自己是一个非常正直的人。”我告诉他:“当初我提拔你做经理,就是因为你是一个公正无私的人。管理经验和沟通能力是可以在日后工作中学习的,但一颗正直的心是无价的。”我支持他继续干下去,并在管理和沟通技巧方面给予他很多指点和帮助。最终,他不负众望,成为一个出色的管理人才。现在,他已经是一个颇为成功的公司的首席技术官。
与之相反,我曾面试过一位求职者。他在技术、管理方面都相当的出色。但是,在谈论之余,他表示,如果我录取他,他甚至可以把在原来公司工作时的一项发明带过来。随后他似乎觉察到这样说有些不妥,特作声明:那......
李开复给中国学生的第二封信——从优秀到卓越(2006-08-30 17:07:00)
摘要:
微软副总裁李开复给中国学生的一封信(第二封信)
三年前离开中国时,我在《给中国学生的一封信》中,与广大青年学生一道,讨论了一些大家共同关心的话题,并结合自己的学习和工作经历,就青年学生如何对待机遇、学业、工作、他人、自己等问题,阐述了我的个人意见。我提出诚信和正直、主动意识、交流和沟通、努力一生学习这几个个人素质方面值得中国学生高度重视,
在这三年,许多中国学生,经过电子邮件、讲座后的问答、座谈、和其他渠道(例如在电视节目“对话”中),常对我提到“如何成才”的问题。对于这个大家关注的问题,我整理了许多材料,集成这封“第二封信”。
在第一封信力所提到的个人素质或“价值观”是成材的必要的基础。但是,除了素质之外,成才同样的需要领导能力(leadership)。很多人误以为领导能力最重视的是天资、号召力、管理能力。但是,根据我个人的经验,和最近一些研究的结论,如果你想成为一名成功的领导,最重要的不是你的智商(IQ),而是你的情商(EQ)。最重要的不是要成为一个有号召力令人信服的领导,而是要成为一个有 “谦虚”、“执著”和“勇气” 的领导。
这“给中国学生的第二封信”是为那些希望不断提高自己,不断学习事业成功所必需的基本技能和领导艺术的人所写的。第一部分重申了《给中国学生的一封信》中讨论过的有关个人素质的话题;第二部分阐释了领导能力中最重要的情商;第三部分给出了卓越的领导所必须具备的、有别于普通人的基本特质。
1.如何提高个人素质
诚信和正直
一个人的人品如何直接决定了这个人对于社会的价值。而在与人品相关的各种因素之中,诚信又是最为重要的一点。微软公司在用人时非常强调诚信,我们只雇佣那些最值得信赖的人。去年,当微软列出对员工期望的“核心价值观”时,诚信(honesty and integrity)被列为一位。
在我发表“第一封信”后,曾经有一位同学问我:为什么一个公司要涉入员工的道德呢?我回答:这是为了公司自己的利益。例如,一位应聘者在面试时曾对我说,如果他能加入微软公司,他就可以把他在前一家公司所做的发明成果带过来。对这样的人,无论他的技术水平如何,我都不会雇用他。他既然可以在加入微软时损害先前公司的利益,那他也一定会在加入微软后损害微软公司的利益。
李开复针对马加爵事件写给中国学生的一封信(第三封信):成功、自信、快乐(2006-08-30 17:04:00)
摘要:李开复针对马加爵事件写给中国学生的一封信 (第三封信2004.5)
――给中国青年学生的一封信
此前,我和中国学生的多次交流都是围绕如何达到优秀和卓越,如何成为领导人才而展开的。最近,在新浪网的聊天室和我收到的许多电子邮件中,我发现更多的中国学生需要知道的不是如何从优秀到卓越,而是如何从迷茫到积极、从失败到成功、从自卑到自信、从惆怅到快乐、从恐惧到乐观。
一个极端的例子是2004年2月发生在云南大学的马加爵事件。马加爵残忍地杀害了自己的4名同学。但从马家爵被捕后与心理学家的对话内容看来,他应该不是一个邪恶的人,而是一个迷失方向、缺乏自信、性格封闭的孩子。他和很多大学生一样,迫切希望知道如何才能获得成功、自信和快乐。
我这一封信是写给那些渴望成功但又觉得成功遥不可及,渴望自信却又总是自怨自艾,渴望快乐但又不知快乐为何物的学生看的。希望这封信能够带给读者一个关于成功的崭新定义,鼓励读者认识和肯定自己,做一个快乐的人。
1.成功就是成为最好的你自己
美国作家威廉•福克纳说过:“不要竭尽全力去和你的同僚竞争。你应该在乎的是,你要比现在的你强。”
中国社会有个通病,就是希望每个人都照一个模式发展,衡量每个人是否“成功”采用的也是一元化的标准:在学校看成绩,进入社会看名利。尤其是在今天的中国,人们对一个人的成功的评价,更多地以个人财富为指标。但是,有了最好的成绩就能对社会有所贡献吗?有名利就一定能快乐吗?
真正的成功应是多元化的。成功可能是你创造了新的财富或技术,可能是你为他人带来了快乐,可能是你在工作岗位上得到了别人的信任,也可能是你找到了回归自我、与世无争的生活方式。每个人的成功都是独一无二的。
成功的第一步:把握人生目标,做一个主动的人
在新浪聊天室里,当网友问我的人生目标是什么时,我是这么回答的:“人生只有一次,我认为最重要的就是要有最大的影响力(impact),能够帮助自己、帮助家庭、帮助国家、帮助世界、帮助后人,能够让他们的日子过得更好、更有效率,能够为他们带来幸福和快乐。”
对我来说,人生目标不是一个口号,而是我最好的智囊,它曾多次帮我解决工作和生活中的难题。我当初放弃在美国的工作,只身来到中......
C++从零开始(十一)(下)——类的相关知识 (2006-08-30 16:55:00)
摘要:本文的中篇已经介绍了虚的意思,就是要间接获得,并且举例说明电视机的频道就是让人间接获得电视台频率的,因此其从这个意义上说是虚的,因为它可能操作失败——某个频道还未调好而导致一片雪花。并且说明了间接的好处,就是只用编好一段代码(按5频道),则每次执行它时可能有不同结果(今天5频道被设置成中央5台,明天可以被定成中央2台),进而使得前面编的程序(按5频道)显得很灵活。注意虚之所以能够很灵活是因为它一定通过“一种手段”来间接达到目的,如每个频道记录着一个频率。但这是不够的,一定还有“另一段代码”能改变那种手段的结果(频道记录的频率),如调台。
先看虚继承。它间接从子类的实例中获得父类实例的所在位置,通过虚类表实现(这是“一种手段”),接着就必须能够有“另一段代码”来改变虚类表的值以表现其灵活性。首先可以自己来编写这段代码,但就要求清楚编译器将虚类表放在什么地方,而不同的编译器有不同的实现方法,则这样编写的代码兼容性很差。C++当然给出了“另一段代码”,就是当某个类在同一个类继承体系中被多次虚继承时,就改变虚类表的值以使各子类间接获得的父类实例是同一个。此操作的功能很差,仅仅只是节约内存而已。如:
struct A { long a; };
struct B : virtual public A { long b; }; struct C : virtual public A { long c; };
struct D : public B, public C { long d; };
这里的D中有两个虚类表,分别从B和C继承而来,在D的构造函数中,编译器会编写必要的代码以正确初始化D的两个虚类表以使得通过B继承的虚类表和通过C继承的虚类表而获得的A的实例是同一个。
再看虚函数。它的地址被间接获得,通过虚函数表实现(这是“一种手段”),接着就必须还能改变虚函数表的内容。同上,如果自己改写,代码的兼容性很差,而C++也给出了“另一段代码”,和上面一样,通过在派生类的构造函数中填写虚函数表,根据当前派生类的情况来书写虚函数表。它一定将某虚函数表填充为当前派生类下,类型、名字和原来被定义为虚函数的那个函数尽量匹配的函数的地址。如:
struc......
C++从零开始(十一)(中)——类的相关知识(2006-08-30 16:55:00)
摘要:由于篇幅限制,本篇为《C++从零开始(十一)》的中篇,说明多重继承、虚继承和虚函数的实现方式。
多重继承
这里有个有趣的问题,如下:
struct A { long a, b, c; char d; }; struct B : public A { long e, f; };
上面的B::e和B::f映射的偏移是多少?不同的编译器有不同的映射结果,对于派生的实现,C++并没有强行规定。大多数编译器都是让B::e映射的偏移值为16(即A的长度,关于自定义类型的长度可参考《C++从零开始(九)》),B::f映射20。这相当于先把空间留出来排列父类的成员变量,再排列自己的成员变量。但是存在这样的语义——西红柿即是蔬菜又是水果,鲸鱼即是海洋生物又是脯乳动物。即一个实例既是这种类型又是那种类型,对于此,C++提供了多重派生或称多重继承,用“,”间隔各父类,如下:
struct A { long A_a, A_b, c; void ABC(); }; struct B { long c, B_b, B_a; void ABC(); };
struct AB : public A, public B { long ab, c; void ABCD(); };
void A::ABC() { A_a = A_b = 10; c = 20; }
void B::ABC() { B_a = B_b = 20; c = 10; }
void AB::ABCD() { A_a = B_a = 1; A_b = B_b = 2; c = A::c = B::c = 3; }
void main() { AB ab; ab.A_a = 3; ab.B_b = 4; ab.ABC(); }
上面的结构AB从结构A和结构B派生而来,即我们可以说ab既是A的实例也是B的实例,并且还是AB的实例。那么在派生AB时,将生成几个映射元素?照前篇的说法,除了AB的类型定义符“{}”中定义的AB::ab和AB::c以外(类型均为long AB::),还要生成继承来的映射元素,各映射元......
C++从零开始(十一)(上)——类的相关知识(2006-08-30 16:54:00)
摘要:前面已经介绍了自定义类型的成员变量和成员函数的概念,并给出它们各自的语义,本文继续说明自定义类型剩下的内容,并说明各自的语义。
权限
成员函数的提供,使得自定义类型的语义从资源提升到了具有功能的资源。什么叫具有功能的资源?比如要把收音机映射为数字,需要映射的操作有调整收音机的频率以接收不同的电台;调整收音机的音量;打开和关闭收音机以防止电力的损耗。为此,收音机应映射为结构,类似下面:
struct Radiogram
{
double Frequency; /* 频率 */ void TurnFreq( double value ); // 改变频率
float Volume; /* 音量 */ void TurnVolume( float value ); // 改变音量
float Power; /* 电力 */ void TurnOnOff( bool bOn ); // 开关
bool bPowerOn; // 是否开启
};
上面的Radiogram::Frequency、Radiogram::Volume和Radiogram::Power由于定义为了结构Radiogram的成员,因此它们的语义分别为某收音机的频率、某收音机的音量和某收音机的电力。而其余的三个成员函数的语义也同样分别为改变某收音机的频率、改变某收音机的音量和打开或关闭某收音机的电源。注意这面的“某”,表示具体是哪个收音机的还不知道,只有通过成员操作符将左边的一个具体的收音机和它们结合时才知道是哪个收音机的,这也是为什么它们被称作偏移类型。这一点在下一篇将详细说明。
注意问题:为什么要将刚才的三个操作映射为结构Radiogram的成员函数?因为收音机具有这样的功能?那么对于选西瓜、切西瓜和吃西瓜,难道要定义一个结构,然后给它定义三个选、切、吃的成员函数??不是很荒谬吗?前者的三个操作是对结构的成员变量......
C++从零开始(十)——何谓类 (2006-08-30 16:53:00)
摘要:160前篇说明了结构只不过是定义了内存布局而已,提到类型定义符前还可以书写class,即类型的自定义类型(简称类),它和结构根本没有区别(仅有一点小小的区别,下篇说明),而之所以还要提供一个class,实际是由于C++是从C扩展而成,其中的class是C++自己提出的一个很重要的概念,只是为了与C语言兼容而保留了struct这个关键字。不过通过前面括号中所说的小小区别也足以看出C++的设计者为结构和类定义的不同语义,下篇说明。
暂时可以先认为类较结构的长足进步就是多了成员函数这个概念(虽然结构也可以有成员函数),在了解成员函数之前,先来看一种语义需求。
操作与资源
程序主要是由操作和被操作的资源组成,操作的执行者就是CPU,这很正常,但有时候的确存在一些需要,需要表现是某个资源操作了另一个资源(暂时称作操作者),比如游戏中,经常出现的就是要映射怪物攻击了玩家。之所以需要操作者,一般是因为这个操作也需要修改操作者或利用操作者记录的一些信息来完成操作,比如怪物的攻击力来决定玩家被攻击后的状态。这种语义就表现为操作者具有某些功能。为了实现上面的语义,如原来所说进行映射,先映射怪物和玩家分别为结构,如下:
struct Monster { float Life; float Attack; float Defend; };
struct Player { float Life; float Attack; float Defend; };
上面的攻击操作就可以映射为void MonsterAttackPlayer( Monster &mon, Player &pla );。注意这里期望通过函数名来表现操作者,但和前篇说的将过河方案起名为sln一样,属于一种本末倒置,因为这个语义应该由类型来表现,而不是函数名。为此,C++提供了成员函数的概念。
成员函数
与之前一样,在类型定义符中书写函数的声明语句将定义出成员函数,如下:
struct ABC { long a; void AB( long ); };
上面就定义了一个映射元素——第一个变量A......
C++从零开始(九)——何谓结构(2006-08-30 16:52:00)
摘要:前篇已经说明编程时,拿到算法后该干的第一件事就是把资源映射成数字,而前面也说过“类型就是人为制订的如何解释内存中的二进制数的协议”,也就是说一个数字对应着一块内存(可能4字节,也可能20字节),而这个数字的类型则是附加信息,以告诉编译器当发现有对那块内存的操作语句(即某种操作符)时,要如何编写机器指令以实现那个操作。比如两个char类型的数字进行加法操作符操作,编译器编译出来的机器指令就和两个long类型的数字进行加法操作的不一样,也就是所谓的“如何解释内存中的二进制数的协议”。由于解释协议的不同,导致每个类型必须有一个唯一的标识符以示区别,这正好可以提供强烈的语义。
typedef
提供语义就是要尽可能地在代码上体现出这句或这段代码在人类世界中的意义,比如前篇定义的过河方案,使用一char类型来表示,然后定义了一数组char sln[5]以期从变量名上体现出这是方案。但很明显,看代码的人不一定就能看出sln是solution的缩写并进而了解这个变量的意义。但更重要的是这里有点本末倒置,就好像这个东西是红苹果,然后知道这个东西是苹果,但它也可能是玩具、CD或其它,即需要体现的语义是应该由类型来体现的,而不是变量名。即char无法体现需要的语义。
对此,C++提供了很有意义的一个语句——类型定义语句。其格式为typedef <源类型名> <标识符>;。其中的<源类型名>表示已存在的类型名称,如char、unsigned long等。而<标识符>就是程序员随便起的一个名字,符合标识符规则,用以体现语义。对于上面的过河方案,则可以如下:
typedef char Solution; Solution sln[5];
上面其实是给类型char起了一个别名Solution,然后使用Solution来定义sln以更好地体现语义来增加代码的可读性。而前篇将两岸的人数分布映射成char[4],为了增强语义,则可以如下:
typedef char PersonLayout[4]; PersonLayout oldLayout[200];
注意上面是typedef char PersonLayout......
C++从零开始(八)——C++样例一 (2006-08-30 16:51:00)
摘要:前篇说明了函数的部分实现方式,但并没有说明函数这个语法的语义,即函数有什么用及为什么被使用。对于此,本篇及后续会零散提到一些,在《C++从零开始(十二)》中再较详细地说明。本文只是就程序员的基本要求——拿得出算法,给得出代码——给出一些样例,以说明如何从算法编写出C++代码,并说明多个基础且重要的编程概念(即独立于编程语言而存在的概念)。
由算法得出代码
本系列一开头就说明了何谓程序,并说明由于CPU的世界和人们存在的客观物理世界的不兼容而导致根本不能将人编写的程序(也就是算法)翻译成CPU指令,但为了能够翻译,就必须让人觉得CPU世界中的某些东西是人以为的算法所描述的某些东西。如电脑屏幕上显示的图片,通过显示器对不同象素显示不同颜色而让人以为那是一幅图片,而电脑只知道那是一系列数字,每个数字代表了一个象素的颜色值而已。
为了实现上面的“让人觉得是”,得到算法后要做的的第一步就是找出算法中要操作的资源。前面已经说过,任何程序都是描述如何操作资源的,而C++语言本身只能操作内存的值这一种资源,因此编程要做的第一步就是将算法中操作的东西映射成内存的值。由于内存单元的值以及内存单元地址的连续性都可以通过二进制数表示出来,因此要做的第一步就是把算法中操作的东西用数字表示出来。
上面做的第一步就相当于数学建模——用数学语言将问题表述出来,而这里只不过是用数字把被操作的资源表述出来罢了(应注意数字和数的区别,数字在C++中是一种操作符,其有相关的类型,由于最后对它进行计算得到的还是二进制数故使用数字进行表示而不是二进制数,以增强语义)。接着第二步就是将算法中对资源的所有操作都映射成语句或函数。
用数学语言对算法进行表述时,比如将每10分钟到车站等车的人的数量映射为一随机变量,也就前述的第一步。随后定此随机变量服从泊松分布,也就是上面的第二步。到站等车的人的数量是被操作的资源,而给出的算法是每隔10分种改变这个资源,将它的值变成按给定参数的泊松函数分布的一随机值。
在C++中,前面已经将资源映射成了数字,接着就要将对资源的操作映射成对数字的操作。C++中能操作数字的就只有操作符,也就是将算法中对资源的所有操作都映射成表达式语句。
当......