炎 的个人资料知更鸟的巢照片日志列表更多 工具 帮助

黄 炎

职业
地点
兴趣
??好多不懂??
列表

知更鸟的巢

微软实习
第 1 张,共 20 张
8月30日

六级过拉~~~~~宣布一下~~~~~

恩~~~~~~分数很什么什么,大家就不用问了

全裸能过已经出乎我的意料了~~~~恩~~~~~~~开心~~~~~~~~

PS. 在MS做的Demo效果很好~~~~~老boss们很喜欢~~~~~~哈哈哈哈~~~~转正有希望啦。还可以借机到北京出差了~~~~~~~坐飞机~~~~~~~~好开心啊~~~~~~~~~~~~

8月9日

4.115

其实几天前就已经在写篇blog了,不过由于longhorn的蓝屏导致我所写的内容丢失,才耽搁下来了——想找个有空还有心情静下心来码文字的时候不容易啊……

4.115

4.115是我在微软的办公座位号,还记得一开始我没有门卡进不了office的时候,得找保安开门,保安就得核对你的名字和座位号。微软的每一个办公桌上都有一个卡,上面写着你的座位号,你的英文名,你的中文名。所以同事的姓名很容易就了解到了。比较搞笑的是我们老boss Alex Sutton(但愿我没有拼错老boss的名字),因为每个人都有一个中文名么,老外也不例外,Alex Sutton的中文名就是司徒安。还挺不错的哦。在办公室周围晃一圈就看到更多有意思的老外的中文名字了,Jon Teets就是姜天赐,还有一个英文名字我不记得了但是中文名字绝对牛x的:司马凯旋……

不要钱的酸奶

记得很早以前在校内bbs上面就有很多人在说google员工待遇怎么怎么好,酸奶都是不要钱的,随便喝。其实微软这边从很早开始也就都把员工待遇放在一个很重要的位置上面。(其实有点实力的外企都这样,留住牛人,让人们开心的被它剥削才是最重要的,所谓不战而屈人之兵,攻城为下攻心为上,相比国内的很多企业都鼠目寸光了(不过这也跟国内的环境分不开就是咯)。)在微软,每层楼都有一个活动室,里面有桌球台,乒乓球台(外加几个球和好多拍子),还有冰箱,里面有冷饮,饮料,牛奶,还有OT(Overtime==加班)食物柜,里面有各式点心,还有泡面火腿肠。还经常有新鲜水果,比如哈密瓜,西瓜,香蕉。每天大家早上来到公司,第一件事情不是去办公桌,而是先绕道去一下活动室吃早餐。牛奶+点心,完美啊。

其实公司在很多地方都做得很好,工作不相关的事情几乎不要你自己动手——垃圾有扫地阿姨清理,提供各种记事本、活页夹、贴纸、信封。安装系统有专门的IT部门的人任何机器设置的问题,包括联入网络阿都可以找他们(要知道这不是什么文职公司,这是微软,所有进来的人都是技术大牛)。总的来说就是公司希望你可以把所有的时间专心地用在工作上(好好的剥削你)。

All English

进来呆了一段时间之后,我终于理解了为什么微软的面试是全英文的了——因为在微软的工作需要全英文。微软完全没有把微软中国当作一个子公司,而是公司的一个分部。不仅我们周围有许多老外,很多项目其实都是这边和美国在一起做的。以我们team为例,HPC组在上海有14个人,在美国还有40-50个人。大家都在做一个项目。所以,微软只使用一种语言:英语。在微软,所有的书面材料,包括员工之间通讯所使用的email,都必须是英文的。(当然本地的宣传资料啥的另当别论。)也就是说,基本上除了中国员工之间说话会使用中文以外,你不会有任何机会使用中文。我们大老板是美国人,开会有他的时候,大家就说英语,开会没有他的时候,开会就用中文。还有许多和美国那边一起开的电视会议,那就肯定得用英语了。

恩~~~~~~这三个月下来我的英语一定会大涨的~~恩

Mail List

