這篇文章標題,似乎一反我過去強調不要講求語言速成的基調,然而在談速成前,必須先認清目的為何?

有時是專案火燒眉頭,有時只是想概覽語言,有時想進行概念驗證(Proof of concept),證明想法的可行性,有時是想對不斷出現的技術保持敏感性;無論如何,速成並不是讓你七天學會程式語言,然後可以飛天鑽地,開發出穩固的應用程式。

那麼語言有速成方式嗎?有的!出發點在於,你並不會用到語言的所有功能或整個生態系,透過實際地動手解決問題,確實有助於在短期快速掌握住語言中必要的功能與資源。

快速掌握語法、工具與資源
就快速入門語言本身,除了常用關鍵字、語法之外,最重要的是掌握語言訴求的核心哲學、風格與主要典範(Paradigm)。

像是Java的物件導向、Python的簡明與一致,Ruby的自由與多元化等。想短時間內掌握這些要素,從書本下手反而容易偏離目標,不少程式語言都提供「快速入門」或「Getting Started」文章,在短短時間與篇幅內,介紹完語言、語法常用元素及主流風格。

以「快速入門」或「Getting Started」及語言名稱,在網路上搜尋幾個類似文章,逐一消化,大致就可完成這個階段。

接下來是瞭解語言本身提供的程式工具,為接下來實際動手解決問題前作準備。實際撰寫一些小程式,在不使用整合開發工具的情況下,編譯並執行它,嘗試作一些使用者輸入輸出,使用不同的字元集(Charset),試著將單一原始碼組織為數個原始碼,放在不同目錄中載入執行。若語言還提供指令互動環境,試著在其中測試一些簡單的運算,或查詢一些內建函式說明。

接著嘗試找出適用該語言的整合開發環境,有時候語言的使用者會有明顯且慣用的整合開發環境,不過有時候會是一個功能強大的編輯器,並外掛一些相關語法醒目或自動提供功能等——找出適合的開發環境,有時反而是會個較耗費時間的階段。

有時整合開發環境或編輯器選擇太多,那就找個自己順眼的。在這個過程中,你也會找出一些基本的文件或社群資源,概覽一下資源名稱就可以了,如果能找到一些小抄(Cheat sheet)會很有幫助。

實作拋棄式玩具

即便專案火燒眉頭,也不建議在完成前一階段後,立即投入專案開發。如同《學徒模式》一書中提及拋棄式玩具(Breakable toys)的概念,實作一個拋棄式玩具,可以讓你在安全環境中學習。以我個人而言,在學習一門語言的過程中,會使用該語言來實作一些演算法題目,問題範圍涵蓋遞迴、特定數字運算、集合與列表、排序、搜尋及矩陣運算等,這有助於我快速熟悉該語言常用的語法、流程控制或群集程式庫的使用等,並對照語言間不同的特性。

用新學到的語言撰寫一個文字編輯器是個不錯的方式,可以從中熟悉如何進行文字的輸入輸出、使用規則表示式(Regular expression)搜尋與取代文字等,必要時,你也可以使用一下該語言提供的使用者圖形介面方案。

現在許多應用程式都會結合資料庫,試著寫個簡單的增刪查找資料庫程式是個不錯的練習。如果你對遊戲有興趣,也可以寫個井字遊戲、俄羅斯方塊之類的,這通常會用到一些2D繪圖API,也會用到一些較複雜的演算或資料結構,因而可更實際測試一下該語言的元素是否符合你的需求。撰寫個影像處理程式,像是小畫家之類的,也是不錯的選擇。

你可以找個更複雜的玩具來練習,像是多人網路連線程式,或者是Web應用程式,都是不錯的選擇,簡單的網頁留言版或討論區,往往就可帶出語言實作完整應用程式時必要的堆疊(Stack)雛形。

當然,如果你學習語言後是要投入實際開發,更好的方式是如《學徒模式》中提到的「使用與工作時相似的工具,但縮小規模」,利用這種方式「主動創造學習的機會」、「對失敗做出預估」。

重構拋棄式玩具
在努力用新的程式語言完成拋棄式玩具後,接下來就是重構它,並在重構的過程中加入測試。

短時間內,一邊尋找資源,一邊建構而成的玩具,一定是充滿缺陷,像是冗長的函式、重複的程式碼或者是不符合語言風格的設計,也必定是難以測試的。試著在重構程式前,為它撰寫一個測試,確保重構後的功能無誤,在這個過程中,你必定得瞭解這門語言會使用哪種測試工具,也許會發現JUnit風格的測試框架,或者如Python內建的doctest這類文件即測試的有趣工具。過程中,不斷嘗試讓玩具中每個功能變得可以測試,並試著讓它更符合語言的主流典範。

重構的過程中,也可以試著搜尋既有程式庫或框架,嘗試用它們來取代掉先前親自實作的程式功能。

舉例來說,如果你用到了執行緒,那麼試著用更高階的並行API來改寫看看;如果你使用像是Servlet/JSP來撰寫一個玩具式的Web應用程式,試著用個Web框架來重構它,也許像是Struts、Spring MVC這類耳熟能詳的框架,甚至是使用Play Framework這類快速開發框架。如果你原先使用JDBC,那麼試著換成JPA或Hibernate等ORM(Object-Relational Mapping)框架。

你不用瞭解這些程式庫或框架的全部,只要使用到的功能可以重構你的玩具就可以了,過程中,通常你就可以略為接觸到這個語言對類似程式需求,會是如何設計、使用的慣例又是為何。

在快速入門語言的過程中,往往最容易忽略掉的是安全或效能問題。

在使用程式庫或框架的過程中,尤其是使用Web框架,也許你會接觸到一些框架內建的安全機制,試著去瞭解它,像是框架中對會話(Session)採用的機制,以及要注意的可能安全問題,頁面中出現CSRF標籤是怎麼回事?程式有無防護XSS或SQL Injection的內建功能,或者必須搭配其他程式庫。

如果你在意效能,那麼可以在重構過程中,也留意一下如何改進效能。試著找出工具來作些簡單的評測,並留意一些對效能造成差異性的語言特性,像是串接字串、走訪列表、群集、可變動(Muttable)與不可變動(Immutable)資料結構等,觀察它們對效能的影響。

記得另外的50%
現今程式開發已經非常多元化,新的名詞、技術不斷出現,語言、程式庫與框架越來越多,更多的情況下,一個應用程式必須整合不同語言相關技術,有時非得採用一些速成的方式,來對相關名詞、技術、程式庫或框架有個概念,無論是之後要立即投入專案,或隨時保持對開發界相關動態的敏感度,以便在必要時有能力作相關評估。

總結來說,先前所談無非就是一個觀念,實際地動手去發現問題並解決問題,然而為了快速入門,一切都是點到為止,因而實際上這種方式還是建議已熟悉一門語言領域的基礎下採用,如果你的問題是「零基礎如何跨入OO程式設計」,以上方式就不適合你。

知名著名技術作者孟岩,曾發表過一篇〈快速掌握一個語言最常用的50%〉,談到的學習綱要,也是針對有經驗的人建議,初學者並不適合。最重要的是記得,快速掌握的成分最多就是那50%,反過來說,你對另外一半的成分是無知的,如果日後還是有不少機會跟這個半生不熟的語言相處,最好還是記得日後持續且紮實地補足那另外的50%。

作者簡介


Advertisement

更多 iThome相關內容