[如何學習寫程式] #6 - 雖然快速應用程式開發工具或元件很多,但不代表你可以不去了解它背後的東西。

也許開發工具或元件供應商把工具和元件設計的太簡單,讓很多新手開發人員在使用這些東西時,在不知不覺中產生了一種錯覺:我只要會使用這些東西就好,不用學它背後的東西,但這是錯誤的觀念,它不但會限縮你的發展空間,也會讓你在碰到問題時不知所措。

這也算是很多人會有的一種誤解。

環顧四週,已經鮮少有程式語言沒有發展可簡化工作的開發工具或函式庫 (元件),這些東西大大的減輕了使用該程式語言開發應用程式的難度以及複雜度,舉例來說,Java 平台上的 Hibernate 將分層以及資料庫的物件化 (即 ORM 架構) 內建到 Framework 內,開發人員只需要使用 Hibernate 就能快速的生成 ORM,而不需要處理 ORM 內的元件與關聯模型對應的工作。又如 XNA Framework 將 Windows 平台上以及 XBOX 360 遊戲開發的核心工作簡化,以輔助遊戲開發人員將遊戲本身的邏輯 (Game logics) 和美術素材輕鬆的整合,以快速發展出高品質的遊戲,當然開發人員只需要將素材適當的整合到 XNA Game Application 內,而只需要專注於遊戲的功能和邏輯即可,這讓遊戲開發人員的生產力高出很多 (根據可靠消息來源,用 XNA Framework 開發遊戲的效率會比 DirectX 高數倍)。

也許開發工具或元件供應商 (ex: Microsoft) 把工具和元件設計的太簡單,讓很多新手開發人員在使用這些東西時,在不知不覺中產生了一種錯覺:我只要會使用這些東西就好,不用學它背後的東西。例如使用 .NET Framework 內的 HTTP 通訊時,只要會用 WebClient 就好了,不必用到像 HttpWebRequest, TcpClient 甚至 Socket 通訊的元件,乃至於不需要了解 HTTP 通訊是怎麼回事。再舉個例子,我們都知道要存取資料庫要用 ADO.NET,但是現在像 LINQ to SQL 或 Entity Framework 等元件出來了,很多初學者都很快樂的在 Visual Studio 的 IDE 中拉來拉去的生成程式碼,然後建置一下就得到他要的結果。絲毫不用學習與 ADO.NET 有關的東西,也不用學資料庫了,反正 Visual Studio 都把這些苦工做掉了。

這種只會用元件的現象,有個有趣但卻貼切的名詞:無腦程式開發 (Programming with no-brain)

更顯而易見的例子,非現在很流行的 ASP.NET 為主了,它的 Web Form Framework 讓開發 Web 應用程式有如開發 Windows 應用程式一樣簡單,只要在 Visual Studio 的 IDE 中把伺服器控制項拖到網頁設計器 (Page Designer) 再處理它的事件回應就好了,根本不用去管什麼 Client/Server 架構,HTTP 通訊協定,HTML 標記語言,Scripting 指令撰寫等,然後就自然而然的認為 .NET Framework 和 C# 只是玩具語言 (似乎很多人都這麼認為,我聽過很多面試 .NET 開發人員的人都說面試者認為它太簡單),但殊不知自己已落入抽象化的深淵,想要爬出這個深淵得付出很大的代價。

如果你有看過約耳所寫的 "抽象滲漏法則" 一文,約耳在文中提到看起來愈簡單的 Framework,當發生失效 (即滲漏) 的情況時,會讓使用該 Framework 的開發人員吃足苦頭,例如文中有這麼一句話:

"在教COM程式設計時,最好只要教學生如何使用Visual Studio的精靈和各個程式產生功能。不過萬一出了任何問題,他們根本不會知道怎麼回事,也不知道如何除錯或回復。我還是得教他們IUnknown和CLSID還有ProgIDS以及…哦,饒了我吧!"

這也是為什麼很多 ASP.NET 的初學者在碰到 ASP.NET 無法解決的一些問題 (例如網頁過於肥大,PostBack 機制的問題或是控制項更深入的議題,甚至老闆要求要寫一個 ASP.NET Control) 時,第一個反應就是不知所措,然後開始上論壇來問,就算大家給他答案了卻仍然不知道怎麼做,其原因之一就是對 ASP.NET 背後的東西不夠了解,甚至是基本的 HTTP, HTML, JavaScript, CSS, DOM 等核心知識都沒有學過或接觸過,而只停留在拖拉式開發法,永遠不會進步。這個問題再嚴重一點的話,就是只會用 Visual Studio 拖拉,當要交給他 Visual Studio 內不支援的程式開發 (ex: HTTP Handler) 或是無法使用 Visual Studio 時,可能當下會腦子一片空白。

要避免這個問題,最好的方法就是多接觸一些核心的東西,雖然我說你不能不去了解,但也不一定要學到專家級的,只要學到工作上會用到的部份再深入一點部份即可,例如 HTML 和 JavaScript 和 DOM 和 CSS 要一起學,可以使用像 Dreamweaver 或是 FrontPage 來輔助,但要強迫自己去看一些 raw-level (低階) 的程式或指令,你可以不用成為 CSS/DOM 的專家,至少要能夠用 scripting 來控制 CSS 和存取網頁內物件,這樣不但未來會有很多的工具可以用 (ex: AJAX, jQuery, Google Map, … etc.),在處理應用程式或網頁微調時也不會發生不知道該怎麼做的情況。

如果你是初學者,不要怕去深入這些基礎但核心的東西,學程式沒有什麼速成的方法,廣泛的學習基礎與核心知識和練習這些功能的寫法,會讓你未來在程式設計的工作和資訊產業中無往不利。

參考資料:

  • 論壇相關發問。
  • 約耳趣談軟體-抽象滲漏法則
  • 許多與同行和朋友的討論。