我的.net生涯 之 西游记

毋庸置疑,大多伦多地区最初是英国殖民地,从地名上就可以看出来:York, Scarborough,London, Waterloo, Cambridge, Oxford, Windsor ……。

 

但老英国人们也太没文化了吧,这么多地名直截了当地就搬了过来,给一个地方起名字应该参考当地的地理景观、人文风貌。比如:Toronto在安大略湖的北边,就应该叫——湖北;Vancouver在洛基山脉的西边,就应该叫——山西;Alberta产石油、房价又这么高,是不是应该叫——贵州?Newfoundland,这个有点难度,要不叫新疆?行吗?

 

开个玩笑,最近这段时间,在多伦多找工作屡试不果,听朋友们说,多伦多西边的那些小城市机会相对多一些,天天盯着那几个地名搜索职位,看多了就想幽它一默。

 

机会还真是有的,County of Oxford (牛津县)通知我去面试,政府工作啊。

 

好好准备一下,先上网google一下牛津县的情况:

Welcome to Oxford County

We are located in the heart of Southwestern Ontario, Canada,.

Our roots are in agriculture. Our strength is in business.

主要经济以农业为主,有差不多1500个农场,近半数的农场从事养牛业、养猪业、烟草种植业……

 

Mississauga到牛津县135公里,预计需时1小时55分。

 

意外的收获是,在网上google到了一套 .net常见面试题,这个得好好看看。

 

2006324 星期五 

 

面试的时间是10:30,这么远的路,不知路上会有什么情况,多备点富余时间,8:00准时出发。

 

沿401 West 一路向西,走Mississauga, Streetsville, Meadowvale, Oakville, Georgetown, Halton Hills, Homby,Milton, Campbellville, Kilbride, Morriston, GuelphCambridge; Waterloo, Kitchener, Paris, Ayr, Princeton, Drumbo,Blandford-Blenheim, Plattsville, Bright, InnerkipWoodstock.401403在这里交汇,路名变为MacDonald-CartierFwy, 继续向西,再走不远,就到了牛津县所在地Beachville.

 

下了高速一看表,才9:20,来多伦多三年多了,第一次开高速不堵车。

 

按地址找到县政府,田地间孤零零一幢房子,门前稀疏地停了几辆汽车。跟中国那些县政府唯一的区别就是没有自行车棚子。

 

开了一个多小时的车了,下来伸伸腰。三月底的天,还是冷嗖嗖的,还是回车里呆着去吧。拿出那套.net常见面试题,再复习复习。临阵磨枪,不快也光。

 

“Explain the differences between Server-side and Client-sidecode.”

“Should user input data validation occur server-side orclient-side? Why?”

“What’s the difference between Response.Redirect() andServer.Transer()? Why would I choose one over the other?”

“What is the Global.asax used for?”

“What’s an assembly?”

“Explain what an ERD is.”

“What is the top .net class that everything is derived from?”

“What is the transport protocol you use to call a Webservice?”

“True or False: A Web service can only be written in .net?”

“What does WSDL stand for?”

“True or False: To test a Web service you must create aWindows application or Web application to consume this service?”

“Does C# support multiple-inheritance?”

“In a Try – Catch – Finally block, will the finally blockexecute if an exception has not occurred? If an Exception has Occurred?”

“What’s MSIL, and why should developer need an appreciationof it, if at all?”

“Explain the three tier or n-Tier model.”

“What is SOA?”

“Is XML case-sensitive?”

“How would you implement inheritance using VB.NET / C#?”

“Can you store multiple data types in System.Array?”

“What’s the difference between an interface and abstractclass?”

“What is the role of the DataReader class in ADO.netconnections?”

……

 

好不容易熬到了10:20,走到大门口,伸手刚要拉门,从门上玻璃的反射里发现没带领带,赶紧返回车里。

 

进到门里,前台小姐热情地迎上来,不等我开口,便说:“你一定是Patrick.等了半天了吧?”

 

