我算是靠坑蒙拐騙進了程序員的門,而後一路狂奔。26歲以前幾乎沒有任何寫代碼的經驗,研究生畢業卻意外選擇了一家不可能提供培訓的初創公司,在每日擔心公司倒閉、懼怕被炒魷魚以及同事冷落白眼的三重壓力下逆流而上,一年半後離職,已經是擁有500萬用戶產品的後臺主程。從前我對計算機技術心懷畏懼,認定技術高人必定有佛光籠罩,晝夜不息運鍵如飛日吐代碼上萬行。如今也算見過一些世面了,回首那段忐忑不安宛如初夜的過程,我卻不發覺有任何的勵志意味,而是視爲一種理所固然。理想的程序員,和理想的建築師、理想的財務師、理想的按摩師沒有任何的差異,他們本質上都是一羣手藝人。我相信理想的程序員人人皆可成爲。程序員
近三年總在互聯網圈廝混,我認識過一些程序員,共事過一些程序員,領導過一些程序員,又面試過一些程序員。他們學歷不一樣,有的來自北大,有的來自北大青鳥,有的是博士,有的是高中肄業;資歷也不一樣,有的來自BAT,有的來自某破產基金公司(仍是一個銷售);年限也從0到15年不等。但我認爲程序員只需分三類:天才的程序員、理想的程序員、平庸的程序員。天才的程序員我只敢說接觸過3個,這是天命。7分由你是顆精子的時候就已決定,擁有絕佳的數學天賦、冷靜緻密的邏輯、爲解決難題寧願不眠不休而深覺得樂的技術熱情;3分來自起步要早早早,巴不得同齡人玩泥巴的時候就得開始玩電腦,大學畢業前就突破一萬小時法則,後面的已經是遊戲人生。面試
天才的程序員可遇不可求,更不能長有,我看到的90%還是平庸的程序員。IT時代的膨脹,已讓程序員如同文藝復興時的印刷匠同樣的普通,多數投入祖師爺門下的人,僅是爲了更大的飯碗,更高的待遇,更好的生計。平庸的程序員編寫腐爛的代碼,沒有規範和一致性,固守舊世界的語言,還好談論大的架構和性能,說的比作的漂亮。而毫無例外的,他們認定技術沒有出路,作產品、營銷和管理的是更高大上的手藝,而他們當中的99%,又會天然的流露出本身恰巧具有了那方面的天賦,至於進程爲何會崩潰這樣的小問題是不屑於去了解的。編程
而我最喜歡和理想的程序員相處,巴不得與他們同吃同住,若是容許,我但願個人隊伍能插滿他們的旗幟。理想的程序員心眼兒不壞(他們歷來都不是辦公室政治的寵兒,是一羣單純明亮快樂的手藝人),有天真爛漫的好奇心(他們的眼睛裏常常閃着「哇,這個是怎麼作到的!」),永遠精益求精(他們的口頭禪是「我再研究一下」),還樂於分享(他們活躍於GitHub、各大問答社區和你的身邊,捨得將寶貴時間用於幫助新手)。是的,他們不須要被管理,只須要給一個大的方向,總能回報以意想不到的結果。緩存
理想的程序員與平庸的程序員只有一牆之隔。二者的差距只有6個一點點,而人與人的差距,正是在這日積月累的一點點中,被永遠拉開了。有意思的是,我發現這6個一點點都和意識有關,也就是程序員和其餘一切新興產業的工種同樣,只須要意識加上時間的錘鍊,人人皆可達到理想的階段。理想的程序員必然也是一個優秀的problem-solver。微信
見過太多心神不定的程序員,我不得不把「專一眼下」做爲天字第一條。他們每每有各式各樣的小夢想,好比作個小茶農、作個小鵝販、作產品、作銷售、作投資,卻被程序員的高薪或是沒有轉行的魄力「耽誤」了,而由於不專一,他們不在乎作好本身的本分,不在乎錘鍊本身的技能,不在乎學習新興的技術。不能否認,這世界上存在着偉大的產品(像喬老爺)、偉大的銷售(像埃裏森)、偉大的投資客(像彼得菲),而他們毫無例外都是程序員出身。可你據說過巴菲特評價蓋茨的話麼,比爾蓋茨若是轉行去賣狗,那他必定是全世界最大的狗販。我堅信除了少數的天才外,冥冥衆生都可以在多個領域取得成功,只要保持足夠的專一。而哪怕你下一年就想賣狗去,程序員的經驗仍然能訓練你強大的邏輯、謹慎和耐心,放在哪一個行業都是至關可觀的競爭力。數據結構
我認爲處理bug、崩潰、調優、入侵等突發事件比編程自己更能體現平庸程序員與理想程序員的差距。當面對一個未知的問題時,如何定位複雜條件下的核心問題、如何抽絲剝繭地分析問題的潛在緣由、如何排除干擾還原一個最小的可驗證場景、如何抓住關鍵數據驗證本身的猜想與實驗,都是體現程序員思考力的最好場景。是的,在衡量理想程序員的標準上,思考力比經驗更加劇要。架構
有時候小夥伴跑過來,問我「提交了一個任務被卡住了,怎麼辦」的時候,我總以爲他能夠作得更好。好比,能夠檢查試驗別的任務,以排除代碼自身的緣由;能夠經過Web UI檢查異常(若是沒有帳號,可讓我提供);能夠排查主機日誌或刪除緩存,再不濟,總應該提供任務ID和控制檯日誌給我。理想的程序員永遠不會等事情前進,他們會用盡一切方法讓事情前進。框架
記得從前廠離職以前,找老闆談話,他說我最大的優勢就是歷來不和他說這個作不到。後來我發如今不少團隊裏,都存在一種技術和產品的對立,程序員每每以「技術上沒法實現」來擋產品的需求,而產品也每每以「Facebook能夠爲何咱們作不到」來奚落程序員。這兩句話應該屬於禁語,從根本上都不利於程序猿和產品狗的相親相愛。分佈式
一句「技術上沒法實現」是容易出口,可有多少人在說出這句話的時候,內心是100%確定的?若是不願定,爲何不能回去谷歌一下再回答?本來我覺得程序員是充滿想象力,在由於有想象力,才能誕生那麼多改變咱們生活的軟件和互聯網產品。見識多了,才瞭解大部分程序員已經在與bug的對抗中變得保守而不肯擔當風險,與此同時許多團隊也不肯意寬容失敗。因而「Say No」變成一種習慣性的抵觸,還記得曾國藩爲何解散湘軍麼?他說那支軍隊已「暮氣漸深」,不能打仗了。要作理想的程序員,就不能給本身滋生暮氣的機會,若是面對不合理的需求,能夠把時間成本擺出來,把曲線救國方案亮出來,簡單粗暴「Say No」是不可取的。工具
程序員是一個很是殘忍的職業。你所學所用的語言、框架、模式,極可能在數年內就成昨日黃花了;你如今嘲笑的另外一羣程序員,可能立刻就能轉身來嘲笑你了。因此理想的程序員除了作好本身的本分,還要花費時間來投資將來。什麼是「投資」?投資就是你如今投入的時間,在將來會以更多的時間或者金錢(看看早幾年學習iOS的程序員如今的薪酬!)回報你。舉我本身的領域 -- 數據挖掘爲例,08年左右Hadoop開始興起,一時「大數據」概念火熱,Hadoop工程師萬金難求,各互聯網公司紛紛把數據統計、數據分析和數據挖掘的業務切換到分佈式平臺上。這幾年眼看Hadoop還在不斷迭代,Spark又異軍突起,一舉刷新了Hadoop保持的排序記錄,之內存存儲中間數據帶來的性能優點和豐富的數據結構讓人愛個不停,各類奇異的小bug和陡峭的學習曲線又讓人打退堂鼓。那麼,明眼人都知道Spark是將來的趨勢(內存會愈來愈便宜),在主業務放在Hadoop的條件下,就能夠適當把一些小模塊切換到Spark上,同時留意Spark社區的發展。很快從Spark得到的性能收益就能把以前投入的學習時間掙回來。
善用工具能夠分爲4個層面:
我剛入行那會,一個計算機專業卻當了公務員的朋友問我,你一點都沒學過編程,平時怎麼寫代碼?我說,谷歌,因而遭到無情的恥笑,以致於我在哪裏的帳號都叫2shou,告誡本身是一個無恥的二手程序員。這是一個笑話,但若是如今問我,我仍是要回答谷歌。程序員的成長就像膨脹的圓餅,外面是一望無際的大海,圓餅越大,與大海接觸的面也越大,懂的越多,不懂的越多,而計算機科學又是一門更新換代異常迅速的學科,同時也是知識互聯網化最好的學科,很難利用傳統的科班式有教有學的方法,相反經過搜索引擎則很容易獲取到最新的知識。
不相信重複,大師的話叫DRY原則(Dont repeat yourself),代碼寫多了,會有人爲的直覺判斷好的和爛的代碼,個人標準是簡潔和規範,簡潔並非美感上的標準,重複越少,給本身出錯的機會也越少,後期維護的成本也越少。
若是你不幸丟了三週前的代碼,也許你能憑着過人的記憶力把腦子裏殘餘的片斷複寫出來,但若是丟的是三個月前的代碼,恐怕就沒有那麼好的運氣了。理想的程序員會着力找尋有效的資料保存方式,把工做裏靈光閃現寫下的代碼、腳本、配置、經驗等短的片斷保存起來,以便任什麼時候候都能複查。
理想的程序員必須懶惰。對他們來講,重複的步驟和重複的代碼同樣醜陋,若是意識到一項工做有可能長期要重複,那麼自動化的時間老是越早越好。
之因此管理時間會對程序員這個行當特別重要,是由於在完成任務時你必須像荒野裏的狼同樣,「獨行」。沒有外界約束的狀況下還能穩定控制本身,保證能高效率地工做和學習,那麼日積月累你確定會變得比通常人厲害。
程序員乾的是高強度的腦力活,通常天天集中4-5個小時應對本職工做就足夠了,但工做以外,必定要安排時間用於學習。除了學習,留點時間放空本身也是必要的,利用泡茶或者喝咖啡的間隙,把彌足珍貴的時間留給本身,往前想日後想,事半功倍。
說了這麼多,想必有人會問,費勁心思成爲一個理想的程序員,又有什麼用處?會有高薪嗎?不。能升職嗎?也不見得。迎娶白富美呢?不如去賣狗。 稻盛和夫曾經說過一個故事,明治時期的手藝人被天皇召見,雖然都是不讀書的鄉下人,但一生兢兢業業地作一件事情,天然有一股高貴的氣質。理想的程序員,應該就是循着這種高貴的氣質而去的吧。
更多精彩內容,敬請關注微信公衆號「碼農咖啡館」