部队安全形势分析报告:一切为了快乐 -- 编程爱好者博客

来源:百度文库 编辑:九乡新闻网 时间:2024/04/24 13:28:30
三朝元老经验(转,(2006-2-1 21:54:00)
三朝元老经验(转,推荐)
点击数:3316    发布日期:2005-11-25 1:47:00
【评论】【打印】【收藏此页到365Key】
Tag:程序人生
这篇文章本来已经整理好了,结果不巧这里的blog出问题了,现在就没那么详细的整理了。整篇文章并非全部作者原创,比较多的更早以前的师兄师姐写的经验,还有一些是网上的热心读者的作品。黑体的部分是我的说明或者为了突出重点而设置的。
引言:这个是作者作最后的总结。
软微学院生涯(大结局篇)----三朝元老经验谈终结版
最近工作比较忙,实在没时间,最后要说点什么呢?好象已经该说的都说得差不多了,人生规划还是要及早做来,我看到我们BBS上有一个这方面的文档,大家可以看一下http://bbs.ss.pku.edu.cn/cgi-bin/topic.cgi?forum=143&topic=75&show=0 (内部论坛外网可能看不了)
希望大家都能够早日成为这种有独立思考和判断能力的人.
终极版写点什么好呢?就写点我个人和我听到其他软微学院老生的悲惨经历,希望大家看清楚前面的路.其实也不一定算是弯路了,条条大道通罗马,也许有了这些经历后也会闯出一片更好的天地也说不定,但愿给大家带来点启示就好了.李敖前几天在清华演讲说到,现代人挺可怜,通过电脑和网络可以获得太多的知识,但如何分析判断这些知识的价值和如何使用
却很让人头痛,所以我会尽量举些不同的例子,希望大家自己好好分析判断.
首先说说一年理论学习与实习的关系,以及对未来的作用.我们学院比较有特色的就是学习期间就比较重视与实际工作的不脱节,大家在上课时会模拟一些项目,会成立小组做项目,基本上和实际工作中的环境相似.所以我们在一年中要认真的对待这些项目,将来实习时很有可能会因为你这个项目做得好与实习项目相关而被实习公司相中.已经实习和正在找实习单位的同学都有这样的体会,实习单位面试时一般会问你做过和这些项目,以及你在项目中的角色和体会.你至少要有一二个非常典型代表你实力的项目写在简历里,因为面试时先是看你技术功底,如果你把这二个项目讲得很透,人家就会开始问你体会和对工作的看法,这就是看你的人格魅力了,主要靠你的性格和人品了.因为一个好的实习单位其实就是来招新人的,他们会培养你一年,如果你性格和人品非常令他们相信,他们才会花时间和金钱培养你,这样你直接就有了就业的机会.但我发现许多同学直到实习时也没想清楚到底要找个什么样的实习单位,投简历就是来一个投一个,没什么原则.写的简历一看你也看不出来他将来到底想做什么,你自己都不知道想做什么,用人单位怎么敢用你?当然,如果是什么比较强的牛人可能会不太一样,但牛归牛,除非碰到能欣赏并且敢欣赏这种牛人的单位才行.因为现在有许多单位不喜欢清华北大的学生,就是有些牛人太牛了,做工作不踏实,高兴干就干,不高兴就走,没有团队精神,单打独干没有配合意识,不服从管理无法融合到企业文化中去.所以大家应该在一年的学习期间注意这些问题,要打好技术基础,也要想一想企业真正需要的是什么样的人才,为什么需要这样的人.一年在校有计划有目标有针对性的学习,找一个较适合的实习单位,在实习期间进一步理论联系实际,多学我实践,相信将来一定会找到一个理想的工作的.
找实习单位其实是个很有意思的事,现在我们学院学生越来越多,实习单位要求也越来越高,所以大家还是提早准备.这个机会其实还是很多的,包括我有一个同学在北大高科实习的,他的实习单位竟然是他在公共汽车上找到的.他跟我说他本来亲戚朋友帮他找了中科院下面的一个研究所去实习,但有一天他在公共汽车上碰到北大高科一个项目经理,结果聊聊天就让他去北大高科实习了.还有的同学是因为在参加某些展会时认识了IT企业的朋友,然后大家谈得来就有可能帮你找到一个不错的实习单位.还有就是平时和在职生上课时,多和他们沟通交流,一方面学习企业真正需要的知识是什么,一方面也是为了将来让人家帮你介绍一个实习机会啦,而且就算他介绍不了去他所在的公司,没准别的你想去实习的公司的人和他熟,到时候找实习单位,介绍一下,谁不顺水推舟给个人情呀?
一般来说,本科基础不是特别好的,选择嵌入式和网络通讯方向时要谨慎,要想到将来去面试时,人家会对你要求更高一些.所以如果你要是真的感兴趣,那么选了之后就要拼命的学习了,一定要做出一二个特别棒的项目,这样在一年后实习面试时才能让考官相信你.电子服务和软件开发相对来说可能难度要小一点,入门会容易些,而且市场前景大,就业机会多,建议在校期间考个JAVA和ORACLE的认证,这样找实习单位或者工作都比较有底.
前面说得都是经验性的东东,但是大家不要忘记前提是你要达到实习公司要求的技术基础底线,如果达不到,那实习公司要了你去人家完不成任务也不行啊.所以这一年一定要好好学习,努力实践,我想多数人都是基础一般,不好不坏的多吧,赶快给自己一个目标,然后精通一样将来对你找实习单位非常关键的技术,别的技术你可以去一般性了解,因为IT业涉及面太广了,我觉得大家一定要有一个专的地方,别的了解越多当然越好,但是必须要有一个让你找到实习单位和工作的技术做保证.
平时做作业和做项目问题,许多同学包括我自己,做作业和项目时不是很认真,有时候懒着写就参考别人的,自己不动脑.这是很不好的习惯,实习一年了,发现许多以前不认真不动脑做的作业和项目,收获不多,而且现实中想用时又无法应用,特别后悔当时为什么不好好做一下这个作业和项目呢!大家一定要尽最大努力去自己完成自己的作业和项目分配的任务,这样才会有所收获,才会在实习时更有感觉.有些同学在实习中遇到在以前做项目时遇到过的同类问题,很容易解决了,而且还可以帮助所在的实习公司做更多事,实习单位怎么会不重用这样的人呢?
还有,我不建议大家去自己不喜欢的实习单位,我们这届有一些去的实习单位不理想,实习结束觉得学到什么东西,然后去找工作又无法找到理想的工作单位,实习经验基本上无用,这样就带来了许多麻烦.所以请大家切记,学习和实习是紧密联系在一起的,这些又与你将来就业联系在一起的,一定要提早计划好.
最后再说一下不爱写代码,不想干程序员的怎么办?我其实就是这样的人,现在做技术支持,叫现场应用工程师(FAE).这个职业也不错,你学了如何编程,但是不用自己去开发项目,基本上是管售前售后的技术人员,你只需要精通你负责的这块就好了.然后把开发方法介绍给客户,客户开发过程中有问题,你帮助解决.我水平低,所以勉强能做这个,这行如果做得好,在外企是不错的.我一个同学在菲利浦做FAE,就是现场应用工程师,一个月一万的薪水.而且经验多了,以后还可以往管理岗位走,也是个不
错的选择.
还有我再举个例子,我不提人名和单位,因为人家可能不愿意我说出来.我知道有许多学生特别不喜欢编程序,这样的路可能会和我们熟悉的不一样,但不是没出路.我知道一二个,平时也不写程序,也不喜欢写程序,但是能力还是很强的,我相信能来我们学院的人能力都不会差的;人家英语特别好,而且做PPT本事比较强,表达能力好,外表也不错,这样的做销售或者售前是很好的条件,结果听说现在人家都在顶级IT企业做行政和销售方面的.我们学院的IT协会我不了解,我想他们可能也是这样的目标吧,将来会不会出几个这样的同学也说不准呢.不过,这个要靠机遇和实力的,而且相信机会要比什么软件开发和嵌入式什么的少一些.所以希望不喜欢技术和程序的同学还是不要太多.
我是一直认为,学到的知识不是最重要的,最关键的是能力上的提高.IT业知识更新最快了,电脑和网络让这个世界成了知识爆炸的时代,我们只是人,只有人脑,记不住这么多这么大量的信息,所以最关键的是能力上的提高.这种能力包括学习能力,沟通交流能力,还有寻找快乐和创造幸福的能力,希望大家在软微学院真正提高的是这些能力:)
感谢大家一直以来的关注和支持,三朝元老经验谈感觉象是电视节目一样,每周一期,又像软件一样,过一阵子一升级,相信大家过一二个月再回头来看,或许会更有感觉;过了半年甚至一年再看可能感觉又不同了.实在是没时间精力好好打补丁升级,还望大家见谅.
接下来是这篇文章发表一段时间后根据大家的反馈再补充的内容
------------------------------------------------------------------------------------
软件工程方法规划软微学院生涯----三朝元老经验谈
其实不说大家也猜到了,所谓升级版不过是打打补丁,顶多是增加点功能,所以不会有特别多的内容。此次升级版主要是根据广大同学反馈信息,补充一些对未来的设计方法。这个只是个人的一些想法,请大家参考,切勿忘记与自己的实际情况结合,我说的其实也没什么根据,也害怕会误人子弟,所以这一次不会说太多。好,以下便是我根据软件工程
的思想,希望与大家一起探讨一下我们在软院的学习规划。
理想与规划(软件需求分析阶段,确定我们要做什么)
我觉得有相当多的新生对未来的理想还没有规划好,这也正常,因为有许多人是半路出家来到这里的,他们没有想过自己的未来会有这样一种改变。大多数原来有计算机基础的,看过我的贴子基本上已经心里有数了。不管以前基础如何,大家都要有个目标,比如说将来要嫁入微软或者IBM这样的豪门也好,或者是将来去华为、中兴等国企做网络通讯也好,或者去做ERP、嵌入式开发等,刚开始第一个学期目标最好定下来,然后上网去查这个目标需要你掌握哪些知识,需要哪些技能,你在学习过程中要加强这方面的学习投入。我个人感觉,刚开始这个工作是值得的,你现在收集的信息越多,就越知道往哪个方向努力,选课和投入精力分配就越合理。如同软件工程的需求定义阶段,定义准确,很好的描述出软件要实现的功能,才能最大限度满足客户的需要。这个阶段找出问题是最容易解决的,不然假设你想做嵌入式应用软件,却又希望多学知识而选了质量工程、管理营销、网络安全等,你去网上查一下,什么项目什么公司需要这样的人才?这样的结构很
明显是不合理的。这样的选课很明显是图多图全,想做全才,如果真是基础特别好,也不是不可以,但如果到实习时发现自己没有想象中那么强就惨了,那时候想改可就难了。所以如果想多学知识,建议去听一下第一堂课的介绍就可以了,知道那个课讲什么的,对将来有什么意义就可以了,如果真是喜欢再决定是选还是继续旁听。一年的时间,不要分散得太厉害,因为这一年不仅要学理论,还有留有几乎1比1的时间来做实践,这个实践包括编码和写各种文档资料,所以规划之前一定要做大量的查询调研工作。
我简单举个例子,如果你对网络与通讯很感兴趣,去朗讯贝尔、CISCO、华为、中兴等公司的网站上看看他们对实习生和新招人才的要求是什么?网络与通讯涉及的领域也同样很广的,你要有一个思想准备,一年后去实习时,你用什么去打动这些用人单位。当然,其实我们在校学的这些知识多数也都是基础知识,不会直接满足现在社会的具体应用的。举
个具体的例子,头一阵子看到来我们学院招实习生的西门子,它对实习生的具体要求如下:
微码开发实习生技能要求:
1.扎实的网络基础知识;
2.熟悉路由交换原理及TCP/IP协议栈;
3.熟悉Intel IXP2800的硬件结构;
4.熟悉Intel IXP2800的微码编程;5
.熟练使用Intel的IXA集成开发环境;
6.熟悉ME之间的并行处理、微码流水线处理、线程之间的信号机制;
7.熟练使用各种Ring和Queue的操作;
8.有较强的微码开发的能力;
9.C 语言开发能力。
这个实习生技能要求我觉得网络与通讯和嵌入式以及集成电路方向的都可以参考一下,这些要求,我想除非是事先准备好否则你肯定达不到要求,因为INTEL IXP2800整个软硬件开发环境成本极高,我们学院现在还没有,但它的开发原理,和一些基础知识,你在一年之内是可以学好的,而且如果提前半年左右时间好好准备一下,这个实习岗位应该就会属于你。如果实习中你努力实践,那么等实习结束后,你掌握的知识足够保证你找到月薪不少于6K的工作。也就是说,在实习之前你们就要做好提前量,找到自己的理想,提前规划好。不要等一年时间过去了,到了去找实习单位的时候再去查人家对你的要求,因为那时候你想改变已经来不及了。这和软件工程的思维是一样的,项目快结束时发现问题改动太难了,所以尽可能在需求分析阶段把问题都找到并解决好。而且这个阶段还是可行性研究的阶段,有些人在实习时才发现,自己当初的软院生涯规划根本就不可行,这是大家都不希望看到的。而且这个时候的查询调研工作,还会让你发现,你是不是真的喜欢你要选择的方向,还会帮助你有计划的选择课程。
比如,你将来想去银行证券类做电子金融,那你就要先去这些网站上查一下,人家的要求,你会发现,人家一般都要求熟悉UNIX/LINUX系统,如果用到大机还会要求COBOL语言,可能会要求某种数据库,还会要求软件测试专业,因为金融类软件出错要命,所以对软件测试也是比较重视的。然后你再想针对自己如何找到切入点,如果刚好有亲戚朋友在某个给银行做系统的公司,那就好办多了,提前一年和人家打个招呼,看人家缺什么,如果缺测试也没关系,你到时候可以去先从测试入手,等和工作人员熟悉了,就可以把整个项目都了解一下。如果你本科时还有会计、财经的背景,加上外语又极好,二年后,搞不好进麦肯锡之类的咨询公司也是有可能的。
注重实践,不要搞笑(设计阶段,确定怎么做)
需求分析明确的基础上,我们就要开始进入实现阶段了,这个时候我们要有一颗平常心,不浮燥,不怕困难,尽自己最大的可能学习。同时还要切记李素科老师的教导“计算机科学是非常重视实践能力的,光学习理论知识,不重视动手能力的培养而又号称自己在学习计算机科学,简直是在搞笑。”
因为你的方向已经明确,这时候的选择就变得容易得多了,你会选择对你未来希望发展方向相关的课程,比如还是以刚才说的西门子招实习生为例,你就会根据这个来选择网络与通讯的课,还有嵌入式微处理器的课,因为INTEL IXP2800用了一个基于ARM CORE的微处理器做管理;因为这个项目用在未来移动通讯的基础设施里,可能你还会选移动通讯和INTERNET高级编程等相关课程,这样有针对性的选择,目标明确,找实习单位时才会一击就中。
当然有些人想去做大机,这个就比较难了,很有可能你在学校学的都不会是直接用得上的,不管你JAVA和C++学得多好,面向对象的技术多精通,你会发现,COBOL语言与这些根本不是一个时代的东东。这样的同学,你们在校期间要培养一种学习的能力,其实这种能力非常重要,很多同学将来都可能用上。根据我们实习的经验,有许多人到了实习岗位,发现用人单位看重的只是你的学习理解能力,因为该实习项目根本就没有可能在学校里学到,还以传真师兄为例(他的知名度如果提高,有我很大功劳)。他二年前(他是我们学院首届学生)去斯伦贝谢的中国人民银行信用卡项目组实习,斯伦贝谢只给他一周的时间看上G的英文文档资料和自学COBOL语言,那超过1G的文档里几乎全是英文文档,涉及到项目的方方面面,你要知道项目大概怎么回事,需要你学什么东西等,然后一周之内会用COBOL写代码,COBOL语言的书多少年前就停版了,想找有关资料要多难有多难。所以这就需要你自身的学习能力,同时还需要你沟通交流的能力,你要找一个项目组的比较好说话的员工多交流,让人家给你些入门的指导等,让自己尽快进入角色。所以这些需要的能力,你在一年的在校生活里要注意培养,就是快速掌握新知识新技术的能力,还有就是团队精神合作意识,学会沟通交流。这里要注意,英文根本就不是对你的要求,是默认值,我们必须要习惯看英文技术文档,尤其是想去外企的。所以大家像选张德昭老师的课时会有感觉,刚开始读英文资料很不习惯,但将来你必须习惯,IT业英语是默认语言。所以选张老师的课难是难,但收获确实也大。
我们是工程硕士,必然要有实践,不停留在理论上,作业好好做,项目大家一起努力,这些很多都是真实的模仿现实工作中的场景的,对我们将来实习和工作有很大帮助,所以千万不要搞笑!还有就是要有重点要有针对性要结合自身情况来实践和选课,不要急功近利和随波逐流,总有人问,现在用C++的多还是用JAVA的多(明显随波逐流),C++好学
还是JAVA好学,哪个赚钱多呀?这都太急功近利了。比那些有意义吗?在网络和嵌入式领域,C的使用量也是相当大的,关键是看你将来的发展领域,而不应该本末倒置。实践的东东大家在自己的实践中体会吧,每个人基础都不一样,自己安排好实践量。
找个适合的实习单位(软件测试阶段)
通过需求分析,找到自己的方向和要做什么;通过设计实践阶段,做了相应的准备工作;项目已经有了原型,现在该去实习单位测试一下了。经过一年的测试,你会进一步飞速成长,完善各种功能,查缺补露,向着高质量的软件产品迈进。
毕业找到理想的工作单位(项目完成,验收阶段)
最后实习结束,写一份详细的测试报告,也就是论文了,通过后就毕业了。项目做得怎么样,最后由企业用人单位来验收决定给你多少薪水,一个软件项目就此暂告一段落。你的人生从此进入另一个阶段,在此我们就不做过多讨论,希望那时候各位回首,发现师兄写的这些经验谈原来还是有些帮助,然后在BBS上和我打个招呼,我也就觉得没白写这
些了。
我相信能来我们软微学院的同学都是非常优秀的,不管你以前什么专业一定会找到和计算机软件结合点的,请你试着用我所说的软件工程的方法来规划你在软微学院的生活,看看是否会有帮助,我只是举了些例子,没有针对各种情况和各个专业背景来举例,大家可以举一反八,针对自己的情况试着去规划一下,有什么想法大家可以一起探讨,多多沟通
交流。
下面是正文部分,讲得很不错
------------------------------------------------------------------------------------
写给为选方向困惑的师弟师妹----三朝元老经验谈(各个方向的均可参考)
转眼已成三朝元老,为新生写点什么吧。觉得这是责任,是义务,希望师弟师妹们有个广阔的视野来对自己的软院生涯进行很好的规划。人有两只眼睛,一个显微镜,一个望远镜,先聚焦进来看看吧:)
先要有自信,要团结互助
软院人的传统还是比较好的,那就是团结互助,我们老家伙会尽量帮新生的,因为当年我们来时师兄们也很照顾我们,希望大家把这种人人为我,我为人人的精神传递下去。软院招生一年比一年多,这也算是人脉呀,希望大家将来在社会上都能成为精英。
首先,先给新生打打气,昨晚的迎新交流会讲了许多,李明、曾著和我是一届的,李明以前和我一屋的,他们讲得非常好,后来的那个IT协会的讲得很生动。我觉得大家各自经验兴趣都不同,背景各异,实在没办法有针对性的说什么,只好给大家些鼓励。大家既然已经来了,就安心在这儿学习,如果后悔还是趋早,选择来了就要承担后果。我想大家来这里都是带着梦想和希望的吧?那就帮你们对自己的前途更有信心吧!北大的牌子有多响大家心里有数吧,只要我们学得和别人差不多,机会一定会落在我们身上的,所以我们要维护北大软微学院的牌子,要提高自身素质,让自己也让以后的师弟师妹们都跟着光荣,在社会上形成一定的气候。今年我们学院签IBM的光我知道的就有五、六个人,各大IT企业都有我们同学的身影,在IT界表现还是不错的。以我们寝室为例,李明去了IBM;还有一个现在去了数位红(国内最大的手机游戏软件公司是盛大的子公司)做手机游戏(实习工资就有5K),因为这小子的理想就是做游戏,平时在学校里做的项目也多半是简单的网络游戏;另一个兄弟去摩托罗拉实习(实习工资3800)马上就要回来了,他今年本来考上北大遥感所的博士了,可是由于硕士论文没来得及写,所以还不知道明年能不能读上博士;我在一家台湾企业实习,从技术支持到现在已经挂上APM(区域产品经理)的名头了,老板从去年就多次要我留下,我还没想好是不是要留下。此外我们学院二学位的也很出色,听说有一个签了IBM,还有一个二学位的朋友签了一家外企月薪8K。所以请新来的学弟学妹们,一定要有信心,只要你肯努力,我们一定比其他学校的学生有竞争力。我还记得我来时李传真师兄说的,北大的牌子就是块敲门砖,别人砸不开的门,用它就能砸开,不过砸开门后能不能把握机会就看你自己的了。我们要对得起北大的这块砖呀!要珍
惜将来会出现在我们面前,别的学校研究生想都不敢想的机会,所以这一年的学习时间和你们交的学费可不能浪费呀!
(说到团结互助,如果您觉得看了之后有所收获,就转告别的同学吧,大家共同学习进步)
说了这些,大家觉得前途是不是光明了许多?那么请你们在今后的学习生活中团结合作,利用学校提供的一切条件,好好学习,开心生活,留下美好的人生回忆。遇到不开心事,多宽容多沟通交流,同时要注重综合素质和综合能力,不要出去让人说,都北大研究生了还不懂礼貌和礼仪,当然,我也粗人一个,有许多事还是很丢人的,但是还是希望自己尽可能素质高些,不给北大丢人嘛。平时的小事也要注意些,特别是以后实习时,我们IT界白领比较多,素质高和能力强的人很多,可以学到许多东西,比如,公司的经理虽然职位高,但还是会自己打扫办公室,主动让女士优先等。这些要平时养成习惯,我们中国的学生在这方面做得不够好,所以我觉得我们软微学院出来的要在这方面强于别的学校学生。北大人其实过分强调自由与民主,而在团结和协作上强调得不够,这个时代不是英雄主义时代了,单枪匹马是不行的,一定要多和人交流合作,搞技术的这方面差些,所以想当经理很难呀,如果我们有技术又懂得沟通合作与管理方面知识,就很容易走上管理岗位的。为了自己,也为了别人,请真心的关爱你的同学吧,因为你懂得如何珍爱别人时也就懂得如何珍爱自己了。还是那句,人人为我,我为人人----all for one ,one for all
方向性问题
我们屋原来几个兄弟刚好都是不同方向的,李明是电子服务加管理与技术,去数位红的是软件开发,在摩托罗拉的是网络与通讯的,我是嵌入式的,实习内容又涉及到网络安全,所以我刚好对各个方向都还有那么点了解。刚来软院,最头痛的就是选方向,其实各个方向很容易交叉的,所以你们可以不必特别在意自己到底是哪个方向的,可以先按兴趣选择,到下学期想改也是可以的。其实这些方向不必分得这么明确,但我觉得大家要知道这些方向对你意味着什么,对将来意味着什么才是更重要的,大家之所以选择比较困难,很大程度上是因为不清楚这些技术的发展和走势,不知道如何和自己的兴趣爱好结合,所以我根据自己经验,和网上查到的一些资料,现对方向性问题做如下总结:
(未完待续,广告回来更精彩,别走开哟!)
1、网络与通讯
我们学院开的专业都是最火的,网络与通讯其实很多地方和嵌入式系统有结合点,比如路由器和交换机其实都是嵌入式系统,连到网络的嵌入式设备也越来越多,也正因如此,网络与通讯已经成为最热门的专业了。这个世界早晚会被一网打尽的,网内的PC机根本就算不上主流,随着可移动计算的嵌入式设备的大量使用,微软、GOOGLE、雅虎等企业也都挤进了网络与通讯领域。网络与通讯我甚至觉得已经可以算是基础课的一部分了,当然,你并不需要学网络与通讯的全部课程,因为底层细节基本上不需要开发人员全
部了解,但李素科老师的INTERNET高级编程应该选,而且这门课也算到软件开发里了。学了那门课,保证受益匪浅,不过基础不好的学那个会比较吃力。
现在网络比较火的有VOIP、P2P相关的一些东东,做到底层就会和嵌入式有联系了;现在网络上的多媒体相关应用也很火,因为未来网络要传大量多媒体信息;而且网络安全又是网络发展的头等大事,所以网络与通讯又可以和网络安全结合。关键在于选课时要注意各学科交叉,各位要想好自己将来要从事的大概行业,然后就要重点突破了。
这个网和人间的情网很相似,你或我,男或女,都逃不过的。此(情)网恢恢,疏而不露,你准备好触网了吗?未来世界的所有软件几乎都要有联网功能,通过网络升级或者做些更新什么的,搞软件不懂网络肯定是不可思议的事情,所以网络与通讯的知识多少也要了解一些才行,但具体了解深度要看你们自己的需要了。网络已经和英语一样成为基础性东东了,我个人建议至少要看一看那部经典的小电影,就是TCP/IP打包的那部,把网络世界非常生动的描绘了一下,看了觉得特爽。
再说一下张德昭老师和高培春老师吧,他们都是业界的名人,高老师是非常受人尊敬的,我一正在实习的朋友曾经和我说,当他去贝尔面试时,当面试考官得知他听过几门高老师的课时,脸上露出羡慕的表情。张老师属于大师级人物,可能我们这些刚入行的小生有时候不太理解她,她很多年前就是贝尔大牛,有些网络教科书上的技术就是在她带领下研究出来的,这是我们这种没入门的人无法想像的。所以她上课时我们会觉得有些难以领会,请大家要做好心理准备。
2、电子服务
我感觉主要是企业计算,主要是指企业信息系统,如ERP软件(企业资源规划)、CRM软件(客户关系管理)、SCM软件(供应链管理,即物流软件),银行证券软件,财务软件,电子商务/政务(包括各种网站),数据仓库,数据挖掘,商务智能等企业信息管理系统。
这个领域对人才的需求显然永远是数量最大的,因为这是计算机应用最多的领域. 搞这方面的好处是:
(1)人才需求量极大,从事企业计算的公司在IT企业中占了大多数。除非在专业上一无特长,一般在这一领域总能找到工作。
(2)这方面的入门门槛相对较低(如果你的软件功底不是很深,可考虑这一领域)
(3)这方面的大公司较多,大公司要赚大钱,所以多将精力花在企业计算业务上.如与我院同学目前实习的IBM、SAP、BEA等公司都属这一领域的公司。如果将来想到大公司找一份相对稳定的工作,从事这方面机会要大很多。
但从事这一领域的缺点也是明显的:
由于这方面的入门门槛相对较低,虽然这方面的人才需求量是最大的,但将来竞争对手会较多。你会发现,即使他原不是学IT专业的人,也许他突击几个月后,做得照样像模像样。特别是当你年纪渐大后,你可能会发现,后面的年轻人可能很容易追上你的水平。如果你将来到国外去工作,你可能会发现从事这领域的人更多且高手如云。当然,若你在这一领域经过多年企业经验,达到较高境界(如能设计软件架构),则身价永远是高的。国内在这方面人才领域的主要问题是,有经验的高手太少,皮毛了解的人太多。
从事电子服务,最重要的技能型技术知识是
(1)J2EE架构与程序设计
(2)大型数据库系统(如Oracle)
(3)基于UML的系统分析与设计。
如果说还有什么重要的技能,还可将XML与Web Service技术包含进来,若你在这几个领域掌握较好,则不愁找不到工作。其中尤其以J2EE最为重要,目前J2EE已成为企业计算软件开发的最主要平台。希望我院同学无论将来想从事何种方向,都应学一下J2EE课程,至少可为将来找工作备一手关键功夫。包括想从事嵌入式或其它领域的同学,也是很有必要学一下J2EE的,毕竟J2EE是目前最重要的平台之一,即使你将来不想从事企业计算领域,了解一下J2EE也是必要的,就像一门常识课程一样。其它与企业计算关系较密切的技能还包括:Dot Net架构与程序设计、软件测试技术、软件配置管理,该领域较高
层次的技能包括数据仓库技术、构件与中间件技术、设计模式等。像通信协议分析与网络程序设计,Unix系统管理等也属有些关系的课程。希望各位一定要在某个领域有深入的掌握。只是跟着听课,即使学了再多课程也是没用处的,自己钻研下去才是最重要的。只一个J2EE便是博大精深的,足够你啃下去的,钻研下去,你会发现你还要学的相关知识还有很多(包括EJB、XML、Web Service、Design Pattern等)
虽然从事企业计算的人才很多,但以下企业计算领域无论国内外都属稀缺人才:
(1)掌握大型ERP系统,主要是SAP系统,包括SAP Basis(系统管理)或SAP ABAP(编程)或SAP功能模块实施(特别是财务模块FI的实施)。SAP顾问身价是最高的,而且非常难找。其它大型ERP系统,掌握PeopleSoft、Oracle Finacial、J.D.Edward、Siebel等大型ERP软件系统的人也很值钱。这方面的人之所以身价奇高,主要是因为这些软件很专业,特别大,很难有D版可学习,只有特大企业(如世界500强,90%以上使用SAP)才用得起,而且必须有实际工作经验才能掌握。如果是一个个人人都很容易有机会接触的软件,
那么这方面的人通常就不会稀缺。如果大家将来有机会接触学习这些大型ERP软件系统的机会,建议毫不犹豫地抓住,那将捧上一辈的金饭碗。在国外,会SAP的人特别值钱。物以稀为贵,这永远是颠扑不破的真理。SAP的价值不仅是因为他是一个ERP软件, 而是其中体现的现代企业管理理念(如根据订货需求自动安排原料采购和生产计划等)。一般500强公司绝不会像国内很多企业那样,用J2EE从头设计企业的ERP系统,一定都会使用SAP这样成熟的ERP软件,用不起SAP的公司可能会用J2EE设计ERP系统。
(2)掌握IBM大型机技术的人,如S/390主机,MVS操作系统,JCL作业控制语言,COBOL程序设计语言,DB2关系数据库或IMS层次数据库,CISC中间件交易控制系统等IBM大型机专用技术。国内五大银行,以及国外绝大多数银行的后台系统使用的都是以上平台。IBM大型机号称永不宕机而且平台相对封闭(这样最安全),所以这些要求在24*7环境中连续运行的关键应用(术语叫mission critical applications)都采用IBM大型机。这方面的人才之所以稀缺,是因为会大型机的人都是老人(90年代以前搞IT的人),全世界
新毕业的IT毕业生不可能再去学IBM大型机(这是一种相对"古老"的技术),没有新人补上,而银行的系统必须维持下去而且银行还要不断开发新业务(如新的存款品种),虽然对IBM大型机人才的绝对需求量不很大,但相对恒定,银行到哪里找这方面的新人,很难找到.  如果你将来到国外找工作,会IBM大型机可能是最好找工作的领域之一了,而且保证找的都是大银行等好工作.读书的最终目地还是为了工作. 如果你将来在国外找工作,根本没人管你是什么文凭,国外企业绝不会花冤枉钱,只会招有领域工作经验能立即上手的人,用最少的钱在限定的时间完成项目. 而在国内,因为人力成本较低,公司招聘一很多高学历的人才,尽管可能根本用不到这么高的学历,但国内的人力太便宜了,为什么不高消费一下人才呢?这样公司的门面还要好看些。(李传真师兄就是因为实习时接触了大机和COBOL语音,现在去了IBM,由于他本科的财经背景,现在在IBM负责财经方面的咨询,这是一个很经典的案例哟,请传真师兄原谅我未经允许就引用)
(3)其它如掌握数据仓库技术的人在国内也很少. 目前最主流的数据仓库平台应是ORACLE的数据仓库工具.
同学们现在年纪都很轻,年轻人充满热情,喜欢追逐一些热门技术,这当然正确的,毕竟学习SAP和大型机的机会毕竟不多,毕业时先能找到一份工作是重要的. 但我相信随着年纪的增长,大家将来慢慢都会思考的,掌握一项竞争对手较少的绝技的重要性,将来如果自己到国外工作什么技术最好找工作,你要考虑你今后一生的出路,什么样的绝技是最稳定最轻松最高收入的. 搞软件的人,当年纪大些时,你可能更向住像搞医学人的那样能更多靠经验吃饭,而不须整天像年轻人那样不得不去追逐不断出现的软件新技术,这个时候也许你也许会发现,如果你在SAP或大型机等方面有些绝技,你会有很大优势,因为这些较偏的领域其技术变化是相对很缓慢的.相反,掌握流行技术的人因太多而不很值钱. 同学们将来找工作时,不仅要盯着国内市场,还要有一种放眼全球的眼光,对搞软件的人你将来完全可能到其它国家去工作. 尤其是在欧美、日本、新加坡等国家,对SAP(包括IBM大型机)人才的需求是很大的。
(http://play8.tom.com/song_open.php?song_id=2056      这是非常好看的机器舞)
3、关于嵌入式系统方向(集成电路方向也可参考)
嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。像我们平常常见到的手机、PDA、电子字典、可视电话、VCD/DVD/MP3 Player、数字相机(DC)、数字摄像机(DV)、U-Disk、机顶盒(Set Top Box)、高清电视(HDTV)、游戏机、智能玩具、交换机、路由器、数控设备或仪表、汽车电子、家电控制系统、医疗
仪器、航天航空设备等等都是典型的嵌入式系统。嵌入式将会是我们数字化生存的基础,一台PC里其实就已经嵌入了10几个单片机,一辆高档轿车大约要用到六七十个单片机;嵌入式处理器无所不在,无处不在,全世界的年产量超过100亿片,这是怎样惊人的数字呀!
嵌入式系统是软硬结合的东西,搞嵌入式开发的人有两类。
一类是学电子工程、通信工程等偏硬件专业出身的人,他们主要是搞硬件设计,有时要开发一些与硬件关系最密切的最底层软件,如BootLoader、Board Support Package(像PC的BIOS一样,往下驱动硬件,往上支持操作系统),最初级的硬件驱动程序等。他们的优势是对硬件原理非常清楚,不足是他们更擅长定义各种硬件接口,但对复杂软件系统往往力不从心(例如嵌入式操作系统原理和复杂应用软件等)。
另一类是学软件、计算机专业出身的人,主要从事嵌入式操作系统和应用软件的开发。如果我们学软件的人对硬原理和接口有较好的掌握,我们完全也可写BSP和硬件驱动程序。嵌入式硬件设计完后,各种功能就全靠软件来实现了,嵌入式设备的增值很大程度上取决于嵌入式软件,这占了嵌入式系统的最主要工作(目前有很多公司将硬件设计包给了专门的硬件公司,稍复杂的硬件都交给台湾或国外公司设计,国内的硬件设计力量很弱,很多嵌入式公司自己只负责开发软件,因为公司都知道,嵌入式产品的差异很大程度在软件上,在软件方面是最有"花头"可做的),所以我们搞软件的人完全不用担心我们在嵌入式市场上的用武之地,越是智能设备越是复杂系统,软件越起关键作用,而且这是目前的趋势。
从事嵌入式软件开发的好处是:
(1)目前国内外这方面的人都很稀缺。一方面,是因为这一领域入门门槛较高,不仅要懂较底层软件(例如操作系统级、驱动程序级软件),对软件专业水平要求较高(嵌入式系统对软件设计的时间和空间效率要求较高),而且必须懂得硬件的工作原理,所以非专业IT人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,很多软硬件技术出现时间不长或正在出现(如ARM处理器、嵌入式操作系统、MPEG技术、无线通信协议等),掌握这些新技术的人当然很找。嵌入式人才稀缺,身价自然就高,越有经验价格就越高。其实嵌入式人才稀少,根本原因可能是大多数人无条件接触,这需要相应的嵌入式开发板和软件,另外需要有经验的人进行指导开发流程。
(2)与企业计算等应用软件不同,嵌入式领域人才的工作强度通常低一些(但收入不低)。搞企业应用软件的IT企业,这个用户的系统搞完了,又得去搞下一个用户的,而且每个用户的需求和完成时间都得按客户要求改变,往往疲于奔命,重复劳动。相比而言,搞嵌入式系统的公司,都有自己的产品计划,按自己的节奏行事。所开发的产品通常是通用的,不会因客户的不同而修改。一个产品型号开发完了,往往有较长一段空闲时间(或只是对软件进行一些小修补),有时间进行充电和休整。另外,从事嵌入式软件的每个人工作范围相对狭窄,所涉及的专业技术范围就是那些(ARM、RTOS、MPEG、802.11等),时间长了这些东西会越搞越有经验,卖卖老本,几句指导也够让那些初入道者琢磨半年的。若搞应用软件,可能下一个客户要换成一个完全不同的软件开发平台,那就苦了。
(3) 哪天若想创业,搞自已的产品,那么嵌入式是一个不错的主意,这可不像应用软件那样容易被盗版。我们这届有个同学自己有点此类小生意,具体做什么的没细问,他每月要进货几千片8位单片机,现在自己已经有车有房了。还有现在开发的饭馆用的点菜PDA(WinCE平台,可无线连网和上网),据说销路不错,饭馆点点PDA让客户点菜,多显派头档次。这些PDA的硬件设计一般都是请其它公司给订做(这叫“贴牌”:OEM),都是通用的硬件,我们只管设计软件就变成自己的产品了。
从事嵌入式软件开发的缺点是:
(1) 入门起点较高,所用到的技术往往都有一定难度,若软硬件基础不好,特别是操作系统级软件功底不深,则可能不适于此行。
(2) 这方面的企业数量要远少于企业计算类企业。特别是从事嵌入式的小企业数量较多(小企业要搞自己的产品创业),知名大公司较少(搞嵌入式的大公司主要有Intel、Motorola、TI、Philip、Samsung、Sony、Futjtum、Bell-Alcatel、意法半导体、Microtek、研华、华为、中兴通信、上广电等制造类企业)。这些企业的习惯思维方式是到电子、通信等偏硬专业找人。
(3)有少数公司经常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多数公司也并无此要求,只要有经验即可。
同学们若学习嵌入式,显然应偏重于嵌入式软件,特别是嵌入式操作系统方面,应是我们的强项。
对于搞嵌入式软件的人,最重要的技术显然是(实际上很多公司的招聘广告上就是这样写的):
(1) 掌握主流嵌入式微处理器的结构与原理
(2) 必须掌握一个嵌入式操作系统
(3) 必须熟悉嵌入式软件开发流程并至少做过一个嵌入式软件项目。
在嵌入式软件方面最重要的课程包括:
(1) 嵌入式微处理器结构与应用:这是一门嵌入式硬件基础课程,我们说过,嵌入式是软硬件结合的技术,搞嵌入式软件的人应对ARM处理器工作原理和接口技术有充分了解,包括ARM的汇编指令系统。若不了解处理器原理,怎么能控制硬件工作,怎么能写出节省内存又运行高速的最优代码(嵌入式软件设计特别讲究时空效率),怎么能写出驱动程序(驱动程序都是与硬件打交道的)?很多公司招聘嵌入式软件人员时都要求熟悉ARM处理器,将来若同学到公司中从事嵌入式软件开发,公司都会给你一本该设备的硬件规格说明书 (xxx Specification),你必须能看懂其中的内存分布和端口使用等最基本的说明(就像x86汇编一样),否则怎么设计软件。有些同学觉得嵌入式处理器课程较枯燥,这主要是硬件课程都较抽象的原因。还有同学对ARM汇编不感兴趣,以为嵌入式开发用C语言就足够了。其实不应仅是将汇编语言当成一个程序设计语言,学汇编主要是为了掌握处理器工作原理的。一个不熟悉汇编语言的人,怎么能在该处理器写出最优的C语言代码。在嵌入式开发的一些关键部分,有时还必须写汇编,如Bootloader等(可能还包括BSP)。特别是在对速度有极高要求的场合(如DSP处理器的高速图像采集和图像解压缩),目前还会用到汇编写程序的,尽管用到的机会相对C要小得多。当你在一个嵌入式公司工作时,在查看描述原理的手册时,可能很多都是用汇编描述的,这是因为很多硬件设计人员只会写或者喜欢用汇编描述,此时你就必须看懂汇编程序,否则软硬件人员可能就无法交流。很多嵌入式职位招聘时都要求熟悉汇编。
[小知识] 目前嵌入式处理器常见的有ARM、PowerPC、MIPS、Motorola 68K、ColdFire(冷火)等,但ARM占据了绝对主流(有资料说手机中几乎90%都是ARM处理器)。ARM是一个只卖知识产权的公司,目前获得购买了ARM CPU核授权许可的大公司很多,包括Intel、Samsung、Amstel、Motorola、Philip等,他们都在ARM CPU核的基础上进行了一些外围扩展,形成自己的处理器(如Samsung S3C2410,Motorola i.MXL9328等处理器都是采用ARM 9内核,指令一级是相同的)。而众多中小公司又购买了这些处理器,设计了各种各样的开发板,如华恒等国内很多著名嵌入式公司都生产基于Samsung S3C2410的开发板,供最终用户使用或供教学实验。在ARM这个食物链上,ARM公司是大鱼,Intel、Samsung等公司是小鱼,而华恒等则是虾米,最终用户(我们这些要采购嵌入式开发板的)则是喂虾米的。Intel早期生产的是低端ARM(Strong ARM,相当于ARM 7),现在转向主要生产高端ARM(即Intel Xscale处理器,属于ARMv5家族,主要用在高端PDA上,
如HP和DELL生产的PDA都采用Intel Xscale,价格较高)。目前应用最多的是ARM 7和ARM 9两类处理器。 ARM 7较便宜,可跑uclinux(是一个不支持高级内存管理功能的嵌入式Linux系统)、Vxworks、uc/os II等实时操作系统,但因处理器不带内存管理单元MMU(无内存分页和地址映射机制,所以不能使用虚拟内存),所以不能跑Windows CE,另外通用Linux中的某些内存管理功能也不能用在ARM 7上。ARM 9大都是一个带MMU功能的高端处理器,可跑WinCE或通用Linux的大多数功能。ARM7和ARM9的区别是在与体系结构上,前者是冯·诺伊曼结构,后者是哈佛结构——指令和数据总线是分开的。以上是我的一点了解,可能有不对的地方。我们学院有十几套ARM 7开发系统(采用Samsung S3C44b0x开发板,主要用于嵌入式处理器结构、实时操作系统等课程实验用),ARM 9的系统好象也已经到了(采用的芯片我不知道也没去问),还有以前的十几套MPC860开发板(听说价格都很贵,很容易损坏),同学应爱护使用和珍惜这样的实验机会。
(2) 嵌入式操作系统类课程
除了WinCE的实时性稍差外,大多数嵌入式操作系统的实时性都很强,所以也可称为实时操作系统Real TimeOperating System.从事嵌入式的人至少须掌握一个嵌入式操作系统(当然掌握两个更好),这在嵌入式的所有技术中是最为关键的了。目前最重要的RTOS主要包括:
第一类、传统的经典RTOS:最主要的便是Vxworks操作系统,以及其Tornado开发平台。Vxworks因出现稍早,实时性很强(据说可在1ms内响应外部事件请求),并且内核可极微(据说最小可8K),可靠性较高等,所以在北美,Vxworks占据了嵌入式系统的多半疆山。特别是在通信设备等实时性要求较高的系统中,几乎非Vxworks莫属。Vxworks的很多概念和技术都和Linux很类似,主要是C语言开发。像Bell-alcatel、Lucent、华为等通信企业在开发产品时,Vxworks用得很多。但Vxworks因价格很高,所以一些小公司或小产品中往往用不起。目前很多公司都在往嵌入式Linux转(听说华为目前正在这样转)。但无论如何,Vxworks在一段长时间内仍是不可动摇的。与Vxworks类似的稍有名的实时操作系统还有pSOS、QNX、Nucleus等RTOS。
第二类、嵌入式Linux操作系统:Linux的前途除作为服务器操作系统外,最成功的便是在嵌入式领域的应用,原因当然是免费、开源、支持软件多、呼拥者众,这样嵌入式产品成本会低。Linux本身不是一个为嵌入式设计的操作系统,不是微内核的,并且实时性不强。
目前应用在嵌入式领域的Linux系统主要有两类:
一类是专为嵌入式设计的已被裁减过的Linux系统,最常用的是uClinux(不带MMU功能),目前占较大应用份额,可在ARM7上跑;另一类是跑在ARM 9上的,一般是将Linux 2.4.18内核移植在其上,可使用更多的Linux功能(当然uClinux更可跑在ARM 9上)。很多人预测,嵌入式Linux预计将占嵌入式操作系统的50%以上份额,非常重要。缺点是熟悉Linux的人太少,开发难度稍大。另外,目前我们能发现很多教材和很多大学都以ucOS/II为教学用实时操作系统,这主要是由于ucOS/II较简单,且开源,非常适合入门者学习实时操作系统原理,但由于ucOS/II功能有限,实用用得较少。况且熟悉了Linux开发,不仅在嵌入式领域有用,对开发Linux应用软件,对加深操作系统的认识也有帮助,可谓一举多得。据我所知,目前Intel、Philip都在大搞ARM+LINUX的嵌入式开发,Fujitum则是在自己的处理器上大搞Linux开发。目前在嵌入式Linux领域,以下几个方面的人特别难找,一是能将Linux移植到某个新型号的开发版上;二是能写Linux驱动程序的人;
三是熟悉Linux
内核裁减和优化的人。不过LINUX有一个硬伤,就是没有WINDOWS那样的友好方便美观的交互界面,不然微软帝国早就守不住了。
第三类、 Windows CE嵌入式操作系统:Microsoft也看准了嵌入式的巨大市场,MS永远是最厉害的,WinCE出来只有几年时间,但目前已占据了很大市场份额,特别是在PDA、手机、显示仪表等界面要求较高或者要求快速开发的场合,WinCE目前已很流行(据说有一家卖工控机的公司板子卖得太好,以至来不及为客户裁减WinCE)。WinCE目前主要为4.2版(.NET),开发平台主要为WinCE Platform Builder,有时也用EVC环境开发一些较上层的应用,由于WinCE开发都是大家熟悉的VC++环境,所以我院学过Windows程序设计课程的同学都不会有多大难度,这也是WinCE容易被人们接受的原因,开发环境方便快速,微软的强大技术支持,WinCE开发难度远低于嵌入式Linux。对于急于完成,不想拿嵌入式Linux冒险的开发场合,WinCE是最合适了(找嵌入式Linux的人可没那么好找的),毕竟公司不能像学生学习那样试试看,保证开发成功更重要。根据不同的侧重点 ,WinCE还有两个特殊版本,一个是MS PocketPC操作系统专用于PDA上(掌上电脑),另一个是MS SmartPhone操作系统用于智能手机上(带PDA功能的手机),两者也都属于WinCE平台。在PDA和手机市场上,除WinCE外,著名的PDA嵌入式操作系统还有Palm OS(因出现很早,很有名)、Symbian等,但在WinCE的强劲冲击下,Palm和Symbian来日还能有多长?同学学过VC++后再学WinCE,非常方便自然,通过学习WinCE同样也可了解嵌入式软件的一般开发过程,对Linux有惧怕心理的同学也很合适。很显然,嵌入式Linux永远不可能替代WinCE,而且将来谁占份额大还很难讲,毕竟很多人更愿意接受MS的平台,就像各国政府都在大力推LINUX已好长时间,但你能看到几个在PC机上真正使用LINUX的用户?据我观察,目前在嵌入式平台上,LINUX是叫得最响,但还是WinCE实际用得更多.嵌入式LINUX可能更多地是一些有长远产品计划的公司,为降低成本而进行长远考虑.WinCE和多媒体(如MPEG技术)是微软亚洲工程院目前做得较多的
项目领域之一,现在社会很需要精通WinCE的人。现在有WINCE的智能手机,金山词霸、WORD、EXCEL、REGEDIT等居然都有smartphone版的,PC上的MP3、DOC等居然在download时都可被自动转换成smartphone格式,很爽的。完全可用Windows CE自己开发一些需要的程序download到自己的手机上。现在市面销售PDA智能手机火爆,MS总是财源滚滚。
总结关于嵌入式操作系统类课程,若你觉得自己功底较深且能钻研下去,则可去学嵌入式Linux;若你觉得自己VC++功底较好且想短平快地学嵌入式开发,自学WINCE是非常好的选择。
(3) 嵌入式开发的相关领域
搞嵌入式若能熟悉嵌入式应用的一些主要领域,这样的人更受企业欢迎。主要的相关领域包括:
A、数字图像压缩技术:这是嵌入式最重要最热门的应用领域之一,主要是应掌握MPEG编解码算法和技术,如DVD、MP3、PDA、高精电视、机顶盒等都涉及MPEG高速解码问题。
B、通信协议及编程技术:这包括传统的TCP/IP协议和热门的无线通信协议。首先,大多数嵌入式设备都要连入局域网或Internet,所以首先应掌握TCP/IP协议及其编程,这是需首要掌握的基本技术;其次,无线通信是目前的大趋势,所以掌握无线通信协议及编程也是是很重要的。无线通信协议包括无线局域网通信协议802.11系列,Bluetooth,以及移动通信(如GPRS、GSM、CDMA等)。
C、网络与信息安全技术:如加密技术,数字证书CA,以及各种网络安全设备,包括硬件防火墙,入侵检测IDS,还有防毒墙,IPS等,中国在这方面还是没有自己优势的,我们陈院长好象正在往这方面发展.
D、DSP技术:DSP是Digital Signal Process数字信号处理的意思,DSP处理器通过硬件实现数字信号处理算法,如高速数据采集、压缩、解压缩、通信等。数字信号处理是电子、通信等硬件专业的课程,对于搞软件的人若能了解一下最好。目前DSP人才较缺。如果有信号与系统、数字信号处理等课程基础,对于学习MPEG编解码原理会有很大帮助。
(4)嵌入式开发的相关硬件基础
对于软件工程专业的学生,从事嵌入式软件开发,像数字电路、计算机组成原理、嵌入式微处理器结构等硬件课程是较重要的。另外,汇编语言、C/C++、数据结构和算法、特别是操作系统等软件基础课也是十分重要的。我们的主要目地是能看懂硬件工作原理,但重点应是在嵌入式软件,特别操作系统级软件,那将是我们的优势。我们的研究生里有些是学电子、通信类专业过来的,有较好的模拟电路和单片机基础,学嵌入式非常合适。
嵌入式本身就是从单片机发展过来的,只是单片机不带OS,而现在很多嵌入式应用越来越复杂,以至不得不引入嵌入式操作系统。另外,为追求更高速的信号处理速度,现在在一些速度要求较高场合,有不少公司是将一些DSP算法,如MPEG压缩解压缩算法等用硬件来实现,这就涉及到HDL数字电路设计技术及其FPGA/IP核实现技术,这方面的人目前市场上也很缺。
(5) 题外话
另外,能写驱动程序的人目前是非常紧缺的(驱动程序也可归于嵌入式范畴),包括桌面Windows中的DDK开发环境和WDM驱动程序。公司每时每刻都要推出新产品,每一个新产品出来了,要能被操作系统所使用,是必须写驱动程序的。写驱动程序就必须掌握操作系统(如Windows或Linux)的内部工作原理,还涉及到少量硬件知识,难度较大,所以这方面的人很难找。想成为高手的同学,也可从驱动程序方面获得突破。不过听做这方面的朋友说,做过以后,你会发现也并不是怎样难的。其实搞驱动程序的工作是很舒服的,搞完一个版本就会空一段时间,只有等公司新的芯片推出或新的OS出现后,才需要再去开发新一版驱动。
www.myembed.com  这是我们这届的几个嵌入式方向的同学做的网站,上边有许多资料免费下载的.
在GOOGLE网上能搜索太多的关于嵌入式系统的讨论了,介绍给大家一个http://www.embyte.com非常不错,有很多有经验者谈自己的体会,投入到其中的论坛中,你会切身感到嵌入式学习的热潮。要么走ARM+WinCE,要么走ARM+LINUX,要么走ARM+VXWORKS。每个搞嵌入式的人都可选一条路,条条大路通罗马。
4、软件开发等其它方向
这是所有方向的基础学科,也是最好的方向,因为可以非常灵活的选择应用领域,学点嵌入式就可以去做嵌入式系统的应用软件开发,学点网络与通讯就可以去做网络方面的研发,这也是我所说的方向其实要与具体应用结合。无论网络还是嵌入式都会与具体现实应用结合,除了纯硬件,否则核心都是软件开发。
算法是北大非常有名的屈老师讲,她讲课的经验实在太丰富了,如果有兴趣可以考虑。陈向群老师在操作系统界也是非常有名气的,她的操作系统高级内容丰富,认真学也会有相当的收获的。李素科老师的经典课程INTERNET高级编程我就不多说了。软件开发的课或多或少我们肯定会接触到的,各位心中一定要记得应用的方向,然后再去选课。各科交叉得其实非常紧,应用也需要许多交叉学科的知识,这时候要不断的调整二只眼睛,不论是望远镜还是显微镜。
别的方向我其实就不太了解了,象管理与技术,我经验不够,又没学过管理,虽然想往管理方向走,但我觉得纯管理的应该不是我们的方向吧?但是IT企业里的许多经理确实是没什么技术背景,我实习公司的经理就不是学理的,但这种人往往有复杂的背景,而且如果有了一个这样没技术背景的,公司里别的经理就一定要有技术背景的了,所以纯管理的只能去那些公司里多数是技术牛人当经理的地方,这是我的看法。我觉得现在二种经理都缺,但更缺的是有技术背景的,因为纯管理的各个学校都有很多研究生,选择余地很大,
人家来软院应该是为了找懂技术的管理者吧?这是我的看法,不一定对,请大家指正。
集成电路我也不是很懂,不过它与嵌入式系统的关系会多些,有许多嵌入式系统要用到各种ASIC、FPGA还有SOC,集成电路也是非常急需的专业,上海某大学号称其集成电路专业工程硕士研究生毕业后如果年薪少于7万还是几万,退学费,可见这行的前景有多好了。有条件懂硬件的同学可以考虑这个方向,但是好象真正的高手也不容易当的,只是我实在无法给出更多的建议了。
网络安全不知道现在还算不算一个方向,这个涉及的领域也很多,比如一个硬件防火墙,要有嵌入式处理器做核心,要对网络有很深的了解,要有网络编程,扫描算法,甚至正则表达式、文法与自动机的理论都会用上,是个很大很复杂的领域。但是社会是真需要,特别是我们社会主义中国,对网络安全要求比别的国家更高,现在好多博士和教授都在转向研究网络安全,各位如果有这个志向也是很好的。微软现在找人一个是测试,一个就是网络安全方面,当然它比较狠,直接整个公司整个公司的收购,以至于全球几大网络安全
厂商的股价一直在大跌。以前我们学院VC是由潘爱民讲的,后来听说微软给强行挖走了,去微软做网络安全方面的东东了。不过接替潘老师的王亚沙老师也是非常优秀的,他讲课我最服的是他讲得非常幽默风趣,让你睡意全无:)当然,他讲得确实好啦!
数字艺术的我就更不懂了,我没什么美感,也不会享受与欣赏艺术,各位数字艺术的朋友,对不起了。
(看累了吧,休息一会儿,看会儿广告吧)
(新增游戏方向介绍,数字艺术的可参考)
将游戏软件人才称为数字媒体软件人才可能更好听些,包括游戏软件策划(最缺游戏策划的人)、游戏软件美术设计、游戏软件程序设计等多方面的人才,对软件学院,游戏软件程序设计当然是最合适的了。
游戏软件人才的确目前很缺,听说很多游戏软件公司苦于没新人才补充,特别是没有高手补充,不得不相互挖人才,以至将游戏软件人才身价越抬越高。网上说日本教育部刚刚批准成立了日本第一家专门培养四年制游戏软件人才的本科大学。其实国内很多大学,特别是软件学院都有搞游戏软件人才的设想,但目前很少有做成的,主要原因是找不到能上游戏软件课的教师,听说有个学校只能花很大的价钱从Korea找老师来上课,果真缺到此等地步?
已有很多青少年沉湎于网游而颓废的实例,好在还不至于上升到制造精神鸦片的高度,所以开发游戏软件的人也不必每日惭悔(但开发儿童益智类游戏软件的人是不需惭悔的),如果想想这是为发展民族软件产业做贡献,那反倒是一件有意义的事情了。不过听一家游戏软件公司的老板讲,搞游戏软件开发是非常辛苦的。
若想自己创业,搞搞游戏软件是不错的主意。现在网上网站或公司都在收购游戏软件(特别是手机游戏软件,因为手机游戏用户可选从网站上download到手机上,不像网游那么复杂),按download次数分成或一次性收购的都有。我们的同学在校期间是否也可发点小财?搞得好,说不定可卖到国外网站,直接挣$$$呢。
大致游戏分成以下几类:
(1) PC类游戏,包括单机和网游。这类游戏开发平台基本上都是基于VC++和DitrectX(如DirectShow,DirectDraw,D3D等,DirectX资料可直接到MS网站上查)。DirectX和OpenGL是两个主要的图形标准,OpenGL跨平台(Unix/Windows上都可跑),尽管很多搞研究的人对OpenGL赞不绝口,将DirectX骂得一文不值,但事实是,在Windows平台上,DirectX是最快最方便的,所以在Windows平台上的游戏还是DirectX当家。
(2) 手机游戏:目前手机游戏主要开发平台有两类:
第一类手机游戏是J2ME平台(Java 2 Micro Edition),J2ME本是为嵌入式平台设计的Java,但由于Java生来就需要Java虚拟机(JVM)来解释,所以在嵌入式产品很少用J2ME(太慢太耗内存)。但在手机游戏中J2ME倒有用武之地,我想这可能主要是Java可跨OS平台的原因,因为手机的OS是千奇百怪的。我对J2ME完全外行,但上次听Square Enix公司的人说,J2ME与我们同学学过的J2EE还是有较大差别的。据我所知,目前手机中用的较多的是KJava语言,KJava是运行在一种叫K Java Virtual Machine的解释器上(K JVM是SUN早期为演示J2ME在嵌入式系统应用而开发的一个虚拟机),所以将在K JVM上运行的J2ME叫KJava。尽管SUN说今后不保证支持K JVM,将开发新的更高性能的J2ME虚拟机取而代之,但由于KJava出现较早,很多早期的手机游戏软件都将K JVM假想成J2ME虚拟机的标准了,所以目前有大量的KJava手机游戏软件存在,而且还在用KJava继续开发。特别是日本的手机游戏软件由于开发较早(像叫什么docomi的日本最大的电信运营商手机游戏搞得很火),多是基于KJava的。所以目前市场上在招聘手机游戏软件人才时,很多要求掌握KJava。有关J2ME请到Sun的网站上找资料。
另一类手机游戏是BREW平台,BREW是美国高通公司(Qualcomm,CDMA核心技术都是该公司开发的,有无数移动通信技术专利)发明的,据说可编译成二进制代码,那当然快了。主要的开发语言是C/C++。但迫于被指责为较封闭的压力,目前Qualcomm已推出BREW平台上的J2ME虚拟机(但可想像那将是怎样慢的速度)。Qualcomm搞定了很多手
机制造商签定BREW授权许可协议,最狠的是Qualcomm与中国联通绑在一起大堆基于BREW的手机游戏,所以有些公司招聘时要求掌握BREW也就不奇怪了。
将来谁会更火,我估计随着手机硬件资源的不断提高,不会在乎一个JVM的开销,J2ME应更有前途,毕竟它是更开放的。
(3) 专用游戏机:如电视游戏,XBOX等,我不太了解,不过这些游戏也太偏了。
同学可看大宇资讯股份有限公司对网游和手机游戏的人才需求,很有代表性。从中我们可看出,游戏公司对人才
的需求主要是以下技术:
(1) 计算机图形学,特别是3D编程与算法,包括DirectX或OpenGL。开发平台是VC++/DIRECTX或KJAVA。
(2) 公司说,手机游戏因手机资源有限,必须对图像进行压缩,所以若有一些图像压缩算法知识比较好。像若能有MPEG压缩算法较好,手机上采用的是比MPEG压缩得更狠的一些特殊算法,但触类旁通。
(3) TCP/IP Socket编程是搞网游开发的人必须掌握的。
(4) 人工智能知识:复杂游戏可能需要一些AI算法。
(5) 网络与信息安全知识:网游要防外挂。
有些公司的网游服务器是基于Linux平台的,所以还提出了对游戏服务器端软件工程师的技术需求(精通MSSQL、ORACLE、MYSQL等数据库,精通Linux Programming,特别是Socket编程)。还有对维护游戏网站人才需求(ASP .NET和数据库)。详细请同学自己看服务器。注意一条,最好有自己的游戏软件作品,若你应聘时能带一个DirectX作品,那将有多强的竞争力,所以最重要的是现在就要行动,实践,实践,再实践。
关于游戏方向,目前,会VC++的人本来就不多(现在很多年轻人都去追时髦的Dot Net来了,VC++因难学,所以人就少),会DirectX的人就更少了,这正是我们的机会。
最重要的是什么呢?
昨晚李明曾经教过大家一个游戏,左右手的游戏,说明一件事情,那就是我们其实并不一定很了解自己。人生的这些选择应该要先了解自己,然后再去决定。许多人拼命打听别人选什么方向,选什么课程,别人和你是完全不同的,他们不知道你过去,不知道你的兴趣,和你完全不同的经历和背景,没有太多可比性。所以不如多花些时间想想自己到底喜欢什么样的生活,别人不能代替你,不管现在流行什么技术,不管哪个专业学好了都会很赚钱的,所以没必要去那么急功近利。路遥知马力,日久见人心,重要的是你做的决定是负责任的,是自己的决定就OK了,别的事情你把握不了。今天有了这样的理想,就去实践就去追求,也许路上发现错了,也可以改目标的,当然尽可能少改会比较省时间,但其实也无所谓了,人活着干任何事都不会白干的。你会在这里增长许多知识和见识,会认识许多大师级的人物,会有许多真心的朋友,会有难忘的回忆。身心健康,开心生活,有非常好的人际关系难道不比选什么课选什么方向更重要吗?别在匆忙的现实生活中迷失我们自己的兴趣,我希望你们不要随波逐流,希望你们每个人都活出真我的风采!
好了,现在选什么,你们自己决定吧,重要的是你们已经来了软院这个大家庭,已经翻开了人生更美丽的一页,前面的路你只需要自信的走下去就好了。COME ON,LET‘S GO!
大家如果有什么问题,可以提出来,我们一起探讨。我觉得选课选方向要根据自己的长期打算和短期目标来选择,课都是好课,不管老师教得怎么样,我们已经是研究生了,不能全指着老师手把手带我们。我也不会告诉你们选什么方向好,选什么课好,因为我不是你!我不知道你的感受,我负不起这个责任,这个责任是你们自己要承担的,所以我不可能替你做任何决定。不过,有什么我可以帮你们的我还是会尽力的。
(根据这二天几位慕名而来的新生粉丝的关于以前没计算机背景如何选课的问题,好象是一个比较有共性的问题.我觉得因为他们刚进入这个领域,可能会有许多东西要学,可能对他们来说选择真的很困难,但我还是要说,我真的不能为你们做出这个决定,因为各个学科各门课之间到最后的应用时都会有交叉,你们一定不要图多图快,我说过,不要随波逐流,不要急功近利,要一点点来,最重要的是其实是你对IT业的理解能力,是一种学习能力,
一种很快接受新技术,适应新环境的能力,这才是你在这一年中最关键的侧重点,哪门课哪个方向与之相比真的不重要,因为不仅你们没计算机背景的就算有计算机背景的也不可能把所有的课程都学精学透,这是不可能的.我也只是懂得点皮毛,看上去好象懂不少,其实我说的这些技术有许多我也只是知道个大概而已,要想达到这种程度真的不难,难就难在入门.万事开头难,你们现在只需要多积累一些相关知识就好,不懂的就上GOOGLE上去查,我们这届有许多本科没有计算机背景的,后来实习和工作也都不错的,所以你们要有稳定的心态,多看书和资料,积累领域和相关技术知识,这是一个成长的过程,不会因为我说哪个课好,哪个方向好就会给你带来帮助,就像爱的代价一样,人终归要自己去亲身经历成长才行,学软件开发也一样,你们要积累理论与实践,然后就会成长,就会找到心中的梦,找到如何实现梦的方法.学习的过程,以及学习过程中得到的能力才是最重要的!!这一点我本应该早点提醒各位的,但现在提醒也不迟,祝新生在软院的生活是充实、快乐和精彩的!)
谢谢各位耐心的看完!
 