啊?回身望去,我停车的地方,从这里看得一清二楚。原来装的是幕墙玻璃,从外面看是反光的,里面看是透明的。心里有一种缸里的鱼的感觉。

 

到了面试的房间,里面围着桌子坐了四个人,这就是北美老牛说的Panel Interview了。前台小姐一一介绍:

JohnIT Manager50岁左右,看上去颇象CanadianTire里的修车师傅。

SteveLead Programmer30多岁,胖胖的,小平头,戴一付黑框眼镜,我没法不把他和尹相杰联系在一起。

MattSenior Programmer30 多岁,高高壮壮,典型的雅利安人后裔。

SallyHR40岁上下,脸上永远挂着职业的微笑。

 

Sally先开口了:“……依据法律,我们首先需要确认你是否有直系亲属在牛津县政府工作,直系亲属的定义为血亲和姻亲,包括:父母、兄弟、姐妹、夫妻……”

我赶紧接过来:“没有。整个牛津县我就见过你们几位,再加上刚才问路的那位老先生,你们都不是我的直系亲属吧?”

大家都笑了,面试时一定要先给自己创造一个轻松的氛围。

 

Sally:“那好,技术方面,Steve准备了一些问题,我们可以开始吗?”

“好吧,不过你们这么多人,我可有点紧张。”

 

Steve:“不用紧张,都是一些很基本的问题。请听好,第一题:什么是服务器端代码?什么是客户端代码?”

“从字面就很容易理解,服务器端代码就是运行在服务器上的代码,客户端代码当然就是运行在客户端的了。.net是一个典型的CS架构,特别是在WebApplication里,它的代码理论上讲都是要送到服务器端运行,由服务器生成HTML页面,然后返回到客户端,由浏览器解释并显示出来。

但是,这就有可能造成服务器的负载过大。所以我通常的做法是,在客户端放置一些诸如JavaScript的脚本语言,将一些简单的工作交给客户端完成。比如说:用户输入的验证,客户端完全可以判断用户输入的Email地址是否是合法地址,也就是说是否含有’@’’.’这样的字符;用户输入的数字是否在哪个特定的范围之内等,类似这样的判断。然后,当输入信息送到服务器端时,再进一步判断输入的Email地址是不是已经存在于数据库中……”

 

“很好。你好象把我的第二个问题也一起回答了,但我还是得再问你一遍:用户输入的数据是在服务器端验证还是在用户端验证?”

“那我就再答一遍:形式上的、格式上的验证在客户端进行,而逻辑性的、功能性的验证交由服务器端进行。”

 

不错,开场表现得还可以。

 

“下一问题:Server.Transer的作用是什么?”

Server.Transer是在服务器端直接将当前显示的页面导向另一个页面,由于它是发生在服务器端的,所以不会在客户浏览器的历史记录中留下记录,也就是说,如果用户查浏览器的History,是看不到第二个页面的URL的。

与此相似的还有一个MethodResponse.Redirect,但是这个Method会引起一个RoundTrip,也就是说会在服务器和客户端产生一次交互,而且会在用户的历史中留下记录,所以Server.TranserPerformance上会好一点。”

 

“你好象又把我的下一个问题一起回答了,我的下一个问题就是:Server.TransferResponse.Redirect有什么区别?”

“不好意思,那我又得再答一遍了。Response.Redirect会引起RoundTrip,而Server.Transfer在直接发生在服务器端的。”

 

“下一个问题:什么是3-Tier?”

3-Tier是我们在编程时常用的一种组织代码的方式,也是OO概念的进一步延伸。具体说来就是,将一个程序的全部代码按所实现的功能分为用户显示层、业务逻辑层和数据访问层,每一层依次向下调用,也就说用户显示层调用业务逻辑层,业务逻辑层再调用数据访问层,但用户显示层不可以直接调用数据访问层;当然也不可以反向调用。

