程序員的武器

這篇文章發表在《程序員》雜誌2007.03期的專輯“程序員的武器大家談”中,轉自舊文重發:程序員的七種武器 

《程序員》:請談談您所定位的優秀程序員應該有哪些技能?您是怎樣理解程序員七種武器的?
==============
周愛民:一般來說,劍客用劍、刀客用刀,所以所謂七種武器,用在手上的,或許也就一件兩件。但如果以技巧、技法論,卻不是一件兩件兵器就可以勝出江湖的。例如不懂刀的劍客,遇到用刀的人時便不知道如何刺擊了。因爲要先知其長短,才能避強而擊弱。
不懂刀的劍客與不懂劍的刀客對打起來,大概會如同演舞一般,各練各的招式。
所以,優秀的程序員或程序高手並不是通曉七種武器的全才,必然是精通其一,且概知其它。與江湖不同的是,我們事實上並不拿一種武器去與拿另一種武器的人比鬥。我們的對象是一個軟件,或者某個工程。我們要克“敵”制勝,而敵是死物,不是活人。換言之,我們瞭解這些技術方法的目的,並不是要站到擂臺上去比較誰懂得多,或者誰精通什麼。我們只是要做一個軟件或者具體的工程,那麼所謂技術方法,只要對這個軟件或工程有效即可。因此,用匯編寫內核的人不必看不上用C寫協議層的人,用C++寫平臺應用的,也不必看不上用SQL寫腳本的人。放在一個團隊裏,彙編、CC++SQL在一個項目裏可能各有其用,非得讓這些人分個高下出來,最終是項目的失敗。
任何的一種工具都有使用它的境界。很多人看不到這一點,而輕視其它語言或者工具。例如SQL,幾乎所有使用高級語言(我當然不是說它比別的語言好而顯得“高級”,而只是存在着這麼一個分類)的開發人員都認爲SQL是“一種相當簡單的腳本”。但事實上,我的朋友中就有能把SQL用到出神入化的,他能由SQL的寫法來推斷數據庫設計的失敗,或者反過來,爲特定的數據庫系統寫出最優化的SQL。重要的是,這個朋友會針對不同的存取環境、網絡結構而設計特定的數據庫和SQL,以達到最優。
優秀的程序員是對工具沒有偏見的、能適應場合活用語言的人;而程序高手則基於這個前提,並專精其一,進而通一曉十的人。
《程序員》:您認爲什麼是程序員的基本技能?哪些是最重要的?
==============
周愛民:“七種武器”中,數據結構是成爲真正的程序員的基礎,而面向對象思想則是門徑。
程序員能否在軟件開發這條道路上走下去,很大程度上取決於他對數據結構的瞭解。任何一種新的語言,或者任何一種新的體系結構的出現,都可以在數據結構上找到相關的解釋。
因此,程序員如果能精通數據結構,那麼相當於擁有了“以不變應萬變”的資本。對此,《人月神話》中用一句話指出了關鍵:“數據的表現形式是編程的根本”。
對象是數據結構抽象的一種,但並不是唯一的一種。從這個角度上來說,對象並不是唯一的編程之道。我曾經說,人造衛星也是在面向過程的時代上的天。也就是說,面向過程也可以組織足夠複雜的程序。
然而,所有這些都並不能否認面向對象的價值。面向對象是對事物的本體特性與行爲特性的高度抽象,它將數據結構從“死的內存”變成了“活的物件”。面向對象的思想使我們在增強對現實的表達能力的同時,避免了複雜數據結構帶來的藕合。由面向對象、信息隱藏和接口抽象三個相關聯的概念,構成了整個軟件體系設計的理論基礎。這三個概念中,面向對象是與軟件開發人員關係最密切,最容易理解的,因此它是使你成爲真正的程序員,以及從程序員走向程序設計師的最佳門徑。
《程序員》:如果用一個問題來測試一個人是不是程序高手,您會怎樣問?
==============
周愛民:我的問題是:你參與或組織過怎樣的開源項目,如何評價它?
在程序高手這個級別上,能脫穎而出的是那種有合作能力的、思想開放的優秀人才,而絕不是技術高下的簡單辨別。而觀察他對開源項目的經驗和興趣,是一種不錯的方式。
這裏說的不是“把源代碼公開”就是開源項目了。我說的是真正有組織的、持續的、公開源碼的項目運作。之所以做這麼多的限定條件,是因爲現在很多人都已經接受了“源碼公開”的思想,但這僅表明這個人有了分享的精神,並不表明他有組織和管理項目的能力。開源項目的生命力是在項目管理者在長時間的維護過程中得以延續的,同樣的,項目管理者也在這個過程中歷練了自己的技能與心性。而這些,正是高手在成長中不可或缺的要素。
《程序員》:您在成爲一個優秀的開發人員過程中,哪幾個階段是最讓您難忘的?
==============
周愛民:我做程序之初,只是喜歡而已,其實真的是楞頭青。這個階段看來,就是代碼不規範、接口隨意,並且經常會推翻重來。“代碼不規範”是非專業人員的通病,我在很長時間裏面,都有“自己的風格”,所以還專爲這個跟以前的部門經理爭辯過:我同意格式化呀,但爲什麼要按你說的格式呢?“接口隨意”是沒有設計就開始寫代碼的表現,而“經常推翻重來”則是其後果。非專業人員最初通常就是一個人開始練手,自己給自己寫代碼,接口怎麼寫自己都能理解,所以專門去設計反倒是麻煩。但到了團隊裏面,過於“獨特的”程序接口則是災難,因爲你得去給每個人解釋這個接口的用法,說服他們使用這種接口。而這往往會遵行強勢原則:你要麼屈從“更標準的接口設計”,要麼團隊就放棄你的這些代碼。
做程序再熟練,過不了上面這個階段就談不上合作,也談不上設計。一個人寫程序,無需多少設計的功夫。但一個團隊合作,沒有設計就不行。因此我認爲寫程序的第二個階段就是團隊開發和專業設計。而這兩點,正是從項目管理和技術實現上來組織大規模開發的不二法門。因此,我事實上在這裏想說明的是:相對於個體開發,團隊開發是更高階的技術。
在你學會了團隊開發,能夠輕鬆地與人合作,或組織小型的開發團隊時,要想在這個行業中安身立命就並非難事了。至於用哪種語言,由於你是“優秀的程序員”,因此語言的選擇是應項目之所需的,所以不是接下來要談的關鍵問題。
第三個階段是你能否在行業中脫穎而出的關鍵。但這個關鍵與技術無關,而是一個人的秉性和個性的問題。我們一方面會很阿Q地說“酒香不怕巷子深”,另一方面又說“千里馬常有而伯樂不常有”。問題在於,馬不能主動地找伯樂,人又爲什麼不能呢?馬困於廄而顯凡俗,人立於世可顯不羣。有表現自己不凡的品質的空間而不施展,根本上說還是能力問題。所以學會溝通、交往,而不是沉迷於代碼,可能是第三個階段的重要瓶頸。
在第三個階段,你可能面臨非常多的選擇。例如技術主管、項目經理或者設計師、分析師之類。但你應該會發現,這所有的選擇都將使你被推到團隊的前面,你必須面對整個團隊,以及項目的干係人(例如客戶)。而能否勝任這些,取決於你的綜合素質,而非單一的軟件開發技能。
最後你得記住一件事,上面的這個過程,不是一朝一夕,也不是一年兩年,而是五年十年的時間。在這個過程中,所有成功者都必須具備的,是認真的態度和專業的精神。
《程序員》:請爲開發人員提供幾點實踐性的指導。
==============
周愛民:把語言作爲“稱手的兵器”,那麼基本技能則相當於內家修爲。練石鎖也能練出個李元霸,這說明單單靠“不停地寫程序”,也是能寫出高手來的。但是,如果一上手就給個千百斤的大石鎖,李元霸沒練成便先犧牲了。所以凡事都有個循序漸進,所循的這個“序”,並不要求每個人都相同,別人的經驗,大抵上適合做個參考。而我也不能言講什麼指導性的東西,所以上面所談,大家儘可以當經驗來看,當參考來用。是實踐,卻不是什麼指導。
《程序員》:請您談談做遊戲開發與一般的軟件開發,在技能上的要求有什麼不同?
==============
周愛民:遊戲開發涉及的領域是比較複雜的。例如對界面交互,一般軟件開發中有可用性測試,而遊戲中叫可玩性測試。可用與可玩,就已經是兩種不同的界面交互設計理念了。一般軟件開發很少在界面部分應用人體工程學的知識,而遊戲界面交互設計中卻經常要用到這種知識。但是同樣的例子,如果你做遊戲開發中的網絡傳輸或者服務器端,就涉及不到人體工程學。所以這裏要說的是,現在遊戲開發過程被分解得很細,不同的技能在遊戲開發領域中都可以找到位置,但不要指望能什麼技能都精通,然後一兩個人就搞完整套遊戲。
大多數遊戲開發能涉及到的領域,在一般的軟件開發中也同樣會涉及到。例如數據庫,很多人認爲數據庫與做遊戲風馬牛不相及。但事實上,在遊戲開發中,後臺數據庫的存取效能、分佈特性等是嚴重影響遊戲體驗的。所以你在傳統軟件開發中做得很好的技能,在遊戲開發中一樣用得到。
然而不同之處還是有的,其中突出的幾點表現在視覺特效、交互特性和網絡性能。
一般性的軟件開發中,我們會遵從操作系統的慣例爲用戶提供交互體驗,但遊戲正好是希望給用戶獨特的體驗,因此通常有不同的交互特性。這可能小到一個按鈕的設計,大到整個操作的流程。這種交互特性又與輸入輸出設備的性質相關,例如手機的屏幕與鍵盤與PC就不一樣。所以遊戲對整個系統的輸入輸出的研究,與操作系統和一般軟件是不一樣的,根源在於它要提供獨特性。
遊戲對網絡層的研究,也與傳統軟件不一樣,但這不是獨特性導致的,而是用戶量級的問題。大到銀行、電信這樣的系統中,人們對數據傳輸的效能通常是由數據庫系統和硬件系統來保證的,因此你只需要研究數據和庫的優化。但我們總不能讓用戶花錢買完mssql、架完專線再來玩遊戲,所以遊戲開發中要在相當高的數量級上,自己來解決數據傳輸和數據庫使用中的問題。然而遊戲是多用戶、強交互的系統,因此很快爆發出來的問題是分佈問題、並行問題等等。這些原本在其它開發中交給某個專屬領域去解決的問題在遊戲中都需要用自己的方法去解決。
我們很少去強調遊戲開發與一般的應用系統開發在技能方向有什麼不同。其根本的原因,在於軟件技術以及其它知識都存在共通性。任何一項專精的技術都可以在某個領域上發揮它的獨特效果,任何廣博的知識也都有助於開發人員找到更合理的解決方案。除開這些之外,我認爲更重要的興趣與態度,例如遊戲開發需要你去發現和尋找樂趣,而系統底層的開發則要求你有更加堅韌的毅力與深厚的基礎。這些,並不是技能所能彌補的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章