阅读全文(2421) |评论:0 |复制链接
JAVA学习之路(2006-1-31 22:12:00)
学不可以已——我一年Java之路的回顾,反思以及展望(转自csdn)
点击数:2701    发布日期:2005-9-11 23:03:00
【评论】【打印】【收藏此页到365Key】
Tag:程序人生
学不可以已——我一年Java之路的回顾,反思以及展望
作者:汪瑜佯    来自:CSDN
大约就是在去年的这个时候吧,Java这个字眼就开始占据了我学习计划中的重要席位,从那时候那杯冒热气的咖啡一直陪伴我到今天。也不知道当时为什么要学习Java,又是为什么选择了Java。因为我记得当时的我,心中所想和现在可谓是大相径庭!那时我曾天真的想着,我将来学管理,你们这些学计算机的人出来也难逃给管理界人士做下属的命运,现在想来,那时是多么的无知和幼稚,我怕现在的很多大学生,更确切的说很多像我们专业――信息管理与信息系统的同学都还抱着这样的想法(当然也不排除很多立志学习金融以及管理的同学^_^)!
其实在蔡学镛先生的Sleepless in Java中也就说过,他在上大学的时候,有两类同学错误的认识,第一种就是瞧不起基础课,觉得学的什么Data Structure,Operating System,Database Concepts没用,以为会VC,VB,SQL Server的就真的能成为众人羡慕的IT白领了;第二种也就是我刚才所说自己犯的错误,真以为那些写程序的人将来入了社会会被那些学管理的人踩在脚下!第一种是短视进利,第二种呢就是好高骛远!在犯了第二种错误后,值得庆幸的是,我对第一种错误总是避而远之!
记得我在网上搜索了很多资料,最后终于锁定两本书作为我的入门教材的入选书籍,一本是《Core Java》,另一本就是《Thinking in Java》了。但是因为当时网上说《TIJ》中文版翻译的不尽如人意,于是我就选择了《Core Java》,现在真觉得当时选择是对的,就我那会的基础根本看不懂TIJ,而《Core Java》是属于教科书风格的书,于当时的我比较适合。随着我翻开《Core Java》的第一页,我就正式踏上了Java之路!
当初我在刚学习Java的时候,我无论对Java还是程序设计都是不折不扣的门外汉,我看《Core Java》第一章的时候完全是如履薄冰,一大堆技术名词搞得我晕头转向的,什么分布式,多线程,GC…,虽然现在看来是非常自然而顺畅的,但在当时可以说是我前面的一座高山,其实,那些技术名词根本不用看,慢慢的学,学的那儿自然就不言而喻了!现在看CSDN上初学者恨不得一开始就把所有的名词全部搞懂,从J2EE,J2ME,EJB,JMS,CORBA,JXTA…..就我觉得,这些都是图增烦恼,而且根本对真正的初学者即使你知道你也无法理解。紧接着,喜马拉雅到了,设置环境变量,classpath的设置是我当时最感郁闷的东西,相信现在的初学者对于此道还是一样的,确实还是Microsoft的东西比较好用^_^,门槛很低,不至于吓退初学者!你要知道,一个没有path概念也没有UNIX背景的初学者要设置以及弄明白为什么这么设置真不是一件容易的事,而且主要是书上说的很模糊,而且当初我学习的时候环境并不好,因为我周围的同学并没有学习Java的,我无处可问,惨啊……!我虽注册了一个CSDN的帐号,可是很少上论坛,现在想来,如果当时能够好好利用CSDN的资源,也不用走这么多弯路了!也不知道当时在什么地方找到这个配置方法,终于解了我的燃眉之急。随后又听说JCreator是比较好用的IDE,下载了一个2.5版的,用了过后发现果然不错,至少不用每次都用console来编译运行,翻过这个classpath这个拦路虎过后,此后的平原就比较开阔了,但当时只是感觉上好像自己学习的比较轻松,其实有很多东西没有学扎实,以为自己懂了!打个比方吧,我直到快学完《Core Java》第一本书的时候我才在《Java in a nutshell》上面知道什么是class method,什么是instance method!
因为我没有什么C++基础也更谈不上什么Lisp,Smalltalk背景,所以《CoreJava》的tips或者要求C++程序员注意的一些pitfalls,我都跳过没读,不过就我现在的C++水平来看那本书,如果利用这些annotate对于一个从CPP转到Java阵营的Programmer来说是非常有帮助的。
2003年的寒假《Core Java》的第一本就伴随我度过了一个懵懂的春节,当然这段时间《程序员合订本》对我的帮助是很大的,不仅在技术上教会了我许多东西而且也使我得知识面拓宽了不少!在寒假的时候我在网上固定的生活方式就形成,每天一打开Browser,首先打开CSDN然后打开Sina,CSDN的论坛也成了我经常光顾的地方,当时看着CSDN Java板块的那些牛人红星闪烁的,觉得特别羡慕!于是我也开始回答问题以挣取专家分,不过就那会我的知识实在太过匮乏,混了整整一个寒假,也就到了三个裤衩^_^,不过也在CSDN学到了很多东西!那段时间虽然进步不大,不过却是很值得怀念的!在假期中我还学过一点的JSP/Servlet,不过,没有深入的学习,而且对web application的理解也很浮浅,所以学了等于没学!给我印象最深的就是Tomcat运行Servlet的配置了,那个其实就很简单的web.xml文件,真不明白当时怎么搞了差不多一天才出来,急的在CSDN上面连连发帖子问…
看完《程序员合订本》,我基本对Java领域的好书有了一些了解,随后我知道了china-pub,知道以后买书之前要上那儿去转转,看看书评。再回学校之前,我列出了要买的一些书的清单,费用差不多到500RMB了。从家里一回学校,那500元也就众望所归的换成了N斤的质量良莠不齐的纸张了,这些纸张还真不能对等成知识!我记得那次书籍大采购中有用的书就只有这几本《Java in a nutshell》,《Effective Java》,《Thinking in Java》(E),《Java与模式》(在我看《Design Pattern》以前:)),《A breif introdution to Data Structure and Algorithm Java Edition》,《Core Java:VolumnII:Advanced Feature》!其他的么,唉,可惜啊……
随着大三上学期的开始,也就开始了DS的学习,我使用的教材就是上面提到的那本书,对基础数据结构和算法的学习让我也慢慢重新开始认识程序设计认识Java,我记得梦魇先生在合订本中给《The STL Annotated Source》写推荐的时候说过:作为一个程序员,如果你是做数据库编程的,大可以不懂汇编语言,如果你是写驱动程序的,大可以不必通晓人工智能,写编译器的可以不用懂什么计算机图形学,操作系统内核高手的不用精通网站架设,然而,如果你不懂数据结构与算法的基础知识,不具备数据结构与算法的基本技能,那就完全丧失称为一个程序员的资格!这就足以说明DS的重要性!(DS真的很重要,林斌在《如何编写优秀的程序》讲座中也特别强调,安安注)
看着CSDN上面蔡学镛老师的专栏,也在一期一期的程序员中看着他的文章,特别是有一篇叫做《我所知到的O’Reilly》,慢慢我对O’Reilly的书籍的感情与日俱增,O’Reilly的网站也成了我经常出没的地方了,那段时间我买了不少O’Reilly的书,因为O’Reilly俱乐部有会员的活动,好像是积分多少可以免费送一本50或者60以下的书,主要是这几个价格是O’Reilly的中文本比较喜欢订的价格,49,59,69,75,85….当时我好像一共买了6本,关于Java方面我觉得比较好的就是一本同样是David Flanagan写的《Java Example in a NutShell》,另一本就是《Java Cookbook》!随后有资格获得一本60元以下的书籍,后来我千调万选选了一本《DNS与BIND》(3E)(其实我拿这些书根本就没用:)) 59元,O’Reilly的工作人员非常热心,首先告诉我则本书已经出到第四版了,但我告诉他我赠书的上限只能到60而则本书要69的时候,他告诉我一样可以赠给我,当时可把我感动死了!^_^随着我看的O’Reilly的书籍不断增多,我看O’Reilly的书也形成了一个独特的看法,没拿着一本O’Reilly的书籍,我一般是看封底的介绍,介绍则本书的内容以及一些权威人士对这本书的评价,大家都知道,O’Reilly的书籍封面都是一只动物, Java系列的代言人是Tiger,而且Java系列的书都是紫色的!随后我会翻到最后几页看封面的动物是什么,然后看作者的介绍,最后才开始进入正文!那段时间也就形成了一种特殊的O’Reilly情节!
大家都知道,O’Reilly的In a nutshell series一向是品质的代名词,刚开始看的时候我实在困惑为什么O’Reilly要用XXX in a Nutshell命名,后来有一个躺床上午休的时候突然想起以前高中的时候看过Steven Hawkings的一本书叫做《Universe in a nutshell》(果壳中的宇宙),就连Universe都in a Nutshell更何况其他东西呢,所以技术手册包涵范围之广,知识之全,可以说是可见一斑!
上半年刚开学的时候,我就以为自己对于《Core Java:VolumnI》已经理解透彻了,然后就开始看VolumnII了,而且在同时还在看《Thinking in Java》(E)为了进一步巩固基础,不过在此之前我大致看了一下《Java in a NutShell》,也从前面的介绍中学到了很多我漏网的知识,就像上面所说的class method和instance method,还有对Java这个paltform也有了一些理解。不过开始读VolumnII的时候,第一章就把我绊倒了,线程?什么东西,因为当时没有学习OS,所以要理解线程的概念以及理解线程同步太过困难了,而且其中夹杂了一些AWT和Swing的一些应用,因为我在学习VolumnI的时候对于GUI就不太重视,觉得GUI既浪费时间而且也学不到太多东西,而且还比较麻烦,对于GUI的观点我一直持续到现在,唯一不同的只是现在认为Java的Swing是学习Design Pattern的很好的例子!
慢慢在学习VolumnII过程中,我愈发的感觉到基础的薄弱,于是我又拿起VolumnI,复习了一遍,发现又有新的收获,我学习就这样,我只要学习偶有所得便喜不自禁的^_^,如今我同样不定期的复习以前看过的书籍,以寻求新的收获。同时我也开始了《Thinking in Java》的学习,我以为,我已经看过《Core Java》的VolumnI了,按道理读《TIJ》应该是轻车熟路,应该没什么问题,但当我开始翻开第一章开始看的时候,又给了我当头一棒,看不懂,特别是后面那些关于Software Engineering的东西,不过到现在我还不怎么了解后面的东西:)
所以我觉得初学者读这本书的时候第一章根本就应该跳过,不然就是给自己找罪受,我依然记得看不懂书那郁闷的心情,不仅这个心情影响你其他的学习,还打击你学习Java的积极性!而且由于我看的是E文的,有些意思还是把握的不太准确,所以我就借了一本同学的中文版的《TIJ》,(他是在我的鼓动下买的这本书:)),而我那本E文的也就没怎么看了!这本书就是候捷老师翻译的了,说着候老师翻译的书籍,我又不得不发一些牢骚了,现在我看技术书籍,慢慢的就习惯了网上所谓的候捷风格,不过这种风格我甚是喜欢。
第一,字体排版都让人看着很舒服,而且行与行之间的间隔,还有正文与书边的间隔都是恰到好处,很多书排版的满满的,看似节约纸张,但是给学习带来了很大的不便,“为智者所不取”^_^,比如我现在正在看的那本《Inside JVM》的间距就非常小,写个旁批都写不下。第二,就是翻译了,翻译的学问就大了,国内很多的技术书籍都翻译的还是中规中具的,并没有从语言上润什么色,这种书即使内容很吸引你,但是不算是你能够品味的好书,对于这种书,你只有从原著中找到乐趣拉!比如前段时间我看的那本《Mastering EJB》的中文版….,候老师的书的语言功底我是非常认可的。然后就是翻译到个什么度最好,又很多技术书的译者恨不得把每一个词都翻译的滴水不漏,我个人认为是过犹不及,保留原有的技术名词无论对你以后阅读英文书刊,阅读Specification,还是理解原书的意思都是非常有帮助的!我认为就应该像候老师的书中所保留的那些比如stack,heap,interface,polymorphism,inheritance,reference,primitive这些东西一看你就知道是什么东西,大脑中也就不需要进行第二次的转换,无疑使你接受信息的速度变快了!这种例子在国内的翻译书籍中很普遍,比如在我年底开始学习C++所买的第一本书《The C++ Programming Language》这本书是北大的裘宗燕老师翻译的,当然这本书翻译的是没有什么问题的,不过正如我前面所说的,这本书翻译的过多了,比如刚开始我看到界面这个词,我一愣,随后才反应过来,原来说得是interface,再比如后面我看到在线函数,我又是一阵迷惑后才知道原来说得就是inline function!在《Inside JVM》中也是如此,第一次看到内嵌函数,直到后面解释才知道还是刚才说得那个冬冬!
关于书的牢骚发完了,又回到TIJ吧,从第二章开始学习的TIJ教会了我很多东西,特别是第四章的Initialization and Clean up,补了很多我在学习《Core Java》中留下的漏洞!所以说这本书是Java领域的一本圣经级的著作一点都不过分!这一学期伴随着SARS,伴随着《TIJ》,《Core Java》,《A breif introdution to Data Structure and Algorithm Java Edition》,我的大三上学期就度过了,其实上学期主要就是加深J2SE基础的学习,而且主要的精力放在DS上面,当然还伴随的一期一期的《Programmer》:),其实在其中我还穿插着一些JSP的学习,我选的当然也是O’Reilly的《Java Server Pages》,其实这本书有些年代久远了,不过讲原理性的东西还是不错,但是我还是觉得当时用这本书根本没有学到些什么东西。因为无论要学习JSP还是了解初步的J2EE构架,还是得把J2SE牢固,把io,net,util弄的非常熟悉,然后再Servlet,JSP的一步一步的学上去!
在放暑假之前,我又去买了好几本书,《Java Network Programming》(看过Bruce Eckel的推荐过后^_^),《Java Servlet》,《Java夜未眠》还有《Borland传奇》随后把这个暑假的学习定了一个计划:继续学习《Core Java》VolumnII,学习《Java Network Programming》,《Java Servlet》,《Java CookBook》以及再次复习《Thinking in Java》(E)。学习《Core Java》VolumnII是为了学习一些高级应用,不过这本书的学习再次止步于高级AWT和高级Swing那儿,我对GUI的确没什么兴趣。学习《Java Network Programming》是为了学习Java中最为重点的网络编程,并且为J2EE打基础,学习《Java Servlet》就更不用说了,也是为了跨向J2EE平台做准备;学习《Java Cookbook》的目的很简单,就多看实例,知道处理一些常见问题的方法;复习《TIJ》就是为了进一步的巩固基础!经过那个学期我就形成了一种观点,基础永远是最重要的,只要把基础学习扎实了,什么东西很快就能学会,触类旁通!所以花更多时间在学习高级的一些应用上面还不如花在基础上面更划算呢!你见过程序设计都没有学好的同学想通过学习《人月神话》,《Peopleware》这些书来达到高手的境界的么?还有些同学光关注程序语言的学习,关注practical的学习,对其中本质的东西确不闻不问!在这里我又想引用候老师的一段话,个中味道自己去品位吧:程式语言是程式员最基础的功夫,必须熟练它掌握它。但若只是如此,编写不出好程式、大程式、专业程式。大家都会说中文,独独有人旁徵博引,左右逢源,字字珠玑,文思隽永,这是为什麽?功夫在语言之外!
语言是首要条件,但不是决胜条件。功夫在语言之外,决胜在语言之外!
在暑假的学习中情况也是像我以前计划的那样发展,首先看的一本书就是《Java Network Programming》,Bruce确实推荐了一本好书,这本书循序渐进并且讲的非常的透彻,学完这本书然后再学习新的net的API以及NIO是非常轻松的,这本书我花了10天看完了,自我感觉好极了^_^。与此同时也每天练习《Java Cookbook》中的代码,这个假期我把那本书的代码全部亲自实践了一遍,正因为如此就积累了很多解决实际问题的办法,所以把这本书叫做Encyclopedia一点都不过分!顺利的学习完《JNP》以后我开始了《Java Servlet》的学习,因为一直以来Java的基础比较扎实而且在上半学期对web application也逐步了解了很多东西,所以学起来是非常轻松的,当时我用的工具是Jbuilder9,省得用Editplus + Tomcat每次写完一个Servlet还要再改xml文件。提到JBuilder,我又想起当初死活不知道怎么破解的时候了,好不容易能使用JB了又不知道怎么弄,Java的那些IDE对于那些初学者来说确实亲和力不如VS系列,但是只要你入了门槛,那么那些工具就让你如虎添翼了!不过JB的庞大以及启动之缓慢确实让很多人敬而远之,虽然它的功能强大,特别是配合Together以及Optimizeit外加配合一张英俊的Blake Stone的照片^_^,不过我倒是更喜欢用Eclipse或者Idea!
不过暑假中收到一封来自O’Reilly的E-mail倒是影响了我后一个月的学习,那是O’Reilly给会员优惠的购书活动,其中很多书都是2折起的,就在那个假期我又一口气购了十多本书,内容覆盖XML,UML,Java,网络,不过只花费了200多RMB,相当于每本书就20多RMB,这在IT图书界而且还是O’Reilly这样有图书质量保证的世界一流出版社是非常罕见的!不过因为买的书实在太多了,我在暑假也看不完,所以在假期的后半段我只读了这几本书,《JDBC与Java数据库编程》,《Java Threads》以及《Enterprise JavaBean》的前2章(因为不太懂,刚踏入EJB的时候又如同步入森林了一样),再加上学习的《Core Java》(VolumnII),《TIJ》,那个假期我不敢说我有很大的进步,只是我觉得熟练度增加了,基础知识也算比较牢固了!
(附:其实当初买的那些书,除了上述三本其他都没看,害我后来没办法只有再低价出手。经过这一堑,我明白了,对于计算机图书,它不是《四书五经》可以拿来收藏,可以传给后世(当然也不排除有乐于此道的同学),要买书只能买最近要看的书,买来一本就就要订一个这本书的学习计划,至于于你没用的书,正如我当初买的DNS的,网络的,即使很经典,很便宜就算是白送于你,也没有两卷卫生纸来得实在^_^)
说到上个暑假,还有不得不提的事就是沉迷于CSDN的论坛中。早在暑假回家之前,除了那些学习计划,我还有一个目标就是一定要在CSDN的Java板块变成一个红星,因为那个时候我觉得红星就是技术水平高的代名词(一般初学者才有这个想法^_^),所以那个假期在CSDN回答问题可以用一个疯狂来形容,当时基本上事每一个帖子都有我得足迹,每天泡CSDN就5,6小时,分数确实是扶摇直上,但是我很清楚,能力并没有向专家分一样涨的那样的飙升!很快,不到一个月的时间,5000分就够了,看着自己名字后面的红星,可以说是喜不自胜^_^,心想Java我也算入门了!当时有感于Java基础板块的入门和基础问题在不同的时期要被不同的人重复提出N次,而且想起我入门的艰难,我就写了一篇初学者入门的帖子,列出了初学者提问频率最高的4个问题(至少当初我在前3个问题上面都栽过跟头)。1:环境变量 2:Servlet的配置 3:Java连接数据库 4:书籍推荐!后来时常看见自己的文章想,我当时要有这样一篇文章,也不至于……
回到学校,慢慢的,对CSDN论坛的热情也就淡了,不过每天打开浏览器第一个上的还是CSDN,可能这已经在我得生活里面成为定式了。就像我说,其实我每天上网也上不了多久,也就收收邮件,看看新闻,上上论坛。但是要一天不上网就觉得特别别扭,这已经固化为一种生活方式了!
如果说在升第二颗星之前我还有些许动力泡论坛,这点动力随着Converse旁边多了一颗星后就基本消失了,而且因为平时学习实在太忙了,所以每次即使上论坛也只是上会非技术版!更多上CSDN还是去看文档中心,因为每隔不久,就会有些非常好的文章可以学习。除此之外,另一个宝库就是IBM开发者网站了!
在下半学期我给自己树立了两个目标:第一就是进军J2EE阵营,其中首先准备攻克EJB,当然首选教材便是O’Reilly的那本《Enterprise JavaBean》,不过这本书委实太老了,书中讲的都是EJB1.0和EJB1.1。
EJB的实践环境要比一般的J2SE的程序配置高多了,我当时用的Weblogic8.1 + Jbuilder9 + SQLServer, 用JB开发EJB是非常方便,自己只需要添加很少部分的代码就行了!不过因为这样的配置造成机器的速度比较慢,所以我在学习EJB的时候并没有写多少例程序,主要集中在原理的学习!
另外一个目标就是设计模式的学习以及应用,希望能够脱离语言的层面,说这话只能是贻笑大方,因为脱离语言层面谈何容易,我得实践经验太少,光靠理论以及玩具级代码的练习要达到这个目标简直就是痴人说梦!不过9月份我确实开始了对模式的学习,选的书正是网上评价很好的《Java与模式》,不过这本书我只看了很少的部分,原因有二,第一这本枕头一样的书籍不便携带,也不便翻阅;第二,书中简单的代码占了大部分的篇幅,而且感觉有点累赘,或许因为我对东方文化孤陋,所以阎博士举的一些例子,反倒使我迷惑了!
但是9月份我却看到了另一本好书,《Effective Java》,Bloch不愧为Java社区中声誉极高的一个人物,这本书第一遍看的时候我就已经觉得就Joshua在这一条一条的建议中,就把Java编程的精髓透于纸上,这本书于我得震撼超过当初看TIJ的感觉,也可能是因为当时看TIJ的时候没理解其精华,也可能那些东西接触多了就没什么新鲜感,认为是理所当然的。正如我后来学习CPP的时候,见书上描述神奇的Polymorphism的时候没什么感觉一样!这本书在已过的这个学期完整的读过3遍,而且平时一有闲暇时间又在读这本书,感觉每一遍都有新的收获!
其实刚过去的这个学期在Java上我花的时间很少,写程序代码的时间就更少了,写的程序主要还是Java选修课和操作系统的作业^_^,因为我总感觉敲代码太费时间,实践所学到的东西根本不比我看书所学到的东西,当然我知道这是错误的,可是心里就有这种倾向!其实,蔡学镛的夜未眠中有这种境界,就是实践所能学到的确实不比看书所获取的知识多,我虽没达到却有这种错觉,可笑……
可能因为《Effective Java》给我的感觉太好了,我又买了两本主题差不多的书,一本是《Practical Java》,另一本是《Java Pitfalls》,前者深度上不及《EJ》,后者又涉及太多GUI的东西了,不过,总的来说,这两本书也让我学到了不少的东西!我坚信,多看点书始终对自己是有好处的^_^
《Mastering EJB》是我上个学期读的最后一本关于Java的书籍,我是把这本书的中文版和英文文档concurrently读的,不过也辄止到高级主题那章,因为慢慢的,我就暂时不准备向J2EE发展了,因为这些我都把他们叫做应用型的,如果你不出来实践那就没什么作用,所以我只是了解一些EJB原理性的东西,开发部署也就不用了解的那么仔细。所以后半期的Java学习还是把重心放在了J2SE上面。进入11月份,除了不时上技术网站看一些关于Java的帖子,从《程序员》,《开发高手》上面看一些文章,还有没事复习《EJ》,就没怎么拿着正式的书籍读过了!主要是因为我把精力全部放在了C++/STL上面了^_^
第一次,在10月份我参加了Java年会,而且这一次真幸运,遇到James Gosling首次访华,更为幸运的是,在James的见面交流会上面,能够和这位Java之父合影,而且那天还幸运的得到了一套Sun赠送的StarSuite!
参加Java年会后,我在11月份又参加了Bea的Dev2Dev开发者大会,反正我觉得就是大会是了解一些概念,要真正学到东西不太可能,那只是拓宽视野的地方,一句话,就是长见识!
反思这一年走过的路,也就是品味学习的酸甜苦辣,我觉得唯一值得称道的就是自己是一步一步坚持走过来,没有放弃!
至于短期内的目标就是学习深入了解JVM,而对于未来的展望,我个人不太喜欢憧憬未来,因为我觉得立足脚下会让我感到充实!
下面几条就是我的反思或者说自己在学习中形成的一些想法,与诸君共勉,希望大家能够提一些学习上面的建议以及纠正我得错误观点:
1.书读百遍,其义自现
我看书就是这样,看书看不懂很正常,技术书籍不是武侠书籍,看不懂没什么好奇怪的!我遇到看不懂的地方,就不会在那儿阻塞太久,实在看不懂我就咕噜吞下去,等到看完这一章或者这一节再回过头来学习,反复的读!我的学习就是一个往返的曲线,不时的会把前面所学过的复习一遍!我觉得就是读过好几遍的书,就像我现在再读《Thinking in Java》,每次都有新的收获,虽然收获一次比一次小吧,但是却不是可以抹杀的!这可能就是所谓的温故而知新吧!
2.勿在浮沙筑高台
这里引用了候老师在《深入浅出MFC》中的一句话,其实贯穿这篇文章我无时无刻不在强调基础的重要性,而且平时这个观念也是deeply rooted in my mind
3.天下大事,必作于细
又引用了候老师的话,学习技术就是要从细处下功夫!看一本书要理解透彻,其实也要分什么书籍了,原理性的书籍那是来不得半点马虎,至于很多应用类书籍,实例类书籍,看过知道在哪儿找就行了!
4.业精于勤荒于嬉,行成于思毁于随
这和本文的题目所要表达的思想是一样的,学习没有捷径,只有刻苦努力不要放弃才能成功!不管前面的路如何,自己只要坚持走,等登上顶峰了,回头一看,自己走过的路就是成功路!不论多聪明,或者有些许的愚顿,都请记住“骐骥一跃,不能十步;驽马十驾,功在不舍”。
5.不积跬步,无以至千里;不积小流,无以成江海
要达到高手的境界,非一朝一日之功,平时要多看,多积累,博闻强识,厚积而薄发才是正道!很多积累就在每天那么几分钟,半小时中。很多同学,我以前也是这样,比如看电影看了一晚上,以前我就想反正都浪费了几个小时了,也就不去自习了,剩下的时间也就再上上网听听音乐什么的就过了!现在就是还剩10分钟我也要去自习室(不过这有一个前提条件,^_^,偶们学校小,宿舍到图书馆很近),因为这几分钟浪费也是浪费了,为何不用这几分钟看看书呢?多看书总是有帮助的!
6.武学之道贵在精而不在多
《天龙八步》中的一句话,其实都是一个道理,打个比方说,鸠摩智对于武学所学甚博,结果和乔峰比呢,乔峰就一个降龙十八掌,可以练到天下无敌!有些同学,今天想学Java,明天想学C++,过了几天又想学习C#,不过到头来还是竹篮打水!其实只要有一样你学精通了(要能称的上是精通,弹何容易啊!),其他的很快就能触类旁通了!
7.闻道有先后,术业有专攻
技术上强人太多了,不过不要妄自菲薄。很多同学,包括我自己在学习过程中都有这种妄自菲薄的感觉,真强啊,我怎么什么都不会!其实没关系,慢慢来,对自己说,汝所到之处,吾亦可至!!
8.天行健,君子以自强不息;地势坤,君子以厚德载物(清华的校训,安安注)
一句话,一条鞭子,鞭策自己前进!
PS:很久以来就想写这样一篇文章,总结自己一年以来的学习,好好看看一年自己走过的道路,也算是封存自己03年的记忆好让以后有所回忆!虽然元旦过后就开始写,但其中写写停停直到今天才把这篇文章完成,如释重负!我个人不善于写作,所以所谓文章也只是心中想到什么也就附之纸上,可能错字别字误用的成语不在少数,之所以发到CSDN也是为了那句话:发表是最好的记忆!
 
