怎麼成為一個優秀的軟體工程師,而不是一個優秀的碼農?


優秀的程序員會告訴你打根基的重要性,會勸你在厚積薄發前要隱忍。

優秀的碼農會告訴你學啥底層、啥啥啥一拖就好了,學了python還要啥自行車啊,數據結構排序函數二分搜索這不都內置了嗎?工作中永遠用不到,學演算法有啥用啊?成為高手有很多種方法彙編是個屁啊?

+++基礎的分割線+++


列舉幾個我認為比較重要的根基並附入門書

編程語言,《程序設計語言-實踐之路》《concepts of programming languages》

計算機通用知識,《csapp》

演算法、數據結構,《演算法導論》

程序設計、結構,沒有書推薦

軟體工程,這個詞大家理解不同,我以為,《人月》《代碼大全》《the pragmatic programmer》《sicp》、講測試講重構的都是軟體工程,其實上面設計模式也是軟體工程,哈哈


這些書,初時讀來感覺全無作用,而且要讀多次才能體會其中意味,所以叫它根基也是十分合適,你根基越深才能爬得越高嘛。

+++方向的分割線+++


啥是優秀程序員?

記者和很多網民說熊貓燒香作者是高手

公司里你出什麼bug他都能告訴你原因用什麼軟體有問題他都能回答你的你就覺得是高手

有人說徒手做產品的全棧才是高手

各語言的作者都是高手

有不寫代碼,扔出一個restful論文的

還有人說高德納是神,他如果是神,那他那些代碼一定是在考驗我們,嗯

。。。。

上面這些的確都算是高手,我琢磨著前兩年被開掉的moto公司員工里肯定也有做功能機的高手和寫廉價板驅動的高手


你想自己選自己的方向還是被人忽悠方向?

我的想法是自己都嘗試玩玩,然後做自己喜歡的方向。當然,程序員的生態金字塔是上面做工具、基礎設施給下面人用來給普通人編程序,所以你選方向可以參考一下這個金字塔模型

+++爬坑的分割線+++


方向定下,然後就是做事了,一大誤區就是 【追求最好的東西】,於是非得弄清楚:

  • php是最好的語言嗎?
  • OpenGL比directx差嗎?
  • 程序員要先學數學嗎?
  • 最好的c語言書是譚浩強寫的嗎?
  • 放屁要先脫褲子嗎?
  • linux發行版那麼多該選哪個?
  • 某大牛說IDE不如編輯器
  • 聽說黑客都是用記事本寫程序的
  • C#是升調記號應該讀csharp而java不應念 [加wa(輕聲)]
  • 。。。

如果你是一個*nix世界的玩家的話,你應該知道有一個jargon來上面的毛病,叫yak-shaving,我以前提過幾次yak-shaving,但是很多人看不懂,它的字面意思是Any seemingly pointless activity which is actually necessary to solve a problem which solves a problem which, several levels of recursion later, solves the real problem you"re working on.

但一般都引申其意使用它,我這裡舉例一下:

你本來要打開軟體寫一個helloworld,軟體提示你升級,你點了升級,提示你xx庫不夠新,然後你更新xx庫,提示你要升級yy驅動,然後你升級yy驅動,系統告訴你要編譯這個驅動,你必須下載s.f版本的編譯器和庫,你更新編譯器,系統說s.f版本編譯器必須在e.n系統上運行,然後你就升級系統了,幾個小時過去,你發現系統升級導致了幾個軟體損壞,然後你更新那些軟體,去找解決問題的方法,不知不覺到了半夜,你累成了狗,卻發現問題還有一大堆,而helloworld也沒寫成。。。。


這些問題我都遇到過,我的建議是挑一本大牛說的書就是了,看會了其他也會了。當然,如果你不幸不認識大牛(都上知乎了只要會搜索這種事情不可能發生),或者單純好奇——就像我當年那樣的話,那就每種都試試,不過有的答案你自己知道就好,像是編輯器emacs比vim更好,寫程序ide比編輯器更好這種話,你是不應該亂說出來的。

對了,像是不同範式的編程語言、不同的開發環境是應該嘗試體驗一下的,不過這種建議書上都寫了,我這裡說顯得有些廢話了。


所以說,不能被無關的東西弄偏了目標,要專註,堅持。

