1. 程式人生 > >程式設計師應具備的優秀品質

程式設計師應具備的優秀品質

1. 熱愛程式設計
  程式設計是一種為了滿足興趣而心甘情願去做的勞動(Programming is a labor oflove)。和其他任何職業一樣,唯有真正的熱情,才能完成真正的偉大事情。這裡有個誤解,認為編寫程式碼是機械化並純科學性的。事實上,最優秀的軟體工程師是工匠,他們能把能量、獨創性和創造力融入到每一行程式碼中。偉大的工程師知道何時該把程式碼雕琢至完美,知道何時把大型系統像拼圖一樣組裝到一塊。熱愛程式設計的工程師從構建軟體中獲得滿足,就好比一位作曲家在完成一部交響樂後而欣喜若狂。正是興奮感和成就感,才造就了喜愛程式設計的明星工程師。

  2. 完成事情
  有很多技術人員只談論軟體而不編寫程式碼(只說不做型)。而偉大軟體工程師會真正去編碼,這也是他們最為重要的品質之一。他們是實際做事的人。聰明人都知道,解決問題的最佳途徑是直面問題,而不是花上數週來設計複雜又不必要的架構和函式庫。優秀工程師應當會問:解決手頭問題的最簡單方法是什麼?最近的軟體開發方法——敏捷實踐,正是專注那個。它的思想是,把複雜的專案拆分為短小的迭代,每個迭代只關注一小部分的增量功能。因為每個迭代對應的編碼只需要數週,所以功能易於管理並簡單。


  3. 持續重構程式碼
  編碼很像雕刻。要像藝術家一樣不斷完善自己的作品,軟體工程師也要通過可能的最佳方式來持續完善自己的程式碼,以達到目標。重新塑造程式碼的原則稱為“重構”,Martin Fowler在他的創意書中有相應描述。重構背後的原始思想是:改善程式碼而不改變其功能,移動調整部分程式碼以確保系統不腐,還有確保系統完成基於當前需求該完成的事。持續重構可以讓開發人員解決另一個著名的問題——“黑盒遺留程式碼”(這個問題基本無人想觸及)。
  幾十年的軟體開發文化要求我們,不應該去改變正常工作的東西。然而,隨著時間推移,問題是我們成為了老舊程式碼的奴隸,老舊程式碼變得不穩定和不相容。而重構正好可以改變這一狀況,因為我們是程式碼的主人,不是它的奴隸。重構在工程師和程式碼之間建立起持續的“對話”,並帶來所有權、確定性、自信心和系統的穩定性。

  千萬不要成為老舊程式碼的奴隸。如果程式碼是他人所寫,或許你可以輕易推脫責任。但大多數時候,那些程式碼是自己所寫,要拿得起放得下,舊程式碼該埋時,就把它埋了!

  4. 使用設計模式
  自從所謂的“四人幫”(Erich Gamma、Richard Helm、Ralph Johnson和JohnVlissides)發表他們的著作——《設計模式》後,全世界的軟體工程師一直都在討論模式。在我們所處的世界,不管是自然界還是人類行為,模式無處不在。軟體工程自然也不例外。模式就是不斷重現的跨語言跨系統的場景和機制。一位優秀的工程師通常能識別並利用模式,而不是受制於模式。工程師不應(強制)讓系統去適應某種模式,而需發現在系統中使用模式的時機(恰當使用模式)。在使用模式來確保正確性時,應借鑑利用前人的智慧結晶,使用以前能正當解決特定工程問題的方法。但請切記:模式不是萬靈藥;不要為了使用設計模式而使用設計模式。


  5. 編寫測試
  曾有段時間,軟體工程師們認為測試不值得他們去做。然而,如果你不做測試,你怎麼能確保程式碼就能正常工作呢?敏捷實踐中的“單元測試”已獲得普遍認可,因為它注重編寫測試來反映程式碼是否有效。隨著系統增大,測試也隨之增大。有經驗的工程師知道並瞭解測試的價值所在,因為測試的目的就是建立一個能正常運作的系統。優秀的工程師通常會確保出現過一次的Bug不會再出現第二次。但優秀的工程師也知道,不應該浪費時間寫那些瑣碎或多餘的測試,而需要專注測試各個元件中的核心部分。


  6. 善用現有程式碼
  “重新發明輪子”一直是軟體行業中的巨大問題之一。從發明新語言到從寫函式庫,忽視並重寫那些已經存在並已能工作的奇怪驅動力,已經造成大量軟體開發的失敗案例。一位明星工程師會專注三種基本型別的重用:第一,內部基礎架構的重用,相應程式碼是他自己或同事編寫的;第二,使用第三方的函式庫,比如JDK。最後,研究使用某些大型網路服務商提供的相應服務,比如Amazon。總之,正確善用現有的程式碼,使得軟體工程師能真正專注於最為重要的事情上——應用程式本身。


  7. 專注可用性
  優秀的工程師通常都專注於使用者。無論使用者是企業還是個人,無論是為消費型的軟體公司還是投資銀行,需要關注的都是可用性。使用者如何和系統互動?系統是否提供一種簡單、直接和平穩的操作體驗?有種說法,因為軟體工程師是技術人員,他/她和“使用者如何與系統互動”沒有關聯,這種說法嚴重錯誤。優秀工程師努力工作是為了什麼?不正是讓系統簡單並易於使用。他們無時無刻都會想到使用者,不會嘗試去發明那些令人費解,只有極客才能理解並欣賞的東西。
  有些時候,一些軟體工程師過於投入,反而忘記所編寫的程式/軟體,是供他人使用,不是做給自己看的“藝術品”。所以,在軟體開發過程中,一直要把“使用者”放在心中。


  8. 編寫可維護的程式碼
  軟體開發界的另外一個小祕密是:編寫優秀程式碼和糟糕程式碼所花費的時間是一樣多。一位訓練有素的工程師,他/她會從第一行程式碼開始就考慮可維護性和程式碼的演化。沒有任何理由編寫“醜陋”的程式碼、長達數頁的函式,或是稀奇古怪的變數名。優秀的工程師編寫程式碼會遵循命名慣例,程式碼編寫緊湊、簡單和不過度炫耀聰明。程式碼的每一行,都應恰如其分地展現出其原有目的。在給不便理解的程式碼(塊)合理註釋時,別忘了命名規則。清晰明瞭的函式名和變數名可以讓程式碼不言而明。
  在編碼時,有些程式設計師會有這種心態:過一會兒再來修改或完善某部分程式碼或某條語句。但誰知這一“過一會”竟然是“一天”、“一週”、“一個月”或“一年”,甚至以後根本就沒機會再回頭修改。所以,儘量別妥協寫出暫時堪用(可以使用)的程式碼。否則,不僅不會節省開發時間,也可以阻礙整個程序。當然也不利於後續維護人員的工作。


  9. 能用任何語言程式設計
  優秀的軟體工程師或許有自己一門特別鍾愛的程式語言,但從不會執迷於當中。如今已有很多優秀的程式語言,也就是說,如果你只會使用其中一門語言,說明你缺乏多樣性。你可以用Java、C#或C++編寫任何現代軟體,可以用PHP、Perl或Ruby編寫任何網站的後臺。簡而言之,程式設計所用語言,遠遠沒有語言相應的函式庫重要。優秀的工程師能夠認知到這一點,並願意去學習新語言、新函式庫和構建系統的新方法。


  10. 知曉基本的電腦科學知識
  最後,但肯定不是優秀工程師最不重要的特質就是:紮實的基礎。優秀的工程師或許並沒有電腦科學的學位,但他/她必須知道基礎——資料結構和演算法。如果不知道雜湊表,或者不知道連結串列和陣列之間的差別,你如何構建一款大型的軟體?這些都是每位從事軟體開發的開發人員應當知道的。演算法也同樣重要,從二分查詢到各種排序,到圖形遍歷,一位明星工程師必須知道並內在消化這些基礎東西。因為這些基礎就是你在構建任何現代軟體中做抉擇時的必備品。