要说进了微软之后最让我激动的东西,就是微软庞大的mail list了。微软的产品自成一个体系,你想开发任何一个东西,你所需要的全部,用微软已有的产品就可以搞定。而微软提供了一个全球员工的mail list,在这个mail list里面有很多著名的传奇式的人物,软件开发者心中的偶像。微软还提供了一些讨论组,里面包含了某个产品的开发人员,你要是对某个产品有任何疑问,就可以向这个组发邮件,让这个组解答你的问题。

这就是在微软最爽的地方,你开发软件所用到的所有组件,都是微软的。而且,你有任何问题,都可以直接找到这个组件的开发者和设计者,让他们帮你们解答。(今天我还往WCF的讨论组问了一个问题,明天上班就应该有答复了。Visual Studio出了问题,就更方便了,直接跑到隔壁去把他们的Test纠过来看。)

而另一个阵营的程序员就辛苦得多了,他们不仅没有Visual Studio这样高度集成的开发工具,使用的组件也都是别的公司或者团体提供的。有了问题,只能看质量参差不其的doc,有的甚至没有doc,虽说是开源的你可以看源代码,但是看源代码和直接问开发者,两者的差距显而易见。

7月25日

纪念第一次独立完整地作出一桌菜~~鼓掌

恩~今天终于独立+完整地作出一桌菜来了(虽说才不是我买的,不过这个不是重点拉~~),纪念一下。
 
因为住在哥嫂家里,而且比哥嫂回来得都要早,于是就可以做好饭等哥嫂回来吃。主动请缨之后,嫂子还是很怀疑我做的菜吃了有没有危险的.....好伤心.......
其实前天的晚饭就都是我烧的,不过因为食材不够,所以只做了俩菜,不算一桌啦(不过今天也只做了三个)
 
虽说今天只做了三个菜,但是这三个菜都是我完全独立自主创新研发的,而且这三个菜一荤一素一汤,多完美的组合啊。俩人吃正好(我哥出差了,我跟我嫂二人世界,恩)
 
最后说下这三个菜:
荤:牛肉丝炒土豆丝,果然我的拿手菜还是炒肉丝啊,虽说是第一次做牛肉,但是味道控制的还是很好的,就是最后酱油多了点,肉还好,土豆丝的味道有点重,不过还是不错的~
素:清炒苦瓜,这个太简单了~~~
汤:丝瓜汤(只有这个材料了,再给我俩鸡蛋就好了.......)
 
恩~~~~纪念一下~~
 
ps.今天围上围裙的时候还是挺有家庭妇男的感觉的~~~~~hihi
7月18日

终于拿到微软的offer了

不知道多少年没有管这个blog了
不过这个紧张的学期总算是结束了,该忙得也算是忙完了。虽说紧接着就是MS的Summer Intern,但是,这个学期的事情也算告一段落了。接下来的事情接下来再说吧。
很幸运的,在寒假的时候制定的计划基本上都完成了。所谓基本上,主要也就是指的暑假拿到MS的intern。现在offer拿到了,成绩也都还不错(目前专业课成绩基本都出来了),好开心啊。
 
