.Net Web 開發研習(1) —— Web開發的“十事要說”

溫謙發表於2012-04-21

這個系列文章(.Net Web 開發研習)是在準備新書的過程中,一邊構思,一邊發文,逐步新增的,供大家參考。關於寫書計劃,請參考《寫書計劃,歡迎大家提建議》,這個系列的文章還將包括:

  1. Web開發的“十事要說”
  2. 關於學習C#語言的幾個建議
  3. 技術平臺選擇,兼談 .Net 與微軟
  4. 語言與框架
  5. ORM(物件關係對映)
  6. 學習程式設計實踐之“五子棋”
  7. 學習程式設計實踐之“檔案壓縮”
  8. UCLA計算機系如何教 C#
  9. 學習程式設計實踐之“電梯模擬”

在上一篇文章中,提到了我們正在策劃一本書新書,內容是關於“Web開發”的。因此這裡新開一個系列,在這個系列中,將把關於這本書的策劃和寫作過程的一些思考,寫出來,供大家參考。如果您希望學習基於.net平臺的Web開發,也可以和我討論。

對於Web開發來說,大致分為前端和後端,前端就是在瀏覽器上執行的程式,主要是Javascript程式,後端就是在伺服器執行的程式,種類就非常多了。目前,Web開發的主流的“三巨頭”是 .Net、Java和PHP。

首先要注意的是,不用過於花精力探討哪個更好。沒有哪一個是最好的,只有最適合你的那一個。至少在5年內,它們都會存在並發展,你只要把任何一個掌握精通,都有絕對的實力去贏得勝利,就像無論那本武俠小說,”少林”和”武當”都是大門派。只要選擇一個適合你的就可以了,比如你周圍有個PHP高手,你可以隨時請教,那你就學PHP就好了。能隨時請教,比任何事情都重要,對你的幫助一定是最大的。

當然,我們這裡選擇 .Net 平臺,當然也是有一定原因的,具體的原因在後面我會用兩篇文章的篇幅來討論,等我貼出以後,歡迎大家探討。

關於學習Web開發, 我先來說說根據我個人的經驗,比較重要的幾個方面。

補充說明:寫完以後,數了一下,正好是十條,想起了唐玄宗掌權以後的任命的第一個宰相姚崇寫的《十事要說》,為唐玄宗的開元盛世提出了治理的框架。所以我就把此文命名為Web開發的“十事要說”了。如果讀者有興趣,可以看一下姚崇當年的《十事要說》,放在當今中國,也是一個不錯而實用的治國方略。

1:過硬地掌握一門程式語言和一些常用的演算法

比如你用 ASP.NET MVC ,那就要掌握C#或者VB。如果用PHP,就要掌握PHP。對語言的掌握,就是靠不斷的實踐,寫夠了5萬行程式碼,自然就掌握了。

需要注意,語言和開發平臺是不一樣的,講解ASP.Net 開發的書,通常不會介紹太多C#語言,講解C#語言的書,也不會介紹ASP.NET或者WinForm的開發。對於還在作學生的讀者,我建議一定要認真學習語言和資料結構,多做一些深入的程式,或者叫作“很難”的程式。這個“難”不是指用什麼新的語言或平臺、框架,而是邏輯、演算法的難。

在比較好的大學裡,老師通常會有比較好的引導作用,同學的素質也不錯,身邊有很多榜樣,希望你能加入他們,做做一些真正很“難”的程式。特別推薦讀者買一本《軟體隨想錄》這本書,作者專門談到他在耶魯大學計算機系學習時的一些體會,反覆強調,做一些真正很“難”的程式的重要性,它是考驗你能否成為一名好的開發人員的試金石。

如果你不是在頂尖大學裡上學,就要更多地靠自己的努力了,周圍的人可能不能給你太多的幫助。但是方法是一樣的,就是要做一些真正“很難”的程式,不用著急做一些花哨的東西,到任何時候寫程式,語言和演算法都是最重要的。

