做一個優秀的程序員到底難在哪裡?


初入此門,覺得語法和演算法很難,搞不懂C++的STL,搞不懂Java的Full GC,搞不懂函數式,搞不懂動態規劃和各種樹、圖……

入行二三年,正常情況下,語法和演算法都不再成為門檻,開始感覺最難是架構:RX還是Vue? Weex還是RN?Django還是Flask?

然而入行五六年,我感覺最難的,還是在「人」

對於上級,你要說服他們你在做的東西是有意義的,或者使你做的東西至少「看起來」有意義——因為這關係到你的項目能拿到多少資源。

對於下級,你需要解釋清楚你要做的東西,要達到的目標,要接受他們水平有限做出來的東西不如你,要接受他們加班卻寫更多bug,你的責任是帶團隊一起成長,你不能有抱怨。

然而這都不算最難。

最難的是什麼呢?扁鵲昔日的答魏王的典故,可以很好的描述這一問題

魏文王問扁鵲:「你們家兄弟 3 人,都精於醫術,到底哪一位最好呢 ? 」
扁鵲答:「我的大哥醫術最好,二哥次之,我最差。」
文王再問:「那麼為什麼你最出名呢 ? 」
扁鵲答道:「我大哥治病,是治病於病情發作之前的時候,由於一般人不知道他能事先剷除病因,反而覺得他的治療沒什麼明顯的效果,所以他的名氣無法傳出去,只有我們家的人才知道。我二哥治病,是治病於病情初起的時候,看上去以為他只能治輕微的小病,所以他的名氣只能在我們鄉里流傳。而我扁鵲治病,是治病於病情已經嚴重的時候。一般人看到我在經脈上穿針放血,在皮膚上敷藥,用麻藥讓人昏迷,做的都是些不可思議的大手術,自然以為我的醫術高明,因此名氣響遍全國,遠遠大於我的兩位哥哥。」

曲突徙薪亡恩澤,焦頭爛額為上客。

由於你是一個優秀的(或僅僅是經驗豐富的)程序員,你可以看出項目代碼里存在著的隱患。你選擇防患於未然,修復這些問題,但由於問題並沒有真的發生,你所做的一切,在不那麼優秀的程序員同事的眼中(以及老大眼中),看起來並沒有什麼產出。

你為了不出問題作出的努力,所收到的回報,

往往不如那些在朋友圈裡曬自己通宵加班處理問題的同事。

如果不被認可,你還能堅持自己的初心么?會繼續做那些你認為是正確的事,並企圖說服、證明自己做的有意義?

還是故意放過那些細微的、難以察覺且不屬於自己的漏洞,靜候漏洞爆發時,作出跟旁人一樣打了雞血一樣的奮戰樣子,假裝好不容易才解決,並拍照發朋友圈到「同事」分組?

----------結尾的分割線---------

1. 每個人的答案,只能基於自身的眼界。我沒有看過國外的環境是如何的,我自身也僅僅在向著優秀努力而已。以上不過一家之言。

2. 我說的可能都是錯的


表面看 難在如何定義優秀

這是一個非常複雜但是本質很簡單的問題,就是人們如何看待優秀這個概念本身

優秀的意思可以理解為超越常人的,可以解決常人解決不了的問題,做到常人解決不了的事情

但是常人又是個很喪心病狂的概念,常人可以指代在一定範圍的大多數人,常人的邊界是動態可辨的範圍,在範圍不確定場合,常人變得異常複雜,那麼如何定義超越常人就變的及其困難。

舉個例子,在一家二三線城市的小公司,能夠使用一些框架搭建一個web項目,並且讓業務代碼能夠正常工作,在老闆眼裡就是很優秀了,而能使用一些設計模式,讓問題變得簡單,也會讓人的能力水平在公司里的技術團隊里顯出類拔萃,即使老闆並不關心你不是懂設計模式,但是技術團隊的認可會讓人充滿自信。

在一線城市的大公司,你不了解框架的實現原理,不了解常用的演算法,數據結構,不了解多種語言的特性和優缺點,連生存都很難

而在bat之類需要對整個中國甚至世界範圍的互聯網發展負責的公司里,技術人員已經開始往著傳統概念里的科學家邁進

我們時常看到,流量巨大的互聯網公司,為了面對複雜的數據流和機器環境,所謂的技術人員所面對的壓力遠超常人想像

上百萬在線,上億並發,十幾億的用戶,跨上百個國家和地區,每秒不可預估的數據量,這已經是人類軟體歷史上的邊界了,傳統開源軟體為了簡化業務複雜度所做的工作,在這種量級面前只有參考意義,沒有實用價值,即使一秒服務宕機,一次微小的錯誤導致的無響應,帶來的損失都是個人完全無法承受的,一個月薪50k的普通技術人員,他不得不面對價值上千萬的複雜系統,上萬台機器集群震耳欲聾的轟鳴,和每一次問題發生的時候數以百萬計用戶的質疑和咆哮