等你學深了一門語言,就算是學另一們其他範式的語言也不會太難,你學會了opengl,dx也就看看就能寫了。


你看看武俠小說里,段譽就是一個傻逼,仗著有時發出有時發不出的脈衝波和繞圈圈就能快跑直線的bug技就加上一門佛學能獨步武林最終迎娶了白富美,出任了CEO,走向了人生巔峰,喬峰永遠是一招降龍十八掌,更誇張。而慕容復文武雙才,基本精通天下武學,每天讀書4時辰練功4時辰,論用功誰能和他比啊。。。可到了30多歲還是一事無成,pk連段譽這種新手都搞不過,最後被人搶了老婆,就是因為方向不對,而且太不專註了。

所以求多不如求專,深度到了,再花20%的時間去擴展一下廣度即可。

+++重要的分割線+++


以上東西你都做好了,要花個2年時間的樣子,對於學生來說,如果你有一個好的學校背景,人生可以就此揚帆起步了

但這不是終點,俗話說人靠衣裝,美靠包裝。包裝是門學問,這裡的包裝不是讓你西裝領帶亮皮鞋黑絲套裙白襯衫整一個營銷狗hr的造型,是說專業技能上的包裝。


為什麼這是最重要的部分呢?因為別人一般不和你說這麼多,尤其是懂得包裝的人,更不會傳你這些不傳之秘啦。。。。。


包裝自己的第一步是提高實力

沒有實力的包裝那是空中樓閣,只能靠每天日常搞外包的忽悠架構大數據云計算過活,明眼人也能看出來,所以純屬作秀,沒有意義。

在某個領域(編譯器、虛擬機、開發架構、前端。。。)成為專家(專家的定義嘛,,我的理解是能在簡歷里寫精通)後,包裝的實力就算具備了。


包裝的第二步是定位

提到美國會有一大堆人跳出來說是人類的希望民主的大救星,提到google就是最純的技術公司不作惡、軟體業的翹楚開發界的標杆、心美人美白蓮花。。。哪怕你列舉google賣假藥、惡意打壓yelp、挾持web標準等等等等這些事,他們也會說百度更差(咦這不5角錢常用的語句嗎怎麼被民主進步人士盜取了?。。。),可我根本沒提到百度好嗎。。。

這全是包裝造成的,所以包裝的巨大威力,以此可窺之。


google是搜索引擎,百度難道也說自己是搜索引擎?不,百度說自己是最懂中文的搜索引擎。。。哈哈哈,你別笑,這的確很管用,就像google說自己不作惡是好女孩一樣。


程序員的包裝定位,無非稀缺和獨特這兩點。物以稀為貴,稀缺就是要做到不可替代,這很好理解,比如你知道世界第一高峰是珠穆朗瑪峰,如果沒看過禪師精選集你很難知道第二高峰是喬戈里峰,但文青特別偏好乞力馬扎羅山,不爬不跟你結婚,為啥?獨特性嘛。。。我不跟你比高,我和你比文化底蘊,於是就贏了。

由於你有實力,所以你應該盡量把自己的實力包裝成稀缺屬性,你是專家嘛。。然後你實力多,應該把獨特的實力包裝出來,避免和他人共同曝光,以免被人壓在身下。


我說一個我朋友包裝自己的故事,他進公司接手了一個項目,已經是被隔壁組開發了3,4個月的一個軟體,其實這軟體2個月也能做好的,但是隔壁人忙而且也不上心,不熟悉這個技術,加上又不是自己的老闆,所以做事拖沓了那麼久才做好。他接手後一刻沒閑,晚上帶回家也做,做到半夜,10天做成,然後整個公司的人都知道他的名字了,他也就立穩腳跟了。

這個包裝的主題是,技術實力強,開發速度快。


包裝的第三步是推廣

推廣就是讓人知道你做得好,強化你的個人品牌,可以用博客、知乎、mailing-list、github等,通過寫文章、參加線下聚會演講、回答問題、幫助他人等方法。這個用好了是門學問,用不好就是裝逼,不展開了。。。

記住不要匿名,匿名你基本啥也得不到


有人明明技術實力強,但是由於沒有包裝好,或被埋沒了才能,或被貼上了各種不應該有的標籤,或被人偏見看待。比如 @趙劼 的c#和 @vczh 的微軟標籤

