談談技術學習方法和個人總結的範文
談談技術學習方法和個人總結的範文
一、選用技術的原則
比較規範的軟體開發過程要到有限的幾個公司才能學到。偶現在所採用的方法都是圡方法,主程式設計師,測試驅動,文件和程式碼寫在一起,原型。但基本上堅持幾個原則:
在工作上以實用為主導,哪個實用學哪個,要以最小的努力獲取最大的成效。
偶寫過的第一個實用程式是把一個法律光碟匯入到資料庫中,光碟原始檔格式需要分析。資料大概幾萬條。一種方法是寫程式直接匯入,另一種方法是寫一個介面,手工匯入。偶選擇的是後者。程式介面如下:有一個文字框,有一個大按鈕,按鈕有一本書那麼大,這樣設計的原則是讓閉著眼睛就能夠點中。讓一個會灌水的哥們,ctrl+c,ctrl+v,不停的灌。文字貼過去,自動解析,放入資料庫。左手alt+tabctrl+c/v,右手點滑鼠,這樣有節奏的運動。很快,幾個小時就把資料弄完了。最初設計的一個文字框,一個按鈕,很pp,但是老點不中。隨即偶才把那個按鈕做成老大的,就這一個改變,生產力提高了1倍以上。
工作,就要堅持這樣的原則。要能夠分辨出價值,找能夠提高價值的去做。即使這樣違背一般規律,違背技術教條。
學習上以簡單,核心的東東為主。可學可不學的不要學。複雜的東西除非你想要成為這方面的專家,就不要學。偶還是舉自己的一個例子,前一陣做GIS有需求,具體實現偶負責。預算很少。偶就定了開源GIS軟體這條路,本來想用C#的,但沒有好用的開源GIS軟體,偶決定用java寫。偶手下還沒會java的。偶選擇了一個開源lib,讓一個哥們執行一個Demo,然後讓他從那個Demo的main函式畫函式呼叫圖一直畫到資料庫呼叫。偶呢,跑去看GIS規範,然後他的圖,結合偶的規範知識,很快就知道這個軟體中間分了多少層,每個層每個介面是幹什麼用的,怎麼呼叫。這個軟體的優點缺點。然後體系結構,設計就出來了,然後2個java程式設計師,很快就做出來了。
二、技術學習的技巧
藉著上面例子說說學習軟體的技巧
要學一個東西,要學習該東西的兩類知識:結構和細節。
結構性的東東非常重要.學習結構,就可以開始幹事了,學習細節,能夠把這件事情幹好。結構不清楚,細節再好都不算了解。結構很簡單,就是縱,橫兩條線。縱的來說,就是一個程式的執行,你得知道哪一步在做什麼。以ASP.Net來說,就是從收到Request到返回一個頁面,中間的呼叫過程,這是主線,再進一步,程式的載入->接收Request(->快取,Session機制)->返回一個Page,這個過程清楚,Asp.Net也就差不多了。縱向一般是透過介面呼叫的,看原始碼很快就可以搞定。
橫向就是看看重要的介面,重要的抽象類有哪些實現,知道哪個實現用於什麼地方,有什麼優缺點。那麼就算在結構上學好了。剩下的就是細節問題了。細節問題熟練自然很好,不熟練google都能google到,只是要花很多時間。這樣學習我覺得是最有效的學習,不必去跟蹤技術前沿,當一個技術在你眼前你很快就可以看出它的骨架,優點缺點,效能,至少能估計到大致的範圍。這樣慢慢培養對一個技術的.悟性,做到舉重若輕,知道什麼地方可能有陷阱,什麼地方可能有創新。把握住重點和脈絡。
細節上就是不斷實踐,不斷重構。一個有用的軟體,不斷提出更高的要求,不斷重構,用不了幾遍,幾種重要的設計模式就了熟於心了。單為學習模式而去學習模式是不可取的。每個模式都針對一定的問題。深入理解這些問題才是學習的關鍵!技術是多種多樣的,是變化非常快的,但是技術所要解決的問題卻並不多。
從架構級別來說,所面臨的問題主要有:(1)解決複雜性--如何把複雜變得簡單?這裡的觀點就是封裝,OO是一種封裝,還有別的封裝方式。《重構》書中講了很關鍵的一點,就是要使你的類名,方法名能清晰表明它的身份和功能。(2)解決程式演化與擴充套件的問題--組合優先繼承,怎麼暴露API,怎麼寫文件,總之,讓程式演化與擴充套件越簡單越好;(3)效能問題--80/20原則,效能測試怎麼測試,怎麼評估,不同使用場景中的效能,快取機制;(4)功能問題--主要功能總得實現吧,這個和業務有關;(5)易用性;(6)縱向擴充套件,橫向擴充套件,併發......(7)自己開發還是採用第三方外掛還是外包以及選擇問題。
具體的學習,偶推薦問題導向,案例為基礎的學習,不要拘泥於語言,要學習能學習到的最好的東東。比如,效能的關鍵在排程,這時候可以看看資源排程模式,hibernate算是把資源排程玩到了極致。基於事件的排程(如.net中的webcache),程序排程,執行緒排程,工作流,這些都算是行為排程,要是把這些東東融會貫通,掌握每一種實現的優點缺點。那麼軟體設計中所有和時間、併發、資源相關的東東都不在話下了。行為排程可以看看.net中的cache實現,找一個工作流軟體看看,找找幾個執行緒框架看看,看看幾個典型作業系統的程序排程機制。
具體到實現上,所面臨的問題無非是:
(1)物件的建立及銷燬;(2)物件的封裝和繼承體系;(3)物件的粒度和語義劃分;(4)物件的複用;(5)物件的測試;(6)物件的持久化;(7)具體的API暴露;(8)常用Collections;(9)演算法問題;(10)效能問題;(11)回撥;(12)消滅語義溝;(13)我想要和你一起變懶......;(14)我能採用哪些API(15)物件的管理;(16)非同步呼叫;(17)遠端呼叫