優秀程序員思考、學習新技術的原則和方式

 

  先看下面這樣的困惑:html

  最近了解了幾個MVC的框架,其中有兩個是公司內部的。發現這些東西都是相似的,從處理邏輯到頁面渲染;從service到layout;配置的實現無非就是XML,或者annotation……我有種感受,興許已經跳不出這個思惟圈子了?前端

  現在的時代,是一個概念翻飛的時代,oschina裏的開源軟件數量就已經超過了兩萬,五花八門的技術層出不窮,到底什麼技術纔是值得學習的?程序員

  有位朋友說,他想學習一些關於Android上的開發技術,興趣驅使。幾個月過去了,他說他已經能作出許多小程序了,但是他如今回想起來,掌握一門技術是好,可興趣以外還有什麼呢?他說,「若是個人工做中不使用Android平臺,我學它還有何用?」。面試

  學習技術究竟是一件有意思的事,仍是一件痛苦的事?讀書的時候,我曾經買過侯捷翻譯的《深刻淺出MFC》,對那時的我來講,彷佛太困難了一點,我強迫本身看完了三分之一,實在是沒有毅力繼續往下讀了。我在其中察覺不到快樂,這本書在當時彷佛充滿了生澀。小程序

  如上這樣的故事太多了,不少時候,程序員們(包括我在內)辛苦地學習,有的沒有好的效果,有的過程充滿痛苦,有的更是不知道我學它的目的是什麼。後端

  國內的教育體制,培養了這樣一批人:網絡

  他們努力、奮進,熱愛技術,願意投身軟件行業,願意寫出高質量的代碼,他們對業界的東西很感興趣,他們願意學習紮實的基礎知識,他們渴求火熱的新技術……架構

  幾年之後,他們擁有普遍的視野,閱歷寬闊、經驗老到、言辭犀利,對行業動態瞭如指掌,顯然,他們是行業的博學者。框架

  然而……學習

  他們卻缺少這樣一種能力——思考。

  欠缺思考容易致使這樣的現象:

  不會作設計

  遇到了問題,拿見到過的、學到了的熟悉的框架、方案、模式往上套,而不仔細分析其中的利弊,只是儘量地尋找最接近當前問題的解決途徑。

  有的是不會作系統設計。和少數所謂的「架構師」接觸過,他們「只懂業務,不懂技術」,這樣設計出來的系統只能知足功能性需求;而論壇上的一些具體問題的討論話題,則暴露出一些跟帖討論者「只談技術,不提業務」,譬如「XXX大容量的解決方案」、「秒殺系統的終極架構」,企圖對某一類寬泛的問題,設計出一套放之四海皆準的通用解決方案。

  還有的則是不會作面向對象設計,缺乏抽象和解耦的能力,這樣的例子就更多了。朋友告訴我,他的單位有一位寫Ruby的老員工,一個龐大的工程,代碼裏面竟然只有一個上帝類,就搞定了全部的問題。

  不能堅持本身的觀點

  這一點在面試中最容易觀察到。應聘者有剛畢業的學生,也有工做超過10年的有豐富經驗的從業者。他給出一個粗略的方案之後,在方案沒有細化到必定程度之前,很難給出優劣的評論,可是,若是你輕輕地challenge一下,他就迅速放棄原本的構思,跑到你的思路上來。

  例如,SNS系統中,服務端有消息要怎樣通知到客戶端,這樣的一個問題,解決方案有不少種,好比客戶端輪詢、服務端hold住鏈接推送等,各有利弊。應聘者應當有本身的觀點。

  不能細化一個問題解決方案

  怎樣區分一個空談家和一個實幹家?給他一個具體的問題是最好的辦法。在我剛工做的時候,我曾經很欽佩那些在活動中、討論中高談闊論的人,我以爲他們很能說。但是後來我逐漸發現,能說的人實在是太多太多了。細化設計、甚至落到編碼,纔是對一個程序員真實的檢驗。固然,若是你以爲作軟件設計的人能夠不熟悉編碼、架構師能夠不首先是一名高級程序員,那咱們也沒有什麼可談了:)。

  若是你會學習,你能夠成長得很快;若是你不會思考,你永遠只能跟在別人後面。

  在新技術的學習上我認爲也應當多思考,不一樣的人有不一樣的學習動機。在非外界所迫的狀況下,對於新技術的學習,個人觀點能夠歸納爲:

  它要解決什麼問題,就是所謂的問題域,是我關心的嗎?

  我沒有去研究操做系統底層的實現,並不是這沒有價值,而是我沒有興趣,這就是問題域的影響(不過如今我有興趣了,我想作一些這方面的事情)。

  和過往解決方案它的優點在哪裏,是否顯著?

  這是competition,重複的技術是沒有生存空間的(固然,你是微軟的話除外:)),就像互聯網同一個類型的網站,競爭到最後就那麼兩三家。就像Groovy,我很喜歡它,可是有了Scala之後,我以爲興許有一個要死掉(Groovy創始人說,若是他早些知道Scala的話,就沒有Groovy什麼事了。具體的報道請去Google上搜他的blog)。

  它的實現和帶來的效果上看,有沒有頗有意思的思路,是值得借鑑和思考的?

  這是最難講的一個問題。以去年初開始接觸的Node.js爲例,它能夠作到把後端的聚合(譬如portlet之流)放到前端來,後端只保留一種類型的頁面服務——頁面模板,以及若干易於管理的API接口,大大簡化了後端體系的複雜度,並且還能把壓力分散到前端來,這是我早些年未曾見到的。

  這三個問題想過以後,以爲有價值,我纔去學習。要否則,對我而言就是不想深刻的東西,瞭解瞭解也就罷了。

  新技術學習的方式呢,我想說這麼幾點:

  尋找切入點

  我很喜歡BlueDavy的blog上的一句話:「理論不懂就實踐,實踐不會就學理論!」。

  最後最好是要落到動手實踐上去的,可是假若習慣從那些原理介紹的文字入手,何嘗不是一種很差的選擇。並且,現實狀況會有一些約束,例如在瞭解幾家互聯網公司的雲平臺的時候(Amazon的EC2,M$的Azure等等),除非你是這幾家公司的員工,不然是很難深刻其中的。

  尋找本身的興趣點

  學習應當是一件有意思的事情,當你的大腦排斥它的時候,我不相信能夠很容易地掌握這門新技術。若是你找不到興趣點,那麼,不妨回到我前文對於新技術是否值得你學習的觀點上去,既然你沒有什麼興趣,你學它幹嗎?西安軟件培訓

  善於比較

  比較是一種很是容易上手的思考方式,和什麼比較?和類似技術比較,和操做系統、網絡這些基礎設施上面的例子比較,最後,和生活中的例子比較(譬如,JAVANIO的實現是一個很好的例子)。

  不斷得到回饋

  回饋是什麼?作出一個HelloWorld的例子,就是一個極好的回饋;理解某一項實現原理,聯想到其它相似的實現,產生一種恍然大悟的感受,也是一種回饋。在學習的過程當中,不斷產生回饋,意味着你不斷地收穫成就感,這是繼續下去的動力之一。

相關文章
相關標籤/搜索