為了減少這種可以殺人的壓力,即使是最普通的技術人員,也要學會認識到自己的無知,和全公司的人精誠合作,互相幫助,面對困難,深入學習計算機理論,計算機組成,到演算法,到數據結構,到操作系統/資料庫/虛擬機/文件存儲、網路,到軟體層面,業務層面,然後到人工智慧

因為已有的方案永遠不適用,你總要面對自己造輪子,甚至要造可怕輪子的地步,只要你有一秒的停止,就落後一秒,你要不停的去學習,不停的去結構論文,走在科研的邊界。

然後就是更可怕的,在這種合作+競爭的壓力下,技術人員為了成長,必須要學會另的事情,就是政治

不僅要學會合作,還要學會爭取資源,學會溝通,學會交易來達成目的,分享也是這個目的,交換知識,降低理解成本,進步才更快。

一切都是為了適應環境,這種環境里,沒人覺得自己優秀,只覺得自己要習慣生存。

好了,繞回來,大多數時候,一個技術愛好者有時會出於和機器打交道比和人打交道容易多的目的,走入計算機領域,從程序員做起,然後是技術專家,然後是科學家或者管理層。

這期間進步,是人人共有的,但是進步效率,是人人不同的,天賦,只是進步效率中小小的一部分,一個人的智慧,在千萬人的智慧面前,不值一提。

優秀的程序員難在哪裡?難在學習是永無止境的,當一個程序員有了更大的視野之後

這種狹隘的優秀概念就毫無意義。

因為狹義上,只要一個人能很好的完成手頭的工作,就算優秀的程序員了。

但是在互聯網這個群魔亂舞的平台下面。

我們只能定義,一個優秀的程序員,是不斷的打破自我邊界,不斷學習,不斷和他人共享,不斷幫助他人,不斷著眼更廣闊世界的人。

所以,做優秀的程序員的根源難在哪?

難在不會做人。

一個人連自己基本權益都不敢爭取,不敢面對自己的無知,不敢面對困難問題,不敢面對權利和責任,不敢表達自己的意見,不敢傳遞自己的知識,不敢接受自己的錯誤。

只願意循規蹈矩,按部就按的聽從指示,浪費體力,直到身體被拖垮。

那也就是個機器人。


難就難在,你壓根就不敢、也不想優秀。

我有個同事,堅持每天加班到很晚,周末從不休息,無償到公司加班。

他是這樣解釋的:「寫程序不可能不出bug。萬一闖了禍,至少你可以證明自己態度是好的。如果你不加班,出事就肯定要先問你態度是不是端正了」。

這話是不是聽起來很對?

但還有另一種活法。

你可以把基礎知識徹底吃透,同時把面對的問題徹底搞明白,然後寫下清楚明白、明顯沒有錯誤的代碼。等到下班時,你就可以放心大膽的走人。

——我沒法完全避免錯誤,但我可以錯的心安理得:因為全公司再沒有別的人,能比我在同樣時間內完成的項目更多、寫出的bug更少。

與前一種想法相對的,這種活法的人是這樣解釋的:「不犯錯不可能;但不犯同樣的錯卻完全可以做到。無非是腦子勤快點,挖錯挖到根,然後排錯排到工作流程/思維模式的高度上,最後的修補措施則可以延伸到軟體工具、編程規範等層面上,從而杜絕重複的錯誤(換一種說法,現代的各種編程工具已經基本上可杜絕輸入錯誤了,剩下的可以憑自身主觀能動性徹底挖到根子,自行通過軟體、流程解決掉——不僅自己解決,還可以帶動整個團隊從此再不跳同樣的坑)。這樣每次錯誤都是對知識體系的一次檢驗,很容易就能做到『越干對技術各層面的理解越透徹』,自然做什麼都事半功倍。日積月累下來,工作自然越做越輕鬆。至於那些不願意動腦子、靠『積極上進』的表現在搞出問題後裝可憐的傢伙,他們實在是太懶了,累也是活該」。

PS:推薦一本書《write clean code》,中文翻譯版叫《編寫優質無錯代碼》。英文版本應該是1992年出版的,中文版應該是發行於2006年。作者是微軟的一位專家。


我一直把程序員世界看成武俠江湖,我常常和我家小蘿莉講,程序員世界,可能是現在社會最後一個還能懷有浪漫色彩的地方了,所以我看待IT世界,常常拿武俠世界來類比。

在這樣的世界裡,大部分程序員都只是普通人,是巨鯨幫的一個堂主,是鐵斧門的一個隊長,你的努力還遠遠達不到拼天賦的程度,你可能比種地的百姓活的舒服,然而你還是一個普通的武林人士,即沒有花名,也沒上群俠榜,不會有少女聽到你的名字就濕了褲襠。

