那些優(yōu)秀程序員身上的共同特質(zhì)
你是否發(fā)現(xiàn),在我們身邊的那些優(yōu)秀程序員身上總是能找到一些共同的特質(zhì),這些特質(zhì)并非與生俱來,但卻逐漸在他們身上留下深深的烙印,這也使得他們變得與眾不同,更成為我們心目中的佼佼者。
至少深入理解一門編程語言
學(xué)習(xí)編程和學(xué)駕駛很像,你很容易就能學(xué)會(huì)駕駛,比如,經(jīng)過一個(gè)月的駕校培訓(xùn),你就能獲得駕照,但要真正成為一名優(yōu)秀的司機(jī),卻必須經(jīng)過長時(shí)間的駕駛實(shí)踐才行,這將幫助你在頭腦中形成一套完整意識(shí)體系以應(yīng)對(duì)駕駛中所遇到的不同情況。編程也是一樣,當(dāng)程序員們作出那些優(yōu)秀的程序設(shè)計(jì)時(shí),看似自然,但它的背后卻是程序設(shè)計(jì)者們經(jīng)過長時(shí)間編程實(shí)踐之后所構(gòu)建起來的編程思維。
優(yōu)秀的程序員不僅熟練掌握一門編程語言的語法和語義,他們還會(huì)
-
掌握這門語言的使用哲學(xué),包括那些***實(shí)踐、設(shè)計(jì)模式以及它們背后所蘊(yùn)含的原則
-
深入理解語言的特性,每一門語言都有各自的特性,而很多新的特性還會(huì)被不斷加入到語言的***版本之中,充分了解這些特性,能夠幫助程序員更準(zhǔn)確、高效地使用它們
-
了解語言的局限,任何程序語言都會(huì)有其局限性,這會(huì)讓我們?cè)诮鉀Q某些問題時(shí)產(chǎn)生麻煩,我們需要了解這些限制,并知道如何使用一些方法或技巧去繞過這些限制并解決問題。
-
理解語言的缺陷,有些語言在設(shè)計(jì)之初就存在一些先天不足,比如JAVA語言中的日期處理,那些原始數(shù)據(jù)類型,可能會(huì)給你帶來一些疑惑,了解這些缺陷,并盡可能在編程中避免涉及這些缺陷,會(huì)讓你的程序在日后更易于維護(hù)。
-
了解語言的未來,有些編程語言如新生兒般茁壯成長,如Swift、Go,有些則如青壯年般看上去年富力強(qiáng),比如Java、PHP、Python,而有些則已進(jìn)入暮年,不再受到關(guān)注,比如VB、Pascal。優(yōu)秀的程序員能很快掌握一門新的編程語言,但只有了解語言的發(fā)展方向,才能讓你更有信心地去應(yīng)對(duì)未來。
看上去有些“傻”
聽起來或許有些可笑,但那些出色的程序員往往容易給人留下“傻”的印象。他們對(duì)某些事物的看法可能顯得單純而幼稚,他們的待人接物經(jīng)常會(huì)鬧出笑話。但這些并不會(huì)阻礙他們成為一名優(yōu)秀的程序員,因?yàn)?ldquo;傻”——知道自己不夠聰明,反而能使他們變得更加強(qiáng)大。
-
不會(huì)停止學(xué)習(xí)的腳步:認(rèn)為自己不夠聰明才會(huì)通過不斷學(xué)習(xí)去提高自己。而一旦你停止了學(xué)習(xí)的腳步,你將無法得到那些能夠讓你變得更加優(yōu)秀的方法和技能。
-
使得他們?cè)诠ぷ髦凶兊酶訃?yán)謹(jǐn):他們會(huì)花更多時(shí)間review自己的代碼,進(jìn)行測(cè)試以保證交付的質(zhì)量。雖然過程可能并不輕松,但他們卻總是能交出令人滿意的結(jié)果,這也讓大家對(duì)他們充滿信任。
-
幫助他們獲得更好的想法:在軟件開發(fā)領(lǐng)域,那些***的解決方案,往往需要你通過深入思考并探索盡可能多的可行方案后才能獲得。這意味著你必須具有開放的思維,而不是那些聰明人的自以為是。
他們都是現(xiàn)實(shí)主義者
相信每個(gè)人都有一顆追求***的心,程序員也不例外。然而在軟件開發(fā)中***并不存在,所謂的***只是想象中的一個(gè)瞬間狀態(tài),而它是無法達(dá)到或者即使達(dá)到也極易被摧毀的。任何一段新的代碼,一個(gè)新的功能中所存在的缺陷都可能將這種***的狀態(tài)打破,而為了達(dá)到***所付出的代價(jià)更是我們所無法承受的。那些成熟的程序員更加現(xiàn)實(shí),他們關(guān)注于如何高效地解決問題,并在此基礎(chǔ)上給用戶帶來好的感受。
優(yōu)秀的程序員懂得平衡,他們理解時(shí)間、人員等資源都是受限的,因此他們會(huì)選擇最簡(jiǎn)明有效的方法去實(shí)現(xiàn)需求或解決問題。而非為了不必要的完善和未知的將來,把一切想得過于***,反而增加了系統(tǒng)的開發(fā)和維護(hù)成本。他們不會(huì)把代碼寫得過于復(fù)雜,因?yàn)樗麄冎缊F(tuán)隊(duì)中大部分的程序員都處于中等水平,過于復(fù)雜的代碼會(huì)讓他們產(chǎn)生困惑。優(yōu)秀的程序員也深知完成即是價(jià)值的道理,他們知道從來沒有絕對(duì)的對(duì)與錯(cuò),與其長時(shí)間的關(guān)在會(huì)議室里,去討論或設(shè)想產(chǎn)品,倒不如嘗試用較小的代價(jià)去實(shí)現(xiàn)出某一個(gè)功能或產(chǎn)品,然后通過用戶的實(shí)際使用去證明它,然后在反復(fù)的迭代中不斷完善。他們尊重流程,但會(huì)靈活應(yīng)用。每個(gè)公司或團(tuán)隊(duì)都會(huì)有自己定義的開發(fā)、測(cè)試、發(fā)布流程,優(yōu)秀的程序員們尊重這些流程,但在某些時(shí)候他們也會(huì)對(duì)流程中阻礙自己效率的部分作適當(dāng)?shù)牟眉簟?/p>
優(yōu)秀的程序員都很現(xiàn)實(shí),這使得他們?cè)诓煌沫h(huán)境、團(tuán)隊(duì)、項(xiàng)目中都能快速獲得成功。他們所開發(fā)出的系統(tǒng)往往處于“較好”的狀態(tài)之下,它并不***,但卻非常穩(wěn)定。
從自己的失敗中學(xué)習(xí)
作為程序員,你不可能總是對(duì)的,你或許會(huì)錯(cuò)誤地選擇了某個(gè)技術(shù)或框架,你或許錯(cuò)誤理解了用戶提出的需求。但不經(jīng)過這些失敗,你可能永遠(yuǎn)無法得到那些正確的方法。
誠實(shí)地面對(duì)自己的錯(cuò)誤非常重要,這意味著你或者你的同伴能夠及時(shí)地去修復(fù)錯(cuò)誤,而這對(duì)你、對(duì)團(tuán)隊(duì)、對(duì)項(xiàng)目都是最有益的。而每一次的失敗也會(huì)成為一次自我提升的良機(jī),造成失敗的原因是什么?如何有效地避免失???通過及時(shí)反思,并果斷采取措施,那些失敗將成為你獲得進(jìn)步的***途徑。
然而,承認(rèn)失敗往往需要極大的勇氣,特別是在一些軟件公司,他們營造了一些不良的文化,當(dāng)產(chǎn)品出現(xiàn)問題時(shí)總是對(duì)用戶掩蓋搪塞,并想方設(shè)法蒙混過關(guān)。這對(duì)你個(gè)人無益,甚至可能因?yàn)檠诱`了問題的***解決時(shí)機(jī),而導(dǎo)致更慘重的失敗。如果你希望變得更加優(yōu)秀,那你必須具備直面失敗的勇氣,并學(xué)會(huì)從每一次失敗中獲得進(jìn)步。
很懶卻又很高效
那些優(yōu)秀的程序員有時(shí)看上去很懶,他們會(huì)在上班時(shí)間做那些與工作毫無關(guān)系的事情,比如在紙上隨意地亂涂亂畫,長時(shí)間坐在那里發(fā)呆,甚至玩手機(jī)。但一旦他們進(jìn)入編程狀態(tài),你又會(huì)發(fā)現(xiàn)他們變得像打字員般,指尖飛舞,瞬間完成他們的工作。
優(yōu)秀的程序員非常珍視自己的時(shí)間,他們會(huì)利用一切手段提高效率:
-
常年的編程工作使他們都能熟練操作鍵盤,往往從一個(gè)程序員的打字速度上就能判斷他是否優(yōu)秀。
-
他們能夠熟練地使用IDE,他們不依賴菜單,而是使用快捷鍵來操控代碼,從查找文件,文本編輯到格式化代碼,文本替換都盡可能使用快捷鍵,這使得他們的開發(fā)工作更加連貫,也更高效。
-
他們善于使用或發(fā)明工具,他們尋找一切能提高效率的工具,必要時(shí)他們還自己編寫自動(dòng)化腳本、發(fā)明新的工具,從而徹底拋開那些惱人的重復(fù)勞動(dòng)或機(jī)械性工作。
編程的過程是一個(gè)深入思考的過程,而非簡(jiǎn)單的不斷敲出代碼。那些看上去很懶的優(yōu)秀程序員,他們的思維卻可能一刻不停地在運(yùn)轉(zhuǎn)著,這也是他們總是能夠給我們帶來驚喜的原因。
善于發(fā)現(xiàn)并改造輪子
今天幾乎每個(gè)程序員都知道不要重復(fù)發(fā)明輪子的道理,但問題往往是他們無法找到那個(gè)需要的輪子,或者他們無法很好地使用他們。
優(yōu)秀的程序員知道如何找到他們想要的輪子:
-
他們會(huì)用幾個(gè)與待解決問題相關(guān)的關(guān)鍵字在互聯(lián)網(wǎng)上進(jìn)行搜索。他們不僅使用國內(nèi)的搜索引擎還會(huì)想方設(shè)法借助Google、Bing等國外搜索引擎,因?yàn)楹芏嘟鉀Q方法、意見、建議往往會(huì)出現(xiàn)在國外的技術(shù)論壇中。
-
他們會(huì)利用社交網(wǎng)絡(luò)進(jìn)行搜索,因?yàn)槟抢锿?**的信息,相比傳統(tǒng)互聯(lián)網(wǎng)搜索,你往往會(huì)得到那些更具時(shí)效性的解答。
-
他們善于提問,互聯(lián)網(wǎng)上很少有人認(rèn)識(shí)你,所以你完全不必害羞,在Stackoverflow等社群提出你的問題,你很快就會(huì)獲得熱心人的回復(fù)。當(dāng)然對(duì)任何回復(fù)都保持友好和善意也很重要,否則沒人會(huì)愿意幫助你。
優(yōu)秀的程序員善于組合和改造輪子:
雖然我們比以往任何時(shí)候都更容易得到輪子,但如何用好它們卻是另一個(gè)學(xué)問。我們往往需要一些技巧將幾個(gè)輪子組合在一起使用,必要時(shí)還需要對(duì)它們進(jìn)行一些改造。優(yōu)秀的程序員往往能通過閱讀相關(guān)的文檔、API以及代碼,快速地判斷一種技術(shù)、框架、工具是否適合自己的需要。并且憑借扎實(shí)的技術(shù)功力,他們還能基于這些輪子,改造出更強(qiáng)大、更適合自己需要的輪子。
并行工作,有效利用時(shí)間
效率可能是優(yōu)秀程序員與那些普通程序員之間***的區(qū)別,優(yōu)秀的程序員總能更快、更好地完成布置給他們的任務(wù)。這背后當(dāng)然有技術(shù)熟練度方面的原因,但我看到的另一個(gè)重要原因是,他們更善于將工作進(jìn)行切分,并充分利用時(shí)間并行地去完成他們。
程序員每天都會(huì)參與很多活動(dòng),比如參加需求討論會(huì)議,和其他開發(fā)者討論設(shè)計(jì)方案,大量的閱讀學(xué)習(xí),當(dāng)然還有編碼。很多時(shí)候,我們會(huì)按照別人的意愿,去安排自己的工作,但這對(duì)我們來說可能并不是最有效的工作方式。工作中充滿了選擇,你不可能一下子完成所有的事情,在開始之前想一想如何把時(shí)間最有效地利用起來對(duì)你來說非常重要。
優(yōu)秀的程序員非常善于多線程工作,他們能夠如項(xiàng)目經(jīng)理一般,拆分并安排好自己的每一項(xiàng)工作。如果你長時(shí)間做一件事,很容易會(huì)覺得疲勞,但把幾件事切分成更小的任務(wù)后,交錯(cuò)并行地去完成它們,你便能更輕松地完成它們。就像我們?cè)谏钪?,?huì)利用坐地鐵,等公交的時(shí)間,拿出手機(jī)來獲得咨詢一樣。優(yōu)秀的程序員能將所有的可支配的時(shí)間碎片化,利用這些時(shí)間片段,他們閱讀、學(xué)習(xí)、開發(fā)、做個(gè)人項(xiàng)目......他們并不比任何人有更多的時(shí)間,只是他們更會(huì)利用時(shí)間。
具備不錯(cuò)的軟技能
你可能是一個(gè)代碼高手,但這并不足以使你成為一個(gè)優(yōu)秀的程序員,因?yàn)?strong>優(yōu)秀往往是他人對(duì)你的評(píng)價(jià),而你的老板、客戶可能都不擅長或根本不懂編程,他們往往并不會(huì)給一個(gè)只懂得編程的員工以很高的評(píng)價(jià)。當(dāng)然,我們不可能去責(zé)備一個(gè)程序員過于鉆研技術(shù),因?yàn)榧夹g(shù)發(fā)展得太快,他們需要不斷學(xué)習(xí)才能跟上技術(shù)的發(fā)展腳步。但程序員們?nèi)匀徊粦?yīng)忽視那些對(duì)他們的發(fā)展同樣重要的軟技能。優(yōu)秀的程序員往往需要具備:
-
一定的語言表達(dá)能力,這樣才能向他人準(zhǔn)確而清晰地表達(dá)你的設(shè)計(jì)或想法
-
學(xué)會(huì)傾聽,這樣才能獲得他人的優(yōu)秀想法或意見,幫助你取得進(jìn)步
-
有足夠的信心成為一個(gè)***,盡管可能只是一個(gè)2,3人的團(tuán)隊(duì),但那是一個(gè)很好的開始
-
指導(dǎo)他人的能力,教授方法和思想,而不僅僅局限于技術(shù)本身
-
持續(xù)學(xué)習(xí)的能力,你需要不斷進(jìn)步,否則即使你曾經(jīng)優(yōu)秀,也會(huì)很難維持
-
謙遜的態(tài)度會(huì)讓你更像是一個(gè)大師
-
尊重每一個(gè)人的同時(shí),你也將會(huì)迎得他人的尊重
-
敢于承擔(dān)責(zé)任,機(jī)遇往往就會(huì)隨之而來
優(yōu)秀的程序員不僅具備優(yōu)秀的技術(shù)能力,他們也往往擁有這些軟技能。在我所看到的所有項(xiàng)目中,很少會(huì)因?yàn)榧夹g(shù)原因?qū)е马?xiàng)目的失敗,而大部分的失敗往往來自于程序員們軟技能方面缺失所導(dǎo)致的團(tuán)隊(duì)協(xié)作問題。反而是那些被認(rèn)為水平一般的團(tuán)隊(duì),卻經(jīng)常能依靠著團(tuán)隊(duì)成員間的通力協(xié)作創(chuàng)造出讓人驚訝的成果來。
身邊有一些優(yōu)秀的伙伴
我認(rèn)為程序員會(huì)向著個(gè)人化、多樣性的方向發(fā)展。越來越多的個(gè)人程序員和更小的開發(fā)團(tuán)隊(duì)將會(huì)產(chǎn)生,在不同領(lǐng)域內(nèi),他們借助技術(shù)的進(jìn)步與工具的發(fā)展,能做出以前只有較大規(guī)模團(tuán)隊(duì)才能開發(fā)出的優(yōu)秀產(chǎn)品來。盡管如此,我仍然相信那些優(yōu)秀的程序員并不會(huì)成為一匹獨(dú)狼,相反的,他們身邊總是會(huì)伴隨一批同樣優(yōu)秀的伙伴。
回想我們的程序員生涯,當(dāng)我們還是一個(gè)菜鳥時(shí),身邊總會(huì)出現(xiàn)一些導(dǎo)師,他們可能是你的團(tuán)隊(duì)Leader,或負(fù)責(zé)帶你的資深程序員,那時(shí)我們那些編程時(shí)的錯(cuò)誤和缺點(diǎn)總是被無情地暴露在他們面前,經(jīng)過他們的指正或批評(píng),我們從不斷修正自己的錯(cuò)誤中獲得了成長。隨著我們技能的不斷增長,在不同時(shí)期,因?yàn)椴煌呐d趣,我們身邊的伙伴也在不斷變化,他們成了團(tuán)隊(duì)中與你能力相當(dāng)?shù)耐?,或是你所做業(yè)余項(xiàng)目中的志同道合者,又或者是你參與的開源項(xiàng)目中那些不同領(lǐng)域的專家,他們都成為了一名優(yōu)秀程序員身邊不可或缺的優(yōu)秀伙伴。這讓我想到結(jié)對(duì)編程中關(guān)于輪轉(zhuǎn)(Rotate)原則——并非固定兩人一組,而是根據(jù)任務(wù)的不同,不斷輪換搭檔。任何時(shí)候,你都需要那些優(yōu)秀的伙伴不斷帶來啟發(fā),給予指導(dǎo),一起去完成不同目標(biāo),更重要的還有坦誠地指正你的問題。與優(yōu)秀者同行,你也將變得更加優(yōu)秀。
對(duì)生活充滿熱情
有很多因素會(huì)使一名程序員走向平庸,而最最直接的便是失去對(duì)編程熱情和興趣。當(dāng)一名程序員不再能夠感受編程所能帶來的樂趣時(shí),編程對(duì)他來說,只是一項(xiàng)不得不去完成的工作,而他也將失去繼續(xù)學(xué)習(xí)的動(dòng)力,無法再與優(yōu)秀沾邊了。
我看到的那些優(yōu)秀的程序員,總是對(duì)編程充滿著熱情,每次完成一個(gè)新的功能,解決一個(gè)有難度的問題,甚至修復(fù)一個(gè)不易被發(fā)現(xiàn)的缺陷都能讓他們興奮不已,而這些又會(huì)成為他們不斷去提升技能,學(xué)習(xí)新技能的動(dòng)力。他們?cè)诓粩嗤黄谱约旱臉O限中,并從中體會(huì)編程所帶來的樂趣。
同時(shí),優(yōu)秀的程序員們也懂得生活,他們對(duì)那些新鮮事物總是充滿好奇,樂于嘗試,他們也會(huì)有各自不同的興趣愛好,攝影、寫作、旅行,亦或是游戲、追劇,他們總能很好地掌控這些興趣愛好與他們所熱愛的編程之間的關(guān)系。他們會(huì)每天有規(guī)律地完成如閱讀、學(xué)習(xí)、運(yùn)維自己的個(gè)人項(xiàng)目之后,投入到自己的其他興趣愛好之中,他們很少熬夜,這保證了他們每天都能迎來一個(gè)新鮮的開始。他們能夠掌控生活,而不是反過來被生活所控制。
優(yōu)秀程序員們的身上一定還有著更多我們所未見的特質(zhì),但歸根結(jié)底,還是內(nèi)心深處那份對(duì)于編程的熱愛與執(zhí)著,推動(dòng)著他們?nèi)ゲ粩喃@得那些天賦與才能吧......
文/技匠(簡(jiǎn)書簽約作者)
原文鏈接:http://www.jianshu.com/p/7f646acd0c2d