關於程式設計師成長的一點思考

aricyoung發表於2011-12-23

程式設計師的我們,是否想過今後的路該怎麼走、如何發展、技術怎樣提高?其實這也是我一直在思考的問題。下面就此問題,分享下我的看法。因為我閱歷有限,有什麼說的不對的,大家一起噴!

一、程式設計師應該打好基礎

1. 現在開發工具眾多、語言氾濫,經常聽人說”不學CC++神馬都是浮雲”、”CC++才是萬王之王”,CC++就真比PHP、Lua、AS、JAVA牛嗎?

其實不在於語言本身,而在於CC++依附的平臺。因為最靠近作業系統,所以能發揮其它語言不具有的效能優勢,而且很多資料結構、演算法、特殊功能類,CC++是不提供的,需要自己實現。這時就需要自己去溫習”資料結構”、”演算法”、”TCP/IP”、”作業系統原理”、”編譯原理”等這些知識。正因為如此,我們學習的東西被沉澱下來,也正因如此,CC++經過定製的功能比封裝好的功能效能高。

[@more@]cnBeta 博文精選

感謝的投遞
新聞來源:51CTO
程式設計師的我們,是否想過今後的路該怎麼走、如何發展、技術怎樣提高?其實這也是我一直在思考的問題。下面就此問題,分享下我的看法。因為我閱歷有限,有什麼說的不對的,大家一起噴!

一、程式設計師應該打好基礎

1. 現在開發工具眾多、語言氾濫,經常聽人說”不學CC++神馬都是浮雲”、”CC++才是萬王之王”,CC++就真比PHP、Lua、AS、JAVA牛嗎?

其實不在於語言本身,而在於CC++依附的平臺。因為最靠近作業系統,所以能發揮其它語言不具有的效能優勢,而且很多資料結構、演算法、特殊功能類,CC++是不提供的,需要自己實現。這時就需要自己去溫習”資料結構”、”演算法”、”TCP/IP”、”作業系統原理”、”編譯原理”等這些知識。正因為如此,我們學習的東西被沉澱下來,也正因如此,CC++經過定製的功能比封裝好的功能效能高。

我上大學做專案時,用的是.net平臺C#語言, 因為我本性好專研,老師都是把需要研究、比較難的問題交給我。但C#無論是效能和功能都是都是無法跟CC++比的,記得當時是要做一個”遠端控制”軟體,配置IP和埠後需要連線動態生成客戶端程式(木馬),但C#是不提供這個功能的。這也是我工作後轉為CC++程式設計師的原因,碰巧也是開發遠端控制軟體。剛開始寫出來的程式偶爾會莫名奇妙的崩潰,但經過兩個月和更長的時候後,我掌握了CC++。在此要感謝我工作時的指導老師翁躍龍,沒有他我的路不會這麼平坦,他教我的不僅僅是技術,更多的是解決問題得思路和做人。

2. 有些人會說大學學的東西是膚淺的,是沒有用的。想想看,在學校的時候我也經常這麼想,但出來後才知道這些東西有多麼重要。不過大學學得再紮實,出來後仍然是需要再溫習過的。因為上學畢竟實踐少,所學不能所用,計算機是個應用驅動的學科。我們再來看“計算機考研”專業課考的什麼(這裡並不是說考研就一定好),”資料結構”、”計算機組成原理”、”作業系統”、”計算機網路”。”資料結構”、”計算機組成原理”這兩門課程擺在前面,可見其重要性,分別是軟體和硬體最重要的兩門基礎課。我不相信不學好”資料結構”能夠把效能最佳化做得很好。若說自己學好了,能不看書、不查資料,說出”B+樹、B-數的應用和區別”、”KMP為什麼能快速匹配字串”、”快速排序在什麼情況會蛻變為o(n^2)”嗎?

我也不相信不學透”計算機組成原理”能搞通匯編和核心,不知道”CPU和I/O的互動過程”、”指令的執行通路”、”CPU運算器的工作原理”,如何寫出高效的彙編程式碼?如何弄清楚核心中”中斷”、”GDT”、”IDT”這些概念,真實模式保護模式如何切換?”作業系統”和”計算機網路”則是兩門非常重要的支撐學科,訊號量為什麼是最快的同步方式、執行緒排程比程式排程快、為什麼要做記憶體緩衝池,這些都是來自”作業系統”。而”計算機網路”主要是講述TCP/IP的,為什麼德問”對於一個具有幾百萬粉絲的使用者,資料如何實時投遞到所有使用者?”要使用多播的方式解決、”如何計算出C/S單向的延遲?”傳送ICMP包測量,這些都是來自它。

我們大學學的課程經過多少國內外知名學者專家研究過的,所以計算機理論課是基礎,是解決問題的根源。”演算法分析與設計”是”資料結構”的延伸,Divide Conque、貪心、動態規劃對於程式演算法的最佳化有很大的指導意義。同樣,”計算機體系結構”也是”計算機組成原理”的擴充。其次,”編譯原理”、”資料庫”、”軟體工程”等學科的重要性也不言自白。