有人明明實力一般,但是善於鼓動小白,包裝得好,所以有一批忠實粉絲,這種人我都不太敢說名字了,呵呵。。

所以優秀的程序員應該善用包裝啊

+++結尾的分割線+++

上面說了那麼多,但是堅持做來需要不少推動力,有人能考上清華,但是也能在大學墮落,有人能取得成績,但是也會固步自封。。

要想優秀,得有巨大的推動力,你為啥想成為優秀的程序員?你的推動力是什麼?


好比,我們說,嫖娼是有巨大道德壓力、金錢壓力和風險的事情,為啥知乎上那麼多嫖客樂此不疲並努力給自己洗腦合理化這件事呢?因為在他們的眼中嫖娼是最有趣的事情、是不吃飯不睡覺也不能不做的事情、是不做就活著沒勁的事,有了這種死也要死在床上的精神,還怕什麼呢?


這就是推動力


我見到的優秀的程序員多數是「隨著一個迅速發展的企業一起迅速成長起來的」。學校里教不了多少東西,一味看書也無法理解複雜的場景,唯有在實踐中鍛煉,不停的解決問題。在企業發展中不掉隊,最好是走在隊伍前面。(很多掉隊的轉做PM了)


思考需求設計六小時,動手碼字測試兩小時。

如果工作時間是八小時。


工程師和碼農的區別並不在於技術水準的高低。

工程師注重解決問題。

工程師勇於承擔責任。

工程師善於控制進度。

工程師能夠自由溝通。

工程師知道如何合理安排時間。

工程師明白實現的功能有什麼意義。

工程師會和PM認真交流需求。

工程師會比QA還要早的發現錯誤。

工程師關注線上數據。

工程師會以自己完成的項目為豪。

工程師不會甩鍋。

工程師選擇推進項目進度。

工程師會開放討論技術框架。

工程師善於總結問題和解決方案。

工程師的視野通常廣闊。

工程師喜歡分享。

工程師根底紮實,項目實戰經驗豐富。

工程師喜歡復用,重構,提升自己的工作效率。

工程師能夠把簡單重複枯燥的事情變成自動高效快樂的事情。

工程師在受到別人的認同時會有巨大的成就感。

而實際上,當你成為這麼一個工程師的時候,你的技術又會差到哪裡?

反而是我看到過很多所謂的一些鑽研技術,做事推三阻四的人並不能稱為工程師。

在他們眼裡,公司付的錢永遠比不上他自身的價值,所謂工作,就是在面試的時候說服老闆給他們更多的工資而已。


在很多情況下,「程序員」和「碼農」是同義詞,所以這個問題在準確定義這兩者之前是無解的。我對問題的理解就是,「程序員」關注的是「程序」,一個實實在在解決問題創造價值的東西;「碼農」關注的是「代碼」,只是一堆需要由人來編寫並且由機器來執行的命令。如果區別是這樣子的話,那你專註於解決問題就可以了,因為最終「程序」也會變得不重要,就跟「代碼」一樣只是手段,只是中間過程,能否解決問題並且創造價值才是關鍵。

這需要培養一種思維方式:

1. 定義問題。到底我要解決的是什麼問題?什麼問題我不需要解決?大家是否都認同解決這個問題是有價值的?

2. 分析問題。解決這個問題的關鍵路徑是什麼?有哪些子問題可以暫時不解決,哪些子問題必須優先解決?什麼信息還處於缺失狀態?如何能夠獲取這些信息?獲得到這些信息後,可能會出現哪些新的子問題需要考慮?

3. 解決問題。這裡只需要執行力……

總的來說,這就是一個人肉 DP(動態規劃)問題。你不一定知道到達重點的最佳路線,你連計算路線的信息都不全,你必須有一個精明的演算法指導你下一步怎麼走,走一步獲取一點新的信息然後重新計算下一步怎麼走。

***

舉個例子,你接受了一個老應用要優化它的性能。這時候你的問題定義是什麼?你就是要讓它跑得更快,同時維持代碼可讀性、可靠性在相似水平。你不要嘗試去重構它,更加不要想著去重寫它,因為這些都不是你問題定義的一部分。