2:掌握一個開發環境

如果有了足夠好的語言和演算法基礎,開發環境並不是個大問題。當然說到開發環境,比如Windows上的Visual Studio是超級強大的,實際上這裡說的開發環境,除了能夠寫程式之外,更重要的是掌握足夠的除錯經驗,這個同樣也是需要實踐經驗磨練的,和上一條一樣,寫夠了足夠多的行數,自然你的除錯經驗就豐富了。

除了除錯之外,這裡涉及的另一個問題,實際上是搜尋新東西的能力。如果你經常跑一些技術論壇,經常會看到很多人問一些類似於“有沒有關於XXX的庫啊?”這樣的問題,實際上這類問題,根本不用在論壇上問,你去Google一下就是了。你應該有這樣自信:如果你通過Google沒有找到,那麼論壇上也不會找到了。搜尋實際上一個很重要的能力,需要不斷地鍛鍊。以前的文盲是不識字,現在的文盲是不會用Google。

3:過硬的SQL語言基本功

Web開發,絕大多數離不開資料庫,所謂Web程式,絕大多數都是根據需要,把一堆資料,按照要求儲存到資料庫中,在需要的時候,再取出來,並顯示得好看一些(怎麼存取由後臺決定,怎麼顯示好看,由前後臺共同決定),就可以了。因此,小到一個留言簿,大到一個超級大系統,都離不開資料庫的支援。因此,SQL語言,一定要搞熟,要能夠根據各種稀奇古怪的要求,寫出正確的SQL查詢語句,這也是個功夫,需要不斷積累一些經驗。

儘管目前已經有了很好的ORM,可以使我們幾乎不用寫SQL,就可以做出很複雜的系統,但是當你對系統的效能有要求的時候,仍然需要十分關注ORM生成的SQL語言,如果你對SQL理解足夠好,在寫程式的就可以引導ORM生成質量更好的SQL語句。具體內容以後還會談到。

4:基本的資料庫以及伺服器的配置、管理經驗

上面第 3 條說的是能夠用SQL語句在程式中訪問資料庫,此外,還需要一些對資料庫的配置、管理經驗,理論上說,有一個專業的說法,叫做DBA,資料庫管理員,專門做這個,但是作為開發人員,多少也需要了解一些,至少基本的配置管理操作要了解,至少要熟悉一種資料庫系統,比如SQL Server、My SQL等。

此外,伺服器的配置管理經驗也是一個開發人員應該掌握的,這樣在實際執行過程中,遇到一些問題,你都可以分析解決。

5:對網路機制的理解

要做Web開發,和以前開發的單機執行的程式相比,一個最本質的區別,就是有存在客戶端和伺服器的分別。使用者在瀏覽器上,按了一個按鈕,可能的結果是先在客戶端執行了一些 Javascript程式碼,然後又傳到伺服器上,伺服器又開始執行一些程式碼,然後把一些資料傳回到客戶端,結果客戶端又開始執行另一些 Javascript程式碼,最後才給用會顯示出正確的結果。那麼這個過程,你就必須要非常清楚,在什麼時刻,什麼條件下,在哪裡,執行了哪個程式的哪行程式碼。 這和以前在一臺計算機上一個程式,從第一行執行到最後一行,是很不一樣的。

這裡的關鍵問題是,一定要對HTTP協議,有一定的瞭解,比如你一定要清楚 “請求”和“響應”分別是怎麼回事,伺服器和瀏覽器之間是如何傳遞資料,並協同工作的。這個不用瞭解的非常深入,但是至少要在概念上非常清楚,否則無法深入理解Web開發的實質。

6:對“領域問題”有比較好的理解力