这样做第一是便于代码的维护,如果程序出了问题,根据其功能,你很容易确定问题大概是出在哪一层的哪个类中;第二是便于程序的进一步扩展,例如,程序现在用的SQLServer的数据库,如果需要换成Oracle,我只需要改变数据访问层的代码就可以了。

而且根据SOA的思想,业务逻辑层的代码通常要构建成完成某些特定功能的WebService,这样,便很容易实现与其它程序,甚至是跨平台程序间的交互操作。

但是,我个人的编程习惯,通常是分为5层,也就是再加一个业务实体层,和数据库的StoredProcedure层。业务实体层是一些只有Property没有Method的类,基本上对应于数据库中的表的结构,用来在各层之间传递参数;StoredProcedure层当然就是数据库中的StoredProcedure了,因为我会把所有对数据库中数据的操作全部封装到数据库中,哪怕只是一个简单的Select* 语句,我也会写成一个StoredProcedure,这样,在.net的程序中就不会出现任何HardCodeSQL语句了。”

 

“这回你好象走得更远了,SOAWeb service是我后面的问题,你已经打乱了我问题的顺序了,”Steve说这句话时,在场的人全都报以善意的微笑,“那好吧,我就问一个Webservice的问题吧,怎么调用Webservice?”

Web Service本质上是基于SOAP构建的,通过HTTP协议、80端口传输,传输的信息是XML

调用一个Web service,我只需要一个WSDL file就可以,因为WSDLfile是自我描述的,其中已经完全包括了WebserviceURL,所需要的参数、返回类型等全部信息。

得到一个WSDL file有很多种方式,你可以把它放在网站上,可以通过Email发给我,等等等等。”

Steve这时替我向大家解释:“WSDLWeb service descriptionlanguage的缩写。”

“下面我们就快速地go through几个问题吧。你SQL server懂多少?”

“……”

“什么是ERD?”

“……”

“好的,我的问题问完了,John, Matt你们还有什么问题吗?”

 

John:“我的List上还有两个简单的问题,你只需要回答TrueFalse就行。”

DataReaderOn Line的,Trueor False?

True! .net中有两种读取数据库的方式:DataReaderDataSet……”

John笑道打断我:“回答True就行了。”

“再一个问题:使用Web service 必须要编写一个WebApplication或者是Windows ApplicationTrueor False?”

“False,因为每一个Web service都有一个自动生成的测试页……”

John:“False就可以了。”

 

手里攥着答案回答问题的感觉就一个字——爽!就象考MCAD似的。

 

John:“我还有一个问题:和其他的申请人比起来,你认为自己有什么优势呢?”

“根据您的Job Description,我知道如果我得到这份工作,我的主要职责是维护和开发牛津县的官方网站,我看过你们现有的网站,做得已经很不错了。但对于我来说,我做过两年的CG——ComputerGraphic,还专门学过三维动画,所以对于构建一个网站,我可以胜任从最前端的页面设计,到最后端的数据库维护。”

“你还做过Computer Graphic?这听上去倒很有趣。”

“是的,我今天还带了一些我以前的,谈不上作品,只是一些练习吧,您有兴趣看一看吗?”

 

John打开了旁边的一台电脑。

我从包拿出CD:“恐怕你们的机器上没有装PhotoShopMaya吧?”

“应该没有。”

“那就很遗憾了,我就不能演示那些动画了,只能是一些静态的画面了。”

“这些是水晶按钮,把它们放到页面上,就会比那些Default的按钮生动得多,如果加上一些JavaScript,当鼠标经过时,它可以变色,再配合CSS,还可以实现几十种其它的效果。”

 

“这些是我做的一些文字效果,不好意思,都是中文的。”

 

 

“这些是用PhotoShop做的图,是二维的。”

“这些是用Maya做的三维的,表现同一场景的不同光照效果。”

 

“这些是表现不同物体的材质和纹理。”

 