然後你需要分析這個問題如何解決。你肯定要學習一下寫出這個應用的語言,但你需要精通嗎?很可能需要要。你需要找一個性能分析工具,但你真的需要非常精通性能分析嗎?如果這個應用從來沒有人優化過,估計很容易找到能夠優化一下性能就大幅度提升的地方,你也不需要特別在行。當然這樣說不是 100% 靠譜,所以這是一個有待挖掘的信息,你需要真的做一些初步分析後才能更準確地評估花多大的力氣能夠獲得多大的回報。問題繼續拆分的話,那就是你如何找到性能分析工具,遇到問題有誰能幫你解決,等等。

最後你就可以執行你的計划了,這時候更多的是需要保持頭腦清醒靈活應變,同時保持毅力遇到障礙要有信心能夠解決。


開什麼玩笑,世上根本沒有一種生物叫「優秀的碼農」。只有「擁有豐富搜索粘貼代碼和調用現成庫的經驗技術上不去又沒能力轉行的老碼農」,以及「原先寫代碼發現升不上去轉行做產品售前管理的前碼農」。

至於怎麼成為優秀的程序員,其他答案已經說的夠清楚了。濃縮成三句話就是:

  1. 多想想別人為什麼這麼做;
  2. 多想想怎麼才能做得更好;
  3. 多想想怎麼做能更有意思。

優秀碼農,幹活,兇猛的幹活;優秀程序員,發現問題,解決問題。
僅此而已。

好的程序員的基本要求(我認為):
1. 學好數學:高等數學,線性代數,離散數學,演算法,圖論(可選),數值方法(可選),優化方法(可選),計算理論(可選);
2. 打好基礎:操作系統,編譯原理,彙編語言,資料庫原理,計算機網路,密碼學,人工智慧;
3. 多動手:至少用面向對象語言(C++/Java)寫5萬行;腳本語言(Perl,Ruby)寫5千行;至少在工作中正確實踐5種設計模式;維護過10萬行代碼的系統;參與過一次大項目的重構(或設計);
4. 多交流: 至少做過3個新人的mentor;參與需求分析和項目計劃的制定;獨立領導過項目的開發進度;能建立在團隊里的威信(人品和技術兩方面);

1和2是一個人在學生時代該乾的,本科四年足夠了;工作後干3和4,一般2年也能有所心得,最好能理論聯繫實際,做到融會貫通舉一反三。而且要放下「唯代碼獨尊」的優越感,能正確定義開發的目標,並不斷提醒自己這個目標。到此為止,優秀的程序員應該可以出爐了。

有些人可能不同意我的定義,但我認為,優秀的程序員不只是能寫多好的代碼,而是能獨立解決問題(理論加經驗),帶領團隊一起最大限度的實現需求(溝通能力)。代碼只是其中的冰山一角啊。在實踐中,「高效又優美」並不一定是好程序員,因為程序員的一個通病就是追求「代碼完美」,耽誤工期是常有的事,項目經理往往也沒辦法。優秀程序員則能正確做出取捨,做出「deliverable」的產品。優先的乾的漂亮,不優先的不鑽牛角尖。畢竟人的精力是有限的,在有限的時間裡,做出最好的產品,還是很有講究的。更進一步,好的程序員還要能防微杜漸,通過有效的溝通,了解團隊的走向,並在必要的時候提醒團隊,甚至挺身「填坑」。

PS. 當然,我不是否認代碼的重要性,代碼能力很重要。但再優美的代碼,如果不能「deliverable」,那它又有什麼意義?公司給你一個項目,讓你找一百萬個文件中的重複文件,你可以用一個開發周期來做一個超完美的hash function,效率高,碰撞率低...但你這函數不是「deliverable」的,因為他還不能「找一百萬個文件中的重複文件」。這樣的程序員真的優秀么?我認為不是,因為他不分主次。


2016.12.26補充:
為什麼MIT停止教授SICP
Programming by poking: why MIT stopped teaching SICP
===================以下是原答案====================================
那些一上來就數學、演算法、人工智慧、編譯原理。。。。。。balabala的答主,你們現在回去大學考試,微積分、圖論、編譯原理等學科,能考80分以上么?你們有自己實現過B-tree演算法么?你們有自己實現過linux tcp協議棧么?

