2008年12月1日星期一
谷歌李开复:我的传奇人生源于十句箴言
对于成功,不仅仅是对名利的追逐,不应该完全用世俗的价值观去衡量成功与否,而是实现自己的价值,关爱自己身边的人,给这个世界带来更多的影响力,用自己的力量去感染周围的磁场。当你某一天逝去的时候,你的墓志铭上应该撰写的是对你最公平的评价。成功的定义应该是多元化的。
在这个下午,谷歌大中华区总裁李开复用平实而不失幽默的语言,讲述了自己成长中的很多故事。和许多人的成长经历相似,他的成长中也有儿时的淘气顽皮,学生时代的疑问与困惑,有获得成功时的泪水与喜悦,也有经历困难与挫折时的蹉跎与彷徨。甚至有经历人生最低潮时期的痛苦与煎熬。但是与众不同的是,李开复在成功中收获了经验,在失败中得到了成长。他把富有传奇的人生经历浓缩成为十句具有启发性的箴言,在如同与你交谈般的娓娓道来中,将这种宝贵的人生经验像冬日暖阳一样,洒满了整个房间。
●成功箴言之一:
自信不失谦虚 谦虚不失自信
李开复1961年出生于台湾,母亲在43岁高龄时生下他前,被医生数次劝阻。因为医生透露,如此高龄的产妇很可能生下白痴。但是母亲不顾一切劝阻生下了这个幺儿。这个幺儿在母亲的极度宠爱下自由自在地成长着,喜欢做很多恶作剧。把家里所有的钟表调慢一小时以便晚上床睡觉。把邻居池塘里的水放干以证实邻居池塘里并没有100条鱼。这一切母亲都只是报以宽容的一笑。但是母亲不允许孩子傲慢和目中无人。
当5岁的李开复得意洋洋地对邻居阿姨表示“上小学以后就没有见过99分”后。母亲不允许这样的狂放存在于孩子身上,有史以来第一次打了开复。母亲告诉他,“不只要好好学习,还要改掉骄傲的毛病。自夸是要不得的。谦虚是中国人的美德。”母亲总是不失时机地把做人的道理告诉开复。这一次强烈的记忆,使得开复懂得如何在谦虚和自信中保持平衡,而不会在自卑或自负中跌倒。
●成功箴言之二:
天赋就是兴趣 兴趣就是天赋
李开复11岁留学美国之后,一直在美国成长。1972年,他进入了美国哥伦比亚大学学习“政治科学”专业。然而两年的学习让他知道自己的兴趣并非在政治方面。学习的枯燥经常让他在课堂上昏昏欲睡,学习成绩也不尽如人意。但是,他发现他在选修的计算机课上,有着惊人的天赋。往往是别人还在苦思冥想如何写出程序时,他早就把程序写完而无所事事。后来,他发现他像发疯一样爱上了这门学科。因此,在大学二年级时,他自己做出了一个惊人的决定,“转系!”这意味着他将从一个全美排名第3的专业转到一个毫无名气可言的专业。但是,他听从了内心的选择,还是选择了计算机专业。而这个决定,改写了他一生的轨迹。
●成功箴言之三:
思考比传道重要 观点比解惑重要
李开复以哥伦比亚大学计算机专业第一名的成绩毕业以后,顺利进入匹兹堡的卡内基·梅隆大学就读计算机专业的博士。在读博士之前,他的系主任Haberman就告诉他,读博士的目的,就是要做出世界上一流的博士论文。至少在本领域是世界顶尖的。这句话让李开复十分震撼。然而,下面一句话,让他受益更深,Haberman说,“做出一流的博士论文,也不是读博士的最终目的。而是你在读博士的过程中,获得一种思考的方法,而这种方法将使你在任何一个领域,都获得顶尖的成功!”而李开复的努力证实了这种说法。李开复关于统计学方法做出的语音识别博士论文至今还是语音识别产品的理论基础。而李开复也在博士生涯中,学会了解决问题,拥有了战胜困难的勇气。
●成功箴言之四:
我不同意你 但我支持你
李开复在读博士期间选择的研究方向是“语音识别”。师从博士生导致罗迪。罗迪教授鼓励李开复用专家统计的方法来研究语音识别,而李开复在这个领域经过了一番研究后,发现语音识别用这个方法可以获得特定语者95%的语音识别率。李开复把整个研究过程写了一篇论文。一经发表,得到了很正面的回馈。但是他最终发现,专家系统是有严重局限性的,无法延伸到做不特定语者的语音识别。他认为有数据的支持的统计模式是唯一的希望。当他把想法告诉导师,罗迪告诉他,“我不同意你,但是我支持你!”这样的说法让李开复备受感动,成就了李开复博士论文的成功。他的论文当年被评为《商业周刊》最杰出创新。
●成功箴言之五:
挫折不是惩罚 而是学习的机会
李开复在博士生生涯里,成绩依然优秀。他用统计学做出的语音识别率大大地提高了,而博士论文发表在国际期刊上,让全美的科技界震惊。这样一个明星学生可以说在卡内基·梅隆里没有什么忧愁可言。然而,一次暑期课程让他经历了不小的挫折。1983年暑假,李开复得到了暑期工的工作。
其任务就是教宾夕法尼亚州60个最聪明的高中生计算机课程。李开复自己对那段时光非常享受,每天忙碌地备课,还想出各种教学方法。但是,他领取薪水的那一瞬间看到学生的评语,才知道学生认为,“李老师的教学就像催眠曲!”这样的评价无疑使得李开复备受打击。
然而,李开复并没有气馁。他把失败当成了学习的机会,因此获得了成功。他在此后的生涯里,尤其是回到中国以后,做了上千场的演讲。这无疑得益于学生时代的练习。
●成功箴言之六:
创新不重要 有用的创新才重要
在苹果和SGI李开复度过了八年科学家到产品副总裁的路程。在这段路程上,他有许多成功,例如苹果的QuickTime,但是在SGI他碰到了巨大的挫折。他的团队发明的三维浏览器,在市场上失败,整个团队和产品被公司廉价卖掉。这时,他又发挥了“从挫折中学习”的反省。他理解了,仅仅有科学家的“新”、“酷”的创新是不够的。创新必须是针对用户的,必须是有用的。做产品的管理,必须把用户放在第一位。李开复1998年夏天回到中国,在中国开创微软中国研究院。这时,他把这个教训带入中国团队。
●成功箴言之七:
完美的工作 成长兴趣 影响力
2000年,李开复被调回微软总部成为微软全球副总裁。几年工作后,他深深地体会了一个完美工作的标准,那就是自己有浓厚的兴趣,能有成长的空间,并具备一定的影响力。他怀念着在中国研究院的兴趣,还有在刚调回美国的学习,但是他期望着有更大的影响力。当他发现谷歌将开始在中国创建时,他主动找到了谷歌CEO施密特,并表示愿意加入谷歌。而施密特十分高兴,在一个月之后就给了李开复OFFER。李开复说,当你遇到喜欢的工作机会,不需要任何的迟疑,而需要积极主动来争取。因为这样的机会往往炙手可热,一秒钟的犹豫你就可能与之失之交臂。
●成功箴言之八:
用勇气改变可以改变的事情
2005年,是李开复的转折年。他没有想到,一次普通换工作的经历引发了一次地震。微软的诉讼使他陷入了人生最低的低谷。对他的虚假负面报道铺天盖地而来。但是,他想到了他一生的座右铭:用勇气改变可以改变的事情,用胸怀接受不能改变的事情,用智慧分辨两者的不同。
于是,他全力以赴地投入了这场战斗,不再理会那些不能改变的谣言。将从微软提取的30万份邮件资料中找寻有利的证据以证明自己的清白。经过两个月的努力,法庭同意李开复到谷歌工作。最后,当李开复回到媒体面前开始工作时,他发现,没有一个记者还提问与诉讼有关的问题,因为作为官司的胜利者,媒体不再相信那些谣言。
●成功箴言之九:
做最好的领导 让员工做有兴趣的事
谷歌公司聚集着世界上最天才的工程师们。如何管理这些“天才”,是摆在李开复面前的另一个课题。李开复非常推崇“放权”式的管理, 他深知在以创意为主要生产力的公司里,不能严格地恪守那些死板的规定。他可以让员工自己提出研究的方向。大家讨论决定。也可以让员工用20%的时间做自己喜欢的项目。他甚至可以让员工对公司提出建议。如果合理就采纳。谷歌里自由的环境非常有名。作为管理者,他主要是在公司战略、每年的目标、合作伙伴、总部沟通上努力,其他的时间,他更是一个企业文化的维护者、公司的发言人、员工的教练。
●成功箴言之十:
价值不是你拥有多少 而是你留下多少
什么是成功?是否拥有了名利就算成功。对此,李开复回答,你的价值不是你拥有多少,而是你留下多少。当他的一个同事赚够了钱而发现失去人生目标时,才意识到,人生的价值在于贡献,和对他人的影响。
李开复曾经有过一个独特的梦想,就是在中国创建一所一流的,有世界影响力的私立大学。他甚至身体力行地为此多方奔走。但是最终因为种种原因没有成功。但是他并没有气馁,而是用另外的方式实践梦想。他说:“我不能改变教育,但是我可以帮助学生。”他给中国的大学生写信,写书,办了“我学网”,每年面对十万学生做演讲。在帮助学生的过程中,李开复看到中国大学生的成长。他说,他曾经想过自己的墓志铭应该有科学家或者企业家的注脚。但是,他说他现在已经没有这种想法,如果他的墓志铭上有热心教育者的字样,他会感觉到内心的温暖。
2008年10月30日星期四
把梦想变成现实
微软不做哪个研究院研究什么的计划,而是各个研究院把最好的人才雇来,让他们自己决定做什么,因为研究大部分是自主的、从下往上,而不是从上往下。研究如果可以一个人决定,那也太简单也太容易了。了不起的研究很多时候是意外,意外的意思就是说上面的人不见得相信.
比如说今天下面的研究员跑来跟我讲,我可以不太相信,我可以给意见,这可能不太妥,他坚持自己的意见最后来证明我是错的,很多时候了不起的研究是这样来的。科学跟研究就是要坚持自己的理念,没错有时候是会失败的,但是我们允许失败才有可能有的大创新,所以我们通常不由上往下做计划,都让研究员自己计划,这样会形成在有些领域我们跟其他研究院有竞争,这是良性的竞争,同时也合作,因为假如你有做这个东西,你有做这个东西,凑起来可能做更大的东西。
微软亚洲研究院在过去十年做了超过260项的技术转移,转移到微软未来的产品,这是一个很重要的指标,因为这样微软才能不断地在产业保持很健全很理性的地位,才可以把商业利益再投入做研究,这个是微软的未来
2008年10月26日星期日
Google如何管理公司
其实,Google几年来的发展说明,他们已经解决了这个挑战,不断吸纳顶尖人才,远低于同业的员工流失率,创新而富有特色的企业文化等,都是不同侧面的佐证。
文化管理
不断创新是互联网企业的生存法则之一,以工程师为主体是互联网行业的人才架构的特色。Google作为互联网行业的巨头一直秉承着“我们只雇佣最聪明的人”的人才宗旨,Google相信,只有“最聪明的人”才能在这个全新的互联网领域不断创新。其两位创始人甚至对于所有领域的人才都偏爱有加,如果你是脑外科或是火箭研究领域的博士,也可能有机会去Google工作,现在Google的员工中就包含一名火箭领域的科学家和一名脑外科医生。
“Google是以研发人员为中心的公司,倡导‘工程师文化’。因此Google倡导并鼓励一种创新、民主的企业文化,从工程师的观念创新,落实到产品设计营销,最后延伸到管理,在Google的每一个环节都有体现。”Google大中华区人力资源总监邓涛说。
毫无疑问,Google的成功,从很大程度上要归功于其吸引人才的能力,以及适合新人发挥的企业文化。
Google主张开放自由、民主的企业文化,“Google一直秉承吸引最聪明的人才来Google工作的理念,要想吸引最聪明的人来创新,就要先给人才创造一个非常开放、宽松的环境。管理上的‘民主’就要求每一个管理者面对下属的提议不能直接回复‘NO’,而是得说可以考虑如何帮助他发展。”
“Google希望创造一个百家争鸣的氛围,使大家能够和敢于发表自己的看法,给各种创意一个去试验的机会。可以想象,如果在互联网企业中形成‘领导说不可以就不可以’的文化,企业又怎能领先技术发展?产品又怎能满足客户多变的需求?所以,在Google,我们强调:第一是要允许你做;第二是给你资源帮你做;第三是允许你犯错误。这就是我们追求的创新文化,要让每个人的想法、有机会去实现。”
Google拥有Google文化委员会,在督导文化推广的同时,也倡导一些活动主题,由员工来组织相应的活动,比如社区活动、环保活动和资助残疾人活动等。员工拥有更多的主动权,参与的兴趣也会更加浓厚。
有人把Google式文化创新称为德鲁克式理想——“工作应当体现人的社会价值,如机会、社交、认同以及个人满足,而非仅仅反映成本、效率一类的商业价值”。Google成功证明了德鲁克式理想的先进性,“传统的先对员工产生怀疑,而后防微杜渐的人力资源管理方式并非最好的解决办法。优秀的管理者应尽全力给予员工信任,并让他们最大程度地发挥自己的聪明才智,不过分关注眼前利益而做长远打算,才能为企业的发展铺好更宽阔的道路。邓涛认为,“这种方式不仅促进了创新,而且可以有效地节约管理成本,得到事半功倍的效果。”
时间管理
Google的员工从来不用在乎早上闹铃会不会准时响起,员工可以悠闲自得地去上班,如果你看见急匆匆赶往办公室的员工,那绝对不是担心迟到,也许是为了和同事会合去享受Google提供的免费大餐。Google提倡的弹性工作制不同于其他企业,Google充分相信员工,把工作时间的掌控权交由员工,由员工根据自己的喜好自由安排时间。
很多人评价,在Google工作更像在自己家办公,饿了可以去吃东西,中式的、西式的,如果你不怕发胖,可以尽情地吃;困了可以小睡;玩兴大发时可以和同事PK一场桌球;哪里不舒服了,随时可以享受到按摩师的到位服务。在Google看来,这是福利,更是为员工打造宽松、自由的环境。
“我们相信每一位来Google 工作的员工都是聪明人,聪明人都会自己安排好时间,自己主动去工作。”邓涛说,Google有数不清的]项目经理,但没有人坐在那里等待上级安排工作,大家都是积极主动地去寻找项目。
自由项目管理
Google鼓励员工用20%的工作时间去做自己想做的事情,即使是和手头的工作完全不相干的项目也可以。很多Google推出的产品都是员工用20%的个人时间设计完成的,这些产品都非常成功。以这次四川地震为例,很多员工利用自己20%的个人时间设计了通过Google地图帮助救援人员搜救的产品,也有员工设计了帮助幸存者寻找亲人的产品,“这些都是员工自发组织的,没有任何人去下达这样的工作安排,我们也会充分支持员工的想法。”
员工不但有自己掌控的时间,甚至可以决定自己做什么项目,员工完成一个项目之后,他便可以和项目主管提出申请,选择自己感兴趣的项目。一般情况下,项目主管都会支持员工的想法,如果遇到不同的意见,也以协商为主,项目主管会帮助员工分析自身的优势,给员工提出建议,但最终的决定权依旧掌握在员工手中。“要给大家一定的空间去做自己想做的事情,有一些员工有一些想法,没有时间怎么办?公司会给员工时间去做。很多员工利用这些事将自己创新的想法变成现实产品,对于这种创新,Google非常鼓励。据邓涛介绍,“公司会根据员工的发明、创造以及给公司带来的回报,对员工进行各样的奖励。”
组织管理
“我们的组织机构非常扁平,而不是传统的金字塔型组织结构。老板与员工之间,并没有有强烈的职位等级观念,我们更倡导民主的工作氛围。”员工可以随时表达自己的想法,甚至提出与管理层不同的想法,如果管理者过于专制,马上就会通过Google的方式反映出管理者的方式不符合Google的文化,管理者如果不注意修正自己的做法,很可能会影响其在Google的发展。
在Google,员工晋升强调民主和自由,在每年的一到两次的晋升机会中,如果员工觉得自己合适,就可以在系统中提出申请,不必非要等主管提拔才行,只要同事认可,并顺利通过审核就可以实现。
尽管Google 提供开放、宽松的工作环境,员工可以用20%的时间做自己喜欢的事情,但这些的前提是在不影响本职工作的情况下,“公司会给员工提供各种环境,关键是员工自己怎样去安排工作,去掌控时间。工作完成的快速有效肯定会有奖励,完成的正好也很好,如果不能完成,对不起,我们也有绩效评估体系,员工也会受到一定的管理。自律和纪律永远是相辅相成的,没有纪律就没有自由。”邓涛说。
人才管理
“我们只雇佣最聪明的人。”既反映出Google对于招聘人才的高标准要求,也折射出苛求完美的人才理念。邓涛说,“从公司出现职位空缺,到招聘到适合的人才,一般需要三个月的时间,我们的理念是宁缺毋滥。”邓涛强调。在美国总部,公司创办的初期,Google的两位创始人会参与所有人的面试,后因公司规模不断壮大而放弃,但即使到了今天,Google两位创始人仍然会审查招聘委员会每周的工作情况,并对一些应聘者的资格提出意见。
有资料显示,最终获得Google工作职位的应聘者平均需要通过6.2次面试。参与面试的面试官,除了人力资源部和岗位需求部门,也会邀请跨部门甚至跨区域的人员参与面试,如此严谨的招聘流程,是为了确保最终进入Google的员工真正适合Google。
“跨部门、跨区域的人员参与面试,一方面考察面试人员的协作能力,另一方面也考察其是否愿意与应聘者共事,同时还考察应聘者是否符合公司的文化,最后每个面试者写下评语,每个人的评语都有可能影响应聘者是否会被录取。”邓涛介绍说。
Google非常鼓励内部员工推荐应聘者,“员工对于公司文化非常了解,我们认为,员工推荐的人才更适应公司文化。”如果员工推荐的人才最终被Google录用,公司会对员工进行奖励。在美国总部,奖金高达2000美元在中国的奖金数额也颇有吸引力。据邓涛说,“现在,Google内部的员工有大约45%是通过员工推荐来的,事实证明这是一种非常有效的招聘方式。”
公司会向新员工提供相应的企业文化培训,尤其对职业经理人,很多职业经理人因为经验和思维的原因,并不能很快适应Google开放、民主的工作氛围,“职业经理人很容易因以往的工作形成习惯,我们在招聘时会注意寻找既符合公司文化又是善于学习的人,如果你有经验,不善于学习,不善于改变自己,将很难在Google成功,因为Google和任何一家公司都不一样,这就要求进入Google的职业经理人要非常善于挑战自己,学习能力要很强。职业经理人进入Google后,我们会对他们进行系统的培训,会引导他们适应Google的文化。”
绩效管理
Google具有非常完善的、基于团队的考核机制。员工每个季度都有自己明确的工作目标,而且因为互联网公司都有自己的网络管理平台,比如,工程师每周的项目做到了什么程度对对所有员工都是透明的,这为员工的绩效考核提供了很好的管理工具。
Google的考核分不同的等级,对排在末位的员工有相应的帮助措施,特别重视排名最靠后的5%的员工,公司将集中找出原因,发现问题,建立信心,帮助他们赶上来,但也不排除会将一些人淘汰出局。而对最好的5%~10%的员工,每年都会得到充分的奖励和荣誉。
Google的人才流失率一直低于行业水平,用邓涛的话说,就是“前所未有的低。”这也从一个侧面,证明了Google在人力资源管理工作上的创新是卓有成效的。 (陈哲)
2008年10月22日星期三
从Goole收购DoubleClick谈起——我的追梦之旅(转)
我是在Google收购 DoubleClick消息出来的当天递交的辞呈。我的老板,DoubleClick的CIO震惊地看着我:“Are you crazy? Diane??”因为他像我一样清楚地知道,在这个时候辞职对于我这样的高级技术主管意味着什么。只要我待到收购完成,就会有相当可观的期权转换成现金,没有人会在如此巨大的金钱诱惑下辞职。也确实如此,从消息出来直至今天,DoubleClick离开的高级主管只我一人。我放弃的相当于很多美国IT人十几年辛苦工作所得。
他沉默了很久,问我是不是已经决定了,我点了点头。作为我多年的良师益友,他明白我从不做没有理性的决定,而且只要我决定了就不会回头。接着他说,他不会白费唇舌地劝我留下来,那没有用,但是他一定要知道为什么。他不相信有人会在这样的情况下辞职,尤其是我。我放弃的不只是期权转换成的大量现金,而且还有在Google做管理人的大好前程。他一直以为如果有人在收购结束后能在职业生涯上更上一层楼,那一定首先是我,因为我一直是他最强的技术副手。九年来,我在DoubleClick开发了一个又一个产品,培养了一个又一个IT管理者,组建和重整了一个又一个团队。九年的时间,无数的风风雨雨,我都没有离开 ,为什么现在要离开呢?而且在这样的时刻!
为什么?
因为我碰到了一个让梦想成为现实的机会,不可错过。
我一直希望拥有一份自己的事业,更希望在中国建一支理想的IT团队。近几年来,这样的念头愈发强烈。我曾几次利用假期回国,了解国内的IT界,正在这时,我碰到了Doug和Jon。他们在找一个可以帮助他们组建IT团队的合伙人,以实现视频网络市场化的理想:打造FreeWheel Monetization Right Management(MRM )系统。无可置疑,这是一个创业公司,真正的从零开始。
一个创业公司成功的条件是什么?风险投资商最看重的是什么?首先,是你的目标市场,要足够大,要高增长;接下来,是你的盈利模式,要能看到合理清晰的盈利模式;最后,也是最重要的,是你的团队,要有一支有经验的,有能力的强大团队。具备了这三个条件的公司,不是你去找风投,是风投来找你。但你会发现,很多创业型公司并不具备这些条件,如果你有幸见到一个这样具备了所有条件的公司,那是你碰到了一个理想变成现实的机会,不可错过。
这正是我看中FreeWheel的原因。首先,我们定位在视频广告市场,这个市场之大毋庸置疑,仅美国而言,每年就有数百亿美金的广告预算进行交易;难得的是,这个行业正在进行一场前所未有的变革,从传统媒体到网络视频的变革。机会在变化中产生,这是一个亘古不变的真理。其次,是我们清晰的盈利模式,MRM 系统解答了一个网络视频业至今无人能解的问题 (i.e. “the billion dollar question”):当一个人在网上看一段视频时,谁有权卖广告?谁有权分成? 伴随着这个问题的解答,FreeWheel的盈利模式跃然纸上。最后,再看我们的团队,这个三人组,毫不夸口地讲,是世界上最强的网络广告业组合。不仅仅由于我们在各自负责领域内的成功记录,更为难得的是我们三人能力上的完美搭配:Doug曾经是DoubleClick核心产品DART的全球总经理,下属几百人的团队,年营销额数亿美金,这个部门也正是今天Google花31亿美金买下的部门;Jon 先后在DoubleClick、Yahoo! 担任产品策划的要职,他曾在短短的几年里建起DoubleClick全球广告网,为它的早期腾飞立下汗马功劳。在FreeWheel,Doug负责市场营销与管理,Jon负责产品策划与定位,而我刚好提供组建IT团队、开发产品的执行力。可以说,如果你相信有人能在这个领域里胜出,这个团队是你最该押注的团队!
我跟Doug和Jon讲了把IT团队建在中国的想法,有几点原因。其一,到发展中国家做软件开发,降低研发成本已经是一个广为接受的概念。印度本是这一市场的领头军,可是,印度市场近几年来趋于饱和,劳动成本大大增加,质量却不断下降,我们三个人对这一点都深有体会。相比之下,中国才刚刚起步,又拥有众多与印度同样高质量的软件开发人员,很有吸引力。再者,我多年管理跨国研发团队的经验,以及我对网络广告需求的熟悉程度可以大大降低创业型企业跨国研发的风险。最后,我作为土生土长的中国人在这方面是有优势的。他们十分同意我的看法,毫不犹豫地说:“我们支持你!”
就这样,我决定离开DoubleClick,同Doug和Jon 一起组建FreeWheel,把研发中心建在中国。这是让我两个梦想同时成为现实的机会,不可错过。就这样,在整个DoubleClick沉浸在被Google收购的喜悦中时,我的辞呈,递到了CIO的办公桌上。
创业以来,我们遇到得最多的问题是:你难道不担心Google这样的公司打造同样的产品与你们竞争?要回答这个问题,还要从Google收购DoubleClick说起,我、Doug和Jon曾就这件事对FreeWheel 的潜在影响作过详细讨论。我们认为,这一事件是网络广告业第二轮竞争开始的信号,还有,Double Click 的价值在于它的独立性,被收购后就失去了它的独立性。不出所料,由Google收购DoubleClick卷起了收购狂潮,Microsoft迅速买下了Aquantive、而Yahoo!则抢下了Right Media。风波过后,不只这个市场上的领军者没有了,就是稍有规模的竞争者也不复存在。然而市场还在,这个市场还需要独立的广告平台。事实也证明,自DoubleClick被收购的消息传出后,它的顶级客户都开始寻找其他解决方案,做第二手准备。原因很简单,这些客户是Google的竞争对手,他们不只和Google在与广告商的关系上竞争,也同时在内容上、用户群上有激烈竞争。广告收入是他们的生存命脉,没有人会把自己的生命交付在竞争对手的手上。其实洞悉这个契机的人,在我看来并不在少数。可是,既看出了机会,又了解市场,同时还能打造正确产品的人,却大多任职在这些已经被收购的公司,被“金手铐”铐住了。这些因素无疑大大增加了FreeWheel成功的机会。
在全世界都沉浸在这场收购狂潮带来的兴奋当中时,而我们却看到这个市场正在打开的窗口:巨额资本,没有玩家。 我们认为这个窗口将持续六个月,六个月的时间足够推出MRM的第一版,抢占先机。你也可以说,我并非是随意放弃了在Google做管理人的大好前程以及唾手可得的大笔收入,只是相比而言,在这个时候组建FreeWheel更是千载难逢。
MRM在美国正式推出后,在潜在客户群内引起了很大反响。很多客户说:“Wow,这正是我们在寻找的视频解决方案。”正如我们所预测的,迄今为止,还未发现任何竞争对手提供类似的方案。随后的六个月之内,相信会有无数大大小小的公司站出来说,他们也做同样的事情。只不过,我们已经抢占了先机。成功的关键在于看到别人看不到的棋,不需多,一步就好。
就在MRM产品刚刚发布的时候,整个Internet又发生了翻天覆地的变化。Microsoft和 Yahoo!在与Google针对搜索的竞争中节节败北,终于逼得Steve Ballmer下了狠心,对Yahoo!展开了恶意收购。冰冻三尺,非一日之寒。事实上,Yahoo!的今天是当年买下Overture 未能迅速成功整合埋下的祸根。几年前我还在DoubleClick时,我的搜索团队就已经清楚地看到,广告商在Google和Yahoo!的搜索引擎上花同样的钱买关键词广告,Google的回报率是Yahoo!的两倍。如果Yahoo!不尽快改变这个局面,它的客户就会离开,它的市场份额就会越来越小。不幸的是,Yahoo!反应得太慢,Panama发布得太晚,等不到Panama发布,Yahoo!的客户早已离开。
在这样巨大的市场变更中,又有一轮新机会产生了。半年前,类似机会发生在网络广告界时,有三个人在加州一间简陋办公室里欣喜若狂,半年后,MRM诞生了。我相信,在全世界沉浸在Microsoft 和Yahoo!铺天盖地的新闻中时,定有一个创新的萌芽正在某一个安静角落悄悄成长……
作者简介:
Diane Yu,中文名于晶纯, FreeWheel 创始人,CTO。于2007年与Douglas Knopper, Jonathan Heller共同创建FreeWheel, 开发Monetization Right Management 系统,产品于08年1月上线,已引起美国视频网络广告界的关注。
前DoubleClick工程部副总裁,负责广告商系列产品平台的开发与维护,所辖部门包括DFA、 Motif、DARTSearch和 Performics,是DoubleClick核心技术力量之一,直接参与研发并打造了DART网络广告系统。
博客:http://blog.dianeyu.com
2008年10月14日星期二
最重要的是人才的积累
2008年10月13日星期一
科技博客TechCrunch:谷歌Gears前景展望
现状分析
自2007年5月至今,Gears已经发布了一年多。在此期间,谷歌先后发布了四个版本的Gears,每次都会增加许多新的功能。最近两次发布是在今年8月和6月。
Gears的主要目的让网络应用程序拥有与桌面应用程序相同的功能。为了实现这一目标,他们针对不同的操作系统(包括Windows、Windows Mobile、Mac OS和Linux)和浏览器(火狐、Safari和IE)推出了一系列插件。而随着谷歌Chrome浏览器的发布,用户甚至可以在不安装Gears插件的情况下使用这些功能。
该技术的目的非常明显:有了Gears,用户的浏览器的性能将会日益强大。这就使得安装桌面应用程序的用户越来越少。而微软引以为豪的Windows和Office也将走向末日。但是在这种情况没有发生之前,Gears以及与之类似的技术却必须要能够从真正意义上提升浏览器的性能。或者更准确的说,他们必须要使那些通常只在浏览器中运行的网络应用程序具备与桌面应用程序相同的功能。
目前,Gears已经可以通过以下方式来帮助开发者增强网络应用程序的功能:
一、客户端数据存储
大部分的交互式网站都非常依赖于数据库,他们通过收集、组织和发送由用户和内部发布者贡献的信息来获取数据。一般而言,这些数据库都是在服务器端运行的,如果用户想要使用网站的数据,就需要向网站发送请求并等待服务器的相应。但是谷歌Gears的数据库应用程序接口(Database API)却允许网站在客户端建立数据库,这样就能够以更快的速度使用离线功能。
二、客户端网页伺服
当常规的网络服务器无法访问时,Gears就可以将你的电脑变成一台网页服务器。谷歌Gears的本地服务器应用程序接口(LocalServer API)允许网站在用户上线时缓存网页,以帮助用户实现离线浏览。不仅如此,当用户在线时,它还可以通过缓存来加速一些特定的行为。
三、桌面快捷方式
如果想要像使用桌面应用程序一样使用网络应用程序,就必须使其易于启动。因此Gears就提供了一项功能,使得开发者可以为网络应用程序建立桌面快捷方式,使得用户可以通过双击鼠标来打开该项应用程序。尽管用户此前已经可以将特定网站设置为桌面快捷方式,但是谷歌Gears的功能还是可以为用户提供更为直观的体验。图标的画质更高,而且大小可以随意调节。以后,快捷方式还将支持通讯覆盖图标,例如webmail的图标可以实时显示未读信息的数量。
四、多文件上传
通常,如果网站没有增加特定的Flash或Java插件,那么当用户希望向网站上传多个文件时,就需要逐一进行选择。但是谷歌Gears却可以使得用户可以一次性上传多个文件,从而节省时间。
五、定位功能
对于那些能够显示用户当前位置的移动设备而言,谷歌Gears可以通过运行在浏览器中的应用程序来显示这些定位信息。定位应用程序接口(Geolocation API)可以被用来确定用户的位置,甚至可以实时显示用户的运动状态。不过,想要获得用户的定位信息必须通过特殊的对话框来获得授权,从而避免信息被泄露。
六、后台处理
在运行含有大量JavaScript的网络应用程序时,通常都会因为要等待进程的处理而浪费大量的时间。通过一个名为“WorkerPool”的应用程序接口,那些耗时较长的进程将会在后台运行从而降低用户的登台时间。这就使得网络应用程序就会更加流畅。
前景展望
谷歌Gears团队通常都会按照需求推出相应的功能。因此,我们认为他们今后还将陆续发布以下功能:
一、进程工具条
无论是上传单个大文件还是几个小文件,用户都希望知道上传的进度如何。以前,除了无奈地盯着变成“沙漏”的鼠标指针之外,用户根本无法知道当前的进度。但是有了谷歌Gears,用户就可以获得实时的数据处理进度。
二、断点续传
当大文件的上传因为连接中断等问题而发生错误时,你就不得不从头开始。但是谷歌Gears却承诺他们将会提供一项功能帮助用户实现断点续传。以便在意外发生时,从上次中断的地方继续上传。
三、屏幕提示
系统公告软件Growl和迷你博客Twhirl已经提供有屏幕提示功能,使得用户可以通过电脑屏幕的角落来查看更新的信息。而以后的Gears也将提供有类似的功能。无论用户是否在运行浏览器,它都可以向用户发送实时的信息提示。
从长远来看,谷歌Gears还有可能充分利用电脑的显卡来支持复杂的3D图形。而且用户还可以通过单击右键的方式来实现文件的上传。此外,网络应用程序还有可能随操作系统一同启动
2008年10月8日星期三
为什么要写class CMyWnd : public CWindowImpl的形式
class CMyWnd : public CWindowImpl
{
...
};
这样作是合法的,因为C++的语法解释说即使CMyWnd类只是被部分定义,类名CMyWnd已经被列入递归继承列表,是可以使用的。将类名作为模板类的参数是因为ATL要做另一件诡秘的事情,那就是编译期间的虚函数调用机制。
如果你想要了解它是如何工作地,请看下面的例子:
template
class B1
{
public:
void SayHi()
{
T* pT = static_cast
pT->PrintClassName();
}
protected:
void PrintClassName() { cout << "This is B1"; }
};
class D1 : public B1
{
// No overridden functions at all
};
class D2 : public B1
{
protected:
void PrintClassName() { cout << "This is D2"; }
};
main()
{
D1 d1;
D2 d2;
d1.SayHi(); // prints "This is B1"
d2.SayHi(); // prints "This is D2"
}
这句代码static_cast
class D3 : public B1
就会有麻烦) 之所以安全是因为this对象只可能是指向D1或D2(在某些情况下)类型的对象,不会是其他的东西。注意这很像C++的多态性(polymorphism),只是SayHi()方法不是虚函数。
要解释这是如何工作的,首先看对每个SayHi()函数的调用,在第一个函数调用,对象B1被指派为D1,所以代码被解释成:
void B1
{
D1* pT = static_cast
pT->PrintClassName();
}
由于D1没有重载PrintClassName(),所以查看基类B1,B1有PrintClassName(),所以B1的PrintClassName()被调用。
现在看第二个函数调用SayHi(),这一次对象被指派为D2类型,SayHi()被解释成:
void B1
{
D2* pT = static_cast
pT->PrintClassName();
}
这一次,D2含有PrintClassName()方法,所以D2的PrintClassName()方法被调用。
这种技术的有利之处在于:
不需要使用指向对象的指针。
节省内存,因为不需要虚函数表。
因为没有虚函数表所以不会发生在运行时调用空指针指向的虚函数。
所有的函数调用在编译时确定(译者加:区别于C++的虚函数机制使用的动态编连),有利于编译程序对代码的优化。
节省虚函数表在这个例子中看起来无足轻重(每个虚函数只有4个字节),但是设想一下如果有15个基类,每个类含有20个方法,加起来就相当可观了。
2008年10月7日星期二
华为前副总裁李一男正式出任百度CTO
昨日,百度公司(BIDU.NASDAQ)宣布任命李一男为公司首席技术官(CTO),任命从即日开始生效。百度创始人李彦宏昨日下午还特意向公司全体员工发送华为原副总裁李一男任命邮件,并指出,从即日起公司首席科学家Dr. William Chang、产品副总裁俞军、高级技术总监郭眈、高级技术总监崔珊珊,向李一男汇报工作,李一男直接向自己汇报。
对于李一男的再次离去,华为方面没有作任何评论。
不被重用?
“李一男应该还没有办完离职手续。”华为内部一位知情人士透露,由于国庆,大家才刚上班,此前并没有任何关于李一男要离职的消息,估计李一男离职流程还没有来得及启动。
华为研发的一位原中层表示,李一男离职的真正原因应该是没有被华为重用。这位中层认为,虽然李一男回华为后被任命为首席电信科学家,但在去年12月又被任命为华为终端部的副总裁,负责基础技术研发。而华为的核心产品是移动、交换、传输和业务软件等电信设备,终端部门在公司的地位和重要性都不如以上部门,更何况,今年初开始,华为终端业务就频频传出要出售的消息。
“其实从李一男回归的那一天起,就注定他迟早还要离开华为。”该中层指出,李一男2006年9月回归华为的主要原因是履行华为收购港湾资产协议的结果,对李一男本人有一个“锁闭期”。
1994年进入华为的李一男可谓少年得志,在进入华为两年后就被任命为华为常务副总裁兼中央研究院的总裁,当时才26岁。2000年,李一男带着从华为拿到的价值1000万元的设备北上创建港湾网络。公司迅速发展后,成为华为对手。2006年6月,华为收购港湾网络,李一男回到华为,任首席电信科学家、副总裁。当时,李一男的回归,还被业界猜测,李一男还可能继续成为任正非的接班人。“现在看来,李一男的回归,只是为了扫清华为前进道路上的障碍。”上述中层说。
面临思维转型
不过,对于李一男的加盟,李彦宏还是表示出极大兴奋。李彦宏在内部邮件中称,李一男先生是中国自主创新科学技术领域的顶尖专家,在全球领先的技术公司拥有杰出的管理经验。而李一男先生的加盟,将带领百度的产品技术团队攀上新的高峰。
有接近李一男的人士分析认为,李一男的最主要经验是在通信传输、手机芯片领域,其加盟互联网公司,可以在融合通信与互联网领域一展所长,李彦宏之所以选择李一男,不仅仅是因为百度的CTO一职已经空了一年时间,还可能因为百度看到了谷歌的举措,将在通信和互联网融合领域有着更深远的战略规划。
有着在华为四年工作经历的德瑞电信咨询合伙人阮开利表示,李一男在华为和港湾有丰富的数据通信技术经验,但通信设备技术思维模式和互联网企业的技术思维模式有较大的区别,前者关注的是技术本身,即技术的先进性和稳定性;而后者更关注是客户,即客户需求的满足度和满意度。因此,李一男担任百度CTO后,首先要做的就是思维转型。
阮开利指出,随着3G时代来临,电信设备基础技术和网络的发展已经远超过电信应用服务的发展。因此,未来几年,处于下游的电信设备提供商的竞争将更激烈,整体呈现下坡的趋势。而处于上游的应用服务提供商,如互联网公司、业务运营商等将充满机会。近几年,华为员工离职去百度、腾讯公司、阿里巴巴的比比皆是。
伴随着李一男的到位,百度已于近日对技术团队进行了规模较大的调整,社交网站51.COM主管技术的副总裁邵辉已经正式加盟百度,担任系统部技术总监,百度同时还晋升陈韫敏为技术部副总监,负责垂直搜索部。
2008年10月4日星期六
福布斯:诺基亚触摸屏手机短期难改产业格局
震惊业界
诺基亚公司于本周四宣布,他们的首款全触摸屏手机年底前将首先在亚洲、中东、俄罗斯和西班牙等地区发售,这一消息令不少业界观察人士感到震惊。虽然上述市场占据了诺基亚第二季度总销量的一半以上,但是考虑到年底的圣诞购物季节,欧洲和美国市场对于提升诺基亚的业绩将更为重要。
寰冠资本(Global Crown Capital) 的分析师泰罗-库伊蒂伦(Tero Kuittinen)说:“这将对诺基亚造成很大的伤害。通常而言,某款手机并不会对股价产生影响,但是这款手机有所不同,因为人们已经对其期待了长达一年之久。”
那么,诺基亚为什么不直接面向全球发售该款手机呢?诺基亚的发言人表示,这主要是因为需要对运营商进行定制造成的。例如,法国电信旗下的Orange和沃达丰均要求为其定制特殊的颜色,同时加入他们自己的标志和菜单。这就使得这款手机在上述地区的发售被延迟了数周。然而,亚洲和中东地区的运营商往往不会对产品提出这类要求。
符合预期
新款的诺基亚5800手机在很多方面都与业界的预期相吻合。例如,其裸机的手机为279欧元(390美元),而3G版iPhone在意大利和英国的售价分别为499欧元(700美元)和350英镑(619.19美元)。
同时,这款手机的功能也达到了人们的预期:它包含3G数据连接功能,320万像素数码相机,内置GPS定位系统,而且还搭配了带有触觉反馈功能的触摸屏。尽管还没有对这款手机还没有正式上市,但是相信看过上面的这些介绍之后,很多人都对这款手机跃跃欲试了。
瑞典投资公司SEB Enskilda的分析师马茨-尼斯特罗姆(Mats Nystrom)说:“很多人都将诺基亚的这款手机看作是iPhone杀手。但是诺基亚却将这款产品定位在了更为广阔的市场。在当前如此低迷的宏观经济背景之下,这将是一个明智之举。”诺基亚还希望他们的音乐服务可以吸引到更多的低端消费人群。本周四,诺基亚发布的“Comes With Music”服务为用户提供了一年的无限量音乐下载服务,而且所有的费用都包含在了手机的售价中。不过,这项服务要真正发挥作用恐怕还需一些时日。因为目前这项服务仅针对英国市场的诺基亚5310手机发布。明年诺基亚5800手机也将提供这一服务,而且还将陆续扩展到更多的国家。
难改格局
然而,关键问题还在于,诺基亚的这款手机并没有给苹果和三星厂商造成致命的打击。
市场研究公司Gartner的分析师卡罗琳娜-米兰内塞(Carolina Milanesi)说:“由于发售地区有限,而且‘Comes With Music’服务并未真正面向全球推广,因此诺基亚5800今年年内无法改变产业格局。”她表示,诺基亚的音乐服务本来可以弥补诺基亚在触摸屏手机方面的一些不足,但是由于推广地区有限,它现在反而成了诺基亚的一块短板。
诺基亚公司表示,他们将会分别于2009年第一季度和2009年中面向欧洲和美国地区推出5800触摸屏手机。(长歌)
2008年9月21日星期日
谷歌官方博客:未来手机必备的“七种武器”
自从十年前谷歌创立以来,互联网已经给全世界人们的生活带来了巨大的影响。它已经改变了政治、娱乐、文化、商业、医疗、环境等诸多方面以及几乎每个你所能想到的领域。这促使我们思考:未来的十年内将发生什么?这种惊人的技术将如何演进?我们将如何适应互联网,而且(更重要的是)互联网将如何适应我们?怀着这些问题,我们询问了十个资深的专家,并将在9月(在我们创立10周年的月份)发表他们的回答。就像计算机科学专家Alan Kay的名言所说的那样,最好的预测未来的方法就是去创造它,因此我们每天都将尽我们的最大努力,逐步实现专家们的预言。
全世界目前有大约32手机用户,而且在未来几年内,这个数字还将至少增加10亿。如今,手机已经变得比汽车(全世界登记的汽车大约为8亿辆)和信用卡(只有14亿张)还要普遍。在固定电话的普及上,我们用了100年的时间才使80%以上的国家用上固定电话,而手机做到这一点只用了16年。越来越少的青少年佩戴手表,因为他们现在都用手机来看时间。因此我们现在可以大胆地宣称手机是有史以来最普及的消费者产品。
不过,你有没有考虑过这些手机的性能到底有多强?你放在口袋、背包或者手提袋里面的手机的性能很可能要比8年前或9年前放在桌面上的个人电脑还要强10倍(假设你有一台个人电脑;大部分的手机用户没有个人电脑)。手机所拥有的一系列传感器几乎堪比火星探测器。一个仅具备基本功能的手机就拥有:时钟,电源传感器(显示电池用量),温度计(因为电池在低温下的充电效果不好),测光表(决定是否开启屏幕背光灯);而更高级的手机还拥有:位置传感器,加速计(监测运动方向的矢量与速度),甚至还可能有指南针。最重要的是,所有这些传感器始终都是互相连接的。
我们来看看未来十年内的趋势。你可能将一周七天,一天24小时都携带着手机(中国移动最近的一项研究显示,大部分手机用户在睡觉的时候都把手机放在距离一米以内的地方),而这些手机的功能非常强大,始终保持连接,并充满各种传感器。而且更酷的是,你身边的每个人都是如此。那么,除了你现在已经利用的功能外,你还将利用这些手机来做什么呢?下面是几种可能:
智能提醒
你的手机将时刻洞悉你目前的状况,并在需要的时候提醒你。现在就已经是如此了——eBay可以在你投标失败的时候给你发提示信息,而提示服务(比如谷歌新闻)可以为你提供新闻、运动、或股票方面的最新信息。未来,这些应用程序将更加智能化,更加迎合你的个人偏好(将被存储在网络云里),并在你需要的时候才发送所需的信息。一个非常有用的应用情景:你的手机知道你正在前往市中心用晚饭,它将提醒你交通状况以及哪里停车最方便。
增强现实(Augmented reality)
你的手机会利用它的传感器来了解你状况,并为你提供有用的信息。例如,你站在橱窗前,心里想知道里面的小狗价格。你的手机马上就会通过GPS和指南针了解到你正在看这只小狗。在你甚至还没问这个问题之前,手机就会告诉你答案了。此外,还会告诉你它的食物和最佳训练方式。
众包(Crowd Sourcing)主流化
你的手机就是你的万能传声筒。通过手机,你可以发布图片、电子邮件、文本、Twitter(一种多对多互联网短信群发平台)信息以及博客文章等。如果所有人都这么做,那么世界上每个角落的人都可以实时分享他们的经历。大量的信息内容以一种全新且有趣的方式被归档、分类并重新发布给其他人。你可以在网上询问在附近最好玩的地方,并在手机上浏览其他人的评价和他们所上传的图片。如果你很有兴趣,那么你的手机就会告诉你如何前往那里。
(注:众包的特征是由非专业开发人员的普通群体配合进行开发)
无处不在的传感器
你的手机能够获取周围情况的大量信息。如果你获取该信息,并将它和云里面的所有其他手机的信息结合起来,那么你就会看到不可思议的世界动态实景。气象信息的更新将不再根据数百个传感器,而是根据数亿个传感器。交通信息的报道将不再仅仅根据直升飞机的观察和道路传感器,而是根据交通阻塞区域的手机(以及人)的密度、速度和方向来作出判断。
个人发展的工具
你的手机不仅能够方便你的生活,它还可以为你带来收入。对于世界上的许多人来说,这已经成为现实:在印度南部,渔民们通过短信来发现最好的市场,以便出售他们今日的产品;甘蔗农场主们可以收到建议性的短信来决定作物灌溉量;在撒哈拉以南的非洲,拥有手机的企业家变成了手机运营商,为他们所在的城镇提供通信服务。未来,随着手机成为经济发展的重要推动力,这些创新只会不断增加。
与时俱进的设备
就像现在的互联网一样,你的手机将更加开放,这样开发人员就可以更加方便地开发或改进应用程序和内容。你可以将你所关心的应用程序自动地安装在你的手机上。比如说,你的手机上有个软件,该软件可以改善电源管理(从而增加电池寿命)。如果有一个开发人员对该软件进行了改进。那么你不用动一根手指头,这个更新就会自动安装在你的手机上。随着时间推移,你的手机将越来越好。
信任与验证提高软件安全性
你的手机将提供工具和信息来帮助你决定下载哪些内容,浏览哪些信息,共享哪些数据。在一个互联的世界里,信任是至关重要的,而你的手机将帮助你控制好你的信息。你可以选择不共享任何信息(缺省模式),或者只同特定人员——你所信任的朋友圈子和家庭成员——共享特定信息。你将根据你从服务提供商和软件提供者那里所得到的信息以及社区的集体评级来进行做出这些决定。你的手机会像忠心耿耿的仆人一样:它知道你的许多信息,但是如果没有你的同意,它将不会透露任何信息。
2008年9月20日星期六
C++培训系列课程体系
培训形式:我们的企业级高端IT培训提供以下2种培训服务形式: ![]() ![]() | ||||||||||||||||||||||||||||||
培训深度:对于企业内训,培训深度根据客户Team的具体情况可灵活定制,从Level 200(初中级)到Level 500(最高级),均可提供。对于公开课培训,一般在Level 400(高级),具体参见当期课程安排。 | ||||||||||||||||||||||||||||||
培训时间:对于企业内训,培训时间根据客户Team的具体情况可灵活定制。对于公开课培训,请参见公开课培训安排。 | ||||||||||||||||||||||||||||||
培训价格:对于企业内训,培训价格根据客户具体需求(课程、深度、时间、人数)而不同。对于公开课培训,请参见公开课培训当期定价。
|
IT培训蛋糕不小 市场规模40多亿元
企业招聘 经验为王
被称为朝阳产业的IT业,其从业人员平均薪酬高居各行业前列。记者从智联招聘、中华英才网、无忧工作网三大招聘网站发现,各大类职位的招聘中,IT职位需求仅次于销售,排名第二,每月有近10万个职位提供。
尽管人才市场对IT从业人员求贤若渴,但实际情况并不那么乐观。记者近期在北京的几场大型招聘会发现,“经验”成为用人单位出现频率最高的词。“项目经验、编程经验、相关语言应用经验、兼职经验”,对刚走出校门的学生而言,无疑遭遇了就业瓶颈。“高校教育重理论轻实践,尽管有上机实验,但真正的经验积累,绝非一两个实验就能获得。”某外企IT产品研发部门负责人告诉记者,IT行业的很多项目都是合作完成的,需要每个人相互配合。如果团队中多了个完全陌生的新手,必定会牵涉领导者在交流和培训中的精力。此外,新手的出错几率也很高,这对项目的进度控制及质量控制存在风险,所带来的损失也难以预计。因此,招聘方青睐有经验的IT人才也就不足为奇了。
在严峻的就业压力之下,越来越多的年轻人不得不把目光投向兼职、培训等能够获得工作经验的途径中去。据了解,仅仅是北京的计算机相关专业的学生,就有50%以上的人参加兼职或者专业培训,其他专业的学生参加IT培训的比例还要高一些。“我希望通过自己的努力,能够进入自己心仪的知名公司”,在某培训机构参加“Java工程师”培训的大三学生冯宁告诉记者,“参加培训的最大好处就是能够获得最新的技术知识,并且能积累项目开发经验。”
人才匮乏 猎头诞生
一方面是市场对IT人才的大量需求,一方面是高校学生缺乏工作经验无法迅速融入工作中去,人才供需的失衡让近几年风行的IT培训开始成为人才市场不可忽视的力量。“仅仅是在北京,IT职位需求就占北京职场总需求的21%”,某猎头公司总监孙先生告诉记者,“不仅是高端IT人才奇货可居,就是合格的普通员工也并不那么好找。最近已经有很多客户请我寻找合适的程序员,这种现象在猎头行业是非常罕见的。”
“猎头公司往往扮演的是高级人才招聘的角色,但对于企业所需要的大量普通技术人才往往无能为力。在这种情况下,很多猎头公司开始尝试和专业的培训机构进行合作,直接预定优秀的学员,并取得了较好的效果。”北京蓝点世纪顶级JAVA培训机构负责人尹德树告诉记者,和猎头公司的合作让他看到了JAVA培训行业的“蓝海”。“任何一个行业都需要不断的创新,我们这些培训机构在经过数年的成功市场运作后也开始转型——从单一的技能培训机构转变为猎头型培训机构。”
“如果仅仅是学会了基本的操作,而缺乏完整的项目开发经验和团队合作能力,那对学生和企业而言都没有任何价值。”尹德树告诉记者,以针对用人单位需求而制定的“In-Team”顶级JAVA培训模式为例,无论是师资队伍、培训模式、资源整合都强调“Team(团队)”的概念,让学生在培训中养成团队观,为日后的迅速融入工作奠定基础。学员不但每天要完成500行以上的编码,并还要累计完成1000多个实践练习,而这已经超越了软件工程师一年的工作经验。同时,还要接受到完全真实的项目进行练习,获得真正的实际项目经验。
培训市场竞争激烈
国内IT权威调研机构赛迪顾问IT服务分析师胡小姐表示,去年全国IT教育培训市场规模是41.49亿元,今年还将继续增长,超过这个数字。而随着奥运的临近,以及中国经济的进一步发展,市场上对IT人才的需求将再创新高,IT培训市场将成为高校传统教育的有力补充。
“很多企业要对没有实战经验的新人进行为期半年到1年的培训,支付大量的人力、财力,而培养对象一旦跳槽,又会造成企业人才投资的损失”,长期关注大学生就业的郑鹏老师指出,“现在有很多学生选择参加实战式培训来为求职增加砝码。”
“培训机构在某种程度上比猎头公司更熟悉IT企业的用人需求,尤其是对大量合格的普通IT白领的技术要求”,IT资深人士张明凯对“猎头式培训机构”的说法十分感兴趣,“就业固然是每个参加培训的学生最起码的要求,但是如何迅速积累经验,获得知名企业的工作机会。猎头型培训机构的定制人才培养模式完全根据企业所需,无疑具有很强的竞争力。”记者了解到,在长达4个月的项目驱动制培训中,会有经验丰富的项目经理亲自带队,通过公司化管理,让学员在实践中既熟练掌握了应用技术,又迅速积累了实际工作经验。
“可以预见,IT培训的竞争将达到白热化。目前我国的IT教育培训正从普及走向专业化细分阶段。比如游戏学院的游戏人才培养、清华万博的网络工程师课程、清华美院的电脑美术设计师课程、蓝点世纪的顶级JAVA软件人才培养,各培训机构所设置的课程突出实际操作能力的培养,并不断升级。而猎头式培训机构的定位,也使得一些培训机构在竞争中进一步细分市场,突出自己的优势。这对整个行业的健康发展都有着积极作用。”业内人士坦言,国内外厂商对IT教育培训的专业服务关注度越来越高,这也将导致IT培训行业出现新的格局。
IBM等11家科技公司上榜全球最佳品牌25强
08年全球最具品牌价值25强 单位:十亿美元
BusinessWeek和Interbrand是按照品牌价值对公司营收贡献进行排名。今年IBM超过微软成为全球第二家品牌价值最高的公司。微软的座次略有下滑,由去年的第二名降至第三。
值得注意的是Google今年的品牌价值同比增长43%至256亿美元。而位于榜单第24名的苹果公司,其品牌价值同比增长24%至137亿美元。
科技公司仍然占据全球最具品牌价值榜单的重要位置,除IBM、微软、Google外,诺基亚(第5)、英特尔(第7)、惠普(第12)、思科(第17)、三星(第21)、甲骨文(第23)、苹果(第24)及索尼(第25)八家公司都跻身全球最具品牌价值25强。(芭蕉雨)
2008年9月16日星期二
Building Google Chrome: A first look
Building Google Chrome: A first look
Google's open source browser has much to offer prospective hackers (provided they use Windows)
TAGS: Browsers, Browsers, Google
Last week I said I would look at Google Chrome "from a developer's perspective." I should have specified what kind. I meant I was considering it from a Web developer's perspective: What does it mean for Web application builders to have yet another browser enter the already-crowded field?
But the more I thought about it, the more I felt it would be worthwhile to look at Chrome from the perspective of the other kind of developer. After all, Chrome is open source, and there's clearly still some work to be done on it. So I decided to take a peek under Chrome's hood and view it through the eyes of the developers who will improve and maintain it in the coming years.
Dude, where's my code?
The first stop on my quest was dev.chromium.org, the Chromium Developer Documentation site, to get a copy of the source code. "Chromium" is the name of the open source version of the Chrome browser, while "Chrome" is Google's official stable release. Get the idea? In real life, chrome is smooth and polished, while chromium is just a raw element.
The Chromium site explains how to download the source code for Linux, Mac OS X, or Windows. Unfortunately, if you're eagerly awaiting a Mac version of Chrome, you shouldn't hold your breath. As the Mac OS X area of the Chromium developer site explains, "Right now, the Mac build is a work in progress that is much closer to the start than the finish." In fact, according tothe latest status report, the Chrome developers have yet to get even the browser core running under Mac OS X. Rendering actual Web pages is still a long way off, to say nothing of a usable Aqua GUI.
Then again, the Linux version is in arguably even worse shape. If you were laboring under the assumption that a new open source browser from Google meant an automatic win for Linux, you'd better think again. The Windows version of Chrome isn't just the first to market; it's also the master mold for all the other versions. You won't see a Linux version until the Chrome developers manage to port the original Win32 codebase over to Linux, with all the headaches that implies.
In short, don't expect a Mac or Linux version of Chrome any time soon. Not even close.
So for my project, Windows was it. But even then, getting the code wasn't as easy as simply clicking a link. Instead, I first had to install a set of scripts to give me access to Chromium's Subversion source code repository. These are command-line tools, but they should feel familiar to anyone with a modicum of development experience. What checking out code from Subversion meant, however, was that I'd be working with the latest, bleeding-edge version of the code. At this early stage of the project, Chromium is definitely a moving target.
It might be helpful to have a book to read while you wait for the source code tree to sync for the first time. The whole thing amounts to around 2.4GB of code, including all the various layout tests used to debug the WebKit rendering engine. Google says the entire download should take about an hour, depending on network activity. In my case it took at least twice that long, despite a 6Mbit broadband connection.
Dissecting a browser
Examination of the source tree reveals some interesting tidbits. Except in cases where code was borrowed from other projects, the source is released under a three-clause BSD-style license, one of the most permissive open source licenses. Google clearly has no qualms about Chromium code being used in commercial settings.
When Chromium does borrow, it's mostly from the expected sources. Besides the WebKit HTML rendering engine, the tree includes the typical libraries for displaying JPEGs, compressing files, and so on. It uses hunspell for its automatic spell-checker -- the same library used by Firefox 3 -- so you can expect that feature to work identically on both browsers.
Overall, the code looks clean and is well organized. Firefox is frequently criticized for its large, Byzantine codebase. By comparison, the Chromium code seems much more accessible to the casual programmer. Comments are plentiful, and they occasionally display some of the humor that makes the best open source projects so much fun. For example, one component of the browser core is a debugging aid dubbed the "jank-o-meter." A comment inside the source explains: "Put break point here if you want to stop threads and look at what caused the jankiness."
Interestingly, Chromium was designed with a certain amount of modularity built in. For example, if for some reason you don't want to use Chromium's ultra-fast V8 JavaScript engine, you can change a few compile-time flags and build it with JavaScriptCore, the engine that ships with WebKit, instead.
What is not immediately evident, however, is any kind of extension mechanism. There is no directory in the source tree called "plug-ins," for example. Building an ad blocker for Chrome might be harder than it sounds.
Putting it all together
Next up: Building the actual browser. To build Chrome for Windows, you'll need Visual Studio 2005 Service Pack 1 (plus some optional patches for improved performance and Vista compatibility) and the current Windows SDK. Neither Visual Studio 2003 nor 2008 are supported currently, due to incompatibility with certain parts of the Chromium codebase.
The folks at Google made it sound as if, once you had the source code, building Chromium was as easy as loading up the solution file in Visual Studio and pressing F7 -- so that's what I did. And you know what? They were right! Fifteen minutes and 51 compiler warnings later, I had my chrome.exe. (For reference, this was on a 2.4GHz Intel Q6600 quad-core workstation running Vista Ultimate, with 4GB of RAM and ample hard drive space.)
Launching the browser brought no real surprises. As the name suggests, Chromium is a rawer, less polished version of Chrome. The UI is mostly identical, with only a few very minor visual differences. All of the same options are available in the pull-down menus on the right. Sites render the same, including Flash sites. The most readily evident difference is the logo, which sheds the Google colors in favor of a subdued blue design.