這可以是你的優秀,不一定是要做到武當山掌門,你下山回家的時候,帶回去50兩紋銀,已經是能給你家置辦產業,買幾畝薄田了,這在你家鄉,誰種地的誰都達不到的。

如果你追求的是華山論劍,大門派掌門,你的名字能用來止住小二夜啼。 或者你希望你能晚上站在中南海樓頂和人玩桌游,在沙漠里殺駱駝玩,到處吸人血,別人上飯店吃飯都是吃幾錢銀子,你甩出去就是10兩紋銀買一碗黃燜雞米飯還不要小妹找錢,這些別人做不到的事情,那麼你就得是那些和別人不一樣的人。

你要麼得是書香世家,家裡祖上就遺傳給你三把鍵盤,都是二戰時候的古董貨敲一個字屏幕上出來兩行代碼。 要麼得是年少奇遇,人品爆炸,遇到在路邊討飯的Jeff,三個包子換了全套面向對象秘籍,要麼你得是颱風天外出被吹下來的oracle招牌砸了頭,頓悟了JVM原理。除了這些,你見過武俠小說裡面成就最高的人是像大家平時這樣,作業抄抄同學,看代碼2,3個小時就膩了,打game多過打字的嗎?

你看看少林那些次等高手,哪一個不是遺精之前就入了少林,每天練功5,6個時辰,才等到頭髮白了,能當個X院首座,能抗住Jeff三招,默默走回陣營才吐血而死的?練到這個份上已經打敗了全國99%的用戶了。

所以你知道了,做一個優秀的程序員,難在哪裡?

難在要麼人品好,要麼家世好,要麼夠努力。

你缺哪個?


程序員作為一個高薪職業,讓很多年輕人對之趨之若鶩。很多人對這個職業並沒有明確的認知,也沒有具體可行的職業規劃。

那麼如何才能成為一個優秀的程序員,或者說做一個優秀的程序員難在哪裡呢?

1.強大的自學能力
無論你是本科學歷,還是轉行的「插班生」,都要面臨一個嚴峻的挑戰。你的所學和對你的要求是不對等的。你在學校學習的東西是基礎而且廣泛的,在工作中並不能給你太多的幫助,大多數都要自學。比如,在你信心滿滿地完成了一個項目的時候,你的上司告訴你,下個項目我們要用JavaScript做,給你們一個星期熟悉一下。你的腦袋瞬間空白:我只會php啊!php還是學了好幾個月才會的!一個星期熟悉一下是什麼鬼啊!面試的時候沒說需要js啊!
程序世界已經發展地無比廣闊,你隨時都可能被分配到從前只聞其名的任務。你要做的就是快去學習,至少能夠適用。
現實就是這樣,並且將一直追隨你的程序員生涯。

2.英語水平
不得不說,英語水平是程序員們極容易忽略的一項指標。口語或許要求差一點,但是讀寫要求絕對過關。
為什麼是英語?因為美國的IT界整體水平比國內領先幾年。美國不僅僅擁有Google,Facebook,Apple等行業內的領先企業,最重要的是世界上最著名的計算機領域內的專家,權威,實驗室,都在美國扎堆,美國仍然是規則的制定者。
我們要跟上潮流,就要常逛國外論壇,社區或者博客。有時候還要讀一些專業paper,這都要求具有一定的英語水平。

3.語言溝通能力
會打代碼不會說話的是程序猿而不是程序員。優秀的程序員工作中可以嚴肅,可生活中總是幽默的(就像謝耳朵)
語言溝通能力對你的職業有絕大的幫助。學習編程的時候,你需要隊友鼓勵自己;工作中,你需要爭取上級的理解和重視。
諸多程序員認為自己的個人能力才是最重要的,而把溝通能力看成是虛的,沒用的。在基層崗位中,很可能所有人做的都是一樣的工作,說實在的很難分出優劣,但是如果你和上司溝通的最好,最理解他的意圖,升職加薪的不是你還是誰呢?
職場不是一個謙讓的地方,別人共同能力強,你的差,無異於事倍功半。表達自己還是很重要的。

4.苦中作樂
這不是雞湯文字,是你切實需要的能力。
你是否算過你因為灰心喪氣丟掉了多少機會,浪費了多少時間?
程序員是一個高壓職業,面臨領導拍腦袋臨時改方案,年終沖業績半個多月不放假等等情況。這時候人會尤其的脆弱,一個bug改不出來都會讓你特別崩潰。最頂級的科技公司工作環境都尤其舒適,這能夠讓最優秀的程序員在最舒適的條件下發揮出超水平的能力。
作為還在往上爬的程序員,就格外需要苦中作樂的抗壓能力。如果你不是對編程工作太有激情,至少不要讓這份工作成為你的負擔。別讓太消極的情緒侵佔你的大腦,時刻保持清醒能夠提高你的工作效率,充足的睡眠和適量運動都會給你幫助