阅读全文(5600) |评论:15 |复制链接
电子书网站(2006-1-29 12:24:00)
国内完全免费的电子书籍下载
点击数:121    发布日期:2006-1-27 19:25:00
【评论】【打印】【收藏此页到365Key】
Tag:免费电子书
http://www.vvsoft.net/vvbksd/index.asp
http://download.chinaitlab.com/sort/2_1.htm
http://book.httpcn.com/
http://www.chinesebook.com.cn/bjbookfair/index.asp
http://www.eshunet.com/
http://www.manyi100.com/
http://www.52ebook.com/
http://www.pcbookcn.com/
http://www.itebook.net/download.asp
http://www.ebookcn.net
http://www.chinaz.com/DownLoad/L/8_Lastuptime_Desc_1.asp
http://soft.winzheng.com/SoftList/Catalog_11_SoftTime_Desc_1.htm
http://www.gd00.com/SoftList/Catalog_7_SoftTime_Desc_1.html
http://soft.0zones.com/SoftList/Catalog_10_SoftTime_Desc_1.html
www.ibook8.com  速度快..书齐
www.infoxa.com 速度一般..书很多.
www.netyi.net 速度时好时坏..书最多..可是要积分才能下..
 
阅读全文(2369) |评论:0 |复制链接
计算机科学与技术学习心得(转) (2006-1-18 7:01:00)
乱七八糟] 有些话得打些折扣再听~~~~    计算机科学与技术这一门科学深深的吸引着我们这些同学们,上计算机系已经有近
三年了,自己也做了一些思考,我一直认为计算机科学与技术这门专业,在本科阶段是不
可能切分成计算机科学和计算机技术的,因为计算机科学需要相当多的实践,而实践需
要技术;每一个人(包括非计算机专业),掌握简单的计算机技术都很容易(包括程序设
计),但计算机专业的优势就在于,我们掌握许多其他专业并不"深究"的东西,例
如,算法,体系结构,等等。非计算机专业的人可以很容易地做一个芯片,写一段程
序,但他们做不出计算机专业能够做出来的大型系统。今天我想专门谈一谈计算机科
学,并将重点放在计算理论上。
计算机理论的一个核心问题——从数学谈起:
记得当年大一入学,每周六课时高等数学,天天作业不断(那时是六日工作制)。颇
有些同学惊呼走错了门:咱们这到底念的是什么系?不错,你没走错门,这就是计算机科
学与技术系。我国计算机科学系里的传统是培养做学术研究,尤其是理论研究的人(方
向不见得有问题,但是做得不是那么尽如人意)。而计算机的理论研究,说到底了,如
网络安全,图形图像学,视频音频处理,哪个方向都与数学有着很大的关系,虽然也许
是正统数学家眼里非主流的数学。这里我还想阐明我的一个观点:我们都知道,数学是
从实际生活当中抽象出来的理论,人们之所以要将实际抽象成理论,目的就在于想用抽
象出来的理论去更好的指导实践,有些数学研究工作者喜欢用一些现存的理论知识去推
导若干条推论,殊不知其一:问题考虑不全很可能是个错误的推论,其二:他的推论在
现实生活中找不到原型,不能指导实践。严格的说,我并不是一个理想主义者,政治课
上学的理论联系实际一直是指导我学习科学文化知识的航标(至少我认为搞计算机科学
与技术的应当本着这个方向)。
其实我们计算机系学数学光学高等数学是不够的(典型的工科院校一般都开的
是高等数学),我们应该像数学系一样学一下数学分析(清华计算机系开的好像就是数
学分析),数学分析这门科学,咱们学计算机的人对它有很复杂的感情。在于它是偏向
于证明型的数学课程,这对我们培养良好的分析能力极有帮助。我的软件工程学导师北
工大数理学院的王仪华先生就曾经教导过我们,数学系的学生到软件企业中大多作软件
设计与分析工作,而计算机系的学生做程序员的居多,原因就在于数学系的学生分析推
理能力,从所受训练的角度上要远远在我们之上。当年出现墓窒窒笫牵杭扑慊笛?
的高中数学基础在全校数一数二(希望没有冒犯其它系的同学),教学课时数也仅次于数
学系,但学完之后的效果却不尽如人意。难道都是学生不努力吗,我看未见得,方向错
了也说不一定,其中原因何在,发人深思。
我个人的浅见是:计算机系的学生,对数学的要求固然跟数学系不同,跟物理类差别则
更大。通常非数学专业的所谓"高等数学",无非是把数学分析中较困难的理论部分删
去,强调套用公式计算而已。而对计算机系来说,数学分析里用处最大的恰恰是被删去
的理论部分。说得难听一点,对计算机系学生而言,追求算来算去的所谓"工程数学"
已经彻底地走进了误区。记上一堆曲面积分的公式,难道就能算懂了数学?那倒不如现
用现查,何必费事记呢?再不然直接用Mathematics或是Matalab好了。
我在系里最爱做的事情就是给学弟学妹们推荐参考书。中文的数学分析书,一般都
认为以北大张筑生老师的"数学分析新讲"为最好。万一你的数学实在太好,那就去看
菲赫金哥尔茨的"微积分学教程"好了--但我认为没什么必要,毕竟你不想转到数学系
去。吉米奇的"数学分析习题集"也基本上是计算型的东东。书的名气很大,倒不
见得适合我们,还是那句话,重要的是数学思想的建立,生活在信息社会里我们求的是
高效,计算这玩意还是留给计算机吧。不过现在多用的似乎是复旦大学的《数学分析》
也是很好的教材。
中国的所谓高等代数,就等于线性代数加上一点多项式理论。我以为这有好的一面,因
为可以让学生较早感觉到代数是一种结构,而非一堆矩阵翻来覆去。这里不得不提南京
大学林成森,盛松柏两位老师编的"高等代数",感觉相当舒服。此书相当全面地包含
了关于多项式和线性代数的基本初等结果,同时还提供了一些有用的又比较深刻的内
容,如Sturm序列,Shermon-Morrison公式,广义逆矩阵等等。可以说,作为本科生如能
吃透此书,就可以算高手。国内较好的高等代数教材还有清华计算机系用的那本,清华
出版社出版,书店里多多,一看就知道。从抽象代数的观点来看,高等代数里的结果不
过是代数系统性质的一些例子而已。莫宗坚先生的《代数学》里,对此进行了深刻的讨
论。然而莫先生的书实在深得很,作为本科生恐怕难以接受,不妨等到自己以后成熟了
一些再读。
正如上面所论述的,计算机系的学生学习高等数学:知其然更要知其所以然。你学习的
目的应该是:将抽象的理论再应用于实践,不但要掌握题目的解题方法,更要掌握解题
思想,对于定理的学习:不是简单的应用,而是掌握证明过程即掌握定理的由来,训练
自己的推理能力。只有这样才达到了学习这门科学的目的,同时也缩小了我们与数学系
的同学之间思维上的差距。
概率论与数理统计这门课很重要,可惜大多数院校讲授这门课都会少些东西。少了的东
西现在看至少有随机过程。到毕业还没有听说过Markov过程,此乃计算机系学生的耻
辱。没有随机过程,你怎么分析网络和分布式系统?怎么设计随机化算法和协议?据说
清华计算机系开有"随机数学",早就是必修课。另外,离散概率论对计算机系学生来
说有特殊的重要性。而我们国家工程数学讲的都是连续概率。现在,美国已经有些学校
开设了单纯的"离散概率论"课程,干脆把连续概率删去,把离散概率讲深些。我们不
一定要这么做,但应该更加强调离散概率是没有疑问的。这个工作我看还是尽早的做为
好。
计算方法学(有些学校也称为数学分析学)是最后一门由数理学院给我们开的课。一般
学生对这门课的重视程度有限,以为没什么用。不就是照套公式嘛!其实,做图形图像
可离不开它,密码学搞深了也离不开它。而且,在很多科学工程中的应用计算,都以数
值的为主。这门课有两个极端的:一个是古典的"数值分析",完全讲数学原理和
算法;另一个是现在日趋流行的"科学与工程计算",干脆教学生用软件包编程。我个
人认为,计算机系的学生一定要认识清楚我们计算机系的学生为什么要学这门课,我是
很偏向于学好理论后用计算机实现的,最好使用C语言或C++编程实现。向这个方向努力
的书籍还是挺多的,这里推荐大家高等教育出版社(CHEP)和施普林格出版社
(Springer)联合出版的《计算方法(Computational Methods)》,华中理工大学数学系
写的(现华中科技大学),这方面华科大做的工作在国内应算是比较多的,而个人认为
以这本最好,至少程序设计方面涉及了:任意数学函数的求值,方程求根,线性方程组
求解,插值方法,数值积分,场微分方程数值求解。李庆扬的那本则理论性过强,与实
际应用结合得不太紧。
每个学校本系里都会开一门离散数学,涉及集合论,图论,和抽象代数,数理逻辑。不
过,这么多内容挤在离散数学一门课里,是否时间太紧了点?另外,计算机系学生不懂
组合和数论,也是巨大的缺陷。要做理论,不懂组合或者数论吃亏可就太大了。从理想
的状态来看,最好分开六门课:集合,逻辑,图论,组合,代数,数论。这个当然不现
实,因为没那么多课时。也许将来可以开三门课:集合与逻辑,图论与组合,代数与数
论。(这方面我们学校已经着手开始做了)不管课怎么开,学生总一样要学。下面分别
谈谈上面的三组内容。
古典集合论,北师大出过一本《基础集合论》不错。 数理逻辑,中科院软件所陆钟万教
授的《面向计算机科学的数理逻辑》就不错。现在可以找到陆钟万教授的讲课录像,
http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm自己去看看吧。总的来说,学集
合/逻辑起手不难,普通高中生都能看懂。但越往后越感觉深不可测。
学完以上各书之后,如果你还有精力兴趣进一步深究,那么可以试一下GTM系列中的
《Introduction to Axiomatic Set Theory》和《A Course of Mathematical
Logic》。这两本都有世界图书出版社的引进版。你如果能搞定这两本,可以说在逻辑方
面真正入了门,也就不用再浪费时间听我瞎侃了。
据说全中国最多只有三十个人懂图论。此言不虚。图论这东东,技巧性太强,几乎每个
问题都有一个独特的方法,让人头痛。不过这也正是它魅力所在:只要你有创造性,它
就能给你成就感。我的导师说,图论里面随便揪一块东西就可以写篇论文。大家可以体
会里面内容之深广了吧!国内的图论书中,王树禾老师的"图论及其算法"非常成功。
一方面,其内容在国内教材里算非常全面的。另一方面,其对算法的强调非常适合计算
机系(本来就是科大计算机系教材)。有了这本书为主,再参考几本翻译的,如Bondy &
Murty的《图论及其应用》,人民邮电出版社翻译的《图论和电路网络》等等,就马马虎
虎,对本科生足够了。再进一步,世界图书引进有GTM系列的"Modern Graph Theory"。
此书确实经典!国内好象还有一家出版了个翻译版。不过,学到这个层次,还是读原版
好。搞定这本书,也标志着图论入了门。
离散数学方面我们北京工业大学实验学院有个世界级的专家,叫邵学才,复旦大学概率
论毕业的,教过高等数学,线性代数,概率论,最后转向离散数学,出版著作无数,论
文集新加坡有一本,堪称经典,大家想学离散数学的真谛不妨找来看看。这老师的课我
专门去听过,极为经典。不过你要从他的不经意的话中去挖掘精髓。在同他的交谈当中
我又深刻地发现一个问题,虽说邵先生写书无数,但依他自己的说法每本都差不多,我
实在觉得诧异,他说主要是有大纲的限制,不便多写。这就难怪了,很少听说国外写书
还要依据个什么大纲(就算有,内容也宽泛的多),不敢越雷池半步,这样不是看谁的
都一样了。外版的书好就好在这里,最新的科技成果里面都有论述,别的先不说,至少
是"紧跟时代的理论知识"。
组合感觉没有太适合的国产书。还是读Graham和Knuth等人合著的经典"具体数学"吧,
西安电子科技大学出版社有翻译版。 抽象代数,国内经典为莫宗坚先生的"代数学"。
此书是北大数学系教材,深得好评。然而对本科生来说,此书未免太深。可以先学习一
些其它的教材,然后再回头来看"代数学"。国际上的经典可就多了,GTM系列里就有一
大堆。推荐一本谈不上经典,但却最简
单的,最容易学的:http://www.math.miami.edu/~ec/book/这本Introductionto
Linear and Abstract Algebra"非常通俗易懂,而且把抽象代数和线性代数结合起来,
对初学者来说非常理想,我校比较牛的同学都有收藏。
数论方面,国内有经典而且以困难著称的"初等数论"(潘氏兄弟著,北大版)。再追溯
一点,还有更加经典(可以算世界级)并且更加困难的"数论导引"(华罗庚先生的名著,
科学版,九章书店重印,繁体的看起来可能比较困难)。把基础的几章搞定一个大概,对
本科生来讲足够了。但这只是初等数论。本科毕业后要学计算数论,你必须看英文的
书,如Bach的"Introduction to Algorithmic Number Theory"。
计算机科学理论的根本,在于算法。现在很多系里给本科生开设算法设计与分析,确实
非常正确。环顾西方世界,大约没有一个三流以上计算机系不把算法作为必修的。算法
教材目前公认以Corman等著的"Introduction to Algorithms"为最优。对入门而言,这
一本已经足够,不需要再参考其它书。
再说说形式语言与自动机。我看过北邮的教材,应该说写的还清楚。但是,有一点要强
调:形式语言和自动机的作用主要在作为计算模型,而不是用来做编译。事实上,编译
前端已经是死领域,没有任何open problems,北科大的班晓娟博士也曾经说过,编译的
技术已相当成熟。如果为了这个,我们完全没必要去学形式语言--用用yacc什么的就完
了。北邮的那本在国内还算比较好,但是在深度上,在跟可计算性的联系上都有较大的
局限,现代感也不足。所以建议有兴趣的同学去读英文书,不过国内似乎没引进这方面
的教材。可以去互动出版网上看一看。入门以后,把形式语言与自动机中定义的模型,
和数理逻辑中用递归函数定义的模型比较一番,可以说非常有趣。现在才知道,什么叫
"宫室之美,百官之富"!
计算机科学和数学的关系有点奇怪。二三十年以前,计算机科学基本上还是数学的一个
分支。而现在,计算机科学拥有广泛的研究领域和众多的研究人员,在很多方面反过来
推动数学发展,从某种意义上可以说是孩子长得比妈妈还高了。但不管怎么样,这个孩
子身上始终流着母亲的血液。这血液是the mathematical underpinning of computer
science(计算机科学的数学基础),也就是理论计算机科学。原来在东方大学城图书馆中
曾经看过一本七十年代的译本(书皮都没了,可我就爱关注这种书),大概就叫《计算
机数学》。那本书若是放在当时来讲决是一本好书,但现在看来,涵盖的范围还算广,
深度则差了许多,不过推荐大一的学生倒可以看一看,至少可以使你的计算数学入入
门。
最常和理论计算机科学放在一起的一个词是什么?答:离散数学。这两者的关系是如此
密切,以至于它们在不少场合下成为同义词。(这一点在前面的那本书中也有体现)传
统上,数学是以分析为中心的。数学系的同学要学习三四个学期的数学分析,然后是复
变函数,实变函数,泛函数等等。实变和泛函被很多人认为是现代数学的入门。在物
理,化学,工程上应用的,也以分析为主。
随着计算机科学的出现,一些以前不太受到重视的数学分支突然重要起来。人们发现,
这些分支处理的数学对象与传统的分析有明显的区别:分析研究的问题解决方案是连续
的,因而微分,积分成为基本的运算;而这些分支研究的对象是离散的,因而很少有机
会进行此类的计算。人们从而称这些分支为"离散数学"。"离散数学"的名字越来越
响亮,最后导致以分析为中心的传统数学分支被相对称为"连续数学"。
离散数学经过几十年发展,基本上稳定下来。一般认为,离散数学包含以下学科:
1) 集合论,数理逻辑与元数学。这是整个数学的基础,也是计算机科学的基础。
2) 图论,算法图论;组合数学,组合算法。计算机科学,尤其是理论计算机科学的核心

