談談技術學習方法和個人總結的範文

一、選用技術的原則

談談技術學習方法和個人總結的範文

比較規範的軟件開發過程要到有限的幾個公司才能學到。偶現在所採用的方法都是圡方法,主程序員,測試驅動,文檔和代碼寫在一起,原型。但基本上堅持幾個原則:

在工作上以實用爲主導,哪個實用學哪個,要以最小的努力獲取最大的成效。

偶寫過的第一個實用程序是把一個法律光盤導入到數據庫中,光盤源文件格式需要分析。數據大概幾萬條。一種方法是寫程序直接導入,另一種方法是寫一個界面,手工導入。偶選擇的是後者。程序界面如下:有一個文本框,有一個大按鈕,按鈕有一本書那麼大,這樣設計的原則是讓閉着眼睛就能夠點中。讓一個會灌水的哥們,ctrl+c,ctrl+v,不停的灌。文本貼過去,自動解析,放入數據庫。左手alt+tabctrl+c/v,右手點鼠標,這樣有節奏的運動。很快,幾個小時就把數據弄完了。最初設計的一個文本框,一個按鈕,很pp,但是老點不中。隨即偶才把那個按鈕做成老大的,就這一個改變,生產力提高了1倍以上。

工作,就要堅持這樣的原則。要能夠分辨出價值,找能夠提高價值的去做。即使這樣違背一般規律,違背技術教條。

學習上以簡單,核心的東東爲主。可學可不學的不要學。複雜的東西除非你想要成爲這方面的專家,就不要學。偶還是舉自己的一個例子,前一陣做GIS有需求,具體實現偶負責。預算很少。偶就定了開源GIS軟件這條路,本來想用C#的,但沒有好用的開源GIS軟件,偶決定用java寫。偶手下還沒會java的。偶選擇了一個開源lib,讓一個哥們運行一個Demo,然後讓他從那個Demo的main函數畫函數調用圖一直畫到數據庫調用。偶呢,跑去看GIS規範,然後他的圖,結合偶的規範知識,很快就知道這個軟件中間分了多少層,每個層每個接口是幹什麼用的,怎麼調用。這個軟件的優點缺點。然後體系結構,設計就出來了,然後2個java程序員,很快就做出來了。

二、技術學習的技巧

藉着上面例子說說學習軟件的技巧

要學一個東西,要學習該東西的兩類知識:結構和細節。

結構性的東東非常重要.學習結構,就可以開始幹事了,學習細節,能夠把這件事情幹好。結構不清楚,細節再好都不算了解。結構很簡單,就是縱,橫兩條線。縱的來說,就是一個程序的執行,你得知道哪一步在做什麼。以來說,就是從收到Request到返回一個頁面,中間的調用過程,這是主線,再進一步,程序的加載->接收Request(->緩存,Session機制)->返回一個Page,這個過程清楚,也就差不多了。縱向一般是通過接口調用的,看源代碼很快就可以搞定。

橫向就是看看重要的接口,重要的抽象類有哪些實現,知道哪個實現用於什麼地方,有什麼優缺點。那麼就算在結構上學好了。剩下的就是細節問題了。細節問題熟練自然很好,不熟練google都能google到,只是要花很多時間。這樣學習我覺得是最有效的學習,不必去跟蹤技術前沿,當一個技術在你眼前你很快就可以看出它的骨架,優點缺點,性能,至少能估計到大致的範圍。這樣慢慢培養對一個技術的.悟性,做到舉重若輕,知道什麼地方可能有陷阱,什麼地方可能有創新。把握住重點和脈絡。

細節上就是不斷實踐,不斷重構。一個有用的軟件,不斷提出更高的要求,不斷重構,用不了幾遍,幾種重要的設計模式就了熟於心了。單爲學習模式而去學習模式是不可取的。每個模式都針對一定的問題。深入理解這些問題纔是學習的關鍵!技術是多種多樣的,是變化非常快的,但是技術所要解決的問題卻並不多。

從架構級別來說,所面臨的問題主要有:(1)解決複雜性--如何把複雜變得簡單?這裏的觀點就是封裝,OO是一種封裝,還有別的封裝方式。《重構》書中講了很關鍵的一點,就是要使你的類名,方法名能清晰表明它的身份和功能。(2)解決程序演化與擴展的問題--組合優先繼承,怎麼暴露API,怎麼寫文檔,總之,讓程序演化與擴展越簡單越好;(3)性能問題--80/20原則,性能測試怎麼測試,怎麼評估,不同使用場景中的性能,緩存機制;(4)功能問題--主要功能總得實現吧,這個和業務有關;(5)易用性;(6)縱向擴展,橫向擴展,併發......(7)自己開發還是採用第三方插件還是外包以及選擇問題。

具體的學習,偶推薦問題導向,案例爲基礎的學習,不要拘泥於語言,要學習能學習到的最好的東東。比如,性能的關鍵在調度,這時候可以看看資源調度模式,hibernate算是把資源調度玩到了極致。基於事件的調度(如中的webcache),進程調度,線程調度,工作流,這些都算是行爲調度,要是把這些東東融會貫通,掌握每一種實現的優點缺點。那麼軟件設計中所有和時間、併發、資源相關的東東都不在話下了。行爲調度可以看看中的cache實現,找一個工作流軟件看看,找找幾個線程框架看看,看看幾個典型操作系統的進程調度機制。

具體到實現上,所面臨的問題無非是:

(1)對象的創建及銷燬;(2)對象的封裝和繼承體系;(3)對象的粒度和語義劃分;(4)對象的複用;(5)對象的測試;(6)對象的持久化;(7)具體的API暴露;(8)常用Collections;(9)算法問題;(10)性能問題;(11)回調;(12)消滅語義溝;(13)我想要和你一起變懶......;(14)我能採用哪些API(15)對象的管理;(16)異步調用;(17)遠程調用