5.清晰的規劃(目標)
優秀的程序員沒有一個是混出來的。阿甘隨遇而安的精神在這裡也沒有用武之地。在這個金字塔型的領域內,你要對自己有清醒的認識和清晰的規劃。而不是篤信什麼付出就會有回報。

首先認清自己,自己的能力哪方面強,哪方面不行,自己想往哪方面發展。尤其是現在自己作價幾何,公司為什麼要應聘自己要清醒的認識到。學會從領導和公司的角度看自己,這樣才是清醒的認知。
要做一個長期的規劃,貫穿整個職業生涯的那種。自己要在未來的2年,5年,10年擁有什麼技能,可以有多少身價,在公司中什麼崗位。又或者在什麼時機轉行,進入管理層還是產品等等。我們需要這樣的一份計劃讓自己充滿動力,讓一時的迷茫不至於蒙蔽雙眼。

歡迎關注我的微信公眾號:九章演算法(ninechapter),幫助你了解IT技術前沿,通過面試、拿到offer、找到好工作!


難在先要做一個合格的程序員。

成為合格程序員之後,想要優秀只要沿著軌道努力就好了,可是很多程序員都沒法讓自己合格,所以優秀就不要談了。

舉個例子:軟體開發過程都需要用Bug來跟蹤問題,當遇到一個問題的時候,是否能用純文字描述這個bug,讓其他人不用再問你,只要看bug中的描述就知道這個bug是怎麼回事,這是程序員的基本功。

很多程序員這樣的表達能力都沒有。


優秀會隨著程序員群體的變化而不斷的變化。在開天闢地的時候,基本只有寫論文的幾個人可以認為是優秀的程序員。後來隨著計算機技術的發展,能夠寫出一個具有合理的組織的程序的人,就是優秀的程序員。到了互聯網時代,幹什麼事情都需要程序員來幹了,那麼只要你的程序能work,你就是個優秀的程序員了,因為最近十年大家產出了大量的無論在邏輯上還是現實上都不work的程序。

所以成為一個優秀的程序員到底難在哪裡也就呼之欲出了,因為優秀是個百分比,這個百分比很小,所以難。

當然了,知乎級別的優秀程序員的標準一直都沒有變,仍然是論文寫的好的幾個人,才能算優秀的程序員。知乎怎麼能在乎勞苦大眾的需求呢?不能用來發文章的程序就不是程序。


優秀有兩種含義,一種是你事實上很優秀,一種是別人認為你很優秀。
第一種靠個人奮鬥,第二種就要靠歷史進程了。
事實優秀的程序猿要遠遠多於被認為優秀的,因為向別人證明自己優秀是難點。


想起來木心的一句話——

「所謂無底深淵,下去,也是前程萬里。」


說說非常個人的想法。難度在於全身心的投入,一時間得到不對等的回報,全力的思考,得不到想法的輸出,耐心的等待這個階段過去。

成為優秀的程序員,首先需要喜歡有興趣,然後才能有耐心花時間進行積累訓練,接著喜歡變成熱愛,興趣變成激情,就可以付出更多的時間,循環這個過程。這個沒什麼特別的,很多行業都是一樣的。

不同的是寫代碼需要極度的專註,認真,用心,耗費心智。

第一,這個需要的程度高,時間長,沒有盡頭。每個任務目標都這樣,都有難度,都不輕鬆,永遠在解決問題,尋找問題,發現新問題。沒有休息緩衝,更多的積累只會讓你接觸更難的挑戰。在做不完的新挑戰之間,年齡增長,體能下降,思維老化,是不可阻擋的障礙。所以,在這個障礙來臨並慢慢擴大影響之前,不能成為優秀的程序員,就只會越來越不可能了。時間緊迫,時間變成了優秀程序員的敵人,也是成為的必要。

第二,這個需要這麼耗費心智,常常就是要麼非常喜歡,要麼非常受不了。沒有說那種,感覺一般可以將就著做做,關鍵是將就著做做也做不好。所以,要麼全身心投入,要麼放棄。因為投入,所以就會產生很多的個人喜好和自我肯定,這些短時間內都得不到認可和表達。

第三,有了前面兩點,就會遇到一些心理問題。花費那麼時間和心智又那麼喜歡,可是程序員大部分時候不是在寫自己想寫的,或是激動不已有興趣的。很多時候需要妥協,聽別人的,聽不懂的人的,修改別人遺留的東西,不給你時間讓你把心愛的東西寫爛,讓你寫不感興趣的感興趣的覺的你做不好,維護老套陳舊的東西,賺錢高於代碼的藝術。當自己覺得自己厲害的時候,其實在策劃產品經理眼裡只是一個工具而已。別人在動嘴,你在動手動腦,別人開會聊個天,需求變了,你的思考努力就作廢了,然後會有人安撫你拿錢做事,工資又不會少你的。

