1. 程式人生 > >優秀程式設計師應該具備哪些素質?

優秀程式設計師應該具備哪些素質?

你可以不聰明,但是你絕對不能不用心。

——《女人公敵》

程式設計師求職是本是一件只要“郎有情女有意”,一拍即合的事情,可是企業與求職者卻總是看不對眼,進而導致IT市場上總是會出現結構性失衡的現象。一方面,社會每年培養幾十萬的程式設計師,他們卻找不到好的工作,但另一方面,企業卻招不到好的程式設計師。問題出在哪?問題出在程式設計師越來越多,但優秀的程式設計師卻不是這樣。

著名書籍《人月神話》裡面對優秀程式設計師的特性進行了一個深入分析,認為優秀程式設計師必須具備以下幾個方面的素質:

(1)對程式設計有濃厚的興趣,而不是因為喬丹(備註:喬丹曾經給NIKE代言,廣告詞為“Just do IT”)才入行,由興趣能驅動自己的探索和鑽研精神,優秀程式設計師一般喜歡用業餘時間探索和自己琢磨點東西,研究點開源框架和原始碼。

(2)優秀程式設計師一般善於重構,懶於做重複的事情,對於重複事情有獨有的程式設計師思維,即通過程式或其它自動化方式解決重複問題,而留更多時間去思考。達到一種多約束下的良好平衡。

(3)優秀程式設計師更多的會從簡單功能實現,花哨的介面轉移到對安全,效能,可擴充套件等底層架構的關注。

(4)優秀程式設計師一般有較明顯的自戀和偏執特徵。

(5)優秀程式設計師一般對計算機底層知識非常瞭解,有較為紮實的演算法,資料結構等理論知識的基礎。

對於優秀程式設計師而言,程式設計不是一份工作,而是一項充滿激情的事業,編者比較認同這個觀點,同時,編者也覺得,一名優秀程式設計師除了具備這些素質外,如果還能具有以下一些能力,必將錦上添花。

(1)    身體壯如牛

想成為一名優秀的程式設計師,身體不好肯定不行。本章第4.5節對程式設計師的身體健康有比較詳細的論述,此處不再贅述。

(2)    心理素質好

眾所周知,程式設計是一項勞心勞力的活,程式設計師也因此需要承受巨大的精神壓力。有的人沉不住氣,儘管實力不俗,但面對壓力,卻會瞬間崩潰,立馬變成軟蛋,而有的人面對困境,能夠越戰越勇。而優秀程式設計師屬於後者。

(3)     團隊精神和協作能力

失敗的團隊沒有成功者,成功的團隊成就每一個人!真正優秀的程式設計師應學會怎樣和別人工作與合作,因為團隊精神和協作能力是程式設計師應該具備的最基本的能力,也是最重要的安身立命之本。很多人誤認為優秀程式設計師是獨行俠,不食人間煙火,喜歡把自己關在一個小黑屋子裡面,一待就是幾個月,然後突然出關,向世界宣佈自己已經如何武藝高強了,其實不然。如果沒有團隊精神,任何一個程式設計師也不可能有真正的成功,即使成功也是渺小的、暫時的。

隨著軟體系統的規模越來越大,計算機軟體的發展已經度過了早期的依靠個人能力的單兵作戰時代,“孤膽英雄”也早已成為傳說,即便如LinusTorvalds(Linux核心的創作者)這樣的天才,也需要通過組成強大的團隊來才能創造奇蹟。現在的軟體已經朝著大型化、商業化、定製化方向發展,因此要獲得事業上的成功,必須要依靠團隊的力量才能達到,就更加需要程式設計師的團隊精神與合作能力了。

(4)    書寫註釋與文件的能力

很多人以為程式設計就是寫程式碼,其實,這是對程式設計的一種誤解。軟體由程式碼與文件組成,優秀的程式設計師絕不僅僅只是會寫程式碼,而是應該具有很強的註釋與文件書寫能力。良好的註釋與文件是正規研發流程中非常重要的環節,如果軟體缺少註釋與文件,那麼這個軟體就會缺乏生命力,在未來的升級、排故以及模組的複用時就都會遇到極大的麻煩,有可能是毀滅性的災難。

作為一名普通程式設計師,花費30%的工作時間寫技術文件是很正常的事情,而作為優秀程式設計師,這個比例會更高。

(5)     嚴格遵循編碼規範與標準的編碼能力

什麼樣的程式碼是最爛的?別人寫的程式碼。真正閱讀程式的是人,而不是給計算機,所以程式碼具有良好的可讀性,是優秀程式設計師必備的素質之一。在大型的系統開發中,往往需要很多人的通力配合,例如,開源軟體Linux之所以能夠為全球頂尖程式設計師共享、協作開發,也得益於規範化和標準化的編碼規範。

雖然註釋是程式設計中很重要的一部分,但是能夠不言自明的程式碼卻更勝一湊,它能讓其他人在閱讀程式碼的時候,不用閱讀註釋或是手冊就可以明白它的意思,而編碼規範正是能夠提高程式碼可讀性的有效方式之一。程式碼規範一般包括程式碼的變數命名,程式碼內註釋格式,甚至巢狀中行縮排的長度和函式間的空行數字都有明確規定等內容,良好的編碼規範,不僅有助於程式碼的移植和糾錯,也有助於不同技術人員之間的協作。

