關(guān)于經(jīng)驗(yàn)
關(guān)于經(jīng)驗(yàn)的積累跟項(xiàng)目有一定的關(guān)系,但并不是全部。對(duì)于ASP.NET 開(kāi)發(fā)大部分可能會(huì)有這么一個(gè)過(guò)程:
首先是覺(jué)得服務(wù)器控件挺好用的,在開(kāi)發(fā)中大量使用服務(wù)器控件;
經(jīng)過(guò)一段時(shí)間的開(kāi)發(fā)之后(也可能是聽(tīng)別人說(shuō)),會(huì)發(fā)現(xiàn)服務(wù)器控件并不是想象中完美無(wú)缺,在VS2010 之前很多 ASP.NET 控件默認(rèn)會(huì)啟用 ViewState 來(lái)保存控件狀態(tài),這樣在最終生成的 HTML 頁(yè)面的源代碼中生成了大段的隱藏域字段,影響了網(wǎng)頁(yè)的傳輸速度,慢慢地我們會(huì)發(fā)現(xiàn)其實(shí) ASP.NET 服務(wù)器控件最終到客戶端時(shí)會(huì)被轉(zhuǎn)換 HTML 代碼,那么使用 HTML 服務(wù)器控件也是可以的,并且還省去了轉(zhuǎn)換這個(gè)過(guò)程,所以在開(kāi)發(fā)時(shí)盡量不處處使用服務(wù)器控件;
再經(jīng)過(guò)一段時(shí)間之后,我們會(huì)發(fā)現(xiàn)有些復(fù)雜的效果與其去層層嵌套服務(wù)器控件,還不如直接將這部分特殊效果的HTML 代碼輸出,這樣更方便快捷,然后我們也會(huì)想到有些操作其實(shí)用 JavaScript 也可以在客戶端實(shí)現(xiàn)而不是必須要提交到服務(wù)器端才能處理,這樣又提高了效率;
再過(guò)一陣子之后,我們會(huì)覺(jué)得SELECT * FROM Table 盡管什么時(shí)候都不會(huì)出錯(cuò),但是并不是最高效的,在某些時(shí)候我們只 SELECT 要顯示的字段,除此之外當(dāng)數(shù)據(jù)庫(kù)中的記錄一多時(shí)每次都將數(shù)據(jù)庫(kù)中的記錄全部查出來(lái)再取出需要顯示的部分不顯示的數(shù)據(jù)被棄之不用很浪費(fèi)資源,所以會(huì)想到使用分頁(yè)查詢每次只查詢當(dāng)前頁(yè)所需要的數(shù)據(jù);
再過(guò)一陣子之后我們又會(huì)覺(jué)得原來(lái)那種對(duì)數(shù)據(jù)庫(kù)執(zhí)行增刪改查的操作的代碼每頁(yè)都有,非常不好維護(hù),第一步分析之后會(huì)想到使用數(shù)據(jù)庫(kù)通用類,再仔細(xì)分析之后可能就會(huì)發(fā)現(xiàn)三層架構(gòu)的好處進(jìn)而接受了三層架構(gòu)這種思想;
再繼續(xù)思考總結(jié),我們又會(huì)發(fā)現(xiàn)其實(shí)在SQL 方面有很多名堂,比如存儲(chǔ)過(guò)程、觸發(fā)器、函數(shù)、分組函數(shù)、聯(lián)合查詢、 UNION 等,也就是有些結(jié)果可以直接在數(shù)據(jù)庫(kù)里進(jìn)行處理而不是將多次結(jié)果分別取出來(lái)在 C# 中處理,盡管可以實(shí)現(xiàn)同樣的功能,但是在數(shù)據(jù)庫(kù)中處理可能更加方便和直接。
當(dāng)然這些都還是初級(jí)程序員所面臨到的一些問(wèn)題,如果真想提高自己,可能會(huì)注意到更多問(wèn)題。比如到了一定程度之后我們會(huì)接觸到不同的數(shù)據(jù)庫(kù),我們要對(duì)比分析一下這些數(shù)據(jù)庫(kù)之間的異同點(diǎn);我們還會(huì)注意到實(shí)現(xiàn)同一種效果會(huì)有不同的做法,我們要注意不同的做法之間差別——哪種做法效率高?哪種做法占用內(nèi)存???哪種做法安全性高等等。比如做ASP.NET 開(kāi)發(fā),可以使用服務(wù)器控件、可以使用 HTML 客戶端控件、可以采用 Response.Write() 的方法直接輸出及模板替換法,你覺(jué)得它們之間有什么區(qū)別?同樣存儲(chǔ)數(shù)據(jù), Cookie 、 Session 、 Application 及 Cache 都可以保存,它們之間又有什么差別(提示:可以從保存數(shù)據(jù)類型、范圍、保存周期、安全性等方面考慮)?再比如非 ASP.NET 應(yīng)用和 ASP.NET MVC 應(yīng)用之間應(yīng)用有什么區(qū)別?再比如 Convert.ToInt32() 、 int.Parse() 及 Int32.TryParse() 都是可以實(shí)現(xiàn)將字符串轉(zhuǎn)換成 int 類型數(shù)值,它們之間在用法上有什么區(qū)別?有沒(méi)有想過(guò)它們內(nèi)部的實(shí)現(xiàn)呢?如果讓你寫(xiě)一個(gè)類似于 Int32.TryParse() 的方法,你想過(guò)會(huì)怎么寫(xiě)嗎? XML WebService 和 WCF 及 .Net Remoting 之間有可比性嗎?在使用它們時(shí)該考慮哪些因素?參數(shù)化 SQL 語(yǔ)句和非參數(shù)化 SQL 有什么區(qū)別?在存儲(chǔ)過(guò)程中執(zhí)行的一定就是參數(shù)化 SQL 語(yǔ)句嗎? string 和 String 之間是什么關(guān)系?什么叫字符串駐留池?什么叫數(shù)據(jù)庫(kù)連接池,數(shù)據(jù)庫(kù)連接池有什么用途?和諸如此類的問(wèn)題有很多,實(shí)在是舉不勝舉了。
以上的問(wèn)題有多少使你感到難以回答?如果你能比較自信地回答上面的大部分問(wèn)題,恭喜你已經(jīng)具有中級(jí)程序員的開(kāi)發(fā)經(jīng)驗(yàn)了。我不知道辭海里有沒(méi)有對(duì)“工作經(jīng)驗(yàn)”這個(gè)詞下定義,根據(jù)我的理解我覺(jué)得程序員的工作經(jīng)驗(yàn)包含了兩個(gè)方面的經(jīng)驗(yàn):社會(huì)方面的經(jīng)驗(yàn)和技術(shù)方面的經(jīng)驗(yàn)。社會(huì)方面的經(jīng)驗(yàn)包括了比如生活與工作產(chǎn)生了沖突該怎么處理及與領(lǐng)導(dǎo)在某些問(wèn)題上意見(jiàn)不一致該怎么處理等,這個(gè)如果不是應(yīng)聘技術(shù)管理方面的崗位面試單位關(guān)注得比較少。技術(shù)方面的經(jīng)驗(yàn)招聘單位會(huì)更看重一些,通常所說(shuō)的程序員的工作經(jīng)驗(yàn)也主要是指技術(shù)經(jīng)驗(yàn)。它至少包含了以下幾個(gè)方面:
對(duì)于一些常見(jiàn)的編譯錯(cuò)誤和異常描述我們能迅速知道問(wèn)題出在那里并及時(shí)解決;
對(duì)于一些可能會(huì)有多種方法實(shí)現(xiàn)的功能,我們應(yīng)該如何根據(jù)當(dāng)前項(xiàng)目的實(shí)際情況選擇比較合適的方法;
對(duì)于一些容易影響性能的地方我們應(yīng)該知道一些如何提高,如果存在多種解決辦法,如何去評(píng)估那種辦法的效率高;
對(duì)于一些容易發(fā)生安全性問(wèn)題的地方我們應(yīng)該知道如何去防范;
對(duì)于具體的應(yīng)用如何去設(shè)計(jì)數(shù)據(jù)庫(kù)或者去評(píng)估已經(jīng)存在的數(shù)據(jù)庫(kù)的設(shè)計(jì)好壞,如何在第三范式和字段冗余之間取舍;
如何在時(shí)間復(fù)雜度和空間復(fù)雜度之間取舍,知道如何用空間換時(shí)間(比如使用緩存就占用了內(nèi)存但是換來(lái)了效率的提高,但是緩存并不是使用越多越好,此外對(duì)于數(shù)據(jù)庫(kù)中索引字段也存在這樣的問(wèn)題);
對(duì)于常見(jiàn)的問(wèn)題我們應(yīng)該知道如何去處理;
對(duì)于從來(lái)沒(méi)有遇見(jiàn)過(guò)的問(wèn)題我們又該如何借鑒已有的經(jīng)驗(yàn)來(lái)處理而不是束手無(wú)策。
要解答以上問(wèn)題,可能要求我們的知識(shí)面要相對(duì)廣,在某些問(wèn)題上要有一定的深度。實(shí)際上上面的這些問(wèn)題已經(jīng)脫離了語(yǔ)言本身了。在武俠小說(shuō)中經(jīng)常聽(tīng)到高手會(huì)說(shuō)所有的武功最終都是百川歸海,在編程開(kāi)發(fā)中我們經(jīng)常會(huì)聽(tīng)到編程高手會(huì)說(shuō)“語(yǔ)言只是一種實(shí)現(xiàn)手段,重要的是思想”,那么思想到底是什么呢?為什么有人要求在項(xiàng)目中某個(gè)類只允許一個(gè)實(shí)例存在你就會(huì)想到單例模式?這就是經(jīng)驗(yàn),但是經(jīng)驗(yàn)是什么呢?真的不好定義,盡管在上面我列出了經(jīng)驗(yàn)的一些體現(xiàn),但是那并不是全部,我只能說(shuō)“經(jīng)驗(yàn)是一種很玄很玄的東西”。
如何積累經(jīng)驗(yàn)
不要暈,也不要倒,其實(shí)我們有很多辦法增加自己的經(jīng)驗(yàn)。圍繞磨盤(pán)轉(zhuǎn)了一輩子的騾子并不是一頭有經(jīng)驗(yàn)的騾子,將木棍捅到蟻窩中來(lái)捕食螞蟻的熊也沒(méi)有太多經(jīng)驗(yàn),因?yàn)樗鼈冏瞿切┦虑椴皇浅鲇诒恢甘咕褪浅鲇谝环N本能,很少去想是不是可以做得更好,而我們的祖先就做到了,所以今天我們成了世界的主宰。
說(shuō)到這里,也就說(shuō)出了我的第一個(gè)答案: 技術(shù)的深度來(lái)自于總結(jié) 。不管是學(xué)習(xí)還是做項(xiàng)目,不管是自己編寫(xiě)的代碼還是別人的代碼,我們都盡量學(xué)會(huì)分析總結(jié),首先分析一下那些地方做得好,那些地方做得不好,做得好是因?yàn)槭裁捶矫娴脑??安全、高效亦或者是其它?這種好的做法今后可以用在某些場(chǎng)景下?有沒(méi)有可能存在比這些你認(rèn)為做得好的方法還要好的方法?對(duì)于那些做得不好地方,又該如何去改進(jìn)?特別是以前自己所做的項(xiàng)目一定不要做完了就算完了,有時(shí)間一定要拿出來(lái)經(jīng)???,看看最近所學(xué)的知識(shí)有沒(méi)有可以用于改進(jìn)這些項(xiàng)目的。
也許有些朋友特別是初學(xué)編程的朋友會(huì)說(shuō)自己以前根本就沒(méi)有做過(guò)真實(shí)的項(xiàng)目,缺乏實(shí)戰(zhàn)機(jī)會(huì)。光憑自己所做的工作上所做的一些項(xiàng)目可能對(duì)于個(gè)人提高不是很快,會(huì)受到公司業(yè)務(wù)的限制,項(xiàng)目類型不是太多,所需要用到的知識(shí)自然也不會(huì)是太多;或者在一些大公司里面,由于在這里一個(gè)人一個(gè)坑,每個(gè)人的職責(zé)單一,一個(gè)項(xiàng)目做上一年你可能僅對(duì)自己所負(fù)責(zé)的模塊比較熟悉,對(duì)于項(xiàng)目組其他成員的模塊不熟悉,時(shí)間長(zhǎng)了之后就會(huì)感覺(jué)自己進(jìn)步很慢,這種感覺(jué)我以前也有過(guò)。
在當(dāng)時(shí)我做了幾件事情,我現(xiàn)在總結(jié)起來(lái)覺(jué)得比較有用:
一是通過(guò)論壇、博客了解別人在做項(xiàng)目中使用了哪些技術(shù)。多次被提及的多半就是目前大家比較關(guān)心的或者流行的,如果自己的項(xiàng)目中沒(méi)有涉及到這些的話,多了解一下這方面的討論或者文章看是否滿足在自己項(xiàng)目中使用,如果不能的話(比如自己目前是在VS2005 下做開(kāi)發(fā),而別人經(jīng)常談?wù)摰氖?/span> VS2008 下的開(kāi)發(fā))那么就嘗試在下班后或者工作之余動(dòng)手實(shí)踐一下。
二是總結(jié)自己以前所做的項(xiàng)目。很多人在做項(xiàng)目時(shí)鍵盤(pán)上最光亮的鍵就是Ctrl 、 C 及 V (因?yàn)樽罱?jīng)常的操作是 Ctrl+C 和 Ctrl+V ),可能在當(dāng)時(shí)我們這么做有一定的客觀原因,比如當(dāng)時(shí)時(shí)間緊為了完成任務(wù)不得不那么做,這個(gè)可以理解,但是不應(yīng)該在做完之后就將它丟到一邊了,等到下次再用的時(shí)候依然又是 Ctrl+C 和 Ctrl+V ——這么下去,做多少年都不會(huì)提高的(除了提高了使用 Ctrl+C 和 Ctrl+V 的熟練度之外),我就有這么一個(gè)習(xí)慣,保持著幾年前甚至剛參加工作時(shí)所做項(xiàng)目及學(xué)習(xí)用的代碼,有時(shí)間我還會(huì)拿出來(lái)看,看看對(duì)于以前那個(gè)時(shí)候做的東西現(xiàn)在可不可以改動(dòng)得更好,直到經(jīng)過(guò)幾次之后確實(shí)不能再改了才放棄。
三是總結(jié)別人的項(xiàng)目。現(xiàn)在的網(wǎng)絡(luò)這么發(fā)達(dá),可以很方便地從網(wǎng)上找到一些項(xiàng)目的需求文檔、設(shè)計(jì)文檔、源代碼等,對(duì)于一些比較有名的開(kāi)源項(xiàng)目甚至你還可以找到有高人對(duì)這些項(xiàng)目的源代碼的分析。接觸過(guò)的項(xiàng)目多了,你就會(huì)發(fā)現(xiàn)有很多功能和你以前所做的項(xiàng)目中要實(shí)現(xiàn)的功能相似,那么就把你的代碼和別人的比較一下吧,有比較就有鑒別,有比較就有高下之分,你就會(huì)看到完成同樣或類似的功能,別人的做法就比自己好,自己好好想想好在哪里,以后是不是可以借鑒別人的思路。
四是多關(guān)注一些基礎(chǔ)的東西。武俠小說(shuō)里正派武功高手在成為高手之前總會(huì)被要求長(zhǎng)時(shí)間練基本功,基本功打好了就很容易打通任督二脈,然后很快就可以練就一身過(guò)人本領(lǐng),這樣對(duì)自身是沒(méi)有傷害的,而邪門(mén)武功大多不要求武術(shù)根基很快也能練成,這樣即使練成了絕世武功也會(huì)容易對(duì)身體造成傷害,還可能走火入魔,著名的《避邪劍譜》及《葵花寶典》都是這方面的例子。很多半路出家的以及一些從培訓(xùn)學(xué)校出來(lái)的學(xué)生大多就是基本功不好,我自己就是半路出家的,在大學(xué)里學(xué)過(guò)一學(xué)期的C 語(yǔ)言之后就靠自己自學(xué)走上程序員的道路,很長(zhǎng)一段時(shí)間對(duì)數(shù)據(jù)庫(kù)的使用僅限于使用 SELECT 、 UPDATE 、 DELETE 、 INSERT 、 ORDER BY 、 COUNT ,在看別人項(xiàng)目源代碼時(shí)經(jīng)??吹絼e人項(xiàng)目中復(fù)雜的 SQL 語(yǔ)句,感覺(jué)自己有必要加強(qiáng)基礎(chǔ),于是花了很多時(shí)間去系統(tǒng)學(xué)習(xí)了數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)。
五是多動(dòng)手實(shí)踐?!凹埳系脕?lái)終覺(jué)淺,須知此事要躬行”,如果僅僅是看別人的代碼,看書(shū)可能就在看書(shū)的時(shí)候有感覺(jué),合上書(shū)之后就什么也不記得了。所以還需要大量實(shí)踐,有一定基礎(chǔ)之后系統(tǒng)的實(shí)踐比單獨(dú)聯(lián)系一個(gè)知識(shí)點(diǎn)要強(qiáng)得多,比如找一個(gè)自己覺(jué)得不錯(cuò)的BBS 或者 CMS 之類的系統(tǒng),為防止自己忍不住看它的源代碼所以這些項(xiàng)目的語(yǔ)言盡量不要選用 ASP.NET 的,然后要求自己實(shí)現(xiàn)一套和它相似度很高系統(tǒng)出來(lái)。在這里注意幾點(diǎn),一是在選項(xiàng)目時(shí)盡量量力而行,不要一上來(lái)就想模仿一個(gè)龐大的系統(tǒng),龐大的系統(tǒng)涉及到知識(shí)面很廣,知識(shí)點(diǎn)要求也比較深,工作量也比較大,一個(gè)人可能費(fèi)時(shí)較長(zhǎng)還沒(méi)有看到結(jié)果就會(huì)產(chǎn)生挫折感,就會(huì)放棄,所以可以先模仿小系統(tǒng)然后再模仿大系統(tǒng);在編程語(yǔ)言方面可以先選擇比較容易部署的編程語(yǔ)言開(kāi)發(fā)的,比如 ASP , ASP 的運(yùn)行環(huán)境在 Windows 平臺(tái)上的 IIS 中部署起來(lái)相對(duì)較為簡(jiǎn)單(在 IIS7 之后稍微麻煩一點(diǎn)),等熟練之后可以模仿 JSP 或者 PHP 開(kāi)發(fā)的系統(tǒng),這些系統(tǒng)的部署相對(duì)較為復(fù)雜一些,可能數(shù)據(jù)庫(kù)會(huì)采用 MySQL ,而 Web 服務(wù)器可能會(huì)是 Tomcat 或者 Apache (它們也可以采用 ISAPI 的方式集成到 IIS 中)。在模仿的過(guò)程中會(huì)用到 HTML 、 CSS 、 JavaScript 及 SQL 等方面的知識(shí),有的時(shí)候還需要了解別人的設(shè)計(jì)思路,對(duì)于自己的提高是想到有效的。除此之外,在提高 ASP.NET 編程能力的同時(shí)也順便了解了其它編程平臺(tái)和數(shù)據(jù)庫(kù),擴(kuò)大了視野。
好了,在最后我回答一下你在郵件中提高的幾個(gè)想法,關(guān)于你在郵件中提高沒(méi)有環(huán)境和沒(méi)有高手帶的情況,我想在上面提高的五點(diǎn)中的第五點(diǎn)可以回答你的這個(gè)想法,有環(huán)境有高手帶固然是好,但是沒(méi)有環(huán)境沒(méi)有高手帶我們也是可以通過(guò)其它辦法來(lái)解決的,比如看高手所做的項(xiàng)目并且模仿它,這樣也可以達(dá)到目的。和高手合作對(duì)自身的能力要求很大,大家知道微軟、Google 和 IBM 中高手多,在這樣的公司里進(jìn)步會(huì)很快,但是沒(méi)有一定的能力是進(jìn)不去的,所以在沒(méi)有機(jī)會(huì)進(jìn)去之前我們不妨采取上面的辦法——實(shí)際上也有很多在民間的高手,他們并不在知名大公司,但是他們一樣可以做到很好。
除了上面的做法之外,其實(shí)還有一些手頭可用的比較方面的資源,比如MSDN WebCast 上面就有微軟推出的大量免費(fèi)視頻,我們可以挑選一些下載下來(lái)看,在早年的時(shí)候我就從上面學(xué)到了不少東西,你在郵件中提高的 ASP.NET MVC 在上面就有系列講座,還有比較熱門(mén)的 Silverlight 和 Linq 等,只不過(guò)不要貪多貪全,千辛萬(wàn)苦全部下載到硬盤(pán)里然后一個(gè)不看,只看看自己關(guān)注的部分,實(shí)際上里面的視頻大部分是 Level200 的,也就是針對(duì)普通開(kāi)發(fā)人員的,比較容易理解。等你有一定能力之后就可以選擇不看或者有選擇地看了。
除此之外,我不知道你安裝Visual Studio 的時(shí)候有沒(méi)有安裝隨光盤(pán)自帶的 MSDN ,安裝完 Visual Studio 開(kāi)發(fā)工具之后就會(huì)提示是否安裝它,我建議將開(kāi)發(fā)中會(huì)使用到的部分安裝了(因?yàn)樯婕暗降闹R(shí)很多,沒(méi)有必要全部安裝,有些可以不必安裝),這樣遇到問(wèn)題之后即使不能上網(wǎng)也能有有地方查資料。在 MSDN 幫助中有 .NET Framework 種每一個(gè)類的介紹,包括類的說(shuō)明、構(gòu)造函數(shù)、方法、字段、屬性、顯示接口實(shí)現(xiàn)、請(qǐng)參見(jiàn)等。對(duì)于 VS 開(kāi)發(fā)人員來(lái)說(shuō)它的作用相當(dāng)于機(jī)器貓的口袋,需要的大部分都能從這個(gè)里面找到。像你提到的序列化以及一些經(jīng)常被提到的正則表達(dá)式、 Web Service 等也可以在 MSDN 中找到,有時(shí)間的時(shí)候可以看看,在有些地方還有一些提高程序性能或者安全性的建議。
圖:在安裝完VS2005后提示安裝MSDN的界面,在VS2008界面也類似
至于你在郵件中的其它問(wèn)題,我想我已經(jīng)在郵件中回答了,在這里我還給你一點(diǎn)額外的建議:建議有時(shí)間提高一下英語(yǔ),如果還有時(shí)間的話再學(xué)習(xí)一下UML 相關(guān)的知識(shí),這些東西在短期內(nèi)似乎對(duì)你沒(méi)有什么幫助,但是對(duì)于你的長(zhǎng)遠(yuǎn)發(fā)展是大有裨益的。如果你還有不明白的地方,請(qǐng)繼續(xù)和我保持郵件聯(lián)系。
周公
2010年 6 月 6 日
后記:看到看此篇文章的讀者當(dāng)中有一些是未畢業(yè)的大學(xué)生,我建議你們看看我的一篇針對(duì)未畢業(yè)大學(xué)生的文章《與一個(gè)即將畢業(yè)的計(jì)算機(jī)系大四學(xué)生關(guān)于求職的對(duì)話》。
聯(lián)系客服