標籤:

技術真的沒用嗎

我是一個技術型的程序員,或許有朋友會問:「程序員不就是做技術的嗎?」事實上我認為目前中國的程序員中多數都不是真正意義上的技術人員,他們通常只會機械式的寫代碼,從互聯網上搜索能用的現成代碼然後複製粘貼,我之前寫過一篇《編程是一門藝術》。我從事編程工作到現在已經有十二年的時間了,不敢說自己是一個優秀的程序員,但我一直在向這個方向努力。編程是我的興趣所在,我也非常熱愛這個職業。

我面試過很多求職者,我常常會問他們:「你的職業規劃是什麼?或者說你的人生理想是什麼?」大多數人會回答:「先做幾年的技術,學好編程,等有了一定的工作經驗,接觸過項目之後再轉項目管理。」我也跟很多同事聊過這個問題,多數人的回答也大同小異。其實這也是目前中國IT界的一個普遍認知:編程這種工作也就能做個三五年,最多也就做個七八年,之後還是要轉行做管理或者其它類型的工作。有人也問過我這個問題,我的回答令他們很詫異,我說:「我熱愛編程這個職業,我會一直做下去。」他們會反問我:「你能做一輩子的Coding嗎?做到四十歲?五十歲?還在跟那些剛畢業的孩子們一起干Coding?」我只微微一笑。我先說幾個發生在我工作上的故事,故事本身沒有什麼教育意義 ,更沒有什麼深層次的哲理。它們只跟我做編程技術有關:

故事一:早在多年前公司還在使用一套非常舊的開發框架做JavaWeb的項目開發。我也跟同事一樣在使用這套開發框架,但在我使用期間我發現這套框架使用起來非常不方便,編寫一個業務的功能要編寫六個配置文件,同時還要創建十幾個介面和類,然而這些所謂的低耦合設計在實際使用中根本用不到;另外它的性能更是低下,處理幾萬條數據保存到資料庫的功能慢如老牛,運行十幾分鐘才能完成。並且這套框架漏洞百出,到處是底層的bug。於是在工作之餘我自己重新搭建了一套JavaWeb的開發框架。我在工作不忙時就會不斷的修改和完善功能。有一次我們領導從我身旁經過看著我手裡在弄的東西,很不高興的跟我說:「這也不我們的工作項目,你弄這個幹什麼?」我耐心的跟他反映目前公司的開發框架的問題。他卻說:「你在工作期間弄這個影響工作,我們公司又用不到。你想自己弄沒問題,自己回家弄去!」我笑了笑沒說什麼。可後來項目上線後出現了各種問題,多數都是框架級的,還有非常嚴重的性能問題,客戶也非常生氣。後來過了幾個月,領導找我說:「你自己搭建的那個框架怎麼樣了?如果搭好了就拿過來我們用吧。原來那個框架問題實在太多了。」後來公司用的開發框架基本上都是我搭建的。

故事二:我個人非常喜歡Linux操作系統,無論是在家還是在公司,我的電腦安裝的都是Linux操作系統(如果有興趣的朋友可以參見《一點一滴學Linux》)。我剛到這家公司工作的時候,把工作電腦的操作系統從Windows換成了Linux。當時領導路過我身旁跟我說:「你安裝這操作系統有什麼用?非要在我們公司搞特例!你要融入我們團隊,就要跟其他人一樣。」我笑了笑,說:「我希望多學一點這方面的知識。」領導「哼」了一聲,走了。日子一天天的過去,有一年,公司與一個大客戶簽定了長期合作夥伴協議,但客戶有一個硬性要求:我們開發的所有的程序都必須部署在Linux伺服器上。這下領導傻眼了,全公司沒人會在Linux下工作,上網查資料也是學的一知半解,對Linux的文件結構、許可權設置、軟體包安裝完全不懂。最後領導找到我,讓我帶著負責這些項目的同事做,手把手的教會他們(但目前為止還沒人願意好好學,都是能把手頭的工作混過去就算交差)。

故事三:我在公司工作只使用Java來做Web系統,也涉及到做前端的Javascript、html、CSS等,但我對Linux下的C語言編程非常感興趣,我並且常常利用工作之餘學習C語言,並且自己手動做一些有趣的小程序,比如基於Linux下的C程序做Socket通訊、多線程、圖像處理等。然而熟悉的一幕又上演了,領導再次路過我身旁,看到我屏幕上的C語言代碼,跟我說:「這不是Java語言啊?這是啥?」我回答說:「C語言。」領導說:「上班時間別弄這些跟工作無關的事!」很生氣的走了。我承認在上班期間不應該做與工作無關的事,但學習本身也算跟工作無關嗎?我不這樣認為。如果我手裡還有要做的工作,我會努力的去做好,但在我分內的工作已經完成的情況下去學習有什麼不對的嗎(有很多朋友抱怨說編程是一份永遠都很累的工作,有沒完沒了的項目,沒完沒了的加班,你哪有那麼多時間學習啊?這個問題請參見《上班時你在做什麼》)?我是在學習,又不是看小說,玩遊戲,看電影。歷史就是這麼驚人的相似(也許是老天為我報不平吧):又過了半年,公司接到一個項目,在Linux下用C語言編程,做伺服器集群的數據採集和上報工作,公司多年來一直在做JavaWeb的相關項目,Linux下C程序根本沒做過,但這是一個老客戶,項目費用又非常可觀,領導決定先拿下這個項目,再招聘相關方向的人員開發。很可惜,臨時抱佛腳是沒用的。公司只有我一個人學習過這方面的知識,只好讓我一個人頂起這個項目,我一個人做了3個月完滿的完成了,而且是比預期提前了2個月,這使我想起了那句話:機遇只會眷顧那些有準備的人。