我敢打賭99.99%的人都不敢拍著胸脯說自己能做到,所以不分領域不分場景,上來就演算法、數學很重要的都是耍流氓!!!

程序員是一個很寬泛的統稱,嵌入式程序員也是程序員、ios程序員也是程序員、linux內核開發也是程序員、Oracle開發也是程序員、應用服務開發也是程序員,試圖以一個標準來統一這些程序員的優秀特徵,就是耍流氓!!

比如說:嵌入式程序員對系統內核、數學、彙編可能就要求較高,但是對於和用戶溝通交流的溝通力、理解力要求就不那麼高,因為嵌入式更多都是和底層打交道;而像我這種應用服務開發程序員,更多是和用戶打交道,內核和數學理解基本原理即可(知道什麼時候用Map,什麼時候用List就可),彙編完全就挨不著邊,但對於和用戶(包括外部用戶、內部用戶例如產品、測試等)交流時的溝通力、理解力要求很高。你數學拿國際奧賽金牌、linux內核源碼度過三遍?。。。。。。然並卵,沒有理解客戶的需求,你做的再牛,最終都是錯的,都是垃圾!

即使我非常推崇的《UNIX編程藝術》一書中,很多原理其實也只是適合某些場景,並不是放之四海皆準。例如其中一條原則「清晰性」,就不適合PHP內核這種開發場景,PHP內核中的Hash函數的循環,是寫了7 ~8 條重複的語句,以達到高性能。

所以世界上根本沒有具體統一的優秀成員的標準,如果真要給出一個標準,那我就只能給出一個比較抽象的標準了:
1)充分了解你所在的行業的特點和要求,並全力去滿足
千萬別做著嵌入式,卻按照應用服務開發的標準去要求自己

2)不斷學習和提升,而不是滿足於完成目前的工作
碼農滿足於完成目前的工作,優秀程序員時刻準備著將來更有挑戰力的工作

3)能夠動用一切方法和手段,去解決你所在行業遇到的疑難雜症
完成需求和解決問題對人的綜合素質要求相差不止10倍。例如,線上伺服器響應慢,一個很簡單的現象,但可能原因太多了:伺服器負載高、磁碟慢、沒內存了、資料庫慢查詢、資料庫磁碟壞了、程序死循環、jvm fgc、網路抖動、黑客攻擊、流量暴漲(例如秒殺活動)。。。。。。在這麼多可能原因中快速定位真正的原因,和寫1000行代碼的要求完全不一樣

===============2015.08.27補充=====================
有的評論的同學可能對我的回答有誤解,或者說我還沒有表述清楚,這裡再補充一下:
1)我不是說數學、演算法一定不重要,我是說要看行業和領域
數學和演算法在大數據分析、圖像識別、內核開發等領域非常重要,其實不能說重要還是不重要,在這些領域,數學和演算法是基本要求,這個都不懂,那基本上就玩不轉,連碼農都沒得當。

但數學、演算法在應用服務開發領域,在APP開發領域就不會有那麼高的要求。當然沒有那麼高的要求 != 完全沒有要求,理解問題的時候不要走極端

2)我不是說基礎不重要,我是說不同行業和方向基礎要求不一樣
打籃球、踢足球、打撞球、扔鐵餅、110米欄。。。。。。哪個都對基礎要求很高,但喬丹不會按照110米欄的要求去加強基礎,丁俊暉也不會按照梅西的要求來提升基礎。
假如有人問」優秀的運動員和普通的運動員差異在哪裡?「,你會說:速度、力量、敏捷、耐力這些指標么?

3)有人說國內面試都這樣,所以這些很重要
我只能說這是國內的現象(或者國外也一樣吧,免得有人吹毛求疵),但並不認為這就是正確的,面試的內容如果和工作無關,吃虧在後頭,我就吃過虧,面試的時候對答如流,入職後發現完全不滿足工作要求