算法,而大量的算法建立在图和组合的基础上。
3) 抽象代数。代数是无所不在的,本来在数学中就非常重要。在计算机科学中,人们惊
讶地发现代数竟然有如此之多的应用。
但是,理论计算机科学仅仅就是在数学的上面加上"离散"的帽子这么简单吗?一直到
大约十几年前,终于有一位大师告诉我们:不是。D.E.Knuth(他有多伟大,我想不用我
废话了)在Stanford开设了一门全新的课程Concrete Mathematics。 Concrete这个词在
这里有两层含义:
首先:对abstract而言。Knuth认为,传统数学研究的对象过于抽象,导致对具体的问题
关心不够。他抱怨说,在研究中他需要的数学往往并不存在,所以他只能自己去创造一
些数学。为了直接面向应用的需要,他要提倡"具体"的数学。在这里我做一点简单的
解释。例如在集合论中,数学家关心的都是最根本的问题--公理系统的各种性质之类。
而一些具体集合的性质,各种常见集合,关系,映射都是什么样的,数学家觉得并不重
要。然而,在计算机科学中应用的,恰恰就是这些具体的东西。Knuth能够首先看到这一
点,不愧为当世计算机第一人。其次,Concrete是Continuous(连续)加上discrete(离
散)。不管连续数学还是离散数学,都是有用的数学!
理论与实际的结合——计算机科学研究的范畴
前面主要是从数学角度来看的。从计算机角度来看,理论计算机科学目前主要的研
究领域包括:可计算性理论,算法设计与复杂性分析,密码学与信息安全,分布式计算
理论,并行计算理论,网络理论,生物信息计算,计算几何学,程序语言理论等等。这
些领域互相交叉,而且新的课题在不断提出,所以很难理出一个头绪来。想搞搞这方面
的工作,推荐看中国计算机学会的一系列书籍,至少代表了我国的权威。下面随便举一
些例子。
由于应用需求的推动,密码学现在成为研究的热点。密码学建立在数论(尤其是计算
数论),代数,信息论,概率论和随机过程的基础上,有时也用到图论和组合学等。很多
人以为密码学就是加密解密,而加密就是用一个函数把数据打乱。这样的理解太浅显
了。
现代密码学至少包含以下层次的内容:
第一,密码学的基础。例如,分解一个大数真的很困难吗?能否有一般的工具证明协议
正确?
第二,密码学的基本课题。例如,比以前更好的单向函数,签名协议等。
第三,密码学的高级问题。例如,零知识证明的长度,秘密分享的方法。
第四,密码学的新应用。例如,数字现金,叛徒追踪等。
在分布式系统中,也有很多重要的理论问题。例如,进程之间的同步,互斥协议。一个
经典的结果是:在通信信道不可靠时,没有确定型算法能实现进程间协同。所以,改进
TCP三次握手几乎没有意义。例如时序问题。常用的一种序是因果序,但因果序直到不久
前才有一个理论上的结果....例如,死锁没有实用的方法能完美地对付。例如,......操
作系统研究过就自己去举吧!
如果计算机只有理论,那么它不过是数学的一个分支,而不成为一门独立的科学。
事实上,在理论之外,计算机科学还有更广阔的天空。
我一直认为,4年根本不够学习计算机的基础知识,因为面太宽了......
这方面我想先说说我们系在各校普遍开设的《计算机基础》。在高等学校开设《计
算机基础课程》是我国高教司明文规定的各专业必修课程要求。主要内容是使学生初步
掌握计算机的发展历史,学会简单的使用操作系统,文字处理,表格处理功能和初步的
网络应用功能。但是在计算机科学系教授此门课程的目标决不能与此一致。在计算机系
课程中目标应是:让学生较为全面的了解计算机学科的发展,清晰的把握计算机学科研
究的方向,发展的前沿即每一个课程在整个学科体系中所处的地位。搞清各学科的学习
目的,学习内容,应用领域。使学生在学科学习初期就对整个学科有一个整体的认识,
以做到在今后的学习中清楚要学什么,怎么学。计算机基本应用技能的位置应当放在第
二位或更靠后,因为这一点对于本系的学生应当有这个摸索能力。这一点很重要。推荐
给大家一本书:机械工业出版社的《计算机文化》(New Perspective of Computer
Science),看了这本书我才深刻的体会到自己还是个计算机科学初学者,才比较透彻的
了解了什么是计算机科学。另外在厦门大学赵致琢老师的著作《计算科学导论》当中的
很多经典理论都是在同类书籍中很难找到的。看看他也许你才会明白一个最基本的问
题:为什么计算机科学叫计算科学更为准确。这本书在世界上也可成为精品级的著作。
一个一流计算机系的优秀学生决不该仅仅是一个编程高手,但他一定首先是一个编程高
手。我上大学的时候,第一门专业课是C语言程序设计,念计算机的人从某种角度讲相当
一部分人是靠写程序吃饭的。在我们北京工业大学实验学院计算机系里一直有这样的争
论(时至今日CSDN上也有),关于第一程序设计语言该用哪一种。我个人认为,用哪种
语言属于末节,关键在养成良好的编程习惯。当年老师对我们说,打好基础后学一门新
语言只要一个星期。现在我觉得根本不用一个星期,前提是先把基础打好。不要再犹豫
了,学了再说,等你抉择好了,别人已经会了几门语言了。
汇编语言和微机原理是两门特烦人的课。你的数学/理论基础再好,也占不到什么便宜。
这两门课之间的次序也好比先有鸡还是先有蛋,无论你先学哪门,都会牵扯另一门课里
的东西。所以,只能静下来慢慢琢磨。这就是典型的工程课,不需要太多的聪明和顿
悟,却需要水滴石穿的渐悟。有关这两门课的书,计算机书店里不难找到。弄几本最新
的,对照着看吧。组成原理推荐《计算机组成与结构》清华大学王爱英教授写的。汇编
语言大家拿8086/8088入个门,之后一定要学80x86汇编语言。实用价值大,不落后,结
构又好,写写高效病毒,高级语言里嵌一点汇编,进行底层开发,总也离不开他,推荐
清华大学沈美明的《IBM—PC汇编语言程序设计》。有些人说不想了解计算机体系结构,
也不想制造计算机,所以诸如计算机原理,汇编语言,接口之类的课觉得没必要学,这
样合理吗?显然不合理,这些东西迟早得掌握,肯定得接触,而且,这是计算机专业与
其他专业学生相比的少有的几项优势。做项目的时候,了解这些是非常重要的,不可能
说,仅仅为了技术而技术,只懂技术的人最多做一个编码工人,而永远不可能全面地了
解整个系统的设计,而编码工人是越老越不值钱。关于组成原理还有个讲授的问题,在
我学这门课程时老师讲授时把CPU工作原理誉微程序设计这一块略掉了,理由是我们国家
搞CPU技术不如别的国家,搞了这么长时间好不容易出了个龙芯比Intel的还差个十万八
千里,所以建议我们不要学了。我看这在各校也未见得不是个问题吧!若真是如他所
说,那中国的计算机科学哪个方向都可以停了,软硬件,应用,有几项搞得过美国,搞
不过别人就不搞了,那我们坐在这里干什么?教学的观念需要转变的。
模拟电路这东东,如今不仅计算机系学生搞不定,电子系学生也多半害怕。如果你真想
软硬件通吃,那么建议你先看看邱关源的"电路原理",也许此后再看模拟电路底气会
足些。教材:康华光的"电子技术基础"(高等教育出版社)还是不错的(我校电子系
在用)。有兴趣也可以参考童诗白的书。
数字电路比模拟电路要好懂得多。推荐大家看一看我们北工大刘英娴教授写的《数字逻
辑》业绩人士都说这本书很有参考价值(机械工业出版社的)。原因很明了,实用价值
高,能听听她讲授的课程更是有一种"享受科学"的感觉。清华大学阎石的书也算一本
好教材,遗憾的一点是集成电路讲少了些。真有兴趣,看一看大规模数字系统设计吧
(北航那本用的还比较多)。
计算机系统结构该怎么教,国际上还在争论。国内能找到的较好教材为Stallings
的"Computer Organization and Architectureesigning for Performance"(清华影印
本)。国际上最流行的则是"Computer architecture: aquantitative approach", by
Patterson & Hennessy。
操作系统可以随便选用《操作系统的内核设计与实现》和《现代操作系统》两书之
一。这两部都可以算经典,唯一缺点就是理论上不够严格。不过这领域属于Hardcore
System,所以在理论上马虎一点也情有可原。想看理论方面的就推荐清华大学出版社《操
作系统》吧,高教司司长张尧学写的,我们教材用的是那本。 另外推荐一本《Windows
操作系统原理》机械工业出版社的,这本书是我国操作系统专家在微软零距离考察半
年,写作历时一年多写成的,教操作系统的专家除了清华大学的张尧学(现高教司司
长)几乎所有人都参加了。Bill Gates亲自写序。里面不但结合windows2000,xp详述操
作系统的内核,而且后面讲了一些windows编程基础,有外版书的味道,而且上面一些内
容可以说在国内外只有那本书才有对windows内核细致入微的介绍,
如果先把形式语言学好了,则编译原理中的前端我看只要学四个算法:最容易实现
的递归下降;最好的自顶向下算法LL(k);最好的自底向上算法LR(k);LR(1)的简化SLR
(也许还有另一简化LALR)。后端完全属于工程性质,自然又是another story。
推荐教材:Kenneth C.Louden写的"Compiler Construction Principles and
Practice"即是《编译原理及实践》(机械工业出版社的译本)
学数据库要提醒大家的是,会用VFP,VB, Power builder不等于懂数据库。(这世界
上自以为懂数据库的人太多了!)数据库设计既是科学又是艺术,数据库实现则是典型的
工程。所以从某种意义上讲,数据库是最典型的一门计算机课程——理工结合,互相渗
透。另外推荐大家学完软件工程学后再翻过来看看数据库技术,又会是一番新感觉。推
荐教材:Abraham Silberschatz等著的 "Database System Concepts".作为知识的完整
性,还推荐大家看一看机械工业出版社的《数据仓库》译本。
计算机网络的标准教材还是来自Tanenbaum的《Computer Networks》(清华大学有译
本)。还有就是推荐谢希仁的《计算机网络教程》(人民邮电出版社)问题讲得比较清
楚,参考文献也比较权威。不过,网络也属于Hardcore System,所以光看书是不够的。
建议多读RFC,http://www.ietf.org/rfc.htm里可以按编号下载RFC文档。从IP的读起。
等到能掌握10种左右常用协议,就没有几个人敢小看你了。再做的工作我看放在网络设
计上就比较好了。
数据结构的重要性就不言而喻了,学完数据结构你会对你的编程思想进行一番革命性的
洗礼,会对如何建立一个合理高效的算法有一个清楚的认识。对于算法的建立我想大家
应当注意以下几点:
当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题.如果见过,那么你一
般会顺利地做出来;如果没见过,那么考虑以下问题:
1. 问题是否是建立在某种已知的熟悉的数据结构(例如,二叉树)上?如果不是,则要自己
设计数据结构。
2. 问题所要求编写的算法属于以下哪种类型?(建立数据结构,修改数据结构,遍历,查找,
排序...)
3. 分析问题所要求编写的算法的数学性质.是否具备递归特征?(对于递归程序设计,只要
设计出合理的参数表以及递归结束的条件,则基本上大功告成.)
4. 继续分析问题的数学本质.根据你以前的编程经验,设想一种可能是可行的解决办法,
并证明这种解决办法的正确性.如果题目对算法有时空方面的要求,证明你的设想满足其
要求.一般的,时间效率和空间效率难以兼得.有时必须通过建立辅助存储的方法来节省时
间.
5. 通过一段时间的分析,你对解决这个问题已经有了自己的一些思路.或者说,你已经可
以用自然语言把你的算法简单描述出来.继续验证其正确性,努力发现其中的错误并找出
解决办法.在必要的时候(发现了无法解决的矛盾),推翻自己的思路,从头开始构思.
6. 确认你的思路可行以后,开始编写程序.在编写代码的过程中,尽可能把各种问题考虑
得详细,周密.程序应该具有良好的结构,并且在关键的地方配有注释.
7. 举一个例子,然后在纸上用笔执行你的程序,进一步验证其正确性.当遇到与你的设想
不符的情况时,分析问题产生的原因是编程方面的问题还是算法思想本身有问题.
8. 如果程序通过了上述正确性验证,那么在将其进一步优化或简化。
9. 撰写思路分析,注释.
对于具体的算法思路,只能靠你自己通过自己的知识和经验来加以获得,没有什么特定的
规律(否则程序员全部可以下岗了,用机器自动生成代码就可以了).要有丰富的想象力,就
是说当一条路走不通时,不要钻牛角尖,要敢于推翻自己的想法.我也只不过是初学者,说
出上面的一些经验,仅供大家参考和讨论。
关于人工智能,我觉得的也是非常值得大家仔细研究的,虽然不能算是刚刚兴起的
学科了,但是绝对是非常有发展前途的一门学科。我国人工智能创始人之一,北京科技
大学涂序彦教授(这老先生是我的导师李小坚博士的导师)对人工智能这样定义:人工
智能是模仿、延伸和扩展人与自然的智能的技术科学。在美国人工智能官方教育网站上
对人工智能作了如下定义:Artificial Intelligence, or AI for short, is a
combination of computer science, physiology, and philosophy. AI is a broad
topic, consisting of different fields, from machine vision to expert
systems. The element that the fields of AI have in common is the creation of
machines that can "think".
这门学科研究的问题大概说有:
(1)符号主义: 符号计算与程序设计基础,知识表达方法 :知识与思维,产生式规
则,语意网络,一阶谓词逻辑问题求解方法:搜索策略,启发式搜寻,搜寻算法,问题
规约方法,谓词演算:归结原理,归结过程专家系统:建立专家系统的方法及工具
(2)联接主义(神经网络学派):1988年美国权威机构指出:数据库,网络发展呈直线
上升,神经网络可能是解决人工智能的唯一途径。
我想对于人工智能的学习,大家一定不要像学数学似的及一些现成的结论,要学会分
析问题,最好能利用程序设计实现,这里推荐给大家ACM最佳博士论文奖获得者涂晓媛博
士的著作《人工鱼—计算机动画的人工生命方法》(清华大学出版社)。搞人工生命的
同学不会不知道国际知名的涂氏父女吧。关于人工智能的书当然首选《Artificial
Intelligence A New Synthesis》Nils J.Nilsson.鼻祖嘛!
关于网络安全我也想在这里说两句,随着计算机技术的发展,整个社会的信息化水平突
飞猛进,计算机网络技术日新月异,网络成了当即社会各个工作领域不可缺少的组成部
分,只要有网络存在,网络安全问题就是一个必须解决好的问题,学习网络安全不是简
简单单的收集一些黑客工具黑一黑别人的网站,而是要学习他的数学原理,实现原理,
搞清底层工作机制,这样才能解决大部分的现有问题和新出现的安全问题。
关于计算机科学的一些边缘科学我想谈一谈软件工程技术,对于一个企业,推出软件是
不是就是几个程序员坐在一起,你写一段程序,我写一段程序呢?显然不是。软件工程
是典型的计算机科学和数学,管理科学,心理学,社会学等学科的综合。它使我们这些
搞理论和技术的人进入了一个社会。你所要考虑的不仅仅是程序的优劣,更应该考虑程
序与软件的区别,软件与软件产品的区别,软件软件产品的市场前景,如何去更好的与
人交流。这方面我还在学习阶段,以后这方面再写文章吧,先推荐给大家几本书:畅销
20年不衰的《人月神话》(清华大学中文版,中国电力出版社影印版),《软件工程-实
践者研究的方法》(机械工业出版社译本),《人件》(据说每一位微软公司的部门经
理都读过这本书,推荐老总们和想当老总的同学都看看,了解一下什么是软件企业中的
人)以及微软公司的《软件开发的科学与艺术》和《软件企业的管理与文化》(研究软
件企业的制胜之道当然要研究微软的成功经验了!)
关于计算机技术的学习我想是这样的:学校开设的任何一门科学都有其滞后性,不要总
认为自己掌握的某门技术就已经是天下无敌手了,虽然现在Java,VB,C,C++用的都很多,
怎能保证没有被淘汰的一天,我想.NET平台的诞生和X#语言的初见端倪完全可以说明问
题。换言之,在我们掌握一门新技术的同时就又有更新的技术产生,身为当代的大学生
应当有紧跟科学发展的素质。举个例子,就像有些同学总说,我做网页设计就喜欢直接
写html,不愿意用什么Frontpage,Dreamweaver。能用语言写网页固然很好,但有高效的
手段你为什么不使呢?仅仅是为了显示自己的水平高,unique? 我看真正水平高的是能
够以最快的速度接受新事物的人。高级程序设计语言的发展日新月异,今后的程序设计
就像人们在说话一样,我想大家从xml中应是有所体会了。难道我们真就写个什么都要用
汇编,以显示自己的水平高,真是这样倒不如直接用机器语言写算了。反过来说,想要
以最快的速度接受并利用新技术关键还是在于你对计算机科学地把握程度。
计算机技术牵扯的内容更为广泛些,一项一项说恐怕没个一年半载也说不清。我只想提
醒大家的还是那句话,技术与科学是不能分家的,学好了科学同时搞技术,这才是上上
策。犹如英语,原先人们与老外交流必须要个翻译,现在满马路的人都会说英语。就连
21世纪英语演讲比赛的冠军都轮不到英语系的学生了。计算机也是一样的,我们必须面
对的一个现实就是:计算机真就只是一个工具,如果不具备其它方面的素养,计算机系
的学生虽然不能说找不到工作,不过总有一天当其他专业性人才掌握了计算机技术后将
比我们出色许多。原因就在于计算机解决的大都是实际问题,实际问题的知识却是我们
少有的。单一的计算机技术没有立足之地。
我想是时候指出:学习每一个课程之前,都要先搞清这一课程的学习目的。这一学
科的应用领域。据我自身所了解到的同龄同学和低年级的同学的学习状况:他们之中很
少有人知道学一个学科的学习目的,期末考试结束了也不知道学这科做什么用。这就失
去了读计算机科学的意义。当然这与现存的教育思想不能说一点关系都没有。
总的来说,从教育角度来讲,国内高校的课程安排不是很合理,强调理论,又不愿意在
理论上深入教育,无力接受新技术,想避开新技术又无法避得一干二净。我觉得关键问
题就是国内的高校难于突破现状,条条框框限制着怎么求发展。我们虽然认识得到国外
教育的优越性,但为什么迟迟不能采取行动?哪怕是去粗取精的取那么一点点。我们需
要改变。从我们自身角度来讲,多数人4年下来既没有学习计算机科学的学术水平,也没
有学习计算机技术的那种韧劲。在我刚上大一时,我的计算机科学入门导师,淮北煤炭
师范学院王爱平教授曾经对我说过这样一番话:"当你选择了计算机这一门科学,就意
味着你踏上了一条不归路,就意味着你一生都要为之奋斗......你的身后是悬崖,只有向
前走,不能往后退。"
有些同学说按照这样学习学的东西太多,有的未见得有用,我想打个形象的比方:
学校学出来的人都是一个球体,方方面面的知识都应具备。可是社会上需要球体的地方
很少,反而需要的是砖和瓦,即精通某一行的人才。但是对于同等体积的物体,用球体
来改造是最方便最省事的。学校的学生很多,为了能够使更多的学生来适应这个社会,
学校也就不得以把所有的学生都打造成一个球体,然后让社会对这些学生进行再加工,
成为真正能够有用的人才。即使你非常清楚自己的将来要干什么,并且非常下定决心要
走自己的路,这一步你也必须走,世界是在不断变化的,你不能预料未来。想清楚,努
力去干吧!
必须结束这篇"胡侃"了,再侃下去非我力所能及。其实计算机还有很多基础课都值得
一侃。怎奈我造诣有限,不敢再让内行耻笑。对于博大精深的计算机科学,我只能说我
永远都是个Beginner.最后声明:这些只针对本科阶段的学习。即使把这些全弄通了,前
面的路还长,计算机科学需要我们为之奋斗......学习计算机科学需要韧性,更需要创
新,需要激情。深刻学习理论知识,勇于接受新技术的挑战,这才是我们这一代人应具
有的素质。最后送大家一句话"Wake up every day with a feeling of passion for
the difference technology will make in people's life!"。
阅读全文(2658) |评论:1 |复制链接
Turbo C(V2.0)编译错误信息(2006-1-18 6:20:00)
实用turboc的看一遍,就算是背单词了
Turbo C(V2.0)编译错误信息:
编译错误信息
说明:Turbo C 的源程序错误分为三种类型:致命错误、一般错误和警告。其中,致命错误通常是内部编译出错;一般错误指程序的语法错误、磁盘或内存存取错误或命令行错误等;警告则只是指出一些得怀疑的情况,它并不防止编译的进行。
下面按字母顺序A~Z分别列出致命错误及一般错误信息,英汉对照及处理方法:
(一)、致命错误英汉对照及处理方法:
A-B致命错误
Bad call of in-line function (内部函数非法调用)
分析与处理:在使用一个宏定义的内部函数时,没能正确调用。一个内部函数以两个下划线(__)开始和结束。
Irreducable expression tree (不可约表达式树)
分析与处理:这种错误指的是文件行中的表达式太复杂,使得代码生成程序无法为它生成代码。这种表达式必须避免使用。
Register allocation failure (存储器分配失败)
分析与处理:这种错误指的是文件行中的表达式太复杂,代码生成程序无法为它生成代码。此时应简化这种繁杂的表达式或干脆避免使用它。
(二)、一般错误信息英汉照及处理方法
#operator not followed by maco argument name(#运算符后没跟宏变元名)
分析与处理:在宏定义中,#用于标识一宏变串。“#”号后必须跟一个宏变元名。
'xxxxxx' not anargument ('xxxxxx'不是函数参数)
分析与处理:在源程序中将该标识符定义为一个函数参数,但此标识符没有在函数中出现。
Ambiguous symbol 'xxxxxx' (二义性符号'xxxxxx')
分析与处理:两个或多个结构的某一域名相同,但具有的偏移、类型不同。在变量或表达式中引用该域而未带结构名时,会产生二义性,此时需修改某个域名或在引用时加上结构名。
Argument # missing name (参数#名丢失)
分析与处理:参数名已脱离用于定义函数的函数原型。如果函数以原型定义,该函数必须包含所有的参数名。
Argument list syntax error (参数表出现语法错误)
分析与处理:函数调用的参数间必须以逗号隔开,并以一个右括号结束。若源文件中含有一个其后不是逗号也不是右括号的参数,则出错。
Array bounds missing (数组的界限符"]"丢失)
分析与处理:在源文件中定义了一个数组,但此数组没有以下右方括号结束。
Array size too large (数组太大)
分析与处理:定义的数组太大,超过了可用内存空间。
Assembler statement too long (汇编语句太长)
分析与处理:内部汇编语句最长不能超过480字节。
Bad configuration file (配置文件不正确)
分析与处理:TURBOC.CFG配置文件中包含的不是合适命令行选择项的非注解文字。配置文件命令选择项必须以一个短横线开始。
Bad file name format in include directive(包含指令中文件名格式不正确)
分析与处理:包含文件名必须用引号("filename.h")或尖括号()括起来,否则将产生本类错误。如果使用了宏,则产生的扩展文本也不正确,因为无引号没办法识别。
Bad ifdef directive syntax (ifdef指令语法错误)
分析与处理:#ifdef必须以单个标识符(只此一个)作为该指令的体。
Bad ifndef directive syntax (ifndef指令语法错误)
分析与处理:#ifndef 必须以单个标识符(只此一个)作为该指令的体。
Bad undef directive syntax (undef指令语法错误)
分析与处理:#undef指令必须以单个标识符(只此一个)作为该指令的体。
Bad file size syntax (位字段长语法错误)
分析与处理:一个位字段长必须是1—16位的常量表达式。
Call of non-functin (调用未定义函数)
分析与处理:正被调用的函数无定义,通常是由于不正确的函数声明或函数名拼错而造成。
Cannot modify a const object (不能修改一个长量对象)
分析与处理:对定义为常量的对象进行不合法操作(如常量赋值)引起本错误。
Case outside of switch (Case 出现在switch外)
分析与处理:编译程序发现Case语句出现在switch语句之外,这类故障通常是由于括号不匹配造成的。
Case statement missing (Case语句漏掉)
分析与处理:Case语必须包含一个以冒号结束的常量表达式,如果漏了冒号或在冒号前多了其它符号,则会出现此类错误。
Character constant too long (字符常量太长)
分析与处理:字符常量的长度通常只能是一个或两个字符长,超过此长度则会出现这种错误。
Compound statement missing (漏掉复合语句)
分析与处理:编译程序扫描到源文件未时,未发现结束符号 (大括号),此类故障通常是由于大括号不匹配所致。
Conflicting type modifiers (类型修饰符冲突)
分析与处理:对同一指针,只能指定一种变址修饰符(如near 或far);而对于同一函数,也只能给出一种语言修饰符(如Cdecl、pascal或interrupt)。
Constant expression required (需要常量表达式)
分析与处理:数组的大小必须是常量,本错误通常是由于#define常量的拼写错误引起。
Could not find file 'xxxxxx.xxx' (找不到'xxxxxx.xx'文件)
分析与处理:编译程序找不到命令行上给出的文件。
Declaration missing (漏掉了说明)
分析与处理:当源文件中包含了一个struct或 union域声明,而后面漏掉了分号,则会出现此类错误。
Declaration needs type or storage class(说明必须给出类型或存储类)
分析与处理:正确的变量说明必须指出变量类型,否则会出现此类错误。
Declaration syntax error (说明出现语法错误)
分析与处理:在源文件中,若某个说明丢失了某些符号或输入多余的符号,则会出现此类错误。
Default outside of switch (Default语句在switch语句外出现)
分析与处理:这类错误通常是由于括号不匹配引起的。
Define directive needs an identifier (Define指令必须有一个标识符)
分析与处理:#define 后面的第一个非空格符必须是一个标识符,若该位置出现其它字符,则会引起此类错误。
Division by zero (除数为零)
分析与处理:当源文件的常量表达式出现除数为零的情况,则会造成此类错误。
Do statement must have while (do语句中必须有While关键字)
分析与处理:若源文件中包含了一个无While关键字的 do语句,则出现本错误。
DO while statement missing ( (Do while语句中漏掉了符号 "(")
分析与处理:在do语句中,若 while关键字后无左括号,则出现本错误。
Do while statement missing;(Do while语句中掉了分号)
分析与处理:在DO语句的条件表达式中,若右括号后面无分号则出现此类错误。
Duplicate Case (Case情况不唯一)
分析与处理:Switch语句的每个case必须有一个唯一的常量表达式值。否则导致此类错误发生。
Enum syntax error (Enum语法错误)
分析与处理:若enum说明的标识符表格式不对,将会引起此类错误发生。
Enumeration constant syntax error (枚举常量语法错误)
分析与处理:若赋给enum类型变量的表达式值不为常量,则会导致此类错误发生。
Error Directive : xxxx (Error指令:xxxx)
分析与处理:源文件处理#error指令时,显示该指令指出的信息。
Error Writing output file (写输出文件错误)
分析与处理:这类错误通常是由于磁盘空间已满,无法进行写入操作而造成。
Expression syntax error (表达式语法错误)
分析与处理:本错误通常是由于出现两个连续的操作符,括号不匹配或缺少括号、前一语句漏掉了分号引起的。
Extra parameter in call (调用时出现多余参数)
分析与处理:本错误是由于调用函数时,其实际参数个数多于函数定义中的参数个数所致。
Extra parameter in call to xxxxxx(调用xxxxxxxx函数时出现了多余参数)
File name too long (文件名太长)
分析与处理:#include指令给出的文件名太长,致使编译程序无法处理,则会出现此类错误。通常DOS下的文件名长度不能超过 64个字符。
For statement missing ) (For语名缺少")")
分析与处理:在 for语句中,如果控制表达式后缺少右括号,则会出现此类错误。
For statement missing( (For语句缺少"(")
For statement missing; (For 语句缺少";")
分析与处理:在 for语句中,当某个表达式后缺少分号,则会出现此类错误。
Function call missing) (函数调用缺少")")
分析与处理:如果函数调用的参数表漏掉了右手括号或括号不匹配,则会出现此类错误。
Function definition out ofplace (函数定义位置错误)
Function doesn't take a variable number of argument(函数不接受可变的参数个数)
Goto statement missing label (Goto语句缺少标号)
If statement missing( (If语句缺少"(")
If statement missing) (If语句缺少")")
lllegal initalization (非法初始化)
lllegal octal digit (非法八进制数)
分析与处理:此类错误通常是由于八进制常数中包含了非八进制数字所致。
lllegal pointer subtraction (非法指针相减)
lllegal structure operation (非法结构操作)
lllegal use of floating point (浮点运算非法)
lllegal use of pointer (指针使用非法)
Improper use of a typedef symbol (typedef符号使用不当)
Incompatible storage class (不相容的存储类型)
Incompatible type conversion (不相容的类型转换)
Incorrect commadn line argument:xxxxxx (不正确的命令行参数:xxxxxxx)
Incorrect commadn file argument:xxxxxx (不正确的配置文件参数:xxxxxxx)
Incorrect number format (不正确的数据格式)
Incorrect use of default (deflult不正确使用)
Initializer syntax error (初始化语法错误)
Invaild indrection (无效的间接运算)
Invalid macro argument separator (无效的宏参数分隔符)
Invalid pointer addition (无效的指针相加)
Invalid use of dot (点使用错)
Macro argument syntax error (宏参数语法错误)
Macro expansion too long (宏扩展太长)
Mismatch number of parameters in definition(定义中参数个数不匹配)
Misplaced break (break位置错误)
Misplaced continue (位置错)
Misplaced decimal point (十进制小数点位置错)
Misplaced else (else 位置错)
Misplaced else driective (clse指令位置错)
Misplaced endif directive (endif指令位置错)
Must be addressable (必须是可编址的)
Must take address of memory location (必须是内存一地址)
No file name ending (无文件终止符)
No file names given (未给出文件名)
Non-protable pointer assignment (对不可移植的指针赋值)
Non-protable pointer comparison (不可移植的指针比较)
Non-protable return type conversion (不可移植的返回类型转换)
Not an allowed type (不允许的类型)
Out of memory (内存不够)
Pointer required on left side of (操作符左边须是一指针)
Redeclaration of 'xxxxxx' ('xxxxxx'重定义)
Size of structure or array not known (结构或数组大小不定)
Statement missing; (语句缺少“;”)
Structure or union syntax error (结构或联合语法错误)
Structure size too large (结构太大)
Subscription missing ] (下标缺少‘]')
Switch statement missing ( (switch 语句缺少"(")
Switch statement missing ) (switch 语句缺少")")
Too few parameters in call (函数调用参数太少)
Too few parameter in call to'xxxxxx'(调用'xxxxxx'时参数太少)
Too many cases (Cases太多)
Too many decimal points (十进制小数点太多)
Too many default cases (defaut太多)
Too many exponents (阶码太多)
Too many initializers (初始化太多)
Too many storage classes in declaration (说明中存储类太多)
Too many types in decleration (说明中类型太多)
Too much auto memory in function (函数中自动存储太多)
Too much global define in file (文件中定义的全局数据太多)
Two consecutive dots (两个连续点)
Type mismatch in parameter # (参数"#"类型不匹配)
Type mismatch in parameter # in call to 'XXXXXXX' (调用'XXXXXXX'时参数#类型不匹配)
Type missmatch in parameter 'XXXXXXX' (参数'XXXXXXX'类型不匹配)
Type mismatch in parameter 'YYYYYYYY' in call to 'YYYYYYYY'(调用'YYYYYYY'时参数'XXXXXXXX'数型不匹配)
Type mismatch in redeclaration of 'XXX' (重定义类型不匹配)
Unable to creat output file 'XXXXXXXX.XXX' (不能创建输出文件'XXXXXXXX.XXX')
Unable to create turboc.lnk (不能创建turboc.lnk )
Unable to execute command 'xxxxxxxx'(不能执行'xxxxxxxx'命令)
Unable to open include file 'xxxxxxx.xxx' (不能打开包含文件'xxxxxxxx.xxx')
Unable to open inputfile 'xxxxxxx.xxx' (不能打开输入文件'xxxxxxxx.xxx')
Undefined label 'xxxxxxx' (标号'xxxxxxx'未定义)
Undefined structure 'xxxxxxxxx' (结构'xxxxxxxxxx'未定义)
Undefined symbol 'xxxxxxx' (符号'xxxxxxxx'未定义)
Unexpected end of file in comment started on line #(源文件在某个注释中意外结束)
Unexpected end of file in conditional stated on line # (源文件在#行开始的条件语句中意外结束)
Unknown preprocessor directive 'xxx' (不认识的预处理指令:'xxx')Untermimated character constant (未终结的字符常量)
Unterminated string (未终结的串)
Unterminated string or character constant(未终结的串或字符常量)
User break (用户中断)
Value required (赋值请求)
While statement missing ( (While语句漏掉 '(')
While statement missing ) (While语句漏掉 ')')
Wrong number of arguments in of 'xxxxxxxx' (调用'xxxxxxxx'时参数个数错误)
 