或許錢給的到位了,可以稍稍緩解一下身心的疲憊,和身不由己的無奈。但只有經受住了時間和運氣的考驗,成為優秀的程序員,寫出了廣為人知的代碼,參與了影響百萬人群的產品開發,才有可能對自己的時間,精力,心智有那麼一點點稍微的控制權。不然永遠只是一個把咖啡轉換成代碼的機器,隨時可以被別的機器替代,不需要你的想法,做好你的機器,貢獻你的時間和青春就行了。

想成為優秀的程序員,必然是熱愛寫代碼,喜歡思考的,想寫出自己獨特想法理解的產品的。但作為一個打工者會有很多的無奈與矛盾,你越是努力思考,越是厲害,越是自我肯定,這個矛盾越深刻。公司希望用完程序員所有的精力,但是優秀的程序員在公司無法實現的個人想法,必定想通過業餘時間去實現,這也是一種矛盾。越來越優秀的同時,公司也會希望你脫離代碼實現,而是做思想輸出,這也和寫代碼的樂趣漸行漸遠,代碼實現被看成一種機器行為,但卻是優秀程序員的樂趣所在。

優秀程序員難在哪裡,怎麼才能寫自己想寫的,然後順便改變一下世界。


難在大多數程序員並沒有意識到,自己與所謂「優秀的程序員」的差距:

不是生手與熟手的差距;

而是車間技工與機械設計師的差距,
是搬磚工與土木工程師的差距,
是洗頭小妹和髮型設計師的差距。

什麼時候他們能意識到,
自己目前只是搬磚工,
想成為機械設計師,學會操作所有品種的機床並沒有太大幫助,
洗頭小妹並沒有資格嘲笑髮型師洗頭沒有她們洗得快洗得好,

那個時刻,才是進階的開始。


我覺得優秀的程序員主要難在領導力和對自己領域的深入理解。

1. 領導力。領導力。領導力。重要的話說三遍。程序員初級階段或許可以單打獨鬥,但是進階到高階,要想完成一個大系統,不合作是不可能的。領導力對有的人可能很容易,對我這種一路solo爬上來的還有很多功課要學。

第一個方面,我屬於「自視蠻高」的程序員,所以難免有時候覺得手下有些小朋友不給力啊。但是不給力也沒辦法啊,難道我還能把他們全部開除不成?雖然我可以幫助他們進步,但是我不可能在有限的時間裡面讓他們達到我期望的高度,所以必須要照著項目進度根據小朋友們水平合理分配任務同時也得長遠給他們制定提高計劃。說起來容易,每個小朋友是不一樣的,照顧每個人的需求和項目的進展,滿難的。甚至還有「奇葩」的小朋友得一起工作。如何團結所有人,尤其是和自己很不一樣的人一起完成項目,滿難的。

領導力第二個方面,叫influence without authority. 就是,如何去影響那些我「管不著」的人。比如其他組的人,比如我老闆,比如客戶,比如在我手下做項目但是我不是他直屬老闆的人。如何找老闆要資源?如何讓其他人同意合作我的項目,願意花時間?最近一直在看這方面的書和資料,但是感覺實踐起來還是蠻難。

2. 對領域的深入理解。以前讀書的時候,有時間跟進我領域所有最新進展。工作頭兩年,當年的積累絕對是我快速晉陞的殺手鐧。然而工作了,成家了,這方面有點鬆懈了,沒花時間。上班時很多時候更關注於自己代碼怎麼樣自己項目怎麼樣而忽略了業界和學術界的進展,下班時全時間家庭生活不搞程序。我覺得現在我知識儲備的優勢幾乎已經沒有了。

感覺初級的程序員,能完成上司布置的任務。中級的程序員,能理解上司布置的任務,尋找解決方案。再高級點的程序員,能夠發現哪裡有有不足,去改善,能自發進行incremental的工作。更高級的,能夠掌握整個系統帶領一個團隊一起幹活。優秀的程序員,開闢一個新的有影響力的領域,作創新的革命性的工作。

初級的,會寫代碼就OK。中級的,會寫代碼還要會思考。高級點的,對整個系統很熟悉。優秀的,對整個領域甚至交叉領域都很熟悉。

-----------分割一下----------

寫代碼本身,我到覺得沒有什麼的特別難點。多做點項目,多練練,至少能成為熟練工吧。


完全同意 @Van Bruce 的看法。

一開始學習的時候,會覺得各種技術是最難的,隨著不斷學習和工作經驗的增加,技術難點總會有攻克的一天,所以技術難點並不是最難的。

