瞭解語言衍生的技術地圖、慣例


iThome 網站首載:瞭解語言衍生的技術地圖、慣例

現在語言多半具有多重典範(Paradiam),或在演化過程吸收彼此優良特性,語言與語言之間在概念或基本語法上常存在共同子集。有經驗的開發者確實可在短時間內概覽語言並著手進行開發,然而真正困難點在於瞭解語言衍生的技術地圖(Roadmap)、慣例與文化等組成的「技術生態」。如何瞭解技術生態,或者是跨足不同的技術生態,往往是令開發者費時、費力,但也是最能獲得實質回饋的一個過程。

陡峭的生態學習曲線

初學者必須認清的是,現今不管是哪個語言,背後沒有不陡峭的生態學習曲線,這是現今初學者的痛,也是必須認清的事實。強調某語言如何能短時上手,對初學者沒有任何實質上的意義,畢竟現今開發程式,並不是單使用程式語言就足夠。能躍上主流的語言,必然是多年來累積眾多使用者,而這些使用者必定造就各種資源。只是學會語言本身,卻無法取用使用者累積的資源,基本上是毫無意義的。

語言多年來累積的技術地圖、各式慣例與文化等資源,就是所謂的技術生態。以學習技術生態為目標,耗費的心力與時間絕對遠大於學習語言本身,這也是現代教育訓練強調速成,但完成訓練者卻越來越無法滿足實際需求的原因。學習技術生態的困難度不僅發生在初學者,也容易發生在對於某陣營十分熟悉,但想要跨足另一陣營的開發者。對過往技術生態過於熟悉,經常容易造成理解另一生態的障礙或挫折感,有時造成的學習曲線,反倒比一無所有的初學者來得陡峭。

對於技術生態的理解,並不只有開發者需要。公司收購另一間公司,業務必須負責另一領域產品時,也需要先瞭解有關生態的問題。使用既有領域的思維與作法來推廣或販售另一領域產品是常見謬誤。若不瞭解另一領域生態,「你們知道總部發表了這東西嗎?」、「根本不知道的東西怎麼賣出去?」、「我也是看了報紙才知道!」這類實際的對話就會屢見不鮮。

規劃技術地圖

想要以理解技術生態為目標,最基本的就是先有技術地圖,然後逐一瞭解地圖中每個技術點對整個生態的作用為何。以程式開發者的角度來看,技術地圖若從語言出發,基本上必須涵蓋的範疇應有:技術製訂方式、主要典範、程式庫、應用平臺、工具、支持廠商與使用者。

瞭解語言技術的製訂方式是必要的,這可以瞭解一個語言的起源與發展過程,明瞭主要訴求的對象與要解決的問題,也因而瞭解此過程中整個生態如何形成。找到語言創始者最初的概念如何發想或核心哲學很重要,語言主要典範通常在創造之時就固定了,後續融合的典範對於語言已經影響不大。語言技術的製訂方式,還包括了語言後續版本演化時的參與者有哪些,這有助於理解為何程式庫、工具等會演化為至今版本,也有助於瞭解為何它會活躍於某些平台或有哪些支持廠商及使用者。

對程式庫的認識可從語言本身搭載的標準程式庫開始。標準程式庫通常呈現出語言技術最主流的風格。標準程式庫最基本可先瞭解的有群集(Collection),像是清單(List)、集合(Set)、雜湊(Set)甚至元組(Tuple)等。不同語言的群集程式庫會有不同的資料結構或實字(Literal)表示,因此透露出語言一開始設定要解決的問題差異。其他如輸入輸出、異常處理、多執行緒等程式庫,也都會透露出語言本身面對各式問題的基本風格。更重要的是瞭解程式庫的模組與套件組織方式,這透露出語言一開始設定的問題規模,以及對於名稱空間、資源佈局等的管理哲學。

應用平台是語言技術最擅長發揮的舞台,可從中瞭解為何會形成某些第三方程式庫或框架,他們可能是商業與非商業,也會各自沿生出不同的工具、支持廠商與使用者。在整個技術生態下,第三方程式庫或框架、工具、支持廠商與使用者,會組成各自的子生態,這是以理解技術生態為目標之所以困難的原因,因為子生態之間並非毫無關聯,而會為了解決某個需求而組合或自成一個堆疊(stack)。要逐一理解每個子生態幾乎是不可能的,從某個領域出發,像是Web應用程式,看需要哪個子生態的資源,在需要結合其他領域時,串接另一子生態進行理解,會是個較可行且具實質意義的方式。

理解與人相關的資源

技術為人所用,技術生態中最重要的是與人相關的資源,像是社群組成、溝通方式、慣例與文化。找出技術的主要領導者、傳教士或活躍使用者會是個不錯的起點,從他們平時發佈的訊息中,可以找到他們關心的議題,不同活躍使用者發表的不同議題,某些程度上會是生態圈縮影,而從這些技術領導者發佈的訊息中,也容易找到各式資源的所在,像是文件、專案、社群或交流場合。

其中社群會是最重要的一個資源,社群是由實際使用者組合而成,當中可看到一個技術真正是如何使用、會遭遇什麼問題、如何解決、使用了哪些工具,知道未來該語言技術的走向、現今話題性與脈動。除了單純發問、討論、探堪資源外,更重要的是理解社群的溝通方式,這包括了虛擬與實體兩部份,虛擬部份如IRC、BBS、論譠、社團、部落格、微網誌等管道,實體部份如常態或非常態的研討會、使用群(User group)聚會、年會等。找出社群中的活躍成員,追蹤(Follow)他們發佈的公開訊息,以找出更多相關的資源。

技術中與人相關的資源,會形成一定的慣例,這些慣例從基本開始包括了命名風格、文件形式、進一步觸及設計模式、軟體架構等,就連使用的工具也會形成慣例,不同生態或子生態都會有慣用的整合開發工具、建構工具、版本控制等,經常地,在不同慣例下連帶專案管理等方法也會有所不同。這些慣例是時間累積而成,也需時間才能消化,就算是有經驗的開發者,也需要三個月到半年的時間,才有辦法初略掌握。

文化是最重要的

技術地圖、與人相關的資源以及時間累積而成之慣例,最終構成語言技術的文化。對開發者來說,在跨足另一領域時不瞭解語言技術的文化,可能會入寶山空手而回,或如入五里之霧,甚至會在充滿挫折感、採取敵對情緒甚至憎惡的情緒下摸索。即便不是開發者,在不瞭解文化的情況下,任何事都可能事倍功半、毫無效果甚至反效果,像是以企業用戶觀點經營社群成員,或是採用敵營技術來建構活動網站,落得茶餘飯後笑柄甚至喪權辱國之名。

最難學習的是文化,要瞭解語言衍生的技術地圖、慣例仍至文化就是如此。對初學者而言,擺除速成心態,以理解包括語言、技術地圖、慣例及文化的技術生態為目標,會是艱難的過程,然而正如《Learn Python The Hard Way》談到的:「The Hard Way Is Easier」。比起將來被追討因速成而欠下的技術債務,堅實的學習反而是條捷徑。對既有領域具有自信的開發者來說,與其戴著有色鏡片來跨入另一領域,不如拋棄已經能做得很好的方法,虛心地接受另一個技術生態的文化。