(6)    經常自測試的能力

在一個正規化的軟體研發團隊中,儘管配備有專職的測試工程師,但並不能以此為藉口,程式設計師就不進行自測試。對於軟體研發而言,問題發現的越早,解決的代價就會越低,整體系統建設的效率和可靠性就有了最大的保證。

只有注重質量的程式設計師,才能寫出魯棒穩定的大型軟體。所以優秀的程式設計師知道自己的程式碼能做什麼,所以經常會對程式進行自測試,自測試主要包括正常測試與異常測試兩種。正常測試看程式是否能在正常呼叫下完成基本功能,異常測試主要包括壓力負載測試,異常輸入測試,邊界值測試、特殊值測試等。

(7)    善於學習與總結的能力

優秀的程式設計師絕不會安於現狀,因循守舊,固步自封,靠吃老本度日。善於學習,對於任何職業而言,都是前進所必需的動力,對於程式設計師,這種要求就更加高了。有人說:以一萬年為單位來思考,那是神人;以一千年為單位來思考,那是聖人;以一百年為單位來思考,那是大師;以十年為單位來思考,那是名人。按此邏輯,程式設計師可以稱得上是世間最不幸的人了。因為程式設計師主要從事的是高新技術相關工作,需要了解太多知識,而知識又在不斷地更新,一種技術可能僅僅在三兩年內具有領先性,很快會被其他更新、更好的技術所取代,所以優秀的程式設計師總是會不斷地主動跟進新的技術,學習新的技能,在最快的時間內,掌握最新的技術,應用在最適合的場合,最大程度地提高軟體研發的效率。除了對知識的學習以外,還要善於學習其他優秀程式設計師,學習他們思考問題的方式,學習他們的編碼風格。

善於總結,也是優秀程式設計師必備的一種能力。苦幹不如巧幹,但是如何巧幹,不是人人都知道的。否則就不會幹同樣的事情,常人一天忙到晚都來不及;而優秀程式設計師卻可能活的很瀟灑。每次完成一個研發任務,完成一段程式碼,都應當有目的的跟蹤該程式的應用狀況和使用者反饋,隨時總結,找到自己的不足,這樣逐步提高,一個程式設計師才可能成長起來。如果只是在按部就班地寫程式碼、湊程式碼,只能成為Coder,江湖叫“碼農”、“碼畜”。為了使自己不至於淪為Coder,一定要對自己的程式碼,自己的設計不停地反思和總結,並精益求精。程式設計就像創作,人人都會寫,但並非人人都寫得好。

(8)    逆向思維能力與換位思考能力

當工作中遇到的新問題,一時又找不到解決方法時,優秀程式設計師擅長用逆向思維辦法去探索解決問題的途徑。他們清楚具體業務執行者比上司更容易找出問題的節點,是人為的,還是客觀的;是技術問題,還是管理漏洞。採用逆向思維找尋問題的解決方法,會更容易從問題中解脫出來。

同時,他們也會自覺地站在企業或老闆的立場去考慮解決問題的方案。作為公司或老闆,解決問題的出發點首先考慮的是如何避免類似問題的重複出現,而不是頭疼醫頭,腳疼醫腳的就事論事方案。能始終站在公司或老闆的立場上去醞釀解決問題的方案,逐漸地他們便成為可以信賴的人。

(9)    知識遷移能力

知識遷移能力是一種特殊的學習能力,它可以避免對知識的死記硬背,實現知識點之間的貫通理解和轉換,有利於認識事件的本質和規律,構建知識結構網路,提高解決問題的靈活性和有效性。優秀程式設計師能夠把已經掌握的知識遷移到其他領域,學習新技術或者解決新問題對於他們而言,並不是那麼困難。例如,如果他們理解了面向物件的思想,並且能夠熟練使用C++語言,即使他們從來沒有學習過Java、C#語言,他們也會在非常短的時間內對Java、C#非常熟悉。

優秀程式設計師在程式設計的時候,總是會不斷的思考這樣一些問題:程式的演算法合理嗎?異常情況都考慮了嗎?程式寫的夠簡單嗎?執行速度夠快嗎?佔用空間足夠少嗎?程式碼寫的規範嗎?語句寫的標準嗎?程式之間的結構合理嗎?類定義的合適嗎?方法和屬性合理嗎?介面合理嗎?等等,而不是僅僅實現功能。所以,要想稱為金字塔尖的那一部分精英,對於大多數程式設計師而言,還有很長一段時間的路要走。

優秀程式設計師不是嘴說出來的,而是靠努力幹出來的,她需要辛勤地耕耘,沒有付出,也就沒有收穫。正如莫泊桑所說,天才不過是不斷的思索,凡是有腦子的人,都有天才。國際知名納米材料專家王中林院士曾經說過:“天才應該是靈感乘以汗水,年輕人總希望一夜成名,只看見了成功的光環,但沒看見辛勞的背景。”

轉自:http://blog.csdn.net/xdhehao/article/details/10010175