所謂 “領域問題”,就是你要開發的系統,實現的具體功能是什麼,比如你做一個“學生學籍管理系統”,那麼就要對學校管理學生的具體方法、制度、規則深入、完整地理解,然後才能設計出一個合適的系統,適合這個需求,理論上來說,這個工作就比較“高階”了,在一個團隊中,常常有“系統分析員”或者“系統架構師”的說法,其實也沒有那麼玄乎了,只是一定要真正能夠理解使用者的需求,才能做出一個正確的選擇。因為客戶並不懂技術,就要靠系統分析人員,來理解使用者的需求。這一步做不好,結果將會導致整個專案陷入泥潭,後果不堪設想。

如果再多說幾句的話,在中國的軟體行業,由於沒有智慧財產權的保護,做通用軟體是很艱難的事兒,相對來說做企業的資訊化,則要好得多。這種軟體本質上是在賣服務,不存在盜版問題。市場已經過經過多年的啟蒙,越來越多的企業認識到資訊化能夠給自己帶來的巨大效益,這給軟體行業帶來了很大的機會。同時也說明一個問題,做企業軟體要想掙錢,就必須深入某個行業,對這個行業理解得越深,做出來的軟體才會越好用。而另一點是:這個行業本身越掙錢,你做軟體也就越容易掙錢。當然,對於大多數人,這並不是想選擇就能選擇的。當然,對於還處於初學階段的讀者,還不用考慮太多掙錢的事兒,先把基礎打牢就很好!

7:Web開發框架

所謂框架,就是根據一些相對通用的、固定的開發模式,設計出的一套程式庫,開發人員可以直接利用這些框架提供的程式進行開發,從而大大減少工作量。在上面說的“三巨頭”(.NET、Java、PHP)中,各自都有很多不同的框架,適用於不同型別的開發需求。在對Web開發有了一定的經驗以後,就可以使用一些框架,來加速你的開發效率,即所謂提高你的“生產力”。比如在.net平臺上,最近微軟推出的 ASP.net MVC ,就屬於這樣的一個Web開發框架,實現了MVC模式的開發,當然MVC在JAVA上,和在Ruby on Rails前幾年已經有了相應的框架。

就 .NET 平臺而言,已經誕生已經10多個年頭了,已經用了數百萬的開發者,以及第三方的生態系統。到目前,在ASP.NET上有三種開發模式,按照微軟的話來說,就像冰激凌的三種口味道:

enter image description here

其中傳統的是中間的ASP.NET WebForms,這種方式開發模式非常類似於傳統的桌面開發,以控制元件為基礎,非常成熟。左邊的 ASP.NET Web Pages,是一種剛剛釋出的開發模式,使用的工具也是新發布的 Web Matrix,它的特點是表面上看起來,它非常類似於PHP或者傳統的ASP,據微軟說適用於非專業的開發者,所以我們要做專業開發的人,就不研究它了。

右邊的是ASP.NET MVC,它的特點是強大、擴充套件性好,敏捷。這是我們以後要主要介紹的,具體的情況我們以後再慢慢深入介紹。

8:資料訪問層的開發效率加速

實際上,統計表明,現在大多數Web開發工作,絕大部分工作是圍繞著資料庫中的資料的增、刪、改、查來進行的。這些工作本質上都是通過SQL語言實現的,因此上面的第 3點中,特別提到了“過硬的SQL語言”的功夫,對一個開發人員的重要性。然而,最近幾年出現了不少資料訪問層的開發框架,有一個通用的名稱叫做 “ORM”即“物件關係對映”框架,它的作用就是通過易於理解的高階語言支援的物件導向的操作方式,避免或減少編寫難於理解、管理的SQL語句,從而可以大大提高開發和除錯效率。

同樣,在“三巨頭”上,有各自的不同的實現。比如.net上的 Linq To SQL,以及Entity Framwork都是這樣的工具,使用他們以後,可以使開發人員不再直接編寫,或減少直接編寫SQL,可能會少量地降低執行的效率,但是可以大大提升開發效率。因此,對於開發人員來說,這些工具,也是值得關注的。還是那句話:對於程式開發來說,基本上沒有什麼其他成本,唯一的成本就是你的時間,所以要想盡辦法提高你的生產效率。