故事四:有一個同事編寫的程序功能是:點一個按鈕給銀行出一個流水的明細帳,一次大概有4000條數據,同時還要做一些數據的業務處理和回寫資料庫。這個同事負責編寫這個功能的程序。這個功能他寫了近一個月,最後功能是做出來了,結果也是正確的了,但每次點這個按鈕,程序從開始到結束大約運行了30分鐘。客戶很生氣,後果很嚴重。我們領導開始想辦法對這個同事加以「指點」:加大伺服器的物理內存、加大伺服器容器的內存使用,採用多線程技術讓這個功能在多線程中運行,從而不影響畫面中其它功能的使用……最後的結果是:這個功能的耗時從30分鐘改善到20鍾,客戶還是非常不滿意。做這個功能的同事在無數次失敗後、在領導的無數次「指點」後,果斷的辭職了。人雖然走了,但問題還在,還是需要解決的。領導找到我,讓我幫忙優化一下。我從上午9點了解業務,10點開始動手做,用了1個半小時的時間,在11:30將這個功能全部重新開發完成,這個功能的處理結果正確,整個功能的運行時間為0.7秒。我並不是說我自己的能力有多強,我只是覺得一個真正懂得技術的程序員和一個只知道寫代碼的程序員的差別很大。編程是一份有技術含量的工作,不是體力活。

故事五:去年有一個項目,其中一個重要的功能是對漢語的語句分詞,也就是說:給你一句話,你需要把裡面用到的詞語識別出來。當然,前提是有詞庫的。同事的做法是把60萬個辭彙的詞庫事先載入到一個List並放入內存中,當接收到一條語句時,使用給定的字元串在60萬個辭彙中循環,判斷這句話中中是否包含了詞庫中的詞語。在他努力工作下,這個分詞功能總算是實現了,在並發處理十幾條數據時沒有什麼問題,響應速度也很可觀。但在項目上線後,這個分詞功能的並發非常高,伺服器在幾秒鐘之內要處理幾千條數據,客戶定的性能要求是每秒200個並發請求,每個請求的響應時間要求在200ms以內。於是問題來了,這個同事寫的程序在大並發請求時服務程序變的非常的遲鈍,內存消耗非常大,Java虛擬機佔用的內存幾乎充滿了整個伺服器的物理內存。領導讓大家開會討論,想辦法去解決這個問題:有人說加大伺服器的物理內存,有人說提高Tomcat伺服器的並發數,還有人說去調整Java虛擬機的內存回收機制重寫內存回收功能……總之,努力了一個月後,性能還是沒有任何改善。最後我給了這個同事一個建議,說你去學習一下《數據結構》的課程,主要學習「鍵樹」那一章。採用「鍵樹」是做分詞功能非常好的解決方案。同事聽了我的建議,把之前的代碼重新用「鍵樹」實現了,最後性能是:最多支持每秒1000個並發請求,每個請求響應時間在30ms以內。客戶看到改進的效果也非常滿意。編程是一份有思想的工作,沒有思想的程序就像一潭死水;有思想的程序才會有活力,才有生命力!

這種故事還有很多,但今天的故事講到這裡就暫時告一段落了。我想說的是:編程不是一件簡單的事。那些覺得編程很簡單,隨便到互聯網上就能搜索到想要的代碼,copy一下就OK了的人,他們從來不會思考,不會獨立設計程序,不會獨自解決問題,遇到問題就用拿來主義的辦法問同事,去互聯網上找(請參見《自我學習與自我解決問題》)。從來不會主動學習相關知識,認為大學畢業了學習就結束了,找到工作了,就沒有必要再學習了。從來不積累經驗,遇到同樣的問題仍然不明白是怎麼回事,被同一塊石頭絆倒很多次還是一如既往的被絆倒。他們的工作很乏味,很枯燥,並且工作起來會覺得非常累,每天總有那麼多做不完的工作。難道編程工作真的是這樣的嗎?編程真的沒有技術含量嗎?去年公司開年會的時候公司領導跟我們說:「技術不值錢,你們做Java的也好,做C語言的也好,做Python的也好。這些技術都不值錢,你們想要實現的功能,網上有那麼多的開源庫,那麼多的開源代碼。直接下載下來用就行了,有什麼技術難度?現在你們覺得自己很有前途,再過幾年你們就會像街頭上那些脖子上掛牌的人一樣了。脖子上掛個牌子,上面寫著:「電工」、「瓦工」、「木工」、「砸牆」……再過幾年你們同樣也在脖子上掛個牌子「會Java」、「會C語言」、「會Python」……技術現在不值錢,能掙錢的不智商,而是情商。能談成項目給你們做才是能力。」聽完領導的這番高談闊論之後我真是哭笑不得。也許做為領導,站在公司的高處向下看,和我這種公司小職員的想法完全不一樣吧。技術真的不值錢嗎?我已經用上面五個故事回答了這個問題。我並不是說我自己的能力有多強,我只是想說:一個優秀的電工要比一個垃圾的電工強太多,一個優秀的電工被各大企業邀請講課、解決別人解決不了的技術難題;而垃圾的電工呢?只能在脖子上掛一個牌子,蹲在街邊祈求有人能賞他點活干。

歡迎關注公眾號:編程外星人


推薦閱讀:

[數據結構]表達式樹——手動eval()
跨平台通用賬號系統設計規則是什麼?
如何學習C語言
數學不好的人適合學編程

TAG:編程 |