2009年6月9日
我本科是学师范的,曾经很长一段时间在想中国的教育到底有什么问题,为什么来自世界,中国国内社会和学生和
老师的各方面的疑惑都有。今天在科学网王宝山的博客上看到这篇工科思维对中国教育和科研的危害,让我更深入的思考了
这个话题。
我觉得中国的教育一直在提倡改革是有道理的,因为中国的教育一直都不被中国自己人看好,这就是为什么大家这
么想出国深造,海归人士自我优越感很强的原因。国内的出了很牛的成果的领域和项目往往会有国外的参与或者与国外合作。发
表在top 1 的论文如果完全是中国人自己做的往往会让业内人士刮目相看。但这也有中国的科研起步晚,经费紧张等等的原因。
再往前说说,中国人崇尚中庸之道,什么事情要稳,不要出风头。包括初等教育的学习过程和选择自己的兴趣的时
候,学生们倾向分析已有的形势,参考以前的经验,综合考虑对自己的利弊,才做出最后的决定,纯兴趣使然的人我个人认
为是少之又少。而我觉得国外的学生或者是中国的留学生就会有更多的选择的自由,而且更依照自己内心的声音做决定。他
们可以在世界各地旅游式的学习,可以同时修很多门专业,可以本硕博在不同的领域内做研究,可以完全按兴趣去很有效率
的完成任务。当然我不是说在国内这些不可以,而是大环境,大氛围下能这么做的人少。我觉得所谓“工科思维”,其实是
这种传统思维的一个延伸。
还有是学校纯追求升学率和就业率,造成了对个人衡量的标准僵化。记得那位大师说过:教育就是要教那些学不好
的人学好。现在这个学好的标准就是分数高,学生有很多业余爱好有些确实是自己的兴趣,也有很多人是只挑以后能对升学
和就业有利的去学,还有很多人更悲惨,是根本没有条件去学点考试之外的东西。不是学业重,就是经济条件不允许。而且
现在教育改革虽然有实际措施,也实施了很多,但是听说过很多学生要拿以前没有改版的课本看,说上面有考试内容,但是
新书上没有。而且说旧书的条理比较清楚。这个现象可以从两个方面分析。1.考试内容或者形式没有及时根据课程改革,教
学新要求来改。2.旧书条理清楚,这个说法细说起来是义务教育阶段的学生们就已经有思维的条框了,这个框架如果引导的
对,就是说评价标准合适的话,那说明中国的义务教育很成功,中国的孩子很聪明。如果这个引导有问题而新教材又是鼓励
创新和发散思维的话,这说明中国十几岁的孩子的思维已经有点僵化了。这也许能说明为什么中国的学生应付奥赛频频捷报
,而诺贝尔奖却迟迟无音吧。
以上仅是个人的看法,还请大家批评指教,希望能就这个问题继续探讨。
2009年6月8日
LIBCD.lib(**.obj):error LNK2001: unresolved external symbol _main
创建一个Win32 console Application的工程,这是在cpp文件里代码
#include <iostream>
using namespace std;
class num_sequence
{
public:
virtual ~num_sequence() {};//基类定义了虚函数,其析构函数要声明为virtual
virtual int elem( int pos ) const = 0;//纯虚函数
virtual const char* what_am_i() const = 0;
static int max_elems() { return _max_elems; }
virtual ostream& print( ostream &os = cout ) const = 0;
protected:
virtual void gen_elems( int pos ) const = 0;
bool check_integrity( int pos,int size ) const;
protected:
const static int _max_elems ;
};
const int num_sequence::_max_elems = 1024;
连接时就会有上述错误了。
不知为什么LIBC会需要变量main必须存在,好像没有任何理由呀。
在代码后面加上
int main;
以后就一切正常了。
有些时候真是搞不懂程序到底在想什么,编个程序又要考虑运行环境,编译器,还有各种版本的不同,计算机给人带来了方便,是以折磨程序员为前提的吗?(⊙o⊙)
继续查了一些资料,下面是转帖的。
在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有柚煤孟钅坎问? 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有: m1+4#'
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main (gd){j
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 OuR5T>>
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 *_g+&Us1
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex }t,6 oT
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex <u%N(=9
]wpN"w"
1. Windows子系统设置错误, 提示: )WA5FzPLw
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main *+oJ(e
4f{'{1]\
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置: *^'y#/Dg
z !DF-%3|
[Project] --> [Settings] --> 选择"Link"属性页, Qo!
在Project Options中将/subsystem:console改成/subsystem:windows T`H.k"Y{
Xn?{t*{
2. Console子系统设置错误, 提示: vwK 7b0M
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 4Y~E`L0,
8%P ><"
控制台项目要使用Console子系统, 而不是Windows, 设置: *Cl5Y':|h
sipSn4_
[Project] --> [Settings] --> 选择"Link"属性页, WveN']q\
在Project Options中将/subsystem:windows改成/subsystem:console BR4C@Z
1 vBkC&
3. 程序入口设置错误, 提示: dy2$&$=
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 sP.>uExt
G- (k~1q
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口: r#~P5[aV
Os hl6 i
[Project] --> [Settings] --> 选择"Link"属性页, "1zk_#B*
在Category中选择Output, p HGRL
再在Entry-point symbol中填入wWinMainCRTStartup, 即可 >IC}SZ
F)c[@\.dm
4. 线程运行时库设置错误, 提示: X;t_- f
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex AmiBqZTp
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex sz 23_{c?
oz! {Fd-
这是因为MFC要使用多线程时库, 需要更改设置: L a-Y,1x](
uAk>h^pbM
[Project] --> [Settings] --> 选择"C/C++"属性页, '%ET|1#SO
在Category中选择Code Generation, ;Y-M)k(
再在Use run-time library中选择Debug Multithreaded或者multithreaded 0v~5<Y'Z
咸鱼游侠(75374355) 12:11:11 <mW.@e5_
其中, W_qa?Jv
Single-Threaded 单线程静态链接库(release版本) Kh4w Q
Multithreaded 多线程静态链接库(release版本) |F]g[En 4
multithreaded DLL 多线程动态链接库(release版本) s-'qYgA6p
Debug Single-Threaded 单线程静态链接库(debug版本) _ 7w_./y
Debug Multithreaded 多线程静态链接库(debug版本) <[ ePw
Debug Multithreaded DLL 多线程动态链接库(debug版本) H8V/O9|(
9^x@/
单线程: 不需要多线程调用时, 多用在DOS环境下 /PJ|d5
多线程: 可以并发运行 clUdag,C
静态库: 直接将库与程序Link, 可以脱离MFC库运行 X]pEmHl
动态库: 需要相应的DLL动态库, 程序才能运行 \n{&_:b+q
release版本: 正式发布时使用 9J;ZZ/3
debug版本: 调试阶段使用 k9PoFC#k
下面是这个程序继续调试的问题:关于类的静态变量
class Fibonacci : public num_sequence
{
public:
Fibonacci( int len = 1, int beg_pos = 1 ):_length( len ), _beg_pos( beg_pos ) {}
virtual ~Fibonacci() {};
virtual int elem( int pos ) const;//继承虚函数,改写
virtual const char* what_am_i() const { return "Fabonacci"; }
static int max_elems() { return _max_elems; }
virtual ostream& print( ostream &os = cout ) const;
int length() const { return _length; }
int beg_pos() const { return _beg_pos; }
protected:
virtual void gen_elems( int pos ) const;
int _length;
int _beg_pos;
static vector<int> _elems;
};
std::vector<int> Fibonacci::_elems; //需要额外加入静态变量的定义 ??
否则出现错误:error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class Fibonacci' (or there is no acceptable conversion)
这个没有搞清楚为什么要这么做,晕中。。。
2009年5月31日
经过完考试,虽然我考的很惨,但是毕竟熬过来了,以实验室为家的生活开始了,想起去年自己在工大,在实验室那个空旷的屋里的情景,还真是有点怀念。因为那时候我还踌躇满志,对自己充满信心,对未来充满渴望,可是现在不知道是老了,还是自己经不起挫折,我已经对怎么样现实的生活更感兴趣了,而不是自己的梦想(或者叫想象里的不切实际)。
生活真的还在继续,不会因为你的颓废郁闷而受任何影响;时间还是那样流逝,不管你珍惜它还是渴望它快点过去。我需要让自己变的坚强去迎接更多的打击,挑战和机会,积极的心态还是很重要的,不断告诉自己一定要学会调节自己,顽强而潇洒的生活着,不为别人,只是有着自己的生活方式!
2009年3月31日
今天去听了个web of scienced 讲座,很多按钮就摆在页面上我们却从来不起用它,很多硕士博士们都是这样,挺不可思议的,从最平时最常用的事情看我们在研究上到底缺了什么?
2008年9月2日
来工大已经一段时间了,上课已经开始了,我总体还觉得习惯,因为以前还熟悉了一阵,还好。
寝室人都很好,而且都很厉害,值得我好好学习。
关于实验室项目的问题,因为最近装修所以只是跟师兄师姐看论文,讨论交流可能再过一段时间。
总之的努力了,包括课程,项目还有英语水平。
2008年5月19日
“又是一年毕业时”,看到一批批学子离开人生的象牙塔,走上各自的工作岗位;想想自己也曾经意气风发、踌躇满志,不觉感叹万千……本文是自己工作6年的经历沉淀或者经验提炼,希望对所有的软件工程师们有所帮助,早日实现自己的人生目标。本文主要是关于软件开发人员如何提高自己的软件专业技术方面的具体建议,前面几点旨在确定大的方向,算是废话吧。
谨以此文献给那个自己为你奉献3年青春与激情的开发团队。还有团队成员:PPL、YT、YK 、TYF、LGL、CHL、CDY、CB、DPD。
1、 分享第一条经验:“学历代表过去、能力代表现在、学习力代表未来。”其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道理有些体会吧。但我相信这一点也很重要:“重要的道理明白太晚将抱憾终生!”所以放在每一条,让刚刚毕业的朋友们早点看到哈!
2、 一定要确定自己的发展方向,并为此目的制定可行的计划。不要说什么,“我刚毕业,还不知道将来可能做什么?”,“跟着感觉走,先做做看”。因为,这样的观点会通过你的潜意识去暗示你的行为无所事事、碌碌无为。一直做技术,将来成为专家级人物?向管理方向走,成为职业经理人?先熟悉行业和领域,将来自立门户?还是先在行业里面混混,过几年转行做点别的?这很重要,它将决定你近几年、十年内“做什么事情才是在做正确的事情!”。
3、 软件开发团队中,技术不是万能的,但没有技术是万万不能的!在技术型团队中,技术与人品同等重要,当然长相也比较重要哈,尤其在MM比较多的团队中。在软件项目团队中,技术水平是受人重视和尊重的重要砝码。无论你是做管理、系统分析、设计、编码,还是产品管理、测试、文档、实施、维护,多少你都要有技术基础。算我孤陋寡闻,我还真没有亲眼看到过一个外行带领一个软件开发团队成功地完成过软件开发项目,哪怕就一个,也没有看到。倒是曾经看到过一个“高学历的牛人”(非技术型)带一堆人做完过一个项目,项目交付的第二天,项目组成员扔下一句“再也受不了啦!”四分五裂、各奔东西。那个项目的“成功度”大家可想而知了。
4、 详细制定自己软件开发专业知识学习计划,并注意及时修正和调整(软件开发技术变化实在太快)。请牢记:“如果一个软件开发人员在1、2年内都没有更新过自己的知识,那么,其实他已经不再属于这个行业了。”不要告诉自己没有时间。来自时间管理领域的著名的“三八原则”告诫我们:另外的那8小时如何使用将决定你的人生成败!本人自毕业以来,平均每天实际学习时间超过2小时。
5、 书籍是人类进步的阶梯,对软件开发人员尤其如此。书籍是学习知识的最有效途径,不要过多地指望在工作中能遇到“世外高人”,并不厌其烦地教你。对于花钱买书,我个人经验是:千万别买国内那帮人出的书!我买的那些家伙出的书,!00%全部后悔了,无一本例外。更气愤的是,这些书在二手市场的地摊上都很难卖掉。“拥有书籍并不表示拥有知识;拥有知识并不表示拥有技能;拥有技能并不表示拥有文化;拥有文化并不表示拥有智慧。”只有将书本变成的自己智慧,才算是真正拥有了它。
6、 不要仅局限于对某项技术的表面使用上,哪怕你只是偶尔用一、二次。“对任何事物不究就里”是任何行业的工程师所不应该具备的素质。开发Windows应用程序,看看Windows程序的设计、加载、执行原理,分析一下PE文件格式,试试用SDK开发从头开发一个Windows应用程序;用VC++、Delphi、Java、.Net开发应用程序,花时间去研究一下MFC、VCL、J2EE、.Net它们框架设计或者源码;除了会用J2EE、JBoss、Spring、Hibernate等等优秀的开源产品或者框架,抽空看看大师们是如何抽象、分析、设计和实现那些类似问题的通用解决方案的。试着这样做做,你以后的工作将会少遇到一些让你不明就里、一头雾水的问题,因为,很多东西你“知其然且知其所以然”!
7、在一种语言上编程,但别为其束缚了思想。“代码大全”中说:“深入一门语言编程,不要浮于表面”。深入一门语言开发还远远不足,任何编程语言的存在都有其自身的理由,所以也没有哪门语言是“包治百病”的“灵丹妙药”。编程语言对开发人员解决具体问题的思路和方式的影响与束缚的例子俯拾皆是。我的经验是:用面对对象工具开发某些关键模块时,为什么不可以借鉴C、C51、汇编的模块化封装方式?用传统的桌面开发工具(目前主要有VC++、Delphi)进行系统体统结构设计时,为什么不可以参考来自Java社区的IoC、AOP设计思想,甚至借鉴像Spring、Hibernate、JBoss等等优秀的开源框架?在进行类似于实时通信、数据采集等功能的设计、实现时,为什么不可以引用来自实时系统、嵌入式系统的优秀的体系框架与模式?为什么一切都必须以个人、团队在当然开发语言上的传统或者经验来解决问题???“他山之石、可以攻玉”。
8、 养成总结与反思的习惯,并有意识地提炼日常工作成果,形成自己的个人源码库、解决某类问题的通用系统体系结构、甚至进化为框架。众所周知,对软件开发人员而言,有、无经验的一个显著区别是:无经验者完成任何任务时都从头开始,而有经验者往往通过重组自己的可复用模块、类库来解决问题(其实这个结论不应该被局限在软件开发领域、可以延伸到很多方面)。这并不是说,所有可复用的东西都必须自己实现,别人成熟的通过测试的成果也可以收集、整理、集成到自己的知识库中。但是,最好还是自己实现,这样没有知识产权、版权等问题,关键是自己实现后能真正掌握这个知识点,拥有这个技能。
9、 理论与实践并重,内外双修。工程师的内涵是:以工程师的眼光观察、分析事物和世界。一个合格的软件工程师,是真正理解了软件产品的本质及软件产品研发的思想精髓的人(个人观点、欢迎探讨)。掌握软件开发语言、应用语言工具解决工作中的具体问题、完成目标任务是软件工程师的主要工作,但从软件工程师这个角度来看,这只是外在的东西,并非重要的、本质的工作。学习、掌握软件产品开发理论知识、软件开发方法论,并在实践中理解、应用软件产品的分析、设计、实现思想来解决具体的软件产品研发问题,才是真正的软件工程师的工作。站在成熟理论与可靠方法论的高度思考、分析、解决问题,并在具体实践中验证和修正这些思想与方式,最终形成自己的理论体系和实用方法论。
10、心态有多开放,视野就有多开阔。不要抱着自己的技术和成果,等到它们都已经过时变成垃圾了,才拿出来丢人现眼。请及时发布自己的研究成果:开发的产品、有创意的设计或代码,公布出来让大家交流或者使用,你的成果才有进化和升华的机会。想想自己2000年间开发的那些Windows系统工具,5、6年之后的今天,还是那个样子,今天流行的好多Windows系统工具都比自己的晚,但进化得很好,且有那么多用户在使用。并且,不要保守自己的技术和思想,尽可能地与人交流与分享,或者传授给开发团队的成员。“与人交换苹果之后,每个人还是只有一个苹果;但交换思想之后,每个人都拥有两种思想”,道理大家都懂,但有多少人真正能做到呢?
11、尽量参加开源项目的开发、或者与朋友共同研制一些自己的产品,千万不要因为没有钱赚而不做。网络早已不再只是“虚拟世界”,网上有很多的开源项目、合作开发项目、外包项目,这都是涉猎工作以外的知识的绝好机会,并且能够结识更广的人缘。不要因为工作是做ERP,就不去学习和了解嵌入式、实时、通信、网络等方面的技术,反过来也是一样。如果当他别人拿着合同找你合作,你却这也不会,那也不熟时,你将后悔莫及。
12、书到用时方恨少,不要将自己的知识面仅仅局限于技术方面。诺贝尔经济学奖得主西蒙教授的研究结果表明: “对于一个有一定基础的人来说,他只要真正肯下功夫,在6个月内就可以掌握任何一门学问。”教育心理学界为感谢西蒙教授的研究成果,故命名为西蒙学习法。可见,掌握一门陌生的学问远远没有想想的那么高难、深奥。多方吸取、广泛涉猎。极力夯实自己的影响圈、尽量扩大自己的关注圈。财务、经济、税务、管理等等知识,有空花时间看看,韬光养晦、未雨绸缪。
13、本文的总结与反思:
A:不要去做技术上的高手,除非你的目标如此。虽然本文是关于提高软件开发知识的建议,做技术的高手是我一向都不赞同的。你可以提高自己的专业知识,但能胜任工作即止。
B:提高软件知识和技术只是问题的表面,本质是要提高自己认识问题、分析问题、解决问题的思想高度。软件专业知识的很多方法和原理,可以很容易地延伸、应用到生活的其它方面。
C:在能胜任工作的基础上,立即去涉猎其它领域的专业知识,丰富自己的知识体系、提高自己的综合素质,尤其是那些目标不在技术方面的朋友
我们都知道21世纪最有价值的是人才,是什么人才呢,就是我今天要演讲的题目。我想我这个演讲有一个很大的假设就是21世纪需要的人才与20世纪、19世纪有着很大的差别,因为21世纪有几个很重大的革命发生。在21世纪我们更多的工作是靠我们脑力的创造,是靠平等的竞争,已经没有国界的差别,世界被铲为平地,任何一个国家的人都可以和另外一个国家的人合作或者竞争,而他们都可以接触到、使用到、共享到同样的信息。不像过去,谁能独占信息他就能对另一个人或者对那个公司发挥相当大的价值。
今天的信息是因为共享才能发挥它真正的潜力。所以在这样的情况下,每个人都可以自由地选择,平等地竞争,他们会积极地去获取自己的信息,追求自己的兴趣。他们期望自己工作的公司采取的不再是控制式的管理,而是放权式的管理。因为在21世纪,一个人他是靠自己的脑力创造财富,他很聪明很有创意,他跟全世界每一个人平等地竞争,然后每一个人都有同样的信息,没有一个人会愿意在一个不公平的控制下做一个公司的齿轮。每个人都会希望发挥自己的潜能,他希望自己到一个公司工作,这个公司能够放权地让每一个员工做自己的事情。还有呢,21世纪什么都改变得非常快。你才认为说某某一个技术或者某某一个公司是很火热的,忽然一个新的技术或者一个新的公司已经出来了。这都是因为互联网,每个国家,每个领域之间的边界因此在不断地消除,世界各地的人们可以一起工作,竞争和合作。所以在这样的一个环境之下,21世纪需要的不再是19、20世纪听话,没有自己意见,努力有毅力的所谓的蓝领或者白领工人,更需要的是我的演讲要谈到的7种人。
1.创新实践者——What matters is not innovation , but useful innovation。
这7种人中的第1种是创新实践者。在今天谈到的所有人时,我都会引用一句我认为很好的话。那么第一句话是谁说得呢,是我说的。这句话跟创新有关,待会还会谈到。我想说的是在21世纪真正有价值的人是能够创新的人。他不是一个只会使用别人的方法做事情的人,他不是那种只会听话做事情的一颗棋子,一个齿轮。因为,在如今的竞争之下,一个公司唯一可以延续的竞争优势就是它的创新。任何东西都可以很容易地被模仿,只有创新很难被模仿。而创新一旦被模仿,你唯一的办法就是继续地创新。所以一批有生命力的能够持续创新的员工是唯一能够带给企业持续竞争力的财富。
你们可能会说,李开复是不是要讲Google,讲其他科技公司要学计算机科学,要做最高深的研究这才是创新呢?其实不是的。在每一个领域都可以创新,也就是这些每一个不同领域的创新,让每一个工作变得多彩多姿。我可以举个例子。如果你在美国加州101公路硅谷段上开车,你可能会看到一个广告牌。整个广告牌上面没有公司名也没有任何广告词,只简简单单刷着“(在‘e’的数列中所能找到的第一个十位数质数).com”。很多在硅谷工作的聪明人开车看到了这个广告,他们回家就会去算,有些用计算机来算,有些用数学方法来推算,算出来答案以后登陆这个网站一看,发现另外有一个更难的题目。然后他们再做了这道题目,又会到达另外一个网站,就着样做了一个题目又一个题目,最后他们发现自己到了一个很特殊的网站,这个网站就是Google的招聘网站。我们可以从这个例子看到,在Google这样一个创新的公司,它的创新其实远远不止在于一个工程部门。你可以看到招聘,市场都是充满了创意的。
关于创新还有一点要注意的,21世纪的创新必须实时、实践。因为我们有了互联网的存在,每个公司的步伐都非常快。如果你花很多的时候去做一些验证,一些用户调查,再花一两年的时间才把一个东西编出来再做测试,一个产品四五年做出来以后很可能已经过时了。所以在这21世纪,光做一个创新者是不够的,要做一个创新实践者。这就回答了我上面那句话:What matters is not innovation, but useful innovation。只是为了创新而创新是没有意义的,要做有用的创新才是有意义的。
记得我在SCI公司的时候,曾经犯过的一个最大的错误就是只想到创新,没有想到实践。我们做了一个非常酷的三维浏览器,今天可能都还没有人在使用。当时,我们每次演示的时候,观众的下巴都会掉下来,说:哇,怎么会做这么酷的一个东西!但是我们忘记了这么酷的东西却是没有市场的。最后结果是相当的失败,让我也有了一个很惨痛的经验,尤其是当我看到一百多名员工失去他们工作的时候,让我下了一个决心,就是上面这句话。
我们虽然要创新,但是不是为了创新而创新,而是为了做有用的事情而创新。我们如果回顾历史,可以看到许多成功的人才,他们有些创新,有些实践,有些左脑发达,有些右脑发达。但是那些真正对世界有重大贡献的人,我想他们不仅是创新者,也是实践者,比如说爱迪生,比尔盖茨,Larry 和Sergey,都是很好的例子。一个真正的创新实践者每一次在创新的时候都忘不了实践,在实践的时候也忘不了创新,这样的人,我想是21世纪不可缺少的人才。
2.跨领域合成者——What matters is not analysis but synthesis。
第2点呢,我想非常需要的是跨领域合成者。刚才听到了竺可桢学院,它本身是多学科的,强化班也是由来自不同专业的同学组成的。这点确实也是非常符合了所谓的合成者。相信在中国的未来,在全世界的未来,我们更需要的人才不只是那些把一个学科学得非常非常深的,而是那些把自己学科学好,同时能够与其他领域做一个跨领域结合的人才。原因其实非常简单,如果是世界上有1000种知识,这个知识本身你可以学得很深,但是两个人的知识通过交叉碰撞又可以产生新的知识,三个人的碰撞就能产生十亿个组合。
以计算机为例,如果你是学计算机的,又对心理学感兴趣,这样一个跨学科的合成,你可能对用户界面或者可用度测试会有一些贡献。所以,很多新的领域的产生,都是靠过去的两种学科所交叉碰撞出来的,这是一个很好的机会。如果把一门学科学得太深了,可能会去钻牛角尖,反而失去创新实践的机会。真正重要的不是analysis,不是要分析得很深,而是synthesis,怎么样有合成的机会。
所以,对各位同学我的建议就是,当然读好你的专业是有必要的,但是同时要考虑下是否还有别的什么专业是你有兴趣的。这两个专业最新的思想能不能结合起来,做一些即有创意又可以实践的东西,这可能是最有成长空间的一些机会。
3.高情商合作者——EQ is 9 times more important than IQ。
第3种最需要的人是高情商合作者。EQ is 9 times more important than IQ,这句话来自Daniel Goleman的《EQ》这本书。《EQ》这本书谈到情商和智商的一些差别,还有哪个比较重要。他做了一个研究,找了几千个企业的领导者。他研究是什么因素让这些非常优秀的领导者和普通的领导者有所区别。他研究的结论最重要的差别不在于IQ,而是比IQ要更重要9倍的EQ,即情商。
情商包括了怎样与人合作,包括了对自己的一种自觉,包括了对自己的一种管理,也包括了和别人团结合作以及社交的一些能力。EQ的重要性在21世纪是非常显著的,因为在21世纪,我们需要全球的合作,需要跨领域的合成。比如说你学的是心理学,你要跟学计算机的人合作才能做得出用户界面。跨领域的合作,跨国度的合作,跨语言的合作,这些都是必须要的。所以,过去也许在很多的环境里面,你作为一个孤僻自傲的天才会得到很大的重视,但是这个情况现在已经在大大地改变了。
过去,我曾在我的人才观里提到,在这个信息社会里,与过去的工业社会很大的一个差别就是信息社会最好的一个人才,一个程序员、一个科学家,可能比普通人生产力好个3倍、5倍、10倍或者20倍甚至更多。但是我想在这里补充的一句话就是说,即使他在技术方面好个多少倍,如果他是一个孤僻自傲、不能合作,甚至引起团队无法工作的人,那么他对这个团队,反而是一个负面的效果。
当我们做管理的时候,我们也必须考虑到,如果你要建立一个非常健康的团队,不管是在Google工作还是未来的Google Camp,一定要在每个人很客观高情商地愿意与他人合作,尊敬别人的前提之下,才可能有很好的结果,尤其是在21世纪这样一个情商和合作是那么重要的世纪里面。所以,我对各位同学的建议是,在你可以抓住的每一个机会里,多参与社团工作,多建立一些与人合作的基础,无论是在上课,还是参与社团项目,或是暑期工作的机会。让自己除了读书之外,多做一个能够与人团结、合作、客观、尊敬别人、聆听别人的一个高情商的学生。
4.高效能沟通者——The man who can think and does not know how to express what he thinks is at the level of him who cannot think。
第4种人是高效能的沟通者。一个人如果有思想但是不能表达自己,他其实就是一个没有思想的人,这句话其实相当的有道理。我想在座很多理工科的同学以前可能认为只要有思想就够了,不过这句话告诉我们你只有思想不能沟通,其实你是没有思想的。这句话其实并没有夸张,在21世纪全世界都是信息的前提下,很好的信息传播渠道还是经过人。人怎么传播信息的,靠沟通。一个人他的沟通能力很好,他可以把一个很难懂的信息很好地传播给别人。一个人沟通能力很差,他就无法传播信息,因此别人可能看不起他,认为他没有思想。所以沟通能力是非常需要学习的。
这种沟通的能力怎么得到呢,我可以给同学们几个很好的建议。你沟通的时候一定要理解你的听众,你要知道你的听众在想什么,听众从你的讲话中能得到什么好处,即What’s in it for you。还有要注意说话的方式,不要用说教,而应该采取引导的方式。当你与别人沟通的时候,你要先想好你主要要传达的Message是什么,用听众能够接受的方式表达出来。
5.热爱工作者——If you find a job you love , you will never work a day in your life。
第5种非常需要的人才是热爱工作者。因为在全球被铲平之后,每一个人都是平等的。如果你能够做一个工作是你非常热爱的,那么你可能在睡觉、洗澡、吃饭时都在想你的工作。你可能就会更有热情去做你的工作。你不认为你的工作是一个枯燥的事情,而是可以享受的事情。所有就有这么一句话,有一天有个美国朋友到我的办公室来说你们的孔夫子实在是太聪明了。我说怎么回事呢。他说你看他讲的这句话多有道理啊:If you find a job you love, you will never work a day in your life。我就跟他说谢谢你夸奖我们的孔夫子,不过我实在想不起来孔夫子说了这句话。
后来当天开车回家的时候我才想到可能是“知之者不如好之者,好之者不如乐之者”这句话。但是今天看起来,我认为可能这句英文的翻译还更贴切一些,在21世纪更能够被更多的人理解。因为如果你真的很爱你的工作,你就不是在工作了,你是在享受了。如果你是在享受的话,你一定会有更多的热情投入,更多的时间投入,更乐意去做更多的工作。到了星期五可能不想回家,到了星期天可能就想来上班了。那么你想比别人做得差可能都很困难。
我们能看到的是,如果你能找到你的最爱,你的一生都会过得比较快乐。所以各位同学,如果你们还没找到你们的最爱,我的建议是保持一颗好奇的心,多去尝试不同的事情。然后要理解你的专业和你的工作不见得是完全一样的。要多做咨询,了解有什么样的公司,什么样的环境,什么样的工作你毕业后可以从中选择。如果你在一个你喜欢的专业里面呢,珍惜它,好好地去找一份未来相应的工作。如果是在一个可以选择的十字路口,比如说考研,出国等等,这个时候你要好好地去选一个你真正喜欢的专业,而且也许把刚才谈到的跨领域合作的概念借鉴过来。并不是说我过去学的是一个不喜欢的专业,我就要从文科转到理科。也许你可以找到一个更好的跨越的台阶。如果你不喜欢你的专业呢,你也可以在这个专业里面尽量找一个大专业里面的小专业,也许是你比较喜欢的;或者你可以在一个你认为你比较喜欢的专业和你现在不喜欢的专业之间的交叉学科找一些机会。所以不管怎么样,最后能够找到你爱的事情,你就能发挥你的潜力,成为21世纪需要的热爱工作者。
6.积极主动者——In a few hundred years , the most important event those historians will see is that for the first time , people will have a choice. They will have to manage themselves。
第6种是积极主动者。这句话是Peter Drucker所说的。他说几百年之后,历史学家回顾今天,他们会说这个世纪里最重要的事情,不是互联网,而是人有了选择。有了选择就要积极主动,然后需要管理自己。这是最重要的一点,这也就是我们从工业社会转变到现在的信息社会所发生的最重要的事情。一个积极主动者他对自己的一切一定要负责,因为如果你自己不在乎,没有别人会比你更在乎,没有人会比你更知道你想做什么。在来到大学之前,一切都是消极,由父母来决定的。进入大学之后,要开始对自己的一切负责。不去解决也是一种解决,不做决定其实也是一种决定,这个决定就是让自己走入一个消极而不是积极的方向。
在我出书的时候许多人喜欢让我把他们的座右铭写在书上,当我有时间的时候我也会尽量配合,但是有一句话我绝对是不写的,这句话就是沉默是金。因为在今天的环境里面,每个人需要合适地推销自己,让别人知道你的成果。因为如果你不表达,那其实别人就会认为你没有思想。当然,在适当的环境里,你才能做适当的表达,并不是要你抢别人的机会,也不是要你过分地做一个出头鸟。但是,如果你有一些想法有一些思想一定要表达出来。
在这个21世纪里,每个人都有想法,都有信息。那些最有信息或者最有想法的人可能会得到很多或者更多的注意。比如说在这次成立Google Camp的时候,工作人员有一天来找我说我们这个Google Camp有一些想法你觉得怎么样?当时我记得非常清楚的就是我在全国20多个高校做巡回演讲的时候在那些学校见到了一些非常积极主动的同学。我就跟他说,你去下面四个学校见见曾经主持我办的活动的同学吧,因为我认为他们是积极主动的,是符合Google Camp的精神的。我认为他们会给你很多想法,也许他们会成为我们的Google Camp的骨干。所以,如果你们在想,怎么挑到这四个学校的呢,很大的原因就是当时我做巡回演讲的时候这是四个让我感触最深最积极主动的学校,最优秀的同学。所以这是一个活生生的今天在Google Camp成立的时候发生的例子。
我们可以看到正是因为当时有这么一批积极主动的同学让我们今天有机会在浙大成立这个Google Camp。积极主动者,他并不只是积极地等待机会,他还需要积极地把握机会,为自己创造机会。这点可能是中国的学生,中国的员工最需要常常提醒自己的地方。前一阵我们在中国差不多招了三十多个员工,工作了三四个月。有一天我们在聚会,他们就问我说:开复,你对我们这三十个刚开始的关门弟子有什么建议没有。我的回答是:从技术方面,从对公司的理想、价值观认同以及努力方面,我都非常非常的满意。但是,如果要讲一点我希望你们未来可以做的更好的,我希望你们未来能够更加积极主动,要提出你们的想法。
7.乐观向上者——The glass is half full or half empty depending on whether you’re pouring in or out
最后我想讲的是乐观向上者。这句话来自美国的一个喜剧演员Bill Cosby,他是这么说的,我们常说一杯水是一半满的还是一半空的,其实要看你是继续把水注进杯子里,还是把水从杯子里面倒出去。如果你在继续注水的话,你会期望着水位上升;如果你在倒水的话,你会想到很快杯子就会空掉了。其实这告诉我们的是一个人的思想,是一个乐观的人,还是一个悲观的人。如果你是一个乐观向上的人,你会总告诉自己未来会更好。台湾有位企业家叫做张忠谋,他是台基电的董事长,他最近写了一篇文章,我觉得里面有些很有哲理的话。他有个朋友请他提几个字挂在墙上。然后张忠谋就跟他说,我的字写得不好,但是我随便帮你写几个字,然后他就写了“常想一二”这四个字。他朋友说什么叫“常想一二”呢。然后张忠谋就告诉他说,你没有听过吗?我们都说人生不如意之事十有八九,我要告诉你常想那剩下那一二比较如意的事情。他说他从小就看了很多大人物的传记,他发现了一个规律,凡是成功者都是受苦受难的。然后他们的生命几乎就是人生不如意事十有八九的真实写照。但是他发现这些人之所以能够成功,就是因为他们保持了正面的思考,通过“常想一二”,他们能够超越苦难。苦难对他们来说反而成了生命中最好的养料,为他们未来的成功做了良好的铺垫。
所以这些成功者在面对苦难时的坚持、乐观和勇气是最重要的。人生的如意或不如意,更重要的不是取决于人生的际遇而是思想的瞬间。所以,人生的真正品质取决于你有没有“常想一二”这种乐观的思维方式,观点反而比这个事实更重要。这是他很有哲理的一篇文章,我想你用Google可以搜索得到。
其实在21世纪,还有很多其他的理由要做一个乐观向上的人。因为21世纪是一个更实时善变的环境,我们尝试的事情会碰到很多很多的失败。我们都听到说Google很酷,有一个20%的Project,每一个人都有20%的时间做自己想做的事情。但是,如果我们做一个统计,我想一定会发现,这个20%自己想做的Project绝大多数一定是失败的。如果你没有一个良好的心态,不能客观地说我学到了一个Lesson有助于我做下一个项目时,那你很快就会处于一个非常沮丧的心态。所以Google公司不但不惩罚失败,还鼓励每个人客观地从失败中爬起来。我们要有一种心态,要认为挫折不是一种惩罚,而是一个学习的机会。
当我回顾我一生的职业生涯,我想我学到最多的绝对不是来源于我的成功。反而是我在读博士的时候被评为最坏的老师,在一个公司做了一个很酷的技术却没有用,导致公司被卖掉、员工失业等等失败的经历让我学到了很多,超过了我在语音识别或者其他领域所取得的成就。所以一定要把握每一个失败的时候,让自己过渡好每一个痛苦的时期。然后要能有正面的思想,要站起来,要正视自己的错误,能够从错误中学习。
最后我做一个总结:在21世纪里面,我们需要认真读书的同学,但是我们更需要创新实践的人才。我们需要每一科的专才,但是我们更需要跨领域合成者。我们需要高智商的人,但是更需要高情商的人。我们需要每一个学生能够高效能地理解,但是未来你们更需要高效能地沟通。
毕业后,当然要找一个热门的工作,但是更重要的是你要热爱你的工作。不要再继续做一个只会被动听话的学生,而要做一个积极主动的学生。不要只是做一个小心翼翼的人,而要做一个乐观向上的人。
2008年5月11日
一、Matlab与VC混合编程的实现方法
Matlab作为控制系统设计的一种通用工具,它可以和VC方便的进行连接。一般而言,Matlab与VC混合编程的实现方法主要有以下三种方法:(1)通过引擎(Engine),采用客户机服务器的计算模式,通过Window的ActiveX通道和Matlab进行连接。具体应用时,往往在VC中设计程序框架,以编译的程序作为前端客户机;通过调用Matlab引擎在后台实现与服务器的连接,实现动态通信(2)应用Matlab数学函数库,Matlab中包含了内容丰富的函数库,而且还提供了与VC的数学函数接口,用户可以方便的在VC的IDE(集成开发环境)中调用。(3)通过DLL实现VC与Matlab的混合编程。DLL是一个可执行的二进制文件。把很多通用的功能放在DLL中,可以供多个应用程序调用,这样可以很好的减少外部存储空间的占有量,并实现代码的共享[2]。在上述三种方法中,第一种方法对调用Matlab的工具箱很实用,所有在进行控制系统的设计和分析时,一般都是通过调用Matlab引擎(Engine)来实现的。本文主要介绍采用通过引擎(Engine)来实现VC与Matlab的混合编程。
二、配置编译器
要在VC中成功编译Matlab引擎程序,必须包含引擎头文件engine.h并引入Matlab对应的库文件libmx.lib、libmat.lib、libeng.lib。具体的说,打开一个工程后,做如下设置(以VC6为例):
1) 通过菜单工程/选项,打开设置属性页,进入Directories页面,在目录下拉列表框中选择Include files,添加路径:"C:\matlab\extern\include"(假定matlab安装在C:\matlab目录)。
2) 选择Library files,添加路径:C:\matlab\extern\lib\win32\microsoft\msvc60。
3) 通过菜单工程/设置,打开工程设置属性页,进入Link页面,在Object/library modules编辑框中,添加文件名libmx.lib libmat.lib libeng.lib。
以上步骤1)、2)只需设置一次,而步骤3)对每个工程都要单独设定,对于其它C++编译器如Borland C++ builder,设置大体相同,不再赘述。
三、编程实例
#include "engine.h"//matlab引擎"
double *coeff;
double delt[9];
delt[0] = log(1);
delt[1] = log(sqrt(2));
delt[2] = log(2);
delt[3] = log(sqrt(5));
delt[4] = log(sqrt(8));
delt[5] = log(3);
delt[6] = log(sqrt(10));
delt[7] = log(sqrt(13));
delt[8] = log(sqrt(18));
Engine *ep; //定义Matlab引擎指针。
if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功。
{
MessageBox(NULL,"Engine message","Can't start Matlab engine!",MB_OK);
exit(1);
}
mxArray *x=NULL;//Matlab引擎中用的是mxArray型的数据
x = mxCreateDoubleMatrix(1,9,mxREAL);
memcpy((char*)mxGetPr(x),(char*)delt,9*sizeof(double));
engPutVariable(ep,"x",x);
mxArray *y=NULL;
y = mxCreateDoubleMatrix(1,9,mxREAL);
mxArray *result=NULL;
result = mxCreateDoubleMatrix(1,2,mxREAL);
//例一
mxArray *X=NULL;//Matlab引擎中用的是mxArray型的数据
X = mxCreateDoubleMatrix(1,9,mxREAL);//生成矩阵传递参数给matlab
memcpy((char*)mxGetPr(X),(char*)test,9*sizeof(double));
engPutVariable(ep,"X",X);//向matlab引擎参数
engEvalString(ep,"T=5*X;");//向matlab引擎发送命令
engEvalString(ep,"plot(X,T);");
//例二
…………
memcpy((char*)mxGetPr(y),(char*)Var,9*sizeof(double));//Var的值是有段程序计算的,未写出
engPutVariable(ep,"y",y);
engEvalString(ep,"p=polyfit(x,y,1);");
result = engGetVariable(ep,"p");//从matlab引擎里取数据
coeff = (double *)mxGetData(result);
H[i][j] = coeff[0];
//释放这些矩阵
mxDestroyArray(y);
mxDestroyArray(result);
mxDestroyArray(x);
engClose(ep); //关闭Matlab引擎
………………
错误问题:
关键问题在于matlab的版本上,要看这样一句错误提示:
F:\chen101903\chen101903Dlg.cpp(205) : error C2065: 'mxSetName_is_obsolete' : undeclared identifier
如果你到matrix.h中看mxSetName的声明会发现有这样一句
#ifndef matrix_h //判断是不是和V5兼容
#define V5_COMPT
#define matrix_h
.........................
#else
#define mxSetName mxSetName_is_obsolete//走这个预处理分枝就等于没有声明mxSetName()了
#endif
于是matrix.h里就相当于根本没有定义mxSetName这个东西.你只需要在
#include "matrix.h"
之前加一句
#define V5_COMPT 就可以了
形式如下:
#ifndef matrix_h
#define V5_COMPT
#define matrix_h
2008年5月10日
实际上VC与matlab的接口实现方法有很多种,matcom只是其中一种,本文再介绍一种比较容易实现的方法:COM接口方法。COM(Compponent Object Model组件对象模型)是一项比较复杂的技术,详细讲的话几本书也讲不完,所以在这里不作介绍,本文通过一个例子详细介绍如何在matlab下做COM组件,以及如何在VC中调用COM组件。
首先在Matlab编辑器里编辑m函数文件:启动matlab->File->New->M-file 函数内容如图1:该函数无输入输出参数,文件保存为huatu.m。
图1 m函数huatu.m
在matlab下建立COM组件,步骤如下:
1、在matlab command window 输入如下命令:
>> comtool
出现com编辑界面,如图2:
图2 com组件编辑界面
2、新建工程:File->New Project…,如图3。
图2 com组件属性设置
3、设置组件属性,在"Component name"项中填写组件名称"component",这时候会自动生成类"component",在"Class name"项中填写类名称"huatu",如图4,
图4 com组件属性设置1
为了便于区分,选中"Classes"中的"component",点击“remove”按钮,将类component移除,再点击"Add>>"添加新类huatu,结果如图5。点击"OK",接下来出现一个对话框,选择"Yes".
图5 com组件属性设置2
4. 添加文件:选中左边工作区的"huatu",点击Project->Add File…,选择已经编辑好的函数文件huatu.m,如图6。需要注意的是m文件必须是m函数,否则会报错,如果是m脚本文件的话,只需要改为无输入输出参数的m函数即可。
图6 添加m文件
5、生成 com组件:点击Build->COM Object…,结果如图7。
图7
com组件已经由matlab做好,默认的保存位置为:matlab安装位置\work\component。
VC中调用COM组件,步骤如下:
1、在VC中建立名为ComHuaTu的基于对话框的MFC(exe)。
2、面板上添加一个名为“画图”的button按钮,如图8。
图7 工程界面
3、将component_idl.h 和component_idl_i.c文件拷贝到VC建立的工程ComHuaTu目录下。两文件默认目录为
\work\component\src
4、将上面两文件加入工程:工程->添加工程->Files,选择刚刚拷到目录下的component_idl.h 和component_idl_i.c文件。
5、将目录/extern/include/下的mwcomtypes.h拷贝到工程ComHuaTu目录下,并加入到工程中,方法同上。
6、为程序添加头文件component_idl.h 、component_idl_i.c和mwcomtypes.h,结果如图9
图9 添加头文件
7、按钮画图函数添加代码:
图10 添加按钮函数代码
函数代码的意义涉及到COM,正在写VC调用COM组件所涉及到的有关COM方面的知识。
8、设置预编译头文件:工程->设置(快捷键Alt+F7),选择C/C++项precomplied Headers,设置如图11
图11 预编译头文件设置
9、编译、连接、运行,结果如图12。
图11 运行结果
可以看出利用VC调用com组件的方式来调用matlab比较简单,而且几乎支持matlab所有的函数,在m文件较大、用matcom、调用math library或使用mcc方式无法实现的时候,推荐使用。需要说明的是,以上程序拷到另一台机器上是无法直接运行的,因为COM组件没有新机器上注册,如果要在另一台机器上使用的话,还需要打包安装COM组件,并且由于本程序代码很简单,所以也就不提供源程序了,自己可以动手做一下。
本人正在写一本关于VC和matlab接口方面的书,估计年底完稿,详细介绍VC和matlab接口的几种方法,并提供详细的例子,例子都是我自己写过的,欢迎大家提供些好的意见和建议。
我的QQ:44760299,
邮箱:c_dinco@sina.com。
以下是我遇到的错误及解决方法:
错误:
component_idl_i.obj : error LNK2005: _CLSID_huatu already defined in ComHuaTDlg.obj
component_idl_i.obj : error LNK2005: _LIBID_component already defined in ComHuaTDlg.obj
component_idl_i.obj : error LNK2005: _IID_Ihuatu already defined in ComHuaTDlg.obj
Debug/ComHuaT.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.
ComHuaT.exe - 4 error(s), 0 warning(s)
解决方法:ComHuaTuDlg.cpp中将 #include "component_idl_i.c" 注释掉就可以了
即//#include "component_idl_i.c"
2008年4月27日
3D人体洞穴”医疗新突破
近日世界著名的虚拟技术研究机构加拿大卡尔加里大学的科学家们把洞穴虚拟现实系统(cave automated virtual environment)应用于医学研究获得初步成功,成功制造出了第一个数字模拟人体,这将极大的发展数字虚拟技术在医学临床领域的应用和发展。
科学家们在一个黑暗的被称为洞穴( 洞穴虚拟现实系统cave automated virtual environment)的房间里,通过数字虚拟成像技术成功制造出了是一个比真人还大的虚拟病人——洞穴人(caveman)。
洞穴人(caveman)目前是世界上最先进的数字模型人体,经过长时间的研究卡尔加里大学的科学家和图形艺术家成功的将虚拟现实技术应用到了医学临床领域。这个数字模型人体可以作为医学解剖的标本和模型,它能够清楚地将病人的每一个器官,骨骼,神经和生物系统详细的显示,甚至可以模拟病人的动态行为。
在“洞穴”的地板和墙壁上,投影机全方位的展示了虚拟病人的全部内容,甚至可以将虚拟病人的神经组织和生物系统进行10倍的放大。科学家认为数字模型人体目前可以作为医生的训练工具,但最主要的作用在于通过从磁共振成像扫描来真实的反映病人身体的实际数据和图像,帮助医生对病人的实际情况作出准确的诊断。
卡尔加里大学的科学家们打算下一步将在系统中加入触觉反馈传感器,使洞穴人(caveman)模拟动态的过程,如呼吸和血液流动,使医生可以在治疗前后,对病人的状况作出准确的判断和预测。
21世纪对人类发展必不可少的4大主题:可持续发展、卫生、减少脆弱性以及生活愉悦。委员会决定不为这些技术挑战项目进行排名,挑战项目名单包括:增强虚拟现实、生产可负担得起的太阳能、以核聚变提供能源、开发碳隔离技术、管理氮循环、全球都可用到洁净水、恢复和改善城市基础设施、推进医疗信息学、研制更好的药物、人脑逆向工程、防止核恐怖行动、确保网络空间安全、推进个性化学习以及发展科学发现工具。