當然,ORM不是萬能的,大多數情況下,如果沒有SQL基礎,使用ORM還是會有問題,特別是效率問題。這就好像如果你有組合語言的基礎,再寫C語言的程式碼,和不懂彙編的人寫出來的,肯定是不一樣的。

關於資料訪問的一些更詳細的情況,留在以後介紹。

9:使用重構和設計模式等手段提升程式碼質量

當我們熟悉了基本的增刪改查的操作以及基本的開發框架之後,你做的系統也會越來越複雜。這種複雜有些是由於規模帶來的,有些是由邏輯帶來的。在系統越來越複雜以後,我們就需要有是系統保持清晰、可維護、高效,而避免各種各樣的“壞味道”。設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。 當然,這裡面有不層次的結構模式,比如語言本身提供,框架提供的等等。

例如,當一個系統比較大以後,我們就必須要考慮讓系統的各個部分解耦和,也就是讓系統的各個部分儘可能不互相依賴,那麼使用依賴注入的模式就是一種非常通行的作法。這時,就可以使用一些專門的庫,來方便地實現相應的功能,例如 StructureMap 就是.NET環境下的一個輕量級依賴注入工具,用起來很方便,當然類似的工具還有很多。

再比如,當我們的系統分層以後,在不同層之間,經常需要傳遞物件,這種項通常稱為DTO(Data Transter Objects),業務邏輯的物件與DTO物件之間,就像業務邏輯物件和資料庫物件之間一樣,也存在不匹配的情況,因此也可以找到一些相應的庫來做一些對映,例如AutoMapper就是一個這樣的記憶體中的物件映像工具。

總之,在系統越來越複雜以後,就會遇到越來越多的問題,這些問題解決得不是“能不能”問題,而是“好不好”的問題。當我們的著眼點越來越側重於這些“怎麼樣作效果更好”的問題時,就說明我們已經進步了。

10:測試、測試還是測試

現代軟體工程中,關於測試的重要性,在不斷提高。TDD——Test Driven Development 驅動測試開發,已經得到了越來越多的認可和接受。當然,就目前國內的開發狀況,真正能做到TDD的開發團隊可能並不很多,主要是因為使用TDD,確實大幅度地增加了程式碼量。但是,做的專案越複雜,重要性越高,測試的重要性就越高。而且測試將從一個增加開發時間的事情,變成節約時間的事情了。

系統要不斷改進,要使用敏捷方法,都需要不斷地重構程式,先實現某些功能,然後進行重構,實現程式程式碼更合理,從程式的結構、維護性等各個方面提高程式碼質量。但是需要牢記的一點是,如果沒有自動化的測試作為保證,程式碼重構就是一個非常危險的時候,因為無法保證重構以後,不改變程式碼的行為。

因此,對於成熟的開發團隊,測試勢必需要重視的一個方面。

本文總結

文字概述了,研究學習Web開發的10個應該重視的方面。無論使用什麼具體的開發語言和開發平臺,這些方面都是相同的。本文也作為我要寫的書的一個提綱,我在書中也會涉及到上面提到的這些方面,當然詳略不會相同,有的將作廢查國內詳細的介紹,有些則簡單給出一些介紹和演示。

需要指出的是,Web開發的複雜程度,要比前端複雜不少,設計的範圍也遠較HTML和CSS廣得多。我們寫文章和書的目的,就是結合我們自己的實踐經驗,給初學者一些幫助,少走一些彎路,而絕對無法給出最佳的方案。如果您是有經驗的專業開發者,有什麼不同意見和建議,請告訴我;如果您是初學者,也可以把您的問題告訴我,我會盡可能解答。

希望我的文章對您有所幫助。

您可以到新浪微博聯絡我: http://t.sina.com.cn/1906984307 。

相關文章