谈谈技术原则,技术学习方法,代码阅读及其它
一、選用技術(shù)的原則
比較規(guī)范的軟件開發(fā)過程要到有限的幾個公司才能學(xué)到。偶現(xiàn)在所采用的方法都是圡方法,主程序員,測試驅(qū)動,文檔和代碼寫在一起,原型。但基本上堅持幾個原則:
在工作上以實用為主導(dǎo),哪個實用學(xué)哪個,要以最小的努力獲取最大的成效。
偶寫過的第一個實用程序是把一個法律光盤導(dǎo)入到數(shù)據(jù)庫中,光盤源文件格式需要分析。數(shù)據(jù)大概幾萬條。一種方法是寫程序直接導(dǎo)入,另一種方法是寫一個界面,手工導(dǎo)入。偶選擇的是后者。程序界面如下:有一個文本框,有一個大按鈕,按鈕有一本書那么大,這樣設(shè)計的原則是讓閉著眼睛就能夠點中。讓一個會灌水的哥們,ctrl + c, ctrl + v,不停的灌。文本貼過去,自動解析,放入數(shù)據(jù)庫。左手alt + tab ctrl + c/v, 右手點鼠標(biāo),這樣有節(jié)奏的運動。很快,幾個小時就把數(shù)據(jù)弄完了。最初設(shè)計的一個文本框,一個按鈕,很pp,但是老點不中。隨即偶才把那個按鈕做成老大的,就這一個改變,生產(chǎn)力提高了1倍以上。
工作,就要堅持這樣的原則。要能夠分辨出價值,找能夠提高價值的去做。即使這樣違背一般規(guī)律,違背技術(shù)教條。
學(xué)習(xí)上以簡單,核心的東東為主。可學(xué)可不學(xué)的不要學(xué)。復(fù)雜的東西除非你想要成為這方面的專家,就不要學(xué)。偶還是舉自己的一個例子,前一陣做GIS有需求,具體實現(xiàn)偶負責(zé)。預(yù)算很少。偶就定了開源GIS軟件這條路,本來想用C#的,但沒有好用的開源GIS軟件,偶決定用java寫。偶手下還沒會java的。偶選擇了一個開源lib,讓一個哥們運行一個Demo,然后讓他從那個Demo的main函數(shù)畫函數(shù)調(diào)用圖一直畫到數(shù)據(jù)庫調(diào)用。偶呢,跑去看GIS規(guī)范,然后他的圖,結(jié)合偶的規(guī)范知識,很快就知道這個軟件中間分了多少層,每個層每個接口是干什么用的,怎么調(diào)用。這個軟件的優(yōu)點缺點。然后體系結(jié)構(gòu),設(shè)計就出來了,然后2個java程序員,很快就做出來了。
二、技術(shù)學(xué)習(xí)的技巧
借著上面例子說說學(xué)習(xí)軟件的技巧
要學(xué)一個東西,要學(xué)習(xí)該東西的兩類知識:結(jié)構(gòu)和細節(jié)。
結(jié)構(gòu)性的東東非常重要.學(xué)習(xí)結(jié)構(gòu),就可以開始干事了,學(xué)習(xí)細節(jié),能夠把這件事情干好。結(jié)構(gòu)不清楚,細節(jié)再好都不算了解。結(jié)構(gòu)很簡單,就是縱,橫兩條線。縱的來說,就是一個程序的執(zhí)行,你得知道哪一步在做什么。以ASP.Net來說,就是從收到Request到返回一個頁面,中間的調(diào)用過程,這是主線,再進一步,程序的加載->接收Request(->緩存,Session機制)->返回一個Page,這個過程清楚,Asp.Net也就差不多了。縱向一般是通過接口調(diào)用的,看源代碼很快就可以搞定。
橫向就是看看重要的接口,重要的抽象類有哪些實現(xiàn),知道哪個實現(xiàn)用于什么地方,有什么優(yōu)缺點。那么就算在結(jié)構(gòu)上學(xué)好了。剩下的就是細節(jié)問題了。細節(jié)問題熟練自然很好,不熟練google都能google到,只是要花很多時間。這樣學(xué)習(xí)我覺得是最有效的學(xué)習(xí),不必去跟蹤技術(shù)前沿,當(dāng)一個技術(shù)在你眼前你很快就可以看出它的骨架,優(yōu)點缺點,性能,至少能估計到大致的范圍。這樣慢慢培養(yǎng)對一個技術(shù)的悟性,做到舉重若輕,知道什么地方可能有陷阱,什么地方可能有創(chuàng)新。把握住重點和脈絡(luò)。
細節(jié)上就是不斷實踐,不斷重構(gòu)。一個有用的軟件,不斷提出更高的要求,不斷重構(gòu),用不了幾遍,幾種重要的設(shè)計模式就了熟于心了。單為學(xué)習(xí)模式而去學(xué)習(xí)模式是不可取的。每個模式都針對一定的問題。深入理解這些問題才是學(xué)習(xí)的關(guān)鍵!技術(shù)是多種多樣的,是變化非常快的,但是技術(shù)所要解決的問題卻并不多。
從架構(gòu)級別來說,所面臨的問題主要有:(1)解決復(fù)雜性--如何把復(fù)雜變得簡單?這里的觀點就是封裝,OO是一種封裝,還有別的封裝方式。《重構(gòu)》書中講了很關(guān)鍵的一點,就是要使你的類名,方法名能清晰表明它的身份和功能。(2)解決程序演化與擴展的問題--組合優(yōu)先繼承,怎么暴露API,怎么寫文檔,總之,讓程序演化與擴展越簡單越好;(3)性能問題--80/20原則,性能測試怎么測試,怎么評估,不同使用場景中的性能,緩存機制;(4)功能問題--主要功能總得實現(xiàn)吧,這個和業(yè)務(wù)有關(guān);(5)易用性;(6)縱向擴展,橫向擴展,并發(fā)......(7)自己開發(fā)還是采用第三方插件還是外包以及選擇問題。
具體的學(xué)習(xí),偶推薦問題導(dǎo)向,案例為基礎(chǔ)的學(xué)習(xí),不要拘泥于語言,要學(xué)習(xí)能學(xué)習(xí)到的最好的東東。比如,性能的關(guān)鍵在調(diào)度,這時候可以看看資源調(diào)度模式,hibernate算是把資源調(diào)度玩到了極致。基于事件的調(diào)度(如.net中的web cache),進程調(diào)度,線程調(diào)度,工作流,這些都算是行為調(diào)度,要是把這些東東融會貫通,掌握每一種實現(xiàn)的優(yōu)點缺點。那么軟件設(shè)計中所有和時間、并發(fā)、資源相關(guān)的東東都不在話下了。行為調(diào)度可以看看.net 中的cache實現(xiàn),找一個工作流軟件看看,找找?guī)讉€線程框架看看,看看幾個典型操作系統(tǒng)的進程調(diào)度機制。
具體到實現(xiàn)上,所面臨的問題無非是:
(1)對象的創(chuàng)建及銷毀;(2)對象的封裝和繼承體系;(3)對象的粒度和語義劃分;(4)對象的復(fù)用;(5)對象的測試;(6)對象的持久化;(7)具體的API暴露;(8)常用Collections;(9)算法問題;(10)性能問題;(11)回調(diào);(12)消滅語義溝;(13)我想要和你一起變懶......;(14)我能采用哪些API(15)對象的管理;(16)異步調(diào)用;(17)遠程調(diào)用
具體問題不多,每一個問題又有一些使用場景,每一個場景可以采用幾種模式實現(xiàn),每種模式有哪些變種,模式和變種有哪些優(yōu)點缺點......要了解這些可不容易拿對象的創(chuàng)建來說吧,有這些情況:
(1)一錘子買賣:直接new就行了
(2)你是我的唯一:單例
(3)千年等一回:對象池,原型,緩存
(4)似曾相識燕歸來:享元
(5)我看過GOF:工廠,抽象工廠
(6)不要問我從哪里來:IOC
具體到實現(xiàn)中,細節(jié)也很重要。但所謂的細節(jié),涉及的方面扯過來扯過去就那幾點。再向上一級別的實現(xiàn),無非就是UI,業(yè)務(wù),數(shù)據(jù)接入這三層,再加入一個集成層也可以。UI無非就是那幾種模式,用的多無非就是以模板為主的和以控制為主的,業(yè)務(wù)上耷拉耷拉還有一些主要的模式,數(shù)據(jù)接入主要就是那三種模式。ADO.Net細分下去也有兩種使用模式。數(shù)據(jù)庫有要錢的有不要錢的有進程外的有進程內(nèi)的有復(fù)雜的有簡單的。文件有普通文件有帶索引的文件有html,xml等有特定格式的文件,碰上這些怎么操作。
三、對MSF的一點心得
軟件過程控制方面主要也是解決一些問題。代碼、Bug,需求,文檔,交流,發(fā)布,風(fēng)險.偶從MSF中學(xué)到的唯一的東東是Tradeoff(權(quán)衡/取舍)。MSF的最有價值的思想應(yīng)該就是取舍。要達到什么目的,給定什么,選擇什么,放棄什么。偶兩年前對MSF有過很長一段時間研究,寫過一篇Case(放在網(wǎng)上某庫,看要花錢買,嘿嘿)。以前軟件主要用于工業(yè)用途,穩(wěn)定性很重要,程序老掛可不得了。90年代初軟件應(yīng)用從工業(yè)領(lǐng)域過渡到普通應(yīng)用領(lǐng)域,功能和可獲得性變得很重要,穩(wěn)定性大家不看重,Windows脫穎而出。MSF最初版本就是那幾年成型的,從那開始,微軟的Trade-off基本上是進度優(yōu)先于功能,功能優(yōu)先于穩(wěn)定性,安全性。最近微軟的Trade-off變了,穩(wěn)定性,安全性排的比較靠前。當(dāng)年背景是微軟開發(fā)隊伍變大了,開發(fā)管理有些混亂。于是微軟組織了一批高手,總結(jié)開發(fā)過程中的經(jīng)驗,形成MSF最初版。隨著時代發(fā)展,MSF逐漸演化成現(xiàn)在的版本。當(dāng)前的MSF被微軟當(dāng)作一個過程方法,向外界推廣。偶的看法是,MSF首先是微軟自己成功經(jīng)驗的總結(jié),其次才是一種可參考的過程方法。MSF是教怎么成功的開發(fā)軟件產(chǎn)品,而不是怎么達到項目需求。并且,MSF不是普適的。有一本書,叫做《自適應(yīng)軟件開發(fā)》,那本書實際上是MSF的最佳詮釋,只有在什么樣的組織里應(yīng)用這種方法那本書分析得很透徹。
四、四個方法
歸納起來,大概偶覺得有用的方法就是這四種:
拜師學(xué)藝:以案例為主的學(xué)習(xí),第一手資料最可靠。多看源碼,多看現(xiàn)有方案。沒事多寫代碼。
左右互博:同樣的問題,多學(xué)習(xí)多研究幾種解決方案。只學(xué)習(xí)一種容易障目,不通過比較,不能清楚某種軟件,某種解決方案,某種設(shè)計模式的優(yōu)缺點。在時間可能的情況下,多試一試不同的解決方法。
庖丁解牛:拿到東西就橫豎兩刀,分成橫向的肋骨和縱向的脊椎,剩下的都是皮肉。對于絕大多數(shù)OO軟件都實用。不實用不是你的問題,是軟件寫的有問題。對于自己寫的軟件,沒事也可以試一試劈一下,軟件沒嘩啦嘩啦散開證明寫的有問題。
吸星大法:任何軟件都有歷史問題,任何方法都有歷史問題。軟件要兼容呀,公司要宣傳呀,所以很多東東不是它表面的那樣。.net對底層綁定的那么厲害,這些都是歷史遺留問題。所以,學(xué)習(xí)一個東東,最好向前翻幾個版本,看看在該軟件演化過程中發(fā)生了哪些故事,這些故事的背景是什么,每個故事都意味著一些trade-off,從中間可以學(xué)習(xí)很多軟件設(shè)計知識,這樣學(xué)習(xí),相當(dāng)于把別人的實戰(zhàn)經(jīng)驗據(jù)為己有,多爽啊。這樣做的另一個意義是可以培養(yǎng)自己對技術(shù)的預(yù)測能力,比別人多看一步就是一個很大的優(yōu)勢。
五、閱讀代碼的技巧
對OO來說,一般一個500~1000個類的庫/軟件,主要的類或接口大概在10~20個左右,一般來說,這些類構(gòu)成一個層次關(guān)系.每一層,這些類或接口會有一大堆子類/實現(xiàn).大概在數(shù)百個左右.剩下的類基本上都是工具類,輔助類,獲取特定資源的類.第一步應(yīng)該是找到這些主要的類和接口,找出主要的調(diào)用過程,清楚這個過程.這樣,差不多就明白這個軟件/庫是怎么工作的了.第二步,是看這些主要類,接口的繼承/實現(xiàn),這樣可以了解這個軟件/庫可以做什么,怎么擴展.這樣,一個數(shù)M代碼量的東東,可以在2~3天的時間里把它弄清楚.
閱讀代碼的主要難度就是代碼量太大,但是OO極大的減低了代碼閱讀的難度,好的OO軟件一看見namespace, 類名,方法名就知道干什么的(在閱讀較多代碼后就能形成這種直覺)就不必要去閱讀具體的代碼了.閱讀的難度通過工具能降低很多:通過逆向工程獲得類圖和主要調(diào)用過程的序列圖,通過這兩圖的閱讀,就差不多了.Ndoc,Visio,doxygen,甚至word都是有用的輔助工具。實在不能明白的就看代碼.軟件的骨架大概就是這些,除此之外,每個軟件可能會涉及到一兩種核心的算法或它獨特的數(shù)據(jù)抽象(數(shù)據(jù)結(jié)構(gòu)),實現(xiàn)某種規(guī)范或者某種已知的算法,這時候看看這些規(guī)范或已知的算法,結(jié)合代碼很快就理解了.此外,還有一些細節(jié)性知識分散在那些輔助類里面,了解骨架后,對這些東東大概有個底了,但不能準(zhǔn)確的確定.這時候google,看看大家怎么用的,有什么注意事項.閱讀代碼如果順序不對,第一頭就扎進這些細節(jié),那就完了.對主要流程的掌握和對層次的掌握是第一位的.對設(shè)計模式的了解還是其次. 還有很多非OO軟件,采用這種方法,也是很容易讀的.比如,閱讀協(xié)議棧代碼,跟著一個包走一圈.在企業(yè)中,圍著一個訂單走一圈.這些都是非常有效的處理復(fù)雜系統(tǒng)的方法.在OO中嘛,就是跟著方法走一圈.選中一個方法,跟著它走一圈.這個方法選的好的話,這一圈基本上就把這個軟件/庫轉(zhuǎn)個差不多了.在這個過程中可能要碰到幾十個對象,上百個方法調(diào)用,搞懂了,就差不多了.但是,閱讀主線不能亂.
轉(zhuǎn)載于:https://www.cnblogs.com/raincedar/p/10374508.html
總結(jié)
以上是生活随笔為你收集整理的谈谈技术原则,技术学习方法,代码阅读及其它的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UnicodeMath数学公式编码_翻译
- 下一篇: 使用phpstorm+wamp实现php