二、實踐、理論、再實踐

作為程式設計師的我們,滿足於實現一個程式功能的快感,得意於從網上下載別人的程式碼加到自己的程式中,陶醉於自己寫了上百萬行程式碼。有想過自己是在創造嗎,還是裝配車間的技術工人。日趨成熟的開發工具,逐步把有豐富想象力的我們淪為奴隸。從網上下載個壓縮庫就用著、成熟的加密演算法直接使了、包裝好的類庫就include。為何不探究其演算法實現、效能最佳化、底層機制。有人會說很”難”啊!究竟是難,還是掌握的知識不夠,還是理論沒有達到一定高度。

很難想象不學習”計算機圖形學”,去做3D專案客戶端圖形演算法的後果;不研究”資料探勘”去分析大量客戶資料會做得多好;不攻讀”機率論”、”線性代數”、”人工智慧”去設計AI有多麼智慧。很多人說,這些東西遊戲用不著啊,學了有什麼用?我承認初學程式設計時,這些東西只是高談闊論。若我們工作了n年後,還只是熟練地做些coding,和剛畢業的學生有什麼區別。程式設計工具只是”工具”而已,別忘記了我們是改變世界的程式設計師,不提高理論,何以創新、公司拿什麼優勢和別人去競爭。

“研發”是”研究”和”開發”兩大塊,只做開發,不做研究,對個人和公司都只是短期目標, 當然理論提高了,是需要投產的,不然理論很快淪為”空想社會主義”,公司白花銀子養活研究部門。”實踐、理論、再實踐”,符合馬克思主義哲學思想,也是計算機學科的價值體現。真正的電腦科學家不是隻搞理論的,理論是要應用到產品中的。工程師也不是隻做開發不做研究的,是要應用創新,理論微創新。電腦科學家相比於程式設計師,主要是數學功底相當深厚,所以他們能在理論上有突破。

三、技術、管理兩路線。

1. “遊戲能玩多深,技術就能做多深”,這句話說得很好。只因為我們執著,所以在遊戲中能攻破一層層難關,凌晨2、3點還能練級打裝備。若能走回正道,做技術就想玩遊戲一樣,技術做不深才怪呢。走技術路線的人,一定是對技術痴迷的人。但要走得長遠,我們需要把技術做穿、做透。如何做穿、做透?計算機底層(C、彙編、逆向工程、驅動、核心)、計算機演算法(網格計算、音視屏壓縮、語音識別…)、架構(軟體工程、跨平臺、多語言等)都要有涉及。只有我們掌握了這些,才能做到”看問題看到本質”、”思想有穿透力”。這些才是最寶貴的,需要沉澱下來,僅僅靠做專案、寫程式碼是無法達到的。

2. 對於走管理路線的人,是具有”完成任務為第一要務”、”有計劃、善於管理時間”、”善於與人打交道”性格特點的人, 重要的是”綜合素質”,而不是”專攻”。但是這些都是可以改變的,很多公司也會選擇技術做得最優秀的人做管理。由於我是一個技術痴迷狂,管理這塊,我沒有發言權,不做多解釋。

四、心態。

1. 人活在世界上在於奉獻而不是索取,幫助別人是一件很快樂的事情, 作為程式設計師的我們心胸要開闊些,低調些、虛心些, 公司的李老師、老張就是一個心胸很寬廣、低調的人,值得學習, 三人行必有我師,我們熟悉的只是自己的這一塊、這個領域,不懂的地方要虛心向別人請教, 我見過浮躁、過於自信的人,也見過做人低調的人,發展結果完全不同。

2. 樂於分享,支援開源。這是一個很需要心胸、氣度的事,也是決定個人、公司發展快慢的重要砝碼。技術發展日新月異,總守著自己手中的那點技術,得不到長足的發展。中國兩千年的封建歷史、門戶關閉政策還不夠慘痛嗎?”技術是交流和玩出來的”,這是銳安龍哥告訴我的。他也是一個大駭客、正義的駭客,開源是駭客的一項重要精神,所以駭客能引領技術。

3. 每日學習。很多人認為畢業了就不用學習了,或者不用那麼那麼地學習了。這是一個非常非常錯誤的思想,無論何時何地都要把自己當成菜鳥、應屆生地去學習。書本是學習的一個捷徑,Google、百度解決問題是快,但不是系統化地學習。看書要了解作者背後的知識底蘊,想一想這個問題得解決作者是怎麼想到的,這樣比單純解決一個問題更進一層。更重要的是聆聽作者的心聲,感受大師的心態。最後給大家推薦”駭客與畫家”這本書,寫得真的很好,老吳不提,我還不知道。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/787895/viewspace-1056937/,如需轉載,請註明出處,否則將追究法律責任。

相關文章