[Programming] 事件驅動的世界

這幾年來,Web 的應用開發方式的發展有了不少的改變,JavaScript 再度成為 Web Application 的用戶端開發的顯學之一,伺服端也出現了一個叫做 node.js 的伺服端開發技術,它們兩個都有一個共通的特性:事件驅動式 (event-driven),早先在 Windows API 以及 Visual Basic 上常用的程式開發方式,再次於 Web Application 上流行,這也象徵著 Web Application 己經成為一個相當成熟的應用程式平台。

這幾年來,Web 的應用開發方式的發展有了不少的改變,JavaScript 再度成為 Web Application 的用戶端開發的顯學之一,伺服端也出現了一個叫做 node.js 的伺服端開發技術,它們兩個都有一個共通的特性:事件驅動式 (event-driven),早先在 Windows API 以及 Visual Basic 上常用的程式開發方式,再次於 Web Application 上流行,這也象徵著 Web Application 己經成為一個相當成熟的應用程式平台。

為什麼這麼說呢?因為一個事件驅動的開發平台,核心功能一定要夠強,而且也要有較高的一般化 (Generalized) 程度,若沒有辦法將內部的流程一般化成為事件 (event) 的話,使用者程式 (user program) 會變得要涉入核心應該要做掉的事,以致於無法單純以事件方式做完工作,事件驅動的最核心觀念就是,使用者程式不需要處理事件以外的事,只要在事件內將工作做完即可。

事件驅動之所以現在如此火紅,除了平台的成熟度外,另一個關鍵是非同步程式設計的流行,當核心想要以非同步方式提供服務時,事件驅動的作法會比由使用者程式自己處理多執行緒 (multithreading) 的工作要穩定,多執行緒的作法對於一般開發人員來說本來就是一個高階的議題,大家都知道多執行緒有助於應用程式的可回應性 (responsive),但是還是有很多應用程式沒有使用多執行緒,原因還是因為它的高難度,而且還要處理好排程以及資源鎖定問題,然而若是由核心端來處理它,那麼使用這個平台的開發人員就會高興得不得了,其中一個很有趣的例子,就是 .NET Framework 4.5 的 async/await 非同步開發模式。

事件驅動還有另一個很有意思的案例,就是分散式運算的應用,例如最近雲端運算中很火紅的 MapReduce Pattern,在一個支援 MapReduce 的核心架構中,只要對應用程式開放 map 和 reduce 事件,再於不同機器上分別實作 map/reduce 的行為即可,開發人員不需要去了解 MapReduce 的細節工作,只需利用事件處理好應做的工作足矣。

其他事件驅動的平台案例真的很多,像是 DOM (JavaScript),node.js,HTML5 內的 Web Worker 以及 Websockets 等等,開發人員只需要針對特定事件來做處理即可,不用理解許多核心實作上的細節,然而有一點要非常小心,不是說不會寫到就不用了解核心細節,因為那往往會決定最關鍵的應用程式效能或異常狀態的問題排除能力,所以多讀多學會比完全不知道要好太多了。

 

Reference:

http://en.wikipedia.org/wiki/Event-driven_architecture
http://en.wikipedia.org/wiki/Event-driven_programming