恩~~~~下面说说我的求职历程吧。
事先说一点,告诉各位将来也想找工作找实习的:如果毕业了之后就想工作,请务必在大三的暑假找一个实习,找不到没有关系,请一定要去找,因为你会发现找实习其实就是找工作的预演,你能够预先体验到找工作的压力。这个对将来真正的找工作是非常有好处的。
其实我早就准备去MS做intern了,在我寒假前去微软的参观的时候,就跟MS的pp的HRJJ们咨询了有关去MS作实习的相关事宜,HRJJ们都会以职业性的笑容告诉你,把简历交给我就好了。想来那个时候我还很嫩,现在看来,用笑里藏刀来形容HRJJ真是再合适不过了。
请记住,无论在任何时候(包括在拒你的时候),HRJJ都是永远非常nice的。但是HRJJ对你nice什么都不说明,这只是职业习惯而已。(或者说不nice的人是通不过HR面试的//esc)
寒假结束,我开始考虑如何写简历,当我开始动笔的时候,我才发现我完全不知道简历应该写成什么样子。我问了很多人,在网上看了一些Sample,但是还是不知道该怎么写。憋了好久终于憋出来的我的第一封简历,在我现在看来完全就是失败之作。但是当时居然HRJJ就肯面我了,现在想来很大程度上是因为寒假前跟HRJJ联系过了的关系吧。
简单总结下写简历的几个要点:
 1.除非有充足的理由,否则请附上英文和中文两份简历,当然如果有特殊需求可以附德文,日文,法文..................
 2.除非你有非常多的东西,否则简历不要超过一页纸。把简历当成一个A4大小的名片,好好设计,不一定要很花哨,但是要突出重点。写简历之前想想清楚你有哪些别人没有的优点或者经历,好好在简历中突出它,不要抱着些东西不放。记住,一封简历被HRJJ scan 一遍,很有可能小于20s,就这20s决定了人家要不要面你。
 3.海投!!!!!我吃这个亏吃大了。绝对不要想只投一家就好,或者自信满满的这家公司肯定要我,或者同时投多家都要面我或者都给offer了怎么办。一开始从最坏的情况考虑,如果不是有内部关系,投简历->(电)面的过程是一个随机过程(真的,比老师给你成绩还随机)。你可能会在2个月之后自己都忘记投了简历了的时候收到一封拒信或者HRJJ打电话给你叫你过去面试,更多的情况是根本就什么消息都没有。投很多很多家,看见可以投的就投,大不了最后拒掉就是咯。HRJJ们都时刻准备着被人拒掉(话说MS的HRJJ打电话叫我去面试之前就会先问,请问你现在还对这份job有兴趣么?)。如果有公司来学校招聘,绝对不要错过这个机会,这是比投简历好得多的机会,可能是笔试,可能是现场投递简历,抓住机会表现自己,不能害羞(这句是对我说的)
寒假回到学校还没有开学的那段时间,我就开始了偶人身的处女电面。话说第一次电面还是很尴尬的,HRJJ先打个电话给我说要给我面试,约好时间,然后跟我说清楚面试要用英语(虽说早就知道了但是还是很寒,其实面试用英语的还是很少的,我所知道的技术类面试只有微软是用英语的(大家齐声骂:本土化不够,几个中国人在一起说英语,人家Google面试都是用中文的)(不过SAP是不是英语就不知道了,人家笔试是英语(我都是指技术类)),其他就非技术类只有需要用到英语的时候才会要面英语,而且也不是全英语……)。接下来就是面试咯,虽说自己还是准备了一点的,但是还是缺乏经验啊。
简单说下面试的问题,一开始是自我介绍,然后是谈谈以前所做的最得意的项目,对MS的看法,最喜欢的MS的产品,一些技术性问题(比如32位机能支持的最大内存数目阿),一道Open的题目。简单来说,MS的电面是很随意的,没有很高的技术要求,但是要综合考虑你的经验和能力,注重看你的思考方法。用之后MS给我发的Interview Tips里面的话说:"We need native thinkers."
处女面最后以一段中文结束:你可以每周三天来工作么?周五至周日。er.....我指工作日。er.......那不行。
于是偶的处女面结束了。
 
于是一直到4月份,我都没有怎么管这个事情,一直觉得MS的话,summer intern应该没问题的。所以IBM来招人我没理,Google来笔试我也没有去。后来我开始联系MS,并通过我们学校的校园大使(就是主管本学校的学生实习的学生)的推荐又投了一份简历。结果得到的是我人生第一份拒信。(人生第一份拒信是MS的也还是挺有面子的哦)基本可以理解为是这封拒信敲醒我了,我开始觉得一份MS的实习offer不是那么理所当然就能拿到手的了。从这里我习得技能:海投,可惜为时已晚,IBM和Google都走了。
 
于是接下来就开始慌了,怕找不到实习暑假闲着,怕找不到实习就算提前毕业了也没有公司要我。这个时候我参加了SAP的笔试。那次笔试太搞笑了,一进考场,发现周围好多ppjj阿~~我当时就在那里纳闷,为什么招程序员会有这么多ppjj应聘,好神奇啊,好开心啊。然后要发考卷之前,主考官在上面说,我们招的是技术人员,不是应聘技术类的就可以直接出去了。没有人动。然后考卷发下来,全英文试卷,3道ASP.NET,3道C++,然后齐刷刷的,哗的一下站起来一半人,就直接这么走掉了。然后又陆陆续续走掉不少。我做完俩提之后环顾四周,发现果然ppjj们都不在了,伤心下,周围都是跟我一样的怪叔叔们了。之后SAP就再也没有联系过我,不过反正人家是招收的web程序员,也跟我没有啥关系,本来过去就是考虑到万一今年找不到实习明年还要找,积累一下笔试经验。
 
之后的某天,没有记错的话是5月23号,微软来复旦做了一个宣讲会,主要就是来号召大家都来报实习啦,算是什么微软校园行的一部分。后面还有现场投递简历。我也去投了简历,不过投了之后一直没有人理我.......
宣讲会除了介绍微软的最新技术(都是忽悠外行的)之外,还有一个挺有意思的模拟面试环节,就是从简历库里面筛选了3个人上来,模拟面试。简单介绍一下微软的面试,微软的面试是按轮的,一般是一对一,一轮又一轮,n个面试官轮流面你n轮,普通的实习生一般面3轮,像我是full time所以面5轮(这是后话,不过其实我没有要求做full time啊.....不管了)
被筛选的三个人,一个是本科生,大概是数学系的,有数模竞赛奖的,一个是研究生,大概是有工作经历的,一个是已经毕业的。还算有代表性啦。面试的第一轮是类似于自我介绍的,讲述自己的经历,曾经做过些什么,然后面试官针对你说的发问。第二轮面技术,问你技术问题。第三轮还是技术,但是比第二轮高层次一点,可能会问你怎么去做一个软件。大概就是这样啦。
 
后来某天编译project review的时候,碰到了目前在google实习的我亲爱的小小大人,小小大人跟我说,你要去google实习么?我说我要啊,小小大人说,那好啊,把简历给我。于是我回去之后就把简历发给了我亲爱的小小大人。过了俩周,亲爱的Google的HRJJ就打电话给我了,约了个时间电面。相比MS,google的电面就比较严格,就想在做一份考卷一样,只不过有人会一步一步指导你,而且你可以直接说你不会,要求换题,其实我觉得,不管是电面还是正式面试,不会的时候就直接说我不会是非常重要的。面试的东西不可能和平时考试一样有一个范围,每个人自己平时钻研的东西也都不一样,让面试官知道你都知道什么,你平时都研究了哪些东西,是非常重要的,对于你不擅长的东西就直接说你不擅长好了,充分发挥自己的强项才能给面试官留下深刻的映像。(当然你不能直接跟面试官说我不会英语,我们用中文说吧,起码的技能是要有的)。还有很重要的一点,Google的面试是中文的!!
 
之后我最最亲爱的牛人小展展由于拿到了MS和Google两边的offer,于是就豪爽的拒了MS,因为薪水少。于是他就推荐了我。于是n周之后,我终于接到了期待已久的MS的HRJJ的电话。约在7月5号面试,一开始是定的下午,结果后来又给我打了个电话,说改到上午去了,7:45。我寒啊,我过去那边要俩小时,难道指望我5点半就爬起来连轻轨都没有我taxi去火车站然后1号线转5号线再taxi?不过人家HRJJ牛~~我没有办法,只好就这样了。还好我表哥家住得离公司蛮近了(我现在就住在我表哥家,每天当哥哥嫂嫂的电灯泡~~*^^*),于是我就说我4号晚上先去我哥哥家住,5号早上从我表哥家走就好了么~~
 
就在4号晚上走之前,收到了Google的拒信,我那个寒阿~~信的Title叫Thank you from Google(直接让我想到“你是个好人”),这不是严重打击我自信心么,信里面还说经过我们的对你的经历和能力的细致分析,觉得你不能胜任我们的SDE一职……55555555我正要去MS面试你晚一天发过来可以么。
于是我就去MS面试了。
5号早上很早就到了,我唯一一次穿了衬衫,穿了西裤,穿了皮鞋(你们谁都没看见~~哈哈哈)。然后发现已经有一个人在等了,此人乃是我编译课的TA大人,然后他还跟我说,你拿个编译的期末考卷啊,那道****题啊,你怎么能那么做呢,你这不是增加我们改卷子的难度么,^&@*$@%#。于是我当场石化,话说那个时候我还不知道我编译课的成绩。之后陆续来了3个人,俩浙大的研究生,一个已经工作了的,总之就我一个本科生,于是顿时倍感压力。说是7:45,其实8点钟刚过,出来了5个面试官。当时我就反应过来了,5个面试官面五个人,每人面5轮,完美的流水线啊。(不过后来我可怜的TA大人跟我说,他只免了3轮,11点就面完了...)我是面了5轮的,从8点一直面到1点半,饿死了,还没有给饭,于是就饿着肚子回来,到学校已经4点了,干脆再饿一会,5点吃晚饭了。
 
简单说一下面试感受,首先是全英文。我从头到尾没有说过一句中国话,除了出去找厕所的时候问扫地阿姨,不过刚开头的还是could you tell me....然后发现不对,改用中文说。后来某人听了这段后说:这个时候扫地阿姨应该用一口纯正的伦敦腔说道,就你这种语音语调也好意思来微软!不过很幸运的,我在中间完全没有卡壳,而且也没有觉得肚子里有东西没有办法表达出来的感觉。不过用英文确实很不舒服,估计也在一定程度上影响了我的思考能力(边说边想的能力下降了)。
5轮面试,每一轮都是先问一些问题,然后出一道编成/算法题目,叫你写代码,在白板上用笔写。只有一个人没有要求我写出完整代码,在我写了部分示意代码之后听了我的优化算法就直接算我过了。我觉得在白板上用笔写代码的感觉和在计算机上面敲代码的感觉还是差非常多的。而且由于没有ide的支持,也不能编译或是执行一下看看是否正确,要想写出完美的代码还是有难度的。我的5段代码有2段有瑕疵。还有1段我相信我没有优化到最优,最后就只有2段是完美的,还包括一段前面说的没有写完整的代码。所以,想来面程序员的,多拍拍代码吧。
每轮面试之前的问题个有不同,可能有自我介绍,可能是谈谈自己做过的项目之类的,还有一些技术性问题。还有两道智力题。一到题目明明没有解的,我在白板上硬是弄了个solution出来,还觉得很得意(那个时候考官肯定在偷笑)。回来以后发现其实理论上可以证明无解的,而且我也找到了我的solution的漏洞,于是就郁闷了。
 
5轮面完之后,pp的HRJJ把我领出了MS的office,跟我说一周之内出结果。实际上结果还是很快的,周四面的试,接下来的星期一就接到了HRJJ的nice的电话,跟我说给offer了~~~万岁~~~~~~~
于是偶就找到偶的实习咯~~~~
 
3月26日

试相机

恩~~新买了Sony H5,于是就迫不及待拿来试相机了
趁晚上没有人的时候
用三脚架在南区派了下述照片,没有用闪光灯。
 
总体来看,成像还是很好的,噪点也比原来的P10控制的要好得多。
3月24日

第二讲 .Net与Java——中间语言简介

第二讲 .NetJava——中间语言简介

 

Java.Net的共性:中间语言

 

如果你比较熟悉Java的编译原理的话,你一定会对bytecode这个单词非常熟悉。确实,Java的最大特点并不是它是一个完全基于现代OO理念的编程语言或是其简单而容易上手(事实上我不得不承认,Java确实比C#要简单,虽说C#已经非常简单了……),而是Java是并不直接把源代码编译为目标代码,而是先编译为一种中间语言:Java Bytecode。在实际执行的时候,Java的解释器JVM,向计算机解释这种代码,从而达到执行目的。在这里不想阐明所谓“编译”和“解释”两个专业术语。但是有一点希望读者了解:编译将生成目标代码,实际执行它,所以效率要高些。解释则不生成目标代码,效率低些。简单举个例子,如果说编译相当于书面翻译的话,解释则有点像口译。

 

反观.Net.Net也采用了编译为中间语言的方法,.Net的中间语言称为IL。这点上,.Net是吸取了Java的长处。同时,也拓宽了中间语言的使用范围。例如,.Net的语言互操作性,就是在IL层面上实现的。也就是说,不管你是用VB.NetC#,还是J#Managed C++,最终你编译得到的,都是IL。这就是.Net可以使用多种语言编些项目的秘密所在了。.NetJava的不同之处在于,编译为中间语言之后,JavaJVM来解释之,而.Net则使用.Net特有的JIT编译器编译之。所谓JIT(Just In Time),是指.NetJIT编译器并不一下把整个应用程序编译完毕(如果这样的话,应用程序将会有一个很长的启动时间),而是只编译将要执行的那一小段。代码编译过之后,得到的目标代码就可以存储在内存中,下次再执行到这里,就不需要重新编译了。微软认为这样编译,要比一次编译效率要高得多,因为很多代码并不是每次运行都会执行到,这样,这部分代码就不会被编译。同时,用一点编译一点带给用户的感受也是很好的,因为每次都指编译很小的一块,用户感受到的就像是在直接执行一个机器语言可执行程序一样。这就解释了为什么.Net程序虽然是一个与Java同样不直接编译为机器代码,但是运行效率却几乎和内部机器代码一样快。事实上,在相当长的一段时间内,.NetJava有压倒性的效率优势,直到Jdk1.5出现之后,Java也采用了JIT编译方式。(但是现在,.Net的程序跑起来还是要比Java快一点。)

 

为什么要采用中间语言——平台无关性的实现

 

看了上面的介绍,读者可能要问,为什么要非如此大的周折,采用两次编译的方法,把效率降到这个程度然后再想尽办法提升效率。一个重要的原因在于,编译为中间语言可以实现一个重要特性:平台无关性。

 

平台无关性是指:你写的代码,所实现的功能,与你所采用的平台无关。举个例子,Java是一种平台无关性语言,所以你想绘制一个窗体,在上面显示一个Hello World,那么你写的代码不需要任何更改,就可以同时在WindowsLinux,或是其他有jdk存在的操作系统中执行。目前,在时下流行的大多数操作系统中,都有相应的jdk存在,Java当年推出的时候的豪言壮语:“Write once, run everywhere.”在某种程度上说已经实现了。(当然,这句话很快就变成了:Write once, debug everywhere. 平台的无关性并不象说说那么简单。)

那么平台无关性是怎么实现的呢,这就与中间语言分不开了。中间语言可以经过精心设计,使得其本身与平台无关。当framework尝试去解释/编译中间语言的时候(对于.Net而言,完成这个工作的是CLR,对于Java而言,是JVM),将其转化为对应平台可以接收的机器语言代码,这样就可以实现平台无关。比如,中间语言有一个指令表示绘制一个窗体,那么,在Windows下,它被解释为某条(或很多条)Win32API指令,而在linux下面,它则被解释为linux可以接受的指令(小鸟不会linux编程……),这样就实现了平台无关性。

 

需要说明的是,目前Java已经相当程度地实现了平台无关性,而对于.Net而言,平台无关性还只是一种可能——.Net采用了与Java相似而又相对优秀的技术,但是,目前,实际上,除了Windows系列操作系统(包括可以运行于手机的Windows)以外,并没有哪个操作系统存在.Net Framework。但是,很多大牛们正在积极准备,编写基于其它平台的.Net Framework。一个很好的例子就是Linux下面的Mono项目,目前Mono还处于测试阶段,但是包括remoting.Net的重要功能,都已经可以很好地在Linux下面实现,如果你编写的仅仅是dll或是Console程序的话,那么你的程序应该可以在Linux下面运行。最新的消息表明,Mono的图形界面控件库也已经搭建完毕,相信很快,.Net就可以真正实现LinuxWindows的平台无关性。

 

中间语言的其它特性

 

使用中间语言不仅仅可以实现平台无关性或是前面所提到的高级语言的互操作性。它还有很多其他重要特性:

1.       性能优化。传统的编译器会优化代码,但是它们的优化过程独立于代码所运行的特定处理器和环境。这是由于,传统的编译器直接将软件编译为机器可执行的内部代码,编译器并不知道该程序将运行的处理器类型。例如,你想编译出来的程序可以利用Pentium III的新特性,那么你就必须要放弃Pentium I,II的用户。但是,使用了中间语言之后,实际的编译过程发生在客户端,编译器知道该程序将在什么环境下运行,于是编译器可以最大程度的利用新型处理器的新特性,编译出最优的目标代码。

2.       基于代码的安全性。传统的目标代码(机器语言)非常抽象,机器不可能理解每条语句的意义,而只能照着执行。而采用中间语言之后,基于代码的安全控制成为可能。由于中间语言相对于机器语言比较具体,编译器在目标机器上编译并执行时,可以在编译之前检查,该程序是否具有执行该操作的权限。

 

这次就讲这么多,事实上关于中间语言,还有很多特性,计划放到下一讲,介绍.Net的特性时说,包括垃圾收集器和应用程序域,还有AttributeAssembly的介绍。

第一讲 .Net 简介

受人邀请,在bbs上做一个关于.Net的扫盲讲座,既然这样,就充实下我可怜的space吧.........


 

写在.Net之前

 

说到.Net,绝对不能不说的两个东西,就是COMJava。不熟悉Windows编程的人可能会不知道COM这个东西,但是如果你在上世纪在Windows下面尝试编写组件或者是执行程序而不使用Visual Basic或者Delphi(事实上VB对程序员发挥的制约是非常大的,基于COM但不透露COM本质的VB不仅仅创造了无数一知半解的程序员,也造成了无数莫名其妙的问题。一个经典的例子就是comdlg32.ocx缺失,这里不想跑题太多,只要你在Google上搜一下这个文件名,你就会明白这个问题的普遍性),那么你对两个名词一定会深恶痛绝:一个是MFC,另一个就是COM

 

MFC是什么,如果你知道API的话,那么事情好办:MFC就是对API的封装。个麽API是什么?Application Programming Interface,简单来说,就是程序操作的接口,如果我的程序要读取一个文件,那么我要使用一个读取文件的API。因为从计算机体系结构来说,应用程序应该通过操作系统来访问物理磁盘(正在学习机原的孩子们注意了,机原和操作系统涉及这方面的问题),那么这个访问的渠道,就是API。因为直接用API太烦了,所以出现了MFC,它封装了一些常用操作,实际是对API的封装和简化。但是,MFC还是太复杂了,如果你去看一个基于MFCHelloWorldC程序,它的长度将达到100行——你需要了解很多关于操作系统本身的内容,才能熟练的使用MFC。以我个人的看法,Windows下面的C程序(使用MFC),不能被称为C,它太丑陋了,根本就是另一种语言。反过来,在Linux下面的C程序员就要舒服得多,这也是这么长时间来,Linux一直被程序员所钟爱的原因。

 

下面说COMCOM是什么,COM其实有点类似于一种平台,它不是一种语言或是一种编程技术,它制定了一种约定,凡是符合这种约定的组件(比如说一个dll函数库,或者一个ocx组件),都可以相互通信,互相调用。这就意味着,你用C写一个程序,用gcc编译为exe,然后你再用Delphi写一个组件,编译为ocx,只要他们都符合COM规范,那么,它们之间就可以相互通信,那个用C写的程序就可以在运行时调用那个用Delphi写的组件。这在当时是一个创举,用某本书上的话说,COM将动态加载代码和类型系统已相当一致的方式有机结合在一起。但是可怜的Windows程序员们并没有因为COM的到来而日子好过一点(其实还是稍微好了那么一点点),COM引进了“组件”这个概念(component),使得程序员们在Windows下面可以以相当OO(面向对象技术)的方式,编写和复用相当多的代码。(否则你杀了微软的程序员他们也写不出Word这种变态的东西。)COM带来了一个巨大的问题:Dll Hell。具体这个问题是非常复杂的,如果你有兴趣的话可以Google “dll hell”,你会找到足够的条目。简单来说就是,因为大家都用这些组件,组件有版本,你用1.0,我用2.0,但是只能注册一个,如果2.0能够兼容1.0还好说,但是如果不能兼容,个麽你就废了。举个例子,你安装了一个游戏甲,它替换了某组件A,但是该组件A是另一软件乙所必须的,但是新版本不向后兼容,于是软件乙就不能用了,而且出错还是莫名其妙的。你被郁闷了,于是把软件乙重装了一遍,于是游戏甲又不能用了。关键是你根本不可能知道到底是哪一个组件出了兼容性问题。现在大家该明白所谓Dll HellHell一词从何而来。

 

.Net的起源

 

基本可以认为,.Net是为了替代COM而诞生的。事实上,在.Net诞生6年后的今天,原始COM已经几乎被消灭了。(当然COM+等还将持续很长一段时间。)将来的Windows程序员将再也不会遇到上世纪末那些疯狂而变态的兼容性问题。微软从很早就开始注意到COM所带来的一系列问题,旗下的COMMTS小组(一群大牛)计划开发一个新的平台,命名为COM3。就在选定该名称之后不久,微软的多个研究小组(更多大牛)认为,在特定的Microsoft平台下,COM3这个名字并不合适。随即将其更名为CORCommon Object Runtime)(这帮人一定都是OOcon),在其开发过程中,还采用过COM+等其他名称。在其第一个beta版发布之前,最终定名为CLRCommon Language Runtime,关于CLRCOM在技术上的区别,这里不讨论(否则看几个晕几个),但是,CLR确实有效的解决了COM的相当多的问题(但不是全部,也不可能是全部)。CLR就是.Net的核心。

 

.Net的特点

 

COM时代开始,微软的野心就从没有局限在一种语言上面,微软希望能够建立一个平台,在此平台上,各种语言都可以为微软所用,编写相应的Windows Application。从现在的眼光来看,通过.Net,微软(至少从部分来说)达到了这个目的。CLR在创立之初就有一个雄心勃勃的目标:在高级语言层面实现语言的互操作性(相比之下COM的互操作性是建立在编译之后的机器语言或者说二进制代码之上的)。在微软自身的.Net Framework中,包含了如下几种语言,C#, VB.Net, VC++, J#

 

C#是微软专门为.Net设计的一种全新的语言,它采用C Style(就是写出来和C很像,事实上,很多语言,例如Java,也是C Style的)。它还是一种基于现代OO设计的语言(Java也是,所以C#Java的相似程度异常之高)。

VB.Net是由原有的VB6经过改进得到的,学过VB的同学可能对VB比较熟悉。但是从VB6VB.Net的改进是如此之大,以至于你可以把VB.Net完全当作一种Basic家族的全新语言。(事实上,完全OO化了的VB也是非常好用的~~~

VC++在进入.Net时代之后,也发生了脱胎换骨的变化,之前的VC++6虽说相当简单易用,但是却不符合C99等重要标准,VC++写的程序用gcc等边一起来编译就不通过(这也是相当多的专业程序员摒弃Visual Studio而采用editplus或者eclipse+cdt等平台来编写C++程序的原因)。这是由于VC++6中含有许多微软对Windows的特定扩展。从VC++2001到现在的2005, VC++发生了重大变化:分化为两支:一支为符合C99标准的标准C/C++;另一支不妨称为Visual C++ .Net,即Managed C++。可以像其他的C/C++编译器那样生成正常的exe文件,也可以生成符合.Net标准的可互操作的.Net可执行程序(也是exe……)。

 

J#是一种改编自J++的语言,使其符合.Net标准的要求(也就是CLR),而J++可以理解为微软版的Java。但是由于某些原因,J++被从Java的大家族中开除了。所以现在J#也是异常可怜的,用的人很少很少~~

高级语言层面的平台互操作性是.Net最令人激动人心的一点,你可以用VB.Net编写界面,随意调用你用C++或是C#编写的底层组件支持。在这之前,不同语言的互相调用是非常困难的。使用.Net,你可以充分发挥各种语言的优点,使得程序员的负担大大降低。涉及到网页编程之后,这一点更加明显,利用ASP.Net,你可以用C#VB.Net这种OO化的高级语言(相对另一个阵营,大多数人还在使用perlphp)编写网页,然后直接调用你用C++/C#写出的某些库(可能是同一个项目,你写了WinForm形式的GUI,又写了网页支持)。在这些环境下,.Net的优势就无人可比了。

 

本来准备介绍一下IL,再比较一下Java,不过居然莫名的就写了这么多了。算了,下次再写吧~~