“这些,本来是想做一部短片,是我们中国一个家喻户晓的神话故事……

不过,很遗憾因为Maya是针对影视动画的,我还没有办法把它和网站设计结合起来。”

 

所有人都赞许地点头微笑着。

John:“技术方面的问题,我们都问完了。Sally还会有一些HR方面的问题。”

 

Sally:“你如果在临近DeadLine时,突然发现无法按时完成项目了怎么办?”

“我会尽量避免这种情况的发生。在中文里,我们有一句话叫‘防患于未然’(nip in the bud),通常在开始一个项目前,我会制定几个Mile stones,如果时间过半,但是还没到达50%milestone,我会向我的经理汇报,这样可以尽早地采取行动,加班、加人……,不能等到Last Minute才说,Sorry, I can not make it.

 

“如果在工作时,你和另外一个同意见不统一,你会怎么办?请从下面三个选项中选择:

1. 不理他,坚持自己的主张。

2. 跑出去,把他的车砸了。

3. 杀了他。”

“这样的话……,我只能选4了,我会先让大家都平静一会,然后给他买杯咖啡,心平气和地谈一谈。如果他是对的,我是不会固执已见的。”

 

“……”

 

What’s your strength?”

“……”

 

What’s your weakness?”

“我不认为我有什么weakness,在我儿子的眼里,我是一个Perfect的人。”

Sally笑了:“真的没有Weakness吗?还是说说吧。”

我故做深思,又幡然醒悟:“想起来了,我有。去年夏天踢足球,拚抢时摔了一跤,所以现在如果跑得太快的话,Igot Weak Knees.

 

屋里顿时充满了爽朗的笑声。

 

笑声过后,Sally接着说:“对不起,我们今天还不能决定是否聘用你,我们还需要见其他的申请人,而且还有一些必要的审批手续。

我先把这个职位情况向你介绍一下:Job Description 你应该已经拿到了。另外,这是一个非工会组织的职位,目前是临时的Contract,从现在到今年年底,但明年应该会继续续签,你知道,我们的预算都需要议会批准。

每天工作时间是8:30-4:30,每天7.5小时,每周37.5小时,每小时$19.5……”

 

此时,所有人脸上的微笑都突然凝固了,因为他们都注意到了我的谔然。Sally赶忙问:“有什么问题吗?”

 

屋里的气氛沉重得能拧出水来,片刻的沉寂后,我终于开口道:“坦率地说,这个Rate和我想象的差距太大了,你们在网上的Post并没有标明是这个RateLevel。在多伦多现在的MarketRate是每年60K,而且,我离开前一家公司的原因之一就是收入太低,但实际上还是高于你这个Rate的……

(温馨提示:说这话时,我的眼一点都没眨。)

 

“而且,下个月我要搬到Scarborough去,那样离这里有180多公里,我不可能每天往返,需要在附近租一套房子。John,你看可不可以这样:第一,我希望你可以向上一级申请,看能不能有更高的Offer;第二,有没有可能,由牛津县为我提供住所;第三,如果以上都不行的话,可不可以提供一些住房津贴?……”

 

画外音:伽利略说过:给我一个支点,我可以撬起整个地球;给我一颗人心,我可以让蛇呑下一头大象。

 

我知道,此话一出,我今天的行程,就变成了十足的牛津一日游了,但这个Rate真的是太不划算了,如果在多伦多,我会毫不犹豫地接受,毕竟是第一份IT工作。嗨,就当是又锻炼了一次面试技巧吧。

 

牛津县还真的很负责,大约两周后,Sally打电话给我说,他们试过了,但实在是没法达到我希望的Offer,所以他们准备在当地找了。

 

7月底的时候,在网上搜索职位时,我发现牛津县又Post出来了同样的职位,想必是新找的人没通过试用期。

 

子曾经曰过:好马尚不吃回头之草,算了,洗洗睡吧……

登录后才可评论.