優秀程式設計師思考、學習新技術的原則和方式
先看下面這樣的困惑:
最近了解了幾個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的例子,就是一個極好的回饋;理解某一項實現原理,聯想到其它類似的實現,產生一種恍然大悟的感覺,也是一種回饋。在學習的過程中,不斷產生回饋,意味著你不斷地收穫成就感,這是繼續下去的動力之一。
相關文章
- 一個優秀的程式設計師應有的產品觀和技術觀程式設計師
- 優秀元件設計的關鍵:自私原則"元件
- 10個程式設計好習慣:優秀程式設計師的經驗分享程式設計師
- 【溫故知新】 程式設計原則和方法論程式設計
- 程式設計師、技術主管和架構師程式設計師架構
- Java程式設計師總結出的技術以及學習方法Java程式設計師
- 好程式設計師大資料入門學習之Hadoop技術優缺點程式設計師大資料Hadoop
- Java程式設計師如何成為優秀的架構師Java程式設計師架構
- 好程式設計師Java培訓Java程式設計師必學技術程式設計師Java
- 優秀程式設計師都在注意的十個點程式設計師
- 優秀的程式設計師都熱愛寫作程式設計師
- 《程式設計師的數學》思考題(一)程式設計師
- Java程式設計師如何正確地學習新的知識,擴充自己的技術棧Java程式設計師
- 優秀程式設計師,如何提高架構能力?程式設計師架構
- 一款優秀的 SDK 介面設計十大原則。
- 程式設計師測試原則 - Kent Beck程式設計師
- 優秀的程式設計師真的不寫註釋嗎?程式設計師
- 2019如何成為一個優秀的程式設計師程式設計師
- 程式設計師的技術遺產程式設計師
- 初學者成為優秀Java程式設計師的8個步驟!Java程式設計師
- Kafka中非常值得學習的優秀設計Kafka
- 優秀設計的十大準則(上)
- 優秀設計的十大準則(下)
- 新Rust程式設計師需要學習的9個功能Rust程式設計師
- 浪潮之巔,程式設計師如何擁抱新技術?程式設計師
- 好程式設計師Java學習路線分享JavaEE的13種核心技術程式設計師Java
- 下篇:技術 Leader 的思考方式
- Java外包程式設計師的技術出路Java程式設計師
- 程式設計師技術入股的那些坑程式設計師
- C#設計模式學習筆記:設計原則C#設計模式筆記
- 本著什麼原則,才能寫出優秀的程式碼?
- 我是如何學習一門程式設計技術的?程式設計
- 幽默:優秀程式設計師過馬路看兩邊程式設計師
- 優秀程式設計師都在用哪些Chrome擴充工具?程式設計師Chrome
- .NET 雲原生架構師訓練營(設計原則&&設計模式)--學習筆記架構設計模式筆記
- UI設計師必學教程:互動設計心理學的古騰堡原則UI
- PHP 程式設計師的堆學習PHP程式設計師
- 大齡程式設計師思考程式設計師
- UI設計培訓學習中必須掌握的設計原則UI