也談中外程式設計師的差別
我在一家外企的軟體中心工作,有四年的時間了,公司是通訊行業的歐洲公司,我們的工作主要是根據中國的客戶需求,在公司的產品上作一些客戶化的工作。人們都說外企比較人性化,特別是歐洲的公司,但在客戶的需求壓力和與國內本地廠商激烈競爭下,我們還是常常加班的,而且很多時候不能遵循公司的開發流程,如果按照流程來辦,那麼意味著專案交付期要延長,需要的人員也更多,編碼時很多細節也就不太在意,只求能夠比競爭對手早實現需求,早交付專案。這樣的事情一直延續了三年之久,直到我參與到了一特殊的專案,這個專案從專案管理到實現的各個方面都給我很大感觸,我在這裡只說一些開發過程中很小,很細微的事情,但我認為這些和一個工程師的素質有很大關係。
去年,客戶提出了一個比較新的產品需求,要實現的話,在原有的產品上修改是不可能的,只能重新開發,按照常理,這樣的任務是需要在公司的總部完成的,但需求是中國客戶提出的,原文都用中文寫成,所以在中國這裡組成了一箇中外混合的開發隊伍,從公司總部的研發中心來了五個工程師,我們這裡也有五個人蔘加。專案經理,技術專家都是外國人,這個專家年齡已經超過四十歲了,有兩個女兒。另外三個是年輕人,都是正宗的計算機專業畢業,在公司最少的也工作了兩年,我們這邊是清一色年輕的工程師,工作年齡最長的五年,最少的只有不到一年的時間,三個計算機專業畢業,另外兩個是自學轉到程式開發上的。 專案在一開始我們就感受到的很大的不同,這些主要是專案管理上的事情,留待以後再講。
按照各個人的工作背景,我們劃分了任務,核心模組和框架由這個專家來寫,其餘的去完成劃分好的模組。程式碼定期的整合,然後提供給測試組去測試。我們都知道外國人做事情比較認真,而且專業素質非常高,雖然沒有商量過,但我們都有一個共同的意識,好好幹,不要讓他們看貶了,所以在程式設計上非常注意自己的程式碼質量,而且反覆推敲,優化。但在我們還是感受到了差距,尤其是在專案初期的幾次整合中。因為大家都對客戶的需求瞭解的清楚,也都掌握了實現這些需求的技術。在程式碼的功能實現上我們很少受到(Challenge)置疑,主要在很多的細節上,而且外國同事非常直接,我們雖然處得不錯,但發現程式碼中有錯誤或者不好的地方,他們都會直接當面指出來,絲毫不留情面。這讓我們開始很難接受,不免有些情緒,背地裡常常咒罵這些雞蛋裡面挑骨頭的老外,但情緒歸情緒,平心而論,沒有他們這麼直接的意見,我們也不會在技術有一個較大的提升。
那麼都有那些細節的問題呢?我大致分成三類。
1. 程式碼風格 我們雖然在程式設計時也遵循編碼規範,但時間長了,往往在一些小的地方表現出各自的喜好來,而他們則在任何時候都表現出嚴格的遵守編碼規範,比如,大括號的對齊,要求大括號要單獨佔一行,if,else語句必須用大括號括起來,即使只有一句表示式。而我們常常在if,else只有一句表示式的時候,不加大括號,而他們則不,每處都規規矩矩的加上。還有就是變數的命名,大家都知道程式的可讀性非常重要,我們在命名函式和一些全域性變數時非常注意,但在函式內部的區域性編碼命名時候比較隨意,這是他們所不能接受的,比如看到我們程式碼中出現這樣的語句就會非常氣憤:int temp1,temp2;他們馬上就說不明白temp1,temp2代表了什麼,在讀這個函式時容易混淆。要求即使區域性變數的名稱也要儘可能的代表它的意義。 關於可維護性,還有一個例子,大家都有這樣的經驗,有些部分的程式碼是要改上很多次的,不管程式碼的好壞,如果已經通過測試了,通常在改這部分程式碼的時候,大家不會直接刪除掉,而是將這部分程式碼註釋起來,這個大家都知道,但他們對註釋起來的程式碼也有要求,就是需要加上註釋說明為什麼要註釋掉。記得當時有個老外指著我的一行註釋的程式碼問我為什麼,其實很簡單,我和他講為什麼,為什麼,他卻對我說,他需要的不是我講的內容,而是要我把講的內容加上去。
2. 效能優化 我們做的是嵌入式系統的開發,執行速度是使用者非常關注的一個因素,可以這麼講,比如我們的系統執行速度比競爭對手慢,不代表我們拿不到訂單,但如果拿不到訂單,很明顯,執行速度慢是一個最好的理由。所以從一開始我們就非常關注效能的優化,比如設計最好的演算法等等,但還有一些細節是我們開始時沒有注意到的,最常見的例子,在很多判斷條件下,我們通常的做法是按照設計時的Use Case來寫,這樣有的時候就出現這樣的情況,最有可能發生的事情,也是最常見的判斷條件,沒有放在判斷的起始位置,而是在中間,倒是沒有出現在最後的情況。老外們則比較注意,他們把使用者使用時最常出現的判斷都寫在了程式碼的開始,這樣軟體在使用上的整體效能就比較好。
3. 程式碼穩定 這個我忘記有什麼具體的例子了,只是記憶中他們對異常情況的處理有時近乎苛刻,按照我們那時的說法,什麼變態的情況他們都想得出來,也都要在程式上做處理。
工程師之間的差別,決定了他們開發出的產品的差別,通過這個專案,我明白為什麼很多外國的產品要比中國的產品好,不光是軟體,其他別的產品,飛機,汽車,或是一個吃飯的勺子,我們的產品和外國的差異往往也在這些細微的地方。 另外讓我比較感慨的是,在國內,很多程式設計師不知道自己三十歲後幹什麼。而且最要命的,這不僅僅想法而已,而是現實的環境就是這樣,三十還繼續程式設計序被認為沒有出息,非得升到去作一個什麼經理才成,才能有所發展,自己的事業才能發展,自己的工資才能有個新的躍升,但好像國外並沒有這種現象,上面提到專案裡的專家已經四十多歲了,還在程式設計,大家對他都很佩服,有段時間近乎崇拜。他寫的框架非常優雅,我們在這個框架基礎上能非常容易的實現各個模組,程式碼寫的乾淨漂亮,層次感很強,讀起來感覺很舒服。他寫的核心模組也很少出錯。沒有多年的功力是寫不出那樣的程式碼的。
當然,我們中方的員工也有優點,我們都很勤奮,好學,而且聰明。老外們把生活看的很重,上班和生活分得很清楚,不願意加班。而我們晚上常常加班到很晚,完成的模組比他們多很多,這是他們感到很驚訝的。同時在和他們的程式碼整合,評審過程中,學到了很多東西,程式設計水平提高的很快,在專案末期基本上就沒有遇到什麼challenge了。