Where it comes to overall ease of use, however, Google has put in a little extra effort to differentiate Chrome from Chromium. Chrome offered to import my Firefox 3 settings automatically on first launch, and the process went without a hitch. I had to do it manually with Chromium, and when I tried, it gagged on my search engine settings and aborted the process. I managed to bring in my bookmarks by importing them separately; but while Chrome organized them just like my Firefox setup, Chromium hid them away in a subfolder.
These minor quibbles aside, however, my initial impression of Chromium is that it is a full-featured, usable browser. Better still, its code is straightforward and well organized, which should make it appealing to would-be browser developers who have shied away from the more daunting Mozilla codebase. I'm looking forward to seeing how it develops as Chrome moves toward its first stable release and beyond.
Posted by Neil McAllister on September 11, 2008 03:00 AM
福布斯:企业市场 Chrome任重而道远
约两周前,谷歌推出了 Chrome浏览器,在IT业界引起了不小的震动。现在的问题是,Chrome是否能提供更为强大的服务,足以使其它用户从IE和Firefox转移。
从人个角度讲,我喜欢喜欢 Chrome。但我认为,它要在企业市场生存需要经过艰苦的奋斗。先让我们看一下谷歌宣称的 Chrome三大优势:速度、安全和稳定性,然后再讨论其它问题。
速度
谷歌宣称Chrome比其它浏览器速度更快,我也听到一些用户关于其速度的报告,我进行的测试也非试验室测试,但 Chrome的确在速度方面并没给我深刻的印象。 Chrome不比其它IE慢,但也没有比IE明显快多少。
安全
谷歌宣称针对目前的浏览器开发设计 Chrome.因此,谷歌没有为新的威胁和互联网应用开发补丁,而表示 Chrome具有一个灵活的安全架构。问题是,互联网是动态的,而非静态的。IE必须对此适应,而 Chrome也不例外。
微软此前就宣称IE的安全性很出色,但其总是不断推出安全补丁。实际上, Chrome推出数小时后,就出现安全问题报告。
稳定性
Chrome具我多线程架构,因此,即使是有一个或是更多的网页出现问题时,它允许网页继续运行。在过去,一旦一个网页现出问题,整体浏览器就会出现问题,现在,这个问题也不例外。与IE相比, Chrome占用的内存更多,这对老的硬件产品用户来说就是一个问题。
出色的功能
给我印象就深刻的是 Chrome的“最经常访问网页”。当你打开新的标签时,你会在屏幕中看到你最经常访问的网站标志。这如现你最经常使用的标签出现在屏幕上一样。我发现,在搜索主题和在不同的网站之间来回穿梭时,这一功能非常方便。 Chrome还提供“Paste and Go.”等功能。
一些网站不支持Chrome
你会发现,Chrome在你喜爱的网站中表现出色。但如果你在一个网站中遇到问题,并希望得到网站支持时,你会发现该网站不支持Chrome应用功能。
支持新的浏览器往往比较慢。Firefox于2004年推出,现在占有22%的市场份额。在数周前,美国银行——全球最大的金融机构之一,宣传网站正式支持Firefox.在Chrome获得市场份额前,当Chrome运行不太好时,你必须把IE作为备用浏览器。
一些网站只支持IE
你是否喜欢在MSN网站上玩游戏?如果是,那最好不要使用Chrome.如果你使用Chrome进入游戏频道,你会得到一个重要的信息提示“你的浏览器或是运营系统无法满足在MSN游戏区玩游戏的最低要求”。你可能会下载游戏在离线时玩,但是,在线游戏只能在IE6或是更高版本中使用。微软不会轻易让竞争对手的产品在自己的平台上随意使用。
在其它网站上,你也会看到这种情况,因为IE是最常用的浏览器。随着Chrome和火狐浏览器应用的增加,我希望这个问题会变得越来越小,当然,这一问题不可能宣传消失。
最后,对于企业用户来说,有几个问题十分重要:Chrome与Outlook Web Access的兼容性如何?它是否会与微软的统一通讯功能使用显示“存在”?
许多企业用户发现OWA是一种接入电遇的好办法,当你们无法接入工作电脑时。Chrome支持OWA,但有一些不同。Chrome还有日历选择功能,但你只能选择数天或是数周的内容,而IE则能为用户提供一个月的日历内容浏览。
如果你使用微软的统一通讯技术,你可能对“jelly bean”很熟悉。但是,这一功能 无法与Chrome兼容。Chrome面临的最大问题是,它没有充分的理由让企业转移。与OWA和不兼容,以及支持条件的严格等等,使企业坚信使用IE仍是最佳选择。
随着新一代网络应用的推广,人们都在讨论浏览器之争的临近。凭借IE在企业市场的霸主地位和微软在企业运算环境的强大优势,谷歌和Chrome必须拿出自己的绝活才能对抗微软。
2008年9月15日星期一
WTL初学者
WTL初学者
对于WTL来说,我是个地道的初学者。虽然当年用C++的时候,用过VCL和MFC(那时候的WTL还没有现在这么出名),水平只是限于一般使用者。CSDN的BCB版上七千多的专家分就是明证——这小子水平也很菜。重拾对WTL的关注是因为Visual Studio 2005,微软的官方文档上已经说明,VS.NET 2005已经支持WTL在CE平台上的开发了。不过那个WTL 8.0到现在还没出来,弄得一堆人在微软新闻组里乱叫。
为了提前感受一下,我弄了个WTL 7.1感受一下。其实WTL 7.1已经支持在EVC4下开发CE和Windows Mobile的应用程序了,我们稍后会讲到。既然是初学者,就要从最基本的入手,先用VS.NET 2003写一个WTL的应用程序吧。
从网上下载WTL 7.1的安装包,解压后会生成一个“c:\wtl71”的文件夹。因为我们要在VS.NET 2003里写WTL程序,所以就选择执行“AppWiz70”目录下的setup71.js,如果是VS.NET 2002则选择执行“setup.js”。
安装过程比以前要容易多了,在提示安装成功后,我们直接打开VS.NET 2003,创建新项目,在VC++项目中会多一个ATL/WTL Application Wizard的图标。


