正文

我的.net生涯 之 西遊記

(2008-03-31 13:08:11) 下一個

毋庸置疑,大多倫多地區最初是英國殖民地,從地名上就可以看出來: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出來了同樣的職位,想必是新找的人沒通過試用期。

 

子曾經曰過:好馬尚不吃回頭之草,算了,洗洗睡吧……

[ 打印 ]
閱讀 ()評論 (0)
評論
目前還沒有任何評論
登錄後才可評論.