==========2015.08.31補充===============
還是有人沒有很好的理解我的意思,我給個實例吧,看看所謂的「基礎」到底有多少層。
我以最廣泛的java為例吧,因為java使用範圍最廣,幾乎每個程序員或多或少都會了解一些。
1)掌握java的基本語法和公共庫,能夠完成最簡單的基本業務開發
2)熟練掌握java的高級用法:nio、多線程等,能夠完成較為複雜的業務開發
3)掌握jvm的基本原理,能夠進行jvm調優
4)掌握java虛擬機的原理
5)掌握java虛擬機的原理,並能夠開發基於虛擬機的編程語言,例如scala等
6)熟悉hotspot的源碼
7)熟悉hotspot的源碼,能夠開發hotspot功能
8)能夠優化或者重構hotspot代碼
9)熟練掌握編譯原理
10)熟練掌握編譯原理的數學知識
11)能夠使用flex和bison開發編程語言
12)能夠開發和優化flex和bison
。。。。。。
20)能夠將編程語言翻譯成彙編
21)能夠將彙編翻譯為機器碼(包括X86、spark等cpu)
。。。。。。
30)熟悉cpu架構
。。。。。。。。

那些不區分場景,不區分行業,上來就告訴別人數學和演算法很重要,或者說基礎很重要的人,請按照以上的描述來對應自己的「基礎」,看看你的基礎到底能夠達到什麼程度。

================2015.09.04補充========================
正好看到知乎的一個問題:你碰到過的最難調的 Bug 是什麼樣的? - 互聯網
那些說基礎牛逼的大神做啥都牛逼、數學和演算法好就能秒殺一切、高斯林來做ios app開發分分鐘鍾秒殺其他人。。。。。。等等的各位,請看看上面這個知乎問答吧,裡面有各行各業各個領域的回答


想辦法讓自己有創造能力。

有想像力
有動手能力

保持興趣
不斷總結

和別人交流


程序員的一般性工作流程是醬紫的:

基於需求、編程語言、技術、框架、工具等,在頭腦中完成第一次創造,抽象出問題解決答案、產品、服務等,然後再編碼,把第一次創造的結果實現出來,完成第二次創造。

如果你停滯在第二次創造那個階段,就會成為一個優秀的代碼工人。如果你超越那個階段,在思考、分析、想像、架構、設計、創新、創造等方面去努力,那就可以成為一個優秀的程序員。

當你成為一個優秀的程序員後,狀態是這樣的:想得多、碼得少、做得好。


三年以下尋明師,盡信明師勿信自己
三到五年求益友,廣開言路找他山石
十年以下定終身,看定方向絕不回頭
十年以上,嗯…找個好點的生髮中心…


不要浮躁,好好造輪子。我的老闆總是跟我說,年輕人不要總是在乎錢,等到你到那個歲數了,自然就有了。後面的你只需要談一個肯跟你結婚的時候還租房子的人就好了(其實這一點都不難,這種妹紙滿大街都是)


什麼時候能寫自己想寫的代碼,過自己想過的生活的時候,就從碼農變成了程序員。


這個問題有主觀和客觀因素
客觀因素是,公司想你成為一個好的程序員么?還是他們只是單純的希望你去執行而已?比如outsourcing,或者說公司內部的outsoucring?
又或者說,你有足夠的room去成為一個優秀的程序員么?比如公司有榜樣么?公司給你時間去思考么?等等
主觀因素,你想成為好程序員么?你能犧牲多少打遊戲的時間來學習?你有足夠的天賦么?

如果以上都是positive,恭喜你,其實你不用做什麼特別的,這本來就是一個水到渠成的事情


碼農不過是程序員自黑的一個稱呼而已,程序員=碼農了,難道題主覺得不是?難度題主覺得程序員是做的技術活,碼農是做的體力活?
以自身的寫程序經歷來說,每天工作有幾種狀態:最開心的一天——沒做多少活,學了很多新東西,弄懂了某個知識點;較開心的一天——做了很多活,但收穫也很多;無聊的一天——沒做多少活,不知該做啥,導致一天下來,啥也沒學到;苦悶的一天——忙了一天,全是重複的、不用動腦的活,啥收穫也沒有;
第一種工作狀態,或者是第二種狀態是否就是題主口中的程序員的一天,最後一種就是碼農的一天?
我可以很肯定的說,這種狀態不由員工來定,尤其是剛入門的底層員工,已經升級到高級工程師或者是架構的人另說,但想要晉陞到高級工程師或者架構,你還必須經歷底層員工這步,再加上你自身聰明好學,再加上工作時間和經驗的積累。