阅读全文(1284) |评论:0 |复制链接
学习嵌入式Linux系统的笔记和体会(2006-1-18 2:09:00)
一个典型的桌面Linux系统包括3个主要的软件层---linux内核、C库和应用程序代码。
内核是唯一可以完全控制硬件的层,内核驱动程序代表应用程序与硬件之间进行会话。内核之上是C库,负责把POSIX API转换为内核可以识别的形式,然后调用内核,从应用程序向内核传递参数。应用程序依靠驱动内核来完成特定的任务。
在设计嵌入式应用的时候,可以不按照这种层次,应用程序越过C库直接和内核会话,或者把应用和内核捆绑在一起,甚至可以把应用写为内核的一个线程,在内核中运行,虽然这样在移植上带来了困难,但考虑嵌入式系统对尺寸要求小的特点,是完全可行的。不过我们使用三层软件结构的模式来学习嵌入式linux将会是我们认识更清晰,简单可行并使应用具有弹性。
快速入门
最简单的建立嵌入式Linux应用的方法就是从我们使用的桌面Linux入手,安装一个喜爱的版本,把我们的某个应用作为初始化的一部分,框架就算完成了。
当然,嵌入式linux应用远比我们的桌面版本功能简单专一,它也许就是一个用于足彩的终端机,或是一个数码音频播放器,这些系统除了使用嵌入式CPU外,仅仅再需要一个串口,网口等少量的输入输出接口就可以完成它们特定的应用了。
在软件上,它可以按照三层的概念由内核装载器,定制的内核和较少的为特定任务设计的静态连接的应用程序组成。之所以使用静态连接的应用程序,是因为少量的静态连接程序所要的存储空间,比同样数量的动态连接的程序所占的空间小,这个平衡点需要我们在实际开发中去获取。也许你正在设计的是个PDA,它的应用程序较多,那么你很可能就要使用动态连接程序来减少存储空间。在你的/bin或者/sbin目录下,用厂列表看看bash,ifconfig,vi...,也许只用几十K,当你运行 ldd /bin/bash 时,你会看到它们都和好几个库文件相连。好了,这样看来,我们得把PC想像成一个嵌入式硬件平台,再重新制作一个特定功能的嵌入式linux。
基础知识
再进行实际操作之前,先来搞清楚几个基础知识。
内核装载器Loader,它的作用是把内核从外部存储器,移动到内存中。它只作这个事情,一旦完成了调入内核的工作,Loader就跳转到内核位置开始执行。不同架构有不同的 Loader,在x86结构的PC上,通常使用的loader有LILO,GRUB,syslinux,syslinux在嵌入式linux中也同样工作。其他非x86架构的应用中,你必须使用专门的loader,或者自己编写loader来装入内核。也有不使用loader的情况,系统加电以后,内核直接从烧录有映象的Flash上开始执行。
内核,一旦内核开始执行,它将通过驱动程序初始化所有硬件,这可以从我们的pc机监视器的输出看出来,每个驱动程序都打印一些有关它的信息。初始化完成后,计算机就准备运行嵌入式应用。也许一个,也许是多个应用程序组成了嵌入式应用,但通常首先调用的是init(通过loader 向核心传入init=/program 可以定制首先运行的程序)。桌面linux中,init会读取/etc/inittab文件,来决定执行级别和哪些脚本和命令。嵌入式应用中,可以根据实际的情况决定是否使用标准的init执行方式,也许这个init是个静态程序,它能够完成我们的嵌入应用的特定任务,那完全不用考虑inittab了。
initrd文件系统,initrd以一种把内核从存储介质装入到内存的相同的机制来装入一个小型文件系统。这个文件系统最好是以压缩的方式存储在介质上的,解压缩到RAM盘上。通过使用initrd,包含有核心驱动和启动脚本的小文件系统,就可以直接从介质上和内核一起启动起来,内核届压缩这个文件系统,并执行这个文件系统上叫做/linuxrc的脚本文件,这个脚本通常会把启动过程中所需要的驱动程序装入。脚本退出以后,initrd文件系统也卸下了,启动过程进入真正初始化过程。对于嵌入式来讲,可以将需要的应用软件都运行在这个initrd文件系统上,只要/linxrc文件不结束,内核启动过程的其他部分就不会继续。
做个试验:
cp /boot/initrd-2.4.20.img /tmp
cd /tmp
mv initrd-2.4.2-.img initrd.img.gz
gunzip initrd.img.gz
mount -o loop initrd.img /mnt
cd /mnt
ls
cat linuxrc 可以看到里面执行了加载了两个模块的操作,你在启动linxu的时候会看见屏幕打印信息。
入门试验,制作一个简单的应用
我们使用一张软盘启动一台假象的只有一个串口,键盘输入,显示输出的x86架构的linux系统,执行的特定应用就是运行minicom,通过串口拨号。需要软件: minicom-xx.src.tar.gz 和 syslinux-xx.tar.gz,xx代表版本号,开始之前,在主目录建立一个目录,来释放这两个软件包:
cd
mkdir -p project/minilinux
cd project/minilinux
tar zxvf minicom-xx.src.tar.gz
tar zxvf syslinux-xx.tar.gz
1、裁减linux内核(需要系统安装内核文件包)
配置内核的时候,我们需要选择这些:摸块编入内核,386处理器、物理内存off、支持ELF、标准PC软盘、支持RAM盘(4096)、支持 initial RAM disk (initrd)、虚你终端、虚拟终端控制台、标准串口、ext2文件系统、控制台驱动,VGA text console、DOS FAT、MSDOS文件系统,其他的都可以不要,这样内核编出来较小。
步骤:
cd /usr/src/linux
make mrproper
make xconfig
make dep && make bzImage
得到 /usr/src/linux/arch/i386/boot/目录的内核文件bzIamge。
2、编译一个静态的minicom ,把它作为将来的linuxrc
cd minicom-xx/src
vi Makefile
修改下面这行
minicom: $(minicom_OBJECTS) $(minicom_DEPENDENCIES)
rm -f minicom 下面的行加上 -static,连接为静态程序
(LINK) -static $(minicom_LDFLAGS) $(minicom_OBJECTS) $(minicom_LDADD) $(LIBS)
vi minicom.c
找到 if (real_uid==0 && dosetup==0 ) 删除这个判断条件语句,主要是用于权限判断的,因为这个嵌入应用不关注权限问题,否则会出错。
make
得到可执行程序,用ldd 检查一下是不是静态程序。
3、准备initrd压缩文件image.gz
dd if=/dev/zero of=image bs=1k count=4096
losetup /dev/loop0 image
mke2fs -m 0 /dev/loop0
mounmt -t ext2 /dev/loop0 /mnt/
mkdir -p /mnt/dev
mkdir -p /mnt/usr/share/terminfo/l/
cd /dev
cp -a consle null tty tty0 zero mem /mnt/dev
cp -P /usr/share/terminfo/l/linux /mnt/usr/share/terminfo/l/linux
cp ~/project/minilinux/mincom/src/minicom /mnt/linuxrc
umount /mnt
losetup -d /dev/loop0
sync
gzip -9 image
4、制作软盘引导,并拷贝文件 bzimage image.gz 到软盘
A.使用grub
fdformat /dev/fd0
mke2fs /dev/fd0
mount /mnt/fd0 /mnt/floppy
mkdir -p /mnt/floppy/boot/grub
cp /boot/grub/stage1 /boot/grub/stage2 /mnt/floppy/boot/grub
执行 grub,在软盘上创建引导
grub > root (fd0)
grub > setup (fd0)
grub > quit
cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy
编辑 /mnt/floppy/boot/grub/grub.conf
default =0
timeout-=10
title minilinux
root (fd0)
kernel /bzImage
initrd /image.gz
卸下软盘
umount /mnt/floppy
B. 使用syslinux
fdformat /dev/fd0
mkfs.msdos /dev/fd0
mount -t msdos /dev/fd0 /mnt/floppy
cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy
cp syslinux-xx/ldlinxu.sys /mnt/floppy
cat > /mnt/floppy/syslinux.cfg
LABEL linux
KERNEL bzimage
APPEND initrd=image.gz
umont /mnt/floppy
syslinux-xx/syslinux /dev/fd0
sync
5、用软盘启动计算机,如果幸运,minicom的运行画面出现在屏幕上。
到此,我们的单应用嵌入式linux做好了,但它还很简陋,没有什么实际用途,但通过这个实验,可以了解嵌入式系统的大致结构和开发过程。在进行实际的嵌入式开发时,通常要在PC机上借助嵌入式linux开发工具包,如:uclinux,bluecat等,对相应的硬件平台(目标机)进行软件编写编译,调试成功后,将内核及应用程序写入到目标机的存储器中,从而完成整个应用。
 