输入姓名后,按“确定”,进入生成向导。


我们选择Application Type,选择应用程序的类型。我们选择了“Enable ActiveX Control Hosting”,让这个应用程序可以作为ActiveX控件的宿主应用程序。


然后我们选择User Interface Features.

列出的都是应用程序常用的项,比如Toolbar和Command Bar什么的。还可以选择视图的形态,我们这里选择的都是默认。
点击完成后,进入主界面,和MFC的应用基本没什么不同。选择编译时会报错,说atlapp.h找不到。忘了把编译路径加上了。
“工具”菜单中选择“选项”,在“项目”节点下面选择“VC++目录”。然后在“显示以下内容的目录”下选择“包含文件”(瞧中文版翻译的……)。添加一个“c:\wtl71\include”的目录。


编译,一切正常,然后选择运行。结果就是下面这个样子。

好了,内容就这么多,够初学吧。其实初学不怕,关键是愿意把自己的经验与别人分享,自然会有后来者踩着你的足迹前进的。
本文引用自http://blog.csdn.net/aawolf/,作者:马宁
2008年9月14日星期日
有感于“扁鹊论医术”
扁鹊的这番话表现的不只是他的诚实和谦逊,还在于他给我们提供了一个考虑问题的思路,就是用什么样的态度来对待一个人的能力和业绩。扁鹊对这个问题的认识是清醒的,其大哥防患于未然,二哥治病于萌芽,无疑都要比自己只到病人病情严重时才能看出来并进行施救的水平要高得多,可论功名却往往不成正比。其中原因是什么呢?我觉得就在于人们有一种“实用性思维”,也就是在某一关键事情上,只有你付出更多且有效的劳动才承认你,否则都会被轻视和忽略。
扁鹊的医术观其实就是一种识人观。古往今来有不少这样的人,他们只看到对方能做什么具体的事,能干什么活,而看不出其远见卓识和雄才大略。霸王项羽就属于这样的人,当年韩信、陈平等诸多富有战略眼光的名将和谋士都在其麾下,但项羽却眼圈狭小,看不出他们的大智大勇,一个也不重用。结果他们中有的人投奔到刘邦门下,成为一代名将,最终将项羽消灭。三国时期的袁绍也是这样的人。官渡之战前夕,富有远见的谋臣田丰分析敌我兵情,觉得暂不宜与士气正旺的曹操部队交战。袁绍不仅不听,还将田丰囚禁起来。结果不出田丰所料。可战败归来的袁绍不仅不视田丰为高明,反而将其杀之。由于人的学识、经验和智商不同,生活中不乏富有卓识远见和能够见微知著的人,他们能够将一些不良后果消灭在萌芽状态。对于这样的人,我们不仅要听其言,还要作为重要人才加以推崇,使得他们声名远播,提出更好更多的建议,这对于我们的事业大有好处。
扁鹊的医术观也是一种业绩观,就是以什么样的眼光和态度来看待一个人的业绩。不否认,有的人把具体工作做得很扎实、很出色,值得嘉许。但也不应忽视那些事前有预料、防患于未然的人,他们的一句预言、一次遏制,就能把事情的恶果消灭在萌芽状态,所产生的效益要比亡羊补牢高得多。在布鲁塞尔广场上有一尊尿童的雕塑,据传当年法军入侵比利时,在法军堆集大量炸药,点燃导火索破城的千钧一发之际,路过此处的小童于廉急中生智,用自己的一泡尿浇熄了嗞嗞作响的导火索,从而保住了全城人的性命。小于廉这一英雄壮举可谓千百雄兵所不能比,为此,比利时人将其视为英雄,为其塑像,完全应该。可生活中有的人并不这样想问题,“焦头烂额座上客,曲突徙薪阶下囚”,在一个单位出了问题,往往是抢救者受到表扬奖励,而那些有预言并能防止事故发生者却被忽视,即使受表扬也轻描淡写。这样的结果,往往是人们不愿意对一些问题进行前瞻性思考,即使有思考、有预见也不愿意积极主动地说出来,这对于我们在工作中预防隐患,提高效益是不利的。
读扁鹊一番话,觉得他不只是名医,也是一位哲人,其语言中的哲理很值得我们铭记。
2008年9月10日星期三
清理QQ垃圾文件
2008年9月8日星期一
引子
2.1 引子
如果你是一个纯粹的实用主义者,也许一开始就可以从这里开始看起,因为此处提供了一个示例程序,它可以带给你有关使用STL的最直接的感受。是的,与其纸上谈兵,不如单刀直入,实际操作一番。但是,需要提醒的是,假如你在兴致昂然地细细品味本章内容的时候,能够同时结合前面章节作为佐餐,那将是再好不过的。你会发现,前面所提到的有关STL的那些优点,在此处得到了确切的应证。本章的后半部分,将为你演示在一些主流C ++编译器上,运行上述示例程序的具体操作方法,和需要注意的事项。
2.2 例程实作
非常遗憾,我不得不舍弃"Hello World"这个经典的范例,尽管它不只一次的被各种介绍计算机语言的教科书所引用,几乎成为了一个默认的“标准”。其原因在于它太过简单了,以至于不具备代表性,无法展现STL的巨大魅力。我选用了一个稍稍复杂一点的例子,它的大致功能是:从标准输入设备(一般是键盘)读入一些整型数据,然后对它们进行排序,最终将结果输出到标准输出设备(一般是显示器屏幕)。这是一种典型的处理方式,程序本身具备了一个系统所应该具有的几乎所有的基本特征:输入 + 处理 + 输出。你将会看到三个不同版本的程序。第一个是没有使用STL的普通C++程序,你将会看到完成这样看似简单的事情,需要花多大的力气,而且还未必没有一点问题(真是吃力不讨好)。第二个程序的主体部分使用了STL特性,此时在第一个程序中所遇到的问题就基本可以解决了。同时,你会发现采用了STL之后,程序变得简洁明快,清晰易读。第三个程序则将STL的功能发挥到了及至,你可以看到程序里几乎每一行代码都是和STL相关的。这样的机会并不总是随处可见的,它展现了STL中的几乎所有的基本组成部分,尽管这看起来似乎有点过分了。
有几点是需要说明的:
这个例程的目的,在于向你演示如何在C++程序中使用STL,同时希望通过实践,证明STL所带给你的确确实实的好处。程序中用到的一些STL基本组件,比如:vector(一种容器)、sort(一种排序算法),你只需要有一个大致的概念就可以了,这并不影响阅读代码和理解程序的含义。
很多人对GUI(图形用户界面)的运行方式很感兴趣,这也难怪,漂亮的界面总是会令人赏心悦目的。但是很可惜,在这里没有加入这些功能。这很容易解释,对于所提供的这个简单示例程序而言,加入GUI特性,是有点本末倒置的。这将会使程序的代码量骤然间急剧膨胀,而真正可以说明问题的核心部分确被淹没在诸多无关紧要的代码中间(你需要花去极大的精力来处理键盘或者鼠标的消息响应这些繁琐而又较为规范的事情)。即使你有像Borland C++ Builder这样的基于IDE(集成化开发环境)的工具,界面的处理变得较为简单了(框架代码是自动生成的)。请注意,我们这里所谈及的是属于C++标准的一部分(STL的第一个字母说明了这一点),它不涉及具体的某个开发工具,它是几乎在任何C++编译器上都能编译通过的代码。毕竟,在 Microsoft Visual C++和Borland C++ Builder里,有关GUI的处理代码是不一样的。如果你想了解这些GUI的细节,这里恐怕没有你希望得到的答案,你可以寻找其它相关书籍。
2.2.1 第一版:史前时代--转木取火
在STL还没有降生的"黑暗时代",C++程序员要完成前面所提到的那些功能,需要做很多事情(不过这比起C程序来,似乎好一点),程序大致是如下这个样子的:
// name:example2_1.cpp // alias:Rubish #include#include int compare(const void *arg1, const void *arg2); void main(void) { const int max_size = 10; // 数组允许元素的最大个数 int num[max_size]; // 整型数组 // 从标准输入设备读入整数,同时累计输入个数, // 直到输入的是非整型数据为止 int n; for (n = 0; cin >> num[n]; n ++); // C标准库中的快速排序(quick-sort)函数 qsort(num, n, sizeof(int), compare); // 将排序结果输出到标准输出设备 for (int i = 0; i <> *(int *)arg2) ? 1 : 0; }
这是一个和STL没有丝毫关系的传统风格的C++程序。因为程序的注释已经很详尽了,所以不需要我再做更多的解释。总的说来,这个程序看起来并不十分复杂(本来就没有太多功能)。只是,那个compare函数,看起来有点费劲。指向它的函数指针被作为最后一个实参传入qsort函数,qsort是C程序库stdlib.h中的一个函数。以下是qsort的函数原型:
void qsort(void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) ); 看起来有点令人作呕,尤其是最后一个参数。大概的意思是,第一个参数指明了要排序的数组(比如:程序中的num),第二个参数给出了数组的大小(qsort没有足够的智力预知你传给它的数组的实际大小),第三个参数给出了数组中每个元素以字节为单位的大小。最后那个长长的家伙,给出了排序时比较元素的方式(还是因为qsort的智商问题)。
以下是某次运行的结果:
输入:0 9 2 1 5
输出:0 1 2 5 9有一个问题,这个程序并不像看起来那么健壮(Robust)。如果我们输入的数字个数超过max_size所规定的上限,就会出现数组越界问题。如果你在Visual C++的IDE环境下以控制台方式运行这个程序时,会弹出非法内存访问的错误对话框。这个问题很严重,严重到足以使你开始重新审视这个程序的代码。为了弥补程序中的这一缺陷。我们不得不考虑采用如下三种方案中的一种:
- 采用大容量的静态数组分配。
- 限定输入的数据个数。
- 采用动态内存分配。
第一种方案比较简单,你所做的只是将max_size改大一点,比如:1000或者10000。但是,严格讲这并不能最终解决问题,隐患仍然存在。假如有人足够耐心,还是可以使你的这个经过纠正后的程序崩溃的。此外,分配一个大数组,通常是在浪费空间,因为大多数情况下,数组中的一部分空间并没有被利用。
再来看看第二种方案,通过在第一个for循环中加入一个限定条件,可以使问题得到解决。比如:for (int n = 0; cin >> num[n] && n <>
看来只有选择第三种方案了。是的,你可以利用指针,以及动态内存分配妥善的解决上述问题,并且使程序具有良好的灵活性。这需要用到new,delete操作符,或者古老的malloc(), realloc()和free()函数。但是为此,你将牺牲程序的简洁性,使程序代码陡增,代码的处理逻辑也不再像原先看起来那么清晰了。一个 compare函数或许就已经令你不耐烦了,更何况要实现这些复杂的处理机制呢?很难保证你不会在处理这个问题的时候出错,很多程序的bug往往就是这样产生的。同时,你还应该感谢stdlib.h,它为你提供了qsort函数,否则,你还需要自己实现排序算法。如果你用的是冒泡法排序,那效率就不会很理想。……,问题真是越来越让人头疼了!
关于第一个程序的讨论就到此为止,如果你对第三种方案感兴趣的话,可以尝试着自己编写一个程序,作为思考题。这里就不准备再浪费笔墨去实现这样一个让人不甚愉快的程序了。
2.2.2 第二版:工业时代--组件化大生产
我们应该庆幸自己所生活的年代。工业时代,科技的发展所带来的巨大便利已经影响到了我们生活中的每个细节。如果你还在以原始人类的方式生活着,那我真该怀疑你是否属于某个生活在非洲或者南美丛林里的原始部落中的一员了,难道是玛雅文明又重现了?
STL便是这个时代的产物,正如其他科技成果一样,C++程序员也应该努力使自己适应并充分利用这个"高科技成果"。让我们重新审视第一版的那个破烂不堪的程序。试着使用一下STL,看看效果如何。
// name:example2_2.cpp // alias:The first STL program #include#include #include using namespace std; void main(void) { vector num; // STL中的vector容器 int element; // 从标准输入设备读入整数, // 直到输入的是非整型数据为止 while (cin >> element) num.push_back(element); // STL中的排序算法 sort(num.begin(), num.end()); // 将排序结果输出到标准输出设备 for (int i = 0; i <>这个程序的主要部分改用了STL的部件,看起来要比第一个程序简洁一点,你已经找不到那个讨厌的compare函数了。它真的能很好的运行吗?你可以试试,因为程序的运行结果和前面的大致差不多,所以在此略去。我可以向你保证,这个程序是足够健壮的。不过,可能你还没有完全看明白程序的代码,所以我需要为你解释一下。毕竟,这个戏法变得太快了,较之第一个程序,一眨眼的功夫,那些老的C++程序员所熟悉的代码都不见了,取而代之的是一些新鲜玩意儿。 程序的前三行是包含的头文件,它们提供了程序所要用到的所有C++特性(包括输入输出处理,STL中的容器和算法)。不必在意那个.h,并不是我的疏忽,程序保证可以编译通过,只要你的C++编译器支持标准C++规范的相关部分。你只需要把它们看作是一些普通的C++头文件就可以了。事实上,也正是如此,如果你对这个变化细节感兴趣的化,可以留意一下你身旁的佐餐。
同样可以忽略第四行的存在。加入那个声明只是为了表明程序引用到了std这个标准名字空间(namespace),因为STL中的那些玩意儿全都包含在那里面。只有通过这行声明,编译器才能允许你使用那些有趣的特性。
程序中用到了vector,它是STL中的一个标准容器,可以用来存放一些元素。你可以把vector理解为int [?],一个整型的数组。之所以大小未知是因为,vector是一个可以动态调整大小的容器,当容器已满时,如果再放入元素则vector会悄悄扩大自己的容量。push_back是vector容器的一个类属成员函数,用来在容器尾端插入一个元素。main函数中第一个while循环做的事情就是不断向 vector容器尾端插入整型数据,同时自动维护容器空间的大小。
sort是STL中的标准算法,用来对容器中的元素进行排序。它需要两个参数用来决定容器中哪个范围内的元素可以用来排序。这里用到了vector的另两个类属成员函数。begin()用以指向vector的首端,而end()则指向vector的末端。这里有两个问题,begin()和end()的返回值是什么?这涉及到STL的另一个重要部件--迭代器(Iterator),不过这里并不需要对它做详细了解。你只需要把它当作是一个指针就可以了,一个指向整型数据的指针。相应的sort函数声明也可以看作是void sort(int* first, int* last),尽管这实际上很不精确。另一个问题是和end()函数有关,尽管前面说它的返回值指向vector的末端,但这种说法不能算正确。事实上,它的返回值所指向的是vector中最末端元素的后面一个位置,即所谓pass-the-end value。这听起来有点费解,不过不必在意,这里只是稍带一提。总的来说,sort函数所做的事情是对那个准整型数组中的元素进行排序,一如第一个程序中的那个qsort,不过比起qsort来,sort似乎要简单了许多。
程序的最后是输出部分,在这里vector完全可以以假乱真了,它所提供的对元素的访问方式简直和普通的C++内建数组一模一样。那个size函数用来返回vector中的元素个数,就相当于第一个程序中的变量n。这两行代码直观的不用我再多解释了。
我想我的耐心讲解应该可以使你大致看懂上面的程序了,事实上STL的运用使程序的逻辑更加清晰,使代码更易于阅读。试问,有谁会不明白begin、 end、size这样的字眼所表达的含义呢(除非他不懂英语)?试着运行一下,看看效果。再试着多输入几个数,看看是否会发生数组越界现象。实践证明,程序运行良好。是的,由于vector容器自行维护了自身的大小,C++程序员就不用操心动态内存分配了,指针的错误使用毕竟会带来很多麻烦,同时程序也会变得冗长无比。这正是前面第三种方案的缺点所在。
再仔细审视一下你的第一个STL版的C++程序,回顾一下第一章所提到的那些有关STL的优点:易于使用,具有工业强度……,再比较一下第一版的程序,我想你应该有所体会了吧!
2.2.3 第三版:唯美主义的杰作
事态的发展有时候总会趋向极端,这在那些唯美主义者当中犹是如此。首先声明,我并不是一个唯美主义者,提供第二版程序的改进版,完全是为了让你更深刻的感受到STL的魅力所在。在看完第三版之后,你会强烈感受到这一点。或许你也会变成一个唯美主义者了,至少在STL方面。这应该不是我的错,因为决定权在你手里。下面我们来看看这个绝版的C++程序。
// name:example2_3.cpp // alias:aesthetic version #include在这个程序里几乎每行代码都是和STL有关的(除了main和那对花括号,当然还有注释),并且它包含了STL中几乎所有的各大部件(容器 container,迭代器iterator, 算法algorithm, 适配器adaptor),唯一的遗憾是少了函数对象(functor)的身影。#include #include #include using namespace std; void main(void) { typedef vector int_vector; typedef istream_iterator istream_itr; typedef ostream_iterator ostream_itr; typedef back_insert_iterator<> back_ins_itr; // STL中的vector容器 int_vector num; // 从标准输入设备读入整数, // 直到输入的是非整型数据为止 copy(istream_itr(cin), istream_itr(), back_ins_itr(num)); // STL中的排序算法 sort(num.begin(), num.end()); // 将排序结果输出到标准输出设备 copy(num.begin(), num.end(), ostream_itr(cout, "\n")); } 还记得开头提到的一个典型系统所具有的基本特征吗?--输入+处理+输出。所有这些功能,在上面的程序里,仅仅是通过三行语句来实现的,其中每一行语句对应一种操作。对于数据的操作被高度的抽象化了,而算法和容器之间的组合,就像搭积木一样轻松自如,系统的耦合度被降到了极低点。这就是闪耀着泛型之光的STL的伟大力量。如此简洁,如此巧妙,如此神奇!就像魔术一般,以至于再一次让你摸不着头脑。怎么实现的?为什么在看第二版程序的时候如此清晰的你,又坠入了五里雾中(窃喜)。
请留意此处的标题(唯美主义的杰作),在实际环境中,你未必要做到这样完美。毕竟美好愿望的破灭,在生活中时常会发生。过于理想化,并不是一件好事,至少我是这么认为的。正如前面提到的,这个程序只是为了展示STL的独特魅力,你不得不为它的出色表现所折服,也许只有深谙STL之道的人才会想出这样的玩意儿来。如果你只是一般性的使用STL,做到第二版这样的程度也就可以了。
实在是因为这个程序太过"简单",以至于我无法肯定,在你还没有完全掌握STL之前,通过我的讲解,是否能够领会这区区三行代码,我将尽我的最大努力。
前面提到的迭代器可以对容器内的任意元素进行定位和访问。在STL里,这种特性被加以推广了。一个cin代表了来自输入设备的一段数据流,从概念上讲它对数据流的访问功能类似于一般意义上的迭代器,但是C++中的cin在很多地方操作起来并不像是一个迭代器,原因就在于其接口和迭代器的接口不一致(比如:不能对cin进行++运算,也不能对之进行取值运算--即*运算)。为了解决这个矛盾,就需要引入适配器的概念。istream_iterator便是一个适配器,它将cin进行包装,使之看起来像是一个普通的迭代器,这样我们就可以将之作为实参传给一些算法了(比如这里的copy算法)。因为算法只认得迭代器,而不会接受cin。对于上面程序中的第一个copy函数而言,其第一个参数展开后的形式是:istream_iterator(cin),其第二个参数展开后的形式是:istream_iterator()(如果你对typedef的语法不清楚,可以参考有关的c++语言书籍)。其效果是产生两个迭代器的临时对象,前一个指向整型输入数据流的开始,后一个则指向"pass-the-end value"。这个函数的作用就是将整型输入数据流从头至尾逐一"拷贝"到vector这个准整型数组里,第一个迭代器从开始位置每次累进,最后到达第二个迭代器所指向的位置。或许你要问,如果那个copy函数的行为真如我所说的那样,为什么不写成如下这个样子呢?
copy(istream_iterator
(cin), istream_iterator (), num.begin()); 你确实可以这么做,但是有一个小小的麻烦。还记得第一版程序里的那个数组越界问题吗?如果你这么写的话,就会遇到类似的麻烦。原因在于copy函数在" 拷贝"数据的时候,如果输入的数据个数超过了vector容器的范围时,数据将会拷贝到容器的外面。此时,容器不会自动增长容量,因为这只是简单地拷贝,并不是从末端插入。为了解决这个问题,另一个适配器back_insert_iterator登场了,它的作用就是引导copy算法每次在容器末端插入一个数据。程序中的那个back_ins_itr(num)展开后就是:back_insert_iterator(num),其效果是生成一个这样的迭待器对象。终于将讲完了三分之一(真不容易!),好在第二句和前一版程序没有差别,这里就略过了。至于第三句,ostream_itr(cout, "\n")展开后的形式是:ostream_iterator(cout, "\n"),其效果是产生一个处理输出数据流的迭待器对象,其位置指向数据流的起始处,并且以"\n"作为分割符。第二个copy函数将会从头至尾将 vector中的内容"拷贝"到输出设备,第一个参数所代表的迭代器将会从开始位置每次累进,最后到达第二个参数所代表的迭代器所指向的位置。
这就是全部的内容。
2.3 历史的评价
历史的车轮总是滚滚向前的,工业时代的文明较之史前时代,当然是先进并且发达的。回顾那两个时代的C++程序,你会真切的感受到这种差别。简洁易用,具有工业强度,较好的可移植性,高效率,加之第三个令人目眩的绝版程序所体现出来的高度抽象性,高度灵活性和组件化特性,使你对STL背后所蕴含的泛型化思想都有了些微的感受。
真幸运,你可以横跨两个时代,有机会目睹这种"文明"的差异。同时,这也应该使你越加坚定信念,使自己顺应时代的潮流。
2.4 如何运行
在你还没有真正开始运行前面后两个程序之前,最好先浏览一下本节。这里简单介绍了在特定编译器环境下运行STL程序的一些细节,并提供了一些可能遇到的问题的解决办法。
此处,我选用了目前在Windows平台下较为常见的Microsoft Visual C++ 6.0和Borland C++ Builder 6.0作为例子。尽管Visual C++ 6.0对最新的ANSI/ISO C++标准支持的并不是很好。不过据称Visual C++ .NET(也就是VC7.0)在这方面的性能有所改善。
你可以选用多种方式运行前面的程序,比如在Visual C++下,你可以直接在DOS命令行状态下编译运行,也可以在VC的IDE下采用控制台应用程序(Console Application)的方式运行。对于C++ Builder,情况也类似。
对于Visual C++而言,如果是在DOS命令行状态下,你首先需要找到它的编译器。假定你的Visual C++装在C:\Program Files\Microsoft Visual Studio\VC98下面,则其编译器所在路径应该是C:\Program Files\Microsoft Visual Studio\VC98\Bin,在那里你可以找到cl.exe文件。编译时请加上/GX和/MT参数。如果一切正常,结果就会产生一个可执行文件。如下所示:
cl /GX /MT example2_2.cpp
前一个参数用于告知编译器允许异常处理(Exception Handling)。在P. J. Plauger STL中的很多地方使用了异常处理机制(即try…throw…catch语法),所以应该加上这个参数,否则会有如下警告信息:
warning C4530: C++ exception handler used, but unwind semantics are not enabled.
后一个参数则用于使程序支持多线程,它需要在链接时使用LIBCMT.LIB库文件。不过P. J. Plauger STL并不是线程安全的(thread safety)。如果你是在VC环境下使用像STLport这样的STL实现版本,则需要加上这个参数,因为STLport是线程安全的。
如果在IDE环境下,可以在新建工程的时候选择控制台应用程序。
![]()
图3:在Visual C++ IDE环境下运行STL程序至于那些参数的设置,则可以通过在Project功能菜单项中的Settings功能【Alt+F7】中设置编译选项来完成。
;
图4:在Visual C++ IDE环境下设置编译参数有时,在IDE环境下编译STL程序时,可能会出现如下警告信息(前面那几个示例程序不会出现这种情况):
warning C4786: '……' : identifier was truncated to '255' characters in the debug information
这是因为编译器在Debug状态下编译时,把程序中所出现的标识符长度限制在了255个字符范围内。如果超过最大长度,这些标识符就无法在调试阶段查看和计算了。而在STL程序中大量的用到了模板函数和模板类,编译器在实例化这些内容时,展开之后所产生的标识符往往很长(没准会有一千多个字符!)。如果你想认识一下这个warning的话,很简单,在程序里加上如下一行代码:
vector
string_array; // 类似于字符串数组变量 对于这样的warning,当然可以置之不理,不过也是有解决办法的。 你可以在文件开头加入下面这一行:#pragma warning(disable: 4786)。它强制编译器忽略这个警告信息,这种做法虽然有点粗鲁,但是很有效。
至于C++ Builder,其DOS命令行状态下的运行方式是这样的。假如你的C++ Builder装在C:\Program Files\Borland\CBuilder6。则其编译器所在路径应该是C:\Program Files\ Borland\CBuilder6\Bin,在那里你可以找到bcc32.exe文件,输入如下命令,即大功告成了:
bcc32 example2_2.cpp
至于IDE环境下,则可以在新建应用程序的时候,选择控制台向导(Console Wizard)。
![]()
图5:在C++ Builder IDE环境下运行STL程序现在你可以在你的机器上运行前面的示例程序了。不过,请恕我多嘴,有些细节不得不提请你注意。小心编译器给你留下的陷阱。比如前面第三个程序中有如下这一行代码:
typedef back_insert_iterator<> back_ins_itr;
请留意">"前面的空格,最好不要省去。如果你吝惜这点空格所占用的磁盘空间的话,那就太不划算了。其原因还是在于C++编译器本身的缺陷。上述代码,相当于如下代码(编译器做的也正是这样的翻译工作):
typedef back_insert_iterator<> > back_ins_itr;
如果你没有加空格的话,编译器会把">>"误认为是单一标识(看起来很像那个数据流输入操作符">>")。为了回避这个难题, C++要求使用者必须在两个右尖括号之间插入空格。所以,你最好还是老老实实照我的话做,以避免不必要的麻烦。不过有趣的是,对于上述那行展开前的代码,在Visual C++里即使你没有加空格,编译器也不会报错。而同样的代码在C++ Builder中没有那么幸运了。不过,最好还是不要心存侥幸,如果你采用展开后的书写方式,则两个编译器都不会给你留情面了。