我就是一個典型的碼農:

  • 沒學好數據結構與演算法
  • 沒學好編譯原理
  • 沒學好設計模式巴拉巴拉
  • Github上有的我一定不會再實現一遍
  • 從來不讀優秀的框架源碼

希望世界上優秀的程序員越來越多,這樣會有越來越多的框架出現、越來越多的第三方庫出現、更加簡潔的語言也會出現、更厲害的人工智慧出現。

而我們這些碼農就可以利用這些做點更有意思的事情了~


做個程序員並不難,但是少年,你知道代價嗎?

你熟悉各種語言 但你從早到晚不發一言
你精通面向對象 然而你可能還沒有對象
你懂前端後端移動端 但是還是在搬磚
你了解各種框架各種庫 逛街只知優衣庫

Github一片綠 眼睛周圍兩圈黑
Bug修好笑開顏 頸椎腰椎肩周炎
Code提交十萬行 存款不值半間房
系統重構大挪移 卧室只有十平米
程序簡潔精鍊 人是大腹便便
網站日活百千萬 頭髮脫落一多半

為了編程,這些代價你都願意承受,那恭喜你,已經成功了一半。

汝能持否?


請題主先定義下列概念:

程序員
碼農
優秀的程序員
優秀的碼農

然後……這個問題還有必要回答嗎?


程序人生的寂靜歡喜

標題起得太大咯,是在故作老成么?

「程序人生的寂靜歡喜」——怎麼看都感覺像是某位已故計算機大師的墓志銘,可卻偏偏被一個菜得摳腳的毛頭小子拿來當做人生寄語——也是日了狗了!

人都沒生過,談什麼人生!?

莫怪我,我偏要「奢談」一下!

一.記敘

一開始我是拒絕的!因為我根本就不喜歡寫程序。

打高中數理化就不好,什麼排列組合、圓錐曲線、電磁場中一帶電粒子、水溶液中的水解電離,困擾我有如夢魘。

高考時,祖墳上冒出一縷青煙,數學創歷史新高考了88,理綜破有史記錄考了200,數據不僅太美太感人,而且大吉大利、元亨利貞!終於,我以總分522分考上了一所夢寐以求的2本就讀於計算機科學與技術1202班——命中犯2!

可是對於編程其實我是拒絕的——大一花了一年的時間來研究心理學,大二花了一年的時間來研究哲學,大三花了一年的時間來研究中醫——結果,《離散數學》掛了,《數字邏輯》掛了,《數據結構》掛了,《編譯原理》掛了——恨不得自掛東南枝!

人在做天在看,出來混總是要還的!曾堅信「天生我才必有用」,「我輩豈是蓬蒿人」;曾篤定「心所願力畢至」,「有志者事竟成」;曾夙願「天授其賦必賜其福」,「好風憑藉力,送我上青雲」。可是,一個冷峻若紫電青霜的問題劈面而來:不寫程序又能幹嘛呢?

然而我根本就不會寫程序!試想,一個打字只能用到右手食指、左手食指和左手無名指的人,敲代碼時是多麼捉急!試想,一個高數補考考了19分,滿腦子宏大敘事的理科弱智,寫程序時是多麼腦洞大開!

後來去公司實習,遇到的第一個項目就是要使用ESFramework通信框架,當我第一眼看到了開發手冊上的如下句子時,我就知道,春天不會再來了!

客戶端通過調用ESPlus.Application.Basic.Passive.IBasicOutter介面對應的方法以及預定其相關的事件,就可以完成基礎功能或得到相關狀態改變通知。我們可以從 ESPlus.Rapid.IRapidPassiveEngine暴露的BasicOutter屬性來獲取IBasicOutter引用。

介面、預定、事件、暴露、屬性、引用,你們一個一個來,我還大概能明白,你們群起而攻之,我便委地如泥了!

重載的Query方法(帶有CallbackHandler參數的)在發送請求信息後,不會阻塞而繼續向下執行,而框架在收到對應的回複信息時,會回調CallbackHandler委託指向的方法。由於調用線程與回復回調的線程不是同一個線程,所以稱這種機製為回復非同步調用。

再當我看到「重載」、看到「阻塞」時,我徹底憤怒了!而緊接著映入眼帘的「委託」、「回調」更使我出離憤怒!最後「線程」、「非同步」更令我萬念俱滅,心如死灰!