其實工作後發現,工作中大部分的代碼都很簡單,簡單到你懷疑程序員的技術含量。但同時問題也正在於此,很多程序員因為簡單就不以為然,寫代碼只要求功能實現,代碼copy過來一改,測試通過就算完成,導致代碼量快速增長,bug數居高不下。如我們有些產品每年能增加十幾萬行代碼。。。

我個人覺得工作中最難的是寫簡單的代碼,把簡單的業務代碼寫得精緻,寫到每一個人都能看懂。寫簡單的代碼,你需要不斷的提高對自己的要求,不允許自己出現重複代碼,不斷重構,對每一個函數、變數的名字、類型、順序都會經過自己的思考,對每一個代碼每一個日誌都要思考是否必要是否有更加好的方式。考慮這些代碼是應該放Controll還是services,是否應該放aop實現。。。

經過你的不斷修鍊,等你能寫出簡單的代碼之後,你會發現發現更加難的難題在後面,如果讓領導知道你寫的簡單代碼比別人寫的複雜代碼更加有價值?

大部分時候,你很難讓別人認同你寫的簡單代碼比之前的方式更加有價值。非但如此,最後帶來的結果是相反的!差不多功能差不多工作量的情況下下,編碼質量差的人一堆一堆的重複代碼,也沒有日誌啥的,出了問題定位半天,由於重複代碼導致bug如打地鼠一樣此消彼長,天天寫bug改bug,加班改bug,忙的不亦樂乎; 而你呢?由於沒有重複代碼,完整的日誌等問題一出現馬上就能定位解決,也不會出現重複問題,導致天天下了班就走,自己做的功能也沒有什麼大問題引不起領導關注;你沾沾自喜覺得自己是高級碼農;而實際上,在領導眼中看來你工作態度不如別人積極,做的功能也比別人簡單,產出比別人低。別人天天在產生問題和解決問題之間循環,天天在領導裡面露臉,領導眼中別人解決了多少個問題,你好像沒有解決什麼問題,你都找不到存在感了。結果別人成了標兵,你卻漸行漸遠。。。

大家可以看我這邊文章程序員你為什麼這麼累?,非常簡單但是典型的功能,第一段原始代碼 和 第2段使用了AOP框架之後的代碼實現的功能是一樣的;但第一種方式有16行代碼,第二種方式只有2行代碼。如果有10個類似的功能,單單Controll來說,第一種方式開發是160行左右,第二種方法開發是40行左右(包括AOP代碼)!你說,這種場景,領導會怎麼樣看,同行會怎麼看?會覺得你寫的東西太簡單了,一點技術含量都沒有,而後覺得第一種方式寫了好多代碼,實現了好多功能,看都看不懂,好有技術含量的樣子!

兩個程序員,一個技術精湛,思維嚴謹,認真負責,Bug極少,至今單身;一個技術一般,弔兒郎當,Bug一堆,經常被測試MM叫到她旁邊,接受批評,後來成了她男朋友。。。。。

項目結束之後,進行bug數統計,bug數比我們多的說比我們測算更充分,bug數比我們少的說比我們質量更好。

所以,寫好代碼也是有風險的。還是多追求技術點的靠譜,代碼不用寫這麼精緻,出點問題不是什麼壞事。

傻瓜都能寫出計算機可以讀懂的代碼,只有優秀的程序員才能寫出人能讀懂的代碼!深以為然。


我還不能說我是個優秀的程序員,但我和不少世界上可以說頂級的後端程序員合作過。

那我就是最難的事吧,什麼堅持啊,什麼持久啊,其實都不難,特別像我這種十幾年的程序員,不寫代碼我吃啥喝啥啊。而且如果你真在一線干十幾年,就算你再笨,也都能學會了吧。。。。

所以我覺得最難的是如何讓人覺得你很優秀!這包括但不限於以下幾點,

1,在一個頂級的平台,如果是後端,你產品的訪問量要大,比如說國內的阿里巴巴就是好地方,但你要在很核心的組。如果是產品設計或者前端,那你的產品要好,比如說微信。再不濟,你就參加幾個牛的開源項目,如果人家不帶你,你就先fork著,這沒人攔你吧。

2,你得要大家能聽到你的聲音,比如說你寫本書,上個電視,常去參加各種峰會。光在論壇吵php是不是最好的語言是不夠的,曝光率太低。

3,活兒要好,其實主要是代碼風格,幾行代碼拿出來,如果下面噓聲一片,你還說啥?給人演示的時候用新語言,至少是go, kotlin也行,就是有點簡單。我現在都不和別人說我會java,都20年前的東西了,說著不丟人啊?

4,你得長的像個geek, 如果實在太帥,那就頭髮鬍子啥的型都得對,味道也要對,要那種山羊的味道,天天洗澡肯定不行。