阅读全文(1539) |评论:0 |复制链接
汇编语言的准备知识(2006-1-10 21:52:00)
汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)
============================
x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.
在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:
1. 通用寄存器:
EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途)
这些32位可以被用作多种用途,但每一个都有"专长". EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX是...(忘了..哈哈)但它总是被用来放整数除法产生的余数. 这4个寄存器的低16位可以被单独访问,分别用AX,BX,CX和DX. AX又可以单独访问低8位(AL)和高8位(AH), BX,CX,DX也类似. 函数的返回值经常被放在EAX中.
ESI/EDI分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.
EBP是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:
push ebp ;保存当前ebp
mov ebp,esp ;EBP设为当前堆栈指针
sub esp, xxx ;预留xxx字节给函数临时变量.
...
这样一来,EBP 构成了该函数的一个框架, 在EBP上方分别是原来的EBP, 返回地址和参数. EBP下方则是临时变量. 函数返回时作 mov esp,ebp/pop ebp/ret 即可.
ESP 专门用作堆栈指针.
2. 段寄存器:
CS(Code Segment,代码段) 指定当前执行的代码段. EIP (Instruction pointer, 指令指针)则指向该段中一个具体的指令. CS:EIP指向哪个指令, CPU 就执行它. 一般只能用jmp, ret, jnz, call 等指令来改变程序流程,而不能直接对它们赋值.
DS(DATA SEGMENT, 数据段) 指定一个数据段. 注意:在当前的计算机系统中, 代码和数据没有本质差别, 都是一串二进制数, 区别只在于你如何用它. 例如, CS 制定的段总是被用作代码, 一般不能通过CS指定的地址去修改该段. 然而,你可以为同一个段申请一个数据段描述符"别名"而通过DS来访问/修改. 自修改代码的程序常如此做.
ES,FS,GS 是辅助的段寄存器, 指定附加的数据段.
SS(STACK SEGMENT)指定当前堆栈段. ESP 则指出该段中当前的堆栈顶. 所有push/pop 系列指令都只对SS:ESP指出的地址进行操作.
3. 标志寄存器(EFLAGS):
该寄存器有32位,组合了各个系统标志. EFLAGS一般不作为整体访问, 而只对单一的标志位感兴趣. 常用的标志有:
进位标志C(CARRY), 在加法产生进位或减法有借位时置1, 否则为0.
零标志Z(ZERO), 若运算结果为0则置1, 否则为0
符号位S(SIGN), 若运算结果的最高位置1, 则该位也置1.
溢出标志O(OVERFLOW), 若(带符号)运算结果超出可表示范围, 则置1.
JXX 系列指令就是根据这些标志来决定是否要跳转, 从而实现条件分枝. 要注意,很多JXX 指令是等价的, 对应相同的机器码. 例如, JE 和JZ 是一样的,都是当Z=1是跳转. 只有JMP 是无条件跳转. JXX 指令分为两组, 分别用于无符号操作和带符号操作. JXX 后面的"XX" 有如下字母:
无符号操作: 带符号操作:
A = "ABOVE", 表示"高于" G = "GREATER", 表示"大于"
B = "BELOW", 表示"低于" L = "LESS", 表示"小于"
C = "CARRY", 表示"进位"或"借位" O = "OVERFLOW", 表示"溢出"
S = "SIGN", 表示"负"
通用符号:
E = "EQUAL" 表示"等于", 等价于Z (ZERO)
N = "NOT" 表示"非", 即标志没有置位. 如JNZ "如果Z没有置位则跳转"
Z = "ZERO", 与E同.
如果仔细想一想,就会发现 JA = JNBE, JAE = JNB, JBE = JNA, JG = JNLE, JGE= JNL, JL= JNGE, ....
4. 端口
端口是直接和外部设备通讯的地方。外设接入系统后,系统就会把外设的数据接口映射到特定的端口地址空间,这样,从该端口读入数据就是从外设读入数据,而向外设写入数据就是向端口写入数据。当然这一切都必须遵循外设的工作方式。端口的地址空间与内存地址空间无关,系统总共提供对64K个8位端口的访问,编号0-65535. 相邻的8位端口可以组成成一个16位端口,相邻的16位端口可以组成一个32位端口。端口输入输出由指令IN,OUT,INS和OUTS实现,具体可参考汇编语言书籍。
汇编指令的操作数可以是内存中的数据, 如何让程序从内存中正确取得所需要的数据就是对内存的寻址.
INTEL 的CPU 可以工作在两种寻址模式:实模式和保护模式. 前者已经过时,就不讲了, WINDOWS 现在是32位保护模式的系统, PE 文件就基本是运行在一个32位线性地址空间, 所以这里就只介绍32位线性空间的寻址方式.
其实线性地址的概念是很直观的, 就想象一系列字节排成一长队,第一个字节编号为0, 第二个编号位1, .... 一直到4294967295(十六进制FFFFFFFF,这是32位二进制数所能表达的最大值了). 这已经有4GB的容量! 足够容纳一个程序所有的代码和数据. 当然, 这并不表示你的机器有那么多内存. 物理内存的管理和分配是很复杂的内容, 初学者不必在意, 总之, 从程序本身的角度看, 就好象是在那么大的内存中.
在INTEL系统中, 内存地址总是由"段选择符:有效地址"的方式给出.段选择符(SELECTOR)存放在某一个段寄存器中, 有效地址则可由不同的方式给出. 段选择符通过检索段描述符确定段的起始地址, 长度(又称段限制), 粒度, 存取权限, 访问性质等. 先不用深究这些, 只要知道段选择符可以确定段的性质就行了. 一旦由选择符确定了段, 有效地址相对于段的基地址开始算. 比如由选择符1A7选择的数据段, 其基地址是400000, 把1A7 装入DS中, 就确定使用该数据段. DS:0 就指向线性地址400000. DS:1F5278 就指向线性地址5E5278. 我们在一般情况下, 看不到也不需要看到段的起始地址, 只需要关心在该段中的有效地址就行了. 在32位系统中, 有效地址也是由32位数字表示, 就是说, 只要有一个段就足以涵盖4GB线性地址空间, 为什么还要有不同的段选择符呢? 正如前面所说的, 这是为了对数据进行不同性质的访问. 非法的访问将产生异常中断, 而这正是保护模式的核心内容, 是构造优先级和多任务系统的基础. 这里有涉及到很多深层的东西, 初学者先可不必理会.
有效地址的计算方式是: 基址+间址*比例因子+偏移量. 这些量都是指段内的相对于段起始地址的量度, 和段的起始地址没有关系. 比如, 基址=100000, 间址=400, 比例因子=4, 偏移量=20000, 则有效地址为:
100000+400*4+20000=100000+1000+20000=121000. 对应的线性地址是400000+121000=521000. (注意, 都是十六进制数).
基址可以放在任何32位通用寄存器中, 间址也可以放在除ESP外的任何一个通用寄存器中. 比例因子可以是1, 2, 4 或8. 偏移量是立即数. 如: [EBP+EDX*8+200]就是一个有效的有效地址表达式. 当然, 多数情况下用不着这么复杂, 间址,比例因子和偏移量不一定要出现.
内存的基本单位是字节(BYTE). 每个字节是8个二进制位, 所以每个字节能表示的最大的数是11111111, 即十进制的255. 一般来说, 用十六进制比较方便, 因为每4个二进制位刚好等于1个十六进制位, 11111111b = 0xFF. 内存中的字节是连续存放的, 两个字节构成一个字(WORD), 两个字构成一个双字(DWORD). 在INTEL架构中, 采用small endian格式, 即在内存中,高位字节在低位字节后面. 举例说明:十六进制数803E7D0C, 每两位是一个字节, 在内存中的形式是: 0C 7D 3E 80. 在32位寄存器中则是正常形式,如在EAX就是803E7D0C. 当我们的形式地址指向这个数的时候,实际上是指向第一个字节,即0C. 我们可以指定访问长度是字节, 字或者双字. 假设DSEDX]指向第一个字节0C:
mov AL, byte ptr DSEDX] ;把字节0C存入AL
mov AX, word ptr DSEDX] ;把字7D0C存入AX
mov EAX, dword ptr DSEDX] ;把双字803E7D0C存入EAX
在段的属性中,有一个就是缺省访问宽度.如果缺省访问宽度为双字(在32位系统中经常如此),那么要进行字节或字的访问,就必须用byte/word ptr显式地指明.
缺省段选择:如果指令中只有作为段内偏移的有效地址,而没有指明在哪一个段里的时候,有如下规则:
如果用ebp和esp作为基址或间址,则认为是在SS确定的段中;
其他情况,都认为是在DS确定的段中。
如果想打破这个规则,就必须使用段超越前缀。举例如下:
mov eax, dword ptr [edx] ;缺省使用DS,把DSEDX]指向的双字送入eax
mov ebx, dword ptr ESEDX] ;使用ES:段超越前缀,把ESEDX]指向的双字送入ebx
堆栈:
堆栈是一种数据结构,严格地应该叫做“栈”。“堆”是另一种类似但不同的结构。SS 和 ESP 是INTEL对栈这种数据结构的硬件支持。push/pop指令是专门针对栈结构的特定操作。SS指定一个段为栈段,ESP则指出当前的栈顶。push xxx 指令作如下操作:
把ESP的值减去4;
把xxx存入SSESP]指向的内存单元。
这样,esp的值减小了4,并且SSESP]指向新压入的xxx. 所以栈是“倒着长”的,从高地址向低地址方向扩展。pop yyy 指令做相反的操作,把SSESP]指向的双字送到yyy指定的寄存器或内存单元,然后把esp的值加上4。这时,认为该值已被弹出,不再在栈上了,因为它虽然还暂时存在在原来的栈顶位置,但下一个push操作就会把它覆盖。因此,在栈段中地址低于esp的内存单元中的数据均被认为是未定义的。
最后,有一个要注意的事实是,汇编语言是面向机器的,指令和机器码基本上是一一对应的,所以它们的实现取决于硬件.有些看似合理的指令实际上是不存在的,比如:
mov DSedx], dsecx] ;内存单元之间不能直接传送
mov DS, 1A7 ;段寄存器不能直接由立即数赋值
mov EIP, 3D4E7 ;不能对指令指针直接操作.
 
