那些優秀程序員身上的共同的特質
至少深入理解一門編程語言
學習編程和學駕駛很像,你很容易就能學會駕駛,比如,經過一個月的駕校培訓,你就能獲得駕照,但要真正成為一名優秀的司機,卻必須經過長時間的駕駛實踐才行,這將幫助你在頭腦中形成一套完整意識體系以應對駕駛中所遇到的不同情況。編程也是一樣,當程序員們作出那些優秀的程序設計時,看似自然,但它的背後卻是程序設計者們經過長時間編程實踐之後所構建起來的編程思維。
優秀的程序員不僅熟練掌握一門編程語言的語法和語義,他們還會掌握這門語言的使用哲學,包括那些最佳實踐、設計模式以及它們背後所蘊含的原則
了解語言的局限,任何程序語言都會有其局限性,這會讓我們在解決某些問題時產生麻煩,我們需要了解這些限制,並知道如何使用一些方法或技巧去繞過這些限制並解決問題。
理解語言的缺陷,有些語言在設計之初就存在一些先天不足,比如JAVA語言中的日期處理,那些原始數據類型,可能會給你帶來一些疑惑,了解這些缺陷,並盡可能在編程中避免涉及這些缺陷,會讓你的程序在日後更易於維護。
了解語言的未來,有些編程語言如新生兒般茁壯成長,如Swift、Go,有些則如青壯年般看上去年富力強,比如Java、PHP、Python,而有些則已進入暮年,不再受到關註,比如VB、Pascal。優秀的程序員能很快掌握一門新的編程語言,但只有了解語言的發展方向,才能讓你更有信心地去應對未來。
聽起來或許有些可笑,但那些出色的程序員往往容易給人留下“傻”的印象。他們對某些事物的看法可能顯得單純而幼稚,他們的待人接物經常會鬧出笑話。但這些並不會阻礙他們成為一名優秀的程序員,因為“傻”——知道自己不夠聰明,反而能使他們變得更加強大。
不會停止學習的腳步:認為自己不夠聰明才會通過不斷學習去提高自己。而一旦你停止了學習的腳步,你將無法得到那些能夠讓你變得更加優秀的方法和技能。
使得他們在工作中變得更加嚴謹:他們會花更多時間review自己的代碼,進行測試以保證交付的質量。雖然過程可能並不輕松,但他們卻總是能交出令人滿意的結果,這也讓大家對他們充滿信任。
幫助他們獲得更好的想法:在軟件開發領域,那些最優的解決方案,往往需要你通過深入思考並探索盡可能多的可行方案後才能獲得。這意味著你必須具有開放的思維,而不是那些聰明人的自以為是。
他們都是現實主義者
相信每個人都有一顆追求完美的心,程序員也不例外。然而在軟件開發中完美並不存在,所謂的完美只是想象中的一個瞬間狀態,而它是無法達到或者即使達到也極易被摧毀的。任何一段新的代碼,一個新的功能中所存在的缺陷都可能將這種完美的狀態打破,而為了達到完美所付出的代價更是我們所無法承受的。那些成熟的程序員更加現實,他們關註於如何高效地解決問題,並在此基礎上給用戶帶來好的感受。
相信每個人都有一顆追求完美的心,程序員也不例外。然而在軟件開發中完美並不存在,所謂的完美只是想象中的一個瞬間狀態,而它是無法達到或者即使達到也極易被摧毀的。任何一段新的代碼,一個新的功能中所存在的缺陷都可能將這種完美的狀態打破,而為了達到完美所付出的代價更是我們所無法承受的。那些成熟的程序員更加現實,他們關註於如何高效地解決問題,並在此基礎上給用戶帶來好的感受。
優秀的程序員懂得平衡,他們理解時間、人員等資源都是受限的,因此他們會選擇最簡明有效的方法去實現需求或解決問題。而非為了不必要的完善和未知的將來,把一切想得過於完美,反而增加了系統的開發和維護成本。他們不會把代碼寫得過於復雜,因為他們知道團隊中大部分的程序員都處於中等水平,過於復雜的代碼會讓他們產生困惑。優秀的程序員也深知完成即是價值的道理,他們知道從來沒有絕對的對與錯,與其長時間的關在會議室裏,去討論或設想產品,倒不如嘗試用較小的代價去實現出某一個功能或產品,然後通過用戶的實際使用去證明它,然後在反復的叠代中不斷完善。他們尊重流程,但會靈活應用。每個公司或團隊都會有自己定義的開發、測試、發布流程,優秀的程序員們尊重這些流程,但在某些時候他們也會對流程中阻礙自己效率的部分作適當的裁剪。
優秀的程序員都很現實,這使得他們在不同的環境、團隊、項目中都能快速獲得成功。他們所開發出的系統往往處於“較好”的狀態之下,它並不完美,但卻非常穩定。
從自己的失敗中學習
作為程序員,你不可能總是對的,你或許會錯誤地選擇了某個技術或框架,你或許錯誤理解了用戶提出的需求。但不經過這些失敗,你可能永遠無法得到那些正確的方法。
誠實地面對自己的錯誤非常重要,這意味著你或者你的同伴能夠及時地去修復錯誤,而這對你、對團隊、對項目都是最有益的。而每一次的失敗也會成為一次自我提升的良機,造成失敗的原因是什麽?如何有效地避免失敗?通過及時反思,並果斷采取措施,那些失敗將成為你獲得進步的最佳途徑。
然而,承認失敗往往需要極大的勇氣,特別是在一些軟件公司,他們營造了一些不良的文化,當產品出現問題時總是對用戶掩蓋搪塞,並想方設法蒙混過關。這對你個人無益,甚至可能因為延誤了問題的最佳解決時機,而導致更慘重的失敗。如果你希望變得更加優秀,那你必須具備直面失敗的勇氣,並學會從每一次失敗中獲得進步。
很懶卻又很高效
那些優秀的程序員有時看上去很懶,他們會在上班時間做那些與工作毫無關系的事情,比如在紙上隨意地亂塗亂畫,長時間坐在那裏發呆,甚至玩手機。但一旦他們進入編程狀態,你又會發現他們變得像打字員般,指尖飛舞,瞬間完成他們的工作。
優秀的程序員非常珍視自己的時間,他們會利用一切手段提高效率:
常年的編程工作使他們都能熟練操作鍵盤,往往從一個程序員的打字速度上就能判斷他是否優秀。
他們能夠熟練地使用IDE,他們不依賴菜單,而是使用快捷鍵來操控代碼,從查找文件,文本編輯到格式化代碼,文本替換都盡可能使用快捷鍵,這使得他們的開發工作更加連貫,也更高效。
他們善於使用或發明工具,他們尋找一切能提高效率的工具,必要時他們還自己編寫自動化腳本、發明新的工具,從而徹底拋開那些惱人的重復勞動或機械性工作。
編程的過程是一個深入思考的過程,而非簡單的不斷敲出代碼。那些看上去很懶的優秀程序員,他們的思維卻可能一刻不停地在運轉著,這也是他們總是能夠給我們帶來驚喜的原因。
善於發現並改造輪子
今天幾乎每個程序員都知道不要重復發明輪子的道理,但問題往往是他們無法找到那個需要的輪子,或者他們無法很好地使用他們。
優秀的程序員知道如何找到他們想要的輪子:
他們會用幾個與待解決問題相關的關鍵字在互聯網上進行搜索。他們不僅使用國內的搜索引擎還會想方設法借助Google、Bing等國外搜索引擎,因為很多解決方法、意見、建議往往會出現在國外的技術論壇中。
他們會利用社交網絡進行搜索,因為那裏往往包含著最新的信息,相比傳統互聯網搜索,你往往會得到那些更具時效性的解答。
他們善於提問,互聯網上很少有人認識你,所以你完全不必害羞,在Stackoverflow等社群提出你的問題,你很快就會獲得熱心人的回復。當然對任何回復都保持友好和善意也很重要,否則沒人會願意幫助你。
優秀的程序員善於組合和改造輪子:
雖然我們比以往任何時候都更容易得到輪子,但如何用好它們卻是另一個學問。我們往往需要一些技巧將幾個輪子組合在一起使用,必要時還需要對它們進行一些改造。優秀的程序員往往能通過閱讀相關的文檔、API以及代碼,快速地判斷一種技術、框架、工具是否適合自己的需要。並且憑借紮實的技術功力,他們還能基於這些輪子,改造出更強大、更適合自己需要的輪子。
並行工作,有效利用時間
效率可能是優秀程序員與那些普通程序員之間最大的區別,優秀的程序員總能更快、更好地完成布置給他們的任務。這背後當然有技術熟練度方面的原因,但我看到的另一個重要原因是,他們更善於將工作進行切分,並充分利用時間並行地去完成他們。
程序員每天都會參與很多活動,比如參加需求討論會議,和其他開發者討論設計方案,大量的閱讀學習,當然還有編碼。很多時候,我們會按照別人的意願,去安排自己的工作,但這對我們來說可能並不是最有效的工作方式。工作中充滿了選擇,你不可能一下子完成所有的事情,在開始之前想一想如何把時間最有效地利用起來對你來說非常重要。
優秀的程序員非常善於多線程工作,他們能夠如項目經理一般,拆分並安排好自己的每一項工作。如果你長時間做一件事,很容易會覺得疲勞,但把幾件事切分成更小的任務後,交錯並行地去完成它們,你便能更輕松地完成它們。就像我們在生活中,會利用坐地鐵,等公交的時間,拿出手機來獲得咨詢一樣。優秀的程序員能將所有的可支配的時間碎片化,利用這些時間片段,他們閱讀、學習、開發、做個人項目......他們並不比任何人有更多的時間,只是他們更會利用時間。
具備不錯的軟技能
你可能是一個代碼高手,但這並不足以使你成為一個優秀的程序員,因為優秀往往是他人對你的評價,而你的老板、客戶可能都不擅長或根本不懂編程,他們往往並不會給一個只懂得編程的員工以很高的評價。當然,我們不可能去責備一個程序員過於鉆研技術,因為技術發展得太快,他們需要不斷學習才能跟上技術的發展腳步。但程序員們仍然不應忽視那些對他們的發展同樣重要的軟技能。優秀的程序員往往需要具備:
一定的語言表達能力,這樣才能向他人準確而清晰地表達你的設計或想法
學會傾聽,這樣才能獲得他人的優秀想法或意見,幫助你取得進步
有足夠的信心成為一個領導者,盡管可能只是一個2,3人的團隊,但那是一個很好的開始
指導他人的能力,教授方法和思想,而不僅僅局限於技術本身
持續學習的能力,你需要不斷進步,否則即使你曾經優秀,也會很難維持
謙遜的態度會讓你更像是一個大師
尊重每一個人的同時,你也將會迎得他人的尊重
敢於承擔責任,機遇往往就會隨之而來
優秀的程序員不僅具備優秀的技術能力,他們也往往擁有這些軟技能。在我所看到的所有項目中,很少會因為技術原因導致項目的失敗,而大部分的失敗往往來自於程序員們軟技能方面缺失所導致的團隊協作問題。反而是那些被認為水平一般的團隊,卻經常能依靠著團隊成員間的通力協作創造出讓人驚訝的成果來。
身邊有一些優秀的夥伴
我認為程序員會向著個人化、多樣性的方向發展。越來越多的個人程序員和更小的開發團隊將會產生,在不同領域內,他們借助技術的進步與工具的發展,能做出以前只有較大規模團隊才能開發出的優秀產品來。盡管如此,我仍然相信那些優秀的程序員並不會成為一匹獨狼,相反的,他們身邊總是會伴隨一批同樣優秀的夥伴。
回想我們的程序員生涯,當我們還是一個菜鳥時,身邊總會出現一些導師,他們可能是你的團隊Leader,或負責帶你的資深程序員,那時我們那些編程時的錯誤和缺點總是被無情地暴露在他們面前,經過他們的指正或批評,我們從不斷修正自己的錯誤中獲得了成長。隨著我們技能的不斷增長,在不同時期,因為不同的興趣,我們身邊的夥伴也在不斷變化,他們成了團隊中與你能力相當的同事,或是你所做業余項目中的誌同道合者,又或者是你參與的開源項目中那些不同領域的專家,他們都成為了一名優秀程序員身邊不可或缺的優秀夥伴。這讓我想到結對編程中關於輪轉(Rotate)原則——並非固定兩人一組,而是根據任務的不同,不斷輪換搭檔。任何時候,你都需要那些優秀的夥伴不斷帶來啟發,給予指導,一起去完成不同目標,更重要的還有坦誠地指正你的問題。與優秀者同行,你也將變得更加優秀。
對生活充滿熱情
有很多因素會使一名程序員走向平庸,而最最直接的便是失去對編程熱情和興趣。當一名程序員不再能夠感受編程所能帶來的樂趣時,編程對他來說,只是一項不得不去完成的工作,而他也將失去繼續學習的動力,無法再與優秀沾邊了。
我看到的那些優秀的程序員,總是對編程充滿著熱情,每次完成一個新的功能,解決一個有難度的問題,甚至修復一個不易被發現的缺陷都能讓他們興奮不已,而這些又會成為他們不斷去提升技能,學習新技能的動力。他們在不斷突破自己的極限中,並從中體會編程所帶來的樂趣。
同時,優秀的程序員們也懂得生活,他們對那些新鮮事物總是充滿好奇,樂於嘗試,他們也會有各自不同的興趣愛好,攝影、寫作、旅行,亦或是遊戲、追劇,他們總能很好地掌控這些興趣愛好與他們所熱愛的編程之間的關系。他們會每天有規律地完成如閱讀、學習、運維自己的個人項目之後,投入到自己的其他興趣愛好之中,他們很少熬夜,這保證了他們每天都能迎來一個新鮮的開始。他們能夠掌控生活,而不是反過來被生活所控制。
優秀程序員們的身上一定還有著更多我們所未見的特質,但歸根結底,還是內心深處那份對於編程的熱愛與執著,推動著他們去不斷獲得那些天賦與才能吧......
那些優秀程序員身上的共同的特質