從此,我便以一種菜得摳腳的姿態狼狽不堪地行走在險象環生的程序世界裡。莫非是寒更雨歇,葬花天氣,獵獵北風襲單衣;荒原寂寂,遠聽猿啼,近看寒鴉起;鬼影幢幢,步步驚心,不知今夕何夕。

好多次我都想,別瞎費勁了,你不是寫程序的料!真正適合寫程序的人根本就不可能是這個樣子!

於是乎放棄。可是不寫程序又能幹嘛呢?好歹讀了四年大學,何況拉弓沒有回頭箭。還是要頂風逆水雄心在,不負人民養育情!

終於,苦水的浸泡痛徹了肌膚,磨練了身心,同時也澆灌出了涅槃之花!

某天我突然發現,那些原本看來佶屈聱牙的技術文檔如今看來卻直白如話,那些原本晦澀難懂的語法如今卻能夠熟練運用,那些原本看都看不懂的源碼如今也能夠在自己指下流淌,實習之前我連循環語句都寫不對,如今卻也能用ESFrameworkOMCS等框架開發出像樣的網路通信應用。

二.議論

更重要的是,從當初的不喜歡、不擅長、不自信,到而今能夠懷揣著一顆歡喜之心來寫程序,能夠以樂在其中的心緒來開啟自己的程序人生,這不僅是我收穫到的莫大財富,更是我把握住的莫大幸福!

胡適先生的名言:「怕什麼真理無窮,進一寸有一寸的歡喜。」真理無窮並不可怕,因為我們在每一寸的前進中始終獲得歡喜。編程之路並非坦途,我們也並非天賦異稟,然而那個最幸福的人,並非是玩轉代碼的編程高手,也並非是億萬家資的IT精英,而是那個在流年中始終以歡喜之心書寫代碼,又通過書寫代碼恆久再獲歡喜之人!

常言道:「男怕入錯行,女怕嫁錯郎」。嫁郎要嫁有情郎——有情飲水飽,無情龍肉都無味!入行也是一樣。入了所愛之行,舉手投足皆得歡喜;入了所憎之行,坐卧立行儘是苦悲!嫁郎的幸福不在於嫁郎所獲得的富貴榮華,其根本在於郎本身。那些通過嫁郎以獲取外在利益的女子,她們充其量只是獲得了生意上的成功,而根本沒有獲得婚姻本身的幸福,而這何嘗不是一種買櫝還珠?同樣,那些以工作作為純粹手段的人,他們也從來沒有獲得過工作本身的幸福快樂。

由此看來,我想恐怕對於絕大多數的程序員而言——你不是真正的快樂!

所有程序員恐怕可以粗略的劃分為這五種狀態:

1.不愛,但是迫於生計

2.無感,反正亦步亦趨

3.熱愛,但卻身心俱疲

4.狂熱,打了雞血一般

5.歡喜,畢竟樂在其中

你是屬於哪一種呢?

如果要我來選,我一定會選5,因為唯其如此才能獲得程序人生的個中真昧,才能擁有彼此交融的內在完滿。而其他的幾種狀態在不同程度上都是殘缺的。

也許我們寫程序總是不可避免的為了各種外在的目的,但是寫程序時的那份小確幸的歡喜,卻始終是我們精神飛鳥的棲息地。 正如孔子贊顏回——子曰∶「賢哉回也,一簞食,一瓢飲,在陋巷,人不堪其憂,回也不改其樂 。賢哉回也!」

罷筆時風煙俱凈,但願自己剛剛開啟的程序人生能夠無關風月,寂靜歡喜。


為什麼不做一個產品經理


推薦閱讀:

如何評價 WiFi 萬能鑰匙關於遭受造謠中傷的聲明?
被人拉黑,如何釋懷?
Evernote 國際版和印象筆記有什麼區別?怎麼遷移筆記?
為什麼在殺毒軟體的「收費時代」電腦經常中毒,而在「免費時代」基本沒毒了?
中本聰是怎麼做到在人肉搜索那麼強大的互聯網上隱藏自己的身份的?

TAG:互聯網 | 程序員 | 軟體開發 | 編程 | 程序員能力 |