阅读全文(1676) |评论:0 |复制链接
常见的十四种Java开发工具及其特点(2006-1-10 21:38:00)
、JDK  (Java  Development  Kit)Java开发工具集
从初学者角度来看,采用JDK开发Java程序能够很快理解程序中各部分代码之间的关系,有利于理解Java面向对象的设计思想。JDK的另一个显著特点是随着Java  (J2EE、J2SE以及J2ME)版本的升级而升级。但它的缺点也是非常明显的就是从事大规模企业级Java应用开发非常困难,不能进行复杂的Java软件开发,也不利于团体协同开发。
2、Java  Workshop
3、NetBeans  与Sun  Java  Studio  5
NetBeans是开放源码的Java集成开发环境(IDE),适用于各种客户机和Web应用。Sun  Java  Studio是Sun公司最新发布的商用全功能Java  IDE,支持Solaris、Linux和Windows平台,适于创建和部署2层Java  Web应用和n层J2EE应用的企业开发人员使用。
NetBeans是业界第一款支持创新型Java开发的开放源码IDE。开发人员可以利用业界强大的开发工具来构建桌面、Web或移动应用。同时,通过NetBeans和开放的API的模块化结构,第三方能够非常轻松地扩展或集成NetBeans平台。
NetBeans3.5.1主要针对一般Java软件的开发者,而Java  One  Studio5则主要针对企业做网络服务等应用的开发者。Sun不久还将推出Project  Rave,其目标是帮助企业的开发者进行软件开发。
NetBeans  3.5.1版本与其他开发工具相比,最大区别在于不仅能够开发各种台式机上的应用,而且可以用来开发网络服务方面的应用,可以开发基于J2ME的移动设备上的应用等。在NetBeans  3.5.1基础上,Sun开发出了Java  One  Studio5,为用户提供了一个更加先进的企业编程环境。在新的Java  One  Studio5里有一个应用框架,开发者可以利用这些模块快速开发自己在网络服务方面的各种应用程序。
4、Borland  的JBuilder
Jbuilder进入了Java集成开发环境的王国,它满足很多方面的应用,尤其是对于服务器方以及EJB开发者们来说。下面简单介绍一下Jbuilder的特点:
1)Jbuilder支持最新的Java技术,包括Applets、JSP/Servlets、JavaBean以及EJB(Enterprise  JavaBeans)的应用。
2)用户可以自动地生成基于后端数据库表的EJB  Java类,Jbuilder同时还简化了EJB的自动部署功能.此外它还支持CORBA,相应的向导程序有助于用户全面地管理IDL(分布应用程序所必需的接口定义语言Interface  Definition  Language)和控制远程对象。
3)Jbuilder支持各种应用服务器。Jbuilder与Inprise  Application  Server紧密集成,同时支持WebLogic  Server,支持EJB  1.1和EJB  2.0,可以快速开发J2EE的电子商务应用。
4)Jbuilder能用Servlet和JSP开发和调试动态Web  应用。
5)利用Jbuilder可创建(没有专有代码和标记)纯Java2应用。由于Jbuilder是用纯Java语言编写的,其代码不含任何专属代码和标记,它支持最新的Java标准。
6)Jbuilder拥有专业化的图形调试介面,支持远程调试和多线程调试,调试器支持各种JDK版本,包括J2ME/J2SE/J2EE。
JBuilder环境开发程序方便,它是纯的Java  开发环境,适合企业的J2EE开发;缺点是往往一开始人们难于把握整个程序各部分之间的关系,对机器的硬件要求较高,比较吃内存,这时运行速度显得较慢。
5、Oracle  的JDeveloper
Oracle9i  JDeveloper(定为9.0版,最新为10g)为构建具有J2EE功能,XML和Web  services的复杂的,多层的Java应用程序提供了一个完全集成的开发环境。它为运用Oracle9i数据库和应用服务器的开发人员提供特殊的功能和增强性能,除此以外,它也有资格成为用于多种用途Java开发的一个强大的工具。
Oracle9i  JDeveloper的主要特点如下:
①  具有UML(Unified  Modeling  Language,一体化建模语言)建模功能。可以将业务对象及e-business应用模型化。
②  配备有高速Java调试器(Debuger)、内置Profiling工具、提高代码质量的工具“CodeCoach”等。
③  支持SOAP(Simple  Object  Access  Protocol)“简单对象访问协议”、UDDI(Universal  Description,  Discovery  and  Integration)“统一描述、发现和集成协议”、WSDL(Web  Services  Description  Language)“WEB服务描述语言”等Web服务标准。
JDeveloper  不仅仅是很好的  Java  编程工具,而且是  Oracle  Web  服务的延伸,支  Apache  SOAP,以及  9iAS  ,可扩充的环境和  XML  和  WSDL  语言紧密相关。Oracle9i  Jdeveloper完全利用Java编写,能够与以前的Oracle服务器软件以及其他厂商支持J2EE的应用服务器产品相兼容,而且在设计时着重针对Oracle9i,能够无缝化跨平台之间的应用开发,提供了业界第一个完整的、集成了J2EE和XML的开发环境,允许开发者快速开发可以通过Web、无线设备及语音界面访问的Web服务和交易应用,以往只能通过将传统Java编程技巧与最新模块化方式结合到一个单一集成的开发环境中之后才能完成J2EE应用开发生命周期管理的事实,从根本上得到改变。缺点就是对于初学者来说,较复杂,也比较难。
阅读全文(1577) |评论:0 |复制链接
编程秘籍:使C语言高效的四大绝招 (2006-1-10 21:23:00)
编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就是针对编程工作中的一些体会和经验做相关的阐述。
第一招:以空间换时间
计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值:
方法A:通常的办法
#define LEN 32 char string1 [LEN]; memset (string1,0,LEN); strcpy (string1,"This is a example!!");
方法B:
const char string2[LEN] ="This is a example!"; char * cp; cp = string2 ;
使用的时候可以直接用指针来操作。
从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。
如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。该招数的变招--使用宏函数而不是函数。举例如下:
方法C:
#define bwMCDR2_ADDRESS 4 #define bsMCDR2_ADDRESS 17 int BIT_MASK(int __bf) {  return ((1U << (bw ## __bf)) - 1)<< (bs ## __bf); } void SET_BITS(int __dst, int __bf, int __val) {  __dst = ((__dst) & ~(BIT_MASK(__bf))) |  (((__val) << (bs ## __bf)) & (BIT_MASK(__bf)))) } SET_BITS(MCDR2, MCDR2_ADDRESS,ReGISterNumber);
方法D:
#define bwMCDR2_ADDRESS 4 #define bsMCDR2_ADDRESS 17 #define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS) #define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf)) #define SET_BITS(__dst, __bf, __val) ((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | (((__val) << (bs ## __bf)) & (BIT_MASK(__bf)))) SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU时间。
而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。
D方法是我看到的最好的置位操作函数,是ARM公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C方法是其变体,其中滋味还需大家仔细体会。
第二招:数学方法解决问题
现在我们演绎高效C语言编写的第二招--采用数学方法来解决问题。数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。举例如下,求 1~100的和。
方法E:
int I , j; for (I = 1 ;I<=100; I ++) {  j += I; }
方法F
int I; I = (100 * (1+100)) / 2
这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式 N×(N+1)/ 2 来解决这个问题。方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1次乘法,1次除法。效果自然不言而喻。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。
第三招:使用位操作
实现高效的C语言编写的第三招——使用位操作。减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用"位运算"来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例如下:
方法G
int I,J; I = 257 /8; J = 456 % 32;
方法H
int I,J; I = 257 >>3; J = 456 - (456 >> 4 << 4);
在字面上好像H比G麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法G调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方法H则仅仅是几句相关的汇编,代码更简洁,效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 来看,效率的差距还是不小。相关汇编代码就不在这里列举了。
运用这招需要注意的是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。
第四招:汇编嵌入
高效C语言编程的必杀技,第四招——嵌入汇编。"在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾"。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法--嵌入汇编,混合编程。举例如下,将数组一赋值给数组二,要求每一字节都相符。
char string1[1024],string2[1024];
方法I
int I; for (I =0 ;I<1024;I++)  *(string2 + I) = *(string1 + I)
方法J
#ifdef _PC_ int I; for (I =0 ;I<1024;I++) *(string2 + I) = *(string1 + I); #else #ifdef _ARM_ __asm {  MOV R0,string1  MOV R1,string2  MOV R2,#0 loop:  LDMIA R0!, [R3-R11]  STMIA R1!, [R3-R11]  ADD R2,R2,#8  CMP R2, #400  BNE loop } #endif
方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作。这里有朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作。这个例程典型应用于LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。
虽然是必杀技,但是如果轻易使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。
 