5,最好是單身,不單身就當gay, 如果實在不行那就一定得找個漂亮的,讓人覺得她因為你編程實力才跟你。如果找不到漂亮的怎麼辦,那就還是單身,逢人就說你媳婦是scala.

剩下的等我想到再補充。。。。。


我覺得對於絕大部分程序員首先要做到合格,再談優秀吧(我的意思是市面上絕大多數程序員,也包括知乎上在做的各位其實你們想想自己的代碼能看嗎?).

知乎大神們動不動架構、辦公室政治這些東西談得天花亂墜,不如回想一下自己的代碼能不能看?

你的代碼寫完後這幾件事做了沒有:

是否測試過?將bug殺死在開發階段,不要因為你讓公司不得不在招一個測試。

是否可以再進行抽象?我相信每個人的代碼都能再進一步抽象,別讓自己的代碼臃腫不堪。

是否考慮過代碼性能?你的代碼一天要走多少流量,一點性能差距也會被放大。

是否考慮過可讀性?你覺得三個月後你的代碼自己能看懂嗎?

恕我直言,能做到上面的程序員可能20%都不到。

然後你再考慮架構、提高自己的技術前瞻性、考慮如何營銷自己、如何玩轉辦公室政治。

我覺得很多人太浮躁了,這些人並不是想當一個優秀的程序員,而是想成為公司技術部門甚至技術圈的名利收割者而已。


請問背後什麼心酸?一個大男人說話這麼陰陽怪氣。

心個鳥的酸。

這是一份職業,和其他職業一樣,有挑戰,有瓶頸,你就是今天去當總統,也一樣,有挑戰,有瓶頸。無奈很多,未必公平,錯誤失敗是常態。

讓哥告訴你為什麼「你」永遠成不了「優秀」的程序員:

你缺乏迎接挑戰的習慣,碰到問題你想躲,想找安慰,想像個女人似的,把自己的「難過」當成問題,「難過」只是情緒反應,真正的問題是你」沒有成功「,該掙的錢沒掙到,該掌握的東西沒掌握。你本來就對職業本身缺乏興趣,寧可把時間去網上看段子尋求安慰,把段子當實際,你女朋友怎麼選了你這麼沒用的人?想想怎麼擺脫狹窄的出租屋(如果是),想想怎麼創造更好的生活,TM這心酸那苦悶,你這種人根本不配成功。

一個人再四肢健全,這種精神狀態一入腦,就不配成功。因為Mindset壞了。

什麼」X行業是苦逼行業,什麼賺得多死的早「,愚蠢軟弱的東西,任何一個行業多你一個不多,少你一個不少。你就應該被淘汰。

才TM開始實習,你就以為自己理解世界了?能不能少點判斷多點實幹?干好了你的,干壞了你的。正正經經投入,為身邊的人創造點東西,給自己幾個milestone。誰告訴你剛畢業就該衣食無憂,受人尊敬的?!

好的榜樣TM不去找,光找最無能的,最軟弱的,最沒脾氣,最會來段子的。

說白了你就是性格軟弱。

是不是現在國內的男青年,只有屌和女人睡,但忘了怎麼做男人了!?

心個鳥的酸。

隨你舉報!


他把他的刀劍當作他的上帝。
當他的刀劍勝利的時候他自己卻失敗了。
He has made his weapons his gods.
When his weapons win he is defeated himself. ——泰戈爾《飛鳥集》

我們生活在一個由程序統治的世界,

微信、淘寶、百度、餓了么、滴滴打車、摩拜單車、OFO,

沒有一個互聯網公司不依賴於程序,

但是控制這些公司的人並不是編寫這些程序的程序員。

程序可能是人類發明的複雜度最高的工具了。

初入編程領域可能覺得語法和演算法很難懂,

在之後可能會糾結於如何選擇軟體的架構,

但終究所有的這些努力,都是為了讓用戶獲得更好的用戶體驗。

Bug (程序漏洞)是所有的軟體都繞不開的問題,

事實上絕大多數的Bug產生的原因並不是因為程序員的編程水平不足,

多數Bug的產出原因是對於用戶使用方式的了解不足。

無論哪個行業優秀的人總是少數,

一個優秀的程序員不僅要完成軟體所需要的功能,

還要避免這些新加的功能對原有功能產生影響。

同時開發過程中要編寫大量的防禦性代碼,

防止用戶不按流程操作,產生意外的結果。

一個程序員能否完成軟體特定的功能決定了他是否合格。

一個程序員編寫防禦性代碼的完善程度決定了他是否優秀。

所以一個優秀的程序員不僅要有好的編程水平,

還要有對於用戶使用習慣的洞察。

人是這個社會上一切不穩定因素的根源,

洞察人心的人在哪個領域都可以變的很優秀,

編程領域也不例外。