阅读全文(1508) |评论:0 |复制链接
中间件主流技术及其未来发展精解 (转)(2006-1-10 21:14:00)
中间件定义:
中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算资源和网络通讯。
中间件特点:
满足大量应用的需要 ;
运行于多种硬件和OS平台 ;
支持分布式计算,提供跨网络、硬件和OS平台的透明性的应用或服务的交互功能 ;
支持标准的协议 ;
支持标准的接口。
中间件分类:
分为数据访问中间件、远程过程调用中间件、消息中间件、交易中
一、概述
1.中间件的概念
随着计算机技术的飞速发展,各种各样的应用软件需要在各种平台之间进行移植,或者一个平台需要支持多种应用软件和管理多种应用系统,软、硬件平台和应用系统之间需要可靠和高效的数据传递或转换,使系统的协同性得以保证。这些,都需要一种构筑于软、硬件平台之上,同时对更上层的应用软件提供支持的软件系统,而中间件正是在这个环境下应孕而生。
由于中间件技术正处于发展过程之中,因此目前尚不能对它进行精确的定义。
比较流行的定义是:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/服务器的操作系统之上,管理计算资源和网络通讯。
从中间件的定义可以看出,中间件是一类软件,而非一种软件;中间件不仅仅实现互连,还要实现应用之间的互操作;中间件是基于分布式处理的软件,定义中特别强调了其网络通讯功能。
2.中间件特点及优势
通常意义下,中间件应具有以下的一些特点:满足大量应用的需要;运行于多种硬件和OS平台;支持分布式计算,提供跨网络、硬件和OS平台的透明性的应用或服务的交互功能;支持标准的协议;支持标准的接口。
程序员通过调用中间件提供的大量API,实现异构环境的通讯,从而屏蔽异构系统中复杂的操作系统和网络协议。
中间件提供客户机与服务器之间的连接服务,这些服务具有标准的程序接口和协议。针对不同的操作系统和硬件平台,它们可以有符合接口和协议规范的多种实现。
由于标准接口对于可移植性和标准协议对于互操作性的重要性,中间件已成为许多标准化工作的主要部分。对于应用软件开发,中间件远比操作系统和网络服务更为重要,中间件提供的程序接口定义了一个相对稳定的高层应用环境,不管底层的计算机硬件和系统软件怎样更新换代,只要将中间件升级更新,并保持中间件对外的接口定义不变,应用软件几乎不需任何修改,从而保护了企业在应用软件开发和维护中的重大投资。
中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件软件管理着客户端程序和数据库或者早期应用软件之间的通讯。
中间件在分布式的客户和服务之间扮演着承上启下的角色,如事务管理、负载均衡以及基于Web的计算等。
利用这些技术有助于减轻应用软件开发者的负担,使他们利用现有的硬件设备、操作系统、网络、数据库管理系统以及对象模型创建分布式应用软件时更加得心应手。由于中间件能够保护企业的投资,保证应用软件的相对稳定,实现应用软件的功能扩展;同时中间件产品在很大程度上简化了一个由不同硬件构成的分布式处理环境的复杂性,所以它的出现正日益引起用户的关注。
世界著名的咨询机构The Standish Group在一份研究报告中归纳了中间件的十大优越性:
(1)应用开发:The Standish Group 分析了100个关键应用系统中的业务逻辑程序、应用逻辑程序及基础程序所占的比例;业务逻辑程序和应用逻辑程序仅占总程序量的30%,而基础程序占了70%,使用传统意义上的中间件一项就可以节省25%~60%的应用开发费用。如是以新一代的中间件系列产品来组合应用,同时配合以可复用的商务对象构件,则应用开发费用可节省至80%。
(2)系统运行:没有使用中间件的应用系统,其初期的资金及运行费用的投入要比同规模的使用中间件的应用系统多一倍。
(3)开发周期:基础软件的开发是一件耗时的工作,若使用标准商业中间件则可缩短开发周期50%~75%。
(4)减少项目开发风险:研究表明,没有使用标准商业中间件的关键应用系统开发项目的失败率高于90%。企业自己开发内置的基础(中间件)软件是得不偿失的,项目总的开支至少要翻一倍,甚至会十几倍。
(5)合理运用资金:借助标准的商业中间件,企业可以很容易地在现有或遗留系统之上或之外增加新的功能模块,并将它们与原有统无缝集合。依靠标准的中间件,可以将老的系统改头换面成新潮的Internet/Intranet 应用系统。
(6)应用集合:依靠标准的中间件可以将现有的应用、新的应用和购买的商务构件融合在一起进行应用集合。
(7)系统维护:需要一提的是,基础(中间件)软件的自我开发是要付出很高代价的,此外,每年维护自我开发的基础(中间件)软件的开支则需要当初开发费用的15%~25%,每年应用程序的维护开支也还需要当初项目总费用的10%~20%左右。而在一般情况下,购买标准商业中间件每年只需付出产品价格的15%~20%的维护费,当然,中间件产品的具体价格要依据产品购买数量及哪一家厂商而定。
(8)质量:基于企业自我建造的基础(中间件)软件平台上的应用系统,每增加一个新的模块,就要相应地在基础(中间件)软件之上进行改动。而标准的中间件在接口方面都是清晰和规范的。标准中间件的规范化模块可以有效地保证应用系统质量及减少新旧系统维护开支。
(9)技术革新:企业对自我建造的基础(中间件)软件平台的频繁革新是极不容易实现的(不实际的)。而购买标准的商业中间件,则对技术的发展与变化可以放心,中间件厂商会责无旁贷地把握技术方向和进行技术革新。
(10)增加产品吸引力:不同的商业中间件提供不同的功能模型,合理使用,可以让你的应用更容易增添新的表现形式与新的服务项目。从另一个角度看,可靠的商业中间件也使得企业的应用系统更完善,更出众。
具体地说,中间件屏蔽了低层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担。
中间件带给应用系统的不只是开发的简单、开发周期的缩短,也减少了系统的维护、运行和管理的工作量,还减少了计算机总体费用的投入。The Standish Group的调查报告显示,由于采用了中间件技术,应用系统的总建设费用可以减少50%左右。在网络经济大发展、电子商务大发展的今天,从中间件获得利益的不只是IT厂商,IT用户同样是赢家,并且是更有把握的赢家。
中间件作为新层次的基础软件,其重要作用是将不同时期、在不同操作系统上开发应用软件集成起来,彼此像一个天衣无缝的整体协调工作,这是操作系统、数据库管理系统本身做不了的。中间件的这一作用,在技术不断发展之后,使以往在应用软件上的劳动成果仍然物有所用,节约了大量的人力、财力投入。
3.中间件的应用领域与分类
随着计算机软件技术的发展,中间件技术也已经日渐成熟,并且出现了不同层次、不同类型的中间件产品。按照IDC 的分类方法,中间件可分为六类。分别是数据访问中间件、远程过程调用中间件、消息中间件、交易中间件、对象中间件等。
数据访问中间件:是为了建立数据应用资源互操作的模式,对异构环境下的数据库实现联接或文件系统实现联接的中间件;
远程过程调用中间件:通过这种远程过程调用机制,程序员编写客户方的应用,需要时可以调用位于远端服务器上的过程;
消息中间件:用来屏蔽掉各种平台及协议之间的特性,进行相互通信,实现应用程序之间的协同;
交易中间件:是在分布、异构环境下提供保证交易完整性和数据完整性的一种环境平台;
对象中间件:在分布、异构的网络计算环境中,可以将各种分布对象有机地结合在一起,完成系统的快速集成,实现对象重用。
目前国内外有不少厂商都开发出自己的中间件产品,其中有全球最大的独立中间件厂商BEA公司,还有像IBM、Oracl e和Microsoft、HP、Sun等大厂商也早已涉足电子商务中间件。
面向对象的中间件是对象技术和分布式计算发展的产物,业界普遍认为面向对象是今后中间件发展的主流方向,它提供一种通讯机制,透明地在异构的分布计算环境中传递对象请求,而这些对象可以位于本地或者远程机器。
面向对象标准原本只有一个,即CORBA(公共对象请求代理体系结构),该标准由包括BEA、IBM、Oracle、Sun和Sybas e等公司在内的众多厂商一起制定,从而形成了一个庞大的CORBA联盟势力。后来,Sun推出了企业级JavaBeans(EJB),用自己易使用的程序模型来对CORBA做出了改进。微软COM(Component Object Model,组件对象模型)的出现,使面向对象中间件市场里又多了一个标准,这样,面向对象中间件产品实际上形成了两大标准,一是微软的COM,一是JavaBeans。
从宏观上看,中间件可以分为3大类:
数据类:用于数据的存取、利用和增值,此类中间件用于构建以数据为中心的应用。
处理类:把分布在网络结点上的各个应用或处理连接在一起,形成一个统一的分布式应用。
分布式构件类:支持构件式应用,未来应用的发展方向,目前竞争激烈。
为了更加清晰起见,我们把中间件细分为12种,如下:中间件细分表
二、中间件的技术规范
1.DCE体系
DCE是Distrbuted Computing Environment 分布式计算环境的缩写,它由Open Software Fondation 制定,现在这个组织被称为Open Group。
DCE由多个共同在一起工作的组件组成,它们是:远程过程调用(RPC)、本地和全局目录服务(CDS和GDS)、安全服务、DCE线程、分布式时钟服务(DTS)和分布式文件服务(DFC)。线程、RPC、CDS、安全服务和DTS组件通常被成为安全核心,并且是组成任何DCE环境所必须的组件,DTS是可选件。在DCE环境中,还包括用于管理这些组件的管理工具。
DCE被称做中间件或使其具有能力的技术,它不是独立存在的,而是被捆绑在供应商操作系统中,或者由第三方供应商进行集成。
2.DTP模型
DTP模型是X/OPEN组织提出的一种软件结构,这种结构允许多个应用程序去共享多个资源管理器提供的资源,并且具有协调全局事物的能力。
X/OPEN是一个独立的、具有全球影响力的开放系统组织,它得到了世界大多数的最大的信息系统供应商的支持,其根本任何是通过规范开放系统的具体实现,从计算的观点考虑如何让用户获得更大的利益。
X/OPEN的DTP模型由5个基本模块组成:
应用程序(AP):用于定义事物的边界,并确定组成事物操作的动作。
资源管理器(RM):如数据库或文件系统用于存取文件。
事物管理器(TP):给事物分配标识,监督事物的处理过程并负责事物的完成以及协调事物失败的恢复。
通信资源管理器(CRM):在一个事物管理器内或两个事物管理器之间对通信进行控制。
在这5个模块之间X/OPEN模型定义了这样一些模块与模块之间的接口规范:
应用程序——资源管理器之间已经存在了一些X/OPEN的规范,如SQL和ISAM;在应用程序——事物管理器之间定义了TX接口;在交易管理器——资源管理器之间定义了XA接口;在交易管理器——通信资源管理器之间定义了XA+接口;在应用程序——通信资源管理器之间有3种接口:TXRPC、XATMI和CPI-C;在通信资源管理器——操作系统提供的底层通信协议之间提供了XAP-TP接口。
3.CORBA
CORBA是Common Object Request Broker Architecture的缩写,简称公共对象请求代理结构,它由国际对象管理组织OMG制定,这个组织是一个国际性组织,始建于1989年,现已拥有包括生产厂商与软件开发商800多个会员,其目的是在分布和已构计算机环境下为应用软件的开发提供一个公共框架,使开发出来的软件即面向对象又具有可重用性、可移植性以及可操作性等特点。有关CORBA的其他功能情况参见下面的第三部分说明。
4.J2EE
J2EE是Java 2 Platform Enterprise Edition的缩写,是一种多层应用模式的结构体系。整个规范由SUN公司提出,它将业务逻辑从系统服务功能和用户界面中分离出去,放置在客户层和应用基础设施这两层之间的中间层,是目前应用的最为广泛的面向Web的应用系统结构规范。有关J2EE的其他功能情况参见下面的第三部分说明。
5.互联网相关技术规范
Web(World Wide Web)是一种网络化的信息资源,它依赖于3个机制,使这些信息资源可以面对广大的使用者。
1)一种唯一的命名机制,为网上的资源进行定位,如:URI。
2)一种通信规程,以便在网上可以存取这些被命名的资源,如:HTTP。
3)混合文本,以便更好地驾御这些信息资源,如:HTML。
URI(Universal Resource Identifier)全局资源标识,一种命名机制,它将在网上的一个资源的定位分为3个部分:用于存取资源的通信方式的名称,如HTTP、FTP;保存有资源的机器的名称,如:www.sohu.com;资源本身的名称,也就是存取这些资源的路径。HTTP(HyperText Transfer Protocol)是一种用于分布式、相互协作、混合型媒体的信息系统的应用层的通信规程。使用这一规程,除了可以在信息系统中取得资料外,还可以进行资料查询,对前端进行更新以及进行信息发布等操作。
HTML(HyperText Markup Language)是一种网上使用的出版语言,它可以为作者提供这样的功能:在在线出版的文档中包括标题、文本、表格、列表和照片等;按下鼠标后,通过混合文本链路查找文本;与远端的服务为进行联机事物处理建立表格,以便进行信息查找、预定和订购产品等操作;在文档中直接包含独立页面、影像资料与声音资料等。
这些规范都是web技术的基础,除了这些技术规范以外,还有一些规范也非常重要,它的用途是实现企业与企业间通过Web实现数据交换。这些规范是XML、SOAP、UDDI和WSDL。
vXML(Extensible Markup Language)通过提供更灵活和更容易被接收的信息标识方法来改进Web的功能。XML被称为可扩展的标注语言,它不像HTML是一种单一的、预先定义的语言,XML是一种用于描述其他语言的语言,使用XML,你可以定义你自己的、不受到类型限制的、其他类型的文档。
SOAP(Simple Object Access Protocol)是一种轻量级规程,用于在没有控制中心、分布式的环境中交换信息。它以XML为基础,由4个部分组成:一个信封,定义了是什么信息和如何对它进行处理的框架;一组编码规则,用于描述应用定义的数据类型的表示示例;一组表示远程过程调用和应答的规则方式,以及一组捆绑方式,这种方式用于使用低层通信规程交换信息。SOAP具有与其他规则相结合的可能性。
UDDI(Universal Description,Discovery and Integration)是一个规范,这个规范用于Web服务以分布式、以Web为基础的信息的注册。UDDI同时也是一个这样的规范的实现的公用的可接入的集合,这个规范是是某个企业的Web服务所能提供的内容用登记信息的方式提供出来,以便其他企业可以发现这些服务。Web服务是Web技术的下一步发展方向,它可以允许可编程的被放置在Web上,其他方可以使用分布式的方式进行存取。
WSDL(Web Service Description Language)是一组包含面向文档或面向过程消息的端点操作信息的xml格式网络服务描述;操作和消息首先被抽象的描述,然后捆绑到具体的网络规程和消息格式中,以便定义端点,相关的具体端点被组合进抽象的端点中(服务)。WSDL可以捆绑描述与SOAP、HTTP GET/POST和MIME相关。
三、主流中间件技术平台
下面重点阐述和比较了三大主流中间件技术平台,使读者加深对中间件技术理解。
1.当前支持服务器端中间件技术的平台
考察当前主流的分布计算技术平台,主要有OMG的CORBA、Sun的J2EE和Microsoft DNA 2000。它们都是支持服务器端中间件技术开发的平台,但都有其各自的特点,将分别阐述如下。
(1)OMG的CORBA
CORBA分布计算技术是OMG组织基于众多开放系统平台厂商提交的分布对象互操作内容的基础上制定的公共对象请求代理体系规范。
CORBA分布计算技术,是由绝大多数分布计算平台厂商所支持和遵循的系统规范技术,具有模型完整、先进,独立于系统平台和开发语言,被支持程度广泛的特点,已逐渐成为分布计算技术的标准。COBRA标准主要分为3个层次:对象请求代理、公共对象服务和公共设施。最底层是对象请求代理ORB,规定了分布对象的定义(接口)和语言映射,实现对象间的通讯和互操作,是分布对象系统中的"软总线";在ORB之上定义了很多公共服务,可以提供诸如并发服务、名字服务、事务(交易)服务、安全服务等各种各样的服务;最上层的公共设施则定义了组件框架,提供可直接为业务对象使用的服务,规定业务对象有效协作所需的协定规则。目前,CORBA兼容的分布计算产品层出不穷,其中有中间件厂商的ORB产品,如BEAM3,IBM Component Broker,有分布对象厂商推出的产品,如IONAObix和OOCObacus等。
CORBA规范的近期发展,增加了面向Internet的特性,服务质量控制和CORBA构件模型(CORBA Component Model)。
Internet集成特性包括了针对IIOP传输的防火墙(Firewall)和可内部操作的定义了URL命名格式的命名服务(Naming Service)。
服务质量控制包括能够具有质量控制的异步消息服务,一组针对嵌入系统的CORBA定义,一组关于实时CORBA与容错CORBA的请求方案。
CORBA CCM(CORBA Component Model)技术,是在支持POA的CORBA规范(版本2.3以后)基础上,结合EJB当前规范的基础上发展起来的。CORBA构件模型,是OMG组织制定的一个用于开发和配置分布式应用的服务器端中间件模型规范,它主要包括如下三项内容:
a、抽象构件模型,用以描述服务器端构件结构及构件间互操作的结构;
b、构件容器结构,用以提供通用的构件运行和管理环境,并支持对安全、事务、持久状态等系统服务的集成;
c、构件的配置和打包规范,CCM使用打包技术来管理构件的二进制、多语言版本的可执行代码和配置信息,并制定了构件包的具体内容和基于XML的文档内容标准。
总之,CORBA的特点是大而全,互操作性和开放性非常好。CORBA的缺点是庞大而复杂,并且技术和标准的更新相对较慢,COBRA规范从1.0升级到2.0所花的时间非常短,而再往上的版本的发布就相对十分缓慢了。在具体的应用中使用不是很多。
(2)Sun的J2EE
为了推动基于Java的服务器端应用开发, Sun于是在1999年底推出了Java2技术及相关的J2EE规范,J2EE的目标是:提供平台无关的、可移植的、支持并发访问和安全的,完全基于Java的开发服务器端中间件的标准。
在J2EE中,Sun给出了完整的基于Java语言开发面向企业分布应用规范,其中,在分布式互操作协议上,J2EE同时支持RMI和IIOP,而在服务器端分布式应用的构造形式,则包括了Java Servlet、JSP(Java Server Page)、EJB等多种形式,以支持不同的业务需求,而且Java应用程序具有"Write once,run anywhere"的特性,使得J2EE技术在发布计算领域得到了快速发展。
J2EE简化了构件可伸缩的、其于构件服务器端应用的复杂度,虽然DNA 2000也一样,但最大的区别是DNA 2000是一个产品,J2EE是一个规范,不同的厂家可以实现自己的符合J2EE规范的产品,J2EE规范,是众多厂家参与制定的,它不为Sun所独有,而且其支持跨平台的开发,目前许多大的分布计算平台厂商都公开支持与J2EE兼容技术。
EJB是Sun推出的基于Java的服务器端构件规范J2EE的一部分,自从J2EE推出之后,得到了广泛的发展,已经成为应用服务器端的标准技术。SunEJB技术是在Java Bean本地构件基础上,发展的面向服务器端分布应用构件技术。它基于Java语言,提供了基于Java二进制字节代码的重用方式。EJB给出了系统的服务器端分布构件规范,这包括了构件、构件容器的接口规范以及构件打包、构件配置等的标准规范内容。EJB技术的推出,使得用Java基于构件方法开发服务器端分布式应用成为可能。从企业应用多层结构的角度,EJB是业务逻辑层的中间件技术,与JavaBeans不同,它提供了事务处理的能力,自从三层结构提出以后,中间层,也就是业务逻辑层,是处理事务的核心,从数据存储层分离,取代了存储层的大部分地位。从分布式计算的角度,EJB像CORBA一样,提供了分布式技术的基础。提供了对象之间的通讯手段。从Internet技术应用的角度,EJB和Servlet,JSP一起成为新一代应用服务器的技术标准,EJB中的Bean可以分为会话Bean和实体Bean,前者维护会话,后者处理事务,现在Servlet负责与客户端通信,访问EJB,并把结果通过JSP产生页面传回客户端。
J2EE的优点是,服务器市场的主流还是大型机和UNIX平台,这意味着以Java开发构件,能够做到"Write once,run anywhere",开发的应用可以配置到包括Windows平台在内的任何服务器端环境中去。
(3)Microsoft DNA 2000
Microsoft DNA 2000(Distributed interNet Applications)是Microsoft在推出Windows2000系列操作系统平台基础上,在扩展了分布计算模型,以及改造Back Office系列服务器端分布计算产品后发布的新的分布计算体系结构和规范。
在服务器端,DNA 2000提供了ASP、COM、Cluster等的应用支持。目前,DNA2000在技术结构上有着巨大的优越性。一方面,由于Microsoft是操作系统平台厂商,因此DNA 2000技术得到了底层操作系统平台的强大支持;另一方面,由于Microsoft的操作系统平台应用广泛,支持该系统平台的应用开发厂商数目众多,因此在实际应用中,DNA 2000得到了众多应用开发商的采用和支持。
DNA 2000融合了当今最先进的分布计算理论和思想,如事务处理、可伸缩性、异步消息队列、集群等内容。DNA使得开发可以基于Microsoft平台的服务器构件应用,其中,如数据库事务服务、异步通讯服务和安全服务等,都由底层的分布对象系统提供。以Microsoft为首的DCOM/COM/COM+阵营,从DDE,OLE到ActiveX等,提供了中间件开发的基础,如VC,VB,Delphi等都支持DCOM,包括OLE DB在内新的数据库存取技术,随着Windows2000的发布,Microsoft的DCOM/COM/COM+技术,在DNA2000分布计算结构基础上,展现了一个全新的分布构件应用模型。首先,DCOM/COM/COM+的构件仍然采用普通的COM(Component Object Model)模型。COM最初作为Microsoft桌面系统的构件技术,主要为本地的OLE应用服务,但是随着Microsoft服务器操作系统NT和DCOM的发布,COM通过底层的远程支持使得构件技术延伸到了分布应用领域。DCOM/COM/COM+更将其扩充为面向服务器端分布应用的业务逻辑中间件。通过COM+的相关服务设施,如负载均衡、内存数据库、对象池、构件管理与配置等等,DCOM/COM/COM+将COM、DCOM、MTS的功能有机地统一在一起,形成了一个概念、功能强的构件应用体系结构。而且,DNA2000是单一厂家提供的分布对象构件模型,开发者使用的是同一厂家提供的系列开发工具,这比组合多家开发工具更有吸引力。
但是它的不足是依赖于Microsoft的操作系统平台,因而在其它开发系统平台(如Unix、Linux)上不能发挥作用。
2.相关性比较分析
目前,针对上述的各种分布计算平台技术,都出现了相似且具有可比性的分布式构件,即CORBA CCM(CORBA Component Model)技术、SUN的EJB(Enterprise JavaBean)技术和DNA 2000中的COM/DCOM/COM+技术。
对于以上三个分布计算平台,本文采用业界常用的做法从以下三个方面进行分析:
集成性:集成性主要反映在基础平台对应用程序互操作能力的支持上。它要求分布在不同机器平台和操作系统上、采用不同的语言或者开发工具生成的各类商业应用必须能集成在一起,构成一个统一的企业计算框架。这一集成框架必须建立在网络的基础之上,并且具备对于遗留应用的集成能力;
可用性:要求所采用的软件构件技术必须是成熟的技术,相应的产品也必须是成熟的产品,在至关重要的企业应用中能够稳定、安全、可靠地运行。另外,由于数据库在企业计算中扮演着重要角色,软件构件技术应能与数据库技术紧密集成;
可扩展性:集成框架必须是可扩展的,能够协调不同的设计模式和实现策略,可以根据企业计算的需求进行裁剪,并能迅速反应市场的变化和技术的发展趋势。通过保证当前应用的可重用性,最大程度地保护企业的投资。
下表从集成性,可用性,可扩展性三个方面,给出了上述三种主流分布计算平台的比较结果。

虽然这三种平台因为其形成的历史背景和商业背景有所不同,各自有自己的侧重和特点,其实在它们之间也有很大的相通性和互补性。
四、中间件是实现电子商务的基础软件
电子商务的本质就是对处于分布环境中的各种计算机系统进行交流协调,从而开创新的商业运作模式。网络通信,尤其是互联网技术,是电子商务的通信基础,而管理和传输系统之间的业务信息、协调各个系统的处理模块的中间管理服务系统,是保证电子商务应用成功的关键。电子商务应用服务器、通用业务网关、支付网关、通信平台和安全平台,统一纳入电子商务中间件构架的范畴。
从技术角度看,电子商务将由Internet/Intranet技术、传统IT技术以及具体的业务处理所构成。但是,系统的建立将会面临许多新的问题,包括应用系统能不能快速地建立,能不能适应大用户数、高处理量要求,能不能提供高效率、高可靠性、高可用性等等关键任务的要求,能不能满足安全需要等等。
以上这些问题,只是依靠简单的Web技术是不够的。目前常用的Web技术由于早期更多的是面向信息发布,因此存在并发访问瓶颈、难扩展、效率低、安全等诸多问题,不能满足电子商务的需要。为了很好地解决这些问题,需要以Web的低层技术为基础,规划出一个整体的应用框架,并提供一个支持平台,用于Internet应用的开发、部署和管理,并能籍此解决上述各种问题。这已经发展成为一个能广泛适应的标准的支撑层,成为Internet应用的基础设施(Infrastructure),这一支撑层实际上是基于Internet的中间件,也就是应用服务器。
同时,由于企业并不能把业务一不跨到Internet上,而必须同传统的应用系统结合,因此也必须通过中间件来集成Web应用和传统应用,实现完整的电子商务。
在这种情况下,电子商务应用应包含以下层次:
●浏览器:这是进入电子商务的通道。
●电子商务应用平台:提供电子商务不同应用类型的生成工具软件,如网上商店、网络支付、虚拟社区等等。
●电子商务交换平台:对内集成企业内部的各种与电子商务相关的业务系统,对外连接商业合作伙伴,如银行、供应商、客户、配送结构,完成各种不同业务系统之间数据转换和整和。
●电子商务基础平台:用来支持大量Internet客户的并发访问,使应用开发商快速开发出灵活多变的电子商务应用,尽快把信息系统和商务活动放到Internet中。
在电子商务交换平台和电子商务基础平台中都不能没有中间件的存在。可以说,没有中间件就不能支撑今天的网络应用。
电子商务中间件构架是一种电子商务应用集成的关键件,不管电子商务应用分布在什么硬件平台上,使用了什么数据库系统,透过了什么复杂的网络,电子商务应用的互连和互操作是电子商务中间件构架首先要解决的问题。在通信方面,电子商务中间件构架要支持各种通信协议和通信服务模式,传输各种数据内容,数据格式翻译、流量控制、数据加密、数据压缩等等;在电子商务中间件构架核心,要解决名字服务、安全控制、并发控制、可靠性和效率保证等;在电子商务应用开发方面,要能提供基于不同平台的丰富的开发接口,支持流行的开发工具和异构互连接口标准等;在管理方面,解决电子商务中间件构架本身的配置、监控、调谐,为电子商务应用的易用易管理提供保证。
其次,针对不同的Web应用环境,对电子商务中间件构架有各种不同的要求。对工作流应用,需要根据条件以及条件满足状态,将信息、响应状态从一个应用传递到另一个应用;对联机事务处理,需要保证分布式的数据一致性、不停机作业、大量并发的高效率;对于一个数据采集系统需要保证可靠传输等等。
五、中间件符合软件发展的潮流
软件构件化(Software Component)技术是在大工业生产启发下应运而生的,是软件技术跨世纪的一个发展趋势,其目的是彻底改变软件生产方式,从根本上提高软件生产的效率和质量,提高开发大型软件系统尤其是商用系统的成功率。有了软件构件之后,应用开发人员就可以利用现成的软件构件装配成适用于不同领域、功能各异的应用软件。复用软件一直是整个世界软件业所追求的梦想,软件构件化为实现这一梦想指出了一条切实可行的道路,而中间件正是构件化软件的一种形式。中间件抽象了典型的应用模式,应用软件制造者可以基于标准的形式进行开发,使软件构件化成为可能,加速了软件复用的进程。因此,中间件是符合软件发展的内在规律的。
中间件是软件技术发展的一种潮流,被誉为发展最快的软件品种,近年来势头强劲,当然,这也是源于市场在全球范围内对中间件的支持。毫无疑问,中间件正在成为软件行业新的技术与经济增长点。