我認為一個程序員能否成為優秀的程序員的最大門檻是洞察力與好奇心。

好奇心是智慧富有活力的最持久最可靠的特徵之一。
——塞繆爾·約翰遜

與好奇心有關的例子,我這裡還有一個 程序猿旺旺:24-26歲你在怎樣的狀態?


持續的學習:在深度和廣度上拓展眼界,與某領域的領導性力量交流;
開放的胸懷:儘可能客觀的思考、討論問題;


準時下班。

大多數程序員蠢到想不明白用時間換人民幣是這世界上最愚蠢的投資之一。

----------

其實這個問題大部分的回答都在回答:怎麼擁有優秀的代碼技能。

但實際上,作為一個程序員,

如果你的眼裡只有程序,

如果「如何成為一個優秀的程序員」和「怎麼擁有優秀的代碼技能」是等價的,

那你肯定不會是一個優秀的程序員。

因為一個程序員,

不光光只有代碼技能,

對於社會來說,

首先他得是一個人,一個兒子,一個丈夫,一個妻子,一個父母。

你在你自己身上投入了多少時間?在你家人身上投入了多少時間?

在你自身時間性價比上,又投入了多少時間?

這才是難的地方。


先奉上一盅雞湯開開胃:

在科學、技術領域,絕大多數優秀人的成就,都不是通過『艱苦奮鬥』達到的。外人認為的苦逼,在其看來甘之若飴。
-- Bjarne Eckel

對於很多優秀程序員來說,編程這種極度講究思維邏輯性,不存在套路的單純工作,比那些人情世故、辦公室政治不知道輕鬆到哪裡去了。(要是讓我每天貼發票報銷,估計死得更早。)

計算機對他們來說,簡直就是理想中的最佳伴侶。至於高收入,只不過是這份好工作的副產品罷了。而單純為了錢多才入這行,自己又不是那麼喜歡,那建議還是趁早轉行做產品經理吧。

所以難不難,這是個相對的問題。

===

要拋開職業特性和個體差異,僅從客觀來說的話,做一個優秀程序員的難點和其他種種具有成長價值的職業本質上是一樣的:

你必須不斷去提升自己,面對更大的挑戰。

網上有一個系列老圖,說的是一樣的道理:

下面這個圓代表了人類知識的範疇:

當你結束了小學的學習,你會明白這個圓中最基本的一部分:

當你上完了高中,那麼你會懂得比以前多一些:

當你讀本科時,你會專修一個專業,那麼你的圓會變成這樣:

你的碩士階段學習會讓你掌握的專業知識更進一步:

進入博士階段的學習,通過閱讀大量研究論文,你會逐漸接觸到這個圓的邊緣

當你站在這個圓的邊緣,你將會專註於圓上的一小部分:

你將會通過幾年不懈的努力,來嘗試推動這塊邊緣:

直到有一天,你終於成功了!

於是,這塊小凸起就是你已經成為一個合格Ph.D的最好證明:

當然,到了那時,這個圓對你來說也許看起來不大一樣了:

但是,請不要忘記這個大圓的原貌:

原出處:The illustrated guide to a Ph.D.

這個圖解釋的是『什麼是 Ph.D?』。但我覺得對於任何一個領域來說,前大半部分都是相通的:你每進一步,就會發現自己的無知又擴大了更大的範圍。

你做一個程序員越久,就需要了解越多的技術。一開始你覺得套個框架就能開發出一個網站,之後你發現其中任何一個點的優化就夠你研究上很久了。

如果說編程確實有什麼比其他行業更難的地方,那可能在於如今的計算機科技比其他行業有更快的發展速度,所以一個優秀的程序員既要不停去學習新的技術,又需要豐富的經驗積累。所謂『青春飯』或者一招鮮吃遍天的『老師傅』,在這個行業都不存在,你得努力做個『永葆青春的老師傅』。

類似的問題,其實不少新人/准程序員/圈外人都會有吧。

所以你說,程序員苦不苦,累不累?反正不是工地搬磚那種苦和累,但是不是每個人都能接受,就不好說了。想干這行,的確要 follow your heart,想想你是不是真的喜歡這個職業。

對了,開頭那段話是我瞎編的。

update:最後補一句,題主問的是『優秀』程序員,我談論的也是『優秀』程序員,那麼XX程序員就不要在評論里酸了。不認同可以自己寫個答案去訴苦。幹得不爽請趁早轉行,還能抬高程序員的平均水平。


推薦閱讀:

怎麼寫出一本程序員風格的修真小說?
15 歲學編程晚嗎?
如何反駁「程序員離開電腦就是廢物」這個觀點?
為什麼會有碼農控?
顯著提升程序員身心健康和工作效率的裝備有哪些?

TAG:互聯網 | 學習 | 程序員 | 編程 | IT 行業 |